solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

commit f63ed8d3cd5319492a3b9aeb5ddb0169b133a7a1
parent 5ff64b96d08d358bbcd03a3c95cad9b1cd21d851
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 15 Feb 2017 11:06:55 +0100

Major refactoring of the ssol_estimator accessors

Replace the ssol_estimator_get_status function by the
ssol_estimator_get_mc_global one that returns all global MC estimations.

Replace the ssol_estimator_get_receiver_status function by the
ssol_estimator_get_mc_receiver one that fills a specific
ssol_mc_receiver structure defining the per receiver MC estimations.

Diffstat:
Msrc/ssol.h | 31+++++++++++++------------------
Msrc/ssol_estimator.c | 94+++++++++++++++++++++++++++++++------------------------------------------------
Msrc/ssol_estimator_c.h | 160+++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/ssol_solver.c | 113+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
Msrc/test_ssol_atmosphere.c | 12+-----------
Msrc/test_ssol_by_receiver_integration.c | 39+++++++++++++++------------------------
Msrc/test_ssol_device.c | 8++++++++
Msrc/test_ssol_image.c | 13+------------
Msrc/test_ssol_instance.c | 12+-----------
Msrc/test_ssol_material.c | 12+-----------
Msrc/test_ssol_object.c | 11+----------
Msrc/test_ssol_scene.c | 12+-----------
Msrc/test_ssol_shape.c | 19+++----------------
Msrc/test_ssol_solver1.c | 239++++++++++++++++++++++++++++++++++++-------------------------------------------
Msrc/test_ssol_solver2.c | 52+++++++++++++++++++---------------------------------
Msrc/test_ssol_solver2b.c | 47++++++++++++++++++-----------------------------
Msrc/test_ssol_solver3.c | 45+++++++++++++++++----------------------------
Msrc/test_ssol_solver3N.c | 47++++++++++++++++-------------------------------
Msrc/test_ssol_solver4.c | 55+++++++++++++++++++++++--------------------------------
Msrc/test_ssol_solver5.c | 51+++++++++++++++++++--------------------------------
Msrc/test_ssol_spectrum.c | 12+-----------
Msrc/test_ssol_sun.c | 11+----------
Msrc/test_ssol_utils.h | 8--------
23 files changed, 456 insertions(+), 647 deletions(-)

