Skip to content

Commit 23d49b8

Browse files
authored
Add basic vtu output to reduced lung
2 parents 87550fd + 4eee218 commit 23d49b8

File tree

3 files changed

+94
-16
lines changed

3 files changed

+94
-16
lines changed

src/reduced_lung/4C_reduced_lung_helpers.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,61 @@ namespace ReducedLung
176176

177177
return column_map;
178178
}
179+
180+
void collect_runtime_output_data(
181+
Core::IO::DiscretizationVisualizationWriterMesh& visualization_writer,
182+
const std::vector<Airway>& airways, const std::vector<TerminalUnit>& terminal_units,
183+
const Core::LinAlg::Vector<double>& dofs, const Core::LinAlg::Map* element_row_map)
184+
{
185+
Core::LinAlg::Vector<double> pressure_in(*element_row_map, true);
186+
Core::LinAlg::Vector<double> pressure_out(*element_row_map, true);
187+
Core::LinAlg::Vector<double> flow_in(*element_row_map, true);
188+
for (const auto& airway : airways)
189+
{
190+
[[maybe_unused]] int err = pressure_in.replace_local_value(
191+
airway.local_element_id, 0, dofs[airway.local_dof_ids[p_in]]);
192+
FOUR_C_ASSERT(err == 0,
193+
"Internal error: replace_local_value for runtime output (p_in from airways) did not "
194+
"work.");
195+
err = pressure_out.replace_local_value(
196+
airway.local_element_id, 0, dofs[airway.local_dof_ids[p_out]]);
197+
FOUR_C_ASSERT(err == 0,
198+
"Internal error: replace_local_value for runtime output (p_out from airways) did not "
199+
"work.");
200+
err =
201+
flow_in.replace_local_value(airway.local_element_id, 0, dofs[airway.local_dof_ids[q_in]]);
202+
FOUR_C_ASSERT(err == 0,
203+
"Internal error: replace_local_value for runtime output (q_in from airways) did not "
204+
"work.");
205+
}
206+
for (const auto& terminal_unit : terminal_units)
207+
{
208+
[[maybe_unused]] int err = pressure_in.replace_local_value(
209+
terminal_unit.local_element_id, 0, dofs[terminal_unit.local_dof_ids[p_in]]);
210+
FOUR_C_ASSERT(err == 0,
211+
"Internal error: replace_local_value for runtime output (p_in from terminal units) did "
212+
"not "
213+
"work.");
214+
err = pressure_out.replace_local_value(
215+
terminal_unit.local_element_id, 0, dofs[terminal_unit.local_dof_ids[p_out]]);
216+
FOUR_C_ASSERT(err == 0,
217+
"Internal error: replace_local_value for runtime output (p_out from terminal units) did "
218+
"not "
219+
"work.");
220+
err = flow_in.replace_local_value(
221+
terminal_unit.local_element_id, 0, dofs[terminal_unit.local_dof_ids[q_in]]);
222+
FOUR_C_ASSERT(err == 0,
223+
"Internal error: replace_local_value for runtime output (q_in from terminal units) did "
224+
"not "
225+
"work.");
226+
}
227+
visualization_writer.append_result_data_vector_with_context(
228+
pressure_in, Core::IO::OutputEntity::element, {"p_1"});
229+
visualization_writer.append_result_data_vector_with_context(
230+
pressure_out, Core::IO::OutputEntity::element, {"p_2"});
231+
visualization_writer.append_result_data_vector_with_context(
232+
flow_in, Core::IO::OutputEntity::element, {"q_in"});
233+
}
179234
} // namespace ReducedLung
180235

181236
FOUR_C_NAMESPACE_CLOSE

src/reduced_lung/4C_reduced_lung_helpers.hpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "4C_comm_mpi_utils.hpp"
1414
#include "4C_global_data.hpp"
15+
#include "4C_io_discretization_visualization_writer_mesh.hpp"
1516
#include "4C_linalg_map.hpp"
1617

1718
FOUR_C_NAMESPACE_OPEN
@@ -98,8 +99,8 @@ namespace ReducedLung
9899

