From 8a2096d4b26b30f0830103994e2a0dcda701c84c Mon Sep 17 00:00:00 2001 From: Magnus Dahler Norling Date: Mon, 5 Aug 2024 10:45:39 +0200 Subject: [PATCH] Fix docs --- docs/img/datafiles/flags.png | Bin 8650 -> 9635 bytes docs/mobiviewdocs/plots.md | 2 +- src/model_application.cpp | 14 ++++++++++++++ src/model_application.h | 6 +++--- src/model_compilation.cpp | 28 +++++++++++++--------------- 5 files changed, 31 insertions(+), 19 deletions(-) diff --git a/docs/img/datafiles/flags.png b/docs/img/datafiles/flags.png index 6f8f693847a97cadc4808a81a9bdd41154655c46..ede8d7743e044ad06acc75a9e20f13b2795b6f32 100644 GIT binary patch literal 9635 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 Ks9FiO4ErAniWzqR literal 8650 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 b?vXjI1DzOH;IqJtK1fdLg=7Wdb@2ZJa=JTr diff --git a/docs/mobiviewdocs/plots.md b/docs/mobiviewdocs/plots.md index e3066dea..a324d6ec 100644 --- a/docs/mobiviewdocs/plots.md +++ b/docs/mobiviewdocs/plots.md @@ -10,7 +10,7 @@ has_children: true You can use the plot to visualize inputs and results of the model. Time series can be selected in the result and model input trees to the left of the plot. -![Series selecter](../img/mobiview/series_selecter.png) +![Series selecter](../img/mobiview/series_selection.png) Series are organized in a tree structure according to their [location](../mobius2docs/central_concepts.html#components-and-locations). For instance, the soil water organic carbon is found under `Soil->Water->Organic carbon`. Non-primary state variables are instead organized under the location that makes the most sense, for instance a flux is organized under its source location if it is valid, otherwise its target location. diff --git a/src/model_application.cpp b/src/model_application.cpp index e1adaf72..f5bb2cfe 100644 --- a/src/model_application.cpp +++ b/src/model_application.cpp @@ -1309,6 +1309,20 @@ Model_Application::find_base_flux(Var_Id dissolved_flux_id) { return result_id; } +Var_Id +Model_Application::find_flux_var_of_decl(Entity_Id flux_id) { + // Find the flux state variable corresponding to a model flux declaration. + + // TODO: This is a bit inefficient, should we have a lookup structure for it? + for(auto var_id : vars.all_fluxes()) { + auto var = vars[var_id]; + if(var->type != State_Var::Type::declared) continue; + if(as(var)->decl_id == flux_id) + return var_id; + } + return invalid_var; +} + std::string Model_Application::serialize(Var_Id id) { diff --git a/src/model_application.h b/src/model_application.h index 00c7ca9d..4a0dae60 100644 --- a/src/model_application.h +++ b/src/model_application.h @@ -454,8 +454,7 @@ Model_Application { bool all_indexes_are_set(); - Math_Expr_FT * - get_index_count_code(Entity_Id index_set, Index_Exprs &indexes); + Math_Expr_FT * get_index_count_code(Entity_Id index_set, Index_Exprs &indexes); Sub_Indexed_Component *find_connection_component(Entity_Id conn_id, Entity_Id comp_id, bool make_error = true); Var_Location get_primary_location(Var_Id source, bool &is_conc); @@ -464,6 +463,7 @@ Model_Application { Var_Id get_connection_target_variable(Var_Id source, Entity_Id connection_id, Entity_Id target_component); Var_Id find_base_flux(Var_Id dissolved_flux_id); + Var_Id find_flux_var_of_decl(Entity_Id flux_id); void build_from_data_set(Data_Set *data_set); void save_to_data_set(Model_Data *save_from=nullptr); @@ -496,7 +496,7 @@ read_single_parameter_data(Model_Application *app, Entity_Id par_id, Parameter_D Entity_Id avoid_index_set_dependency(Model_Application *app, Var_Loc_Restriction restriction); -// The point of this one is to make a structure that can be used for local computations, this is not the same as the connection_structure, which is used in the model code generation itself. +// The use case of this one is to make a structure that can be used for local computations, this is not the same as the connection_structure, which is used in the model code generation itself. void make_connection_component_indexing_structure(Model_Application *app, Storage_Structure *components, Entity_Id connection_id); diff --git a/src/model_compilation.cpp b/src/model_compilation.cpp index bff96a7b..be23524a 100644 --- a/src/model_compilation.cpp +++ b/src/model_compilation.cpp @@ -1049,16 +1049,21 @@ set_up_external_computation_instruction(Model_Application *app, Var_Id var_id, s } void -maybe_process_discrete_flux(Model_Application *app, std::vector &instructions, Var_Id var_id, bool is_aggregate, bool has_aggregate) { +maybe_process_discrete_flux(Model_Application *app, std::vector &instructions, Var_Id var_id) { // Generate instructions for updating quantities based on discrete fluxes. auto model = app->model; auto var = app->vars[var_id]; + if(!var->is_flux()) return; + auto loc1 = var->loc1; auto loc2 = var->loc2; + bool is_aggregate = var->type == State_Var::Type::regular_aggregate; + bool has_aggregate = var->has_flag(State_Var::has_aggregate); + std::vector sub_add_instrs; bool is_discrete = false; @@ -1157,14 +1162,10 @@ maybe_process_discrete_flux(Model_Application *app, std::vectorfluxes) { if(after) { - // TODO: Ugh, we have to do this just to find the single state variable corresponding to a given flux declaration. - // should have a lookup structure for it! - for(auto var_id_2 : app->vars.all_fluxes()) { - auto var2 = app->vars[var_id_2]; - if(var2->type != State_Var::Type::declared) continue; - if(as(var2)->decl_id == flux_id) - instructions[var_id_2.id].depends_on_instruction.insert(sub_add_instrs.begin(), sub_add_instrs.end()); - } + auto var_id_2 = app->find_flux_var_of_decl(flux_id); + + if(is_valid(var_id_2)) + instructions[var_id_2.id].depends_on_instruction.insert(sub_add_instrs.begin(), sub_add_instrs.end()); } if(flux_id == flux_decl_id) after = true; @@ -1239,15 +1240,12 @@ build_instructions(Model_Application *app, std::vector &instr auto var = app->vars[var_id]; - bool is_aggregate = var->type == State_Var::Type::regular_aggregate; - bool has_aggregate = var->has_flag(State_Var::has_aggregate); - if(var->type == State_Var::Type::external_computation) { set_up_external_computation_instruction(app, var_id, instructions, initial); continue; } - if(is_aggregate) { + if(var->type == State_Var::Type::regular_aggregate) { // NOTE: We have to look up the solver here. This is because we can't necessarily set it up before this point. // although TODO: Couldn't we though? @@ -1293,9 +1291,9 @@ build_instructions(Model_Application *app, std::vector &instr insert_dependency(app, agg_instr, index_set); } - if(initial || !var->is_flux()) continue; + if(initial) continue; - maybe_process_discrete_flux(app, instructions, var_id, is_aggregate, has_aggregate); + maybe_process_discrete_flux(app, instructions, var_id); } }