OGS
ProcessLib::Output Class Reference

Detailed Description

Manages writing the solution of processes to disk.

This class decides at which timesteps output is written and initiates the writing process.

Definition at line 31 of file Output.h.

#include <Output.h>

Collaboration diagram for ProcessLib::Output:
[legend]

Public Member Functions

 Output (std::unique_ptr< OutputFormat > &&output_format, bool const output_nonlinear_iteration_results, OutputDataSpecification &&output_data_specification, std::vector< std::string > &&mesh_names_for_output, std::vector< std::unique_ptr< MeshLib::Mesh > > const &meshes)
 
 Output (Output const &other)=delete
 
 Output (Output &&other)=default
 
Outputoperator= (Output const &src)=delete
 
Outputoperator= (Output &&src)=default
 
 ~Output ()=default
 
void addProcess (ProcessLib::Process const &process)
 TODO doc. Opens a PVD file for each process.
 
void doNotProjectFromBulkMeshToSubmeshes (std::string const &property_name, MeshLib::MeshItemType const mesh_item_type)
 
void doOutput (Process const &process, const int process_id, int const timestep, const double t, int const iteration, std::vector< GlobalVector * > const &xs) const
 
void doOutputLastTimestep (Process const &process, const int process_id, int const timestep, const double t, int const iteration, std::vector< GlobalVector * > const &xs) const
 
void doOutputAlways (Process const &process, const int process_id, int const timestep, const double t, int const iteration, std::vector< GlobalVector * > const &xs) const
 
void doOutputNonlinearIteration (Process const &process, const int process_id, int const timestep, const double t, const int iteration, std::vector< GlobalVector * > const &xs) const
 
bool isOutputStep (int const timestep, double const t) const
 Tells if output will be written at the specified timestep/time.
 
std::vector< double > const & getFixedOutputTimes () const
 
std::vector< std::string > getFileNamesForOutput () const
 

Private Member Functions

bool isOutputProcess (int const process_id, Process const &process) const
 
void outputMeshes (int const timestep, const double t, int const iteration, std::vector< std::reference_wrapper< const MeshLib::Mesh > > const &meshes) const
 
MeshLib::Mesh const & prepareSubmesh (std::string const &submesh_output_name, Process const &process, const int process_id, double const t, std::vector< GlobalVector * > const &xs) const
 

Private Attributes

std::unique_ptr< OutputFormat_output_format
 
bool _output_nonlinear_iteration_results
 
OutputDataSpecification _output_data_specification
 
std::vector< std::reference_wrapper< Process const > > _output_processes
 
std::vector< std::string > _mesh_names_for_output
 
std::reference_wrapper< std::vector< std::unique_ptr< MeshLib::Mesh > > const > _meshes
 
std::set< std::pair< std::string, MeshLib::MeshItemType > > _do_not_project_from_bulk_mesh_to_submeshes
 

Friends

std::ostream & operator<< (std::ostream &os, Output const &output)
 

Constructor & Destructor Documentation

◆ Output() [1/3]

ProcessLib::Output::Output ( std::unique_ptr< OutputFormat > && output_format,
bool const output_nonlinear_iteration_results,
OutputDataSpecification && output_data_specification,
std::vector< std::string > && mesh_names_for_output,
std::vector< std::unique_ptr< MeshLib::Mesh > > const & meshes )

Definition at line 146 of file Output.cpp.

151 : _output_format(std::move(output_format)),
152 _output_nonlinear_iteration_results(output_nonlinear_iteration_results),
153 _output_data_specification(std::move(output_data_specification)),
154 _mesh_names_for_output(std::move(mesh_names_for_output)),
155 _meshes(meshes)
156{
157}
std::reference_wrapper< std::vector< std::unique_ptr< MeshLib::Mesh > > const > _meshes
Definition Output.h:126
std::vector< std::string > _mesh_names_for_output
Definition Output.h:117
OutputDataSpecification _output_data_specification
Definition Output.h:115
std::unique_ptr< OutputFormat > _output_format
Definition Output.h:111
bool _output_nonlinear_iteration_results
Definition Output.h:113

◆ Output() [2/3]

ProcessLib::Output::Output ( Output const & other)
delete

◆ Output() [3/3]

ProcessLib::Output::Output ( Output && other)
default

◆ ~Output()

ProcessLib::Output::~Output ( )
default

Member Function Documentation

◆ addProcess()

void ProcessLib::Output::addProcess ( ProcessLib::Process const & process)

TODO doc. Opens a PVD file for each process.

