libMesh
equation_systems.h
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2025 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
13 
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 
18 
19 
20 #ifndef LIBMESH_EQUATION_SYSTEMS_H
21 #define LIBMESH_EQUATION_SYSTEMS_H
22 
23 // Local Includes
24 #include "libmesh/libmesh_common.h"
25 #include "libmesh/parameters.h"
26 #include "libmesh/system.h"
27 #include "libmesh/parallel_object.h"
28 
29 // HP aCC needs these for some reason
30 #ifdef __HP_aCC
31 # include "libmesh/frequency_system.h"
32 # include "libmesh/transient_system.h"
33 # include "libmesh/newmark_system.h"
34 # include "libmesh/steady_system.h"
35 #endif
36 
37 // C++ includes
38 #include <cstddef>
39 #include <map>
40 #include <set>
41 #include <string>
42 #include <string_view>
43 #include <vector>
44 #include <memory>
45 
46 namespace libMesh
47 {
48 
49 // Forward Declarations
50 class Elem;
51 class MeshBase;
52 enum XdrMODE : int;
53 
68 class EquationSystems : public ReferenceCountedObject<EquationSystems>,
69  public ParallelObject
70 
71 {
72 public:
73 
77  enum ReadFlags { READ_HEADER = 1,
78  READ_DATA = 2,
83 
87  enum WriteFlags { WRITE_DATA = 1,
91 
96 
101  virtual ~EquationSystems ();
102 
106  virtual void clear ();
107 
111  virtual void init ();
112 
117  virtual void reinit ();
118 
123  virtual void reinit_mesh ();
124 
137  virtual void enable_default_ghosting (bool enable);
138 
142  void update ();
143 
147  unsigned int n_systems() const;
148 
153  bool has_system (std::string_view name) const;
154 
161  template <typename T_sys>
162  const T_sys & get_system (std::string_view name) const;
163 
170  template <typename T_sys>
171  T_sys & get_system (std::string_view name);
172 
179  template <typename T_sys>
180  const T_sys & get_system (const unsigned int num) const;
181 
188  template <typename T_sys>
189  T_sys & get_system (const unsigned int num);
190 
194  const System & get_system (std::string_view name) const;
195 
199  System & get_system (std::string_view name);
200 
204  const System & get_system (const unsigned int num) const;
205 
209  System & get_system (const unsigned int num);
210 
215  virtual System & add_system (std::string_view system_type,
216  std::string_view name);
217 
221  template <typename T_sys>
222  T_sys & add_system (std::string_view name);
223 
228  unsigned int n_vars () const;
229 
234  std::size_t n_dofs () const;
235 
240  std::size_t n_active_dofs() const;
241 
250  virtual void solve ();
251 
260  virtual void adjoint_solve (const QoISet & qoi_indices = QoISet());
261 
270  virtual void sensitivity_solve (const ParameterVector & parameters);
271 
279  void build_variable_names (std::vector<std::string> & var_names,
280  const FEType * type=nullptr,
281  const std::set<std::string> * system_names=nullptr) const;
282 
291  void build_solution_vector (std::vector<Number> & soln,
292  std::string_view system_name,
293  std::string_view variable_name = "all_vars") const;
294 
306  void build_solution_vector (std::vector<Number> & soln,
307  const std::set<std::string> * system_names=nullptr,
308  bool add_sides=false) const;
309 
318  std::unique_ptr<NumericVector<Number>>
319  build_parallel_solution_vector(const std::set<std::string> * system_names=nullptr,
320  bool add_sides=false) const;
321 
326  void get_vars_active_subdomains(const std::vector<std::string> & names,
327  std::vector<std::set<subdomain_id_type>> & vars_active_subdomains) const;
328 
329 #ifdef LIBMESH_ENABLE_DEPRECATED
330 
339  void get_solution (std::vector<Number> & soln,
340  std::vector<std::string> & names) const;
341 #endif // LIBMESH_ENABLE_DEPRECATED
342 
352  void build_elemental_solution_vector (std::vector<Number> & soln,
353  std::vector<std::string> & names) const;
354 
377  std::vector<std::pair<unsigned int, unsigned int>>
378  find_variable_numbers (std::vector<std::string> & names,
379  const FEType * type=nullptr,
380  const std::vector<FEType> * types=nullptr) const;
381 
400  std::unique_ptr<NumericVector<Number>>
401  build_parallel_elemental_solution_vector (std::vector<std::string> & names) const;
402 
420  (std::vector<Number> & soln,
421  const std::set<std::string> * system_names = nullptr,
422  const std::vector<std::string> * var_names = nullptr,
423  bool vertices_only = false,
424  bool add_sides = false) const;
425 
426  /*
427  * Returns true iff the given side of the given element is *never*
428  * added to output from that element, because it is considered to be
429  * redundant with respect to the same data added from the
430  * neighboring element sharing that side. This helper function is
431  * used with the add_sides option when building solution vectors
432  * here and when outputting solution vectors in MeshOutput
433  * (currently just Exodus) I/O.
434  */
435  static bool redundant_added_side(const Elem & elem, unsigned int side);
436 
437 
463  template <typename InValType = Number>
464  void read (std::string_view name,
465  const XdrMODE,
466  const unsigned int read_flags=(READ_HEADER | READ_DATA),
467  bool partition_agnostic = true);
468 
469  template <typename InValType = Number>
470  void read (std::string_view name,
471  const unsigned int read_flags=(READ_HEADER | READ_DATA),
472  bool partition_agnostic = true);
473 
474  template <typename InValType = Number>
475  void read (Xdr & io,
476  std::function<std::unique_ptr<Xdr>()> & local_io_functor,
477  const unsigned int read_flags=(READ_HEADER | READ_DATA),
478  bool partition_agnostic = true);
479 
504  void write (std::string_view name,
505  const XdrMODE,
506  const unsigned int write_flags=(WRITE_DATA),
507  bool partition_agnostic = true) const;
508 
509  void write (std::string_view name,
510  const unsigned int write_flags=(WRITE_DATA),
511  bool partition_agnostic = true) const;
512 
513  void write (std::ostream name,
514  const unsigned int write_flags=(WRITE_DATA),
515  bool partition_agnostic = true) const;
516 
517  void write (Xdr & io,
518  const unsigned int write_flags=(WRITE_DATA),
519  bool partition_agnostic = true,
520  Xdr * const local_io = nullptr) const;
521 
528  virtual bool compare (const EquationSystems & other_es,
529  const Real threshold,
530  const bool verbose) const;
531 
536  virtual std::string get_info() const;
537 
542  void print_info (std::ostream & os=libMesh::out) const;
543 
547  friend std::ostream & operator << (std::ostream & os,
548  const EquationSystems & es);
549 
553  const MeshBase & get_mesh() const;
554 
558  MeshBase & get_mesh();
559 
564  void allgather ();
565 
570 
574  void disable_refine_in_reinit() { this->_refine_in_reinit = false; }
575 
579  bool refine_in_reinit_flag() { return this->_refine_in_reinit; }
580 
587  bool reinit_solutions ();
588 
592  virtual void reinit_systems ();
593 
598 
599 
600 protected:
601 
602 
607 
611  std::map<std::string, std::unique_ptr<System>, std::less<>> _systems;
612 
618 
624 
625 private:
633 
638  void _remove_default_ghosting(unsigned int sys_num);
639 };
640 
641 
642 
643 // ------------------------------------------------------------
644 // EquationSystems inline methods
645 inline
647 {
648  return _mesh;
649 }
650 
651 
652 
653 inline
655 {
656  return _mesh;
657 }
658 
659 
660 inline
661 unsigned int EquationSystems::n_systems () const
662 {
663  return cast_int<unsigned int>(_systems.size());
664 }
665 
666 
667 
668 
669 template <typename T_sys>
670 inline
671 T_sys & EquationSystems::add_system (std::string_view name)
672 {
673  if (!_systems.count(name))
674  {
675  const unsigned int sys_num = this->n_systems();
676 
677  auto result = _systems.emplace
678  (name, std::make_unique<T_sys>(*this, std::string(name),
679  sys_num));
680 
682  this->_remove_default_ghosting(sys_num);
683 
684  // Tell all the \p DofObject entities to add a system.
686 
687  // Return reference to newly added item
688  auto it = result.first;
689  auto & sys_ptr = it->second;
690  return cast_ref<T_sys &>(*sys_ptr);
691  }
692  else
693  {
694  // We now allow redundant add_system calls, to make it
695  // easier to load data from files for user-derived system
696  // subclasses
697  return this->get_system<T_sys>(name);
698  }
699 }
700 
701 
702 
703 inline
704 bool EquationSystems::has_system (std::string_view name) const
705 {
706  if (_systems.find(name) == _systems.end())
707  return false;
708  return true;
709 }
710 
711 
712 
713 
714 template <typename T_sys>
715 inline
716 const T_sys & EquationSystems::get_system (const unsigned int num) const
717 {
718  libmesh_assert_less (num, this->n_systems());
719 
720  for (auto & pr : _systems)
721  {
722  const auto & sys_ptr = pr.second;
723  if (sys_ptr->number() == num)
724  return cast_ref<const T_sys &>(*sys_ptr);
725  }
726  // Error if we made it here
727  libmesh_error_msg("ERROR: no system number " << num << " found!");
728 }
729 
730 
731 
732 
733 template <typename T_sys>
734 inline
735 T_sys & EquationSystems::get_system (const unsigned int num)
736 {
737  libmesh_assert_less (num, this->n_systems());
738 
739  for (auto & pr : _systems)
740  {
741  auto & sys_ptr = pr.second;
742  if (sys_ptr->number() == num)
743  return cast_ref<T_sys &>(*sys_ptr);
744  }
745 
746  // Error if we made it here
747  libmesh_error_msg("ERROR: no system number " << num << " found!");
748 }
749 
750 
751 
752 
753 
754 
755 template <typename T_sys>
756 inline
757 const T_sys & EquationSystems::get_system (std::string_view name) const
758 {
759  auto pos = _systems.find(name);
760 
761  // Check for errors
762  libmesh_error_msg_if(pos == _systems.end(), "ERROR: no system named \"" << name << "\" found!");
763 
764  // Attempt dynamic cast
765  const auto & sys_ptr = pos->second;
766  return cast_ref<const T_sys &>(*sys_ptr);
767 }
768 
769 
770 
771 
772 
773 
774 template <typename T_sys>
775 inline
776 T_sys & EquationSystems::get_system (std::string_view name)
777 {
778  auto pos = _systems.find(name);
779 
780  // Check for errors
781  libmesh_error_msg_if(pos == _systems.end(), "ERROR: no system named " << name << " found!");
782 
783  // Attempt dynamic cast
784  auto & sys_ptr = pos->second;
785  return cast_ref<T_sys &>(*sys_ptr);
786 }
787 
788 
789 
790 
791 
792 
793 
794 inline
795 const System & EquationSystems::get_system (std::string_view name) const
796 {
797  return this->get_system<System>(name);
798 }
799 
800 
801 
802 inline
804 {
805  return this->get_system<System>(name);
806 }
807 
808 
809 
810 inline
811 const System & EquationSystems::get_system (const unsigned int num) const
812 {
813  return this->get_system<System>(num);
814 }
815 
816 
817 
818 inline
819 System & EquationSystems::get_system (const unsigned int num)
820 {
821  return this->get_system<System>(num);
822 }
823 
824 
825 } // namespace libMesh
826 
827 
828 #endif // LIBMESH_EQUATION_SYSTEMS_H
EquationSystems(MeshBase &mesh)
Constructor.
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
class FEType hides (possibly multiple) FEFamily and approximation orders, thereby enabling specialize...
Definition: fe_type.h:196
WriteFlags
Define enumeration to set properties in EquationSystems::write()
This is the EquationSystems class.
unsigned int n_vars() const
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 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.
unsigned int n_systems() const
bool _enable_default_ghosting
Flag for whether to enable default ghosting on newly added Systems.
This class provides the ability to map between arbitrary, user-defined strings and several data types...
Definition: parameters.h:67
Data structure for specifying which Parameters should be independent variables in a parameter sensiti...
bool has_system(std::string_view name) const
std::unique_ptr< NumericVector< Number > > build_parallel_elemental_solution_vector(std::vector< std::string > &names) const
Builds a parallel vector of CONSTANT MONOMIAL and/or components of CONSTANT MONOMIAL_VEC solution val...
std::size_t n_dofs() const
Data structure for specifying which Quantities of Interest should be calculated in an adjoint or a pa...
Definition: qoi_set.h:45
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.
bool reinit_solutions()
Handle any mesh changes and project any solutions onto the updated mesh.
virtual void clear()
Restores the data structure to a pristine state.
virtual ~EquationSystems()
Destructor.
This is the base class from which all geometric element types are derived.
Definition: elem.h:94
void print_info(std::ostream &os=libMesh::out) const
Prints information about the equation systems, by default to libMesh::out.
MeshBase & mesh
void disable_refine_in_reinit()
Calls to reinit() will not try to coarsen or refine the mesh.
virtual void enable_default_ghosting(bool enable)
Enable or disable default ghosting functors on the Mesh and on all Systems.
virtual void adjoint_solve(const QoISet &qoi_indices=QoISet())
Call adjoint_solve on all the individual equation systems.
friend std::ostream & operator<<(std::ostream &os, const EquationSystems &es)
Same as above, but allows you to also use stream syntax.
The libMesh namespace provides an interface to certain functionality in the library.
const T_sys & get_system(std::string_view name) const
This is the MeshBase class.
Definition: mesh_base.h:75
virtual std::string get_info() const
MeshBase & _mesh
The mesh data structure.
XdrMODE
Defines an enum for read/write mode in Xdr format.
Definition: enum_xdr_mode.h:35
void allgather()
Serializes a distributed mesh and its associated degree of freedom numbering for all systems...
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...
virtual void sensitivity_solve(const ParameterVector &parameters)
Call sensitivity_solve on all the individual equation systems.
virtual void reinit_systems()
Reinitialize all systems on the current mesh.
void enable_refine_in_reinit()
Calls to reinit() will also do two-step coarsen-then-refine.
Manages consistently variables, degrees of freedom, and coefficient vectors.
Definition: system.h:96
virtual void reinit()
Handle any mesh changes and reinitialize all the systems on the updated mesh.
ReadFlags
Define enumeration to set properties in EquationSystems::read()
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.
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.
bool _refine_in_reinit
Flag for whether to call coarsen/refine in reinit().
virtual void reinit_mesh()
Handle the association of a completely new mesh with the EquationSystem and all the Systems assigned ...
This class implements reference counting.
An object whose state is distributed along a set of processors.
This class implements a C++ interface to the XDR (eXternal Data Representation) format.
Definition: xdr_cxx.h:67
virtual void solve()
Call solve on all the individual equation systems.
void get_solution(std::vector< Number > &soln, std::vector< std::string > &names) const
Retrieve the solution data for CONSTANT MONOMIALs and/or components of CONSTANT MONOMIAL_VECs.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
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...
OStreamProxy out
void _remove_default_ghosting(unsigned int sys_num)
This just calls DofMap::remove_default_ghosting() but using a shim lets us forward-declare DofMap...
const MeshBase & get_mesh() const
std::size_t n_active_dofs() const
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 &#39;type&#39; or of &#39;types&#39; corresponding to the entr...
Parameters parameters
Data structure holding arbitrary parameters.
virtual void init()
Initialize all the systems.
virtual bool compare(const EquationSystems &other_es, const Real threshold, const bool verbose) const
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.
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...
void ErrorVector unsigned int
Definition: adjoints_ex3.C:360
void update()
Updates local values for all the systems.
void build_elemental_solution_vector(std::vector< Number > &soln, std::vector< std::string > &names) const
Retrieve the solution data for CONSTANT MONOMIALs and/or components of CONSTANT MONOMIAL_VECs.
std::map< std::string, std::unique_ptr< System >, std::less<> > _systems
Data structure holding the systems.
static bool redundant_added_side(const Elem &elem, unsigned int side)