38 std::vector<GlobalVector*>
const& x,
39 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
41 std::string
const& output_name,
44 DBUG(
" secondary variable {:s}", output_name);
49 if (nodal_values_mesh.size() !=
53 "Nodal property `{:s}' does not have the right number of "
54 "components. Expected: {:d}, actual: {:d}",
57 nodal_values_mesh.size());
60 std::unique_ptr<GlobalVector> result_cache;
61 auto const& nodal_values =
65 std::size_t
const global_vector_size =
66 nodal_values.getLocalSize() + nodal_values.getGhostSize();
68 std::size_t
const global_vector_size = nodal_values.size();
70 if (nodal_values_mesh.size() != global_vector_size)
73 "Secondary variable `{:s}' did not evaluate to the right number of "
74 "components. Expected: {:d}, actual: {:d}.",
75 var.
name, nodal_values_mesh.size(), global_vector_size);
79 nodal_values.copyValues(nodal_values_mesh);
84 std::vector<GlobalVector*>
const& x,
85 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_table,
87 std::string
const& output_name,
95 DBUG(
" secondary variable {:s} residual", output_name);
96 auto const& property_name_res = output_name +
"_residual";
101 if (residuals_mesh.size() !=
105 "Cell property `{:s}' does not have the right number of "
106 "components. Expected: {:d}, actual: {:d}",
109 residuals_mesh.size());
112 std::unique_ptr<GlobalVector> result_cache;
113 auto const& residuals =
116 std::size_t
const global_vector_size =
117 residuals.getLocalSize() + residuals.getGhostSize();
119 std::size_t
const global_vector_size = residuals.size();
121 if (residuals_mesh.size() != global_vector_size)
124 "The residual of secondary variable `{:s}' did not evaluate to the "
125 "right number of components. Expected: {:d}, actual: {:d}.",
126 var.
name, residuals_mesh.size(), global_vector_size);
130 residuals.copyValues(residuals_mesh);
135 std::vector<double> x_copy;
147 if (&bulk_mesh_dof_table != &dof_table)
149 auto const bulk_id_string =
151 if (!mesh.getProperties().existsPropertyVector<std::size_t>(
155 "The required bulk node ids map does not exist in "
156 "the boundary mesh '{:s}' or has the wrong data "
157 "type (should be equivalent to C++ data type "
158 "std::size_t which is an unsigned integer of size "
159 "{:d} or UInt64 in vtk terminology).",
160 mesh.getName(),
sizeof(std::size_t));
162 return mesh.getProperties().getPropertyVector<std::size_t>(
171 std::size_t
const mesh_id, std::size_t
const node_id,
172 [[maybe_unused]]
bool const is_ghost_node,
int const global_component_id,
179 if (is_ghost_node && &bulk_mesh_dof_table != &dof_table)
181 auto const bulk_node_id = (*bulk_node_id_map)[node_id];
182 std::size_t
const bulk_mesh_id = 0;
188 return bulk_mesh_dof_table.getLocalIndex(
200 [[maybe_unused]] std::size_t
const node_id)
242 std::vector<std::reference_wrapper<ProcessLib::ProcessVariable>>
const&
244 std::set<std::string>
const& output_variables,
254 "The d.o.f. table for the passed mesh must have the same number of "
255 "variables and global components as the d.o.f. table for the full "
256 "simulation domain. But the values differ: {} != {} (variables) or "
257 "{} != {} (global components).",
266 if (number_of_dof_variables !=
static_cast<int>(process_variables.size()))
269 "The number of variables in the d.o.f. table differs from the "
270 "number of primary variables of the process {} != {}.",
271 number_of_dof_variables, process_variables.size());
275 std::set<std::string> names_of_already_output_variables;
277 int global_component_offset_next = 0;
280 mesh, dof_table, bulk_mesh_dof_table);
282 for (
int variable_id = 0; variable_id < number_of_dof_variables;
285 auto const& pv = process_variables[variable_id].get();
286 auto const n_components = pv.getNumberOfGlobalComponents();
290 int global_component_offset = global_component_offset_next;
291 global_component_offset_next += n_components;
293 if (!output_variables.empty() &&
294 !output_variables.contains(pv.getName()))
299 names_of_already_output_variables.insert(pv.getName());
301 DBUG(
" process variable {:s}", pv.getName());
307 int const dummy_component_id = 0;
308 auto const& mesh_subset =
310 auto const mesh_id = mesh_subset.
getMeshID();
312 for (
auto const* node : mesh_subset.getNodes())
314 auto const node_id = node->getID();
315 auto const is_ghost_node =
isGhostNode(mesh, node_id);
317 for (
int component_id = 0; component_id < n_components;
320 auto const global_component_id =
321 global_component_offset + component_id;
324 mesh_id, node_id, is_ghost_node, global_component_id, x,
325 dof_table, bulk_mesh_dof_table, bulk_node_id_map);
328 auto const out_index = node_id * n_components + component_id;
334 output_data[out_index] = 0;
338 output_data[out_index] = x_copy[in_index];
343 return names_of_already_output_variables;
348 std::set<std::string>& names_of_already_output_variables,
349 NumLib::Time const& t, std::vector<GlobalVector*>
const& xs,
351 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
352 bool const output_residuals)
354 for (
auto const& external_variable_name : secondary_variables)
356 auto const& name = external_variable_name.first;
357 if (!names_of_already_output_variables.insert(name).second)
364 secondary_variables.
get(name), name, mesh);
366 if (output_residuals)
369 t, xs, dof_tables, secondary_variables.
get(name), name, mesh);
377 std::vector<GlobalVector*>
const& xs,
378 int const process_id,
380 bool const output_secondary_variables,
383 DBUG(
"Process output data.");
385 auto const& pod = process_output_data;
387 auto const& secondary_variables = pod.getSecondaryVariables();
388 auto const*
const integration_point_writers =
389 pod.getIntegrationPointWriters();
390 auto const& bulk_mesh_dof_table = pod.getBulkMeshDofTable(process_id);
391 auto const& output_mesh_dof_table = pod.getOutputMeshDofTable(process_id);
392 auto& output_mesh = pod.getOutputMesh();
399 output_mesh, *xs[process_id], process_variables, output_variables,
400 output_mesh_dof_table, bulk_mesh_dof_table);
402 if (output_secondary_variables)
404 auto const& output_mesh_dof_tables =
405 pod.getOutputMeshDofTablesOfAllProcesses();
408 names_of_already_output_variables, t, xs,
409 output_mesh, output_mesh_dof_tables,
413 if (integration_point_writers)
415 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.