Definition at line 159 of file Output.cpp.

160{
161 _output_processes.push_back(process);
162 if (_mesh_names_for_output.empty())
163 {
164 _mesh_names_for_output.push_back(process.getMesh().getName());
165 }
166}
std::vector< std::reference_wrapper< Process const > > _output_processes
Definition Output.h:116

References _mesh_names_for_output, _output_processes, ProcessLib::Process::getMesh(), and MeshLib::Mesh::getName().

◆ doNotProjectFromBulkMeshToSubmeshes()

void ProcessLib::Output::doNotProjectFromBulkMeshToSubmeshes ( std::string const & property_name,
MeshLib::MeshItemType const mesh_item_type )

Declare that the specified mesh property should not be projected from the bulk mesh to submeshes during submesh output.

Definition at line 168 of file Output.cpp.

171{
173 mesh_item_type);
174}
std::set< std::pair< std::string, MeshLib::MeshItemType > > _do_not_project_from_bulk_mesh_to_submeshes
Definition Output.h:129

References _do_not_project_from_bulk_mesh_to_submeshes.

◆ doOutput()

void ProcessLib::Output::doOutput ( Process const & process,
const int process_id,
int const timestep,
const double t,
int const iteration,
std::vector< GlobalVector * > const & xs ) const

Writes output for the given process if it should be written in the given timestep.

Definition at line 335 of file Output.cpp.

341{
342 if (isOutputStep(timestep, t))
343 {
344 doOutputAlways(process, process_id, timestep, t, iteration, xs);
345 }
346#ifdef OGS_USE_INSITU
347 // Note: last time step may be output twice: here and in
348 // doOutputLastTimestep() which throws a warning.
349 InSituLib::CoProcess(process.getMesh(), t, timestep, false,
350 _output_format->directory);
351#endif
352}
bool isOutputStep(int const timestep, double const t) const
Tells if output will be written at the specified timestep/time.
Definition Output.cpp:417
void doOutputAlways(Process const &process, const int process_id, int const timestep, const double t, int const iteration, std::vector< GlobalVector * > const &xs) const
Definition Output.cpp:288
void CoProcess(MeshLib::Mesh const &mesh, double const time, unsigned int const timeStep, bool const lastTimeStep, std::string output_directory)
Definition Adaptor.cpp:70

References _output_format, InSituLib::CoProcess(), doOutputAlways(), ProcessLib::Process::getMesh(), and isOutputStep().

Referenced by ProcessLib::TimeLoop::calculateNextTimeStep(), and ProcessLib::TimeLoop::initialize().

◆ doOutputAlways()

void ProcessLib::Output::doOutputAlways ( Process const & process,
const int process_id,
int const timestep,
const double t,
int const iteration,
std::vector< GlobalVector * > const & xs ) const

Writes output for the given process. This method will always write. It is intended to write output in error handling routines.

Definition at line 288 of file Output.cpp.