99100
struct Airway
100101
{
101-
int global_equation_id;
102-
int local_equation_id;
102+
int global_element_id;
103+
int local_element_id;
103104
int local_airway_id;
104105
AirwayType airway_type;
105106
// dofs: {p1, p2, q} for resistive airways; {p1, p2, q1, q2} for compliant airways
@@ -117,8 +118,8 @@ namespace ReducedLung
117118
// Save rheological model and (non-)linear elasticity separately
118119
struct TerminalUnit
119120
{
120-
int global_equation_id;
121-
int local_equation_id;
121+
int global_element_id;
122+
int local_element_id;
122123
int local_terminal_unit_id;
123124
TerminalUnitType tu_type;
124125
double E;
@@ -203,6 +204,11 @@ namespace ReducedLung
203204
const std::map<int, int>& first_global_dof_of_ele, const std::vector<Connection>& connections,
204205
const std::vector<Bifurcation>& bifurcations,
205206
const std::vector<BoundaryCondition>& boundary_conditions);
207+
208+
void collect_runtime_output_data(
209+
Core::IO::DiscretizationVisualizationWriterMesh& visualization_writer,
210+
const std::vector<Airway>& airways, const std::vector<TerminalUnit>& terminal_units,
211+
const Core::LinAlg::Vector<double>& dofs, const Core::LinAlg::Map* element_row_map);
206212
} // namespace ReducedLung
207213

208214
FOUR_C_NAMESPACE_CLOSE

src/reduced_lung/4C_reduced_lung_main.cpp

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "4C_fem_general_node.hpp"
1414
#include "4C_global_data.hpp"
1515
#include "4C_io.hpp"
16+
#include "4C_io_discretization_visualization_writer_mesh.hpp"
1617
#include "4C_linalg_utils_sparse_algebra_manipulation.hpp"
1718
#include "4C_linear_solver_method_linalg.hpp"
1819
#include "4C_mat_maxwell_0d_acinus_NeoHookean.hpp"
@@ -47,6 +48,12 @@ namespace ReducedLung
4748
Teuchos::getIntegralValue<Core::IO::Verbositylevel>(
4849
Global::Problem::instance()->io_params(), "VERBOSITY"));
4950
actdis->compute_null_space_if_necessary(solver->params());
51+
// Create runtime output writer
52+
const auto visualization_writer =
53+
std::make_unique<Core::IO::DiscretizationVisualizationWriterMesh>(
54+
actdis, Core::IO::visualization_parameters_factory(
55+
Global::Problem::instance()->io_params().sublist("RUNTIME VTK OUTPUT"),
56+
*Global::Problem::instance()->output_control_file(), 0));
5057
// The existing mpi communicator is recycled for the new data layout.
5158
const auto& comm = actdis->get_comm();
5259

