39 std::vector<GlobalVector*>
const& x,
40 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
42 std::string
const& output_name,
45 DBUG(
" secondary variable {:s}", output_name);
50 if (nodal_values_mesh.size() !=
54 "Nodal property `{:s}' does not have the right number of "
55 "components. Expected: {:d}, actual: {:d}",
58 nodal_values_mesh.size());
61 std::unique_ptr<GlobalVector> result_cache;
62 auto const& nodal_values =
66 std::size_t
const global_vector_size =
67 nodal_values.getLocalSize() + nodal_values.getGhostSize();
69 std::size_t
const global_vector_size = nodal_values.size();
71 if (nodal_values_mesh.size() != global_vector_size)
74 "Secondary variable `{:s}' did not evaluate to the right number of "
75 "components. Expected: {:d}, actual: {:d}.",
76 var.
name, nodal_values_mesh.size(), global_vector_size);
80 nodal_values.copyValues(std::span{nodal_values_mesh});
85 std::vector<GlobalVector*>
const& x,
86 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
88 std::string
const& output_name,
96 DBUG(
" secondary variable {:s} residual", output_name);
97 auto const& property_name_res = output_name +
"_residual";
102 if (residuals_mesh.size() !=
106 "Cell property `{:s}' does not have the right number of "
107 "components. Expected: {:d}, actual: {:d}",
110 residuals_mesh.size());
113 std::unique_ptr<GlobalVector> result_cache;
114 auto const& residuals =
117 std::size_t
const global_vector_size =
118 residuals.getLocalSize() + residuals.getGhostSize();
120 std::size_t
const global_vector_size = residuals.size();
122 if (residuals_mesh.size() != global_vector_size)
125 "The residual of secondary variable `{:s}' did not evaluate to the "
126 "right number of components. Expected: {:d}, actual: {:d}.",
127 var.
name, residuals_mesh.size(), global_vector_size);
131 residuals.copyValues(std::span{residuals_mesh});
136 std::vector<double> x_copy;
148 if (&bulk_mesh_dof_table != &dof_table)
150 auto const bulk_id_string =
152 if (!mesh.getProperties().existsPropertyVector<std::size_t>(
156 "The required bulk node ids map does not exist in "
157 "the boundary mesh '{:s}' or has the wrong data "
158 "type (should be equivalent to C++ data type "
159 "std::size_t which is an unsigned integer of size "
160 "{:d} or UInt64 in vtk terminology).",
161 mesh.getName(),
sizeof(std::size_t));
163 return mesh.getProperties().getPropertyVector<std::size_t>(
172 std::size_t
const mesh_id, std::size_t
const node_id,
173 [[maybe_unused]]
bool const is_ghost_node,
int const global_component_id,
180 if (is_ghost_node && &bulk_mesh_dof_table != &dof_table)
182 auto const bulk_node_id = (*bulk_node_id_map)[node_id];
183 std::size_t
const bulk_mesh_id = 0;
189 return bulk_mesh_dof_table.getLocalIndex(
201 [[maybe_unused]] std::size_t
const node_id)
243 std::vector<std::reference_wrapper<ProcessLib::ProcessVariable>>
const&
245 std::set<std::string>
const& output_variables,
255 "The d.o.f. table for the passed mesh must have the same number of "
256 "variables and global components as the d.o.f. table for the full "
257 "simulation domain. But the values differ: {} != {} (variables) or "
258 "{} != {} (global components).",
267 if (number_of_dof_variables !=
static_cast<int>(process_variables.size()))
270 "The number of variables in the d.o.f. table differs from the "
271 "number of primary variables of the process {} != {}.",
272 number_of_dof_variables, process_variables.size());
276 std::set<std::string> names_of_already_output_variables;
278 int global_component_offset_next = 0;
281 mesh, dof_table, bulk_mesh_dof_table);
283 for (
int variable_id = 0; variable_id < number_of_dof_variables;
286 auto const& pv = process_variables[variable_id].get();
287 auto const n_components = pv.getNumberOfGlobalComponents();
291 int global_component_offset = global_component_offset_next;
292 global_component_offset_next += n_components;
294 if (!output_variables.empty() &&
295 !output_variables.contains(pv.getName()))
300 names_of_already_output_variables.insert(pv.getName());
302 DBUG(
" process variable {:s}", pv.getName());
308 int const dummy_component_id = 0;
309 auto const& mesh_subset =
311 auto const mesh_id = mesh_subset.
getMeshID();
313 for (
auto const* node : mesh_subset.getNodes())
315 auto const node_id = node->getID();
316 auto const is_ghost_node =
isGhostNode(mesh, node_id);
318 for (
int component_id = 0; component_id < n_components;
321 auto const global_component_id =
322 global_component_offset + component_id;
325 mesh_id, node_id, is_ghost_node, global_component_id, x,
326 dof_table, bulk_mesh_dof_table, bulk_node_id_map);
329 auto const out_index = node_id * n_components + component_id;
335 output_data[out_index] = 0;
339 output_data[out_index] = x_copy[in_index];
344 return names_of_already_output_variables;
349 std::set<std::string>& names_of_already_output_variables,
350 NumLib::Time const& t, std::vector<GlobalVector*>
const& xs,
352 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
353 bool const output_residuals)
355 for (
auto const& external_variable_name : secondary_variables)
357 auto const& name = external_variable_name.first;
358 if (!names_of_already_output_variables.insert(name).second)
365 secondary_variables.
get(name), name, mesh);
367 if (output_residuals)
370 t, xs, dof_tables, secondary_variables.
get(name), name, mesh);
378 std::vector<GlobalVector*>
const& xs,
379 int const process_id,
381 bool const output_secondary_variables,
384 DBUG(
"Process output data.");
386 auto const& pod = process_output_data;
388 auto const& secondary_variables = pod.getSecondaryVariables();
389 auto const*
const integration_point_writers =
390 pod.getIntegrationPointWriters();
391 auto const& bulk_mesh_dof_table = pod.getBulkMeshDofTable(process_id);
392 auto const& output_mesh_dof_table = pod.getOutputMeshDofTable(process_id);
393 auto& output_mesh = pod.getOutputMesh();
400 output_mesh, *xs[process_id], process_variables, output_variables,
401 output_mesh_dof_table, bulk_mesh_dof_table);
403 if (output_secondary_variables)
405 auto const& output_mesh_dof_tables =
406 pod.getOutputMeshDofTablesOfAllProcesses();
409 names_of_already_output_variables, t, xs,
410 output_mesh, output_mesh_dof_tables,
414 if (integration_point_writers)
416 addIntegrationPointDataToMesh(output_mesh, *integration_point_writers);
static void addSecondaryVariableNodes(NumLib::Time const &t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, ProcessLib::SecondaryVariable const &var, std::string const &output_name, MeshLib::Mesh &mesh)
static std::vector< double > copySolutionVector(GlobalVector const &x)
static GlobalIndexType getIndexForComponentInSolutionVector(std::size_t const mesh_id, std::size_t const node_id, bool const is_ghost_node, int const global_component_id, GlobalVector const &x, NumLib::LocalToGlobalIndexMap const &dof_table, NumLib::LocalToGlobalIndexMap const &bulk_mesh_dof_table, MeshLib::PropertyVector< std::size_t > const *const bulk_node_id_map)
MeshLib::PropertyVector< std::size_t > const * getBulkNodeIdMapForPetscIfNecessary(MeshLib::Mesh const &mesh, NumLib::LocalToGlobalIndexMap const &dof_table, NumLib::LocalToGlobalIndexMap const &bulk_mesh_dof_table)
static std::set< std::string > addPrimaryVariablesToMesh(MeshLib::Mesh &mesh, GlobalVector const &x, std::vector< std::reference_wrapper< ProcessLib::ProcessVariable > > const &process_variables, std::set< std::string > const &output_variables, NumLib::LocalToGlobalIndexMap const &dof_table, NumLib::LocalToGlobalIndexMap const &bulk_mesh_dof_table)
static void addSecondaryVariablesToMesh(ProcessLib::SecondaryVariableCollection const &secondary_variables, std::set< std::string > &names_of_already_output_variables, NumLib::Time const &t, std::vector< GlobalVector * > const &xs, MeshLib::Mesh &mesh, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, bool const output_residuals)
static void addSecondaryVariableResiduals(NumLib::Time const &t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, ProcessLib::SecondaryVariable const &var, std::string const &output_name, MeshLib::Mesh &mesh)
static bool isGhostNode(MeshLib::Mesh const &mesh, std::size_t const node_id)
static void addOgsVersion(MeshLib::Mesh &mesh)
MathLib::EigenVector GlobalVector
GlobalMatrix::IndexType GlobalIndexType
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition of mesh class for partitioned mesh (by node) for parallel computing within the framework o...
IndexType getRangeEnd() const
return an end index of the active data range
void copyValues(std::vector< double > &u) const
static constexpr IndexType getRangeBegin()
return a start index of the active data range
std::size_t getMeshID() const
return this mesh ID
const std::string getName() const
Get name of the mesh.
std::size_t getNumberOfNodes() const
Get the number of nodes.
std::size_t getNumberOfElements() const
Get the number of elements.
int getNumberOfVariables() const
MeshLib::MeshSubset const & getMeshSubset(int const variable_id, int const component_id) const
GlobalIndexType getLocalIndex(MeshLib::Location const &l, std::size_t const comp_id, std::size_t const range_begin, std::size_t const range_end) const
int getNumberOfGlobalComponents() const
static constexpr NUMLIB_EXPORT GlobalIndexType const nop
Holds all data of a process that are needed for output.
std::vector< std::reference_wrapper< ProcessVariable > > const & getProcessVariables(int const process_id) const
Handles configuration of several secondary variables from the project file.
SecondaryVariable const & get(std::string const &external_name) const
Returns the secondary variable with the given external name.
const std::string OGS_VERSION
GITINFOLIB_EXPORT const std::string ogs_version
PropertyVector< T > * getOrCreateMeshProperty(Mesh &mesh, std::string const &property_name, MeshItemType const item_type, int const number_of_components)
constexpr std::string_view getBulkIDString(MeshItemType mesh_item_type)
void addProcessDataToMesh(NumLib::Time const &t, std::vector< GlobalVector * > const &xs, int const process_id, ProcessOutputData const &process_output_data, bool const output_secondary_variables, OutputDataSpecification const &process_output)
Holds information about which variables to write to output files.
bool output_residuals
Tells if also to output extrapolation residuals.
std::set< std::string > output_variables
All variables that shall be output.
Function const eval_field
Computes the value of the field at every node of the underlying mesh.
const unsigned num_components
Number of components of the variable.
Function const eval_residuals
Stores information about a specific secondary variable.
SecondaryVariableFunctions fcts
Functions used for computing the secondary variable.
std::string const name
Name of the variable; used, e.g., for output.