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)
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...
Global vector based on Eigen vector.
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.