commit 4c50d38e687d57b1fc0b82b60d7133f2a338204b
parent 91acea965bf71abbf565e8554e8d45b976027fa7
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Wed, 15 Mar 2017 17:18:00 +0100
Add receiverXprimary outputs.
Diffstat:
9 files changed, 150 insertions(+), 7 deletions(-)
diff --git a/src/solstice_solve.c b/src/solstice_solve.c
@@ -143,6 +143,59 @@ write_global_mc(struct solstice* solstice, struct ssol_estimator* estimator)
sampled.shadowed.E, sampled.shadowed.SE
);
}
+
+ /* ReceiverXprimarys' data */
+ htable_receiver_begin(&solstice->receivers, &r_it);
+ htable_receiver_end(&solstice->receivers, &r_end);
+ while (!htable_receiver_iterator_eq(&r_it, &r_end)) {
+ struct solstice_receiver* rcv = htable_receiver_iterator_data_get(&r_it);
+ struct ssol_instance* rcv_inst = rcv->node->instance;
+ uint32_t rcv_id, prim_id;
+
+ SSOL(instance_get_id(rcv_inst, &rcv_id));
+ htable_primary_begin(&solstice->primaries, &p_it);
+ htable_primary_end(&solstice->primaries, &p_end);
+ while (!htable_primary_iterator_eq(&p_it, &p_end)) {
+ struct solstice_primary* prim = htable_primary_iterator_data_get(&p_it);
+ struct ssol_instance* prim_inst = prim->node->instance;
+ struct ssol_mc_receiver front = MC_RCV_NONE;
+ struct ssol_mc_receiver back = MC_RCV_NONE;
+
+ SSOL(instance_get_id(prim_inst, &prim_id));
+ switch (rcv->side) {
+ case SRCVL_FRONT:
+ SSOL(estimator_get_mc_sampled_x_receiver
+ (estimator, prim_inst, rcv_inst, SSOL_FRONT, &front));
+ break;
+ case SRCVL_BACK:
+ SSOL(estimator_get_mc_sampled_x_receiver
+ (estimator, prim_inst, rcv_inst, SSOL_BACK, &back));
+ break;
+ case SRCVL_FRONT_AND_BACK:
+ SSOL(estimator_get_mc_sampled_x_receiver
+ (estimator, prim_inst, rcv_inst, SSOL_FRONT, &front));
+ SSOL(estimator_get_mc_sampled_x_receiver
+ (estimator, prim_inst, rcv_inst, SSOL_BACK, &back));
+ break;
+ default: FATAL("Unreachable code.\n"); break;
+ }
+ fprintf(solstice->output,
+ "%u %u "
+ "FRONT: %g %g %g %g %g %g %g %g "
+ "BACK: %g %g %g %g %g %g %g %g\n",
+ (unsigned) rcv_id, (unsigned) prim_id,
+ front.integrated_absorbed_irradiance.E, front.integrated_absorbed_irradiance.SE,
+ front.integrated_irradiance.E, front.integrated_irradiance.SE,
+ front.reflectivity_loss.E, front.reflectivity_loss.SE,
+ front.absorptivity_loss.E, front.absorptivity_loss.SE,
+ back.integrated_absorbed_irradiance.E, back.integrated_absorbed_irradiance.SE,
+ back.integrated_irradiance.E, back.integrated_irradiance.SE,
+ back.reflectivity_loss.E, back.reflectivity_loss.SE,
+ back.absorptivity_loss.E, back.absorptivity_loss.SE);
+ htable_primary_iterator_next(&p_it);
+ }
+ htable_receiver_iterator_next(&r_it);
+ }
}
/*******************************************************************************
diff --git a/src/test_solstice_simulation.c b/src/test_solstice_simulation.c
@@ -225,14 +225,14 @@ get_angles_and_counts
CHECK(read_line(line, sizeof(line), file), 1);
CHECK(
sscanf(line,
- "%lu%lu%lu%lu%lu",
+ "%lu %lu %lu %lu %lu",
&counts->global, &counts->receiver, &counts->primary,
&counts->realisation, &counts->failed),
5);
return 1;
}
-static FINLINE void
+static void
read_global(FILE* file, char name [], double* E, double* SE)
{
char line[MAX_LINE_LEN];
@@ -274,11 +274,18 @@ read_recv(FILE* file, char name[], double E[], double SE[])
2 * RECEIVER_RESULTS_COUNT__ + 1);
}
-static FINLINE void
+static void
read_primary
(FILE* file, char name[], double* area, double* cos, double E[], double SE[])
{
char line[MAX_LINE_LEN];
+
+ NCHECK(file, NULL);
+ NCHECK(area, NULL);
+ NCHECK(cos, NULL);
+ NCHECK(E, NULL);
+ NCHECK(SE, NULL);
+
CHECK(read_line(line, sizeof(line), file), 1);
CHECK(
sscanf(line,
@@ -291,9 +298,45 @@ read_primary
2 * PRIMARY_RESULTS_COUNT__ + 3);
}
+static void
+read_recvXprim
+ (FILE* file,
+ unsigned long* rcv_id,
+ unsigned long* prim_id,
+ double E[],
+ double SE[])
+{
+ char line[MAX_LINE_LEN];
+
+ NCHECK(file, NULL);
+ NCHECK(rcv_id, NULL);
+ NCHECK(prim_id, NULL);
+ NCHECK(E, NULL);
+ NCHECK(SE, NULL);
+
+ CHECK(read_line(line, sizeof(line), file), 1);
+ CHECK(
+ sscanf(line,
+ "%lu %lu "
+ "FRONT: %lg %lg %lg %lg %lg %lg %lg %lg "
+ " BACK: %lg %lg %lg %lg %lg %lg %lg %lg",
+ rcv_id, prim_id,
+ &E[FRONT_INTEGRATED_ABSORBED_IRRADIANCE],
+ &SE[FRONT_INTEGRATED_ABSORBED_IRRADIANCE],
+ &E[FRONT_INTEGRATED_IRRADIANCE], &SE[FRONT_INTEGRATED_IRRADIANCE],
+ &E[FRONT_REFLECTIVITY_LOSS], &SE[FRONT_REFLECTIVITY_LOSS],
+ &E[FRONT_ABSORPTIVITY_LOSS], &SE[FRONT_ABSORPTIVITY_LOSS],
+ &E[BACK_INTEGRATED_ABSORBED_IRRADIANCE],
+ &SE[BACK_INTEGRATED_ABSORBED_IRRADIANCE],
+ &E[BACK_INTEGRATED_IRRADIANCE], &SE[BACK_INTEGRATED_IRRADIANCE],
+ &E[BACK_REFLECTIVITY_LOSS], &SE[BACK_REFLECTIVITY_LOSS],
+ &E[BACK_ABSORPTIVITY_LOSS], &SE[BACK_ABSORPTIVITY_LOSS]),
+ 2 * (RECEIVER_RESULTS_COUNT__ - 2 /* efficiencies not read */) + 2);
+}
+
#define POSITIVE_OR_M_ONE(x) ((x) == -1 || (x) >= 0)
-static FINLINE int
+static int
is_compatible_with
(const double ref_E,
const double ref_SE,
@@ -373,7 +416,28 @@ check_1_reference
CHECK(strcmp(ref_prim_name, test_prim_name), 0);
FOR_EACH(r, FIRST_RECEIVER_RESULT, PRIMARY_RESULTS_COUNT__) {
CHECK(is_compatible_with
- (reference_E[r], reference_SE[r], test_E[r], test_SE[r]), 1);
+ (reference_E[r], reference_SE[r], test_E[r], test_SE[r]), 1);
+ }
+ }
+ for (n = 0; n < counts->receiver * counts->primary; n++) {
+ double reference_E[RECEIVER_RESULTS_COUNT__];
+ double reference_SE[RECEIVER_RESULTS_COUNT__];
+ double test_E[RECEIVER_RESULTS_COUNT__];
+ double test_SE[RECEIVER_RESULTS_COUNT__];
+ unsigned long ref_rcv_id, ref_prim_id;
+ unsigned long test_rcv_id, test_prim_id;
+
+ enum receiver_result_type r;
+ read_recvXprim(ref_file, &ref_rcv_id, &ref_prim_id, reference_E, reference_SE);
+ read_recvXprim(test_file, &test_rcv_id, &test_prim_id, test_E, test_SE);
+ /* we rely on the order of outputs */
+ CHECK(ref_rcv_id, test_rcv_id);
+ CHECK(ref_prim_id, test_prim_id);
+ FOR_EACH(r, FIRST_RECEIVER_RESULT, RECEIVER_RESULTS_COUNT__) {
+ if (r == FRONT_EFFICIENCY || r == BACK_EFFICIENCY)
+ continue; /* not read */
+ CHECK(is_compatible_with
+ (reference_E[r], reference_SE[r], test_E[r], test_SE[r]), 1);
}
}
}
diff --git a/yaml/beam_down.ref b/yaml/beam_down.ref
@@ -1,4 +1,4 @@
-#--- Sun direction: 0 90 (-3.7494e-33 -6.12323e-17 -1)
+#--- Sun direction: 90 90 (-3.7494e-33 -6.12323e-17 -1)
3 2 5 10000 0
0 0 # Shadowing
0 0 # Missing
@@ -10,6 +10,16 @@ heliostat5.temp-heliostat150.pivot.reflector 30 100.009 0.929682 1986 0 0
heliostat3.temp-heliostat150.pivot.reflector 22 100.009 0.931826 1997 0 0
heliostat2.temp-heliostat150.pivot.reflector 26 100.009 0.931729 1994 0 0
heliostat1.temp-heliostat150.pivot.reflector 34 100.009 0.929682 2024 0 0
+10 6 FRONT: 0 0 93.1263 1.86311 0 0 0 0 BACK: 0 0 0 0 0 0 0 0
+10 30 FRONT: 0 0 92.3174 1.85447 0 0 0 0 BACK: 0 0 0 0 0 0 0 0
+10 22 FRONT: 0 0 93.0428 1.8626 0 0 0 0 BACK: 0 0 0 0 0 0 0 0
+10 26 FRONT: 0 0 92.8934 1.86136 0 0 0 0 BACK: 0 0 0 0 0 0 0 0
+10 34 FRONT: 0 0 94.0838 1.86768 0 0 0 0 BACK: 0 0 0 0 0 0 0 0
+14 6 FRONT: 93.1263 1.86311 93.1263 1.86311 0 0 0 0 BACK: -1 -1 -1 -1 -1 -1 -1 -1
+14 30 FRONT: 92.3174 1.85447 92.3174 1.85447 0 0 0 0 BACK: -1 -1 -1 -1 -1 -1 -1 -1
+14 22 FRONT: 93.0428 1.8626 93.0428 1.8626 0 0 0 0 BACK: -1 -1 -1 -1 -1 -1 -1 -1
+14 26 FRONT: 92.8934 1.86136 92.8934 1.86136 0 0 0 0 BACK: -1 -1 -1 -1 -1 -1 -1 -1
+14 34 FRONT: 94.0838 1.86768 94.0838 1.86768 0 0 0 0 BACK: -1 -1 -1 -1 -1 -1 -1 -1
#--- Sun direction: 50 50 (-0.413176 -0.492404 -0.766044)
3 2 5 10000 0
0 0 # Shadowing
@@ -22,3 +32,13 @@ heliostat5.temp-heliostat150.pivot.reflector 30 100.009 0.769863 1956 0 0
heliostat3.temp-heliostat150.pivot.reflector 22 100.009 0.799943 1948 0 0
heliostat2.temp-heliostat150.pivot.reflector 26 100.009 0.815939 2049 0 0
heliostat1.temp-heliostat150.pivot.reflector 34 100.009 0.830503 2002 0 0
+10 6 FRONT: 0 0 80.298 1.58372 0 0 0 0 BACK: 0 0 0 0 0 0 0 0
+10 30 FRONT: 0 0 75.2926 1.52688 0 0 0 0 BACK: 0 0 0 0 0 0 0 0
+10 22 FRONT: 0 0 77.9144 1.58407 0 0 0 0 BACK: 0 0 0 0 0 0 0 0
+10 26 FRONT: 0 0 83.593 1.64668 0 0 0 0 BACK: 0 0 0 0 0 0 0 0
+10 34 FRONT: 0 0 83.1334 1.66163 0 0 0 0 BACK: 0 0 0 0 0 0 0 0
+14 6 FRONT: 22.2243 0.907335 22.2243 0.907335 0 0 0 0 BACK: -1 -1 -1 -1 -1 -1 -1 -1
+14 30 FRONT: 18.2843 0.818772 18.2843 0.818772 0 0 0 0 BACK: -1 -1 -1 -1 -1 -1 -1 -1
+14 22 FRONT: 24.7182 0.963099 24.7182 0.963099 0 0 0 0 BACK: -1 -1 -1 -1 -1 -1 -1 -1
+14 26 FRONT: 33.4127 1.1187 33.4127 1.1187 0 0 0 0 BACK: -1 -1 -1 -1 -1 -1 -1 -1
+14 34 FRONT: 37.871 1.19548 37.871 1.19548 0 0 0 0 BACK: -1 -1 -1 -1 -1 -1 -1 -1
diff --git a/yaml/test01.ref b/yaml/test01.ref
@@ -5,3 +5,4 @@
1 0 # Cos
square_receiver 2 FRONT: -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 BACK: 0 0 1 0 0 0 0 0 0 0
reflector 6 1 1 10000 0 0
+2 6 FRONT: -1 -1 -1 -1 -1 -1 -1 -1 BACK: 0 0 1 0 0 0 0 0
diff --git a/yaml/test02.ref b/yaml/test02.ref
@@ -5,3 +5,4 @@
1 0 # Cos
square_receiver 2 FRONT: -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 BACK: 0 0 1 0.0313065 0 0 0 0 0 0
reflector 6 100 1 10000 0 0
+2 6 FRONT: -1 -1 -1 -1 -1 -1 -1 -1 BACK: 0 0 1 0.0313065 0 0 0 0
diff --git a/yaml/test03.ref b/yaml/test03.ref
@@ -4,4 +4,5 @@
0 0 # Missing
0.707107 0 # Cos
square_receiver 2 FRONT: -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 BACK: 0 0 0.707107 0 0 0 0 0 0 0
-reflector 6 1 0.707107 10000 0 0
+reflector 6 1 0.707107 10000 0 0
+2 6 FRONT: -1 -1 -1 -1 -1 -1 -1 -1 BACK: 0 0 0.707107 0 0 0 0 0
diff --git a/yaml/test04.ref b/yaml/test04.ref
@@ -5,3 +5,4 @@
0.707107 0 # Cos
square_receiver 2 FRONT: 0 0 0 0 0 0 0 0 0 0 BACK: 0 0 0.707107 0 0 0 0 0 0 0
reflector 6 1 0.707107 10000 0 0
+2 6 FRONT: 0 0 0 0 0 0 0 0 BACK: 0 0 0.707107 0 0 0 0 0
diff --git a/yaml/test05.ref b/yaml/test05.ref
@@ -5,3 +5,4 @@
1 0 # Cos
spherical_receiver 2 FRONT: -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 BACK: 0 0 1 0 0 0 0 0 0 0
reflector 6 1 1 10000 0 0
+2 6 FRONT: -1 -1 -1 -1 -1 -1 -1 -1 BACK: 0 0 1 0 0 0 0 0
diff --git a/yaml/test06.ref b/yaml/test06.ref
@@ -5,3 +5,4 @@
1 0 # Cos
reflector.ground.pivot.small_square 10 FRONT: -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 BACK: 0 0 100 0 0 0 0 0 0 0
reflector.ground.pivot.parabol 6 111.97 1 10000 0 0
+10 6 FRONT: -1 -1 -1 -1 -1 -1 -1 -1 BACK: 0 0 100 0 0 0 0 0