294{
295 BaseLib::RunTime time_output;
296 time_output.start();
297
298 bool const output_secondary_variables = true;
299 auto const process_output_data =
300 createProcessOutputData(process, xs.size(), process.getMesh());
301
302 // Need to add variables of process to mesh even if no output takes place.
303 addProcessDataToMesh(t, xs, process_id, process_output_data,
304 output_secondary_variables,
306
307 if (!isOutputProcess(process_id, process))
308 {
309 return;
310 }
311
312 std::vector<std::reference_wrapper<const MeshLib::Mesh>> output_meshes;
313 for (auto const& mesh_output_name : _mesh_names_for_output)
314 {
315 if (process.getMesh().getName() == mesh_output_name)
316 {
317 // process related output
318 output_meshes.emplace_back(process.getMesh());
319 }
320 else
321 {
322 // mesh related output
323 auto const& submesh =
324 prepareSubmesh(mesh_output_name, process, process_id, t, xs);
325 output_meshes.emplace_back(submesh);
326 }
327 }
328
329 outputMeshes(timestep, t, iteration, std::move(output_meshes));
330
331 INFO("[time] Output of timestep {:d} took {:g} s.", timestep,
332 time_output.elapsed());
333}
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:35
Count the running time.
Definition RunTime.h:29
double elapsed() const
Get the elapsed time in seconds.
Definition RunTime.h:42
void start()
Start the timer.
Definition RunTime.h:32
MeshLib::Mesh const & prepareSubmesh(std::string const &submesh_output_name, Process const &process, const int process_id, double const t, std::vector< GlobalVector * > const &xs) const
Definition Output.cpp:214
bool isOutputProcess(int const process_id, Process const &process) const
Definition Output.cpp:134
void outputMeshes(int const timestep, const double t, int const iteration, std::vector< std::reference_wrapper< const MeshLib::Mesh > > const &meshes) const
Definition Output.cpp:176
void addProcessDataToMesh(const double t, std::vector< GlobalVector * > const &xs, int const process_id, ProcessOutputData const &process_output_data, bool const output_secondary_variables, OutputDataSpecification const &process_output)
ProcessOutputData createProcessOutputData(Process const &process, std::size_t const n_processes, MeshLib::Mesh &output_mesh)
Extracts data necessary for output from the given process.

References _mesh_names_for_output, _output_data_specification, ProcessLib::addProcessDataToMesh(), ProcessLib::createProcessOutputData(), BaseLib::RunTime::elapsed(), ProcessLib::Process::getMesh(), MeshLib::Mesh::getName(), INFO(), isOutputProcess(), outputMeshes(), prepareSubmesh(), and BaseLib::RunTime::start().

Referenced by doOutput(), and doOutputLastTimestep().

◆ doOutputLastTimestep()

void ProcessLib::Output::doOutputLastTimestep ( Process const & process,
const int process_id,
int const timestep,
const double t,
int const iteration,
std::vector< GlobalVector * > const & xs ) const

Writes output for the given process if it has not been written yet. This method is intended for doing output after the last timestep in order to make sure that its results are written.

Definition at line 354 of file Output.cpp.

360{
361 if (!isOutputStep(timestep, t))
362 {
363 doOutputAlways(process, process_id, timestep, t, iteration, xs);
364 }
365#ifdef OGS_USE_INSITU
366 InSituLib::CoProcess(process.getMesh(), t, timestep, true,
367 _output_format->directory);
368#endif
369}

References _output_format, InSituLib::CoProcess(), doOutputAlways(), ProcessLib::Process::getMesh(), and isOutputStep().

Referenced by ProcessLib::TimeLoop::outputLastTimeStep().

◆ doOutputNonlinearIteration()

void ProcessLib::Output::doOutputNonlinearIteration ( Process const & process,
const int process_id,
int const timestep,
const double t,
const int iteration,
std::vector< GlobalVector * > const & xs ) const

Writes output for the given process. To be used for debug output after an iteration of the nonlinear solver.

Definition at line 371 of file Output.cpp.

375{
377 {
378 return;
379 }
380
381 BaseLib::RunTime time_output;
382 time_output.start();
383
384 bool const output_secondary_variable = true;
385 auto const process_output_data =
386 createProcessOutputData(process, xs.size(), process.getMesh());
387
388 addProcessDataToMesh(t, xs, process_id, process_output_data,
389 output_secondary_variable, _output_data_specification);
390
391 if (!isOutputProcess(process_id, process))
392 {
393 return;
394 }
395
396 std::string const output_file_name = _output_format->constructFilename(
397 process.getMesh().getName(), timestep, t, iteration);
398
399 std::string const output_file_path =
400 BaseLib::joinPaths(_output_format->directory, output_file_name);
401
402 DBUG("output iteration results to {:s}", output_file_path);
403
404 if (dynamic_cast<OutputVTKFormat*>(_output_format.get()))
405 {
407 output_file_path, process.getMesh(), _output_format->compression,
408 dynamic_cast<OutputVTKFormat*>(_output_format.get())->data_mode);
409 }
410 else
411 {
412 DBUG("non-linear iterations can only written in Vtk/VTU format.");
413 }
414 INFO("[time] Output took {:g} s.", time_output.elapsed());
415}
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:30
std::string joinPaths(std::string const &pathA, std::string const &pathB)
void outputMeshVtk(std::string const &file_name, MeshLib::Mesh const &mesh, bool const compress_output, int const data_mode)

References _output_data_specification, _output_format, _output_nonlinear_iteration_results, ProcessLib::addProcessDataToMesh(), ProcessLib::createProcessOutputData(), ProcessLib::OutputVTKFormat::data_mode, DBUG(), BaseLib::RunTime::elapsed(), ProcessLib::Process::getMesh(), MeshLib::Mesh::getName(), INFO(), isOutputProcess(), BaseLib::joinPaths(), ProcessLib::outputMeshVtk(), and BaseLib::RunTime::start().

◆ getFileNamesForOutput()

std::vector< std::string > ProcessLib::Output::getFileNamesForOutput ( ) const