diff --git a/src/ssol.h b/src/ssol.h @@ -253,21 +253,17 @@ struct ssol_mc_result { double SE; /* Standard error, i.e. sqrt(Expectation / N) */ }; -/* result for MC simulations */ -struct ssol_estimator_status { - struct ssol_mc_result irradiance; - struct ssol_mc_result absorptivity_loss; - struct ssol_mc_result reflectivity_loss; - struct ssol_mc_result cos_loss; - size_t N; /* Samples count */ - size_t Nf; /* Failed samples count */ +struct ssol_mc_global { + struct ssol_mc_result cos_loss; /* In W */ + struct ssol_mc_result shadowed; /* In W */ + struct ssol_mc_result missing; /* In W */ }; -/* the always-ON indicators (MC computations) */ -enum ssol_status_type { - SSOL_STATUS_SHADOW, - SSOL_STATUS_MISSING, - SSOL_STATUS_TYPES_COUNT__ +struct ssol_mc_receiver { + struct ssol_mc_result integrated_irradiance; /* In W */ + struct ssol_mc_result absorptivity_loss; /* In W */ + struct ssol_mc_result reflectivity_loss; /* In W */ + struct ssol_mc_result cos_loss; /* In W */ }; typedef res_T @@ -767,17 +763,16 @@ ssol_estimator_ref_put (struct ssol_estimator* estimator); SSOL_API res_T -ssol_estimator_get_status +ssol_estimator_get_mc_global (const struct ssol_estimator* estimator, - const enum ssol_status_type type, - struct ssol_estimator_status* status); + struct ssol_mc_global* mc_global); SSOL_API res_T -ssol_estimator_get_receiver_status +ssol_estimator_get_mc_receiver (struct ssol_estimator* estimator, const struct ssol_instance* instance, const enum ssol_side_flag side, - struct ssol_estimator_status* status); + struct ssol_mc_receiver* status); SSOL_API res_T ssol_estimator_get_count diff --git a/src/ssol_estimator.c b/src/ssol_estimator.c @@ -30,19 +30,19 @@ * Helper functions ******************************************************************************/ static res_T -create_per_receiver_mc_data +create_mc_receivers (struct ssol_estimator* estimator, struct ssol_scene* scene) { struct htable_instance_iterator it, end; - struct mc_per_receiver_data mc_rcv_data_null; + struct mc_receiver mc_rcv_null; res_T res = RES_OK; ASSERT(scene && estimator); htable_instance_begin(&scene->instances_rt, &it); htable_instance_end(&scene->instances_rt, &end); - mc_per_receiver_data_init(estimator->dev->allocator, &mc_rcv_data_null); + mc_receiver_init(estimator->dev->allocator, &mc_rcv_null); while(!htable_instance_iterator_eq(&it, &end)) { const struct ssol_instance* inst = *htable_instance_iterator_data_get(&it); @@ -50,14 +50,13 @@ create_per_receiver_mc_data if(!inst->receiver_mask) continue; - res = htable_receiver_set - (&estimator->global_receivers, &inst, &mc_rcv_data_null); + res = htable_receiver_set(&estimator->mc_receivers, &inst, &mc_rcv_null); if(res != RES_OK) goto error; } exit: return res; error: - htable_receiver_clear(&estimator->global_receivers); + htable_receiver_clear(&estimator->mc_receivers); goto exit; } @@ -69,7 +68,7 @@ estimator_release(ref_T* ref) CONTAINER_OF(ref, struct ssol_estimator, ref); ASSERT(ref); dev = estimator->dev; - htable_receiver_release(&estimator->global_receivers); + htable_receiver_release(&estimator->mc_receivers); ASSERT(dev && dev->allocator); MEM_RM(dev->allocator, estimator); SSOL(device_ref_put(dev)); @@ -97,71 +96,52 @@ ssol_estimator_ref_put } res_T -ssol_estimator_get_status +ssol_estimator_get_mc_global (const struct ssol_estimator* estimator, - const enum ssol_status_type type, - struct ssol_estimator_status* status) + struct ssol_mc_global* global) { - const struct mc_data* data; - if (!estimator || type >= SSOL_STATUS_TYPES_COUNT__ || !status) - return RES_BAD_ARG; - - switch (type) { - case SSOL_STATUS_SHADOW: data = &estimator->shadow; break; - case SSOL_STATUS_MISSING: data = &estimator->missing; break; - default: FATAL("Unreachable code.\n"); break; - } - status->N = estimator->realisation_count; - status->Nf = estimator->failed_count; - status->irradiance.E = data->weight / (double)status->N; - status->irradiance.V - = data->sqr_weight / (double)status->N - - status->irradiance.E * status->irradiance.E; - status->irradiance.SE - = (status->irradiance.V > 0) - ? sqrt(status->irradiance.V / (double)status->N) : 0; - status->absorptivity_loss.E = 0; - status->absorptivity_loss.V = 0; - status->absorptivity_loss.SE = 0; - status->reflectivity_loss.E = 0; - status->reflectivity_loss.V = 0; - status->reflectivity_loss.SE = 0; - status->cos_loss.E = 0; - status->cos_loss.V = 0; - status->cos_loss.SE = 0; + if(!estimator || !global) return RES_BAD_ARG; + #define SETUP_MC_RESULT(Name) { \ + const double N = (double)estimator->realisation_count; \ + const struct mc_data* data = &estimator->Name; \ + global->Name.E = data->weight / N; \ + global->Name.V = data->sqr_weight / N - global->Name.E*global->Name.E; \ + global->Name.SE = global->Name.V > 0 ? sqrt(global->Name.V / N) : 0; \ + } (void)0 + SETUP_MC_RESULT(cos_loss); + SETUP_MC_RESULT(shadowed); + SETUP_MC_RESULT(missing); + #undef SETUP_MC_RESULT return RES_OK; } res_T -ssol_estimator_get_receiver_status +ssol_estimator_get_mc_receiver (struct ssol_estimator* estimator, const struct ssol_instance* instance, const enum ssol_side_flag side, - struct ssol_estimator_status* status) + struct ssol_mc_receiver* rcv) { - const struct mc_per_receiver_1side_data* data = NULL; - if (!estimator || !instance || !status + const struct mc_receiver_1side* mc_rcv1 = NULL; + if(!estimator || !instance || !rcv || (side != SSOL_BACK && side != SSOL_FRONT)) return RES_BAD_ARG; /* Check if a receiver is defined for this instance/side */ - data = estimator_get_receiver_data - (&estimator->global_receivers, instance, side); - if(data == NULL) return RES_BAD_ARG; + mc_rcv1 = estimator_get_mc_receiver(&estimator->mc_receivers, instance, side); + if(mc_rcv1 == NULL) return RES_BAD_ARG; - status->N = estimator->realisation_count; - status->Nf = estimator->failed_count; - #define SETUP_MC_STATUS(Name) { \ + #define SETUP_MC_RESULT(Name) { \ const double N = (double)estimator->realisation_count; \ - status->Name.E = data->Name.weight / N; \ - status->Name.V = data->Name.sqr_weight/N - status->Name.E*status->Name.E; \ - status->Name.SE = status->Name.V > 0 ? sqrt(status->Name.V / N) : 0; \ + rcv->Name.E = mc_rcv1->Name.weight / N; \ + rcv->Name.V = mc_rcv1->Name.sqr_weight/N - rcv->Name.E*rcv->Name.E; \ + rcv->Name.SE = rcv->Name.V > 0 ? sqrt(rcv->Name.V / N) : 0; \ } (void)0 - SETUP_MC_STATUS(irradiance); - SETUP_MC_STATUS(absorptivity_loss); - SETUP_MC_STATUS(reflectivity_loss); - SETUP_MC_STATUS(cos_loss); - #undef SETUP_MC_STATUS + SETUP_MC_RESULT(integrated_irradiance); + SETUP_MC_RESULT(absorptivity_loss); + SETUP_MC_RESULT(reflectivity_loss); + SETUP_MC_RESULT(cos_loss); + #undef SETUP_MC_RESULT return RES_OK; } @@ -226,12 +206,12 @@ estimator_create goto error; } - htable_receiver_init(dev->allocator, &estimator->global_receivers); + htable_receiver_init(dev->allocator, &estimator->mc_receivers); SSOL(device_ref_get(dev)); estimator->dev = dev; ref_init(&estimator->ref); - res = create_per_receiver_mc_data(estimator, scene); + res = create_mc_receivers(estimator, scene); if(res != RES_OK) goto error; exit: diff --git a/src/ssol_estimator_c.h b/src/ssol_estimator_c.h @@ -1,17 +1,17 @@ /* Copyright (C) CNRS 2016-2017 -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <http://www.gnu.org/licenses/>. */ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #ifndef SSOL_ESTIMATOR_C_H #define SSOL_ESTIMATOR_C_H @@ -40,40 +40,39 @@ static const struct mc_data MC_DATA_NULL = MC_DATA_NULL__; #define HTABLE_DATA struct mc_data #include <rsys/hash_table.h> -struct mc_per_receiver_1side_data { - struct mc_data irradiance; - struct mc_data absorptivity_loss; - struct mc_data reflectivity_loss; - struct mc_data cos_loss; +struct mc_receiver_1side { + struct mc_data integrated_irradiance; /* In W */ + struct mc_data absorptivity_loss; /* In W */ + struct mc_data reflectivity_loss; /* In W */ + struct mc_data cos_loss; /* In W */ struct htable_rcvprim prims; /* Per primitive MC */ }; static INLINE void -mc_per_receiver_1side_data_init - (struct mem_allocator* allocator, struct mc_per_receiver_1side_data* data) +mc_receiver_1side_init + (struct mem_allocator* allocator, struct mc_receiver_1side* mc) { - ASSERT(data); - data->irradiance = MC_DATA_NULL; - data->absorptivity_loss = MC_DATA_NULL; - data->reflectivity_loss = MC_DATA_NULL; - data->cos_loss = MC_DATA_NULL; - htable_rcvprim_init(allocator, &data->prims); + ASSERT(mc); + mc->integrated_irradiance = MC_DATA_NULL; + mc->absorptivity_loss = MC_DATA_NULL; + mc->reflectivity_loss = MC_DATA_NULL; + mc->cos_loss = MC_DATA_NULL; + htable_rcvprim_init(allocator, &mc->prims); } static INLINE void -mc_per_receiver_1side_data_release(struct mc_per_receiver_1side_data* data) +mc_receiver_1side_release(struct mc_receiver_1side* mc) { - ASSERT(data); - htable_rcvprim_release(&data->prims); + ASSERT(mc); + htable_rcvprim_release(&mc->prims); } static INLINE res_T -mc_per_receiver_1side_data_copy - (struct mc_per_receiver_1side_data* dst, - const struct mc_per_receiver_1side_data* src) +mc_receiver_1side_copy + (struct mc_receiver_1side* dst, const struct mc_receiver_1side* src) { ASSERT(dst && src); - dst->irradiance = src->irradiance; + dst->integrated_irradiance = src->integrated_irradiance; dst->absorptivity_loss = src->absorptivity_loss; dst->reflectivity_loss = src->reflectivity_loss; dst->cos_loss = src->cos_loss; @@ -81,12 +80,11 @@ mc_per_receiver_1side_data_copy } static INLINE res_T -mc_per_receiver_1side_data_copy_and_release - (struct mc_per_receiver_1side_data* dst, - struct mc_per_receiver_1side_data* src) +mc_receiver_1side_copy_and_release + (struct mc_receiver_1side* dst, struct mc_receiver_1side* src) { ASSERT(dst && src); - dst->irradiance = src->irradiance; + dst->integrated_irradiance = src->integrated_irradiance; dst->absorptivity_loss = src->absorptivity_loss; dst->reflectivity_loss = src->reflectivity_loss; dst->cos_loss = src->cos_loss; @@ -94,18 +92,18 @@ mc_per_receiver_1side_data_copy_and_release } static INLINE struct mc_data* -mc_per_receiver_1side_data_get_primitive_data - (struct mc_per_receiver_1side_data* data, const unsigned iprim) +mc_receiver_1side_get_mc_primitive + (struct mc_receiver_1side* mc_rcv, const unsigned iprim) { struct mc_data* pmc = NULL; - ASSERT(data); + ASSERT(mc_rcv); - pmc = htable_rcvprim_find(&data->prims, &iprim); + pmc = htable_rcvprim_find(&mc_rcv->prims, &iprim); if(!pmc) { - struct mc_data mc = MC_DATA_NULL; - const res_T res = htable_rcvprim_set(&data->prims, &iprim, &mc); + struct mc_data mc_prim = MC_DATA_NULL; + const res_T res = htable_rcvprim_set(&mc_rcv->prims, &iprim, &mc_prim); if(res != RES_OK) goto error; - pmc = htable_rcvprim_find(&data->prims, &iprim); + pmc = htable_rcvprim_find(&mc_rcv->prims, &iprim); } exit: @@ -118,52 +116,48 @@ error: /******************************************************************************* * Double sided per receiver MC data ******************************************************************************/ -struct mc_per_receiver_data { - struct mc_per_receiver_1side_data front; - struct mc_per_receiver_1side_data back; +struct mc_receiver { + struct mc_receiver_1side front; + struct mc_receiver_1side back; }; static INLINE void -mc_per_receiver_data_init - (struct mem_allocator* allocator, struct mc_per_receiver_data* data) +mc_receiver_init(struct mem_allocator* allocator, struct mc_receiver* mc) { - ASSERT(data); - mc_per_receiver_1side_data_init(allocator, &data->front); - mc_per_receiver_1side_data_init(allocator, &data->back); + ASSERT(mc); + mc_receiver_1side_init(allocator, &mc->front); + mc_receiver_1side_init(allocator, &mc->back); } static INLINE void -mc_per_receiver_data_release(struct mc_per_receiver_data* data) +mc_receiver_release(struct mc_receiver* mc) { - ASSERT(data); - mc_per_receiver_1side_data_release(&data->front); - mc_per_receiver_1side_data_release(&data->back); + ASSERT(mc); + mc_receiver_1side_release(&mc->front); + mc_receiver_1side_release(&mc->back); } static INLINE res_T -mc_per_receiver_data_copy - (struct mc_per_receiver_data* dst, - const struct mc_per_receiver_data* src) +mc_receiver_copy(struct mc_receiver* dst, const struct mc_receiver* src) { res_T res = RES_OK; ASSERT(dst && src); - res = mc_per_receiver_1side_data_copy(&dst->front, &src->front); + res = mc_receiver_1side_copy(&dst->front, &src->front); if(res != RES_OK) return res; - res = mc_per_receiver_1side_data_copy(&dst->back, &src->back); + res = mc_receiver_1side_copy(&dst->back, &src->back); if(res != RES_OK) return res; return RES_OK; } static INLINE res_T -mc_per_receiver_data_copy_and_release - (struct mc_per_receiver_data* dst, - struct mc_per_receiver_data* src) +mc_receiver_copy_and_release + (struct mc_receiver* dst, struct mc_receiver* src) { res_T res = RES_OK; ASSERT(dst && src); - res = mc_per_receiver_1side_data_copy_and_release(&dst->front, &src->front); + res = mc_receiver_1side_copy_and_release(&dst->front, &src->front); if(res != RES_OK) return res; - res = mc_per_receiver_1side_data_copy_and_release(&dst->back, &src->back); + res = mc_receiver_1side_copy_and_release(&dst->back, &src->back); if(res != RES_OK) return res; return RES_OK; } @@ -171,11 +165,11 @@ mc_per_receiver_data_copy_and_release /* Define the htable_receiver data structure */ #define HTABLE_NAME receiver #define HTABLE_KEY const struct ssol_instance* -#define HTABLE_DATA struct mc_per_receiver_data -#define HTABLE_DATA_FUNCTOR_INIT mc_per_receiver_data_init -#define HTABLE_DATA_FUNCTOR_RELEASE mc_per_receiver_data_release -#define HTABLE_DATA_FUNCTOR_COPY mc_per_receiver_data_copy -#define HTABLE_DATA_FUNCTOR_COPY_AND_RELEASE mc_per_receiver_data_copy_and_release +#define HTABLE_DATA struct mc_receiver +#define HTABLE_DATA_FUNCTOR_INIT mc_receiver_init +#define HTABLE_DATA_FUNCTOR_RELEASE mc_receiver_release +#define HTABLE_DATA_FUNCTOR_COPY mc_receiver_copy +#define HTABLE_DATA_FUNCTOR_COPY_AND_RELEASE mc_receiver_copy_and_release #include <rsys/hash_table.h> /******************************************************************************* @@ -184,11 +178,14 @@ mc_per_receiver_data_copy_and_release struct ssol_estimator { size_t realisation_count; size_t failed_count; - /* the implicit MC computations */ - struct mc_data shadow; + /* The implicit MC computations */ + struct mc_data shadowed; struct mc_data missing; - /* 1 global MC per receiver */ - struct htable_receiver global_receivers; + struct mc_data cos_loss; /* TODO compute it */ + + /* Per receiver MC */ + struct htable_receiver mc_receivers; + /* areas */ double sampled_area, primary_area; @@ -202,18 +199,19 @@ estimator_create struct ssol_scene* scene, struct ssol_estimator** estimator); -static FINLINE struct mc_per_receiver_1side_data* -estimator_get_receiver_data +static FINLINE struct mc_receiver_1side* +estimator_get_mc_receiver (struct htable_receiver* receivers, const struct ssol_instance* instance, const enum ssol_side_flag side) { - struct mc_per_receiver_data* data; + struct mc_receiver* mc_rcv; ASSERT(receivers && instance); if(!(instance->receiver_mask & (int)side)) return NULL; - data = htable_receiver_find(receivers, &instance); - if(!data) return NULL; - return side == SSOL_FRONT ? &data->front : &data->back; + mc_rcv = htable_receiver_find(receivers, &instance); + if(!mc_rcv) return NULL; + return side == SSOL_FRONT ? &mc_rcv->front : &mc_rcv->back; } #endif /* SSOL_ESTIMATOR_C_H */ + diff --git a/src/ssol_solver.c b/src/ssol_solver.c @@ -328,6 +328,40 @@ check_scene(const struct ssol_scene* scene, const char* caller) return RES_OK; } +static void +accum_mc_receivers_1side + (struct mc_receiver_1side* dst, + struct mc_receiver_1side* src) +{ + struct htable_rcvprim_iterator it, end; + const struct mc_data* mc_src; + struct mc_data* mc_dst; + unsigned iprim; + ASSERT(dst && src); + + #define ACCUM_WEIGHT(Name) { \ + dst->Name.weight += src->Name.weight; \ + dst->Name.sqr_weight += src->Name.sqr_weight; \ + } (void)0 + ACCUM_WEIGHT(integrated_irradiance); + ACCUM_WEIGHT(absorptivity_loss); + ACCUM_WEIGHT(reflectivity_loss); + ACCUM_WEIGHT(cos_loss); + #undef ACCUM_WEIGHT + + /* Merge the per primitive MC of the integrated irradiance */ + htable_rcvprim_begin(&src->prims, &it); + htable_rcvprim_end(&src->prims, &end); + while(!htable_rcvprim_iterator_eq(&it, &end)) { + iprim = *htable_rcvprim_iterator_key_get(&it); + mc_src = htable_rcvprim_iterator_data_get(&it); + mc_dst = mc_receiver_1side_get_mc_primitive(dst, iprim); + mc_dst->weight += mc_src->weight; + mc_dst->sqr_weight += mc_src->sqr_weight; + htable_rcvprim_iterator_next(&it); + } +} + /******************************************************************************* * Exported functions ******************************************************************************/ @@ -350,6 +384,7 @@ ssol_solve struct ssp_rng_proxy* rng_proxy = NULL; struct mc_data* mc_shadows = NULL; struct mc_data* mc_missings = NULL; + struct mc_data* mc_cos_losses = NULL; /* TODO compute it */ struct htable_receiver* mc_rcvs = NULL; struct ssol_estimator* estimator = NULL; float area; @@ -409,6 +444,7 @@ ssol_solve CREATE(bsdfs); CREATE(mc_shadows); CREATE(mc_missings); + CREATE(mc_cos_losses); CREATE(mc_rcvs); #undef CREATE @@ -419,7 +455,7 @@ ssol_solve res = ssp_rng_proxy_create_rng(rng_proxy, (size_t)i, rngs + i); if(res != RES_OK) goto error; htable_receiver_init(scn->dev->allocator, mc_rcvs + i); - res = htable_receiver_copy(mc_rcvs + i, &estimator->global_receivers); + res = htable_receiver_copy(mc_rcvs + i, &estimator->mc_receivers); if(res != RES_OK) goto error; } @@ -431,6 +467,7 @@ ssol_solve struct ssf_bsdf* bsdf; struct mc_data* shadow; struct mc_data* missing; + struct mc_data* cos_loss; struct htable_receiver* receiver; float org[3], dir[3], range[2] = { 0, FLT_MAX }; const int ithread = omp_get_thread_num(); @@ -444,6 +481,7 @@ ssol_solve rng = rngs[ithread]; bsdf = bsdfs[ithread]; shadow = mc_shadows + ithread; + cos_loss = mc_cos_losses + ithread; missing = mc_missings + ithread; receiver = mc_rcvs + ithread; @@ -469,32 +507,31 @@ ssol_solve if(point_is_receiver(&pt)) { const res_T res_local = point_dump(&pt, (size_t)i, depth, output); - struct mc_per_receiver_1side_data* data = NULL; + struct mc_receiver_1side* mc_rcv1 = NULL; if(res_local != RES_OK) { ATOMIC_SET(&res, res_local); break; } - data = estimator_get_receiver_data(receiver, pt.inst, pt.side); - ASSERT(data); - data->irradiance.weight += pt.weight; - data->irradiance.sqr_weight += pt.weight*pt.weight; - data->absorptivity_loss.weight += pt.absorptivity_loss; - data->absorptivity_loss.sqr_weight += pt.absorptivity_loss * pt.absorptivity_loss; - data->reflectivity_loss.weight += pt.reflectivity_loss; - data->reflectivity_loss.sqr_weight += pt.reflectivity_loss * pt.reflectivity_loss; - data->cos_loss.weight += pt.cos_loss; - data->cos_loss.sqr_weight += pt.cos_loss * pt.cos_loss; + mc_rcv1 = estimator_get_mc_receiver(receiver, pt.inst, pt.side); + mc_rcv1->integrated_irradiance.weight += pt.weight; + mc_rcv1->integrated_irradiance.sqr_weight += pt.weight*pt.weight; + mc_rcv1->absorptivity_loss.weight += pt.absorptivity_loss; + mc_rcv1->absorptivity_loss.sqr_weight += pt.absorptivity_loss * pt.absorptivity_loss; + mc_rcv1->reflectivity_loss.weight += pt.reflectivity_loss; + mc_rcv1->reflectivity_loss.sqr_weight += pt.reflectivity_loss * pt.reflectivity_loss; + mc_rcv1->cos_loss.weight += pt.cos_loss; + mc_rcv1->cos_loss.sqr_weight += pt.cos_loss * pt.cos_loss; hit_a_receiver = 1; if(pt.inst->receiver_per_primitive) { - struct mc_data* prim = mc_per_receiver_1side_data_get_primitive_data - (data, pt.prim.prim_id); - if(!prim) { + struct mc_data* mc_prim; + mc_prim = mc_receiver_1side_get_mc_primitive(mc_rcv1, pt.prim.prim_id); + if(!mc_prim) { ATOMIC_SET(&res, RES_MEM_ERR); break; } - prim->weight += pt.weight; - prim->sqr_weight += pt.weight*pt.weight; + mc_prim->weight += pt.weight; + mc_prim->sqr_weight += pt.weight*pt.weight; } } @@ -555,35 +592,30 @@ ssol_solve /* Merge per thread estimations */ FOR_EACH(i, 0, nthreads) { - estimator->shadow.weight += mc_shadows[i].weight; - estimator->shadow.sqr_weight += mc_shadows[i].sqr_weight; + estimator->shadowed.weight += mc_shadows[i].weight; + estimator->shadowed.sqr_weight += mc_shadows[i].sqr_weight; estimator->missing.weight += mc_missings[i].weight; estimator->missing.sqr_weight += mc_missings[i].sqr_weight; + estimator->cos_loss.weight += mc_cos_losses[i].weight; + estimator->cos_loss.sqr_weight += mc_cos_losses[i].sqr_weight; } - /* Merge per thread estimations */ - htable_receiver_begin(&estimator->global_receivers, &it); - htable_receiver_end(&estimator->global_receivers, &end); - while (!htable_receiver_iterator_eq(&it, &end)) { - struct mc_per_receiver_data* estimator_data - = htable_receiver_iterator_data_get(&it); - const struct ssol_instance* key = *htable_receiver_iterator_key_get(&it); + /* Merge per thread receiver estimations */ + htable_receiver_begin(&estimator->mc_receivers, &it); + htable_receiver_end(&estimator->mc_receivers, &end); + while(!htable_receiver_iterator_eq(&it, &end)) { + struct mc_receiver* mc_rcv = htable_receiver_iterator_data_get(&it); + const struct ssol_instance* inst = *htable_receiver_iterator_key_get(&it); htable_receiver_iterator_next(&it); + FOR_EACH(i, 0, nthreads) { - /* Sum both sides, even if no receiver is defined to avoid tests */ - struct mc_per_receiver_data* thread_data - = htable_receiver_find(mc_rcvs + i, &key); - #define ACCUM_WEIGHT(Name) { \ - estimator_data->front.Name.weight += thread_data->front.Name.weight; \ - estimator_data->back.Name.weight += thread_data->front.Name.weight; \ - estimator_data->front.Name.sqr_weight += thread_data->front.Name.sqr_weight;\ - estimator_data->back.Name.sqr_weight += thread_data->front.Name.sqr_weight;\ - } (void)0 - ACCUM_WEIGHT(irradiance); - ACCUM_WEIGHT(absorptivity_loss); - ACCUM_WEIGHT(reflectivity_loss); - ACCUM_WEIGHT(cos_loss); - #undef ACCUM_WEIGHT + struct mc_receiver* mc_rcv_thread; + mc_rcv_thread = htable_receiver_find(mc_rcvs + i, &inst); + + if(inst->receiver_mask & (int)SSOL_FRONT) + accum_mc_receivers_1side(&mc_rcv->front, &mc_rcv_thread->front); + if(inst->receiver_mask & (int)SSOL_BACK) + accum_mc_receivers_1side(&mc_rcv->back, &mc_rcv_thread->back); } } estimator->realisation_count += realisations_count; @@ -609,6 +641,7 @@ exit: } sa_release(mc_shadows); sa_release(mc_missings); + sa_release(mc_cos_losses); if(out_estimator) *out_estimator = estimator; return (res_T)res; error: diff --git a/src/test_ssol_atmosphere.c b/src/test_ssol_atmosphere.c @@ -16,12 +16,9 @@ #include "ssol.h" #include "test_ssol_utils.h" -#include <rsys/logger.h> - int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssol_spectrum* spectrum; @@ -31,13 +28,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK); CHECK(ssol_spectrum_create(dev, &spectrum2), RES_OK); @@ -64,8 +56,6 @@ main(int argc, char** argv) CHECK(ssol_spectrum_ref_put(spectrum2), RES_OK); CHECK(ssol_device_ref_put(dev), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_by_receiver_integration.c b/src/test_ssol_by_receiver_integration.c @@ -27,7 +27,6 @@ #define HALF_Y 10 #include "test_ssol_rect2D_geometry.h" -#include <rsys/logger.h> #include <rsys/double33.h> #include <star/s3d.h> @@ -47,7 +46,6 @@ get_wlen(const size_t i, double* wlen, double* data, void* ctx) int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssp_rng* rng; @@ -68,7 +66,7 @@ main(int argc, char** argv) struct ssol_sun* sun; struct ssol_spectrum* spectrum; struct ssol_estimator *estimator1, *estimator2; - struct ssol_estimator_status status; + struct ssol_mc_receiver mc_rcv; double dir[3]; double transform[12]; /* 3x4 column major matrix */ @@ -80,13 +78,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK); CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK); @@ -139,24 +132,24 @@ main(int argc, char** argv) #define N__ 10000 #define S_DNI_cos (4 * 1000 * cos(PI / 4)) -#define GET_RCV_STATUS ssol_estimator_get_receiver_status +#define GET_RCV_STATUS ssol_estimator_get_mc_receiver CHECK(ssol_solve(scene, rng, N__, NULL, &estimator1), RES_OK); - CHECK(GET_RCV_STATUS(estimator1, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", - status.irradiance.E, status.irradiance.SE); + CHECK(GET_RCV_STATUS(estimator1, target, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); CHECK(ssol_instance_set_receiver(heliostat, SSOL_FRONT, 0), RES_OK); - CHECK(eq_eps(status.irradiance.E, S_DNI_cos, S_DNI_cos * 2e-1), 1); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, S_DNI_cos, S_DNI_cos * 2e-1), 1); CHECK(ssol_solve(scene, rng, 8 * N__, NULL, &estimator2), RES_OK); - CHECK(GET_RCV_STATUS(estimator2, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, S_DNI_cos, S_DNI_cos * 5e-2), 1); + CHECK(GET_RCV_STATUS(estimator2, target, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, S_DNI_cos, S_DNI_cos * 5e-2), 1); CHECK(ssol_estimator_ref_put(estimator1), RES_OK); CHECK(ssol_solve(scene, rng, 3 * N__, NULL, &estimator1), RES_OK); - CHECK(GET_RCV_STATUS(estimator1, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, S_DNI_cos, S_DNI_cos * 1e-1), 1); + CHECK(GET_RCV_STATUS(estimator1, target, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, S_DNI_cos, S_DNI_cos * 1e-1), 1); #undef N__ #undef S_DNI_cos #undef GET_RCV_STATUS @@ -178,8 +171,6 @@ main(int argc, char** argv) CHECK(ssol_spectrum_ref_put(spectrum), RES_OK); CHECK(ssol_sun_ref_put(sun), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_device.c b/src/test_ssol_device.c @@ -18,6 +18,14 @@ #include <rsys/logger.h> +static INLINE void +log_stream(const char* msg, void* ctx) +{ + ASSERT(msg); + (void) msg, (void) ctx; + printf("%s\n", msg); +} + int main(int argc, char** argv) { diff --git a/src/test_ssol_image.c b/src/test_ssol_image.c @@ -16,13 +16,10 @@ #include "ssol.h" #include "test_ssol_utils.h" -#include <rsys/logger.h> - int main(int argc, char** argv) { double block[8/*#rows*/*3/*#channels*/*8/*#column*/]; - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssol_image* img; @@ -35,13 +32,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssol_image_create(dev, &img), RES_OK); @@ -139,11 +131,8 @@ main(int argc, char** argv) } CHECK(ssol_image_ref_put(img), RES_OK); - CHECK(ssol_device_ref_put(dev), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_instance.c b/src/test_ssol_instance.c @@ -16,12 +16,9 @@ #include "ssol.h" #include "test_ssol_utils.h" -#include <rsys/logger.h> - int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssol_shape* shape; @@ -35,13 +32,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssol_material_create_virtual(dev, &material), RES_OK); @@ -85,8 +77,6 @@ main(int argc, char** argv) CHECK(ssol_device_ref_put(dev), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_material.c b/src/test_ssol_material.c @@ -17,12 +17,9 @@ #include "test_ssol_utils.h" #include "test_ssol_materials.h" -#include <rsys/logger.h> - int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssol_material* material; @@ -33,13 +30,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssol_material_create_mirror(NULL, &material), RES_BAD_ARG); CHECK(ssol_material_create_mirror(dev, NULL), RES_BAD_ARG); @@ -109,8 +101,6 @@ main(int argc, char** argv) CHECK(ssol_material_ref_put(material), RES_OK); CHECK(ssol_device_ref_put(dev), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_object.c b/src/test_ssol_object.c @@ -16,12 +16,9 @@ #include "ssol.h" #include "test_ssol_utils.h" -#include <rsys/logger.h> - int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssol_shape* shape; @@ -33,13 +30,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssol_material_create_virtual(dev, &mtl), RES_OK); CHECK(ssol_material_create_virtual(dev, &mtl2), RES_OK); CHECK(ssol_shape_create_punched_surface(dev, &shape), RES_OK); @@ -88,7 +80,6 @@ main(int argc, char** argv) CHECK(ssol_material_ref_put(mtl2), RES_OK); CHECK(ssol_device_ref_put(dev), RES_OK); - logger_release(&logger); check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_scene.c b/src/test_ssol_scene.c @@ -16,8 +16,6 @@ #include "ssol.h" #include "test_ssol_utils.h" -#include <rsys/logger.h> - static void get_wlen(const size_t i, double* wlen, double* data, void* ctx) { @@ -32,7 +30,6 @@ get_wlen(const size_t i, double* wlen, double* data, void* ctx) int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssol_shape* shape; @@ -51,13 +48,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssol_material_create_virtual(dev, &material), RES_OK); @@ -166,8 +158,6 @@ main(int argc, char** argv) CHECK(ssol_device_ref_put(dev), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_shape.c b/src/test_ssol_shape.c @@ -21,19 +21,14 @@ #define HALF_Y 1 #include "test_ssol_rect_geometry.h" -#include <rsys/logger.h> - -/******************************************************************************* - * Test main program - ******************************************************************************/ int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssol_shape* shape; - struct ssol_vertex_data attribs[3] = { SSOL_VERTEX_DATA_NULL__, SSOL_VERTEX_DATA_NULL__, SSOL_VERTEX_DATA_NULL__ }; + struct ssol_vertex_data attribs[3] = + {SSOL_VERTEX_DATA_NULL__, SSOL_VERTEX_DATA_NULL__, SSOL_VERTEX_DATA_NULL__}; struct ssol_punched_surface punched_surface = SSOL_PUNCHED_SURFACE_NULL; struct ssol_carving carving = SSOL_CARVING_NULL; struct ssol_quadric quadric = SSOL_QUADRIC_DEFAULT; @@ -45,13 +40,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssol_shape_create_mesh(NULL, NULL), RES_BAD_ARG); CHECK(ssol_shape_create_mesh(dev, NULL), RES_BAD_ARG); @@ -150,11 +140,8 @@ main(int argc, char** argv) quadric.data.parabolic_cylinder.focal = 1; CHECK(ssol_shape_ref_put(shape), RES_OK); - CHECK(ssol_device_ref_put(dev), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_solver1.c b/src/test_ssol_solver1.c @@ -22,7 +22,6 @@ #define PLANE_NAME SQUARE #include "test_ssol_rect_geometry.h" -#include <rsys/logger.h> #include <rsys/double33.h> #include <star/s3d.h> @@ -47,7 +46,6 @@ int main(int argc, char** argv) { struct spectrum_desc desc = {0}; - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssp_rng* rng; @@ -68,7 +66,8 @@ main(int argc, char** argv) struct ssol_spectrum* abs; struct ssol_atmosphere* atm; struct ssol_estimator* estimator; - struct ssol_estimator_status status; + struct ssol_mc_global mc_global; + struct ssol_mc_receiver mc_rcv; double dir[3]; double wavelengths[3] = { 1, 2, 3 }; double intensities[3] = { 1, 0.8, 1 }; @@ -98,13 +97,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK); @@ -129,9 +123,7 @@ main(int argc, char** argv) /* No geometry */ CHECK(ssol_solve(scene, rng, 10, NULL, &estimator), RES_BAD_ARG); - /* Create scene content */ - CHECK(ssol_shape_create_mesh(dev, &square), RES_OK); attribs[0].usage = SSOL_POSITION; attribs[0].get = get_position; @@ -177,12 +169,9 @@ main(int argc, char** argv) CHECK(ssol_estimator_get_failed_count(estimator, &fcount), RES_OK); CHECK(fcount, 0); - #define GET_STATUS ssol_estimator_get_status - CHECK(GET_STATUS(NULL, SSOL_STATUS_MISSING, &status), RES_BAD_ARG); - CHECK(GET_STATUS(estimator, SSOL_STATUS_TYPES_COUNT__, &status), RES_BAD_ARG); - CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, NULL), RES_BAD_ARG); - CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - #undef GET_STATUS + CHECK(ssol_estimator_get_mc_global(NULL, &mc_global), RES_BAD_ARG); + CHECK(ssol_estimator_get_mc_global(estimator, NULL), RES_BAD_ARG); + CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); CHECK(ssol_estimator_ref_get(NULL), RES_BAD_ARG); CHECK(ssol_estimator_ref_get(estimator), RES_OK); @@ -249,8 +238,8 @@ main(int argc, char** argv) /* Can sample any geometry; variance is high */ NCHECK(tmp = tmpfile(), 0); #define N__ 10000 -#define GET_STATUS ssol_estimator_get_status -#define GET_RCV_STATUS ssol_estimator_get_receiver_status +#define GET_MC_RCV ssol_estimator_get_mc_receiver +#define GET_MC_GLOBAL ssol_estimator_get_mc_global CHECK(ssol_solve(scene, rng, N__, tmp, &estimator), RES_OK); CHECK(ssol_instance_get_id(target, &r_id), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); @@ -259,47 +248,40 @@ main(int argc, char** argv) CHECK(fclose(tmp), 0); CHECK(ssol_estimator_get_failed_count(estimator, &fcount), RES_OK); CHECK(fcount, 0); - logger_print(&logger, LOG_OUTPUT, "\nIr = %g +/- %g", m, std); + printf("Ir = %g +/- %g; ", m, std); #define COS cos(PI / 4) -#define DNI 1000 +#define DNI 1000 #define DNI_cos (DNI * COS) CHECK(eq_eps(m, 4 * DNI_cos, MMAX(4 * DNI_cos * 1e-2, 2*std)), 1); #define SQR(x) ((x)*(x)) dbl = sqrt((SQR(12 * DNI_cos) / 3 - SQR(4 * DNI_cos)) / (double)count); CHECK(eq_eps(std, dbl, dbl*1e-2), 1); /* Target was sampled but shadowed by secondary */ - CHECK(GET_STATUS(estimator, SSOL_STATUS_SHADOW, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, m, 2 * dbl), 1); - CHECK(status.N, count); - CHECK(status.Nf, fcount); - CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, m, 2*status.irradiance.SE), 1); - CHECK(status.N, count); - CHECK(status.Nf, fcount); - CHECK(GET_RCV_STATUS(NULL, NULL, SSOL_BACK, NULL), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(estimator, NULL, SSOL_BACK, NULL), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(NULL, target, SSOL_BACK, NULL), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(estimator, target, SSOL_BACK, NULL), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(NULL, NULL, SSOL_BACK, &status), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(estimator, NULL, SSOL_BACK, &status), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(NULL, target, SSOL_BACK, &status), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(estimator, target, SSOL_BACK, &status), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(NULL, NULL, SSOL_FRONT, NULL), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(estimator, NULL, SSOL_FRONT, NULL), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(NULL, target, SSOL_FRONT, NULL), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(estimator, target, SSOL_FRONT, NULL), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(NULL, NULL, SSOL_FRONT, &status), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(estimator, NULL, SSOL_FRONT, &status), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(NULL, target, SSOL_FRONT, &status), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(estimator, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, m, 1e-8), 1); - CHECK(eq_eps(status.irradiance.SE, std, 1e-4), 1); + CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); + printf("Shadows = %g +/- %g; ", mc_global.shadowed.E, mc_global.shadowed.SE); + printf("Missing = %g +/- %g; ", mc_global.missing.E, mc_global.missing.SE); + CHECK(eq_eps(mc_global.shadowed.E, m, 2 * dbl), 1); + CHECK(eq_eps(mc_global.missing.E, m, 2*mc_global.missing.SE), 1); + CHECK(GET_MC_RCV(NULL, NULL, SSOL_BACK, NULL), RES_BAD_ARG); + CHECK(GET_MC_RCV(estimator, NULL, SSOL_BACK, NULL), RES_BAD_ARG); + CHECK(GET_MC_RCV(NULL, target, SSOL_BACK, NULL), RES_BAD_ARG); + CHECK(GET_MC_RCV(estimator, target, SSOL_BACK, NULL), RES_BAD_ARG); + CHECK(GET_MC_RCV(NULL, NULL, SSOL_BACK, &mc_rcv), RES_BAD_ARG); + CHECK(GET_MC_RCV(estimator, NULL, SSOL_BACK, &mc_rcv), RES_BAD_ARG); + CHECK(GET_MC_RCV(NULL, target, SSOL_BACK, &mc_rcv), RES_BAD_ARG); + CHECK(GET_MC_RCV(estimator, target, SSOL_BACK, &mc_rcv), RES_BAD_ARG); + CHECK(GET_MC_RCV(NULL, NULL, SSOL_FRONT, NULL), RES_BAD_ARG); + CHECK(GET_MC_RCV(estimator, NULL, SSOL_FRONT, NULL), RES_BAD_ARG); + CHECK(GET_MC_RCV(NULL, target, SSOL_FRONT, NULL), RES_BAD_ARG); + CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, NULL), RES_BAD_ARG); + CHECK(GET_MC_RCV(NULL, NULL, SSOL_FRONT, &mc_rcv), RES_BAD_ARG); + CHECK(GET_MC_RCV(estimator, NULL, SSOL_FRONT, &mc_rcv), RES_BAD_ARG); + CHECK(GET_MC_RCV(NULL, target, SSOL_FRONT, &mc_rcv), RES_BAD_ARG); + CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m, 1e-8), 1); + CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std, 1e-4), 1); CHECK(ssol_estimator_ref_put(estimator), RES_OK); /* Sample primary mirror only; variance is low */ @@ -312,22 +294,19 @@ main(int argc, char** argv) CHECK(count, N__); CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); - logger_print(&logger, LOG_OUTPUT, "\nIr = %g +/- %g", m, std); + printf("Ir = %g +/- %g; ", m, std); CHECK(eq_eps(m, 4 * DNI_cos, MMAX(4 * DNI_cos * 1e-2, std)), 1); CHECK(eq_eps(std, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_SHADOW, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_RCV_STATUS(estimator, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, m, 1e-8), 1); - CHECK(eq_eps(status.irradiance.SE, std, 1e-4), 1); + CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); + printf("Shadows = %g +/- %g; ", mc_global.shadowed.E, mc_global.shadowed.SE); + printf("Missing = %g +/- %g; ", mc_global.missing.E, mc_global.missing.SE); + CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1); + CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1); + CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m, 1e-8), 1); + CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std, 1e-4), 1); CHECK(ssol_estimator_ref_put(estimator), RES_OK); /* Check atmosphere model; with no absorption result is unchanged */ @@ -346,25 +325,22 @@ main(int argc, char** argv) CHECK(count, N__); CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); - logger_print(&logger, LOG_OUTPUT, "\nIr = %g +/- %g", m, std); + printf("Ir = %g +/- %g; ", m, std); CHECK(eq_eps(m, 4 * DNI_cos, MMAX(4 * DNI_cos * 1e-2, std)), 1); CHECK(eq_eps(std, 0, 1e-4), 1); CHECK(ssol_scene_detach_atmosphere(scene, atm), RES_OK); CHECK(ssol_spectrum_ref_put(abs), RES_OK); CHECK(ssol_atmosphere_ref_put(atm), RES_OK); - CHECK(GET_STATUS(estimator, SSOL_STATUS_SHADOW, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_RCV_STATUS(estimator, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, m, 1e-8), 1); - CHECK(eq_eps(status.irradiance.SE, std, 1e-4), 1); + CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); + printf("Shadows = %g +/- %g; ", mc_global.shadowed.E, mc_global.shadowed.SE); + printf("Missing = %g +/- %g; ", mc_global.missing.E, mc_global.missing.SE); + CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1); + CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1); + CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m, 1e-8), 1); + CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std, 1e-4), 1); CHECK(ssol_estimator_ref_put(estimator), RES_OK); /* Check atmosphere model and imperfect mirror: there are losses */ @@ -396,41 +372,49 @@ main(int argc, char** argv) CHECK(count, N__); CHECK(pp_sum(tmp, (int32_t)r_id, count, &a_m, &a_std), RES_OK); CHECK(fclose(tmp), 0); - logger_print(&logger, LOG_OUTPUT, "\nIr = %g +/- %g", a_m, a_std); + printf("Ir = %g +/- %g; ", a_m, a_std); #define K (exp(-KA * 4 * sqrt(2))) - CHECK(eq_eps(a_m, REFLECTIVITY * 4 * K * DNI_cos, + CHECK(eq_eps(a_m, REFLECTIVITY * 4 * K * DNI_cos, MMAX(4 * K * DNI_cos * 1e-1, a_std)), 1); CHECK(eq_eps(a_std, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_SHADOW, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_RCV_STATUS(estimator, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, - "Ir(target) = %g +/- %g (%.2g %%)", - status.irradiance.E, status.irradiance.SE, 100 * status.irradiance.E / m); - logger_print(&logger, LOG_OUTPUT, - "Atmospheric Loss(target) = %g +/- %g (%.2g %%)", - status.absorptivity_loss.E, status.absorptivity_loss.SE, - 100 * status.absorptivity_loss.E / m); - logger_print(&logger, LOG_OUTPUT, - "Reflectivity Loss(target) = %g +/- %g (%.2g %%)", - status.reflectivity_loss.E, status.reflectivity_loss.SE, - 100 * status.reflectivity_loss.E / m); - logger_print(&logger, LOG_OUTPUT, - "Cos Loss(target) = %g +/- %g (%.2g %%)", - status.cos_loss.E, status.cos_loss.SE, 100 * status.cos_loss.E / m); - CHECK(eq_eps(status.irradiance.E, a_m, 1e-8), 1); - CHECK(eq_eps(status.irradiance.SE, a_std, 1e-4), 1); - CHECK(eq_eps(status.irradiance.E + status.absorptivity_loss.E - + status.reflectivity_loss.E, m, 1e-8), 1); - CHECK(eq_eps(status.irradiance.E + status.absorptivity_loss.E - + status.reflectivity_loss.E + status.cos_loss.E, 4 * DNI, 1e-8), 1); - CHECK(eq_eps(status.cos_loss.E / (4 * DNI), 1 - COS, 1e-8), 1); + CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); + printf("Shadows = %g +/- %g; ", mc_global.shadowed.E, mc_global.shadowed.SE); + printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE); + CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1); + CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1); + CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK); + printf + ("\tIr(target) = %g +/- %g (%.2g %%)\n", + mc_rcv.integrated_irradiance.E, + mc_rcv.integrated_irradiance.SE, + 100 * mc_rcv.integrated_irradiance.E / m); + printf + ("\tAtmospheric Loss(target) = %g +/- %g (%.2g %%)\n", + mc_rcv.absorptivity_loss.E, + mc_rcv.absorptivity_loss.SE, + 100 * mc_rcv.absorptivity_loss.E / m); + printf + ("\tReflectivity Loss(target) = %g +/- %g (%.2g %%)\n", + mc_rcv.reflectivity_loss.E, + mc_rcv.reflectivity_loss.SE, + 100 * mc_rcv.reflectivity_loss.E / m); + printf + ("\tCos Loss(target) = %g +/- %g (%.2g %%)\n", + mc_rcv.cos_loss.E, + mc_rcv.cos_loss.SE, + 100 * mc_rcv.cos_loss.E / m); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, a_m, 1e-8), 1); + CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, a_std, 1e-4), 1); + CHECK(eq_eps + ( mc_rcv.integrated_irradiance.E + + mc_rcv.absorptivity_loss.E + + mc_rcv.reflectivity_loss.E, m, 1e-8), 1); + CHECK(eq_eps + ( mc_rcv.integrated_irradiance.E + + mc_rcv.absorptivity_loss.E + + mc_rcv.reflectivity_loss.E + + mc_rcv.cos_loss.E, 4 * DNI, 1e-8), 1); + CHECK(eq_eps(mc_rcv.cos_loss.E / (4 * DNI), 1 - COS, 1e-8), 1); CHECK(ssol_estimator_ref_put(estimator), RES_OK); CHECK(ssol_scene_detach_instance(scene, heliostat2), RES_OK); @@ -458,25 +442,20 @@ main(int argc, char** argv) CHECK(count, N__); CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); - logger_print(&logger, LOG_OUTPUT, "\nIr = %g +/- %g", m, std); + printf("Ir = %g +/- %g; ", m, std); #define K2 (exp(-0.121 * 4 * sqrt(2))) CHECK(eq_eps(m, 4 * K2 * DNI_cos, MMAX(4 * K2 * DNI_cos * 1e-4, std)), 1); CHECK(eq_eps(std, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_SHADOW, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_RCV_STATUS(estimator, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", -status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, m, 1e-8), 1); - CHECK(eq_eps(status.irradiance.SE, std, 1e-4), 1); -#undef GET_STATUS -#undef GET_RCV_STATUS + CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); + printf("Shadows = %g +/- %g; ", mc_global.shadowed.E, mc_global.shadowed.SE); + printf("Missing = %g +/- %g; ", mc_global.missing.E, mc_global.missing.SE); + CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1); + CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1); + CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m, 1e-8), 1); + CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std, 1e-4), 1); /* Free data */ CHECK(ssol_instance_ref_put(heliostat2), RES_OK); @@ -500,8 +479,6 @@ status.irradiance.E, status.irradiance.SE); CHECK(ssol_sun_ref_put(sun), RES_OK); CHECK(ssol_sun_ref_put(sun_mono), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_solver2.c b/src/test_ssol_solver2.c @@ -32,7 +32,6 @@ #define HALF_Y 1 #include "test_ssol_rect2D_geometry.h" -#include <rsys/logger.h> #include <rsys/double33.h> #include <star/s3d.h> @@ -52,7 +51,6 @@ get_wlen(const size_t i, double* wlen, double* data, void* ctx) int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssp_rng* rng; @@ -77,7 +75,8 @@ main(int argc, char** argv) struct ssol_sun* sun; struct ssol_spectrum* spectrum; struct ssol_estimator* estimator; - struct ssol_estimator_status status; + struct ssol_mc_global mc_global; + struct ssol_mc_receiver mc_rcv; double dir[3]; double transform1[12]; /* 3x4 column major matrix */ double transform2[12]; /* 3x4 column major matrix */ @@ -104,13 +103,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK); CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK); @@ -185,38 +179,32 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); #define N__ 10000 -#define GET_STATUS ssol_estimator_get_status -#define GET_RCV_STATUS ssol_estimator_get_receiver_status +#define GET_MC_RCV ssol_estimator_get_mc_receiver CHECK(ssol_solve(scene, rng, N__, tmp, &estimator), RES_OK); CHECK(ssol_instance_get_id(target, &r_id), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); - logger_print(&logger, LOG_OUTPUT, "\nIr = %g +/- %g\n", m, std); + printf("Ir = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(PI / 4)) CHECK(eq_eps(m, 4 * DNI_cos, 4 * DNI_cos * 1e-4), 1); #define SQR(x) ((x)*(x)) CHECK(eq_eps(std, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_SHADOW, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_RCV_STATUS(estimator, heliostat1, SSOL_BACK, &status), RES_BAD_ARG); - CHECK(GET_RCV_STATUS(estimator, heliostat1, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(heliostat1) = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(GET_RCV_STATUS(estimator, heliostat2, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(heliostat2) = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(GET_RCV_STATUS(estimator, secondary, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(secondary) = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(GET_RCV_STATUS(estimator, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, m, 1e-8), 1); - CHECK(eq_eps(status.irradiance.SE, std, 1e-4), 1); -#undef GET_STATUS -#undef GET_RCV_STATUS + CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); + printf("Shadows = %g +/- %g\n", mc_global.shadowed.E, mc_global.shadowed.SE); + printf("Missing = %g +/- %g", mc_global.missing.E, mc_global.missing.SE); + CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1); + CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1); + CHECK(GET_MC_RCV(estimator, heliostat1, SSOL_BACK, &mc_rcv), RES_BAD_ARG); + CHECK(GET_MC_RCV(estimator, secondary, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(secondary) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(GET_MC_RCV(estimator, target, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m, 1e-8), 1); + CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std, 1e-4), 1); /* Free data */ CHECK(ssol_instance_ref_put(heliostat1), RES_OK); @@ -238,8 +226,6 @@ main(int argc, char** argv) CHECK(ssol_spectrum_ref_put(spectrum), RES_OK); CHECK(ssol_sun_ref_put(sun), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_solver2b.c b/src/test_ssol_solver2b.c @@ -32,7 +32,6 @@ #define HALF_Y 1 #include "test_ssol_rect2D_geometry.h" -#include <rsys/logger.h> #include <rsys/double33.h> #include <star/s3d.h> @@ -52,7 +51,6 @@ get_wlen(const size_t i, double* wlen, double* data, void* ctx) int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssp_rng* rng; @@ -77,7 +75,8 @@ main(int argc, char** argv) struct ssol_sun* sun; struct ssol_spectrum* spectrum; struct ssol_estimator* estimator; - struct ssol_estimator_status status; + struct ssol_mc_global mc_global; + struct ssol_mc_receiver mc_rcv; double dir[3]; double transform1[12]; /* 3x4 column major matrix */ double transform2[12]; /* 3x4 column major matrix */ @@ -86,7 +85,6 @@ main(int argc, char** argv) FILE* tmp; double m, std; uint32_t r_id; - (void) argc, (void) argv; d33_splat(transform1, 0); @@ -104,13 +102,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK); CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK); @@ -122,7 +115,7 @@ main(int argc, char** argv) CHECK(ssol_scene_create(dev, &scene), RES_OK); CHECK(ssol_scene_attach_sun(scene, sun), RES_OK); - /* create scene content */ + /* Create scene content */ CHECK(ssol_shape_create_mesh(dev, &rect), RES_OK); attribs[0].usage = SSOL_POSITION; @@ -190,33 +183,31 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); #define N__ 50000 -#define GET_STATUS ssol_estimator_get_status -#define GET_RCV_STATUS ssol_estimator_get_receiver_status CHECK(ssol_solve(scene, rng, N__, tmp, &estimator), RES_OK); CHECK(ssol_instance_get_id(target, &r_id), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); - logger_print(&logger, LOG_OUTPUT, "\nIr = %g +/- %g\n", m, std); + printf("Ir = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(PI / 4)) CHECK(eq_eps(m, 2 * DNI_cos, MMAX(2 * DNI_cos * 1e-2, std)), 1); #define SQR(x) ((x)*(x)) CHECK(eq_eps(std, sqrt((SQR(4 * DNI_cos) / 2 - SQR(2 * DNI_cos)) / (double)count), 1e-3), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_SHADOW, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(status.Nf, 0); - CHECK(GET_RCV_STATUS(estimator, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, m, 1e-8), 1); - CHECK(eq_eps(status.irradiance.SE, std, 1e-4), 1); -#undef GET_STATUS -#undef GET_RCV_STATUS + CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); + printf("Shadows = %g +/- %g\n", mc_global.shadowed.E, mc_global.shadowed.SE); + printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE); + CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1); + CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1); + CHECK(ssol_estimator_get_mc_receiver + (estimator, target, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m, 1e-8), 1); + CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std, 1e-4), 1); + CHECK(ssol_estimator_get_failed_count(estimator, &count), RES_OK); + CHECK(count, 0); /* Free data */ CHECK(ssol_instance_ref_put(heliostat1), RES_OK); @@ -238,8 +229,6 @@ main(int argc, char** argv) CHECK(ssol_spectrum_ref_put(spectrum), RES_OK); CHECK(ssol_sun_ref_put(sun), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_solver3.c b/src/test_ssol_solver3.c @@ -27,7 +27,6 @@ #define HALF_Y 10 #include "test_ssol_rect2D_geometry.h" -#include <rsys/logger.h> #include <rsys/double33.h> #include <star/s3d.h> @@ -47,7 +46,6 @@ get_wlen(const size_t i, double* wlen, double* data, void* ctx) int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssp_rng* rng; @@ -68,14 +66,14 @@ main(int argc, char** argv) struct ssol_sun* sun; struct ssol_spectrum* spectrum; struct ssol_estimator* estimator; - struct ssol_estimator_status status; + struct ssol_mc_global mc_global; + struct ssol_mc_receiver mc_rcv; double dir[3]; double transform[12]; /* 3x4 column major matrix */ size_t count; FILE* tmp; double m, std; uint32_t r_id; - (void) argc, (void) argv; d3_splat(transform + 9, 0); @@ -84,13 +82,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK); CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK); @@ -144,33 +137,31 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); #define N__ 20000 -#define GET_STATUS ssol_estimator_get_status -#define GET_RCV_STATUS ssol_estimator_get_receiver_status CHECK(ssol_solve(scene, rng, N__, tmp, &estimator), RES_OK); CHECK(ssol_instance_get_id(target, &r_id), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); - logger_print(&logger, LOG_OUTPUT, "\nIr = %g +/- %g\n", m, std); + printf("Ir = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(PI / 4)) CHECK(eq_eps(m, 4 * DNI_cos, 4 * DNI_cos * 2e-1), 1); #define SQR(x) ((x)*(x)) CHECK(eq_eps(std, sqrt((SQR(400*DNI_cos) / 100 - SQR(4*DNI_cos)) / (double)count), 20), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_SHADOW, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(status.Nf, 0); - CHECK(GET_RCV_STATUS(estimator, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, m, 1e-8), 1); - CHECK(eq_eps(status.irradiance.SE, std, 1e-4), 1); -#undef GET_STATUS -#undef GET_RCV_STATUS + CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); + printf("Shadows = %g +/- %g\n", mc_global.shadowed.E, mc_global.shadowed.SE); + printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE); + CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1); + CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1); + CHECK(ssol_estimator_get_mc_receiver + (estimator, target, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m, 1e-8), 1); + CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std, 1e-4), 1); + CHECK(ssol_estimator_get_failed_count(estimator, &count), RES_OK); + CHECK(count, 0); /* Free data */ CHECK(ssol_instance_ref_put(heliostat), RES_OK); @@ -188,8 +179,6 @@ main(int argc, char** argv) CHECK(ssol_spectrum_ref_put(spectrum), RES_OK); CHECK(ssol_sun_ref_put(sun), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_solver3N.c b/src/test_ssol_solver3N.c @@ -27,7 +27,6 @@ #define HALF_Y 1 #include "test_ssol_rect2D_geometry.h" -#include <rsys/logger.h> #include <rsys/double33.h> #include <star/s3d.h> @@ -93,7 +92,6 @@ int main(int argc, char** argv) { struct common common; - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssp_rng* rng; @@ -113,7 +111,8 @@ main(int argc, char** argv) struct ssol_sun* sun; struct ssol_spectrum* spectrum; struct ssol_estimator* estimator; - struct ssol_estimator_status status; + struct ssol_mc_global mc_global; + struct ssol_mc_receiver mc_rcv; double sun_dir[3]; double target_pos[3]; double transform[12]; /* 3x4 column major matrix */ @@ -126,13 +125,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK); CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK); @@ -146,7 +140,7 @@ main(int argc, char** argv) CHECK(ssol_scene_create(dev, &scene), RES_OK); CHECK(ssol_scene_attach_sun(scene, sun), RES_OK); - /* create scene content */ + /* Create scene content */ d3(target_pos, 0, 0, 1000); @@ -211,33 +205,26 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); #define N__ 10000 -#define GET_STATUS ssol_estimator_get_status -#define GET_RCV_STATUS ssol_estimator_get_receiver_status CHECK(ssol_solve(scene, rng, N__, tmp, &estimator), RES_OK); CHECK(ssol_instance_get_id(target, &r_id), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); - logger_print(&logger, LOG_OUTPUT, "\nIr = %g +/- %g\n", m, std); + printf("Ir = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(PI / 8)) CHECK(eq_eps(m, 4 * NX * NY * NZ * DNI_cos, 4 * NX * NY * NZ * DNI_cos * 2e-1), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_SHADOW, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(status.Nf, 0); - CHECK(GET_RCV_STATUS(estimator, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, m, 1e-6), 1); - CHECK(eq_eps(status.irradiance.SE, std, 1e-3), 1); -#undef GET_STATUS -#undef GET_RCV_STATUS + CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); + printf("Shadows = %g +/- %g\n", mc_global.shadowed.E, mc_global.shadowed.SE); + printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE); + CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1); + CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1); + CHECK(ssol_estimator_get_mc_receiver + (estimator, target, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m, 1e-6), 1); + CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std, 1e-3), 1); /* Free data */ CHECK(ssol_instance_ref_put(target), RES_OK); @@ -254,8 +241,6 @@ main(int argc, char** argv) CHECK(ssol_spectrum_ref_put(spectrum), RES_OK); CHECK(ssol_sun_ref_put(sun), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_solver4.c b/src/test_ssol_solver4.c @@ -27,7 +27,6 @@ #define HALF_Y 10 #include "test_ssol_rect2D_geometry.h" -#include <rsys/logger.h> #include <rsys/double33.h> #include <star/s3d.h> @@ -47,7 +46,6 @@ get_wlen(const size_t i, double* wlen, double* data, void* ctx) int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssp_rng* rng; @@ -69,7 +67,8 @@ main(int argc, char** argv) struct ssol_sun* sun; struct ssol_spectrum* spectrum; struct ssol_estimator* estimator; - struct ssol_estimator_status status; + struct ssol_mc_global mc_global; + struct ssol_mc_receiver mc_rcv; double dir[3]; double transform[12]; /* 3x4 column major matrix */ size_t count; @@ -85,13 +84,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK); CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK); @@ -103,7 +97,7 @@ main(int argc, char** argv) CHECK(ssol_scene_create(dev, &scene), RES_OK); CHECK(ssol_scene_attach_sun(scene, sun), RES_OK); - /* create scene content */ + /* Create scene content */ CHECK(ssol_shape_create_mesh(dev, &square), RES_OK); attribs[0].usage = SSOL_POSITION; @@ -151,8 +145,7 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); #define N__ 10000 -#define GET_STATUS ssol_estimator_get_status -#define GET_RCV_STATUS ssol_estimator_get_receiver_status +#define GET_MC_RCV ssol_estimator_get_mc_receiver CHECK(ssol_solve(scene, rng, N__, tmp, &estimator), RES_OK); CHECK(ssol_instance_get_id(target1, &r_id1), RES_OK); CHECK(ssol_instance_get_id(target2, &r_id2), RES_OK); @@ -161,29 +154,29 @@ main(int argc, char** argv) CHECK(pp_sum(tmp, (int32_t)r_id1, count, &m1, &std1), RES_OK); CHECK(pp_sum(tmp, (int32_t)r_id2, count, &m2, &std2), RES_OK); CHECK(fclose(tmp), 0); - logger_print(&logger, LOG_OUTPUT, "\nIr = %g +/- %g\n", m1, std1); + printf("Ir = %g +/- %g\n", m1, std1); #define DNI_cos (1000 * cos(0)) CHECK(eq_eps(m1, 400 * DNI_cos, 400 * DNI_cos * 1e-4), 1); CHECK(eq_eps(std1, 0, 1), 1); CHECK(m1, m2); CHECK(std1, std2); - CHECK(GET_STATUS(estimator, SSOL_STATUS_SHADOW, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(status.Nf, 0); - CHECK(GET_RCV_STATUS(estimator, target1, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target1) = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, m1, 1e-8), 1); - CHECK(eq_eps(status.irradiance.SE, std1, 1e-4), 1); - CHECK(GET_RCV_STATUS(estimator, target2, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target2) = %g +/- %g", status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, m2, 1e-8), 1); - CHECK(eq_eps(status.irradiance.SE, std2, 1e-4), 1); -#undef GET_STATUS -#undef GET_RCV_STATUS + CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); + printf("Shadows = %g +/- %g\n", mc_global.shadowed.E, mc_global.shadowed.SE); + printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE); + CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1); + CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1); + CHECK(GET_MC_RCV(estimator, target1, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target1) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m1, 1e-8), 1); + CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std1, 1e-4), 1); + CHECK(GET_MC_RCV(estimator, target2, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target2) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m2, 1e-8), 1); + CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std2, 1e-4), 1); + CHECK(ssol_estimator_get_failed_count(estimator, &count), RES_OK); + CHECK(count, 0); /* Free data */ CHECK(ssol_instance_ref_put(heliostat), RES_OK); @@ -202,8 +195,6 @@ main(int argc, char** argv) CHECK(ssol_spectrum_ref_put(spectrum), RES_OK); CHECK(ssol_sun_ref_put(sun), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_solver5.c b/src/test_ssol_solver5.c @@ -27,7 +27,6 @@ #define HALF_Y 10 #include "test_ssol_rect2D_geometry.h" -#include <rsys/logger.h> #include <rsys/double33.h> #include <star/s3d.h> @@ -47,7 +46,6 @@ get_wlen(const size_t i, double* wlen, double* data, void* ctx) int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssp_rng* rng; @@ -68,15 +66,16 @@ main(int argc, char** argv) struct ssol_sun* sun; struct ssol_spectrum* spectrum; struct ssol_estimator* estimator; - struct ssol_estimator_status status; + struct ssol_mc_global mc_global; + struct ssol_mc_receiver mc_rcv; double dir[3]; double transform[12]; /* 3x4 column major matrix */ size_t count; FILE* tmp; double m, std; uint32_t r_id; - (void) argc, (void) argv; + #define FOCAL 10 d3_splat(transform + 9, 0); d33_rotation_pitch(transform, PI); /* flip faces: invert normal */ @@ -84,13 +83,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK); CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK); @@ -102,7 +96,7 @@ main(int argc, char** argv) CHECK(ssol_scene_create(dev, &scene), RES_OK); CHECK(ssol_scene_attach_sun(scene, sun), RES_OK); - /* create scene content */ + /* Create scene content */ CHECK(ssol_shape_create_mesh(dev, &rect), RES_OK); attribs[0].usage = SSOL_POSITION; @@ -144,34 +138,29 @@ main(int argc, char** argv) NCHECK(tmp = tmpfile(), 0); #define N__ 10000 -#define GET_STATUS ssol_estimator_get_status -#define GET_RCV_STATUS ssol_estimator_get_receiver_status CHECK(ssol_solve(scene, rng, N__, tmp, &estimator), RES_OK); CHECK(ssol_instance_get_id(target, &r_id), RES_OK); CHECK(ssol_estimator_get_count(estimator, &count), RES_OK); CHECK(count, N__); CHECK(pp_sum(tmp, (int32_t)r_id, count, &m, &std), RES_OK); CHECK(fclose(tmp), 0); - logger_print(&logger, LOG_OUTPUT, "\nIr = %g +/- %g\n", m, std); + printf("Ir = %g +/- %g\n", m, std); #define DNI_cos (1000 * cos(0)) CHECK(eq_eps(m, 400 * DNI_cos, 20), 1); CHECK(eq_eps(std, 0, 1), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_SHADOW, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Shadows = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(GET_STATUS(estimator, SSOL_STATUS_MISSING, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Missing = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, 0, 1e-4), 1); - CHECK(status.Nf, 0); - CHECK(GET_RCV_STATUS(estimator, target, SSOL_FRONT, &status), RES_OK); - logger_print(&logger, LOG_OUTPUT, "Ir(target) = %g +/- %g", - status.irradiance.E, status.irradiance.SE); - CHECK(eq_eps(status.irradiance.E, m, 1e-8), 1); - CHECK(eq_eps(status.irradiance.SE, std, 1e-4), 1); -#undef GET_STATUS -#undef GET_RCV_STATUS + CHECK(ssol_estimator_get_mc_global(estimator, &mc_global), RES_OK); + printf("Shadows = %g +/- %g\n", mc_global.shadowed.E, mc_global.shadowed.SE); + printf("Missing = %g +/- %g\n", mc_global.missing.E, mc_global.missing.SE); + CHECK(eq_eps(mc_global.shadowed.E, 0, 1e-4), 1); + CHECK(eq_eps(mc_global.missing.E, 0, 1e-4), 1); + CHECK(ssol_estimator_get_mc_receiver + (estimator, target, SSOL_FRONT, &mc_rcv), RES_OK); + printf("Ir(target) = %g +/- %g\n", + mc_rcv.integrated_irradiance.E, mc_rcv.integrated_irradiance.SE); + CHECK(eq_eps(mc_rcv.integrated_irradiance.E, m, 1e-8), 1); + CHECK(eq_eps(mc_rcv.integrated_irradiance.SE, std, 1e-4), 1); + CHECK(ssol_estimator_get_failed_count(estimator, &count), RES_OK); + CHECK(count, 0); /* Free data */ CHECK(ssol_instance_ref_put(heliostat), RES_OK); @@ -189,8 +178,6 @@ main(int argc, char** argv) CHECK(ssol_spectrum_ref_put(spectrum), RES_OK); CHECK(ssol_sun_ref_put(sun), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_spectrum.c b/src/test_ssol_spectrum.c @@ -16,8 +16,6 @@ #include "ssol.h" #include "test_ssol_utils.h" -#include <rsys/logger.h> - struct spectrum_desc { double wavelengths[3]; double data[3]; @@ -41,7 +39,6 @@ get_wlen(const size_t i, double* wlen, double* data, void* ctx) int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssol_spectrum* spectrum; @@ -50,13 +47,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssol_spectrum_create(NULL, &spectrum), RES_BAD_ARG); CHECK(ssol_spectrum_create(dev, NULL), RES_BAD_ARG); @@ -90,8 +82,6 @@ main(int argc, char** argv) CHECK(ssol_device_ref_put(dev), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_sun.c b/src/test_ssol_sun.c @@ -16,13 +16,11 @@ #include "ssol.h" #include "test_ssol_utils.h" -#include <rsys/logger.h> #include <rsys/double3.h> int main(int argc, char** argv) { - struct logger logger; struct mem_allocator allocator; struct ssol_device* dev; struct ssol_spectrum* spectrum; @@ -36,13 +34,8 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(logger_init(&allocator, &logger), RES_OK); - logger_set_stream(&logger, LOG_OUTPUT, log_stream, NULL); - logger_set_stream(&logger, LOG_ERROR, log_stream, NULL); - logger_set_stream(&logger, LOG_WARNING, log_stream, NULL); - CHECK(ssol_device_create - (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); + (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK); CHECK(ssol_spectrum_create(dev, &spectrum2), RES_OK); @@ -198,8 +191,6 @@ main(int argc, char** argv) CHECK(ssol_spectrum_ref_put(spectrum2), RES_OK); CHECK(ssol_device_ref_put(dev), RES_OK); - logger_release(&logger); - check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0); diff --git a/src/test_ssol_utils.h b/src/test_ssol_utils.h @@ -20,14 +20,6 @@ #include <stdio.h> static INLINE void -log_stream(const char* msg, void* ctx) -{ - ASSERT(msg); - (void) msg, (void) ctx; - printf("%s\n", msg); -} - -static INLINE void check_memory_allocator(struct mem_allocator* allocator) { if(MEM_ALLOCATED_SIZE(allocator)) {