1.3.49
 
Loading...
Searching...
No Matches
selfTest.cpp
2
3#define DOCTEST_CONFIG_IMPLEMENT
4#include <doctest.h>
5#include "doctest_utils.h"
6
7using namespace helios;
8
9float err_tol = 1e-3;
10
11DOCTEST_TEST_CASE("BLConductanceModel check blc values") {
12
13 Context context;
14 float TL = 300;
15 float Ta = 290;
16 float U = 0.6;
17
18 std::vector<uint> UUID_1;
19 UUID_1.push_back(context.addPatch());
20 UUID_1.push_back(context.addPatch());
21 UUID_1.push_back(context.addPatch());
22 UUID_1.push_back(context.addPatch());
23
24 context.setPrimitiveData(UUID_1, "air_temperature", Ta);
25 context.setPrimitiveData(UUID_1, "temperature", TL);
26 context.setPrimitiveData(UUID_1, "wind_speed", U);
27
28 // Instantiate the boundary layer conductance model
29 BLConductanceModel blc(&context);
30 blc.disableMessages();
31
32 DOCTEST_CHECK_NOTHROW(blc.setBoundaryLayerModel(UUID_1.at(0), "Pohlhausen"));
33 DOCTEST_CHECK_NOTHROW(blc.setBoundaryLayerModel(UUID_1.at(1), "InclinedPlate"));
34 DOCTEST_CHECK_NOTHROW(blc.setBoundaryLayerModel(UUID_1.at(2), "Sphere"));
35 DOCTEST_CHECK_NOTHROW(blc.setBoundaryLayerModel(UUID_1.at(3), "Ground"));
36
37 capture_cerr cerr_buffer;
38 DOCTEST_CHECK_NOTHROW(blc.setBoundaryLayerModel(UUID_1.at(3), "InvalidModel"));
39 DOCTEST_CHECK(cerr_buffer.has_output());
40
41 DOCTEST_CHECK_NOTHROW(blc.run());
42
43 std::vector<float> gH(UUID_1.size());
44
45 DOCTEST_CHECK(context.doesPrimitiveDataExist(UUID_1.at(0), "boundarylayer_conductance"));
46 DOCTEST_CHECK(context.doesPrimitiveDataExist(UUID_1.at(1), "boundarylayer_conductance"));
47 DOCTEST_CHECK(context.doesPrimitiveDataExist(UUID_1.at(2), "boundarylayer_conductance"));
48 DOCTEST_CHECK(context.doesPrimitiveDataExist(UUID_1.at(3), "boundarylayer_conductance"));
49
50 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(UUID_1.at(0), "boundarylayer_conductance", gH.at(0)));
51 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(UUID_1.at(1), "boundarylayer_conductance", gH.at(1)));
52 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(UUID_1.at(2), "boundarylayer_conductance", gH.at(2)));
53 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(UUID_1.at(3), "boundarylayer_conductance", gH.at(3)));
54
55 DOCTEST_CHECK(gH.at(0) == doctest::Approx(0.20914112f).epsilon(err_tol));
56 DOCTEST_CHECK(gH.at(1) == doctest::Approx(0.135347f).epsilon(err_tol));
57 DOCTEST_CHECK(gH.at(2) == doctest::Approx(0.087149f).epsilon(err_tol));
58 DOCTEST_CHECK(gH.at(3) == doctest::Approx(0.465472f).epsilon(err_tol));
59}
60
61DOCTEST_TEST_CASE("Default values handling") {
62 Context context;
63 uint UUID_default = context.addPatch();
64
65 BLConductanceModel blc(&context);
66 blc.disableMessages();
67 blc.setBoundaryLayerModel(UUID_default, "Pohlhausen");
68 blc.run();
69
70 float default_gH = -1.f;
71 DOCTEST_CHECK(context.doesPrimitiveDataExist(UUID_default, "boundarylayer_conductance"));
72 context.getPrimitiveData(UUID_default, "boundarylayer_conductance", default_gH);
73 DOCTEST_CHECK(default_gH > 0);
74}
75
76DOCTEST_TEST_CASE("Single-sided primitive handling") {
77 Context context;
78 float TL = 300;
79 float Ta = 290;
80 float U = 0.6;
81
82 uint UUID = context.addPatch();
83 context.setPrimitiveData(UUID, "air_temperature", Ta);
84 context.setPrimitiveData(UUID, "temperature", TL);
85 context.setPrimitiveData(UUID, "wind_speed", U);
86 context.setPrimitiveData(UUID, "twosided_flag", 0u); // single-sided
87
88 BLConductanceModel blc(&context);
89 blc.disableMessages();
90 blc.setBoundaryLayerModel(UUID, "Pohlhausen");
91 blc.run();
92
93 float gH = 0.0f;
94 DOCTEST_CHECK(context.doesPrimitiveDataExist(UUID, "boundarylayer_conductance"));
95 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(UUID, "boundarylayer_conductance", gH));
96 DOCTEST_CHECK(gH == doctest::Approx(0.104571f).epsilon(err_tol));
97}
98
99DOCTEST_TEST_CASE("Message flag tests") {
100 Context context;
101 BLConductanceModel blc(&context);
102
103 DOCTEST_CHECK_NOTHROW(blc.enableMessages());
104
105 DOCTEST_CHECK_NOTHROW(blc.disableMessages());
106}
107
108DOCTEST_TEST_CASE("setBoundaryLayerModel for all primitives") {
109 Context context;
110 uint u1 = context.addPatch();
111 uint u2 = context.addPatch();
112
113 BLConductanceModel blc(&context);
114 blc.disableMessages();
115
116 DOCTEST_CHECK_NOTHROW(blc.setBoundaryLayerModel("Pohlhausen"));
117
118 context.setPrimitiveData({u1, u2}, "air_temperature", 290.f);
119 context.setPrimitiveData({u1, u2}, "temperature", 300.f);
120 context.setPrimitiveData({u1, u2}, "wind_speed", 0.6f);
121
122 blc.run();
123
124 float gH1, gH2;
125 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(u1, "boundarylayer_conductance", gH1));
126 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(u2, "boundarylayer_conductance", gH2));
127 DOCTEST_CHECK(gH1 == doctest::Approx(0.20914112f).epsilon(err_tol));
128 DOCTEST_CHECK(gH2 == doctest::Approx(0.20914112f).epsilon(err_tol));
129
130 DOCTEST_CHECK_NOTHROW(blc.setBoundaryLayerModel("InclinedPlate"));
131 blc.run();
132 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(u1, "boundarylayer_conductance", gH1));
133 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(u2, "boundarylayer_conductance", gH2));
134 DOCTEST_CHECK(gH1 == doctest::Approx(0.135347f).epsilon(err_tol));
135 DOCTEST_CHECK(gH2 == doctest::Approx(0.135347f).epsilon(err_tol));
136
137 capture_cerr cerr_buffer;
138 blc.enableMessages();
139 DOCTEST_CHECK_NOTHROW(blc.setBoundaryLayerModel("InvalidModel"));
140 DOCTEST_CHECK(cerr_buffer.has_output());
141}
142
143DOCTEST_TEST_CASE("Subset run") {
144 Context context;
145 float TL = 300;
146 float Ta = 290;
147 float U = 0.6;
148
149 std::vector<uint> UUIDs;
150 UUIDs.push_back(context.addPatch());
151 UUIDs.push_back(context.addPatch());
152 UUIDs.push_back(context.addPatch());
153
154 context.setPrimitiveData(UUIDs, "air_temperature", Ta);
155 context.setPrimitiveData(UUIDs, "temperature", TL);
156 context.setPrimitiveData(UUIDs, "wind_speed", U);
157
158 BLConductanceModel blc(&context);
159 blc.disableMessages();
160
161 blc.setBoundaryLayerModel(UUIDs[0], "Pohlhausen");
162 blc.setBoundaryLayerModel(UUIDs[1], "InclinedPlate");
163 blc.setBoundaryLayerModel(UUIDs[2], "Sphere");
164
165 std::vector<uint> subsetUUIDs = {UUIDs[0], UUIDs[2]};
166 DOCTEST_CHECK_NOTHROW(blc.run(subsetUUIDs));
167
168 DOCTEST_CHECK(context.doesPrimitiveDataExist(UUIDs[0], "boundarylayer_conductance"));
169 DOCTEST_CHECK(!context.doesPrimitiveDataExist(UUIDs[1], "boundarylayer_conductance"));
170 DOCTEST_CHECK(context.doesPrimitiveDataExist(UUIDs[2], "boundarylayer_conductance"));
171
172 float gH0, gH2;
173 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(UUIDs[0], "boundarylayer_conductance", gH0));
174 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(UUIDs[2], "boundarylayer_conductance", gH2));
175
176 DOCTEST_CHECK(gH0 == doctest::Approx(0.20914112f).epsilon(err_tol));
177 DOCTEST_CHECK(gH2 == doctest::Approx(0.087149f).epsilon(err_tol));
178}
179
180DOCTEST_TEST_CASE("Missing parameters and zero inputs") {
181 Context context;
182 BLConductanceModel blc(&context);
183 blc.disableMessages();
184
185 uint UUID = context.addPatch();
186 context.setPrimitiveData(UUID, "atmospheric_pressure", 100000.f);
187 context.setPrimitiveData(UUID, "object_length", 0.1f);
188 context.setPrimitiveData(UUID, "inclination", 0.5f);
189
190 // Run with default air_temperature, temperature, and wind_speed
191 DOCTEST_CHECK_NOTHROW(blc.run());
192 float gH;
193 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(UUID, "boundarylayer_conductance", gH));
194 DOCTEST_CHECK(gH > 0);
195
196 // Test zero characteristic dimension
197 context.setPrimitiveData(UUID, "object_length", 0.f);
198 DOCTEST_CHECK_NOTHROW(blc.run());
199 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(UUID, "boundarylayer_conductance", gH));
200 DOCTEST_CHECK(gH != 0.f);
201
202 // Test zero wind speed
203 context.setPrimitiveData(UUID, "object_length", 0.1f);
204 context.setPrimitiveData(UUID, "wind_speed", 0.f);
205
206 blc.setBoundaryLayerModel(UUID, "Pohlhausen");
207 DOCTEST_CHECK_NOTHROW(blc.run());
208 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(UUID, "boundarylayer_conductance", gH));
209 DOCTEST_CHECK(gH == 0.f);
210
211 blc.setBoundaryLayerModel(UUID, "InclinedPlate");
212 DOCTEST_CHECK_NOTHROW(blc.run());
213 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(UUID, "boundarylayer_conductance", gH));
214 DOCTEST_CHECK(gH > 0);
215
216 blc.setBoundaryLayerModel(UUID, "Sphere");
217 DOCTEST_CHECK_NOTHROW(blc.run());
218 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(UUID, "boundarylayer_conductance", gH));
219 DOCTEST_CHECK(gH > 0.f);
220
221 blc.setBoundaryLayerModel(UUID, "Ground");
222 DOCTEST_CHECK_NOTHROW(blc.run());
223 DOCTEST_CHECK_NOTHROW(context.getPrimitiveData(UUID, "boundarylayer_conductance", gH));
224 DOCTEST_CHECK(gH > 0.f);
225}
226
227int BLConductanceModel::selfTest(int argc, char **argv) {
228 return helios::runDoctestWithValidation(argc, argv);
229}