Definition at line 422 of file Output.cpp.

423{
424 auto construct_filename = ranges::views::transform(
425 [&](auto const& output_name)
426 { return _output_format->constructFilename(output_name, 0, 0, 0); });
427
428 return _mesh_names_for_output | construct_filename |
429 ranges::to<std::vector>;
430}

References _mesh_names_for_output, and _output_format.

◆ getFixedOutputTimes()

std::vector< double > const & ProcessLib::Output::getFixedOutputTimes ( ) const
inline

Definition at line 86 of file Output.h.

87 {
89 }
std::vector< double > fixed_output_times
Given times that steps have to reach.

References _output_data_specification, and ProcessLib::OutputDataSpecification::fixed_output_times.

◆ isOutputProcess()

bool ProcessLib::Output::isOutputProcess ( int const process_id,
Process const & process ) const
private

Determines if output should be written for the given process.

With staggered coupling not every process writes output.

Definition at line 134 of file Output.cpp.

135{
136 auto const is_last_process =
137 process_id == static_cast<int>(_output_processes.size()) - 1;
138
139 return process.isMonolithicSchemeUsed()
140 // For the staggered scheme for the coupling, only the last
141 // process, which gives the latest solution within a coupling
142 // loop, is allowed to make output.
143 || is_last_process;
144}

References _output_processes, and ProcessLib::Process::isMonolithicSchemeUsed().

Referenced by doOutputAlways(), and doOutputNonlinearIteration().

◆ isOutputStep()

bool ProcessLib::Output::isOutputStep ( int const timestep,
double const t ) const

Tells if output will be written at the specified timestep/time.

Definition at line 417 of file Output.cpp.

418{
419 return _output_data_specification.isOutputStep(timestep, t);
420}
bool isOutputStep(int timestep, double const time) const

References _output_data_specification, and ProcessLib::OutputDataSpecification::isOutputStep().

Referenced by doOutput(), and doOutputLastTimestep().

◆ operator=() [1/2]

Output & ProcessLib::Output::operator= ( Output && src)
default

◆ operator=() [2/2]

Output & ProcessLib::Output::operator= ( Output const & src)
delete

◆ outputMeshes()

void ProcessLib::Output::outputMeshes ( int const timestep,
const double t,
int const iteration,
std::vector< std::reference_wrapper< const MeshLib::Mesh > > const & meshes ) const
private

Definition at line 176 of file Output.cpp.