@@ -122,17 +129,17 @@ namespace ReducedLung
122129
// Assign every local element its associated global dof ids.
123130
for (auto& airway : airways)
124131
{
125-
int first_dof_gid = first_global_dof_of_ele[airway.global_equation_id];
126-
int n_dof = dof_per_ele[airway.global_equation_id];
132+
int first_dof_gid = first_global_dof_of_ele[airway.global_element_id];
133+
int n_dof = dof_per_ele[airway.global_element_id];
127134
for (int i = 0; i < n_dof; i++)
128135
{
129136
airway.global_dof_ids.insert(airway.global_dof_ids.end(), first_dof_gid + i);
130137
}
131138
}
132139
for (auto& terminal_unit : terminal_units)
133140
{
134-
int first_dof_gid = first_global_dof_of_ele[terminal_unit.global_equation_id];
135-
int n_dof = dof_per_ele[terminal_unit.global_equation_id];
141+
int first_dof_gid = first_global_dof_of_ele[terminal_unit.global_element_id];
142+
int n_dof = dof_per_ele[terminal_unit.global_element_id];
136143
for (int i = 0; i < n_dof; i++)
137144
{
138145
terminal_unit.global_dof_ids.insert(terminal_unit.global_dof_ids.end(), first_dof_gid + i);
@@ -434,7 +441,7 @@ namespace ReducedLung
434441
{
435442
const int airway_id = airway.local_airway_id;
436443
const auto* airway_ele =
437-
static_cast<Discret::Elements::RedAirway*>(actdis->g_element(airway.global_equation_id));
444+
static_cast<Discret::Elements::RedAirway*>(actdis->g_element(airway.global_element_id));
438445
const Discret::ReducedLung::AirwayParams airway_params = airway_ele->get_airway_params();
439446
const std::vector<double>& coords_1 = airway_ele->nodes()[0]->x();
440447
const std::vector<double>& coords_2 = airway_ele->nodes()[1]->x();
@@ -457,7 +464,7 @@ namespace ReducedLung
457464
{
458465
const int terminal_unit_id = terminal_unit.local_terminal_unit_id;
459466
const auto* terminal_unit_ele = static_cast<Discret::Elements::RedAcinus*>(
460-
actdis->g_element(terminal_unit.global_equation_id));
467+
actdis->g_element(terminal_unit.global_element_id));
461468
const std::vector<double>& coords_1 = terminal_unit_ele->nodes()[0]->x();
462469
const std::vector<double>& coords_2 = terminal_unit_ele->nodes()[1]->x();
463470
const double radius = std::sqrt((coords_1[0] - coords_2[0]) * (coords_1[0] - coords_2[0]) +
@@ -484,6 +491,7 @@ namespace ReducedLung
484491
auto sysmat = Epetra_CrsMatrix(
485492
Copy, row_map.get_epetra_map(), locally_relevant_dof_map.get_epetra_map(), 3);
486493

494+
const int results_every = rawdyn.get<int>("RESULTSEVERY");
487495
// Time integration parameters.
488496
const double dt = rawdyn.get<double>("TIMESTEP");
489497
const int n_timesteps = rawdyn.get<int>("NUMSTEP");
@@ -526,15 +534,15 @@ namespace ReducedLung
526534
if (!sysmat.Filled())
527535
{
528536
err = sysmat.InsertMyValues(
529-
airway.local_equation_id, vals.size(), vals.data(), airway.local_dof_ids.data());
537+
airway.local_element_id, vals.size(), vals.data(), airway.local_dof_ids.data());
530538
}
531539
else
532540
{
533541
err = sysmat.ReplaceMyValues(
534-
airway.local_equation_id, vals.size(), vals.data(), airway.local_dof_ids.data());
542+
airway.local_element_id, vals.size(), vals.data(), airway.local_dof_ids.data());
535543
}
536544
FOUR_C_ASSERT(err == 0, "Internal error: Airway equation assembly did not work.");
537-
err = rhs.replace_local_value(airway.local_equation_id, 0, res);
545+
err = rhs.replace_local_value(airway.local_element_id, 0, res);
538546
FOUR_C_ASSERT(err == 0, "Internal error: Airway equation calculation did not work.");
539547
}
540548

@@ -554,16 +562,16 @@ namespace ReducedLung
554562
E * (V_tu - V0_tu) / V0_tu;
555563
if (!sysmat.Filled())
556564
{
557-
err = sysmat.InsertMyValues(terminal_unit.local_equation_id, vals.size(), vals.data(),
565+
err = sysmat.InsertMyValues(terminal_unit.local_element_id, vals.size(), vals.data(),
558566
terminal_unit.local_dof_ids.data());
559567
}
560568
else
561569
{
562-
err = sysmat.ReplaceMyValues(terminal_unit.local_equation_id, vals.size(), vals.data(),
570+
err = sysmat.ReplaceMyValues(terminal_unit.local_element_id, vals.size(), vals.data(),
563571
terminal_unit.local_dof_ids.data());
564572
}
565573
FOUR_C_ASSERT(err == 0, "Internal error: Terminal Unit equation assembly did not work.");
566-
err = rhs.replace_local_value(terminal_unit.local_equation_id, 0, res);
574+
err = rhs.replace_local_value(terminal_unit.local_element_id, 0, res);
567575
FOUR_C_ASSERT(err == 0, "Internal error: Terminal Unit equation calculation did not work.");
568576
}
569577

@@ -735,6 +743,15 @@ namespace ReducedLung
735743
// Backwards Euler: V_n+1 = V_n + q_n+1 * dt.
736744
volume[tu_id] += locally_relevant_dofs[q_id] * dt;
737745
}
746+
747+
// Runtime output
748+
if (n % results_every == 0)
749+
{
750+
visualization_writer->reset();
751+
collect_runtime_output_data(
752+
*visualization_writer, airways, terminal_units, dofs, actdis->element_row_map());
753+
visualization_writer->write_to_disk(dt * n, n);
754+
}
738755
}
739756
// Print time monitor
740757
Teuchos::TimeMonitor::summarize(std::cout, false, true, false);

0 commit comments

Comments
 (0)