Skip to content

Commit 582c0b3

Browse files
committed
tests actually run now, but take 5 min
1 parent 7b93662 commit 582c0b3

6 files changed

Lines changed: 108 additions & 7 deletions

File tree

src/model/Block.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ std::string Block::get_name() { return this->model->get_block_name(this->id); }
99

1010
void Block::update_vessel_type(VesselType type) { vessel_type = type; }
1111

12+
VesselType Block::get_vessel_type() { return vessel_type; }
13+
1214
Block::~Block() {}
1315

1416
void Block::setup_params_(const std::vector<int>& param_ids) {

src/model/Block.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,13 @@ class Block {
162162
*/
163163
void update_vessel_type(VesselType type);
164164

165+
/**
166+
* @brief Get vessel type of the block
167+
*
168+
* @return VesselType Type of vessel
169+
*/
170+
VesselType get_vessel_type();
171+
165172
/**
166173
* @brief Setup parameter IDs for the block
167174
* @param param_ids Global IDs of the block parameters

src/optimize/calibrate.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ nlohmann::json calibrate(const nlohmann::json& config) {
1313

1414
// Setup model
1515
auto model = Model();
16-
load_calibration_model(config, model);
16+
load_calibration_model_legacy(config, model);
1717

1818
// Build mapping between optimization parameters and model parameters
1919
// todo: have a list of optimization parameters for every block (default

src/solve/Parameters.cpp

Lines changed: 95 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -282,15 +282,105 @@ void load_calibration_model(const nlohmann::json& config, Model& model) {
282282
if (config.contains(component)) {
283283
create_vessels(model, connections, config, component, vessel_id_map);
284284
}
285-
285+
286286
// Create junctions
287287
component = "junctions";
288288
if (config.contains(component)) {
289289
create_junctions(model, connections, config, component, vessel_id_map);
290290
}
291291

292292
// Create Connections
293-
create_connections(model, connections);
293+
DEBUG_MSG("Create connections");
294+
for (auto& cn : connections) {
295+
auto ele1 = model.get_block(std::get<0>(cn));
296+
auto ele2 = model.get_block(std::get<1>(cn));
297+
if (ele1->get_vessel_type() == VesselType::inlet) {
298+
model.add_node({}, {ele1}, std::get<0>(cn) + ":" + ele1->get_name());
299+
} else if (ele2->get_vessel_type() == VesselType::outlet) {
300+
model.add_node({ele2}, {}, ele2->get_name() + ":" + std::get<1>(cn));
301+
} else {
302+
model.add_node({ele1}, {ele2}, ele1->get_name() + ":" + ele2->get_name());
303+
}
304+
}
305+
306+
// Finalize model
307+
model.finalize();
308+
}
309+
310+
void load_calibration_model_legacy(const nlohmann::json& config, Model& model) {
311+
std::vector<std::tuple<std::string, std::string>> connections;
312+
std::vector<std::tuple<std::string, std::string>> inlet_connections;
313+
std::vector<std::tuple<std::string, std::string>> outlet_connections;
314+
315+
// Create vessels
316+
DEBUG_MSG("Load vessels");
317+
std::map<std::int64_t, std::string> vessel_id_map;
318+
int param_counter = 0;
319+
for (auto const& vessel_config : config["vessels"]) {
320+
std::string vessel_name = vessel_config["vessel_name"];
321+
322+
// Create parameter IDs
323+
std::vector<int> param_ids;
324+
for (size_t k = 0; k < 4; k++) param_ids.push_back(param_counter++);
325+
model.add_block("BloodVessel", param_ids, vessel_name);
326+
vessel_id_map.insert({vessel_config["vessel_id"], vessel_name});
327+
DEBUG_MSG("Created vessel " << vessel_name);
328+
329+
// Read connected boundary conditions
330+
if (vessel_config.contains("boundary_conditions")) {
331+
auto const& vessel_bc_config = vessel_config["boundary_conditions"];
332+
if (vessel_bc_config.contains("inlet")) {
333+
inlet_connections.push_back({vessel_bc_config["inlet"], vessel_name});
334+
}
335+
if (vessel_bc_config.contains("outlet")) {
336+
outlet_connections.push_back({vessel_name, vessel_bc_config["outlet"]});
337+
}
338+
}
339+
}
340+
341+
// Create junctions
342+
for (auto const& junction_config : config["junctions"]) {
343+
std::string junction_name = junction_config["junction_name"];
344+
auto const& outlet_vessels = junction_config["outlet_vessels"];
345+
int num_outlets = outlet_vessels.size();
346+
347+
if (num_outlets == 1) {
348+
model.add_block("NORMAL_JUNCTION", {}, junction_name);
349+
350+
} else {
351+
std::vector<int> param_ids;
352+
for (size_t i = 0; i < (num_outlets * 3); i++)
353+
param_ids.push_back(param_counter++);
354+
model.add_block("BloodVesselJunction", param_ids, junction_name);
355+
}
356+
357+
// Check for connections to inlet and outlet vessels and append to
358+
// connections list
359+
for (auto vessel_id : junction_config["inlet_vessels"]) {
360+
connections.push_back({vessel_id_map[vessel_id], junction_name});
361+
}
362+
363+
for (auto vessel_id : outlet_vessels) {
364+
connections.push_back({junction_name, vessel_id_map[vessel_id]});
365+
}
366+
DEBUG_MSG("Created junction " << junction_name);
367+
}
368+
369+
// Create Connections
370+
DEBUG_MSG("Created connection");
371+
for (auto& connection : connections) {
372+
auto ele1 = model.get_block(std::get<0>(connection));
373+
auto ele2 = model.get_block(std::get<1>(connection));
374+
model.add_node({ele1}, {ele2}, ele1->get_name() + ":" + ele2->get_name());
375+
}
376+
for (auto& connection : inlet_connections) {
377+
auto ele = model.get_block(std::get<1>(connection));
378+
model.add_node({}, {ele}, std::get<0>(connection) + ":" + ele->get_name());
379+
}
380+
for (auto& connection : outlet_connections) {
381+
auto ele = model.get_block(std::get<0>(connection));
382+
model.add_node({ele}, {}, ele->get_name() + ":" + std::get<1>(connection));
383+
}
294384

295385
// Finalize model
296386
model.finalize();
@@ -494,9 +584,9 @@ void create_junctions(
494584
}
495585
}
496586

497-
void create_connections(Model& model,
498-
std::vector<std::tuple<std::string, std::string>>&
499-
connections) {
587+
void create_connections(
588+
Model& model,
589+
std::vector<std::tuple<std::string, std::string>>& connections) {
500590
DEBUG_MSG("Creating connections");
501591
for (auto& connection : connections) {
502592
auto ele1 = model.get_block(std::get<0>(connection));

src/solve/Parameters.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ CalibrationParameters load_calibration_params(const nlohmann::json& config);
176176
* @
177177
*/
178178
void load_calibration_model(const nlohmann::json& config, Model& model);
179+
void load_calibration_model_legacy(const nlohmann::json& config, Model& model);
179180

180181
/**
181182
* @brief Check that the JSON configuration has the required inputs

tests/cases/steadyFlow_calibration.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838
"C": 0.0001,
3939
"L": 1.0,
4040
"R_poiseuille": 100.0
41-
}
41+
},
42+
"calibrate_elements": ["R_poiseuille", "C", "L", "stenosis_coefficient"]
4243
}
4344
],
4445
"y": {

0 commit comments

Comments
 (0)