180{
182 {
183 // special case: no output properties specified => output all properties
184 for (auto const& mesh : meshes)
185 {
186 for (auto [name, property] : mesh.get().getProperties())
187 {
188 property->is_for_output = true;
189 }
190 }
191 }
192 else
193 {
194 for (auto const& mesh : meshes)
195 {
196 for (auto [name, property] : mesh.get().getProperties())
197 {
198 // special case: always output OGS_VERSION
199 if (name == "OGS_VERSION")
200 {
201 property->is_for_output = true;
202 continue;
203 }
204
205 property->is_for_output =
207 }
208 }
209 }
210 _output_format->outputMeshes(timestep, t, iteration, meshes,
212}
auto & get(Tuples &... ts)
Definition Get.h:67
std::set< std::string > output_variables
All variables that shall be output.

References _output_data_specification, _output_format, and ProcessLib::OutputDataSpecification::output_variables.

Referenced by doOutputAlways().

◆ prepareSubmesh()

MeshLib::Mesh const & ProcessLib::Output::prepareSubmesh ( std::string const & submesh_output_name,
Process const & process,
const int process_id,
double const t,
std::vector< GlobalVector * > const & xs ) const
private

Definition at line 214 of file Output.cpp.

218{
219 auto& submesh = MeshLib::findMeshByName(_meshes.get(), submesh_output_name);
220
221 DBUG("Found {:d} nodes for output at mesh '{:s}'.",
222 submesh.getNumberOfNodes(), submesh.getName());
223
224 bool const output_secondary_variables = false;
225
226 // TODO Under the assumption that xs.size() and submesh do not change during
227 // the simulation, process output data should not be recreated every time,
228 // but should rather be computed only once and stored for later reuse.
229 auto const process_output_data =
230 createProcessOutputData(process, xs.size(), submesh);
231
232 addProcessDataToMesh(t, xs, process_id, process_output_data,
233 output_secondary_variables,
235
236 auto const& bulk_mesh = process.getMesh();
237 auto const& property_names =
238 bulk_mesh.getProperties().getPropertyVectorNames();
239
240 // TODO Once all processes have been refactored to use the new residuum
241 // assembly logic, the functionality of this lambda should be refactored.
242 // Currently (Jan '23) there is a difference between the logic using this
243 // lambda and doNotProjectFromBulkMeshToSubmeshes(): The latter is
244 // considered regardless of submesh dimension.
245 auto is_residuum_field = [](std::string const& name) -> bool
246 {
247 using namespace std::literals::string_view_literals;
248 static constexpr std::string_view endings[] = {
249 "FlowRate"sv, "heat_flux"sv, "MaterialForces"sv, "NodalForces"sv,
250 "NodalForcesJump"sv};
251 auto ends_with = [&](std::string_view const& ending)
252 { return name.ends_with(ending); };
253 return std::find_if(std::begin(endings), std::end(endings),
254 ends_with) != std::end(endings);
255 };
256
257 for (auto const& name : property_names)
258 {
260 {name, MeshLib::MeshItemType::Node}))
261 {
262 // the projection is disabled regardless of mesh and submesh
263 // dimension
264 continue;
265 }
266
267 if (bulk_mesh.getDimension() == submesh.getDimension())
268 {
269 // omit the 'simple' transfer of the properties in the if condition
270 // on submeshes with equal dimension to the bulk mesh
271 // for those data extra assembly is required
272 if (is_residuum_field(name))
273 {
274 continue;
275 }
276 addBulkMeshPropertyToSubMesh(bulk_mesh, submesh, name);
277 }
278 else
279 {
280 // For residuum based properties it is assumed that the lower
281 // dimensional mesh is a boundary mesh!
282 addBulkMeshPropertyToSubMesh(bulk_mesh, submesh, name);
283 }
284 }
285 return submesh;
286}
Mesh & findMeshByName(std::vector< std::unique_ptr< Mesh > > const &meshes, std::string_view const name)
Definition Mesh.cpp:363
void addBulkMeshPropertyToSubMesh(MeshLib::Mesh const &bulk_mesh, MeshLib::Mesh &sub_mesh, std::string const &property_name)
Definition Output.cpp:31

References _do_not_project_from_bulk_mesh_to_submeshes, _meshes, _output_data_specification, ProcessLib::addBulkMeshPropertyToSubMesh(), ProcessLib::addProcessDataToMesh(), ProcessLib::createProcessOutputData(), DBUG(), MeshLib::findMeshByName(), ProcessLib::Process::getMesh(), MeshLib::Mesh::getProperties(), and MeshLib::Properties::getPropertyVectorNames().

Referenced by doOutputAlways().

Friends And Related Symbol Documentation

◆ operator<<

std::ostream & operator<< ( std::ostream & os,
Output const & output )
friend

Definition at line 446 of file Output.cpp.

447{
448 os << "Output::_output_data_specification:\t"
449 << output._output_data_specification;
450 os << "Output::_output_format:\t" << *(output._output_format);
451 return os;
452}

Member Data Documentation

◆ _do_not_project_from_bulk_mesh_to_submeshes

std::set<std::pair<std::string, MeshLib::MeshItemType> > ProcessLib::Output::_do_not_project_from_bulk_mesh_to_submeshes
private

Definition at line 129 of file Output.h.

Referenced by doNotProjectFromBulkMeshToSubmeshes(), and prepareSubmesh().

◆ _mesh_names_for_output

std::vector<std::string> ProcessLib::Output::_mesh_names_for_output
private

Definition at line 117 of file Output.h.

Referenced by addProcess(), doOutputAlways(), and getFileNamesForOutput().

◆ _meshes

std::reference_wrapper<std::vector<std::unique_ptr<MeshLib::Mesh> > const> ProcessLib::Output::_meshes
private

Definition at line 126 of file Output.h.

Referenced by prepareSubmesh().

◆ _output_data_specification

OutputDataSpecification ProcessLib::Output::_output_data_specification
private

◆ _output_format

std::unique_ptr<OutputFormat> ProcessLib::Output::_output_format
private

◆ _output_nonlinear_iteration_results

bool ProcessLib::Output::_output_nonlinear_iteration_results
private

Definition at line 113 of file Output.h.

Referenced by doOutputNonlinearIteration().

◆ _output_processes

std::vector<std::reference_wrapper<Process const> > ProcessLib::Output::_output_processes
private

Definition at line 116 of file Output.h.

Referenced by addProcess(), and isOutputProcess().


The documentation for this class was generated from the following files: