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

The Biharmonic class encapsulates most of the data structures necessary to calculate the biharmonic residual and Jacobian, auxiliary quantities, to take a timestep, and to output the state – biharmonic solution and vectors of auxiliary quantities. More...

#include <biharmonic.h>

Inheritance diagram for Biharmonic:
[legend]

Classes

class  JR
 Biharmonic's friend class definition. More...
 

Public Types

enum  InitialStateEnum { STRIP = 0 , ROD = 1 , BALL = 2 }
 
enum  FreeEnergyEnum { DOUBLE_WELL = 1 , DOUBLE_OBSTACLE = 2 , LOG_DOUBLE_WELL = 3 , LOG_DOUBLE_OBSTACLE = 4 }
 
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

 Biharmonic (ReplicatedMesh &mesh)
 Constructor retrieves command-line options, setting defaults, if necessary.
 
 ~Biharmonic ()
 Destructor.
 
bool verbose ()
 
Real dt0 ()
 
Real dt ()
 
void viewParameters ()
 
void init ()
 Initialize all the systems.
 
void step (const Real &dt=-1.0)
 
void output (int timestep, const Real &t, Real &o_t, bool force=false)
 
void run ()
 
virtual void clear ()
 Restores the data structure to a pristine state.
 
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 System & get_system (std::string_view name) const
 
System & get_system (std::string_view name)
 
const System & get_system (const unsigned int num) const
 
System & get_system (const unsigned int num)
 
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.
 
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, bool allow_high_order_discontinuous=false) 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, bool allow_high_order_discontinuous=false) 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, bool allow_high_order_discontinuous=false) 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, bool allow_high_order_discontinuous=false) 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 MeshBase & get_mesh () const
 
MeshBase & get_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::Communicator & comm () 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, bool allow_high_order_discontinuous=false)
 
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

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.
 

Private Attributes

unsigned int _dim
 
unsigned int _N
 
Real _kappa
 
Real _theta
 
Real _theta_c
 
Real _tol
 
bool _growth
 
bool _degenerate
 
bool _cahn_hillard
 
bool _netforce
 
FreeEnergyEnum _energy
 
int _log_truncation
 
bool _verbose
 
InitialStateEnum _initialState
 
Point _initialCenter
 
Real _initialWidth
 
Real _dt0
 
Real _dt
 
Real _t0
 
Real _T
 
Real _t1
 
Real _cnWeight
 
std::string _ofile_base
 
std::string _ofile
 
std::unique_ptr< ExodusII_IO > _exio
 
Real _o_dt
 
int _o_count
 
ReplicatedMesh & _mesh
 
JR * _jr
 

Friends

class JR
 

Detailed Description

The Biharmonic class encapsulates most of the data structures necessary to calculate the biharmonic residual and Jacobian, auxiliary quantities, to take a timestep, and to output the state – biharmonic solution and vectors of auxiliary quantities.

The main reason for this design is to have a data structure that has all of the necessary data in one place, where all of the calculation subroutines can access these data. Currently these data are split up among several interdependent objects with no clear hierarchy between them: mesh, equation system, equation system bundle, residual/Jacobian calculator.

Since no object contains all others and the data are distributed among many objects, the natural control and data flow resides outside of these objects and is typically implemented in main(). We, however, would like to split the calculation into natural chunks – subroutines – while retaining these subroutines access to the common necessary data – biharmonic parameters, mesh and time interval sizes, etc. Thus, class Biharmonic. Finally, making Biharmonic inherit from EquationSystems makes it possible to include it in the most common callbacks that do not pass back a user context, but only an EquationSystems object.

Definition at line 45 of file biharmonic.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

◆ FreeEnergyEnum

Enumerator
DOUBLE_WELL 
DOUBLE_OBSTACLE 
LOG_DOUBLE_WELL 
LOG_DOUBLE_OBSTACLE 

Definition at line 54 of file biharmonic.h.

54 {DOUBLE_WELL = 1,
@ LOG_DOUBLE_OBSTACLE
Definition biharmonic.h:57
@ LOG_DOUBLE_WELL
Definition biharmonic.h:56
@ DOUBLE_OBSTACLE
Definition biharmonic.h:55

◆ InitialStateEnum

Enumerator
STRIP 
ROD 
BALL 

Definition at line 49 of file biharmonic.h.

49 {STRIP = 0,
50 ROD = 1,
51 BALL = 2};

◆ 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

◆ Biharmonic()

Biharmonic::Biharmonic ( ReplicatedMesh &  mesh)

Constructor retrieves command-line options, setting defaults, if necessary.

It then builds the mesh using these options, then the equations systems around it, and, finally, sets up the output. We recommend that this be used through the factory Create function, which allocates the mesh. In that case don't forget to call Destroy at the end, to free the mesh up.

Definition at line 16 of file biharmonic.C.

16 :
18 _mesh(mesh)
19{
20 // Retrieve parameters and set defaults
21 _verbose = false;
22 _growth = false;
23 _degenerate = false;
24 _cahn_hillard = false;
25 _netforce = false;
26
27 if (on_command_line("--verbose"))
28 _verbose = true;
29 if (on_command_line("--growth"))
30 _growth = true;
31 if (on_command_line("--degenerate"))
32 _degenerate = true;
33 if (on_command_line("--cahn_hillard"))
34 _cahn_hillard = true;
35 if (on_command_line("--netforce"))
36 _netforce = true;
37
38 _kappa = command_line_value("kappa", 1.0);
39
40 // "type of energy (double well, double obstacle, logarithmic+double well, logarithmic+double obstacle)"
41 std::string energy = command_line_value("energy", std::string("double_well"));
42
43 if (energy == "double_well")
45 else if (energy == "double_obstacle")
47 else if (energy == "log_double_well")
49 else if (energy == "log_double_obstacle")
51 else
52 libmesh_error_msg("Unknown energy type: " << energy);
53
54 _tol = command_line_value("tol", 1.0e-8);
55 _theta = command_line_value("theta", .001);
56 _theta_c = command_line_value("theta_c", 1.0);
57
58 // "order of log truncation (0=none, 2=quadratic, 3=cubic)"
59 _log_truncation = command_line_value("log_truncation", 2);
60
61 if (!_log_truncation)
62 libMesh::out << "WARNING: no truncation is being used for the logarithmic free energy term.\nWARNING: division by zero possible!\n";
63
64
65 // Dimension
66 _dim = command_line_value("dim", 1);
67
68 libmesh_assert_msg((_dim <= 3) && (_dim > 0), "Invalid mesh dimension");
69
70 // Build the mesh
71 // Yes, it's better to make a coarse mesh and then refine it. We'll get to it later.
72 _N = command_line_value("N", 8);
73 libmesh_assert_msg(_N > 0, "Invalid mesh size");
74
75 switch (_dim)
76 {
77 case 1:
79 break;
80 case 2:
81 MeshTools::Generation::build_square(_mesh, _N, _N, 0.0, 1.0, 0.0, 1.0, QUAD4);
82 break;
83 case 3:
84 MeshTools::Generation::build_cube(_mesh, _N, _N, _N, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, HEX8);
85 break;
86 default:
87 libmesh_assert_msg((_dim <= 3) && (_dim > 0), "Invalid mesh dimension");
88 break;
89 }
90
91 // Determine the initial timestep size
92 _dt0 = command_line_value("dt", 1.0/(10*_kappa*_N*_N*_N*_N));
93 libmesh_assert_msg(_dt0>=0, "Negative initial timestep");
94
95 _t0 = command_line_value("min_time", 0.0);
96 _t1 = command_line_value("max_time", _t0 + 50.0*_dt0);
97 libmesh_assert_msg(_t1 >= _t0, "Final time less than initial time");
98 _T = _t1 - _t0;
99
100 _cnWeight = command_line_value("crank_nicholson_weight", 1.0);
101 libmesh_assert_msg(_cnWeight <= 1 && _cnWeight >= 0, "Crank-Nicholson weight must be between 0 and 1");
102
103 // Initial state
105 std::string initialState = command_line_value("initial_state", std::string("strip"));
106
107 if (initialState == std::string("ball"))
109 else if (initialState == std::string("strip"))
111 else if (initialState == std::string("rod"))
113 else
114 libmesh_error_msg("Unknown initial state: neither ball nor rod nor strip");
115
116 std::vector<Real> icenter;
117 command_line_vector("initial_center", icenter);
118
119 // Check that the point defining the center was in the right spatial dimension
120 if (icenter.size() > _dim)
121 libmesh_assert_msg(icenter.size() > _dim, "Invalid dimension for the initial state center of mass");
122
123 // Pad
124 icenter.resize(3);
125 for (std::size_t i = icenter.size(); i < _dim; ++i)
126 icenter[i] = 0.5;
127
128 for (unsigned int i = _dim; i < 3; ++i)
129 icenter[i] = 0.0;
130
131 _initialCenter = Point(icenter[0], icenter[1], icenter[2]);
132 _initialWidth = command_line_value("initial_width", 0.125);
133
134 // Output options
135#ifdef LIBMESH_HAVE_EXODUS_API
136 if (on_command_line("output_base"))
137 _ofile_base = command_line_value("output_base", std::string("bih"));
138
139 else
140 {
141 switch(_dim)
142 {
143 case 1:
144 _ofile_base = std::string("bih.1");
145 break;
146 case 2:
147 _ofile_base = std::string("bih.2");
148 break;
149 case 3:
150 _ofile_base = std::string("bih.3");
151 break;
152 default:
153 _ofile_base = std::string("bih");
154 break;
155 }
156 }
157 _ofile = _ofile_base + ".e";
158 _exio = std::make_unique<ExodusII_IO>(_mesh);
159 _o_dt = command_line_value("output_dt", 0.0);
160#endif // #ifdef LIBMESH_HAVE_EXODUS_API
161} // constructor
std::unique_ptr< ExodusII_IO > _exio
Definition biharmonic.h:106
Real _cnWeight
Definition biharmonic.h:103
int _log_truncation
Definition biharmonic.h:97
InitialStateEnum _initialState
Definition biharmonic.h:99
Point _initialCenter
Definition biharmonic.h:100
bool _cahn_hillard
Definition biharmonic.h:95
std::string _ofile_base
Definition biharmonic.h:105
bool _degenerate
Definition biharmonic.h:95
bool _netforce
Definition biharmonic.h:95
Real _theta_c
Definition biharmonic.h:93
unsigned int _N
Definition biharmonic.h:92
Real _kappa
Definition biharmonic.h:93
ReplicatedMesh & _mesh
Definition biharmonic.h:112
bool _growth
Definition biharmonic.h:95
Real _initialWidth
Definition biharmonic.h:101
std::string _ofile
Definition biharmonic.h:105
bool _verbose
Definition biharmonic.h:98
FreeEnergyEnum _energy
Definition biharmonic.h:96
Real _theta
Definition biharmonic.h:93
unsigned int _dim
Definition biharmonic.h:92
This is the EquationSystems class.
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition point.h:41
MeshBase & mesh
void build_square(UnstructuredMesh &mesh, const unsigned int nx, const unsigned int ny, const Real xmin=0., const Real xmax=1., const Real ymin=0., const Real ymax=1., const ElemType type=INVALID_ELEM, const bool gauss_lobatto_grid=false)
A specialized build_cube() for 2D meshes.
void build_line(UnstructuredMesh &mesh, const unsigned int nx, const Real xmin=0., const Real xmax=1., const ElemType type=INVALID_ELEM, const bool gauss_lobatto_grid=false)
A specialized build_cube() for 1D meshes.
void build_cube(UnstructuredMesh &mesh, const unsigned int nx=0, const unsigned int ny=0, const unsigned int nz=0, const Real xmin=0., const Real xmax=1., const Real ymin=0., const Real ymax=1., const Real zmin=0., const Real zmax=1., const ElemType type=INVALID_ELEM, const bool gauss_lobatto_grid=false)
Builds a (elements) cube.
void command_line_vector(const std::string &, std::vector< T > &)
Definition libmesh.C:1044
OStreamProxy out
T command_line_value(const std::string &, T)
Definition libmesh.C:971
bool on_command_line(std::string arg)
Definition libmesh.C:934

References _cahn_hillard, _cnWeight, _degenerate, _dim, _dt0, _energy, _exio, _growth, _initialCenter, _initialState, _initialWidth, _kappa, _log_truncation, _mesh, _N, _netforce, _o_dt, _ofile, _ofile_base, _T, _t0, _t1, _theta, _theta_c, _tol, _verbose, BALL, libMesh::MeshTools::Generation::build_cube(), libMesh::MeshTools::Generation::build_line(), libMesh::MeshTools::Generation::build_square(), libMesh::command_line_value(), libMesh::command_line_vector(), DOUBLE_OBSTACLE, DOUBLE_WELL, libMesh::EDGE2, libMesh::HEX8, LOG_DOUBLE_OBSTACLE, LOG_DOUBLE_WELL, libMesh::on_command_line(), libMesh::out, libMesh::QUAD4, ROD, and STRIP.

◆ ~Biharmonic()

Biharmonic::~Biharmonic ( )
inline

Destructor.

Definition at line 72 of file biharmonic.h.

73 {
74 // delete _meshRefinement;
75 }

Member Function Documentation

◆ _add_system_to_nodes_and_elems()

void libMesh::EquationSystems::_add_system_to_nodes_and_elems ( )
privateinherited

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 1956 of file equation_systems.C.

1957{
1958 // All the nodes
1959 for (auto & node : _mesh.node_ptr_range())
1960 node->add_system();
1961
1962 // All the elements
1965 [](const ElemRange & range)
1966 {
1967 for (Elem * elem : range)
1968 elem->add_system();
1969 });
1970}
MeshBase & _mesh
The mesh data structure.
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:1954
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 libMesh::EquationSystems::add_system().

◆ _remove_default_ghosting()

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

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

Definition at line 1972 of file equation_systems.C.

1973{
1974 this->get_system(sys_num).get_dof_map().remove_default_ghosting();
1975}
const T_sys & get_system(std::string_view name) const

Referenced by libMesh::EquationSystems::add_system().

◆ add_system() [1/2]

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

Add the system named name to the systems array.

Definition at line 708 of file equation_systems.h.

709{
710 if (!_systems.count(name))
711 {
712 const unsigned int sys_num = this->n_systems();
713
714 auto result = _systems.emplace
715 (name, std::make_unique<T_sys>(*this, std::string(name),
716 sys_num));
717
719 this->_remove_default_ghosting(sys_num);
720
721 // Tell all the \p DofObject entities to add a system.
723
724 // Return reference to newly added item
725 auto it = result.first;
726 auto & sys_ptr = it->second;
727 return cast_ref<T_sys &>(*sys_ptr);
728 }
729 else
730 {
731 // We now allow redundant add_system calls, to make it
732 // easier to load data from files for user-derived system
733 // subclasses
734 return this->get_system<T_sys>(name);
735 }
736}
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...
bool _enable_default_ghosting
Flag for whether to enable default ghosting on newly added Systems.
std::map< std::string, std::unique_ptr< System >, std::less<> > _systems
Data structure holding the systems.

References libMesh::EquationSystems::_add_system_to_nodes_and_elems(), libMesh::EquationSystems::_enable_default_ghosting, libMesh::EquationSystems::_remove_default_ghosting(), libMesh::EquationSystems::_systems, and libMesh::EquationSystems::n_systems().

◆ add_system() [2/2]

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

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

Definition at line 356 of file equation_systems.C.

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

References libMesh::EquationSystems::_systems, and libMesh::EquationSystems::get_system().

Referenced by assemble_and_solve(), build_system(), main(), main(), libMesh::ErrorVector::plot_error(), libMesh::EquationSystems::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(), FEOrientationTestBase< order, family >::test_conformity_across_sides(), 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::testExodusCopyHighOrderElementSolution(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), SystemsTest::testFirstScalarNumber(), DofMapTest::testGhostConstraintSendList(), EquationSystemsTest::testInit(), MeshAssignTest::testMeshMoveAssign(), HeterogeneousNonlinearConstraintTest::testNonzeroDirichletValues(), 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())
virtualinherited

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 458 of file equation_systems.C.

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

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

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

◆ allgather()

void libMesh::EquationSystems::allgather ( )
inherited

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

Definition at line 278 of file equation_systems.C.

279{
280 // A serial mesh means nothing needs to be done
281 if (_mesh.is_serial())
282 return;
283
284 const unsigned int n_sys = this->n_systems();
285
286 libmesh_assert_not_equal_to (n_sys, 0);
287
288 // Gather the mesh
290
291 // Tell all the \p DofObject entities how many systems
292 // there are.
293 for (auto & node : _mesh.node_ptr_range())
294 node->set_n_systems(n_sys);
295
298 [n_sys](const ElemRange & range)
299 {
300 for (Elem * elem : range)
301 elem->set_n_systems(n_sys);
302 });
303
304 // And distribute each system's dofs
305 for (auto i : make_range(this->n_systems()))
306 {
307 System & sys = this->get_system(i);
308 DofMap & dof_map = sys.get_dof_map();
309 dof_map.distribute_dofs(_mesh);
310
311 // The user probably won't need constraint equations or the
312 // send_list after an allgather, but let's keep it in consistent
313 // shape just in case.
314 sys.reinit_constraints();
315
316 // Even if there weren't any constraint changes,
317 // reinit_constraints() did prepare_send_list() for us.
318 }
319}
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 libMesh::EquationSystems::_mesh, libMesh::MeshBase::allgather(), libMesh::DofMap::distribute_dofs(), libMesh::MeshBase::element_stored_range(), libMesh::System::get_dof_map(), libMesh::EquationSystems::get_system(), libMesh::MeshBase::is_serial(), libMesh::make_range(), libMesh::EquationSystems::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
inherited

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 1433 of file equation_systems.C.

1439{
1440 LOG_SCOPE("build_discontinuous_solution_vector()", "EquationSystems");
1441
1442 libmesh_assert (this->n_systems());
1443
1444 const std::vector<std::string> component_suffix = {"_x", "_y", "_z"};
1445 const auto requested_components =
1446 [this, var_names, &component_suffix](const System & system,
1447 const unsigned int var)
1448 {
1449 std::vector<unsigned int> components;
1450
1451 const std::string & var_name = system.variable_name(var);
1452 const FEType & fe_type = system.variable_type(var);
1453 const unsigned int n_vec_dim = FEInterface::n_vec_dim(_mesh, fe_type);
1454
1455 if (FEInterface::field_type(fe_type) == TYPE_VECTOR)
1456 {
1457 libmesh_error_msg_if(n_vec_dim > component_suffix.size(),
1458 "Invalid dim in build_discontinuous_solution_vector");
1459
1460 const bool use_all_components =
1461 (var_names == nullptr) ||
1462 std::count(var_names->begin(), var_names->end(), var_name);
1463
1464 if (n_vec_dim <= 1)
1465 {
1466 if (use_all_components)
1467 components.push_back(0);
1468 }
1469 else
1470 for (auto comp : make_range(n_vec_dim))
1471 {
1472 const std::string component_name = var_name + component_suffix[comp];
1473 if (use_all_components ||
1474 std::count(var_names->begin(), var_names->end(), component_name))
1475 components.push_back(comp);
1476 }
1477 }
1478 else if (var_names == nullptr ||
1479 std::count(var_names->begin(), var_names->end(), var_name))
1480 components.push_back(0);
1481
1482 return components;
1483 };
1484
1485 // Get the number of variables (nv) by counting the number of variables
1486 // in each system listed in system_names
1487 unsigned int nv = 0;
1488
1489 for (const auto & [sys_name, sys_ptr] : _systems)
1490 {
1491 // Check current system is listed in system_names, and skip pos if not
1492 bool use_current_system = (system_names == nullptr);
1493 if (!use_current_system)
1494 use_current_system = system_names->count(sys_name);
1495 if (!use_current_system || sys_ptr->hide_output())
1496 continue;
1497
1498 // Loop over all variables in this System and check whether we
1499 // are supposed to use each one.
1500 for (auto var_id : make_range(sys_ptr->n_vars()))
1501 nv += cast_int<unsigned int>(requested_components(*sys_ptr, var_id).size());
1502 }
1503
1504 // get the total "weight" - the number of nodal values to write for
1505 // each variable.
1506 unsigned int tw=0;
1507 for (const auto & elem : _mesh.active_element_ptr_range())
1508 {
1509 tw += vertices_only ? elem->n_vertices() : elem->n_nodes();
1510
1511 if (add_sides)
1512 {
1513 for (auto s : elem->side_index_range())
1514 {
1515 if (redundant_added_side(*elem,s))
1516 continue;
1517
1518 const std::vector<unsigned int> side_nodes =
1519 elem->nodes_on_side(s);
1520
1521 if (!vertices_only)
1522 tw += side_nodes.size();
1523 else
1524 for (auto n : index_range(side_nodes))
1525 if (elem->is_vertex(side_nodes[n]))
1526 ++tw;
1527 }
1528 }
1529 }
1530
1531 // Only if we are on processor zero, allocate the storage
1532 // to hold (number_of_nodes)*(number_of_variables) entries.
1533 if (_mesh.processor_id() == 0)
1534 soln.resize(tw*nv);
1535
1536 std::vector<Number> sys_soln;
1537
1538 // Keep track of the variable "offset". This is used for indexing
1539 // into the global solution vector.
1540 unsigned int var_offset = 0;
1541
1542 // For each system in this EquationSystems object,
1543 // update the global solution and if we are on processor 0,
1544 // loop over the elements and build the nodal solution
1545 // from the element solution. Then insert this nodal solution
1546 // into the vector passed to build_solution_vector.
1547 for (const auto & [sys_name, system] : _systems)
1548 {
1549 // Check current system is listed in system_names, and skip pos if not
1550 bool use_current_system = (system_names == nullptr);
1551 if (!use_current_system)
1552 use_current_system = system_names->count(sys_name);
1553 if (!use_current_system || system->hide_output())
1554 continue;
1555
1556 const unsigned int nv_sys = system->n_vars();
1557 const auto & dof_map = system->get_dof_map();
1558
1559 system->update_global_solution (sys_soln, 0);
1560
1561 // Keep track of the number of vars actually written.
1562 unsigned int n_vars_written_current_system = 0;
1563
1564 if (_mesh.processor_id() == 0)
1565 {
1566 std::vector<Number> soln_coeffs; // The finite element solution coeffs
1567 std::vector<Number> nodal_soln; // The FE solution interpolated to the nodes
1568 std::vector<dof_id_type> dof_indices; // The DOF indices for the finite element
1569
1570 // For each variable, determine if we are supposed to
1571 // write it, then loop over the active elements, compute
1572 // the nodal_soln and store it to the "soln" vector. We
1573 // store zeros for subdomain-restricted variables on
1574 // elements where they are not active.
1575 for (auto var : make_range(nv_sys))
1576 {
1577 const std::vector<unsigned int> components_to_write =
1578 requested_components(*system, var);
1579
1580 // If we aren't supposed to write this var, go to the
1581 // next loop iteration.
1582 if (components_to_write.empty())
1583 continue;
1584
1585 const FEType & fe_type = system->variable_type(var);
1586 const Variable & var_description = system->variable(var);
1587 const bool add_p_level = fe_type.p_refinement;
1588 const unsigned int n_vec_dim = FEInterface::n_vec_dim(_mesh, fe_type);
1589
1590 unsigned int nn=0;
1591
1592 for (auto & elem : _mesh.active_element_ptr_range())
1593 {
1594 if (var_description.active_on_subdomain(elem->subdomain_id()))
1595 {
1596 dof_map.dof_indices (elem, dof_indices, var);
1597
1598 soln_coeffs.resize(dof_indices.size());
1599
1600 for (auto i : index_range(dof_indices))
1601 soln_coeffs[i] = sys_soln[dof_indices[i]];
1602
1603 // Compute the FE solution at all the nodes, but
1604 // only use the first n_vertices() entries if
1605 // vertices_only == true.
1606 FEInterface::nodal_soln (elem->dim(),
1607 fe_type,
1608 elem,
1609 soln_coeffs,
1610 nodal_soln,
1611 add_p_level,
1612 n_vec_dim);
1613
1614 // infinite elements should be skipped...
1615 if (!elem->infinite())
1616 {
1617 libmesh_assert_equal_to (nodal_soln.size(), elem->n_nodes()*n_vec_dim);
1618
1619 const unsigned int n_vals =
1620 vertices_only ? elem->n_vertices() : elem->n_nodes();
1621
1622 for (auto n : make_range(n_vals))
1623 {
1624 // Compute index into global solution vector.
1625 std::size_t index =
1626 nv * (nn++) + (n_vars_written_current_system + var_offset);
1627
1628 for (auto component_index : index_range(components_to_write))
1629 soln[index + component_index] +=
1630 nodal_soln[n_vec_dim*n + components_to_write[component_index]];
1631 }
1632 }
1633 }
1634 else
1635 nn += vertices_only ? elem->n_vertices() : elem->n_nodes();
1636 } // end loop over active elements writing interiors
1637
1638 // Loop writing "fake" sides, if requested
1639 if (add_sides)
1640 {
1641 // We don't build discontinuous solution vectors in
1642 // parallel yet, but we'll do ordering of fake side
1643 // values as if we did, for consistency with the
1644 // parallel continuous ordering and for future
1645 // compatibility.
1646 std::vector<std::vector<const Elem *>>
1647 elems_by_pid(_mesh.n_processors());
1648
1649 for (const auto & elem : _mesh.active_element_ptr_range())
1650 elems_by_pid[elem->processor_id()].push_back(elem);
1651
1652 for (auto p : index_range(elems_by_pid))
1653 for (const Elem * elem : elems_by_pid[p])
1654 {
1655 if (var_description.active_on_subdomain(elem->subdomain_id()))
1656 {
1657 dof_map.dof_indices (elem, dof_indices, var);
1658
1659 soln_coeffs.resize(dof_indices.size());
1660
1661 for (auto i : index_range(dof_indices))
1662 soln_coeffs[i] = sys_soln[dof_indices[i]];
1663
1664 for (auto s : elem->side_index_range())
1665 {
1666 if (redundant_added_side(*elem,s))
1667 continue;
1668
1669 const std::vector<unsigned int> side_nodes =
1670 elem->nodes_on_side(s);
1671
1672 // Compute the FE solution at all the
1673 // side nodes, but only use those for
1674 // which is_vertex() == true if
1675 // vertices_only == true.
1677 (fe_type, elem, s, soln_coeffs,
1678 nodal_soln, add_p_level,
1679 n_vec_dim);
1680
1681 libmesh_assert_equal_to
1682 (nodal_soln.size(),
1683 side_nodes.size()*n_vec_dim);
1684
1685 // If we don't have a continuous FE
1686 // then we want to average between
1687 // sides, at least in the equal-level
1688 // case where it's easy. This is
1689 // analogous to our repeat_count
1690 // behavior elsewhere.
1691 const FEContinuity cont =
1693 const Elem * const neigh = elem->neighbor_ptr(s);
1694
1695 if ((cont == DISCONTINUOUS || cont == H_CURL || cont == H_DIV) &&
1696 neigh &&
1697 neigh->level() == elem->level() &&
1698 var_description.active_on_subdomain(neigh->subdomain_id()))
1699 {
1700 std::vector<dof_id_type> neigh_indices;
1701 dof_map.dof_indices (neigh, neigh_indices, var);
1702 std::vector<Number> neigh_coeffs(neigh_indices.size());
1703
1704 for (auto i : index_range(neigh_indices))
1705 neigh_coeffs[i] = sys_soln[neigh_indices[i]];
1706
1707 const unsigned int s_neigh =
1708 neigh->which_neighbor_am_i(elem);
1709 std::vector<Number> neigh_soln;
1711 (fe_type, neigh, s_neigh,
1712 neigh_coeffs, neigh_soln, add_p_level,
1713 n_vec_dim);
1714
1715 const std::vector<unsigned int> neigh_nodes =
1716 neigh->nodes_on_side(s_neigh);
1717 for (auto n : index_range(side_nodes))
1718 for (auto neigh_n : index_range(neigh_nodes))
1719 if (neigh->node_ptr(neigh_nodes[neigh_n])
1720 == elem->node_ptr(side_nodes[n]))
1721 for (auto comp : make_range(n_vec_dim))
1722 {
1723 const auto nodal_index = n_vec_dim*n + comp;
1724 nodal_soln[nodal_index] +=
1725 neigh_soln[n_vec_dim*neigh_n + comp];
1726 nodal_soln[nodal_index] /= 2;
1727 }
1728 }
1729
1730 for (auto n : index_range(side_nodes))
1731 {
1732 if (vertices_only &&
1733 !elem->is_vertex(n))
1734 continue;
1735
1736 // Compute index into global solution vector.
1737 std::size_t index =
1738 nv * (nn++) + (n_vars_written_current_system + var_offset);
1739
1740 for (auto component_index : index_range(components_to_write))
1741 soln[index + component_index] +=
1742 nodal_soln[n_vec_dim*n + components_to_write[component_index]];
1743 }
1744 }
1745 }
1746 else
1747 {
1748 nn += vertices_only ? elem->n_vertices() : elem->n_nodes();
1749
1750 for (auto s : elem->side_index_range())
1751 {
1752 if (redundant_added_side(*elem,s))
1753 continue;
1754
1755 const std::vector<unsigned int> side_nodes =
1756 elem->nodes_on_side(s);
1757
1758 for (auto n : index_range(side_nodes))
1759 {
1760 if (vertices_only &&
1761 !elem->is_vertex(n))
1762 continue;
1763 nn++;
1764 }
1765 }
1766 }
1767 } // end loop over active elements, writing "fake" sides
1768 }
1769 // If we made it here, we actually wrote a variable, so increment
1770 // the number of variables actually written for the current system.
1771 n_vars_written_current_system += cast_int<unsigned int>(components_to_write.size());
1772
1773 } // end loop over vars
1774 } // end if proc 0
1775
1776 // Update offset for next loop iteration.
1777 var_offset += n_vars_written_current_system;
1778 } // end loop over systems
1779}
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,
bool  allow_high_order_discontinuous = false 
) const
inherited

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. See is_elemental_data_fe_type() for allow_high_order_discontinuous.

Definition at line 596 of file equation_systems.C.

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

References libMesh::EquationSystems::_mesh, libMesh::EquationSystems::_systems, dim, libMesh::FEInterface::field_type(), libMesh::EquationSystems::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,
bool  allow_high_order_discontinuous = false 
) const
inherited

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. See is_elemental_data_fe_type() for allow_high_order_discontinuous; when true, higher-order discontinuous variables are included and their values are a quadrature average over each element rather than a single DOF.

Definition at line 1095 of file equation_systems.C.

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

References libMesh::EquationSystems::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,
bool  allow_high_order_discontinuous = false 
) const
inherited

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.

See is_elemental_data_fe_type() for allow_high_order_discontinuous; when true, the value stored for a higher-order discontinuous variable is a quadrature average of its solution over each element, rather than a single DOF.

Definition at line 1246 of file equation_systems.C.

1248{
1249 // Filter any names that aren't elemental variables and get the system indices for those that are.
1250 // Note that it's probably fine if the names vector is empty since we'll still filter out all
1251 // non-elemental-data variables. If there are none, then nothing is output here.
1252 std::vector<std::pair<unsigned int, unsigned int>> var_nums =
1253 this->find_elemental_data_variable_numbers(names, allow_high_order_discontinuous);
1254
1255 const std::size_t nv = names.size(); /*total number of vars including vector components*/
1256 const dof_id_type ne = _mesh.n_elem();
1257 libmesh_assert_equal_to (ne, _mesh.max_elem_id());
1258
1259 // If there are no variables to write out don't do anything...
1260 if (!nv)
1261 return std::unique_ptr<NumericVector<Number>>(nullptr);
1262
1263 // We can handle the case where there are nullptrs in the Elem vector
1264 // by just having extra zeros in the solution vector.
1265 numeric_index_type parallel_soln_global_size = ne*nv;
1266
1267 numeric_index_type div = parallel_soln_global_size / this->n_processors();
1268 numeric_index_type mod = parallel_soln_global_size % this->n_processors();
1269
1270 // Initialize all processors to the average size.
1271 numeric_index_type parallel_soln_local_size = div;
1272
1273 // The first "mod" processors get an extra entry.
1274 if (this->processor_id() < mod)
1275 parallel_soln_local_size = div+1;
1276
1277 // Create a NumericVector to hold the parallel solution
1278 std::unique_ptr<NumericVector<Number>> parallel_soln_ptr = NumericVector<Number>::build(_communicator);
1279 NumericVector<Number> & parallel_soln = *parallel_soln_ptr;
1280 parallel_soln.init(parallel_soln_global_size,
1281 parallel_soln_local_size,
1282 /*fast=*/false,
1283 /*ParallelType=*/PARALLEL);
1284
1285 unsigned int sys_ctr = 0;
1286 unsigned int var_ctr = 0;
1287 for (auto i : index_range(var_nums))
1288 {
1289 std::pair<unsigned int, unsigned int> var_num = var_nums[i];
1290 const System & system = this->get_system(var_num.first);
1291
1292 // Update the current_local_solution if necessary
1293 if (sys_ctr != var_num.first)
1294 {
1295 System & non_const_sys = const_cast<System &>(system);
1296 // We used to simply call non_const_sys.solution->close()
1297 // here, but that is not allowed when the solution vector is
1298 // locked read-only, for example when printing the solution
1299 // during during the middle of a solve... So try to be a bit
1300 // more careful about calling close() unnecessarily.
1301 libmesh_assert(this->comm().verify(non_const_sys.solution->closed()));
1302 if (!non_const_sys.solution->closed())
1303 non_const_sys.solution->close();
1304 non_const_sys.update();
1305 sys_ctr = var_num.first;
1306 }
1307
1308 NumericVector<Number> & sys_soln(*system.current_local_solution);
1309
1310 const unsigned int var = var_num.second;
1311
1312 const Variable & variable = system.variable(var);
1313 const DofMap & dof_map = system.get_dof_map();
1314
1315 // We need to check if the elemental data variable is a scalar or a vector and set the number of
1316 // components for the latter as per es.find_variable_numbers().
1317 // Even for the case where a variable is not active on any subdomain belonging to the
1318 // processor, we still need to know this number to update 'var_ctr'.
1319 const auto & var_type = system.variable_type(var);
1320 const FEFieldType field_type = FEInterface::field_type(var_type);
1321 const unsigned int n_comps =
1322 (field_type == TYPE_VECTOR) ?
1323 FEInterface::n_vec_dim(_mesh, var_type) : 1;
1324
1325 // Elemental data variables are normally CONSTANT order, in which case
1326 // there is exactly one DOF per component and we can just copy it
1327 // directly. When allow_high_order_discontinuous permits a
1328 // non-CONSTANT order variable through, a single DOF no longer
1329 // represents the element's value, so we instead compute a
1330 // quadrature-weighted average of the FE solution over the element.
1331 const bool need_quadrature_average =
1332 allow_high_order_discontinuous && var_type.order != CONSTANT;
1333
1334 // Loop over all elements in the mesh and index all components of the variable if it's active
1337 [&system, &dof_map, &variable, ne, var, var_ctr, n_comps, field_type,
1338 need_quadrature_average, &parallel_soln, &sys_soln](const ConstElemRange & range)
1339 {
1340 // The DOF indices for the finite element
1341 std::vector<dof_id_type> dof_indices;
1342
1343 // FE context for the quadrature-average path. It is built here,
1344 // inside the parallel_for lambda body, so that each range
1345 // invocation (which runs single-threaded) owns its own; sharing
1346 // FE objects across threads would race on reinit().
1347 std::unique_ptr<FEMContext> con;
1348 if (need_quadrature_average)
1349 {
1350 const std::vector<unsigned int> active_vars {var};
1351 con = std::make_unique<FEMContext>(system, &active_vars,
1352 /*allocate_local_matrices=*/false);
1353 }
1354
1355 // Quadrature-weighted average of the variable over elem. The
1356 // second argument only selects the value type: Number for
1357 // scalar variables, Gradient for vector-valued ones.
1358 auto element_average = [&con, &system, var](const Elem * elem, auto zero_value)
1359 {
1360 typedef decltype(zero_value) OutputType;
1361 typedef typename TensorTools::MakeReal<OutputType>::type OutputShape;
1362
1363 con->pre_fe_reinit(system, elem);
1364
1365 // Request what interior_value() needs before reinit
1366 FEGenericBase<OutputShape> * fe = nullptr;
1367 con->get_element_fe(var, fe);
1368 const std::vector<Real> & JxW = fe->get_JxW();
1369 fe->get_phi();
1370
1371 con->elem_fe_reinit();
1372
1373 OutputType avg = zero_value;
1374 Real vol = 0;
1375 for (auto qp : index_range(JxW))
1376 {
1377 OutputType u_h;
1378 con->interior_value(var, qp, u_h);
1379 avg += JxW[qp] * u_h;
1380 vol += JxW[qp];
1381 }
1382 avg /= vol;
1383 return avg;
1384 };
1385
1386 for (const Elem * elem : range)
1387 {
1388 if (variable.active_on_subdomain(elem->subdomain_id()))
1389 {
1390 if (need_quadrature_average)
1391 {
1392 if (field_type == TYPE_SCALAR)
1393 parallel_soln.set(ne * var_ctr + elem->id(), element_average(elem, Number()));
1394 else
1395 {
1396 const Gradient avg = element_average(elem, Gradient());
1397 for (unsigned int comp = 0; comp < n_comps; comp++)
1398 parallel_soln.set(ne * (var_ctr + comp) + elem->id(), avg(comp));
1399 }
1400 }
1401 else
1402 {
1403 dof_map.dof_indices(elem, dof_indices, var);
1404
1405 // The number of DOF components needs to be equal to the expected number so that we know
1406 // where to store data to correctly correspond to variable names.
1407 libmesh_assert_equal_to(dof_indices.size(), n_comps);
1408
1409 for (unsigned int comp = 0; comp < n_comps; comp++)
1410 parallel_soln.set(ne * (var_ctr + comp) + elem->id(), sys_soln(dof_indices[comp]));
1411 }
1412 }
1413 }
1414 });
1415
1416 var_ctr += n_comps;
1417 } // end loop over var_nums
1418
1419 // NOTE: number of output names might not be equal to the number passed to this function. Any that
1420 // aren't elemental data variables have been filtered out (see
1421 // EquationSystems::find_variable_numbers).
1422 //
1423 // But, if everything is accounted for properly, then names.size() == var_ctr
1424 libmesh_assert_equal_to(names.size(), var_ctr);
1425
1426 parallel_soln.close();
1427 return parallel_soln_ptr;
1428}
std::vector< std::pair< unsigned int, unsigned int > > find_elemental_data_variable_numbers(std::vector< std::string > &names, bool allow_high_order_discontinuous=false) 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:1969
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
NumberVectorValue Gradient
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, libMesh::EquationSystems::_mesh, libMesh::MeshBase::active_local_element_stored_range(), libMesh::NumericVector< T >::build(), libMesh::ParallelObject::comm(), libMesh::CONSTANT, libMesh::System::current_local_solution, libMesh::FEInterface::field_type(), libMesh::EquationSystems::find_elemental_data_variable_numbers(), libMesh::System::get_dof_map(), libMesh::EquationSystems::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::NumericVector< T >::set(), libMesh::System::solution, libMesh::TYPE_SCALAR, libMesh::TYPE_VECTOR, libMesh::System::update(), libMesh::System::variable(), and libMesh::System::variable_type().

Referenced by libMesh::EquationSystems::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
inherited

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 661 of file equation_systems.C.

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

References libMesh::ParallelObject::_communicator, libMesh::EquationSystems::_mesh, libMesh::EquationSystems::_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(), libMesh::EquationSystems::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 libMesh::EquationSystems::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
inherited

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 1052 of file equation_systems.C.

1055{
1056 LOG_SCOPE("build_solution_vector()", "EquationSystems");
1057
1058 // Call the parallel implementation
1059 std::unique_ptr<NumericVector<Number>> parallel_soln =
1060 this->build_parallel_solution_vector(system_names, add_sides);
1061
1062 // Localize the NumericVector into the provided std::vector.
1063 parallel_soln->localize_to_one(soln);
1064}
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 libMesh::EquationSystems::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
inherited

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 649 of file equation_systems.C.

652{
653 // TODO:[BSK] re-implement this from the method below
654 libmesh_not_implemented();
655}

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
inherited

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 468 of file equation_systems.C.

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

References libMesh::EquationSystems::_systems, dim, libMesh::FEInterface::field_type(), libMesh::EquationSystems::get_mesh(), libMesh::make_range(), libMesh::EquationSystems::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 ( )
virtualinherited

Restores the data structure to a pristine state.

Definition at line 72 of file equation_systems.C.

73{
74 // Clear any additional parameters
76
77 // Clear the systems.
78 _systems.clear();
79}
Parameters parameters
Data structure holding arbitrary parameters.
virtual void clear()
Clears internal data structures & frees any allocated memory.
Definition parameters.h:349

References libMesh::EquationSystems::_systems, libMesh::Parameters::clear(), and libMesh::EquationSystems::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(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::PetscDMWrapper::build_section(), libMesh::PetscDMWrapper::build_sf(), libMesh::BoundaryInfo::build_side_list_from_node_list(), libMesh::MeshBase::cache_elem_data(), centroid_l2_error(), libMesh::DofMap::check_dirichlet_bcid_consistency(), libMesh::MeshTetInterface::check_hull_integrity(), MeshInputTest::checkHexPrismPolyhedron(), 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::MeshBase::count_constraint_rows(), 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_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::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(), MeshGenerationTest::polyhedronTetNeighbor(), 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(), libMesh::EquationSystems::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(), MeshGenerationTest::testBuildCube(), BoundaryInfoTest::testBuildSideListFromNodeListThinMesh(), 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
virtualinherited
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 1808 of file equation_systems.C.

1811{
1812 // safety check, whether we handle at least the same number
1813 // of systems
1814 std::vector<bool> os_result;
1815
1816 if (this->n_systems() != other_es.n_systems())
1817 {
1818 if (verbose)
1819 {
1820 libMesh::out << " Fatal difference. This system handles "
1821 << this->n_systems() << " systems," << std::endl
1822 << " while the other system handles "
1823 << other_es.n_systems()
1824 << " systems." << std::endl
1825 << " Aborting comparison." << std::endl;
1826 }
1827 return false;
1828 }
1829 else
1830 {
1831 // start comparing each system
1832 for (const auto & [sys_name, sys_ptr] : _systems)
1833 {
1834 // get the other system
1835 const System & other_system = other_es.get_system (sys_name);
1836
1837 os_result.push_back (sys_ptr->compare (other_system, threshold, verbose));
1838
1839 }
1840
1841 }
1842
1843
1844 // sum up the results
1845 if (os_result.size()==0)
1846 return true;
1847 else
1848 {
1849 bool os_identical;
1850 unsigned int n = 0;
1851 do
1852 {
1853 os_identical = os_result[n];
1854 n++;
1855 }
1856 while (os_identical && n<os_result.size());
1857 return os_identical;
1858 }
1859}

References libMesh::EquationSystems::get_system(), libMesh::EquationSystems::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 ( )
inlineinherited

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

Definition at line 603 of file equation_systems.h.

603{ this->_refine_in_reinit = false; }
bool _refine_in_reinit
Flag for whether to call coarsen/refine in reinit().

References libMesh::EquationSystems::_refine_in_reinit.

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

◆ dt()

Real Biharmonic::dt ( )
inline

Definition at line 81 of file biharmonic.h.

81{ return _dt; }

References _dt.

◆ dt0()

Real Biharmonic::dt0 ( )
inline

Definition at line 80 of file biharmonic.h.

80{ return _dt0; }

References _dt0.

◆ enable_default_ghosting()

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

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 323 of file equation_systems.C.

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

References libMesh::EquationSystems::_enable_default_ghosting, libMesh::DofMap::add_default_ghosting(), libMesh::EquationSystems::get_mesh(), libMesh::EquationSystems::get_system(), libMesh::make_range(), mesh, libMesh::EquationSystems::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 ( )
inlineinherited

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

Definition at line 598 of file equation_systems.h.

598{ this->_refine_in_reinit = true; }

References libMesh::EquationSystems::_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,
bool  allow_high_order_discontinuous = false 
) const
inherited

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, and is_elemental_data_fe_type() for allow_high_order_discontinuous.

Definition at line 1138 of file equation_systems.C.

1140{
1142 (names,
1143 [allow_high_order_discontinuous](const FEType & type)
1144 { return EquationSystems::is_elemental_data_fe_type(type, allow_high_order_discontinuous); });
1145}
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 libMesh::EquationSystems::find_variable_numbers_by_predicate(), and libMesh::EquationSystems::is_elemental_data_fe_type().

Referenced by libMesh::EquationSystems::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
inherited

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 1113 of file equation_systems.C.

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

References libMesh::EquationSystems::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
privateinherited

Implementation detail for find_variable_numbers() variants.

Definition at line 1150 of file equation_systems.C.

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

References libMesh::EquationSystems::_mesh, libMesh::EquationSystems::_systems, dim, libMesh::FEInterface::field_type(), libMesh::index_range(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::EquationSystems::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 libMesh::EquationSystems::find_elemental_data_variable_numbers(), and libMesh::EquationSystems::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
virtualinherited
Returns
A string containing information about the systems, flags, and parameters.

Definition at line 1863 of file equation_systems.C.

1864{
1865 std::ostringstream oss;
1866
1867 unsigned int n_hidden_sys = 0;
1868 for (auto & pr : _systems)
1869 n_hidden_sys += pr.second->hide_output();
1870
1871 oss << " EquationSystems\n"
1872 << " n_systems()=" << this->n_systems()
1873 << (n_hidden_sys ? " (hidden: " + std::to_string(n_hidden_sys) + ")" : "")
1874 << "\n";
1875
1876 // Print the info for the individual systems
1877 for (const auto & pr : _systems)
1878 if (!pr.second->hide_output())
1879 oss << pr.second->get_info();
1880
1881
1882 // // Possibly print the parameters
1883 // if (!this->parameters.empty())
1884 // {
1885 // oss << " n_parameters()=" << this->n_parameters() << '\n';
1886 // oss << " Parameters:\n";
1887
1888 // for (const auto & [key, val] : _parameters)
1889 // oss << " "
1890 // << "\""
1891 // << key
1892 // << "\""
1893 // << "="
1894 // << val
1895 // << '\n';
1896 // }
1897
1898 return oss.str();
1899}
virtual std::string get_info() const

◆ get_mesh() [1/2]

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

Definition at line 691 of file equation_systems.h.

692{
693 return _mesh;
694}

References libMesh::EquationSystems::_mesh.

◆ get_mesh() [2/2]

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

Definition at line 683 of file equation_systems.h.

684{
685 return _mesh;
686}

References libMesh::EquationSystems::_mesh.

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), alternative_fe_assembly(), LinearElasticity::assemble(), assemble(), assemble(), assemble_1D(), assemble_advection_diffusion(), 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::EquationSystems::build_variable_names(), LinearElasticity::compute_stresses(), LargeDeformationElasticity::compute_stresses(), compute_stresses(), libMesh::EquationSystems::enable_default_ghosting(), libMesh::AdjointRefinementEstimator::estimate_error(), fe_assembly(), fill_dirichlet_bc(), libMesh::MeshFunction::init(), LargeDeformationElasticity::jacobian(), LaplaceYoung::jacobian(), periodic_bc_test_poisson(), libMesh::EquationSystems::read(), libMesh::EquationSystems::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(), libMesh::EquationSystems::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)
inlineinherited
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 772 of file equation_systems.h.

773{
774 libmesh_assert_less (num, this->n_systems());
775
776 for (auto & pr : _systems)
777 {
778 auto & sys_ptr = pr.second;
779 if (sys_ptr->number() == num)
780 return cast_ref<T_sys &>(*sys_ptr);
781 }
782
783 // Error if we made it here
784 libmesh_error_msg("ERROR: no system number " << num << " found!");
785}

References libMesh::EquationSystems::_systems, and libMesh::EquationSystems::n_systems().

◆ get_system() [2/8]

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

Definition at line 856 of file equation_systems.h.

857{
858 return this->get_system<System>(num);
859}

◆ get_system() [3/8]

template<typename T_sys >
const T_sys & libMesh::EquationSystems::get_system ( const unsigned int  num) const
inlineinherited
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 753 of file equation_systems.h.

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

References libMesh::EquationSystems::_systems, and libMesh::EquationSystems::n_systems().

◆ get_system() [4/8]

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

Definition at line 848 of file equation_systems.h.

849{
850 return this->get_system<System>(num);
851}

◆ get_system() [5/8]

template<typename T_sys >
T_sys & libMesh::EquationSystems::get_system ( std::string_view  name)
inlineinherited
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 813 of file equation_systems.h.

814{
815 auto pos = _systems.find(name);
816
817 // Check for errors
818 libmesh_error_msg_if(pos == _systems.end(), "ERROR: no system named " << name << " found!");
819
820 // Attempt dynamic cast
821 auto & sys_ptr = pos->second;
822 return cast_ref<T_sys &>(*sys_ptr);
823}

References libMesh::EquationSystems::_systems.

◆ get_system() [6/8]

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

Definition at line 840 of file equation_systems.h.

841{
842 return this->get_system<System>(name);
843}

◆ get_system() [7/8]

template<typename T_sys >
const T_sys & libMesh::EquationSystems::get_system ( std::string_view  name) const
inlineinherited
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 794 of file equation_systems.h.

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

