libMesh
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Protected Types | Protected Member Functions | Protected Attributes | Static Protected Attributes | Private Member Functions | Friends | List of all members
libMesh::EquationSystems Class Reference

This is the EquationSystems class. More...

#include <equation_systems.h>

Inheritance diagram for libMesh::EquationSystems:
[legend]

Public Types

enum  ReadFlags {
  READ_HEADER = 1 , READ_DATA = 2 , READ_ADDITIONAL_DATA = 4 , READ_LEGACY_FORMAT = 8 ,
  TRY_READ_IFEMS = 16 , READ_BASIC_ONLY = 32
}
 Define enumeration to set properties in EquationSystems::read() More...
 
enum  WriteFlags { WRITE_DATA = 1 , WRITE_ADDITIONAL_DATA = 2 , WRITE_PARALLEL_FILES = 4 , WRITE_SERIAL_FILES = 8 }
 Define enumeration to set properties in EquationSystems::write() More...
 

Public Member Functions

 EquationSystems (MeshBase &mesh)
 Constructor.
 
virtual ~EquationSystems ()
 Destructor.
 
virtual void clear ()
 Restores the data structure to a pristine state.
 
virtual void init ()
 Initialize all the systems.
 
virtual void reinit ()
 Handle any mesh changes and reinitialize all the systems on the updated mesh.
 
virtual void reinit_mesh ()
 Handle the association of a completely new mesh with the EquationSystem and all the Systems assigned to it.
 
virtual void enable_default_ghosting (bool enable)
 Enable or disable default ghosting functors on the Mesh and on all Systems.
 
void update ()
 Updates local values for all the systems.
 
unsigned int n_systems () const
 
bool has_system (std::string_view name) const
 
template<typename T_sys >
const T_sys & get_system (std::string_view name) const
 
template<typename T_sys >
T_sys & get_system (std::string_view name)
 
template<typename T_sys >
const T_sys & get_system (const unsigned int num) const
 
template<typename T_sys >
T_sys & get_system (const unsigned int num)
 
const Systemget_system (std::string_view name) const
 
Systemget_system (std::string_view name)
 
const Systemget_system (const unsigned int num) const
 
Systemget_system (const unsigned int num)
 
virtual Systemadd_system (std::string_view system_type, std::string_view name)
 Add the system of type system_type named name to the systems array.
 
template<typename T_sys >
T_sys & add_system (std::string_view name)
 Add the system named name to the systems array.
 
unsigned int n_vars () const
 
std::size_t n_dofs () const
 
std::size_t n_active_dofs () const
 
virtual void solve ()
 Call solve on all the individual equation systems.
 
virtual void adjoint_solve (const QoISet &qoi_indices=QoISet())
 Call adjoint_solve on all the individual equation systems.
 
virtual void sensitivity_solve (const ParameterVector &parameters)
 Call sensitivity_solve on all the individual equation systems.
 
void build_variable_names (std::vector< std::string > &var_names, const FEType *type=nullptr, const std::set< std::string > *system_names=nullptr) const
 Fill the input vector var_names with the names of the variables for each system.
 
void build_elemental_data_variable_names (std::vector< std::string > &var_names, const std::set< std::string > *system_names=nullptr) const
 Filter var_names to names of variables that can be represented as elemental data.
 
void build_solution_vector (std::vector< Number > &soln, std::string_view system_name, std::string_view variable_name="all_vars") const
 Fill the input vector soln with the solution values for the system named name.
 
void build_solution_vector (std::vector< Number > &soln, const std::set< std::string > *system_names=nullptr, bool add_sides=false) const
 Fill the input vector soln with solution values.
 
std::unique_ptr< NumericVector< Number > > build_parallel_solution_vector (const std::set< std::string > *system_names=nullptr, bool add_sides=false) const
 A version of build_solution_vector which is appropriate for "parallel" output formats like Nemesis.
 
void get_vars_active_subdomains (const std::vector< std::string > &names, std::vector< std::set< subdomain_id_type > > &vars_active_subdomains) const
 Retrieve vars_active_subdomains, which indicates the active subdomains for each variable in names.
 
void build_elemental_solution_vector (std::vector< Number > &soln, std::vector< std::string > &names) const
 Retrieve the solution data for elemental data variables.
 
std::vector< std::pair< unsigned int, unsigned int > > find_variable_numbers (std::vector< std::string > &names, const FEType *type=nullptr, const std::vector< FEType > *types=nullptr) const
 Finds system and variable numbers for any variables of 'type' or of 'types' corresponding to the entries in the input 'names' vector.
 
std::vector< std::pair< unsigned int, unsigned int > > find_elemental_data_variable_numbers (std::vector< std::string > &names) const
 Finds system and variable numbers for variables that can be represented as elemental data.
 
std::unique_ptr< NumericVector< Number > > build_parallel_elemental_solution_vector (std::vector< std::string > &names) const
 Builds a parallel vector of elemental data solution values corresponding to the entries in the input 'names' vector.
 
void build_discontinuous_solution_vector (std::vector< Number > &soln, const std::set< std::string > *system_names=nullptr, const std::vector< std::string > *var_names=nullptr, bool vertices_only=false, bool add_sides=false) const
 Fill the input vector soln with solution values.
 
template<typename InValType = Number>
void read (std::string_view name, const XdrMODE, const unsigned int read_flags=(READ_HEADER|READ_DATA), bool partition_agnostic=true)
 Read & initialize the systems from disk using the XDR data format.
 
template<typename InValType = Number>
void read (std::string_view name, const unsigned int read_flags=(READ_HEADER|READ_DATA), bool partition_agnostic=true)
 
template<typename InValType = Number>
void read (Xdr &io, std::function< std::unique_ptr< Xdr >()> &local_io_functor, const unsigned int read_flags=(READ_HEADER|READ_DATA), bool partition_agnostic=true)
 
void write (std::string_view name, const XdrMODE, const unsigned int write_flags=(WRITE_DATA), bool partition_agnostic=true) const
 Write the systems to disk using the XDR data format.
 
void write (std::string_view name, const unsigned int write_flags=(WRITE_DATA), bool partition_agnostic=true) const
 
void write (std::ostream name, const unsigned int write_flags=(WRITE_DATA), bool partition_agnostic=true) const
 
void write (Xdr &io, const unsigned int write_flags=(WRITE_DATA), bool partition_agnostic=true, Xdr *const local_io=nullptr) const
 
virtual bool compare (const EquationSystems &other_es, const Real threshold, const bool verbose) const
 
virtual std::string get_info () const
 
void print_info (std::ostream &os=libMesh::out) const
 Prints information about the equation systems, by default to libMesh::out.
 
const MeshBaseget_mesh () const
 
MeshBaseget_mesh ()
 
void allgather ()
 Serializes a distributed mesh and its associated degree of freedom numbering for all systems.
 
void enable_refine_in_reinit ()
 Calls to reinit() will also do two-step coarsen-then-refine.
 
void disable_refine_in_reinit ()
 Calls to reinit() will not try to coarsen or refine the mesh.
 
bool refine_in_reinit_flag ()
 
bool reinit_solutions ()
 Handle any mesh changes and project any solutions onto the updated mesh.
 
virtual void reinit_systems ()
 Reinitialize all systems on the current mesh.
 
const Parallel::Communicatorcomm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 

Static Public Member Functions

static bool is_elemental_data_fe_type (const FEType &type)
 
static bool redundant_added_side (const Elem &elem, unsigned int side)
 
static std::string get_info ()
 Gets a string containing the reference information.
 
static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out.
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects.
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info().
 
static void disable_print_counter_info ()
 

Public Attributes

Parameters parameters
 Data structure holding arbitrary parameters.
 

Protected Types

typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 Data structure to log the information.
 

Protected Member Functions

void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter.
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter.
 

Protected Attributes

MeshBase_mesh
 The mesh data structure.
 
std::map< std::string, std::unique_ptr< System >, std::less<> > _systems
 Data structure holding the systems.
 
bool _refine_in_reinit
 Flag for whether to call coarsen/refine in reinit().
 
bool _enable_default_ghosting
 Flag for whether to enable default ghosting on newly added Systems.
 
const Parallel::Communicator_communicator
 

Static Protected Attributes

static Counts _counts
 Actually holds the data.
 
static Threads::atomic< unsigned int_n_objects
 The number of objects.
 
static Threads::spin_mutex _mutex
 Mutual exclusion object to enable thread-safe reference counting.
 
static bool _enable_print_counter = true
 Flag to control whether reference count information is printed when print_info is called.
 

Private Member Functions

std::vector< std::pair< unsigned int, unsigned int > > find_variable_numbers_by_predicate (std::vector< std::string > &names, const std::function< bool(const FEType &)> &type_filter) const
 Implementation detail for find_variable_numbers() variants.
 
void _add_system_to_nodes_and_elems ()
 This function is used in the implementation of add_system, it loops over the nodes and elements of the Mesh, adding the system to each one.
 
void _remove_default_ghosting (unsigned int sys_num)
 This just calls DofMap::remove_default_ghosting() but using a shim lets us forward-declare DofMap.
 

Friends

std::ostream & operator<< (std::ostream &os, const EquationSystems &es)
 Same as above, but allows you to also use stream syntax.
 

Detailed Description

This is the EquationSystems class.

It is in charge of handling all the various equation systems defined for a MeshBase. It may have multiple systems, which may be active or inactive, so that at different solution stages only a sub-set may be solved for. Also, through the templated access, different types of systems may be handled. Also other features, like flags, parameters, I/O etc are provided.

Author
Benjamin S. Kirk
Date
2002-2007

Manages multiples systems of equations.

Definition at line 69 of file equation_systems.h.

Member Typedef Documentation

◆ Counts

typedef std::map<std::string, std::pair<unsigned int, unsigned int> > libMesh::ReferenceCounter::Counts
protectedinherited

Data structure to log the information.

The log is identified by the class name.

Definition at line 119 of file reference_counter.h.

Member Enumeration Documentation

◆ ReadFlags

Define enumeration to set properties in EquationSystems::read()

Enumerator
READ_HEADER 
READ_DATA 
READ_ADDITIONAL_DATA 
READ_LEGACY_FORMAT 
TRY_READ_IFEMS 
READ_BASIC_ONLY 

Definition at line 78 of file equation_systems.h.

◆ WriteFlags

Define enumeration to set properties in EquationSystems::write()

Enumerator
WRITE_DATA 
WRITE_ADDITIONAL_DATA 
WRITE_PARALLEL_FILES 
WRITE_SERIAL_FILES 

Definition at line 88 of file equation_systems.h.

Constructor & Destructor Documentation

◆ EquationSystems()

libMesh::EquationSystems::EquationSystems ( MeshBase mesh)

Constructor.

Definition at line 52 of file equation_systems.C.

52 :
54 _mesh (m),
57{
58 // Set default parameters
59 this->parameters.set<Real> ("linear solver tolerance") = TOLERANCE * TOLERANCE;
60 this->parameters.set<unsigned int>("linear solver maximum iterations") = 5000;
61}
Parameters parameters
Data structure holding arbitrary parameters.
bool _refine_in_reinit
Flag for whether to call coarsen/refine in reinit().
MeshBase & _mesh
The mesh data structure.
bool _enable_default_ghosting
Flag for whether to enable default ghosting on newly added Systems.
ParallelObject(const Parallel::Communicator &comm_in)
Constructor.
T & set(const std::string &)
Definition parameters.h:494
static constexpr Real TOLERANCE
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

References parameters, libMesh::Real, libMesh::Parameters::set(), and libMesh::TOLERANCE.

◆ ~EquationSystems()

libMesh::EquationSystems::~EquationSystems ( )
virtualdefault

Destructor.

Should be virtual, since the user may want to derive subclasses of EquationSystems.

Member Function Documentation

◆ _add_system_to_nodes_and_elems()

void libMesh::EquationSystems::_add_system_to_nodes_and_elems ( )
private

This function is used in the implementation of add_system, it loops over the nodes and elements of the Mesh, adding the system to each one.

The main reason to separate this part is to avoid coupling this header file to mesh.h, and elem.h.

Definition at line 1879 of file equation_systems.C.

1880{
1881 // All the nodes
1882 for (auto & node : _mesh.node_ptr_range())
1883 node->add_system();
1884
1885 // All the elements
1888 [](const ElemRange & range)
1889 {
1890 for (Elem * elem : range)
1891 elem->add_system();
1892 });
1893}
virtual System & add_system(std::string_view system_type, std::string_view name)
Add the system of type system_type named name to the systems array.
const ElemRange & element_stored_range()
Definition mesh_base.C:1939
void parallel_for(const Range &range, const Body &body, unsigned int n_threads=libMesh::n_threads())
Execute the provided function object in parallel on the specified range.
StoredRange< MeshBase::element_iterator, Elem * > ElemRange
Definition elem_range.h:33

Referenced by add_system().

◆ _remove_default_ghosting()

void libMesh::EquationSystems::_remove_default_ghosting ( unsigned int  sys_num)
private

This just calls DofMap::remove_default_ghosting() but using a shim lets us forward-declare DofMap.

Definition at line 1895 of file equation_systems.C.

1896{
1897 this->get_system(sys_num).get_dof_map().remove_default_ghosting();
1898}
const T_sys & get_system(std::string_view name) const

Referenced by add_system().

◆ add_system() [1/2]

template<typename T_sys >
T_sys & libMesh::EquationSystems::add_system ( std::string_view  name)
inline

Add the system named name to the systems array.

Definition at line 690 of file equation_systems.h.

691{
692 if (!_systems.count(name))
693 {
694 const unsigned int sys_num = this->n_systems();
695
696 auto result = _systems.emplace
697 (name, std::make_unique<T_sys>(*this, std::string(name),
698 sys_num));
699
701 this->_remove_default_ghosting(sys_num);
702
703 // Tell all the \p DofObject entities to add a system.
705
706 // Return reference to newly added item
707 auto it = result.first;
708 auto & sys_ptr = it->second;
709 return cast_ref<T_sys &>(*sys_ptr);
710 }
711 else
712 {
713 // We now allow redundant add_system calls, to make it
714 // easier to load data from files for user-derived system
715 // subclasses
716 return this->get_system<T_sys>(name);
717 }
718}
void _remove_default_ghosting(unsigned int sys_num)
This just calls DofMap::remove_default_ghosting() but using a shim lets us forward-declare DofMap.
unsigned int n_systems() const
void _add_system_to_nodes_and_elems()
This function is used in the implementation of add_system, it loops over the nodes and elements of th...
std::map< std::string, std::unique_ptr< System >, std::less<> > _systems
Data structure holding the systems.

References _add_system_to_nodes_and_elems(), _enable_default_ghosting, _remove_default_ghosting(), _systems, and n_systems().

◆ add_system() [2/2]

System & libMesh::EquationSystems::add_system ( std::string_view  system_type,
std::string_view  name 
)
virtual

Add the system of type system_type named name to the systems array.

Definition at line 353 of file equation_systems.C.

355{
356 // If the user already built a system with this name, we'll
357 // trust them and we'll use it. That way they can pre-add
358 // non-standard derived system classes, and if their restart file
359 // has some non-standard sys_type we won't throw an error.
360 if (_systems.count(name))
361 {
362 return this->get_system(name);
363 }
364 // Build a basic System
365 else if (sys_type == "Basic")
366 this->add_system<System> (name);
367
368 // Build a Newmark system
369 else if (sys_type == "Newmark")
370 this->add_system<NewmarkSystem> (name);
371
372 // Build an Explicit system
373 else if ((sys_type == "Explicit"))
374 this->add_system<ExplicitSystem> (name);
375
376 // Build an Implicit system
377 else if ((sys_type == "Implicit") ||
378 (sys_type == "Steady" ))
379 this->add_system<ImplicitSystem> (name);
380
381 // build a transient implicit linear system
382 else if ((sys_type == "Transient") ||
383 (sys_type == "TransientImplicit") ||
384 (sys_type == "TransientLinearImplicit"))
385 this->add_system<TransientLinearImplicitSystem> (name);
386
387 // build a transient implicit nonlinear system
388 else if (sys_type == "TransientNonlinearImplicit")
389 this->add_system<TransientNonlinearImplicitSystem> (name);
390
391 // build a transient explicit system
392 else if (sys_type == "TransientExplicit")
393 this->add_system<TransientExplicitSystem> (name);
394
395 // build a linear implicit system
396 else if (sys_type == "LinearImplicit")
397 this->add_system<LinearImplicitSystem> (name);
398
399 // build a nonlinear implicit system
400 else if (sys_type == "NonlinearImplicit")
401 this->add_system<NonlinearImplicitSystem> (name);
402
403 // build a Reduced Basis Construction system
404 else if (sys_type == "RBConstruction")
405 this->add_system<RBConstruction> (name);
406
407 // build a transient Reduced Basis Construction system
408 else if (sys_type == "TransientRBConstruction")
409 this->add_system<TransientRBConstruction> (name);
410
411#ifdef LIBMESH_HAVE_SLEPC
412 // build an eigen system
413 else if (sys_type == "Eigen")
414 this->add_system<EigenSystem> (name);
415 else if (sys_type == "TransientEigenSystem")
416 this->add_system<TransientEigenSystem> (name);
417#endif
418
419#if defined(LIBMESH_USE_COMPLEX_NUMBERS)
420 // build a frequency system
421 else if (sys_type == "Frequency")
422 this->add_system<FrequencySystem> (name);
423#endif
424
425 else
426 libmesh_error_msg("ERROR: Unknown system type: " << sys_type);
427
428 // Return a reference to the new system
429 //return (*this)(name);
430 return this->get_system(name);
431}

References _systems, and get_system().

Referenced by assemble_and_solve(), build_system(), main(), main(), libMesh::ErrorVector::plot_error(), read(), libMesh::StaticCondensationDofMap::reinit(), TimeSolverTestImplementation< TimeSolverType >::run_test_with_exact_soln(), libMesh::PetscPreconditioner< T >::set_hypre_ads_data(), libMesh::PetscPreconditioner< T >::set_hypre_ams_data(), setup(), WriteVecAndScalar::setupTests(), SystemsTest::simpleSetup(), MultiEvaluablePredTest::test(), SystemsTest::test100KVariables(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), SystemsTest::test2DProjectVectorFE(), SystemsTest::test3DProjectVectorFE(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), ProjectSolutionTest::test_partial_project_solution(), MeshFunctionTest::test_subdomain_id_sets(), EquationSystemsTest::testAddSystem(), DofMapTest::testArrayDofIndicesWithType(), SystemsTest::testAssemblyWithDgFemContext(), DofMapTest::testBadElemFECombo(), EquationSystemsTest::testBadVarNames(), SystemsTest::testBlockRestrictedVarNDofs(), SystemsTest::testBoundaryProjectCube(), DofMapTest::testConstraintLoopDetection(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyElementVectorImpl(), MeshInputTest::testCopyNodalSolutionImpl(), ConstraintOperatorTest::testCoreform(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), EquationSystemsTest::testDisableDefaultGhosting(), SystemsTest::testDofCouplingWithVarGroups(), MixedDimensionMeshTest::testDofOrdering(), MixedDimensionRefinedMeshTest::testDofOrdering(), MixedDimensionNonUniformRefinement::testDofOrdering(), MixedDimensionNonUniformRefinementTriangle::testDofOrdering(), MixedDimensionNonUniformRefinement3D::testDofOrdering(), DofMapTest::testDofOwner(), MeshInputTest::testDynaReadPatch(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), SystemsTest::testFirstScalarNumber(), EquationSystemsTest::testInit(), MeshAssignTest::testMeshMoveAssign(), PeriodicBCTest::testPeriodicBC(), EquationSystemsTest::testPostInitAddElem(), EquationSystemsTest::testPostInitAddRealSystem(), EquationSystemsTest::testPostInitAddSystem(), SystemsTest::testProjectCube(), SystemsTest::testProjectCubeWithMeshFunction(), MeshInputTest::testProjectionRegression(), SystemsTest::testProjectLine(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), SystemsTest::testProjectMatrix3D(), SystemsTest::testProjectScalarCoarsening(), SystemsTest::testProjectSquare(), InfFERadialTest::testRefinement(), EquationSystemsTest::testRefineThenReinitPreserveFlags(), EquationSystemsTest::testReinitWithNodeElem(), EquationSystemsTest::testRepartitionThenReinit(), EquationSystemsTest::testSelectivePRefine(), SystemsTest::testSetSystemParameterOverEquationSystem(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), DisjointNeighborTest::testTempJump(), DisjointNeighborTest::testTempJumpRefine(), WriteVecAndScalar::testWriteExodus(), and WriteVecAndScalar::testWriteNemesis().

◆ adjoint_solve()

void libMesh::EquationSystems::adjoint_solve ( const QoISet qoi_indices = QoISet())
virtual

Call adjoint_solve on all the individual equation systems.

By default this function solves each system's adjoint once, in the reverse order from that in which they were added. For more sophisticated decoupled problems the user may with to override this behavior in a derived class.

Definition at line 455 of file equation_systems.C.

456{
457 libmesh_assert (this->n_systems());
458
459 for (unsigned int i=this->n_systems(); i != 0; --i)
460 this->get_system(i-1).adjoint_solve(qoi_indices);
461}
libmesh_assert(ctx)

References get_system(), libMesh::libmesh_assert(), and n_systems().

Referenced by libMesh::UniformRefinementEstimator::_estimate_error().

◆ allgather()

void libMesh::EquationSystems::allgather ( )

Serializes a distributed mesh and its associated degree of freedom numbering for all systems.

Definition at line 275 of file equation_systems.C.

276{
277 // A serial mesh means nothing needs to be done
278 if (_mesh.is_serial())
279 return;
280
281 const unsigned int n_sys = this->n_systems();
282
283 libmesh_assert_not_equal_to (n_sys, 0);
284
285 // Gather the mesh
287
288 // Tell all the \p DofObject entities how many systems
289 // there are.
290 for (auto & node : _mesh.node_ptr_range())
291 node->set_n_systems(n_sys);
292
295 [n_sys](const ElemRange & range)
296 {
297 for (Elem * elem : range)
298 elem->set_n_systems(n_sys);
299 });
300
301 // And distribute each system's dofs
302 for (auto i : make_range(this->n_systems()))
303 {
304 System & sys = this->get_system(i);
305 DofMap & dof_map = sys.get_dof_map();
306 dof_map.distribute_dofs(_mesh);
307
308 // The user probably won't need constraint equations or the
309 // send_list after an allgather, but let's keep it in consistent
310 // shape just in case.
311 sys.reinit_constraints();
312
313 // Even if there weren't any constraint changes,
314 // reinit_constraints() did prepare_send_list() for us.
315 }
316}
virtual bool is_serial() const
Definition mesh_base.h:357
virtual void allgather()
Gathers all elements and nodes of the mesh onto every processor.
Definition mesh_base.h:386
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition int_range.h:176

References _mesh, libMesh::MeshBase::allgather(), libMesh::DofMap::distribute_dofs(), libMesh::MeshBase::element_stored_range(), libMesh::System::get_dof_map(), get_system(), libMesh::MeshBase::is_serial(), libMesh::make_range(), n_systems(), libMesh::Threads::parallel_for(), and libMesh::System::reinit_constraints().

◆ build_discontinuous_solution_vector()

void libMesh::EquationSystems::build_discontinuous_solution_vector ( std::vector< Number > &  soln,
const std::set< std::string > *  system_names = nullptr,
const std::vector< std::string > *  var_names = nullptr,
bool  vertices_only = false,
bool  add_sides = false 
) const

Fill the input vector soln with solution values.

The entries will be in geometry-major format: element, then local node/vertex, then variable.

If systems_names!=nullptr, only include data from the specified systems.

If vertices_only == true, then for higher-order elements only the solution at the vertices is computed. This can be useful when plotting discontinuous solutions on higher-order elements and only a lower-order representation is required.

If add_sides == true, append data for plotting on "side elements" too.

Definition at line 1356 of file equation_systems.C.

1362{
1363 LOG_SCOPE("build_discontinuous_solution_vector()", "EquationSystems");
1364
1365 libmesh_assert (this->n_systems());
1366
1367 const std::vector<std::string> component_suffix = {"_x", "_y", "_z"};
1368 const auto requested_components =
1369 [this, var_names, &component_suffix](const System & system,
1370 const unsigned int var)
1371 {
1372 std::vector<unsigned int> components;
1373
1374 const std::string & var_name = system.variable_name(var);
1375 const FEType & fe_type = system.variable_type(var);
1376 const unsigned int n_vec_dim = FEInterface::n_vec_dim(_mesh, fe_type);
1377
1378 if (FEInterface::field_type(fe_type) == TYPE_VECTOR)
1379 {
1380 libmesh_error_msg_if(n_vec_dim > component_suffix.size(),
1381 "Invalid dim in build_discontinuous_solution_vector");
1382
1383 const bool use_all_components =
1384 (var_names == nullptr) ||
1385 std::count(var_names->begin(), var_names->end(), var_name);
1386
1387 if (n_vec_dim <= 1)
1388 {
1389 if (use_all_components)
1390 components.push_back(0);
1391 }
1392 else
1393 for (auto comp : make_range(n_vec_dim))
1394 {
1395 const std::string component_name = var_name + component_suffix[comp];
1396 if (use_all_components ||
1397 std::count(var_names->begin(), var_names->end(), component_name))
1398 components.push_back(comp);
1399 }
1400 }
1401 else if (var_names == nullptr ||
1402 std::count(var_names->begin(), var_names->end(), var_name))
1403 components.push_back(0);
1404
1405 return components;
1406 };
1407
1408 // Get the number of variables (nv) by counting the number of variables
1409 // in each system listed in system_names
1410 unsigned int nv = 0;
1411
1412 for (const auto & [sys_name, sys_ptr] : _systems)
1413 {
1414 // Check current system is listed in system_names, and skip pos if not
1415 bool use_current_system = (system_names == nullptr);
1416 if (!use_current_system)
1417 use_current_system = system_names->count(sys_name);
1418 if (!use_current_system || sys_ptr->hide_output())
1419 continue;
1420
1421 // Loop over all variables in this System and check whether we
1422 // are supposed to use each one.
1423 for (auto var_id : make_range(sys_ptr->n_vars()))
1424 nv += cast_int<unsigned int>(requested_components(*sys_ptr, var_id).size());
1425 }
1426
1427 // get the total "weight" - the number of nodal values to write for
1428 // each variable.
1429 unsigned int tw=0;
1430 for (const auto & elem : _mesh.active_element_ptr_range())
1431 {
1432 tw += vertices_only ? elem->n_vertices() : elem->n_nodes();
1433
1434 if (add_sides)
1435 {
1436 for (auto s : elem->side_index_range())
1437 {
1438 if (redundant_added_side(*elem,s))
1439 continue;
1440
1441 const std::vector<unsigned int> side_nodes =
1442 elem->nodes_on_side(s);
1443
1444 if (!vertices_only)
1445 tw += side_nodes.size();
1446 else
1447 for (auto n : index_range(side_nodes))
1448 if (elem->is_vertex(side_nodes[n]))
1449 ++tw;
1450 }
1451 }
1452 }
1453
1454 // Only if we are on processor zero, allocate the storage
1455 // to hold (number_of_nodes)*(number_of_variables) entries.
1456 if (_mesh.processor_id() == 0)
1457 soln.resize(tw*nv);
1458
1459 std::vector<Number> sys_soln;
1460
1461 // Keep track of the variable "offset". This is used for indexing
1462 // into the global solution vector.
1463 unsigned int var_offset = 0;
1464
1465 // For each system in this EquationSystems object,
1466 // update the global solution and if we are on processor 0,
1467 // loop over the elements and build the nodal solution
1468 // from the element solution. Then insert this nodal solution
1469 // into the vector passed to build_solution_vector.
1470 for (const auto & [sys_name, system] : _systems)
1471 {
1472 // Check current system is listed in system_names, and skip pos if not
1473 bool use_current_system = (system_names == nullptr);
1474 if (!use_current_system)
1475 use_current_system = system_names->count(sys_name);
1476 if (!use_current_system || system->hide_output())
1477 continue;
1478
1479 const unsigned int nv_sys = system->n_vars();
1480 const auto & dof_map = system->get_dof_map();
1481
1482 system->update_global_solution (sys_soln, 0);
1483
1484 // Keep track of the number of vars actually written.
1485 unsigned int n_vars_written_current_system = 0;
1486
1487 if (_mesh.processor_id() == 0)
1488 {
1489 std::vector<Number> soln_coeffs; // The finite element solution coeffs
1490 std::vector<Number> nodal_soln; // The FE solution interpolated to the nodes
1491 std::vector<dof_id_type> dof_indices; // The DOF indices for the finite element
1492
1493 // For each variable, determine if we are supposed to
1494 // write it, then loop over the active elements, compute
1495 // the nodal_soln and store it to the "soln" vector. We
1496 // store zeros for subdomain-restricted variables on
1497 // elements where they are not active.
1498 for (auto var : make_range(nv_sys))
1499 {
1500 const std::vector<unsigned int> components_to_write =
1501 requested_components(*system, var);
1502
1503 // If we aren't supposed to write this var, go to the
1504 // next loop iteration.
1505 if (components_to_write.empty())
1506 continue;
1507
1508 const FEType & fe_type = system->variable_type(var);
1509 const Variable & var_description = system->variable(var);
1510 const bool add_p_level = fe_type.p_refinement;
1511 const unsigned int n_vec_dim = FEInterface::n_vec_dim(_mesh, fe_type);
1512
1513 unsigned int nn=0;
1514
1515 for (auto & elem : _mesh.active_element_ptr_range())
1516 {
1517 if (var_description.active_on_subdomain(elem->subdomain_id()))
1518 {
1519 dof_map.dof_indices (elem, dof_indices, var);
1520
1521 soln_coeffs.resize(dof_indices.size());
1522
1523 for (auto i : index_range(dof_indices))
1524 soln_coeffs[i] = sys_soln[dof_indices[i]];
1525
1526 // Compute the FE solution at all the nodes, but
1527 // only use the first n_vertices() entries if
1528 // vertices_only == true.
1529 FEInterface::nodal_soln (elem->dim(),
1530 fe_type,
1531 elem,
1532 soln_coeffs,
1533 nodal_soln,
1534 add_p_level,
1535 n_vec_dim);
1536
1537 // infinite elements should be skipped...
1538 if (!elem->infinite())
1539 {
1540 libmesh_assert_equal_to (nodal_soln.size(), elem->n_nodes()*n_vec_dim);
1541
1542 const unsigned int n_vals =
1543 vertices_only ? elem->n_vertices() : elem->n_nodes();
1544
1545 for (auto n : make_range(n_vals))
1546 {
1547 // Compute index into global solution vector.
1548 std::size_t index =
1549 nv * (nn++) + (n_vars_written_current_system + var_offset);
1550
1551 for (auto component_index : index_range(components_to_write))
1552 soln[index + component_index] +=
1553 nodal_soln[n_vec_dim*n + components_to_write[component_index]];
1554 }
1555 }
1556 }
1557 else
1558 nn += vertices_only ? elem->n_vertices() : elem->n_nodes();
1559 } // end loop over active elements writing interiors
1560
1561 // Loop writing "fake" sides, if requested
1562 if (add_sides)
1563 {
1564 // We don't build discontinuous solution vectors in
1565 // parallel yet, but we'll do ordering of fake side
1566 // values as if we did, for consistency with the
1567 // parallel continuous ordering and for future
1568 // compatibility.
1569 std::vector<std::vector<const Elem *>>
1570 elems_by_pid(_mesh.n_processors());
1571
1572 for (const auto & elem : _mesh.active_element_ptr_range())
1573 elems_by_pid[elem->processor_id()].push_back(elem);
1574
1575 for (auto p : index_range(elems_by_pid))
1576 for (const Elem * elem : elems_by_pid[p])
1577 {
1578 if (var_description.active_on_subdomain(elem->subdomain_id()))
1579 {
1580 dof_map.dof_indices (elem, dof_indices, var);
1581
1582 soln_coeffs.resize(dof_indices.size());
1583
1584 for (auto i : index_range(dof_indices))
1585 soln_coeffs[i] = sys_soln[dof_indices[i]];
1586
1587 for (auto s : elem->side_index_range())
1588 {
1589 if (redundant_added_side(*elem,s))
1590 continue;
1591
1592 const std::vector<unsigned int> side_nodes =
1593 elem->nodes_on_side(s);
1594
1595 // Compute the FE solution at all the
1596 // side nodes, but only use those for
1597 // which is_vertex() == true if
1598 // vertices_only == true.
1600 (fe_type, elem, s, soln_coeffs,
1601 nodal_soln, add_p_level,
1602 n_vec_dim);
1603
1604 libmesh_assert_equal_to
1605 (nodal_soln.size(),
1606 side_nodes.size()*n_vec_dim);
1607
1608 // If we don't have a continuous FE
1609 // then we want to average between
1610 // sides, at least in the equal-level
1611 // case where it's easy. This is
1612 // analogous to our repeat_count
1613 // behavior elsewhere.
1614 const FEContinuity cont =
1616 const Elem * const neigh = elem->neighbor_ptr(s);
1617
1618 if ((cont == DISCONTINUOUS || cont == H_CURL || cont == H_DIV) &&
1619 neigh &&
1620 neigh->level() == elem->level() &&
1621 var_description.active_on_subdomain(neigh->subdomain_id()))
1622 {
1623 std::vector<dof_id_type> neigh_indices;
1624 dof_map.dof_indices (neigh, neigh_indices, var);
1625 std::vector<Number> neigh_coeffs(neigh_indices.size());
1626
1627 for (auto i : index_range(neigh_indices))
1628 neigh_coeffs[i] = sys_soln[neigh_indices[i]];
1629
1630 const unsigned int s_neigh =
1631 neigh->which_neighbor_am_i(elem);
1632 std::vector<Number> neigh_soln;
1634 (fe_type, neigh, s_neigh,
1635 neigh_coeffs, neigh_soln, add_p_level,
1636 n_vec_dim);
1637
1638 const std::vector<unsigned int> neigh_nodes =
1639 neigh->nodes_on_side(s_neigh);
1640 for (auto n : index_range(side_nodes))
1641 for (auto neigh_n : index_range(neigh_nodes))
1642 if (neigh->node_ptr(neigh_nodes[neigh_n])
1643 == elem->node_ptr(side_nodes[n]))
1644 for (auto comp : make_range(n_vec_dim))
1645 {
1646 const auto nodal_index = n_vec_dim*n + comp;
1647 nodal_soln[nodal_index] +=
1648 neigh_soln[n_vec_dim*neigh_n + comp];
1649 nodal_soln[nodal_index] /= 2;
1650 }
1651 }
1652
1653 for (auto n : index_range(side_nodes))
1654 {
1655 if (vertices_only &&
1656 !elem->is_vertex(n))
1657 continue;
1658
1659 // Compute index into global solution vector.
1660 std::size_t index =
1661 nv * (nn++) + (n_vars_written_current_system + var_offset);
1662
1663 for (auto component_index : index_range(components_to_write))
1664 soln[index + component_index] +=
1665 nodal_soln[n_vec_dim*n + components_to_write[component_index]];
1666 }
1667 }
1668 }
1669 else
1670 {
1671 nn += vertices_only ? elem->n_vertices() : elem->n_nodes();
1672
1673 for (auto s : elem->side_index_range())
1674 {
1675 if (redundant_added_side(*elem,s))
1676 continue;
1677
1678 const std::vector<unsigned int> side_nodes =
1679 elem->nodes_on_side(s);
1680
1681 for (auto n : index_range(side_nodes))
1682 {
1683 if (vertices_only &&
1684 !elem->is_vertex(n))
1685 continue;
1686 nn++;
1687 }
1688 }
1689 }
1690 } // end loop over active elements, writing "fake" sides
1691 }
1692 // If we made it here, we actually wrote a variable, so increment
1693 // the number of variables actually written for the current system.
1694 n_vars_written_current_system += cast_int<unsigned int>(components_to_write.size());
1695
1696 } // end loop over vars
1697 } // end if proc 0
1698
1699 // Update offset for next loop iteration.
1700 var_offset += n_vars_written_current_system;
1701 } // end loop over systems
1702}
void ErrorVector unsigned int
static bool redundant_added_side(const Elem &elem, unsigned int side)
unsigned int n_vars() const
static unsigned int n_vec_dim(const MeshBase &mesh, const FEType &fe_type)
static FEContinuity get_continuity(const FEType &fe_type)
Returns the input FEType's FEContinuity based on the underlying FEFamily and potentially the Order,...
static FEFieldType field_type(const FEType &fe_type)
static void nodal_soln(const unsigned int dim, const FEType &fe_t, const Elem *elem, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln, const bool add_p_level=true, const unsigned int vdim=1)
Build the nodal soln from the element soln.
static void side_nodal_soln(const FEType &fe_t, const Elem *elem, const unsigned int side, const std::vector< Number > &elem_soln, std::vector< Number > &nodal_soln, const bool add_p_level=true, const unsigned int vdim=1)
Build the nodal soln on one side from the (full) element soln.
processor_id_type processor_id() const
processor_id_type n_processors() const
Tnew cast_int(Told oldvar)
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition int_range.h:153

References libMesh::Variable::active_on_subdomain(), libMesh::DISCONTINUOUS, libMesh::H_CURL, libMesh::H_DIV, libMesh::index_range(), libMesh::Elem::level(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::Elem::neighbor_ptr(), libMesh::Elem::node_ptr(), libMesh::Elem::nodes_on_side(), libMesh::FEType::p_refinement, libMesh::Elem::subdomain_id(), libMesh::TYPE_VECTOR, and libMesh::Elem::which_neighbor_am_i().

Referenced by libMesh::ExodusII_IO::write_discontinuous_exodusII(), libMesh::GMVIO::write_discontinuous_gmv(), and libMesh::ExodusII_IO::write_element_data_from_discontinuous_nodal_data().

◆ build_elemental_data_variable_names()

void libMesh::EquationSystems::build_elemental_data_variable_names ( std::vector< std::string > &  var_names,
const std::set< std::string > *  system_names = nullptr 
) const

Filter var_names to names of variables that can be represented as elemental data.

If var_names is empty, all eligible variable names are returned. Vector-valued variables are decomposed into component names. If system_names!=nullptr, only include names from the specified systems.

Definition at line 592 of file equation_systems.C.

595{
596 const std::vector<std::string> name_filter = var_names;
597 const bool is_names_empty = name_filter.empty();
598 var_names.clear();
599
600 const std::vector<std::string> component_suffix = {"_x", "_y", "_z"};
601 const unsigned int dim = _mesh.spatial_dimension();
602 libmesh_error_msg_if(dim > 3, "Invalid dim in build_elemental_data_variable_names");
603
604 for (const auto & [sys_name, sys_ptr] : _systems)
605 {
606 const bool use_current_system = (system_names == nullptr) || system_names->count(sys_name);
607 if (!use_current_system || sys_ptr->hide_output())
608 continue;
609
610 for (auto var : make_range(sys_ptr->n_vars()))
611 {
612 const FEType & var_type = sys_ptr->variable_type(var);
614 continue;
615
616 if (FEInterface::field_type(var_type) == TYPE_VECTOR)
617 {
618 for (auto comp : make_range(dim))
619 {
620 const std::string name =
621 sys_ptr->variable_name(var) + component_suffix[comp];
622
623 if (is_names_empty ||
624 std::find(name_filter.begin(), name_filter.end(), name) != name_filter.end())
625 var_names.push_back(name);
626 }
627 }
628 else
629 {
630 const std::string & name = sys_ptr->variable_name(var);
631
632 if (is_names_empty ||
633 std::find(name_filter.begin(), name_filter.end(), name) != name_filter.end())
634 var_names.push_back(name);
635 }
636 }
637 }
638
639 std::sort(var_names.begin(), var_names.end());
640}
unsigned int dim
static bool is_elemental_data_fe_type(const FEType &type)
unsigned int spatial_dimension() const
Definition mesh_base.C:606
std::string name(const ElemQuality q)
This function returns a string containing some name for q.

References _mesh, _systems, dim, libMesh::FEInterface::field_type(), is_elemental_data_fe_type(), libMesh::make_range(), libMesh::MeshBase::spatial_dimension(), and libMesh::TYPE_VECTOR.

Referenced by libMesh::ExodusII_IO::write_element_data_from_discontinuous_nodal_data().

◆ build_elemental_solution_vector()

void libMesh::EquationSystems::build_elemental_solution_vector ( std::vector< Number > &  soln,
std::vector< std::string > &  names 
) const

Retrieve the solution data for elemental data variables.

If 'names' is populated, only the variables corresponding to those names will be retrieved. This can be used to filter which variables are retrieved.

This is the more appropriately-named replacement for the get_solution() function defined above.

Definition at line 1090 of file equation_systems.C.

1092{
1093 // Call the parallel version of this function
1094 std::unique_ptr<NumericVector<Number>> parallel_soln =
1096
1097 // Localize into 'soln', provided that parallel_soln is not empty.
1098 // Note: parallel_soln will be empty in the event that none of the
1099 // input names were elemental data variables, or there were simply none of these in
1100 // the EquationSystems object.
1101 soln.clear();
1102 if (parallel_soln)
1103 parallel_soln->localize_to_one(soln);
1104}
std::unique_ptr< NumericVector< Number > > build_parallel_elemental_solution_vector(std::vector< std::string > &names) const
Builds a parallel vector of elemental data solution values corresponding to the entries in the input ...

References build_parallel_elemental_solution_vector().

Referenced by libMesh::ExodusII_IO::write_element_data().

◆ build_parallel_elemental_solution_vector()

std::unique_ptr< NumericVector< Number > > libMesh::EquationSystems::build_parallel_elemental_solution_vector ( std::vector< std::string > &  names) const

Builds a parallel vector of elemental data solution values corresponding to the entries in the input 'names' vector.

This vector is approximately uniformly distributed across all of the available processors.

The related function build_elemental_solution_vector() is implemented by calling this function and then calling localize_to_one() on the resulting vector.

Returns a nullptr if no elemental data variables exist in the 'names' vector (if it is empty, then it will return all variables in the system of this type if any) or a std::unique_ptr to a var-major numeric vector of total length n_elem * n_vars, where n_vars includes all components of vectors, ordered according to: [u0, u1, ... uN, v0, v1, ... vN, w0, w1, ... wN] for elemental data variables (u, v, w) on a mesh with N elements.

Definition at line 1237 of file equation_systems.C.

1238{
1239 // Filter any names that aren't elemental variables and get the system indices for those that are.
1240 // Note that it's probably fine if the names vector is empty since we'll still filter out all
1241 // non-elemental-data variables. If there are none, then nothing is output here.
1242 std::vector<std::pair<unsigned int, unsigned int>> var_nums =
1244
1245 const std::size_t nv = names.size(); /*total number of vars including vector components*/
1246 const dof_id_type ne = _mesh.n_elem();
1247 libmesh_assert_equal_to (ne, _mesh.max_elem_id());
1248
1249 // If there are no variables to write out don't do anything...
1250 if (!nv)
1251 return std::unique_ptr<NumericVector<Number>>(nullptr);
1252
1253 // We can handle the case where there are nullptrs in the Elem vector
1254 // by just having extra zeros in the solution vector.
1255 numeric_index_type parallel_soln_global_size = ne*nv;
1256
1257 numeric_index_type div = parallel_soln_global_size / this->n_processors();
1258 numeric_index_type mod = parallel_soln_global_size % this->n_processors();
1259
1260 // Initialize all processors to the average size.
1261 numeric_index_type parallel_soln_local_size = div;
1262
1263 // The first "mod" processors get an extra entry.
1264 if (this->processor_id() < mod)
1265 parallel_soln_local_size = div+1;
1266
1267 // Create a NumericVector to hold the parallel solution
1268 std::unique_ptr<NumericVector<Number>> parallel_soln_ptr = NumericVector<Number>::build(_communicator);
1269 NumericVector<Number> & parallel_soln = *parallel_soln_ptr;
1270 parallel_soln.init(parallel_soln_global_size,
1271 parallel_soln_local_size,
1272 /*fast=*/false,
1273 /*ParallelType=*/PARALLEL);
1274
1275 unsigned int sys_ctr = 0;
1276 unsigned int var_ctr = 0;
1277 for (auto i : index_range(var_nums))
1278 {
1279 std::pair<unsigned int, unsigned int> var_num = var_nums[i];
1280 const System & system = this->get_system(var_num.first);
1281
1282 // Update the current_local_solution if necessary
1283 if (sys_ctr != var_num.first)
1284 {
1285 System & non_const_sys = const_cast<System &>(system);
1286 // We used to simply call non_const_sys.solution->close()
1287 // here, but that is not allowed when the solution vector is
1288 // locked read-only, for example when printing the solution
1289 // during during the middle of a solve... So try to be a bit
1290 // more careful about calling close() unnecessarily.
1291 libmesh_assert(this->comm().verify(non_const_sys.solution->closed()));
1292 if (!non_const_sys.solution->closed())
1293 non_const_sys.solution->close();
1294 non_const_sys.update();
1295 sys_ctr = var_num.first;
1296 }
1297
1298 NumericVector<Number> & sys_soln(*system.current_local_solution);
1299
1300 const unsigned int var = var_num.second;
1301
1302 const Variable & variable = system.variable(var);
1303 const DofMap & dof_map = system.get_dof_map();
1304
1305 // We need to check if the elemental data variable is a scalar or a vector and set the number of
1306 // components for the latter as per es.find_variable_numbers().
1307 // Even for the case where a variable is not active on any subdomain belonging to the
1308 // processor, we still need to know this number to update 'var_ctr'.
1309 const auto & var_type = system.variable_type(var);
1310 const unsigned int n_comps =
1311 (FEInterface::field_type(var_type) == TYPE_VECTOR) ?
1312 FEInterface::n_vec_dim(_mesh, var_type) : 1;
1313
1314 // Loop over all elements in the mesh and index all components of the variable if it's active
1317 [&dof_map, &variable, ne, var, var_ctr, n_comps,
1318 &parallel_soln, &sys_soln](const ConstElemRange & range)
1319 {
1320 // The DOF indices for the finite element
1321 std::vector<dof_id_type> dof_indices;
1322
1323 for (const Elem * elem : range)
1324 {
1325 if (variable.active_on_subdomain(elem->subdomain_id()))
1326 {
1327 dof_map.dof_indices(elem, dof_indices, var);
1328
1329 // The number of DOF components needs to be equal to the expected number so that we know
1330 // where to store data to correctly correspond to variable names.
1331 libmesh_assert_equal_to(dof_indices.size(), n_comps);
1332
1333 for (unsigned int comp = 0; comp < n_comps; comp++)
1334 parallel_soln.set(ne * (var_ctr + comp) + elem->id(), sys_soln(dof_indices[comp]));
1335 }
1336 }
1337 });
1338
1339 var_ctr += n_comps;
1340 } // end loop over var_nums
1341
1342 // NOTE: number of output names might not be equal to the number passed to this function. Any that
1343 // aren't elemental data variables have been filtered out (see
1344 // EquationSystems::find_variable_numbers).
1345 //
1346 // But, if everything is accounted for properly, then names.size() == var_ctr
1347 libmesh_assert_equal_to(names.size(), var_ctr);
1348
1349 parallel_soln.close();
1350 return parallel_soln_ptr;
1351}
std::vector< std::pair< unsigned int, unsigned int > > find_elemental_data_variable_numbers(std::vector< std::string > &names) const
Finds system and variable numbers for variables that can be represented as elemental data.
virtual dof_id_type n_elem() const =0
const ConstElemRange & active_local_element_stored_range() const
Definition mesh_base.C:1954
virtual dof_id_type max_elem_id() const =0
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
Builds a NumericVector on the processors in communicator comm using the linear solver package specifi...
const Parallel::Communicator & _communicator
const Parallel::Communicator & comm() const
StoredRange< MeshBase::const_element_iterator, const Elem * > ConstElemRange
Definition elem_range.h:34
dof_id_type numeric_index_type
Definition id_types.h:99
uint8_t dof_id_type
Definition id_types.h:67
template class LIBMESH_EXPORT NumericVector< Number >

References libMesh::ParallelObject::_communicator, _mesh, libMesh::MeshBase::active_local_element_stored_range(), libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::System::current_local_solution, libMesh::FEInterface::field_type(), find_elemental_data_variable_numbers(), libMesh::System::get_dof_map(), get_system(), libMesh::index_range(), libMesh::NumericVector< T >::init(), libMesh::libmesh_assert(), libMesh::MeshBase::max_elem_id(), libMesh::MeshBase::n_elem(), libMesh::ParallelObject::n_processors(), libMesh::FEInterface::n_vec_dim(), libMesh::PARALLEL, libMesh::Threads::parallel_for(), libMesh::ParallelObject::processor_id(), libMesh::System::solution, libMesh::TYPE_VECTOR, libMesh::System::update(), libMesh::System::variable(), and libMesh::System::variable_type().

Referenced by build_elemental_solution_vector().

◆ build_parallel_solution_vector()

std::unique_ptr< NumericVector< Number > > libMesh::EquationSystems::build_parallel_solution_vector ( const std::set< std::string > *  system_names = nullptr,
bool  add_sides = false 
) const

A version of build_solution_vector which is appropriate for "parallel" output formats like Nemesis.

Returns
A std::unique_ptr to a node-major NumericVector of total length n_nodes*n_vars that various I/O classes can then use to get the local values they need to write on each processor.

Definition at line 656 of file equation_systems.C.

658{
659 LOG_SCOPE("build_parallel_solution_vector()", "EquationSystems");
660
661 // This function must be run on all processors at once
662 parallel_object_only();
663
664 const unsigned int dim = _mesh.spatial_dimension();
665 const dof_id_type max_nn = _mesh.max_node_id();
666
667 // allocate vector storage to hold
668 // (max_node_id)*(number_of_variables) entries.
669 //
670 // If node renumbering is disabled and adaptive coarsening has
671 // created gaps between node numbers, then this vector will be
672 // sparse.
673 //
674 // We have to differentiate between between scalar and vector
675 // variables. We intercept vector variables and treat each
676 // component as a scalar variable (consistently with build_solution_names).
677
678 unsigned int nv = 0;
679
680 //Could this be replaced by a/some convenience methods?[PB]
681 {
682 unsigned int n_scalar_vars = 0;
683 unsigned int n_vector_vars = 0;
684 for (const auto & [sys_name, sys_ptr] : _systems)
685 {
686 // Check current system is listed in system_names, and skip pos if not
687 bool use_current_system = (system_names == nullptr);
688 if (!use_current_system)
689 use_current_system = system_names->count(sys_name);
690 if (!use_current_system || sys_ptr->hide_output())
691 continue;
692
693 for (auto vn : make_range(sys_ptr->n_vars()))
694 {
695 if (FEInterface::field_type(sys_ptr->variable_type(vn)) == TYPE_VECTOR)
696 n_vector_vars++;
697 else
698 n_scalar_vars++;
699 }
700 }
701 // Here, we're assuming the number of vector components is the same
702 // as the mesh spatial dimension.
703 nv = n_scalar_vars + dim*n_vector_vars;
704 }
705
706 // Get the number of nodes to store locally.
707 dof_id_type n_local_nodes = cast_int<dof_id_type>
708 (std::distance(_mesh.local_nodes_begin(),
709 _mesh.local_nodes_end()));
710
711 // If node renumbering has been disabled, nodes may not be numbered
712 // contiguously, and the number of nodes might not match the
713 // max_node_id. In this case we just do our best.
714 dof_id_type n_total_nodes = n_local_nodes;
715 _mesh.comm().sum(n_total_nodes);
716
717 const processor_id_type n_proc = _mesh.comm().size();
718 const processor_id_type my_pid = _mesh.comm().rank();
719 const dof_id_type n_gaps = max_nn - n_total_nodes;
720 const dof_id_type gaps_per_processor = n_gaps / n_proc;
721 const dof_id_type remainder_gaps = n_gaps % n_proc;
722
723 n_local_nodes = n_local_nodes + // Actual nodes
724 gaps_per_processor + // Our even share of gaps
725 (my_pid < remainder_gaps); // Leftovers
726
727 // If we've been asked to build added sides' data, we need space to
728 // add it. Keep track of how much space.
729 dof_id_type local_added_side_nodes = 0,
730 added_side_nodes = 0;
731
732 // others_added_side_nodes[p]: local_added_side_nodes on rank p
733 std::vector<dof_id_type> others_added_side_nodes;
734
735 // A map of (element_id, side, side_node) pairs to the corresponding
736 // added side node index.
737 std::map<std::tuple<dof_id_type, unsigned short, unsigned short>,
738 dof_id_type> discontinuous_node_indices;
739
740 // If we don't have any added side nodes, we'll have no offsets from
741 // them, and we won't care about which offsets apply to which node
742 // ids either.
743
744 // Number of true nodes on processors [0,p]
745 std::vector<dof_id_type> true_node_offsets;
746 // Number of added (fake) nodes on processors [0,p)
747 std::vector<dof_id_type> added_node_offsets;
748
749 auto node_id_to_vec_id =
750 [&true_node_offsets, &added_node_offsets]
751 (const dof_id_type node_id)
752 {
753 if (true_node_offsets.empty())
754 return node_id; // O(1) in the common !add_sides case
755
756 // Find the processor id that has node_id in the parallel vec
757 const auto lb = std::upper_bound(true_node_offsets.begin(),
758 true_node_offsets.end(), node_id);
759 libmesh_assert(lb != true_node_offsets.end());
760 const processor_id_type p = lb - true_node_offsets.begin();
761
762 return node_id + added_node_offsets[p];
763 };
764
765 if (add_sides)
766 {
767 true_node_offsets.resize(n_proc);
768 added_node_offsets.resize(n_proc);
769
770 // One loop to count everyone's new side nodes
771 for (const auto & elem : _mesh.active_element_ptr_range())
772 {
773 for (auto s : elem->side_index_range())
774 {
775 if (redundant_added_side(*elem,s))
776 continue;
777
778 const std::vector<unsigned int> side_nodes =
779 elem->nodes_on_side(s);
780
781 if (elem->processor_id() == this->processor_id())
782 local_added_side_nodes += side_nodes.size();
783 }
784 }
785
786 others_added_side_nodes.resize(n_proc);
787 _mesh.comm().allgather(local_added_side_nodes,
788 others_added_side_nodes);
789
790 added_side_nodes = std::accumulate(others_added_side_nodes.begin(),
791 others_added_side_nodes.end(), 0,
792 std::plus<>());
793
794 _mesh.comm().allgather(n_local_nodes, true_node_offsets);
795 for (auto p : make_range(n_proc-1))
796 true_node_offsets[p+1] += true_node_offsets[p];
797 libmesh_assert_equal_to(true_node_offsets[n_proc-1], _mesh.max_node_id());
798
799 // For nodes that exist in the mesh, we just need an offset to
800 // tell where to put their solutions.
801 added_node_offsets[0] = 0;
802 for (auto p : make_range(n_proc-1))
803 added_node_offsets[p+1] =
804 added_node_offsets[p] + others_added_side_nodes[p];
805
806 // For added side nodes, we need to fill a map. Start after all
807 // the true node for our pid plus all the side nodes for
808 // previous pids
809 dof_id_type node_counter = true_node_offsets[my_pid];
810 for (auto p : make_range(my_pid))
811 node_counter += others_added_side_nodes[p];
812
813 // One loop to figure out whose added side nodes get which index
814 for (const auto & elem : _mesh.active_local_element_ptr_range())
815 {
816 for (auto s : elem->side_index_range())
817 {
818 if (redundant_added_side(*elem,s))
819 continue;
820
821 const std::vector<unsigned int> side_nodes =
822 elem->nodes_on_side(s);
823
824 for (auto n : index_range(side_nodes))
825 discontinuous_node_indices
826 [std::make_tuple(elem->id(),s,n)] = node_counter++;
827 }
828 }
829 }
830
831 const dof_id_type
832 n_global_vals = (max_nn + added_side_nodes) * nv,
833 n_local_vals = (n_local_nodes + local_added_side_nodes) * nv;
834
835 // Create a NumericVector to hold the parallel solution
836 std::unique_ptr<NumericVector<Number>> parallel_soln_ptr = NumericVector<Number>::build(_communicator);
837 NumericVector<Number> & parallel_soln = *parallel_soln_ptr;
838 parallel_soln.init(n_global_vals, n_local_vals, false, PARALLEL);
839
840 // Create a NumericVector to hold the "repeat_count" for each node - this is essentially
841 // the number of elements contributing to that node's value
842 std::unique_ptr<NumericVector<Number>> repeat_count_ptr = NumericVector<Number>::build(_communicator);
843 NumericVector<Number> & repeat_count = *repeat_count_ptr;
844 repeat_count.init(n_global_vals, n_local_vals, false, PARALLEL);
845
846 repeat_count.close();
847
848 unsigned int var_num=0;
849
850 // For each system in this EquationSystems object,
851 // update the global solution and if we are on processor 0,
852 // loop over the elements and build the nodal solution
853 // from the element solution. Then insert this nodal solution
854 // into the vector passed to build_solution_vector.
855 for (const auto & [sys_name, sys_ptr] : _systems)
856 {
857 // Check current system is listed in system_names, and skip pos if not
858 bool use_current_system = (system_names == nullptr);
859 if (!use_current_system)
860 use_current_system = system_names->count(sys_name);
861 if (!use_current_system || sys_ptr->hide_output())
862 continue;
863
864 const System & system = *sys_ptr;
865 const unsigned int nv_sys = system.n_vars();
866 const unsigned int sys_num = system.number();
867
868 //Could this be replaced by a/some convenience methods?[PB]
869 unsigned int n_scalar_vars = 0;
870 unsigned int n_vector_vars = 0;
871 for (auto vn : make_range(sys_ptr->n_vars()))
872 {
873 if (FEInterface::field_type(sys_ptr->variable_type(vn)) == TYPE_VECTOR)
874 n_vector_vars++;
875 else
876 n_scalar_vars++;
877 }
878
879 // Here, we're assuming the number of vector components is the same
880 // as the mesh spatial dimension.
881 unsigned int nv_sys_split = n_scalar_vars + dim*n_vector_vars;
882
883 // Update the current_local_solution
884 {
885 System & non_const_sys = const_cast<System &>(system);
886 // We used to simply call non_const_sys.solution->close()
887 // here, but that is not allowed when the solution vector is
888 // locked read-only, for example when printing the solution
889 // during the middle of a solve... So try to be a bit
890 // more careful about calling close() unnecessarily.
891 libmesh_assert(this->comm().verify(non_const_sys.solution->closed()));
892 if (!non_const_sys.solution->closed())
893 non_const_sys.solution->close();
894 non_const_sys.update();
895 }
896
897 NumericVector<Number> & sys_soln(*system.current_local_solution);
898
899 const DofMap & dof_map = system.get_dof_map();
900
901 std::vector<Number> elem_soln; // The finite element solution
902 std::vector<Number> nodal_soln; // The FE solution interpolated to the nodes
903 std::vector<dof_id_type> dof_indices; // The DOF indices for the finite element
904
905 unsigned var_inc = 0;
906 for (unsigned int var=0; var<nv_sys; var++)
907 {
908 const FEType & fe_type = system.variable_type(var);
909 const Variable & var_description = system.variable(var);
910 unsigned int n_vec_dim = FEInterface::n_vec_dim( sys_ptr->get_mesh(), fe_type );
911 const bool add_p_level = fe_type.p_refinement;
912
913 for (const auto & elem : _mesh.active_local_element_ptr_range())
914 {
915 if (var_description.active_on_subdomain(elem->subdomain_id()))
916 {
917 dof_map.dof_indices (elem, dof_indices, var);
918 sys_soln.get(dof_indices, elem_soln);
919
920 FEInterface::nodal_soln (elem->dim(),
921 fe_type,
922 elem,
923 elem_soln,
924 nodal_soln,
925 add_p_level,
926 n_vec_dim);
927
928 // infinite elements should be skipped...
929 if (!elem->infinite())
930 {
931 libmesh_assert_equal_to (nodal_soln.size(), n_vec_dim*elem->n_nodes());
932
933 for (auto n : elem->node_index_range())
934 {
935 const Node & node = elem->node_ref(n);
936
937 const dof_id_type node_idx =
938 nv * node_id_to_vec_id(node.id());
939
940 for (unsigned int d=0; d < n_vec_dim; d++)
941 {
942 // For vector-valued elements, all components are in nodal_soln. For each
943 // node, the components are stored in order, i.e. node_0 -> s0_x, s0_y, s0_z
944 parallel_soln.add(node_idx + (var_inc+d + var_num), nodal_soln[n_vec_dim*n+d]);
945
946 // Increment the repeat count for this position
947 repeat_count.add(node_idx + (var_inc+d + var_num), 1);
948 }
949 }
950
951 if (add_sides)
952 {
953 for (auto s : elem->side_index_range())
954 {
955 if (redundant_added_side(*elem,s))
956 continue;
957
958 // Compute the FE solution at all the
959 // side nodes
961 (fe_type, elem, s, elem_soln,
962 nodal_soln, add_p_level, n_vec_dim);
963
964#ifdef DEBUG
965 const std::vector<unsigned int> side_nodes =
966 elem->nodes_on_side(s);
967
968 libmesh_assert_equal_to
969 (nodal_soln.size(),
970 side_nodes.size());
971#endif
972
973 for (auto n : index_range(nodal_soln))
974 {
975 // Retrieve index into global solution vector.
976 std::size_t node_index =
977 nv * libmesh_map_find(discontinuous_node_indices,
978 std::make_tuple(elem->id(), s, n));
979
980 for (unsigned int d=0; d < n_vec_dim; d++)
981 {
982 parallel_soln.add(node_index + (var_inc+d + var_num), nodal_soln[n_vec_dim*n+d]);
983 repeat_count.add(node_index + (var_inc+d + var_num), 1);
984 }
985 }
986 }
987 }
988 }
989 }
990 else // If this variable doesn't exist on this subdomain we have to still increment repeat_count so that we won't divide by 0 later:
991 for (auto n : elem->node_index_range())
992 {
993 const Node & node = elem->node_ref(n);
994 // Only do this if this variable has NO DoFs at
995 // this node... it might have some from an
996 // adjoining element...
997 if (!node.n_dofs(sys_num, var))
998 {
999 const dof_id_type node_idx =
1000 nv * node_id_to_vec_id(node.id());
1001
1002 for (unsigned int d=0; d < n_vec_dim; d++)
1003 repeat_count.add(node_idx + (var_inc+d + var_num), 1);
1004 }
1005 }
1006
1007 } // end loop over elements
1008 var_inc += n_vec_dim;
1009 } // end loop on variables in this system
1010
1011 var_num += nv_sys_split;
1012 } // end loop over systems
1013
1014 // Sum the nodal solution values and repeat counts.
1015 parallel_soln.close();
1016 repeat_count.close();
1017
1018 // If there were gaps in the node numbering, there will be
1019 // corresponding zeros in the parallel_soln and repeat_count
1020 // vectors. We need to set those repeat_count entries to 1
1021 // in order to avoid dividing by zero.
1022 if (n_gaps)
1023 {
1024 for (numeric_index_type i=repeat_count.first_local_index();
1025 i<repeat_count.last_local_index(); ++i)
1026 {
1027 // repeat_count entries are integral values but let's avoid a
1028 // direct floating point comparison with 0 just in case some
1029 // roundoff noise crept in during vector assembly?
1030 if (std::abs(repeat_count(i)) < TOLERANCE)
1031 repeat_count.set(i, 1.);
1032 }
1033
1034 // Make sure the repeat_count vector is up-to-date on all
1035 // processors.
1036 repeat_count.close();
1037 }
1038
1039 // Divide to get the average value at the nodes
1040 parallel_soln /= repeat_count;
1041
1042 return parallel_soln_ptr;
1043}
processor_id_type size() const
processor_id_type rank() const
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
virtual dof_id_type max_node_id() const =0
uint8_t processor_id_type
Definition id_types.h:104

References libMesh::ParallelObject::_communicator, _mesh, _systems, libMesh::Variable::active_on_subdomain(), libMesh::NumericVector< T >::add(), libMesh::Parallel::Communicator::allgather(), libMesh::NumericVector< T >::build(), libMesh::NumericVector< T >::close(), libMesh::ParallelObject::comm(), libMesh::System::current_local_solution, dim, libMesh::DofMap::dof_indices(), libMesh::FEInterface::field_type(), libMesh::NumericVector< T >::first_local_index(), libMesh::NumericVector< T >::get(), libMesh::System::get_dof_map(), libMesh::DofObject::id(), libMesh::index_range(), libMesh::NumericVector< T >::init(), libMesh::NumericVector< T >::last_local_index(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::MeshBase::max_node_id(), libMesh::DofObject::n_dofs(), libMesh::System::n_vars(), libMesh::FEInterface::n_vec_dim(), libMesh::FEInterface::nodal_soln(), libMesh::System::number(), libMesh::FEType::p_refinement, libMesh::PARALLEL, libMesh::ParallelObject::processor_id(), libMesh::Parallel::Communicator::rank(), redundant_added_side(), libMesh::NumericVector< T >::set(), libMesh::FEInterface::side_nodal_soln(), libMesh::Parallel::Communicator::size(), libMesh::System::solution, libMesh::MeshBase::spatial_dimension(), libMesh::Parallel::Communicator::sum(), libMesh::TOLERANCE, libMesh::TYPE_VECTOR, libMesh::System::update(), libMesh::System::variable(), and libMesh::System::variable_type().

Referenced by build_solution_vector(), and libMesh::MeshOutput< MT >::write_nodal_data().

◆ build_solution_vector() [1/2]

void libMesh::EquationSystems::build_solution_vector ( std::vector< Number > &  soln,
const std::set< std::string > *  system_names = nullptr,
bool  add_sides = false 
) const

Fill the input vector soln with solution values.

The entries will be in node-major format (corresponding to the names from build_variable_names()).

If systems_names!=nullptr, only include data from the specified systems.

If add_sides is true, append data for plotting on "side elements" too.

Definition at line 1047 of file equation_systems.C.

1050{
1051 LOG_SCOPE("build_solution_vector()", "EquationSystems");
1052
1053 // Call the parallel implementation
1054 std::unique_ptr<NumericVector<Number>> parallel_soln =
1055 this->build_parallel_solution_vector(system_names, add_sides);
1056
1057 // Localize the NumericVector into the provided std::vector.
1058 parallel_soln->localize_to_one(soln);
1059}
std::unique_ptr< NumericVector< Number > > build_parallel_solution_vector(const std::set< std::string > *system_names=nullptr, bool add_sides=false) const
A version of build_solution_vector which is appropriate for "parallel" output formats like Nemesis.

References build_parallel_solution_vector().

◆ build_solution_vector() [2/2]

void libMesh::EquationSystems::build_solution_vector ( std::vector< Number > &  soln,
std::string_view  system_name,
std::string_view  variable_name = "all_vars" 
) const

Fill the input vector soln with the solution values for the system named name.

Note
The input vector soln will only be assembled on processor 0, so this method is only applicable to outputting plot files from processor 0.

Definition at line 644 of file equation_systems.C.

647{
648 // TODO:[BSK] re-implement this from the method below
649 libmesh_not_implemented();
650}

Referenced by libMesh::MeshOutput< MT >::write_equation_systems().

◆ build_variable_names()

void libMesh::EquationSystems::build_variable_names ( std::vector< std::string > &  var_names,
const FEType type = nullptr,
const std::set< std::string > *  system_names = nullptr 
) const

Fill the input vector var_names with the names of the variables for each system.

If type is passed, only variables of the specified type will be populated. If systems_names!=nullptr, only include names from the specified systems.

Definition at line 465 of file equation_systems.C.

468{
469 // start indexing at end of possibly non-empty vector of variable names to avoid overwriting them
470 unsigned int var_num = var_names.size();
471
472 // We'll want to double-check that we don't have any naming
473 // conflicts; this API causes problems down the line if so.
474 std::unordered_multiset<std::string> seen_names;
475
476 // Need to size var_names by scalar variables plus all the
477 // vector components for all the vector variables
478 //Could this be replaced by a/some convenience methods?[PB]
479 {
480 unsigned int n_scalar_vars = 0;
481 unsigned int n_vector_vars = 0;
482
483 for (const auto & [sys_name, sys_ptr] : _systems)
484 {
485 // Check current system is listed in system_names, and skip pos if not
486 bool use_current_system = (system_names == nullptr);
487 if (!use_current_system)
488 use_current_system = system_names->count(sys_name);
489 if (!use_current_system || sys_ptr->hide_output())
490 {
491 for (auto vn : make_range(sys_ptr->n_vars()))
492 seen_names.insert(sys_ptr->variable_name(vn));
493 continue;
494 }
495
496 for (auto vn : make_range(sys_ptr->n_vars()))
497 {
498 seen_names.insert(sys_ptr->variable_name(vn));
499 if (FEInterface::field_type(sys_ptr->variable_type(vn)) == TYPE_VECTOR)
500 n_vector_vars++;
501 else
502 n_scalar_vars++;
503 }
504 }
505
506 // Here, we're assuming the number of vector components is the same
507 // as the mesh spatial dimension.
508 unsigned int dim = this->get_mesh().spatial_dimension();
509 unsigned int nv = n_scalar_vars + dim*n_vector_vars;
510
511 // We'd better not have more than dim*this->n_vars() (all vector variables)
512 // Treat the NodeElem-only mesh case as dim=1
513 libmesh_assert_less_equal ( nv, (dim > 0 ? dim : 1)*this->n_vars() );
514
515 // 'nv' represents the max possible number of output variables, so allocate enough memory for
516 // all variables in the system to be populated here. When this is called more than once on a
517 // single 'var_names' vector, different filters should be used such that duplicates don't occur.
518 var_names.resize( nv );
519 }
520
521 for (const auto & [sys_name, sys_ptr] : _systems)
522 {
523 // Check current system is listed in system_names, and skip pos if not
524 bool use_current_system = (system_names == nullptr);
525 if (!use_current_system)
526 use_current_system = system_names->count(sys_name);
527 if (!use_current_system || sys_ptr->hide_output())
528 continue;
529
530 for (auto vn : make_range(sys_ptr->n_vars()))
531 {
532 const std::string & var_name = sys_ptr->variable_name(vn);
533 const FEType & fe_type = sys_ptr->variable_type(vn);
534
535 unsigned int n_vec_dim = FEInterface::n_vec_dim( sys_ptr->get_mesh(), fe_type);
536
537 // Filter on the type if requested
538 if (type == nullptr || (type && *type == fe_type))
539 {
540 if (FEInterface::field_type(fe_type) == TYPE_VECTOR)
541 {
542 switch(n_vec_dim)
543 {
544 case 0:
545 case 1:
546 var_names[var_num++] = var_name;
547 libmesh_error_msg_if(seen_names.count(var_name) > 1,
548 "Duplicate variable name "+var_name);
549 break;
550 case 2:
551 var_names[var_num++] = var_name+"_x";
552 var_names[var_num++] = var_name+"_y";
553 libmesh_error_msg_if(seen_names.count(var_name+"_x"),
554 "Duplicate variable name "+var_name+"_x");
555 libmesh_error_msg_if(seen_names.count(var_name+"_y"),
556 "Duplicate variable name "+var_name+"_y");
557 break;
558 case 3:
559 var_names[var_num++] = var_name+"_x";
560 var_names[var_num++] = var_name+"_y";
561 var_names[var_num++] = var_name+"_z";
562 libmesh_error_msg_if(seen_names.count(var_name+"_x"),
563 "Duplicate variable name "+var_name+"_x");
564 libmesh_error_msg_if(seen_names.count(var_name+"_y"),
565 "Duplicate variable name "+var_name+"_y");
566 libmesh_error_msg_if(seen_names.count(var_name+"_z"),
567 "Duplicate variable name "+var_name+"_z");
568 break;
569 default:
570 libmesh_error_msg("Invalid dim in build_variable_names");
571 }
572 }
573 else
574 var_names[var_num++] = var_name;
575 }
576 }
577 }
578 // Now resize again in case we filtered any names
579 var_names.resize(var_num);
580}
const MeshBase & get_mesh() const

References _systems, dim, libMesh::FEInterface::field_type(), get_mesh(), libMesh::make_range(), n_vars(), libMesh::FEInterface::n_vec_dim(), libMesh::MeshBase::spatial_dimension(), and libMesh::TYPE_VECTOR.

Referenced by main(), EquationSystemsTest::testBadVarNames(), libMesh::ExodusII_IO::write_discontinuous_exodusII(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO::write_element_data_from_discontinuous_nodal_data(), libMesh::MeshOutput< MT >::write_equation_systems(), libMesh::MeshOutput< MT >::write_nodal_data(), and libMesh::Nemesis_IO::write_nodal_data().

◆ clear()

void libMesh::EquationSystems::clear ( )
virtual

Restores the data structure to a pristine state.

Definition at line 69 of file equation_systems.C.

70{
71 // Clear any additional parameters
73
74 // Clear the systems.
75 _systems.clear();
76}
virtual void clear()
Clears internal data structures & frees any allocated memory.
Definition parameters.h:349

References _systems, libMesh::Parameters::clear(), and parameters.

Referenced by libMesh::ExactSolution::attach_exact_derivs(), libMesh::ExactSolution::attach_exact_hessians(), libMesh::ExactSolution::attach_exact_values(), libMesh::ExactSolution::attach_reference_solution(), and main().

◆ comm()

const Parallel::Communicator & libMesh::ParallelObject::comm ( ) const
inlineinherited
Returns
A reference to the Parallel::Communicator object used by this mesh.

Definition at line 97 of file parallel_object.h.

98 { return _communicator; }

References libMesh::ParallelObject::_communicator.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_monitor(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult_add(), libMesh::DofMap::add_constraints_to_send_list(), add_cube_convex_hull_to_mesh(), libMesh::PetscDMWrapper::add_dofs_helper(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::RBEIMEvaluation::add_interpolation_data(), libMesh::CondensedEigenSystem::add_matrices(), libMesh::EigenSystem::add_matrices(), libMesh::System::add_matrix(), libMesh::System::add_matrix(), libMesh::System::add_matrix(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::System::add_vector(), libMesh::MeshTools::Modification::all_tri(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::RBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::assemble_affine_expansion(), libMesh::AdvectionSystem::assemble_claw_rhs(), libMesh::FEMSystem::assemble_qoi(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::MeshCommunication::assign_global_indices(), libMesh::Partitioner::assign_partitioning(), libMesh::MeshTools::Generation::build_extrusion(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::build_node_list_from_side_list(), build_parallel_elemental_solution_vector(), build_parallel_solution_vector(), libMesh::PetscDMWrapper::build_section(), libMesh::PetscDMWrapper::build_sf(), libMesh::MeshBase::cache_elem_data(), libMesh::DofMap::check_dirichlet_bcid_consistency(), libMesh::MeshTetInterface::check_hull_integrity(), libMesh::MeshBase::complete_preparation(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::RBSCMConstruction::compute_SCM_bounds_on_training_set(), libMesh::DofMap::computed_sparsity_already(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), PetscSolverConfiguration::configure_solver(), libMesh::ContinuationSystem::ContinuationSystem(), libMesh::MeshBase::copy_constraint_rows(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::CondensedEigenSystem::copy_super_to_sub(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::MeshTools::create_bounding_box(), libMesh::DofMap::create_dof_constraints(), libMesh::MeshTools::create_nodal_bounding_box(), libMesh::MeshRefinement::create_parent_error_vector(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::MeshTools::create_subdomain_bounding_box(), libMesh::PetscMatrix< T >::create_submatrix_nosort(), create_wrapped_function(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::MeshBase::detect_interior_parents(), libMesh::RBEIMEvaluation::distribute_bfs(), DMlibMeshFunction(), DMlibMeshJacobian(), DMlibMeshSetSystem_libMesh(), DMVariableBounds_libMesh(), libMesh::DTKSolutionTransfer::DTKSolutionTransfer(), libMesh::MeshRefinement::eliminate_unrefined_patches(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_nodes(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_sides(), libMesh::TransientRBConstruction::enrich_RB_space(), libMesh::EpetraVector< T >::EpetraVector(), AssembleOptimization::equality_constraints(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::SmoothnessEstimator::estimate_smoothness(), libMesh::MeshRefinement::flag_elements_by_elem_fraction(), libMesh::MeshRefinement::flag_elements_by_error_fraction(), libMesh::MeshRefinement::flag_elements_by_error_tolerance(), libMesh::MeshRefinement::flag_elements_by_mean_stddev(), libMesh::MeshRefinement::flag_elements_by_nelem_target(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::DofMap::gather_constraints(), libMesh::MeshfreeInterpolation::gather_remote_data(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::RBEIMEvaluation::get_eim_basis_function_node_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_side_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_value(), libMesh::MeshBase::get_info(), libMesh::RBEIMEvaluation::get_interior_basis_functions_as_vecs(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::RBEIMConstruction::get_max_abs_value(), libMesh::RBEIMConstruction::get_node_max_abs_value(), libMesh::RBEIMEvaluation::get_parametrized_function_node_value(), libMesh::RBEIMEvaluation::get_parametrized_function_side_value(), libMesh::RBEIMEvaluation::get_parametrized_function_value(), libMesh::RBEIMConstruction::get_random_point(), libMesh::RBEIMConstruction::get_random_point(), libMesh::RBEIMConstruction::get_random_point(), libMesh::MeshTetInterface::improve_hull_integrity(), AssembleOptimization::inequality_constraints(), AssembleOptimization::inequality_constraints_jacobian(), libMesh::StaticCondensation::init(), libMesh::TimeSolver::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::LocationMap< T >::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), ElasticitySystem::init_data(), libMesh::AdvectionSystem::init_data(), libMesh::ClawSystem::init_data(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), libMesh::RBEIMConstruction::initialize_parametrized_functions_in_training_set(), libMesh::RBEIMConstruction::inner_product(), integrate_function(), libMesh::MeshTools::Modification::interpolate_surface(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_equal_connectivity(), libMesh::MeshTools::libmesh_assert_equal_points(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_constraint_rows(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_flags(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_p_levels(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::MeshTools::libmesh_assert_valid_unique_ids(), libMesh::libmesh_petsc_linesearch_shellfunc(), libMesh::libmesh_petsc_preconditioner_apply(), libMesh::libmesh_petsc_snes_mffd_interface(), libMesh::libmesh_petsc_snes_postcheck(), libMesh::MeshRefinement::limit_level_mismatch_at_edge(), libMesh::MeshRefinement::limit_level_mismatch_at_node(), libMesh::MeshRefinement::limit_overrefined_boundary(), libMesh::MeshRefinement::limit_underrefined_boundary(), libMesh::LinearImplicitSystem::LinearImplicitSystem(), main(), libMesh::MeshCommunication::make_elems_parallel_consistent(), libMesh::MeshCommunication::make_new_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_new_nodes_parallel_consistent(), libMesh::MeshCommunication::make_node_bcids_parallel_consistent(), libMesh::MeshCommunication::make_node_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_unique_ids_parallel_consistent(), libMesh::MeshCommunication::make_nodes_parallel_consistent(), libMesh::MeshCommunication::make_p_levels_parallel_consistent(), libMesh::TransientRBConstruction::mass_matrix_scaled_matvec(), libMesh::FEMSystem::mesh_position_set(), libMesh::TriangulatorInterface::MeshedHole::MeshedHole(), LinearElasticityWithContact::move_mesh(), libMesh::DistributedMesh::n_active_elem(), libMesh::MeshTools::n_active_levels(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::MeshTools::n_connected_components(), libMesh::DofMap::n_constrained_dofs(), libMesh::MeshBase::n_constraint_rows(), libMesh::DofMap::n_dofs(), libMesh::DofMap::n_dofs_per_processor(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::CondensedEigenSystem::n_global_non_condensed_dofs(), libMesh::MeshTools::n_levels(), MixedOrderTest::n_neighbor_links(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::SparsityPattern::Build::n_nonzeros(), libMesh::MeshTools::n_p_levels(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_distribute_bfs(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::RBEIMConstruction::node_inner_product(), libMesh::PetscVector< T >::operator=(), libMesh::MeshBase::operator==(), libMesh::DistributedMesh::parallel_max_elem_id(), libMesh::DistributedMesh::parallel_max_node_id(), libMesh::DistributedMesh::parallel_max_unique_id(), libMesh::ReplicatedMesh::parallel_max_unique_id(), libMesh::DistributedMesh::parallel_n_elem(), libMesh::DistributedMesh::parallel_n_nodes(), libMesh::SparsityPattern::Build::parallel_sync(), libMesh::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::MeshTools::paranoid_n_levels(), libMesh::Partitioner::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::petsc_auto_fieldsplit(), LaplaceSystem::postprocess(), PoissonSystem::postprocess(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::Partitioner::processor_pairs_to_interface_nodes(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::XdrIO::read(), libMesh::Nemesis_IO::read(), FEMParameters::read(), read(), libMesh::CheckpointIO::read_header(), libMesh::ExodusII_IO::read_header(), libMesh::System::read_header(), libMesh::XdrIO::read_header(), libMesh::RBEIMEvaluation::read_in_interior_basis_functions(), libMesh::RBEIMEvaluation::read_in_node_basis_functions(), libMesh::RBEIMEvaluation::read_in_side_basis_functions(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::Nemesis_IO_Helper::read_var_names_impl(), MeshFunctionTest::read_variable_info_from_output_data(), libMesh::MeshBase::recalculate_n_partitions(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::StaticCondensationDofMap::reinit(), libMesh::BoundaryInfo::remove_edge_id(), libMesh::BoundaryInfo::remove_node_id(), libMesh::BoundaryInfo::remove_shellface_id(), libMesh::BoundaryInfo::remove_side_id(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), LinearElasticityWithContact::residual_and_jacobian(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), scale_mesh_and_plot(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::send_and_insert_dof_values(), libMesh::TransientRBConstruction::set_error_temporal_data(), libMesh::Partitioner::set_interface_node_processor_ids_BFS(), libMesh::Partitioner::set_interface_node_processor_ids_linear(), libMesh::Partitioner::set_interface_node_processor_ids_petscpartitioner(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::Partitioner::set_parent_processor_ids(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::PetscDiffSolver::setup_petsc_data(), libMesh::RBEIMEvaluation::side_distribute_bfs(), libMesh::RBEIMEvaluation::side_gather_bfs(), libMesh::RBEIMConstruction::side_inner_product(), libMesh::Partitioner::single_partition(), libMesh::LaplaceMeshSmoother::smooth(), libMesh::VariationalMeshSmoother::smooth(), libMesh::NoxNonlinearSolver< Number >::solve(), libMesh::ClawSystem::solve_conservation_law(), libMesh::split_mesh(), libMesh::RBEIMConstruction::store_eim_solutions_for_training_set(), libMesh::MeshBase::subdomain_ids(), libMesh::BoundaryInfo::sync(), libMesh::MeshBase::sync_subdomain_name_map(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), ExodusC0PolyhedronTest::test_write_and_read_hexagonal_prism(), ExodusC0PolygonTest::test_write_and_read_pentagon(), DofMapTest::testBadElemFECombo(), SystemsTest::testBlockRestrictedVarNDofs(), BoundaryInfoTest::testBoundaryOnChildrenErrors(), CheckpointIOTest::testC0PolygonCheckpoint(), VolumeTest::testC0PolygonMethods(), CheckpointIOTest::testC0PolyhedronCheckpoint(), VolumeTest::testC0PolyhedronMethods(), ConstraintOperatorTest::testCoreform(), ConnectedComponentsTest::testEdge(), MeshInputTest::testExodusIGASidesets(), MeshTriangulationTest::testFoundCenters(), PointLocatorTest::testLocator(), BoundaryInfoTest::testMesh(), BoundaryMeshSubdomainTest::testPerBoundarySubdomain(), PointLocatorTest::testPlanar(), MeshTriangulationTest::testPoly2TriEdge3ToTri7CenterFixup(), MeshTriangulationTest::testPoly2TriRefinementBase(), SystemsTest::testProjectCubeWithMeshFunction(), SystemsTest::testProjectScalarCoarsening(), BoundaryInfoTest::testRenumber(), BoundaryInfoTest::testSelectiveRenumber(), BoundaryMeshSubdomainTest::testSingleSubdomain(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshTriangulationTest::testTriangulatorInterp(), MeshTriangulationTest::testTriangulatorMeshedHoles(), MeshTriangulationTest::testTriangulatorRoundHole(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::Poly2TriTriangulator::triangulate(), libMesh::RBConstruction::truth_assembly(), libMesh::TransientRBConstruction::truth_assembly(), update_current_local_solution(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::XdrIO::write(), libMesh::NameBasedIO::write(), libMesh::VTKIO::write_nodal_data(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), libMesh::RBEvaluation::write_out_vectors(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::TransientRBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::RBDataSerialization::RBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::TransientRBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::RBEIMEvaluationSerialization::write_to_file(), and libMesh::RBDataSerialization::RBSCMEvaluationSerialization::write_to_file().

◆ compare()

bool libMesh::EquationSystems::compare ( const EquationSystems other_es,
const Real  threshold,
const bool  verbose 
) const
virtual
Returns
true when this equation system contains identical data, up to the given threshold. Delegates most of the comparisons to perform to the responsible systems

Definition at line 1731 of file equation_systems.C.

1734{
1735 // safety check, whether we handle at least the same number
1736 // of systems
1737 std::vector<bool> os_result;
1738
1739 if (this->n_systems() != other_es.n_systems())
1740 {
1741 if (verbose)
1742 {
1743 libMesh::out << " Fatal difference. This system handles "
1744 << this->n_systems() << " systems," << std::endl
1745 << " while the other system handles "
1746 << other_es.n_systems()
1747 << " systems." << std::endl
1748 << " Aborting comparison." << std::endl;
1749 }
1750 return false;
1751 }
1752 else
1753 {
1754 // start comparing each system
1755 for (const auto & [sys_name, sys_ptr] : _systems)
1756 {
1757 // get the other system
1758 const System & other_system = other_es.get_system (sys_name);
1759
1760 os_result.push_back (sys_ptr->compare (other_system, threshold, verbose));
1761
1762 }
1763
1764 }
1765
1766
1767 // sum up the results
1768 if (os_result.size()==0)
1769 return true;
1770 else
1771 {
1772 bool os_identical;
1773 unsigned int n = 0;
1774 do
1775 {
1776 os_identical = os_result[n];
1777 n++;
1778 }
1779 while (os_identical && n<os_result.size());
1780 return os_identical;
1781 }
1782}
OStreamProxy out

References get_system(), n_systems(), and libMesh::out.

Referenced by do_compare().

◆ disable_print_counter_info()

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

101{
102 _enable_print_counter = false;
103 return;
104}
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called.

References libMesh::ReferenceCounter::_enable_print_counter.

◆ disable_refine_in_reinit()

void libMesh::EquationSystems::disable_refine_in_reinit ( )
inline

Calls to reinit() will not try to coarsen or refine the mesh.

Definition at line 585 of file equation_systems.h.

585{ this->_refine_in_reinit = false; }

References _refine_in_reinit.

Referenced by EquationSystemsTest::testRefineThenReinitPreserveFlags(), and EquationSystemsTest::testSelectivePRefine().

◆ enable_default_ghosting()

void libMesh::EquationSystems::enable_default_ghosting ( bool  enable)
virtual

Enable or disable default ghosting functors on the Mesh and on all Systems.

Standard ghosting is enabled by default. If disabled, default ghosting will also be disabled on any later added systems.

Unless other equivalent ghosting functors have been added, removing the default coupling functor is only safe for explicit solves, and removing the default algebraic ghosting functor is only safe for codes where no evaluations on neighbor cells (e.g. no jump error estimators) are done.

Definition at line 320 of file equation_systems.C.

321{
323 MeshBase &mesh = this->get_mesh();
324
325 if (enable)
326 mesh.add_ghosting_functor(mesh.default_ghosting());
327 else
328 mesh.remove_ghosting_functor(mesh.default_ghosting());
329
330 for (auto i : make_range(this->n_systems()))
331 {
332 DofMap & dof_map = this->get_system(i).get_dof_map();
333 if (enable)
334 dof_map.add_default_ghosting();
335 else
336 dof_map.remove_default_ghosting();
337 }
338}
MeshBase & mesh

References _enable_default_ghosting, libMesh::DofMap::add_default_ghosting(), get_mesh(), get_system(), libMesh::make_range(), mesh, n_systems(), and libMesh::DofMap::remove_default_ghosting().

Referenced by EquationSystemsTest::testDisableDefaultGhosting().

◆ enable_print_counter_info()

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

Methods to enable/disable the reference counter output from print_info().

Enabled by default.

Definition at line 94 of file reference_counter.C.

95{
97 return;
98}

References libMesh::ReferenceCounter::_enable_print_counter.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ enable_refine_in_reinit()

void libMesh::EquationSystems::enable_refine_in_reinit ( )
inline

Calls to reinit() will also do two-step coarsen-then-refine.

Definition at line 580 of file equation_systems.h.

580{ this->_refine_in_reinit = true; }

References _refine_in_reinit.

◆ find_elemental_data_variable_numbers()

std::vector< std::pair< unsigned int, unsigned int > > libMesh::EquationSystems::find_elemental_data_variable_numbers ( std::vector< std::string > &  names) const

Finds system and variable numbers for variables that can be represented as elemental data.

See find_variable_numbers() for name filtering, component decomposition, and sorting details.

Definition at line 1132 of file equation_systems.C.

1133{
1136}
std::vector< std::pair< unsigned int, unsigned int > > find_variable_numbers_by_predicate(std::vector< std::string > &names, const std::function< bool(const FEType &)> &type_filter) const
Implementation detail for find_variable_numbers() variants.

References find_variable_numbers_by_predicate(), and is_elemental_data_fe_type().

Referenced by build_parallel_elemental_solution_vector(), and libMesh::Nemesis_IO::write_element_data().

◆ find_variable_numbers()

std::vector< std::pair< unsigned int, unsigned int > > libMesh::EquationSystems::find_variable_numbers ( std::vector< std::string > &  names,
const FEType type = nullptr,
const std::vector< FEType > *  types = nullptr 
) const

Finds system and variable numbers for any variables of 'type' or of 'types' corresponding to the entries in the input 'names' vector.

If 'names' is empty, this returns all variables of the type. The names of vector variables are decomposed into individual ones suffixed with their cartesian component, but there will still be a single pair of system numbers for such vector variables. Thus, the size of the 'names' vector modified by this function may not be equal to that of the returned vector of pairs. Nevertheless, both should be sorted in accordance with ExodusII format, and so the developer just needs to know to separate dof_indices when accessing the system solution for vector variables.

This function is designed to work for either a single type or a vector of types, but not both. This is because it can't simply be called a second time with another type as it filters (deletes) the names of those on the first call that used a different type. Thus, the 'types' argument is for the case where variables of multiple types are allowed to pass through.

TODO: find a more generic way to handle this whole procedure.

Definition at line 1107 of file equation_systems.C.

1109{
1110 // Resolve class of type input and assert that at least one of them is null
1111 libmesh_assert_msg(!type || !types,
1112 "Input 'type', 'types', or neither in find_variable_numbers, but not both.");
1113
1114 std::vector<FEType> type_filter;
1115 if (type)
1116 type_filter.push_back(*type);
1117 else if (types)
1118 type_filter = *types;
1119
1121 (names,
1122 [&type_filter](const FEType & var_type)
1123 {
1124 return type_filter.empty() ||
1125 std::find(type_filter.begin(), type_filter.end(), var_type) != type_filter.end();
1126 });
1127}

References find_variable_numbers_by_predicate().

Referenced by libMesh::Nemesis_IO::write_nodal_data().

◆ find_variable_numbers_by_predicate()

std::vector< std::pair< unsigned int, unsigned int > > libMesh::EquationSystems::find_variable_numbers_by_predicate ( std::vector< std::string > &  names,
const std::function< bool(const FEType &)> &  type_filter 
) const
private

Implementation detail for find_variable_numbers() variants.

Definition at line 1141 of file equation_systems.C.

1144{
1145 // This function must be run on all processors at once
1146 parallel_object_only();
1147
1148 libmesh_assert (this->n_systems());
1149
1150 // Store a copy of the valid variable names, if any. The names vector will be repopulated with any
1151 // valid names (or all if 'is_names_empty') in the system that passes through the type filter. If
1152 // the variable is a vector, its name will be decomposed into its separate components in
1153 // accordance with build_variable_names().
1154 std::vector<std::string> name_filter = names;
1155 bool is_names_empty = name_filter.empty();
1156 names.clear();
1157
1158 // initialize convenience variables
1159 FEType var_type;
1160 std::string name;
1161
1162 const std::vector<std::string> component_suffix = {"_x", "_y", "_z"};
1163 unsigned int dim = _mesh.spatial_dimension();
1164 libmesh_error_msg_if(dim > 3, "Invalid dim in find_variable_numbers");
1165
1166 // Now filter through the variables in each system and store the system index and their index
1167 // within that system. This way, we know where to find their data even after we sort them.
1168 std::vector<std::pair<unsigned int, unsigned int>> var_nums;
1169
1170 for (const auto & pr : _systems)
1171 {
1172 const System & system = *(pr.second);
1173
1174 for (auto var : make_range(system.n_vars()))
1175 {
1176 // apply the type filter
1177 var_type = system.variable_type(var);
1178 if (!type_filter(var_type))
1179 continue;
1180
1181 // apply the name filter (note that all variables pass if it is empty)
1182 if (FEInterface::field_type(var_type) == TYPE_VECTOR)
1183 {
1184 std::vector<std::string> component_names;
1185 for (unsigned int comp = 0; comp < dim; ++comp)
1186 {
1187 name = system.variable_name(var) + component_suffix[comp];
1188 if (is_names_empty ||
1189 (std::find(name_filter.begin(), name_filter.end(), name) != name_filter.end()))
1190 component_names.push_back(name);
1191 }
1192
1193 if (! component_names.empty())
1194 names.insert(names.end(), component_names.begin(), component_names.end());
1195 else
1196 continue;
1197 }
1198 else /*scalar-valued variable*/
1199 {
1200 name = system.variable_name(var);
1201 if (is_names_empty ||
1202 (std::find(name_filter.begin(), name_filter.end(), name) != name_filter.end()))
1203 names.push_back(name);
1204 else
1205 continue;
1206 }
1207
1208 // if the variable made it through both filters get its system indices
1209 var_nums.emplace_back(system.number(), var);
1210 }
1211 }
1212
1213 // Sort the var_nums vector pairs alphabetically based on the variable name
1214 std::vector<unsigned int> sort_index(var_nums.size());
1215 std::iota(sort_index.begin(), sort_index.end(), 0);
1216 std::sort(sort_index.begin(), sort_index.end(),
1217 [&](const unsigned int & lhs, const unsigned int & rhs)
1218 {return this->get_system(var_nums[lhs].first).variable_name(var_nums[lhs].second) <
1219 this->get_system(var_nums[rhs].first).variable_name(var_nums[rhs].second);});
1220
1221 std::vector<std::pair<unsigned int, unsigned int>> var_nums_sorted(var_nums.size());
1222 for (auto i : index_range(var_nums_sorted))
1223 {
1224 var_nums_sorted[i].first = var_nums[sort_index[i]].first;
1225 var_nums_sorted[i].second = var_nums[sort_index[i]].second;
1226 }
1227
1228 // Also sort the names vector
1229 std::sort(names.begin(), names.end());
1230
1231 // Return the sorted vector pairs
1232 return var_nums_sorted;
1233}

References _mesh, _systems, dim, libMesh::FEInterface::field_type(), libMesh::index_range(), libMesh::libmesh_assert(), libMesh::make_range(), n_systems(), libMesh::System::n_vars(), libMesh::System::number(), libMesh::MeshBase::spatial_dimension(), libMesh::TYPE_VECTOR, libMesh::System::variable_name(), and libMesh::System::variable_type().

Referenced by find_elemental_data_variable_numbers(), and find_variable_numbers().

◆ get_info() [1/2]

std::string libMesh::ReferenceCounter::get_info ( )
staticinherited

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

48{
49#if defined(LIBMESH_ENABLE_REFERENCE_COUNTING) && defined(DEBUG)
50
51 std::ostringstream oss;
52
53 oss << '\n'
54 << " ---------------------------------------------------------------------------- \n"
55 << "| Reference count information |\n"
56 << " ---------------------------------------------------------------------------- \n";
57
58 for (const auto & [name, cd] : _counts)
59 oss << "| " << name << " reference count information:\n"
60 << "| Creations: " << cd.first << '\n'
61 << "| Destructions: " << cd.second << '\n';
62
63 oss << " ---------------------------------------------------------------------------- \n";
64
65 return oss.str();
66
67#else
68
69 return "";
70
71#endif
72}
static Counts _counts
Actually holds the data.

References libMesh::ReferenceCounter::_counts.

Referenced by libMesh::ReferenceCounter::print_info().

◆ get_info() [2/2]

std::string libMesh::EquationSystems::get_info ( ) const
virtual
Returns
A string containing information about the systems, flags, and parameters.

Definition at line 1786 of file equation_systems.C.

1787{
1788 std::ostringstream oss;
1789
1790 unsigned int n_hidden_sys = 0;
1791 for (auto & pr : _systems)
1792 n_hidden_sys += pr.second->hide_output();
1793
1794 oss << " EquationSystems\n"
1795 << " n_systems()=" << this->n_systems()
1796 << (n_hidden_sys ? " (hidden: " + std::to_string(n_hidden_sys) + ")" : "")
1797 << "\n";
1798
1799 // Print the info for the individual systems
1800 for (const auto & pr : _systems)
1801 if (!pr.second->hide_output())
1802 oss << pr.second->get_info();
1803
1804
1805 // // Possibly print the parameters
1806 // if (!this->parameters.empty())
1807 // {
1808 // oss << " n_parameters()=" << this->n_parameters() << '\n';
1809 // oss << " Parameters:\n";
1810
1811 // for (const auto & [key, val] : _parameters)
1812 // oss << " "
1813 // << "\""
1814 // << key
1815 // << "\""
1816 // << "="
1817 // << val
1818 // << '\n';
1819 // }
1820
1821 return oss.str();
1822}
virtual std::string get_info() const

◆ get_mesh() [1/2]

MeshBase & libMesh::EquationSystems::get_mesh ( )
inline
Returns
A reference to the mesh

Definition at line 673 of file equation_systems.h.

674{
675 return _mesh;
676}

References _mesh.

◆ get_mesh() [2/2]

const MeshBase & libMesh::EquationSystems::get_mesh ( ) const
inline
Returns
A constant reference to the mesh

Definition at line 665 of file equation_systems.h.

666{
667 return _mesh;
668}

References _mesh.

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), alternative_fe_assembly(), LinearElasticity::assemble(), assemble(), assemble(), assemble_1D(), assemble_biharmonic(), assemble_cd(), assemble_cd(), assemble_divgrad(), assemble_elasticity(), assemble_ellipticdg(), assemble_func(), assemble_graddiv(), assemble_helmholtz(), assemble_laplace(), assemble_mass(), assemble_matrices(), assemble_matrix_and_rhs(), assemble_poisson(), assemble_poisson(), assemble_poisson(), assemble_SchroedingerEquation(), assemble_shell(), assemble_shell(), assemble_stokes(), assemble_temperature_jump(), assemble_wave(), assemble_wave(), assembly_with_dg_fem_context(), build_variable_names(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), compute_stresses(), enable_default_ghosting(), libMesh::AdjointRefinementEstimator::estimate_error(), fe_assembly(), fill_dirichlet_bc(), libMesh::MeshFunction::init(), LargeDeformationElasticity::jacobian(), LaplaceYoung::jacobian(), periodic_bc_test_poisson(), read(), reinit_solutions(), LargeDeformationElasticity::residual(), LaplaceYoung::residual(), run_timestepping(), scale_mesh_and_plot(), libMesh::DirectSolutionTransfer::transfer(), libMesh::DTKSolutionTransfer::transfer(), libMesh::MeshfreeSolutionTransfer::transfer(), transform_mesh_and_plot(), write(), libMesh::MeshOutput< MT >::write_equation_systems(), libMesh::Nemesis_IO_Helper::write_nodal_solution(), write_output(), write_output(), write_output(), and write_output_solvedata().

◆ get_system() [1/8]

template<typename T_sys >
T_sys & libMesh::EquationSystems::get_system ( const unsigned int  num)
inline
Returns
A writable reference to the system number num. The template argument defines the return type. For example, const SteadySystem & sys = eq.get_system<SteadySystem> (0); is an example of how the method might be used

Definition at line 754 of file equation_systems.h.

755{
756 libmesh_assert_less (num, this->n_systems());
757
758 for (auto & pr : _systems)
759 {
760 auto & sys_ptr = pr.second;
761 if (sys_ptr->number() == num)
762 return cast_ref<T_sys &>(*sys_ptr);
763 }
764
765 // Error if we made it here
766 libmesh_error_msg("ERROR: no system number " << num << " found!");
767}

References _systems, and n_systems().

◆ get_system() [2/8]

System & libMesh::EquationSystems::get_system ( const unsigned int  num)
inline
Returns
A writable reference to the system number num.

Definition at line 838 of file equation_systems.h.

839{
840 return this->get_system<System>(num);
841}

◆ get_system() [3/8]

template<typename T_sys >
const T_sys & libMesh::EquationSystems::get_system ( const unsigned int  num) const
inline
Returns
A constant reference to system number num. The template argument defines the return type. For example, const SteadySystem & sys = eq.get_system<SteadySystem> (0); is an example of how the method might be used

Definition at line 735 of file equation_systems.h.

736{
737 libmesh_assert_less (num, this->n_systems());
738
739 for (auto & pr : _systems)
740 {
741 const auto & sys_ptr = pr.second;
742 if (sys_ptr->number() == num)
743 return cast_ref<const T_sys &>(*sys_ptr);
744 }
745 // Error if we made it here
746 libmesh_error_msg("ERROR: no system number " << num << " found!");
747}

References _systems, and n_systems().

◆ get_system() [4/8]

const System & libMesh::EquationSystems::get_system ( const unsigned int  num) const
inline
Returns
A constant reference to system number num.

Definition at line 830 of file equation_systems.h.

831{
832 return this->get_system<System>(num);
833}

◆ get_system() [5/8]

template<typename T_sys >
T_sys & libMesh::EquationSystems::get_system ( std::string_view  name)
inline
Returns
A writable reference to the system named name. The template argument defines the return type. For example, const SteadySystem & sys = eq.get_system<SteadySystem> ("sys"); is an example of how the method might be used

Definition at line 795 of file equation_systems.h.

796{
797 auto pos = _systems.find(name);
798
799 // Check for errors
800 libmesh_error_msg_if(pos == _systems.end(), "ERROR: no system named " << name << " found!");
801
802 // Attempt dynamic cast
803 auto & sys_ptr = pos->second;
804 return cast_ref<T_sys &>(*sys_ptr);
805}

References _systems.

◆ get_system() [6/8]

System & libMesh::EquationSystems::get_system ( std::string_view  name)
inline
Returns
A writable reference to the system named name.

Definition at line 822 of file equation_systems.h.

823{
824 return this->get_system<System>(name);
825}

◆ get_system() [7/8]

template<typename T_sys >
const T_sys & libMesh::EquationSystems::get_system ( std::string_view  name) const
inline
Returns
A constant reference to the system named name. The template argument defines the return type. For example, const SteadySystem & sys = eq.get_system<SteadySystem> ("sys"); is an example of how the method might be used

Definition at line 776 of file equation_systems.h.

777{
778 auto pos = _systems.find(name);
779
780 // Check for errors
781 libmesh_error_msg_if(pos == _systems.end(), "ERROR: no system named \"" << name << "\" found!");
782
783 // Attempt dynamic cast
784 const auto & sys_ptr = pos->second;
785 return cast_ref<const T_sys &>(*sys_ptr);
786}

References _systems.

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), add_M_C_K_helmholtz(), libMesh::EnsightIO::add_scalar(), libMesh::RBSCMConstruction::add_scaled_symm_Aq(), add_system(), libMesh::EnsightIO::add_vector(), libMesh::EnsightIO::add_vector(), adjoint_solve(), allgather(), alternative_fe_assembly(), apply_initial(), LinearElasticity::assemble(), assemble(), assemble(), assemble_1D(), assemble_biharmonic(), assemble_cd(), assemble_cd(), assemble_divgrad(), assemble_elasticity(), assemble_ellipticdg(), assemble_func(), assemble_graddiv(), assemble_helmholtz(), assemble_laplace(), assemble_mass(), assemble_matrices(), assemble_matrix_and_rhs(), assemble_poisson(), assemble_poisson(), assemble_poisson(), assemble_SchroedingerEquation(), assemble_shell(), assemble_shell(), assemble_stokes(), assemble_temperature_jump(), assemble_wave(), assemble_wave(), assembly_with_dg_fem_context(), libMesh::ExactSolution::attach_exact_deriv(), libMesh::ExactSolution::attach_exact_hessian(), libMesh::ExactSolution::attach_exact_value(), build_parallel_elemental_solution_vector(), compare(), libMesh::ExactSolution::compute_error(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), LinearElasticityWithContact::compute_stresses(), compute_stresses(), libMesh::GMVIO::copy_nodal_solution(), SolidSystem::element_time_derivative(), enable_default_ghosting(), libMesh::ExactSolution::error_norm(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::ErrorEstimator::estimate_errors(), libMesh::ErrorEstimator::estimate_errors(), libMesh::ExactSolution::ExactSolution(), fe_assembly(), fill_dirichlet_bc(), libMesh::DTKAdapter::find_sys(), form_functionA(), form_functionB(), form_matrixA(), init(), init_cd(), SolidSystem::init_data(), init_sys(), initialize(), LargeDeformationElasticity::jacobian(), LaplaceYoung::jacobian(), line_print(), libMesh::RBSCMConstruction::load_matrix_B(), main(), libMesh::RBSCMConstruction::perform_SCM_greedy(), periodic_bc_test_poisson(), read(), MeshFunctionTest::read_variable_info_from_output_data(), reinit_mesh(), reinit_solutions(), reinit_systems(), LargeDeformationElasticity::residual(), LaplaceYoung::residual(), run_timestepping(), SolidSystem::save_initial_mesh(), sensitivity_solve(), set_initial_condition(), SolidSystem::side_time_derivative(), solve(), MixedDimensionMeshTest::testDofOrdering(), MixedDimensionRefinedMeshTest::testDofOrdering(), MixedDimensionNonUniformRefinement::testDofOrdering(), MixedDimensionNonUniformRefinementTriangle::testDofOrdering(), MixedDimensionNonUniformRefinement3D::testDofOrdering(), SlitMeshRefinedSystemTest::testRestart(), update(), libMesh::Nemesis_IO_Helper::write_element_values(), libMesh::Nemesis_IO_Helper::write_nodal_solution(), libMesh::EnsightIO::write_scalar_ascii(), and libMesh::EnsightIO::write_vector_ascii().

◆ get_system() [8/8]

const System & libMesh::EquationSystems::get_system ( std::string_view  name) const
inline
Returns
A constant reference to the system named name.

Definition at line 814 of file equation_systems.h.

815{
816 return this->get_system<System>(name);
817}

◆ get_vars_active_subdomains()

void libMesh::EquationSystems::get_vars_active_subdomains ( const std::vector< std::string > &  names,
std::vector< std::set< subdomain_id_type > > &  vars_active_subdomains 
) const

Retrieve vars_active_subdomains, which indicates the active subdomains for each variable in names.

Definition at line 1063 of file equation_systems.C.

1065{
1066 vars_active_subdomains.clear();
1067 vars_active_subdomains.resize(names.size());
1068
1069 for (const auto & pr : _systems)
1070 {
1071 const auto & sys_ptr = pr.second;
1072 for (auto vn : make_range(sys_ptr->n_vars()))
1073 {
1074 const std::string & var_name = sys_ptr->variable_name(vn);
1075
1076 auto names_it = std::find(names.begin(), names.end(), var_name);
1077 if(names_it != names.end())
1078 {
1079 const Variable & variable = sys_ptr->variable(vn);
1080 const std::set<subdomain_id_type> & active_subdomains = variable.active_subdomains();
1081 vars_active_subdomains[std::distance(names.begin(), names_it)] = active_subdomains;
1082 }
1083 }
1084 }
1085}

References _systems, libMesh::Variable::active_subdomains(), and libMesh::make_range().

Referenced by libMesh::ExodusII_IO::write_element_data(), libMesh::Nemesis_IO::write_element_data(), and libMesh::ExodusII_IO::write_element_data_from_discontinuous_nodal_data().

◆ has_system()

bool libMesh::EquationSystems::has_system ( std::string_view  name) const
inline
Returns
true if the system named name exists within this EquationSystems object.

Definition at line 723 of file equation_systems.h.

724{
725 if (_systems.find(name) == _systems.end())
726 return false;
727 return true;
728}

References _systems.

Referenced by libMesh::EnsightIO::add_scalar(), libMesh::EnsightIO::add_vector(), libMesh::EnsightIO::add_vector(), libMesh::ExactSolution::compute_error(), libMesh::ExactSolution::error_norm(), and main().

◆ increment_constructor_count()

void libMesh::ReferenceCounter::increment_constructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the construction counter.

Should be called in the constructor of any derived class that will be reference counted.

Definition at line 183 of file reference_counter.h.

184{
185 libmesh_try
186 {
187 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
188 std::pair<unsigned int, unsigned int> & p = _counts[name];
189 p.first++;
190 }
191 libmesh_catch (...)
192 {
193 auto stream = libMesh::err.get();
194 stream->exceptions(stream->goodbit); // stream must not throw
195 libMesh::err << "Encountered unrecoverable error while calling "
196 << "ReferenceCounter::increment_constructor_count() "
197 << "for a(n) " << name << " object." << std::endl;
198 std::terminate();
199 }
200}
streamT * get()
Rather than implement every ostream/ios/ios_base function, we'll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition threads.C:30
OStreamProxy err

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), and libMesh::ReferenceCountedObject< T >::ReferenceCountedObject().

◆ increment_destructor_count()

void libMesh::ReferenceCounter::increment_destructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the destruction counter.

Should be called in the destructor of any derived class that will be reference counted.

Definition at line 207 of file reference_counter.h.

208{
209 libmesh_try
210 {
211 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
212 std::pair<unsigned int, unsigned int> & p = _counts[name];
213 p.second++;
214 }
215 libmesh_catch (...)
216 {
217 auto stream = libMesh::err.get();
218 stream->exceptions(stream->goodbit); // stream must not throw
219 libMesh::err << "Encountered unrecoverable error while calling "
220 << "ReferenceCounter::increment_destructor_count() "
221 << "for a(n) " << name << " object." << std::endl;
222 std::terminate();
223 }
224}

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< T >::~ReferenceCountedObject().

◆ init()

void libMesh::EquationSystems::init ( )
virtual

Initialize all the systems.

Reimplemented in Biharmonic.

Definition at line 80 of file equation_systems.C.

81{
82#ifndef NDEBUG
83 for (auto i : make_range(this->n_systems()))
84 libmesh_assert(!this->get_system(i).is_initialized());
85#endif
86
87 this->reinit_mesh();
88}
virtual void reinit_mesh()
Handle the association of a completely new mesh with the EquationSystem and all the Systems assigned ...

References get_system(), libMesh::libmesh_assert(), libMesh::make_range(), n_systems(), and reinit_mesh().

Referenced by assemble_and_solve(), Biharmonic::init(), main(), main(), libMesh::ErrorVector::plot_error(), read(), TimeSolverTestImplementation< TimeSolverType >::run_test_with_exact_soln(), setup(), WriteVecAndScalar::setupTests(), MultiEvaluablePredTest::test(), SystemsTest::test100KVariables(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), SystemsTest::test2DProjectVectorFE(), SystemsTest::test3DProjectVectorFE(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), ProjectSolutionTest::test_partial_project_solution(), MeshFunctionTest::test_subdomain_id_sets(), DofMapTest::testArrayDofIndicesWithType(), SystemsTest::testAssemblyWithDgFemContext(), DofMapTest::testBadElemFECombo(), EquationSystemsTest::testBadVarNames(), SystemsTest::testBlockRestrictedVarNDofs(), SystemsTest::testBoundaryProjectCube(), DofMapTest::testConstraintLoopDetection(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyElementVectorImpl(), MeshInputTest::testCopyNodalSolutionImpl(), ConstraintOperatorTest::testCoreform(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), SystemsTest::testDofCouplingWithVarGroups(), MixedDimensionMeshTest::testDofOrdering(), MixedDimensionRefinedMeshTest::testDofOrdering(), MixedDimensionNonUniformRefinement::testDofOrdering(), MixedDimensionNonUniformRefinementTriangle::testDofOrdering(), MixedDimensionNonUniformRefinement3D::testDofOrdering(), DofMapTest::testDofOwner(), MeshInputTest::testDynaReadPatch(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), EquationSystemsTest::testInit(), MeshAssignTest::testMeshMoveAssign(), PeriodicBCTest::testPeriodicBC(), EquationSystemsTest::testPostInitAddElem(), EquationSystemsTest::testPostInitAddRealSystem(), EquationSystemsTest::testPostInitAddSystem(), SystemsTest::testPostInitAddVector(), SystemsTest::testPostInitAddVectorTypeChange(), SystemsTest::testProjectCube(), SystemsTest::testProjectCubeWithMeshFunction(), MeshInputTest::testProjectionRegression(), SystemsTest::testProjectLine(), SystemsTest::testProjectMatrix1D(), SystemsTest::testProjectMatrix2D(), SystemsTest::testProjectMatrix3D(), SystemsTest::testProjectScalarCoarsening(), SystemsTest::testProjectSquare(), EquationSystemsTest::testRefineThenReinitPreserveFlags(), EquationSystemsTest::testReinitWithNodeElem(), EquationSystemsTest::testRepartitionThenReinit(), EquationSystemsTest::testSelectivePRefine(), SystemsTest::testSetSystemParameterOverEquationSystem(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), DisjointNeighborTest::testTempJump(), DisjointNeighborTest::testTempJumpRefine(), WriteVecAndScalar::testWriteExodus(), and WriteVecAndScalar::testWriteNemesis().

◆ is_elemental_data_fe_type()

bool libMesh::EquationSystems::is_elemental_data_fe_type ( const FEType type)
static
Returns
Whether type can be represented as elemental data.

Elemental data variables are CONSTANT element-interior fields, regardless of their p_refinement flag.

Definition at line 582 of file equation_systems.C.

583{
584 return type.order == CONSTANT &&
585 (type.family == MONOMIAL ||
586 type.family == MONOMIAL_VEC ||
587 type.family == XYZ);
588}

References libMesh::CONSTANT, libMesh::FEType::family, libMesh::MONOMIAL, libMesh::MONOMIAL_VEC, libMesh::FEType::order, and libMesh::XYZ.

Referenced by build_elemental_data_variable_names(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::Nemesis_IO::copy_elemental_solution(), and find_elemental_data_variable_numbers().

◆ n_active_dofs()

std::size_t libMesh::EquationSystems::n_active_dofs ( ) const
Returns
The number of active degrees of freedom for the EquationSystems object.

Definition at line 1868 of file equation_systems.C.

1869{
1870 std::size_t tot=0;
1871
1872 for (const auto & pr : _systems)
1873 tot += pr.second->n_active_dofs();
1874
1875 return tot;
1876}
std::size_t n_active_dofs() const

Referenced by main(), and write_output_solvedata().

◆ n_dofs()

std::size_t libMesh::EquationSystems::n_dofs ( ) const
Returns
The total number of degrees of freedom in all systems.

Definition at line 1855 of file equation_systems.C.

1856{
1857 std::size_t tot=0;
1858
1859 for (const auto & pr : _systems)
1860 tot += pr.second->n_dofs();
1861
1862 return tot;
1863}
std::size_t n_dofs() const

Referenced by Biharmonic::JR::bounds(), and Biharmonic::JR::residual_and_jacobian().

◆ n_objects()

static unsigned int libMesh::ReferenceCounter::n_objects ( )
inlinestaticinherited

Prints the number of outstanding (created, but not yet destroyed) objects.

Definition at line 85 of file reference_counter.h.

86 { return _n_objects; }
static Threads::atomic< unsigned int > _n_objects
The number of objects.

References libMesh::ReferenceCounter::_n_objects.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ n_processors()

processor_id_type libMesh::ParallelObject::n_processors ( ) const
inlineinherited
Returns
The number of processors in the group.

Definition at line 103 of file parallel_object.h.

104 {
105 processor_id_type returnval =
106 cast_int<processor_id_type>(_communicator.size());
107 libmesh_assert(returnval); // We never have an empty comm
108 return returnval;
109 }

References libMesh::ParallelObject::_communicator, libMesh::libmesh_assert(), and libMesh::Parallel::Communicator::size().

Referenced by libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::DofMap::add_constraints_to_send_list(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::DistributedMesh::add_node(), libMesh::System::add_vector(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::AztecLinearSolver< T >::AztecLinearSolver(), libMesh::Partitioner::build_graph(), build_parallel_elemental_solution_vector(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::UnstructuredMesh::create_pid_mesh(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::DistributedMesh::DistributedMesh(), libMesh::EnsightIO::EnsightIO(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::MeshBase::get_info(), libMesh::StaticCondensation::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::Nemesis_IO_Helper::initialize(), libMesh::DistributedMesh::insert_elem(), libMesh::NumericVector< T >::is_effectively_ghosted(), libMesh::NumericVector< T >::is_effectively_serial(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::MeshBase::n_active_elem_on_proc(), libMesh::DofMap::n_dofs_per_processor(), libMesh::MeshBase::n_elem_on_proc(), libMesh::MeshBase::n_nodes_on_proc(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::MeshBase::partition(), libMesh::Partitioner::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::NameBasedIO::read(), libMesh::CheckpointIO::read_connectivity(), libMesh::XdrIO::read_header(), libMesh::CheckpointIO::read_nodes(), libMesh::System::read_parallel_data(), libMesh::System::read_SCALAR_dofs(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::System::read_serialized_vector(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::Partitioner::repartition(), OverlappingFunctorTest::run_partitioner_test(), libMesh::DofMap::scatter_constraints(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), WriteVecAndScalar::setupTests(), libMesh::RBEIMEvaluation::side_gather_bfs(), DistributedMeshTest::testRemoteElemError(), CheckpointIOTest::testSplitter(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::GMVIO::write_binary(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::System::write_parallel_data(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), and libMesh::XdrIO::write_serialized_nodesets().

◆ n_systems()

unsigned int libMesh::EquationSystems::n_systems ( ) const
inline

◆ n_vars()

unsigned int libMesh::EquationSystems::n_vars ( ) const
Returns
The total number of variables in all systems.

Definition at line 1843 of file equation_systems.C.

1844{
1845 unsigned int tot=0;
1846
1847 for (const auto & pr : _systems)
1848 tot += pr.second->n_vars();
1849
1850 return tot;
1851}

Referenced by build_variable_names().

◆ print_info() [1/2]

void libMesh::EquationSystems::print_info ( std::ostream &  os = libMesh::out) const

Prints information about the equation systems, by default to libMesh::out.

Definition at line 1826 of file equation_systems.C.

1827{
1828 os << this->get_info()
1829 << std::endl;
1830}

Referenced by assemble_and_solve(), do_compare(), and main().

◆ print_info() [2/2]

void libMesh::ReferenceCounter::print_info ( std::ostream &  out_stream = libMesh::out)
staticinherited

Prints the reference information, by default to libMesh::out.

Definition at line 81 of file reference_counter.C.

82{
84 out_stream << ReferenceCounter::get_info();
85}
static std::string get_info()
Gets a string containing the reference information.

References libMesh::ReferenceCounter::_enable_print_counter, and libMesh::ReferenceCounter::get_info().

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ processor_id()

processor_id_type libMesh::ParallelObject::processor_id ( ) const
inlineinherited
Returns
The rank of this processor in the group.

Definition at line 114 of file parallel_object.h.

115 { return cast_int<processor_id_type>(_communicator.rank()); }

References libMesh::ParallelObject::_communicator, and libMesh::Parallel::Communicator::rank().

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::BoundaryInfo::add_elements(), libMesh::DistributedMesh::add_node(), libMesh::MeshTools::Modification::all_tri(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::Nemesis_IO_Helper::build_element_and_node_maps(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::build_node_list_from_side_list(), build_parallel_elemental_solution_vector(), build_parallel_solution_vector(), libMesh::MeshFunction::check_found_elem(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), libMesh::ExodusII_IO_Helper::close(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::compute_communication_map_parameters(), libMesh::Nemesis_IO_Helper::compute_internal_and_border_elems_and_internal_nodes(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_node_communication_maps(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::ExodusII_IO_Helper::create(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DistributedMesh::DistributedMesh(), libMesh::DistributedMesh::DistributedMesh(), libMesh::DofMapBase::end_dof(), libMesh::DofMapBase::end_old_dof(), libMesh::EnsightIO::EnsightIO(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::DofMapBase::first_dof(), libMesh::DofMapBase::first_old_dof(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::Nemesis_IO_Helper::get_cmap_params(), libMesh::Nemesis_IO_Helper::get_eb_info_global(), libMesh::Nemesis_IO_Helper::get_elem_cmap(), libMesh::Nemesis_IO_Helper::get_elem_map(), libMesh::MeshBase::get_info(), libMesh::Nemesis_IO_Helper::get_init_global(), libMesh::Nemesis_IO_Helper::get_init_info(), libMesh::RBEIMEvaluation::get_interior_basis_functions_as_vecs(), libMesh::Nemesis_IO_Helper::get_loadbal_param(), libMesh::DofMap::get_local_constraints(), libMesh::MeshBase::get_local_constraints(), libMesh::Nemesis_IO_Helper::get_node_cmap(), libMesh::Nemesis_IO_Helper::get_node_map(), libMesh::Nemesis_IO_Helper::get_ns_param_global(), libMesh::Nemesis_IO_Helper::get_ss_param_global(), libMesh::SparsityPattern::Build::handle_vi_vj(), libMesh::LaplaceMeshSmoother::init(), libMesh::SystemSubsetBySubdomain::init(), HeatSystem::init_data(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_global_variables(), libMesh::ExodusII_IO_Helper::initialize_nodal_variables(), libMesh::DistributedMesh::insert_elem(), libMesh::MeshTools::Modification::interpolate_surface(), libMesh::SparsityPattern::Build::join(), libMesh::RBEvaluation::legacy_write_offline_data_to_files(), libMesh::RBSCMEvaluation::legacy_write_offline_data_to_files(), libMesh::TransientRBEvaluation::legacy_write_offline_data_to_files(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), main(), AugmentSparsityOnInterface::mesh_reinit(), libMesh::TriangulatorInterface::MeshedHole::MeshedHole(), libMesh::MeshBase::n_active_local_elem(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::MeshTools::n_connected_components(), libMesh::MeshBase::n_constraint_rows(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::DofMapBase::n_local_dofs(), libMesh::MeshBase::n_local_elem(), libMesh::MeshBase::n_local_nodes(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::DistributedMesh::own_node(), libMesh::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::Nemesis_IO_Helper::put_cmap_params(), libMesh::Nemesis_IO_Helper::put_elem_cmap(), libMesh::Nemesis_IO_Helper::put_elem_map(), libMesh::Nemesis_IO_Helper::put_loadbal_param(), libMesh::Nemesis_IO_Helper::put_node_cmap(), libMesh::Nemesis_IO_Helper::put_node_map(), libMesh::XdrIO::read(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::NameBasedIO::read(), read(), read(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::ExodusII_IO_Helper::read_global_values(), libMesh::CheckpointIO::read_header(), libMesh::ExodusII_IO::read_header(), libMesh::System::read_header(), libMesh::XdrIO::read_header(), libMesh::DynaIO::read_mesh(), libMesh::ExodusII_IO_Helper::read_node_num_map(), libMesh::System::read_parallel_data(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::System::read_serialized_data(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::System::read_serialized_vectors(), libMesh::Nemesis_IO_Helper::read_var_names_impl(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::StaticCondensationDofMap::reinit(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::RBEIMEvaluation::side_gather_bfs(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), ExodusTest< elem_type >::test_read_gold(), ExodusTest< elem_type >::test_write(), ExodusC0PolyhedronTest::test_write_and_read_hexagonal_prism(), ExodusC0PolygonTest::test_write_and_read_pentagon(), MeshInputTest::testAbaqusRead(), MeshInputTest::testBadGmsh(), BoundaryInfoTest::testBoundaryIDs(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyElementVectorImpl(), MeshInputTest::testCopyNodalSolutionImpl(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), MeshInputTest::testDynaFileMappings(), MeshInputTest::testDynaNoSplines(), MeshInputTest::testDynaReadElem(), MeshInputTest::testDynaReadPatch(), MeshInputTest::testExodusFileMappings(), MeshInputTest::testExodusIGASidesets(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), MeshInputTest::testGmshBCIDOverlap(), MeshInputTest::testGoodGmsh(), MeshInputTest::testGoodSTL(), MeshInputTest::testGoodSTLBinary(), BoundaryInfoTest::testInternalBoundary(), MeshInputTest::testLowOrderEdgeBlocks(), BoundaryMeshSubdomainTest::testPerBoundarySubdomain(), SystemsTest::testProjectMatrix3D(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), BoundaryMeshSubdomainTest::testSingleSubdomain(), WriteVecAndScalar::testSolution(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::NetGenMeshInterface::triangulate(), libMesh::Parallel::Packing< Elem * >::unpack(), libMesh::Parallel::Packing< Node * >::unpack(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::DTKAdapter::update_variable_values(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::XdrIO::write(), libMesh::NameBasedIO::write(), libMesh::CheckpointIO::write(), write(), write(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO::write_element_data(), libMesh::ExodusII_IO::write_element_data_from_discontinuous_nodal_data(), libMesh::ExodusII_IO_Helper::write_element_values(), libMesh::ExodusII_IO_Helper::write_element_values_element_major(), libMesh::ExodusII_IO_Helper::write_elements(), libMesh::ExodusII_IO_Helper::write_elemset_data(), libMesh::ExodusII_IO_Helper::write_elemsets(), libMesh::ExodusII_IO::write_global_data(), libMesh::ExodusII_IO_Helper::write_global_values(), libMesh::System::write_header(), libMesh::ExodusII_IO::write_information_records(), libMesh::ExodusII_IO_Helper::write_information_records(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::UCDIO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data_common(), libMesh::ExodusII_IO::write_nodal_data_discontinuous(), libMesh::ExodusII_IO_Helper::write_nodal_values(), libMesh::ExodusII_IO_Helper::write_nodeset_data(), libMesh::ExodusII_IO_Helper::write_nodesets(), libMesh::Nemesis_IO_Helper::write_nodesets(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), write_output_solvedata(), libMesh::System::write_parallel_data(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bc_names(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::System::write_serialized_data(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::XdrIO::write_serialized_subdomain_names(), libMesh::System::write_serialized_vector(), libMesh::System::write_serialized_vectors(), libMesh::ExodusII_IO_Helper::write_sideset_data(), libMesh::ExodusII_IO_Helper::write_sidesets(), libMesh::Nemesis_IO_Helper::write_sidesets(), libMesh::ExodusII_IO::write_timestep(), libMesh::ExodusII_IO_Helper::write_timestep(), and libMesh::ExodusII_IO::write_timestep_discontinuous().

◆ read() [1/3]

template<typename InValType >
template LIBMESH_EXPORT void libMesh::EquationSystems::read< Real > ( std::string_view  name,
const unsigned int  read_flags = (READ_HEADER|READ_DATA),
bool  partition_agnostic = true 
)

Definition at line 77 of file equation_systems_io.C.

80{
81 XdrMODE mode = READ;
82 if (name.find(".xdr") != std::string::npos)
83 mode = DECODE;
84 this->read(name, mode, read_flags, partition_agnostic);
85}
void read(std::string_view name, const XdrMODE, const unsigned int read_flags=(READ_HEADER|READ_DATA), bool partition_agnostic=true)
Read & initialize the systems from disk using the XDR data format.
XdrMODE
Defines an enum for read/write mode in Xdr format.

References libMesh::DECODE, libMesh::READ, and read().

◆ read() [2/3]

template<typename InValType >
template LIBMESH_EXPORT void libMesh::EquationSystems::read< Real > ( std::string_view  name,
const XdrMODE  ,
const unsigned int  read_flags = (READ_HEADER|READ_DATA),
bool  partition_agnostic = true 
)

Read & initialize the systems from disk using the XDR data format.

This format allows for machine-independent binary output.

Set which sections of the file to read by bitwise OR'ing the EquationSystems::ReadFlags enumeration together. For example, to read all sections of the file, set read_flags to: (READ_HEADER | READ_DATA | READ_ADDITIONAL_DATA)

Note
The equation system can be defined without initializing the data vectors to any solution values. This can be done by omitting READ_DATA in the read_flags parameter.

If XdrMODE is omitted, it will be inferred as READ for filenames containing .xda or as DECODE for filenames containing .xdr

Parameters
nameName of the file to be read.
read_flagsSingle flag created by bitwise-OR'ing several flags together.
modeControls whether reading is done in binary or ascii mode.
partition_agnosticIf true then the mesh and degrees of freedom will be temporarily renumbered in a partition agnostic way so that files written using "n" mpi processes can be re-read on "m" mpi processes. This renumbering is not compatible with meshes that have two nodes in exactly the same position!

Definition at line 90 of file equation_systems_io.C.

94{
95 // This will unzip a file with .bz2 as the extension, otherwise it
96 // simply returns the name if the file need not be unzipped.
97 Xdr io ((this->processor_id() == 0) ? std::string(name) : "", mode);
98
99 std::function<std::unique_ptr<Xdr>()> local_io_functor;
100 local_io_functor = [this,&name,&mode]() {
101 return std::make_unique<Xdr>(local_file_name(this->processor_id(), name), mode); };
102
103 this->read(io, local_io_functor, read_flags, partition_agnostic);
104}

References libMesh::ParallelObject::processor_id(), and read().

Referenced by main(), read(), read(), read(), MeshFunctionTest::read_variable_info_from_output_data(), libMesh::FileHistoryData::retrieve_adjoint_solution(), libMesh::FileHistoryData::retrieve_primal_solution(), and SlitMeshRefinedSystemTest::testRestart().

◆ read() [3/3]

template<typename InValType >
template LIBMESH_EXPORT void libMesh::EquationSystems::read< Real > ( Xdr io,
std::function< std::unique_ptr< Xdr >()> &  local_io_functor,
const unsigned int  read_flags = (READ_HEADER|READ_DATA),
bool  partition_agnostic = true 
)

This program implements the input of an EquationSystems object. This warrants some documentation. The output file essentially consists of 11 sections:

1.) A version header (for non-'legacy' formats, libMesh-0.7.0 and greater).
2.) The number of individual equation systems (unsigned int)

for each system

3.)  The name of the system (string)
4.)  The type of the system (string)

handled through System::read():

+-------------------------------------------------------------+
|  5.) The number of variables in the system (unsigned int)   |
|                                                             |
|   for each variable in the system                           |
|                                                             |
|    6.) The name of the variable (string)                    |
|                                                             |
|    7.) Combined in an FEType:                               |
|         - The approximation order(s) of the variable (Order |
|           Enum, cast to int/s)                              |
|         - The finite element family/ies of the variable     |
|           (FEFamily Enum, cast to int/s)                    |
|                                                             |
|   end variable loop                                         |
|                                                             |
| 8.) The number of additional vectors (unsigned int),        |
|                                                             |
|    for each additional vector in the equation system object |
|                                                             |
|    9.) the name of the additional vector  (string)          |
+-------------------------------------------------------------+

end system loop


for each system, handled through System::read_{serialized,parallel}_data():

+--------------------------------------------------------------+
| 10.) The global solution vector, re-ordered to be node-major |
|     (More on this later.)                                    |
|                                                              |
|    for each additional vector in the equation system object  |
|                                                              |
|    11.) The global additional vector, re-ordered to be       |
|         node-major (More on this later.)                     |
+--------------------------------------------------------------+

end system loop

Note that the actual IO is handled through the Xdr class (to be renamed later?) which provides a uniform interface to both the XDR (eXternal Data Representation) interface and standard ASCII output. Thus this one section of code will read XDR or ASCII files with no changes.

Definition at line 109 of file equation_systems_io.C.

113{
177 // Set booleans from the read_flags argument
178 const bool read_header = read_flags & EquationSystems::READ_HEADER;
179 const bool read_data = read_flags & EquationSystems::READ_DATA;
180 const bool read_additional_data = read_flags & EquationSystems::READ_ADDITIONAL_DATA;
181 const bool read_legacy_format = read_flags & EquationSystems::READ_LEGACY_FORMAT;
182 const bool try_read_ifems = read_flags & EquationSystems::TRY_READ_IFEMS;
183 const bool read_basic_only = read_flags & EquationSystems::READ_BASIC_ONLY;
184 bool read_parallel_files = false;
185
186 std::vector<std::pair<std::string, System *>> xda_systems;
187
188 libmesh_assert (io.reading());
189
190 {
191 // 1.)
192 // Read the version header.
193 std::string version = "legacy";
194 if (!read_legacy_format)
195 {
196 if (this->processor_id() == 0) io.data(version);
197 this->comm().broadcast(version);
198
199 // All processors have the version header, if it does not contain
200 // the libMesh_label string then it is a legacy file.
201 const std::string libMesh_label = "libMesh-";
202 std::string::size_type lm_pos = version.find(libMesh_label);
203 if (lm_pos==std::string::npos)
204 {
205 io.close();
206
207 // Recursively call this read() function but with the
208 // EquationSystems::READ_LEGACY_FORMAT bit set.
209 this->read (io, local_io_functor, (read_flags | EquationSystems::READ_LEGACY_FORMAT), partition_agnostic);
210 return;
211 }
212
213 // Figure out the libMesh version that created this file
214 std::istringstream iss(version.substr(lm_pos + libMesh_label.size()));
215 int ver_major = 0, ver_minor = 0, ver_patch = 0;
216 char dot;
217 iss >> ver_major >> dot >> ver_minor >> dot >> ver_patch;
218 io.set_version(LIBMESH_VERSION_ID(ver_major, ver_minor, ver_patch));
219
220
221 read_parallel_files = Utility::contains(version, " parallel");
222
223 // If requested that we try to read infinite element information,
224 // and the string " with infinite elements" is not in the version,
225 // then tack it on. This is for compatibility reading ifem
226 // files written prior to 11/10/2008 - BSK
227 if (try_read_ifems)
228 if (!Utility::contains(version, " with infinite elements"))
229 version += " with infinite elements";
230
231 }
232 else
233 libmesh_deprecated();
234
235 LOG_SCOPE("read()", "EquationSystems");
236
237 // 2.)
238 // Read the number of systems
239 unsigned int n_sys=0;
240 if (this->processor_id() == 0) io.data (n_sys);
241 this->comm().broadcast(n_sys);
242
243 for (unsigned int sys=0; sys<n_sys; sys++)
244 {
245 // 3.)
246 // Read the name of the sys-th equation system
247 std::string sys_name;
248 if (this->processor_id() == 0) io.data (sys_name);
249 this->comm().broadcast(sys_name);
250
251 // 4.)
252 // Read the type of the sys-th equation system
253 std::string sys_type;
254 if (this->processor_id() == 0) io.data (sys_type);
255 this->comm().broadcast(sys_type);
256
257 if (read_header)
258 this->add_system (sys_type, sys_name);
259
260 // 5.) - 9.)
261 // Let System::read_header() do the job
262 System & new_system = this->get_system(sys_name);
263 new_system.read_header (io,
264 version,
265 read_header,
266 read_additional_data,
267 read_legacy_format);
268
269 xda_systems.emplace_back(sys_name, &new_system);
270
271 // If we're only creating "basic" systems, we need to tell
272 // each system that before we call init() later.
273 if (read_basic_only)
274 new_system.set_basic_system_only();
275 }
276 }
277
278
279
280 // Now we are ready to initialize the underlying data
281 // structures. This will initialize the vectors for
282 // storage, the dof_map, etc...
283 if (read_header)
284 this->init();
285
286 // 10.) & 11.)
287 // Read and set the numeric vector values
288 if (read_data)
289 {
290 std::unique_ptr<Xdr> local_io;
291
292 // the EquationSystems::read() method should look constant from the mesh
293 // perspective, but we need to assign a temporary numbering to the nodes
294 // and elements in the mesh, which requires that we abuse const_cast
295 if (!read_legacy_format && partition_agnostic)
296 {
297 MeshBase & mesh = const_cast<MeshBase &>(this->get_mesh());
299 }
300
301 for (auto & pr : xda_systems)
302 {
303 libmesh_error_msg_if(read_legacy_format,
304 "Reading legacy format XDR files is officially no longer supported.");
305
306 if (read_parallel_files)
307 {
308 if (!local_io)
309 {
310 local_io = local_io_functor();
311 libmesh_assert(local_io->reading());
312 }
313 pr.second->read_parallel_data<InValType> (*local_io, read_additional_data);
314 }
315 else
316 pr.second->read_serialized_data<InValType> (io, read_additional_data);
317 }
318
319 // Undo the temporary numbering.
320 if (!read_legacy_format && partition_agnostic)
322 }
323
324 // Localize each system's data
325 this->update();
326
327 #ifdef LIBMESH_ENABLE_AMR
328 MeshRefinement mesh_refine(_mesh);
329 mesh_refine.clean_refinement_flags();
330 #endif
331}
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
void update()
Updates local values for all the systems.
virtual void init()
Initialize all the systems.
virtual void fix_broken_node_and_element_numbering()=0
There is no reason for a user to ever call this function.
void globally_renumber_nodes_and_elements(MeshBase &)
There is no reason for a user to ever call this function.
bool contains(std::string_view superstring, std::string_view substring)
Look for a substring within a string.
Definition utility.C:205

References _mesh, add_system(), libMesh::Parallel::Communicator::broadcast(), libMesh::MeshRefinement::clean_refinement_flags(), libMesh::Xdr::close(), libMesh::ParallelObject::comm(), libMesh::Utility::contains(), libMesh::Xdr::data(), libMesh::MeshBase::fix_broken_node_and_element_numbering(), get_mesh(), get_system(), libMesh::MeshTools::Private::globally_renumber_nodes_and_elements(), init(), libMesh::libmesh_assert(), mesh, libMesh::ParallelObject::processor_id(), read(), READ_ADDITIONAL_DATA, READ_BASIC_ONLY, READ_DATA, READ_HEADER, libMesh::System::read_header(), READ_LEGACY_FORMAT, libMesh::Xdr::reading(), libMesh::System::set_basic_system_only(), libMesh::Xdr::set_version(), TRY_READ_IFEMS, and update().

◆ redundant_added_side()

bool libMesh::EquationSystems::redundant_added_side ( const Elem elem,
unsigned int  side 
)
static

Definition at line 1706 of file equation_systems.C.

1707{
1708 libmesh_assert(elem.active());
1709
1710 const Elem * neigh = elem.neighbor_ptr(side);
1711
1712 // Write boundary sides.
1713 if (!neigh)
1714 return false;
1715
1716 // Write ghost sides in Nemesis
1717 if (neigh == remote_elem)
1718 return false;
1719
1720 // Don't write a coarser side if a finer side exists
1721 if (!neigh->active())
1722 return true;
1723
1724 // Don't write a side redundantly from both of the
1725 // elements sharing it. We'll disambiguate with id().
1726 return (neigh->id() < elem.id());
1727}
const RemoteElem * remote_elem
Definition remote_elem.C:57

References libMesh::Elem::active(), libMesh::DofObject::id(), libMesh::libmesh_assert(), libMesh::Elem::neighbor_ptr(), and libMesh::remote_elem.

Referenced by build_parallel_solution_vector(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::write_elements(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), and libMesh::ExodusII_IO::write_nodal_data().

◆ refine_in_reinit_flag()

bool libMesh::EquationSystems::refine_in_reinit_flag ( )
inline
Returns
Whether or not calls to reinit() will try to coarsen/refine the mesh

Definition at line 590 of file equation_systems.h.

590{ return this->_refine_in_reinit; }

References _refine_in_reinit.

◆ reinit()

void libMesh::EquationSystems::reinit ( )
virtual

Handle any mesh changes and reinitialize all the systems on the updated mesh.

Definition at line 92 of file equation_systems.C.

93{
94 const bool mesh_changed = this->reinit_solutions();
95
96 // If the mesh has changed, systems will need to reinitialize their
97 // own data on the new mesh.
98 if (mesh_changed)
99 this->reinit_systems();
100}
bool reinit_solutions()
Handle any mesh changes and project any solutions onto the updated mesh.
virtual void reinit_systems()
Reinitialize all systems on the current mesh.

References reinit_solutions(), and reinit_systems().

Referenced by libMesh::UniformRefinementEstimator::_estimate_error(), assemble_and_solve(), libMesh::AdjointRefinementEstimator::estimate_error(), main(), run_timestepping(), SystemsTest::test2DProjectVectorFE(), SystemsTest::test3DProjectVectorFE(), EquationSystemsTest::testBadVarNames(), MeshAssignTest::testMeshMoveAssign(), EquationSystemsTest::testPostInitAddElem(), EquationSystemsTest::testPostInitAddRealSystem(), EquationSystemsTest::testPostInitAddSystem(), SystemsTest::testProjectCube(), SystemsTest::testProjectLine(), SystemsTest::testProjectScalarCoarsening(), SystemsTest::testProjectSquare(), InfFERadialTest::testRefinement(), EquationSystemsTest::testRefineThenReinitPreserveFlags(), EquationSystemsTest::testReinitWithNodeElem(), EquationSystemsTest::testRepartitionThenReinit(), and EquationSystemsTest::testSelectivePRefine().

◆ reinit_mesh()

void libMesh::EquationSystems::reinit_mesh ( )
virtual

Handle the association of a completely new mesh with the EquationSystem and all the Systems assigned to it.

Definition at line 102 of file equation_systems.C.

103{
104 const unsigned int n_sys = this->n_systems();
105
106 libmesh_assert_not_equal_to (n_sys, 0);
107
108 // Tell all the \p DofObject entities how many systems
109 // there are.
110 for (auto & node : _mesh.node_ptr_range())
111 node->set_n_systems(n_sys);
112
115 [n_sys](const ElemRange & range)
116 {
117 for (Elem * elem : range)
118 elem->set_n_systems(n_sys);
119 });
120
121 //for (auto i : make_range(this->n_systems()))
122 //this->get_system(i).init();
123
124#ifdef LIBMESH_ENABLE_AMR
125 MeshRefinement mesh_refine(_mesh);
126 mesh_refine.clean_refinement_flags();
127#endif
128
129 // Now loop over all the systems belonging to this ES
130 // and call reinit_mesh for each system
131 for (auto i : make_range(this->n_systems()))
132 this->get_system(i).reinit_mesh();
133
134}

References _mesh, libMesh::MeshRefinement::clean_refinement_flags(), libMesh::MeshBase::element_stored_range(), get_system(), libMesh::make_range(), n_systems(), and libMesh::Threads::parallel_for().

Referenced by init(), and MeshAssignTest::testMeshMoveAssign().

◆ reinit_solutions()

bool libMesh::EquationSystems::reinit_solutions ( )

Handle any mesh changes and project any solutions onto the updated mesh.

Returns
Whether or not the mesh may have changed.

Definition at line 136 of file equation_systems.C.

137{
138 parallel_object_only();
139
140 const unsigned int n_sys = this->n_systems();
141 libmesh_assert_not_equal_to (n_sys, 0);
142
143 // And any new systems will need initialization
144 for (unsigned int i=0; i != n_sys; ++i)
145 if (!this->get_system(i).is_initialized())
146 this->get_system(i).init();
147
148 // We used to assert that all nodes and elements *already* had
149 // n_systems() properly set; however this is false in the case where
150 // user code has manually added nodes and/or elements to an
151 // already-initialized system.
152
153 // Make sure all the \p DofObject entities know how many systems
154 // there are.
155 {
156 // All the nodes
157 for (auto & node : _mesh.node_ptr_range())
158 node->set_n_systems(n_sys);
159
160 // All the elements
163 [n_sys](const ElemRange & range)
164 {
165 for (Elem * elem : range)
166 elem->set_n_systems(n_sys);
167 });
168 }
169
170 // Localize each system's vectors
171 for (unsigned int i=0; i != n_sys; ++i)
172 this->get_system(i).re_update();
173
174#ifdef LIBMESH_ENABLE_AMR
175
176 bool mesh_changed = false;
177
178 // FIXME: For backwards compatibility, assume
179 // refine_and_coarsen_elements or refine_uniformly have already
180 // been called
181 {
182 for (unsigned int i=0; i != n_sys; ++i)
183 {
184 System & sys = this->get_system(i);
185
186 // Even if the system doesn't have any variables in it we want
187 // consistent behavior; e.g. distribute_dofs should have the
188 // opportunity to count up zero dofs on each processor.
189 //
190 // Who's been adding zero-var systems anyway, outside of my
191 // unit tests? - RHS
192 // if (!sys.n_vars())
193 // continue;
194
195 sys.get_dof_map().distribute_dofs(_mesh);
196
197 // Recreate any user or internal constraints
198 sys.reinit_constraints();
199
200 // Even if there weren't any constraint changes,
201 // reinit_constraints() did prepare_send_list() for us.
202
203 sys.prolong_vectors();
204 }
205 mesh_changed = true;
206 }
207
208 if (this->_refine_in_reinit)
209 {
210 // Don't override any user refinement settings
211 MeshRefinement mesh_refine(_mesh);
212 mesh_refine.face_level_mismatch_limit() = 0; // unlimited
213 mesh_refine.overrefined_boundary_limit() = -1; // unlimited
214 mesh_refine.underrefined_boundary_limit() = -1; // unlimited
215
216 // Try to coarsen the mesh, then restrict each system's vectors
217 // if necessary
218 if (mesh_refine.coarsen_elements())
219 {
220 for (auto i : make_range(this->n_systems()))
221 {
222 System & sys = this->get_system(i);
223 sys.get_dof_map().distribute_dofs(_mesh);
224 sys.reinit_constraints();
225
226 // Even if there weren't any constraint changes,
227 // reinit_constraints() did prepare_send_list() for us.
228
229 sys.restrict_vectors();
230 }
231 mesh_changed = true;
232 }
233
234 // Once vectors are all restricted, we can delete
235 // children of coarsened elements
236 if (mesh_changed)
237 this->get_mesh().contract();
238
239 // Try to refine the mesh, then prolong each system's vectors
240 // if necessary
241 if (mesh_refine.refine_elements())
242 {
243 for (auto i : make_range(this->n_systems()))
244 {
245 System & sys = this->get_system(i);
246 sys.get_dof_map().distribute_dofs(_mesh);
247 sys.reinit_constraints();
248
249 // Even if there weren't any constraint changes,
250 // reinit_constraints() did prepare_send_list() for us.
251
252 sys.prolong_vectors();
253 }
254 mesh_changed = true;
255 }
256 }
257
258 return mesh_changed;
259
260#endif // #ifdef LIBMESH_ENABLE_AMR
261
262 return false;
263}
virtual bool contract()=0
Delete subactive (i.e.

References _mesh, _refine_in_reinit, libMesh::MeshRefinement::coarsen_elements(), libMesh::MeshBase::contract(), libMesh::DofMap::distribute_dofs(), libMesh::MeshBase::element_stored_range(), libMesh::MeshRefinement::face_level_mismatch_limit(), libMesh::System::get_dof_map(), get_mesh(), get_system(), libMesh::make_range(), n_systems(), libMesh::MeshRefinement::overrefined_boundary_limit(), libMesh::Threads::parallel_for(), libMesh::System::prolong_vectors(), libMesh::MeshRefinement::refine_elements(), libMesh::System::reinit_constraints(), libMesh::System::restrict_vectors(), and libMesh::MeshRefinement::underrefined_boundary_limit().

Referenced by reinit().

◆ reinit_systems()

void libMesh::EquationSystems::reinit_systems ( )
virtual

Reinitialize all systems on the current mesh.

Definition at line 267 of file equation_systems.C.

268{
269 for (auto i : make_range(this->n_systems()))
270 this->get_system(i).reinit();
271}
virtual void reinit()
Handle any mesh changes and reinitialize all the systems on the updated mesh.

References get_system(), libMesh::make_range(), and n_systems().

Referenced by reinit().

◆ sensitivity_solve()

void libMesh::EquationSystems::sensitivity_solve ( const ParameterVector parameters)
virtual

Call sensitivity_solve on all the individual equation systems.

By default this function solves each sensitivity system once, in the order in which in which they were added. For more sophisticated decoupled problems the user may with to override this behavior in a derived class.

Definition at line 445 of file equation_systems.C.

446{
447 libmesh_assert (this->n_systems());
448
449 for (auto i : make_range(this->n_systems()))
450 this->get_system(i).sensitivity_solve(parameters_in);
451}
virtual void sensitivity_solve(const ParameterVector &parameters)
Call sensitivity_solve on all the individual equation systems.

References get_system(), libMesh::libmesh_assert(), libMesh::make_range(), and n_systems().

◆ solve()

void libMesh::EquationSystems::solve ( )
virtual

Call solve on all the individual equation systems.

By default this function solves each equation system once, in the order they were added. For more sophisticated decoupled problems the user may with to override this behavior in a derived class.

Definition at line 435 of file equation_systems.C.

436{
437 libmesh_assert (this->n_systems());
438
439 for (auto i : make_range(this->n_systems()))
440 this->get_system(i).solve();
441}
virtual void solve()
Call solve on all the individual equation systems.

References get_system(), libMesh::libmesh_assert(), libMesh::make_range(), and n_systems().

Referenced by libMesh::UniformRefinementEstimator::_estimate_error().

◆ update()

void libMesh::EquationSystems::update ( )

Updates local values for all the systems.

Definition at line 342 of file equation_systems.C.

343{
344 LOG_SCOPE("update()", "EquationSystems");
345
346 // Localize each system's vectors
347 for (auto i : make_range(this->n_systems()))
348 this->get_system(i).update();
349}

References get_system(), libMesh::make_range(), and n_systems().

Referenced by main(), read(), and MeshFunctionTest::read_variable_info_from_output_data().

◆ write() [1/4]

void libMesh::EquationSystems::write ( std::ostream  name,
const unsigned int  write_flags = (WRITE_DATA),
bool  partition_agnostic = true 
) const

◆ write() [2/4]

void libMesh::EquationSystems::write ( std::string_view  name,
const unsigned int  write_flags = (WRITE_DATA),
bool  partition_agnostic = true 
) const

Definition at line 335 of file equation_systems_io.C.

338{
339 XdrMODE mode = WRITE;
340 if (name.find(".xdr") != std::string::npos)
341 mode = ENCODE;
342 this->write(name, mode, write_flags, partition_agnostic);
343}
void write(std::string_view name, const XdrMODE, const unsigned int write_flags=(WRITE_DATA), bool partition_agnostic=true) const
Write the systems to disk using the XDR data format.

References libMesh::ENCODE, libMesh::WRITE, and write().

◆ write() [3/4]

void libMesh::EquationSystems::write ( std::string_view  name,
const XdrMODE  mode,
const unsigned int  write_flags = (WRITE_DATA),
bool  partition_agnostic = true 
) const

Write the systems to disk using the XDR data format.

This format allows for machine-independent binary output.

Set the writing properties using the EquationSystems::WriteFlags enumeration. Set which sections to write out by bitwise OR'ing the enumeration values. Write everything by setting write_flags to: (WRITE_DATA | WRITE_ADDITIONAL_DATA)

Note
The solution data can be omitted by calling this routine with WRITE_DATA omitted in the write_flags argument.

If XdrMODE is omitted, it will be inferred as WRITE for filenames containing .xda or as ENCODE for filenames containing .xdr

Parameters
nameName of the file to be read.
write_flagsSingle flag created by bitwise-OR'ing several flags together.
modeControls whether reading is done in binary or ascii mode.
partition_agnosticIf true then the mesh and degrees of freedom will be temporarily renumbered in a partition agnostic way so that files written using "n" mpi processes can be re-read on "m" mpi processes. This renumbering is not compatible with meshes that have two nodes in exactly the same position!

Definition at line 347 of file equation_systems_io.C.

351{
352 Xdr io((this->processor_id()==0) ? std::string(name) : "", mode);
353
354 std::unique_ptr<Xdr> local_io;
355 // open a parallel buffer if warranted
357 local_io = std::make_unique<Xdr>(local_file_name(this->processor_id(),name), mode);
358
359 this->write(io, write_flags, partition_agnostic, local_io.get());
360}

References libMesh::ParallelObject::processor_id(), write(), WRITE_DATA, and WRITE_PARALLEL_FILES.

Referenced by main(), libMesh::ErrorVector::plot_error(), libMesh::FileHistoryData::rewrite_stored_solution(), libMesh::FileHistoryData::store_adjoint_solution(), libMesh::FileHistoryData::store_initial_solution(), libMesh::FileHistoryData::store_primal_solution(), write(), write(), libMesh::NameBasedIO::write_equation_systems(), and write_output().

◆ write() [4/4]

void libMesh::EquationSystems::write ( Xdr io,
const unsigned int  write_flags = (WRITE_DATA),
bool  partition_agnostic = true,
Xdr *const  local_io = nullptr 
) const

This program implements the output of an EquationSystems object. This warrants some documentation. The output file essentially consists of 11 sections:

1.) The version header.
2.) The number of individual equation systems (unsigned int)

for each system

3.)  The name of the system (string)
4.)  The type of the system (string)

handled through System::read():

+-------------------------------------------------------------+
|  5.) The number of variables in the system (unsigned int)   |
|                                                             |
|   for each variable in the system                           |
|                                                             |
|    6.) The name of the variable (string)                    |
|                                                             |
|    7.) Combined in an FEType:                               |
|         - The approximation order(s) of the variable (Order |
|           Enum, cast to int/s)                              |
|         - The finite element family/ies of the variable     |
|           (FEFamily Enum, cast to int/s)                    |
|                                                             |
|   end variable loop                                         |
|                                                             |
| 8.) The number of additional vectors (unsigned int),        |
|                                                             |
|    for each additional vector in the equation system object |
|                                                             |
|    9.) the name of the additional vector  (string)          |
+-------------------------------------------------------------+

end system loop


for each system, handled through System::write_{serialized,parallel}_data():

+--------------------------------------------------------------+
| 10.) The global solution vector, re-ordered to be node-major |
|     (More on this later.)                                    |
|                                                              |
|    for each additional vector in the equation system object  |
|                                                              |
|    11.) The global additional vector, re-ordered to be       |
|         node-major (More on this later.)                     |
+--------------------------------------------------------------+

end system loop

Note that the actual IO is handled through the Xdr class (to be renamed later?) which provides a uniform interface to both the XDR (eXternal Data Representation) interface and standard ASCII output. Thus this one section of code will write XDR or ASCII files with no changes.

Definition at line 364 of file equation_systems_io.C.

368{
432 // the EquationSystems::write() method should look constant,
433 // but we need to assign a temporary numbering to the nodes
434 // and elements in the mesh, which requires that we abuse const_cast
435 if (partition_agnostic)
436 {
437 MeshBase & mesh = const_cast<MeshBase &>(this->get_mesh());
439 }
440
441 // set booleans from write_flags argument
442 const bool write_data = write_flags & EquationSystems::WRITE_DATA;
443 const bool write_additional_data = write_flags & EquationSystems::WRITE_ADDITIONAL_DATA;
444
445 // always write parallel files if we're instructed to write in
446 // parallel
447 const bool write_parallel_files =
449 // Even if we're on a distributed mesh, we may or may not have a
450 // consistent way of reconstructing the same mesh partitioning
451 // later, but we need the same mesh partitioning if we want to
452 // reread the parallel solution safely, so let's write a serial file
453 // unless specifically requested not to.
454 // ||
455 // // but also write parallel files if we haven't been instructed to
456 // // write in serial and we're on a distributed mesh
457 // (!(write_flags & EquationSystems::WRITE_SERIAL_FILES) &&
458 // !this->get_mesh().is_serial())
459 ;
460
461 if (write_parallel_files && write_data)
462 libmesh_assert(local_io);
463
464 {
465 libmesh_assert (io.writing());
466
467 LOG_SCOPE("write()", "EquationSystems");
468
469 const unsigned int proc_id = this->processor_id();
470
471 unsigned int n_sys = 0;
472 for (auto & pr : _systems)
473 if (!pr.second->hide_output())
474 n_sys++;
475
476 // set the version number in the Xdr object
477 io.set_version(LIBMESH_VERSION_ID(LIBMESH_MAJOR_VERSION,
478 LIBMESH_MINOR_VERSION,
479 LIBMESH_MICRO_VERSION));
480
481 // Only write the header information
482 // if we are processor 0.
483 if (proc_id == 0)
484 {
485 std::string comment;
486
487 // 1.)
488 // Write the version header
489 std::string version("libMesh-" + libMesh::get_io_compatibility_version());
490 if (write_parallel_files) version += " parallel";
491
492#ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS
493 version += " with infinite elements";
494#endif
495 io.data (version, "# File Format Identifier");
496
497 // 2.)
498 // Write the number of equation systems
499 io.data (n_sys, "# No. of Equation Systems");
500
501 for (auto & [sys_name, sys] : _systems)
502 {
503 // Ignore this system if it has been marked as hidden
504 if (sys->hide_output()) continue;
505
506 // 3.)
507 // Write the name of the sys_num-th system
508 {
509 const unsigned int sys_num = sys->number();
510
511 comment = "# Name, System No. ";
512 comment += std::to_string(sys_num);
513
514 // Note: There is no Xdr::data overload taking a "const
515 // std::string &" so we need to make a copy.
516 std::string copy = sys_name;
517 io.data (copy, comment);
518 }
519
520 // 4.)
521 // Write the type of system handled
522 {
523 const unsigned int sys_num = sys->number();
524 std::string sys_type = sys->system_type();
525
526 comment = "# Type, System No. ";
527 comment += std::to_string(sys_num);
528
529 io.data (sys_type, comment);
530 }
531
532 // 5.) - 9.)
533 // Let System::write_header() do the job
534 sys->write_header (io, version, write_additional_data);
535 }
536 }
537
538 // Start from the first system, again,
539 // to write vectors to disk, if wanted
540 if (write_data)
541 {
542 for (auto & pr : _systems)
543 {
544 // Ignore this system if it has been marked as hidden
545 if (pr.second->hide_output()) continue;
546
547 // 10.) + 11.)
548 if (write_parallel_files)
549 pr.second->write_parallel_data (*local_io,write_additional_data);
550 else
551 pr.second->write_serialized_data (io,write_additional_data);
552 }
553
554 if (local_io)
555 local_io->close();
556 }
557
558 io.close();
559 }
560
561 // the EquationSystems::write() method should look constant,
562 // but we need to undo the temporary numbering of the nodes
563 // and elements in the mesh, which requires that we abuse const_cast
564 if (partition_agnostic)
565 const_cast<MeshBase &>(_mesh).fix_broken_node_and_element_numbering();
566}
std::string get_io_compatibility_version()
Specifier for I/O file compatibility features.

References _mesh, _systems, libMesh::Xdr::close(), libMesh::Xdr::data(), libMesh::get_io_compatibility_version(), get_mesh(), libMesh::MeshTools::Private::globally_renumber_nodes_and_elements(), libMesh::libmesh_assert(), mesh, libMesh::ParallelObject::processor_id(), libMesh::Xdr::set_version(), WRITE_ADDITIONAL_DATA, WRITE_DATA, WRITE_PARALLEL_FILES, and libMesh::Xdr::writing().

Friends And Related Symbol Documentation

◆ operator<<

std::ostream & operator<< ( std::ostream &  os,
const EquationSystems es 
)
friend

Same as above, but allows you to also use stream syntax.

Definition at line 1834 of file equation_systems.C.

1836{
1837 es.print_info(os);
1838 return os;
1839}

Member Data Documentation

◆ _communicator

const Parallel::Communicator& libMesh::ParallelObject::_communicator
protectedinherited

◆ _counts

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

Actually holds the data.

Definition at line 124 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::get_info().

◆ _enable_default_ghosting

bool libMesh::EquationSystems::_enable_default_ghosting
protected

Flag for whether to enable default ghosting on newly added Systems.

Default value: true

Definition at line 634 of file equation_systems.h.

Referenced by add_system(), and enable_default_ghosting().

◆ _enable_print_counter

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 143 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _mesh

MeshBase& libMesh::EquationSystems::_mesh
protected

◆ _mutex

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 137 of file reference_counter.h.

◆ _n_objects

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

◆ _refine_in_reinit

bool libMesh::EquationSystems::_refine_in_reinit
protected

Flag for whether to call coarsen/refine in reinit().

Default value: true

Definition at line 628 of file equation_systems.h.

Referenced by disable_refine_in_reinit(), enable_refine_in_reinit(), refine_in_reinit_flag(), and reinit_solutions().

◆ _systems

std::map<std::string, std::unique_ptr<System>, std::less<> > libMesh::EquationSystems::_systems
protected

◆ parameters

Parameters libMesh::EquationSystems::parameters

Data structure holding arbitrary parameters.

Definition at line 608 of file equation_systems.h.

Referenced by add_M_C_K_helmholtz(), assemble_biharmonic(), assemble_cd(), assemble_cd(), assemble_divgrad(), assemble_ellipticdg(), assemble_func(), assemble_helmholtz(), assemble_poisson(), assemble_SchroedingerEquation(), assemble_shell(), assemble_shell(), assemble_stokes(), assemble_wave(), assemble_wave(), libMesh::ExactSolution::attach_exact_deriv(), libMesh::ExactSolution::attach_exact_hessian(), libMesh::ExactSolution::attach_exact_value(), clear(), libMesh::NewmarkSystem::clear(), libMesh::FrequencySystem::clear_all(), compute_jacobian(), compute_residual(), LargeDeformationElasticity::compute_stresses(), LinearElasticityWithContact::compute_stresses(), EquationSystems(), fe_assembly(), fill_dirichlet_bc(), libMesh::ExactErrorEstimator::find_squared_element_error(), libMesh::ImplicitSystem::get_linear_solve_parameters(), libMesh::FEComputeData::init(), init_cd(), HeatSystem::init_data(), libMesh::FrequencySystem::init_data(), init_sys(), initialize(), LargeDeformationElasticity::jacobian(), line_print(), main(), libMesh::FrequencySystem::n_frequencies(), libMesh::NewmarkSystem::NewmarkSystem(), libMesh::NonlinearImplicitSystem::NonlinearImplicitSystem(), LargeDeformationElasticity::residual(), LinearElasticityWithContact::residual_and_jacobian(), run_timestepping(), libMesh::FrequencySystem::set_current_frequency(), libMesh::FrequencySystem::set_frequencies(), libMesh::FrequencySystem::set_frequencies_by_range(), libMesh::FrequencySystem::set_frequencies_by_steps(), set_initial_condition(), libMesh::NewmarkSystem::set_newmark_parameters(), libMesh::NonlinearImplicitSystem::set_solver_parameters(), setup(), SolidSystem::side_time_derivative(), libMesh::RBConstruction::solve_for_matrix_and_rhs(), libMesh::EigenSystem::solve_helper(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), ProjectSolutionTest::test_partial_project_solution(), MeshFunctionTest::test_subdomain_id_sets(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyNodalSolutionImpl(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), SystemsTest::testProjectCube(), SystemsTest::testProjectCubeWithMeshFunction(), MeshInputTest::testProjectionRegression(), SystemsTest::testProjectLine(), SystemsTest::testProjectSquare(), EquationSystemsTest::testRepartitionThenReinit(), SystemsTest::testSetSystemParameterOverEquationSystem(), MeshInputTest::testSingleElementImpl(), and libMesh::WrappedFunction< Output >::WrappedFunction().


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