References libMesh::EquationSystems::_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(), libMesh::EquationSystems::add_system(), libMesh::EnsightIO::add_vector(), libMesh::EnsightIO::add_vector(), libMesh::EquationSystems::adjoint_solve(), libMesh::EquationSystems::allgather(), alternative_fe_assembly(), apply_initial(), LinearElasticity::assemble(), assemble(), assemble(), assemble_1D(), assemble_advection_diffusion(), 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(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::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(), libMesh::EquationSystems::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(), libMesh::EquationSystems::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(), libMesh::EquationSystems::read(), MeshFunctionTest::read_variable_info_from_output_data(), libMesh::EquationSystems::reinit_mesh(), libMesh::EquationSystems::reinit_solutions(), libMesh::EquationSystems::reinit_systems(), LargeDeformationElasticity::residual(), LaplaceYoung::residual(), run_timestepping(), SolidSystem::save_initial_mesh(), libMesh::EquationSystems::sensitivity_solve(), set_initial_condition(), SolidSystem::side_time_derivative(), libMesh::EquationSystems::solve(), MixedDimensionMeshTest::testDofOrdering(), MixedDimensionRefinedMeshTest::testDofOrdering(), MixedDimensionNonUniformRefinement::testDofOrdering(), MixedDimensionNonUniformRefinementTriangle::testDofOrdering(), MixedDimensionNonUniformRefinement3D::testDofOrdering(), SlitMeshRefinedSystemTest::testRestart(), libMesh::EquationSystems::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
inlineinherited
Returns
A constant reference to the system named name.

Definition at line 832 of file equation_systems.h.

833{
834 return this->get_system<System>(name);
835}

◆ 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
inherited

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

Definition at line 1068 of file equation_systems.C.

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

References libMesh::EquationSystems::_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
inlineinherited
Returns
true if the system named name exists within this EquationSystems object.

Definition at line 741 of file equation_systems.h.

742{
743 if (_systems.find(name) == _systems.end())
744 return false;
745 return true;
746}

References libMesh::EquationSystems::_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 Biharmonic::init ( )
virtual

Initialize all the systems.

Reimplemented from libMesh::EquationSystems.

Definition at line 212 of file biharmonic.C.

213{
214 // Build the main equation encapsulated in the JR (Jacobian-Residual or J(R) "jet of R") object
215 _jr = &(add_system<Biharmonic::JR>(std::string("Biharmonic::JR")));
216
217 if (_verbose)
218 libMesh::out << ">>> Initializing Biharmonic\n";
219
220 _dt = 0;
221 _o_count = 0;
223
224 if (_verbose)
225 libMesh::out << "<<< Initializing Biharmonic\n";
226}
virtual void init()
Initialize all the systems.

References _dt, _jr, _o_count, _verbose, libMesh::EquationSystems::init(), and libMesh::out.

Referenced by main().

◆ is_elemental_data_fe_type()

bool libMesh::EquationSystems::is_elemental_data_fe_type ( const FEType &  type,
bool  allow_high_order_discontinuous = false 
)
staticinherited
Returns
Whether type can be represented as elemental data.

Elemental data variables are CONSTANT element-interior fields, regardless of their p_refinement flag, unless allow_high_order_discontinuous is true, in which case higher-order discontinuous (MONOMIAL, MONOMIAL_VEC, XYZ) fields are also accepted.

Definition at line 585 of file equation_systems.C.

587{
588 return (type.order == CONSTANT || allow_high_order_discontinuous) &&
589 (type.family == MONOMIAL ||
590 type.family == MONOMIAL_VEC ||
591 type.family == XYZ);
592}

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

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

◆ n_active_dofs()

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

Definition at line 1945 of file equation_systems.C.

1946{
1947 std::size_t tot=0;
1948
1949 for (const auto & pr : _systems)
1950 tot += pr.second->n_active_dofs();
1951
1952 return tot;
1953}
std::size_t n_active_dofs() const

Referenced by main(), and write_output_solvedata().

◆ n_dofs()

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

Definition at line 1932 of file equation_systems.C.

1933{
1934 std::size_t tot=0;
1935
1936 for (const auto & pr : _systems)
1937 tot += pr.second->n_dofs();
1938
1939 return tot;
1940}
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(), ExodusC0PolyhedronTest::assert_distributed_if_parallel(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::AztecLinearSolver< T >::AztecLinearSolver(), libMesh::Partitioner::build_graph(), libMesh::EquationSystems::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::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_ids(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DistributedMesh::set_next_unique_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), WriteVecAndScalar::setupTests(), libMesh::RBEIMEvaluation::side_gather_bfs(), ExodusC0PolyhedronTest::test_write_and_read_mixed_hex_tet_block_names_impl(), CheckpointIOTest::testDisjointNeighborPairsCheckpoint(), DistributedMeshTest::testRemoteElemError(), CheckpointIOTest::testSplitter(), 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
inlineinherited

◆ n_vars()

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

Definition at line 1920 of file equation_systems.C.

1921{
1922 unsigned int tot=0;
1923
1924 for (const auto & pr : _systems)
1925 tot += pr.second->n_vars();
1926
1927 return tot;
1928}

Referenced by libMesh::EquationSystems::build_variable_names().

◆ output()

void Biharmonic::output ( int  timestep,
const Real &  t,
Real &  o_t,
bool  force = false 
)

Definition at line 253 of file biharmonic.C.

257{
258 if (!force && t - o_t < _o_dt)
259 return;
260
261 ++_o_count;
262
263 if (_verbose)
264 libMesh::out << "Writing state "
265 << timestep
266 << " at time "
267 << t
268 << " to file "
269 << _ofile
270 << "; output a total of "
271 << _o_count
272 << " states so far\n";
273
274 _exio->write_timestep(_ofile, *this, timestep, t);
275
276 if (!force)
277 o_t = t;
278}

References _exio, _o_count, _o_dt, _ofile, _verbose, and libMesh::out.

Referenced by run().

◆ print_info() [1/2]

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

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

Definition at line 1903 of file equation_systems.C.

1904{
1905 os << this->get_info()
1906 << std::endl;
1907}

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(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::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::MeshBase::count_constraint_rows(), libMesh::ExodusII_IO_Helper::create(), libMesh::MeshCommunication::delete_remote_elements(), 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::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(), libMesh::EquationSystems::read(), libMesh::EquationSystems::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_ids(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DistributedMesh::set_next_unique_ids(), 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(), ExodusC0PolyhedronTest::test_write_and_read_mixed_hex_tet_block_names_impl(), 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::testExodusCopyHighOrderElementSolution(), MeshInputTest::testExodusFileMappings(), MeshInputTest::testExodusIGASidesets(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), DofMapTest::testGhostConstraintSendList(), 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::DTKAdapter::update_variable_values(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::XdrIO::write(), libMesh::NameBasedIO::write(), libMesh::CheckpointIO::write(), libMesh::EquationSystems::write(), libMesh::EquationSystems::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 
)
inherited

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 libMesh::EquationSystems::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 
)
inherited

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 libMesh::EquationSystems::read().

Referenced by main(), libMesh::EquationSystems::read(), libMesh::EquationSystems::read(), libMesh::EquationSystems::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 
)
inherited

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 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 libMesh::EquationSystems::_mesh, libMesh::EquationSystems::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(), libMesh::EquationSystems::get_mesh(), libMesh::EquationSystems::get_system(), libMesh::MeshTools::Private::globally_renumber_nodes_and_elements(), libMesh::EquationSystems::init(), libMesh::libmesh_assert(), mesh, libMesh::ParallelObject::processor_id(), libMesh::EquationSystems::read(), libMesh::EquationSystems::READ_ADDITIONAL_DATA, libMesh::EquationSystems::READ_BASIC_ONLY, libMesh::EquationSystems::READ_DATA, libMesh::EquationSystems::READ_HEADER, libMesh::System::read_header(), libMesh::EquationSystems::READ_LEGACY_FORMAT, libMesh::Xdr::reading(), libMesh::System::set_basic_system_only(), libMesh::Xdr::set_version(), libMesh::EquationSystems::TRY_READ_IFEMS, and libMesh::EquationSystems::update().

◆ redundant_added_side()

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

Definition at line 1783 of file equation_systems.C.

1784{
1785 libmesh_assert(elem.active());
1786
1787 const Elem * neigh = elem.neighbor_ptr(side);
1788
1789 // Write boundary sides.
1790 if (!neigh)
1791 return false;
1792
1793 // Write ghost sides in Nemesis
1794 if (neigh == remote_elem)
1795 return false;
1796
1797 // Don't write a coarser side if a finer side exists
1798 if (!neigh->active())
1799 return true;
1800
1801 // Don't write a side redundantly from both of the
1802 // elements sharing it. We'll disambiguate with id().
1803 return (neigh->id() < elem.id());
1804}
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 libMesh::EquationSystems::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 ( )
inlineinherited
Returns
Whether or not calls to reinit() will try to coarsen/refine the mesh

Definition at line 608 of file equation_systems.h.

608{ return this->_refine_in_reinit; }

References libMesh::EquationSystems::_refine_in_reinit.

◆ reinit()

void libMesh::EquationSystems::reinit ( )
virtualinherited

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

Definition at line 95 of file equation_systems.C.

96{
97 const bool mesh_changed = this->reinit_solutions();
98
99 // If the mesh has changed, systems will need to reinitialize their
100 // own data on the new mesh.
101 if (mesh_changed)
102 this->reinit_systems();
103}
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 libMesh::EquationSystems::reinit_solutions(), and libMesh::EquationSystems::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 ( )
virtualinherited

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

Definition at line 105 of file equation_systems.C.

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

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

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

◆ reinit_solutions()

bool libMesh::EquationSystems::reinit_solutions ( )
inherited

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

Returns
Whether or not the mesh may have changed.

Definition at line 139 of file equation_systems.C.

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

References libMesh::EquationSystems::_mesh, libMesh::EquationSystems::_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(), libMesh::EquationSystems::get_mesh(), libMesh::EquationSystems::get_system(), libMesh::make_range(), libMesh::EquationSystems::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 libMesh::EquationSystems::reinit().

◆ reinit_systems()

void libMesh::EquationSystems::reinit_systems ( )
virtualinherited

Reinitialize all systems on the current mesh.

Definition at line 270 of file equation_systems.C.

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

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

Referenced by libMesh::EquationSystems::reinit().

◆ run()

void Biharmonic::run ( )

Definition at line 289 of file biharmonic.C.

290{
291 Real t = _t0, o_t = 0.0;
292 int timestep = 1;
293
294 // Force-write the initial timestep
295 output(timestep, t, o_t, true);
296
297 while (t < _t1)
298 {
299 ++timestep;
300
301 // A pretty update message
302 if (_verbose)
303 libMesh::out << "Solving for state " << timestep << ", time " << t << "\n";
304
305 // Move biharmonic one timestep forward
306 step();
307
308 // Keep track of time and timestep
309 t += _dt;
310
311 // Output
312 output(timestep, t, o_t);
313 } // while(t < _t1)
314
315 // Force-write the final timestep
316 output(timestep, t, o_t, true);
317}
void output(int timestep, const Real &t, Real &o_t, bool force=false)
Definition biharmonic.C:253
void step(const Real &dt=-1.0)
Definition biharmonic.C:232
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

References _dt, _t0, _t1, _verbose, libMesh::out, output(), libMesh::Real, and step().

Referenced by main().

◆ sensitivity_solve()

void libMesh::EquationSystems::sensitivity_solve ( const ParameterVector &  parameters)
virtualinherited

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 448 of file equation_systems.C.

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

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

◆ solve()

void libMesh::EquationSystems::solve ( )
virtualinherited

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 438 of file equation_systems.C.

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

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

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

◆ step()

void Biharmonic::step ( const Real &  dt = -1.0)

Definition at line 232 of file biharmonic.C.

233{
234 // We need to update the old solution vector.
235 // The old solution vector will be the current solution vector from the
236 // previous time step. We use vector assignment. Only TransientSystems
237 // (and systems derived from them) contain old solutions.
238 if (dt_in < 0)
239 _dt = _dt0;
240 else
241 _dt = dt_in;
242
243 *(_jr->old_local_solution) = *(_jr->current_local_solution);
244
245 // this will localize the current solution, resulting in a
246 // current_local_solution with correct ghost values
247 _jr->solve();
248}

References _dt, _dt0, and _jr.

Referenced by run().

◆ update()

void libMesh::EquationSystems::update ( )
inherited

Updates local values for all the systems.

Definition at line 345 of file equation_systems.C.

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

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

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

◆ verbose()

bool Biharmonic::verbose ( )
inline

Definition at line 79 of file biharmonic.h.

79{ return _verbose; }

References _verbose.

◆ viewParameters()

void Biharmonic::viewParameters ( )

Definition at line 165 of file biharmonic.C.

166{
167 libMesh::out << "Biharmonic parameters:\n";
168
169 // Print verbosity status
170 if (_verbose)
171 libMesh::out << "verbose mode is on\n";
172 else
173 libMesh::out << "verbose mode is off\n";
174
175 // Print parameters
176 libMesh::out << "mesh dimension = " << _dim << "\n";
177 libMesh::out << "initial linear mesh size = " << _N << "\n";
178 libMesh::out << "kappa = " << _kappa << "\n";
179 libMesh::out << "growth = " << (int)_growth << "\n";
180 libMesh::out << "degenerate = " << (int)_degenerate << "\n";
181 libMesh::out << "Cahn-Hillard = " << (int)_cahn_hillard << "\n";
182 libMesh::out << "netforce = " << (int)_netforce << "\n";
183 libMesh::out << "energy = " << _energy << "\n";
184 libMesh::out << "tol = " << _tol << "\n";
185 libMesh::out << "theta = " << _theta << "\n";
186 libMesh::out << "theta_c = " << _theta_c << "\n";
187 libMesh::out << "log truncation = " << _log_truncation << "\n";
188 libMesh::out << "initial timestep size = " << _dt0 << "\n";
189
190 if (_initialState == STRIP)
191 libMesh::out << "initial state: strip\n";
192
193 if (_initialState == ROD)
194 libMesh::out << "initial state: rod\n";
195
196 if (_initialState == BALL)
197 libMesh::out << "initial state: ball\n";
198
199 libMesh::out << "initial state center = " << _initialCenter(0) << "\n";
200 libMesh::out << "initial state width = " << _initialWidth << "\n";
201 libMesh::out << "initial time (min_time) = " << _t0 << "\n";
202 libMesh::out << "integration time = " << _T << "\n";
203 libMesh::out << "final time (max_time) = " << _t1 << "\n";
204 libMesh::out << "Crank-Nicholson weight = " << _cnWeight << "\n";
205 libMesh::out << "Output timestep = " << _o_dt << "\n";
206 libMesh::out << "Output filename base: " << _ofile_base << "\n";
207}

References _cahn_hillard, _cnWeight, _degenerate, _dim, _dt0, _energy, _growth, _initialCenter, _initialState, _initialWidth, _kappa, _log_truncation, _N, _netforce, _o_dt, _ofile_base, _T, _t0, _t1, _theta, _theta_c, _tol, _verbose, BALL, int, libMesh::out, ROD, and STRIP.

Referenced by main().

◆ write() [1/4]

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

◆ write() [2/4]

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

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 libMesh::EquationSystems::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
inherited

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(), libMesh::EquationSystems::write(), libMesh::EquationSystems::WRITE_DATA, and libMesh::EquationSystems::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(), libMesh::EquationSystems::write(), libMesh::EquationSystems::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
inherited

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 libMesh::EquationSystems::_mesh, libMesh::EquationSystems::_systems, libMesh::Xdr::close(), libMesh::Xdr::data(), libMesh::get_io_compatibility_version(), libMesh::EquationSystems::get_mesh(), libMesh::MeshTools::Private::globally_renumber_nodes_and_elements(), libMesh::libmesh_assert(), mesh, libMesh::ParallelObject::processor_id(), libMesh::Xdr::set_version(), libMesh::EquationSystems::WRITE_ADDITIONAL_DATA, libMesh::EquationSystems::WRITE_DATA, libMesh::EquationSystems::WRITE_PARALLEL_FILES, and libMesh::Xdr::writing().

Friends And Related Symbol Documentation

◆ JR

friend class JR
friend

Definition at line 110 of file biharmonic.h.

Member Data Documentation

◆ _cahn_hillard

bool Biharmonic::_cahn_hillard
private

Definition at line 95 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _cnWeight

Real Biharmonic::_cnWeight
private

Definition at line 103 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _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().

◆ _degenerate

bool Biharmonic::_degenerate
private

Definition at line 95 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _dim

unsigned int Biharmonic::_dim
private

Definition at line 92 of file biharmonic.h.

Referenced by Biharmonic(), Biharmonic::JR::JR(), and viewParameters().

◆ _dt

Real Biharmonic::_dt
private

Definition at line 102 of file biharmonic.h.

Referenced by dt(), init(), run(), and step().

◆ _dt0

Real Biharmonic::_dt0
private

Definition at line 102 of file biharmonic.h.

Referenced by Biharmonic(), dt0(), step(), and viewParameters().

◆ _enable_default_ghosting

bool libMesh::EquationSystems::_enable_default_ghosting
protectedinherited

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

Default value: true

Definition at line 652 of file equation_systems.h.

Referenced by libMesh::EquationSystems::add_system(), and libMesh::EquationSystems::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().

◆ _energy

FreeEnergyEnum Biharmonic::_energy
private

Definition at line 96 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _exio

std::unique_ptr<ExodusII_IO> Biharmonic::_exio
private

Definition at line 106 of file biharmonic.h.

Referenced by Biharmonic(), and output().

◆ _growth

bool Biharmonic::_growth
private

Definition at line 95 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _initialCenter

Point Biharmonic::_initialCenter
private

Definition at line 100 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _initialState

InitialStateEnum Biharmonic::_initialState
private

Definition at line 99 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _initialWidth

Real Biharmonic::_initialWidth
private

Definition at line 101 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _jr

JR* Biharmonic::_jr
private

Definition at line 113 of file biharmonic.h.

Referenced by init(), and step().

◆ _kappa

Real Biharmonic::_kappa
private

Definition at line 93 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _log_truncation

int Biharmonic::_log_truncation
private

Definition at line 97 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _mesh

ReplicatedMesh& Biharmonic::_mesh
private

Definition at line 112 of file biharmonic.h.

Referenced by Biharmonic().

◆ _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

unsigned int Biharmonic::_N
private

Definition at line 92 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _n_objects

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

◆ _netforce

bool Biharmonic::_netforce
private

Definition at line 95 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _o_count

int Biharmonic::_o_count
private

Definition at line 108 of file biharmonic.h.

Referenced by init(), and output().

◆ _o_dt

Real Biharmonic::_o_dt
private

Definition at line 107 of file biharmonic.h.

Referenced by Biharmonic(), output(), and viewParameters().

◆ _ofile

std::string Biharmonic::_ofile
private

Definition at line 105 of file biharmonic.h.

Referenced by Biharmonic(), and output().

◆ _ofile_base

std::string Biharmonic::_ofile_base
private

Definition at line 105 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _refine_in_reinit

bool libMesh::EquationSystems::_refine_in_reinit
protectedinherited

◆ _systems

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

◆ _T

Real Biharmonic::_T
private

Definition at line 102 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _t0

Real Biharmonic::_t0
private

Definition at line 102 of file biharmonic.h.

Referenced by Biharmonic(), run(), and viewParameters().

◆ _t1

Real Biharmonic::_t1
private

Definition at line 102 of file biharmonic.h.

Referenced by Biharmonic(), run(), and viewParameters().

◆ _theta

Real Biharmonic::_theta
private

Definition at line 93 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _theta_c

Real Biharmonic::_theta_c
private

Definition at line 93 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _tol

Real Biharmonic::_tol
private

Definition at line 94 of file biharmonic.h.

Referenced by Biharmonic(), and viewParameters().

◆ _verbose

bool Biharmonic::_verbose
private

Definition at line 98 of file biharmonic.h.

Referenced by Biharmonic(), init(), output(), run(), verbose(), and viewParameters().

◆ parameters

Parameters libMesh::EquationSystems::parameters
inherited

Data structure holding arbitrary parameters.

Definition at line 626 of file equation_systems.h.

Referenced by add_M_C_K_helmholtz(), assemble_advection_diffusion(), 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(), libMesh::EquationSystems::clear(), libMesh::NewmarkSystem::clear(), libMesh::FrequencySystem::clear_all(), compute_jacobian(), compute_residual(), LargeDeformationElasticity::compute_stresses(), LinearElasticityWithContact::compute_stresses(), libMesh::EquationSystems::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(), MeshInputTest::testExodusCopyHighOrderElementSolution(), 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: