inciter::CGPDE class

Partial differential equation base for continuous Galerkin PDEs.

This class uses runtime polymorphism without client-side inheritance: inheritance is confined to the internals of the this class, invisible to client-code. The class exclusively deals with ownership enabling client-side value semantics. Credit goes to Sean Parent at Adobe: https://github.com/sean-parent/sean-parent.github.com/wiki/ Papers-and-Presentations. For example client code that models a CGPDE, see inciter::CompFlow.

Constructors, destructors, conversion operators

CGPDE() defaulted explicit
Default constructor taking no arguments for Charm++.
template<typename T>
CGPDE(T x) explicit
template<typename T, typename... Args>
CGPDE(std::function<T(Args...)> x, Args&&... args) explicit
Constructor taking a function pointer to a constructor of an object modeling Concept.
CGPDE(const CGPDE& x)
Copy constructor.
CGPDE(CGPDE&&) noexcept defaulted
Move constructor.

Public functions

void IcBoxNodes(const tk::UnsMesh::Coords& coord, const std::vector<std::size_t>& inpoel, const std::unordered_map<std::size_t, std::set<std::size_t>>& elemblkid, std::vector<std::unordered_set<std::size_t>>& inbox, std::unordered_map<std::size_t, std::set<std::size_t>>& nodeblkid, std::size_t& nuserblk)
Public interface to determining which nodes are in IC box.
void initialize(const std::array<std::vector<real>, 3>& coord, tk::Fields& unk, real t, real V, const std::vector<std::unordered_set<std::size_t>>& inbox, const std::vector<tk::real>& blkvols, const std::unordered_map<std::size_t, std::set<std::size_t>>& nodeblkid)
Public interface to setting the initial conditions for the diff eq.
void velocity(const tk::Fields& u, tk::UnsMesh::Coords& v) const
Public interface to querying a velocity.
void soundspeed(const tk::Fields& u, std::vector<tk::real>& s) const
Public interface to querying a sound speed.
void chBndGrad(const std::array<std::vector<real>, 3>& coord, const std::vector<std::size_t>& inpoel, const std::vector<std::size_t>& bndel, const std::vector<std::size_t>& gid, const std::unordered_map<std::size_t, std::size_t>& bid, const tk::Fields& U, tk::Fields& G) const
Public interface to computing the nodal gradients for ALECG.
void rhs(real t, const std::array<std::vector<real>, 3>& coord, const std::vector<std::size_t>& inpoel, const std::vector<std::size_t>& triinpoel, const std::vector<std::size_t>& gid, const std::unordered_map<std::size_t, std::size_t>& bid, const std::unordered_map<std::size_t, std::size_t>& lid, const std::vector<real>& dfn, const std::pair<std::vector<std::size_t>, std::vector<std::size_t>>& psup, const std::pair<std::vector<std::size_t>, std::vector<std::size_t>>& esup, const std::vector<int>& symbctri, const std::vector<real>& vol, const std::vector<std::size_t>& edgenode, const std::vector<std::size_t>& edgeid, const std::vector<std::unordered_set<std::size_t>>& boxnodes, const tk::Fields& G, const tk::Fields& U, const tk::Fields& W, const std::vector<real>& tp, real V, tk::Fields& R) const
Public interface to computing the right-hand side vector for ALECG.
void getMeshVel(real t, const std::array<std::vector<real>, 3>& coord, const std::pair<std::vector<std::size_t>, std::vector<std::size_t>>& psup, const std::unordered_set<std::size_t>& symbcnodes, const std::array<tk::real, 3>& uservel, const tk::Fields& U, tk::Fields& meshvel, int& movedmesh) const
Public interface to compute the mesh velocity for OversetFE.
auto dt(const std::array<std::vector<real>, 3>& coord, const std::vector<std::size_t>& inpoel, tk::real t, tk::real dtn, const tk::Fields& U, const std::vector<tk::real>& vol, const std::vector<tk::real>& voln) const -> real
Public interface for computing the minimum time step size.
void dt(uint64_t it, const std::vector<real>& vol, const tk::Fields& U, std::vector<real>& dtp) const
Public interface for computing a time step size for each mesh node.
auto dirbc(real t, real deltat, const std::vector<real>& tp, const std::vector<real>& dtp, const std::pair<const int, std::vector<std::size_t>>& sides, const std::array<std::vector<real>, 3>& coord, bool increment) const -> std::map<std::size_t, std::vector<std::pair<bool, real>>>
Public interface for querying Dirichlet boundary condition values set by the user on a given side set for all components in a PDE system.
void symbc(tk::Fields& U, const std::array<std::vector<real>, 3>& coord, const std::unordered_map<int, std::unordered_map<std::size_t, std::array<real, 4>>>& bnorm, const std::unordered_set<std::size_t>& nodes) const
Public interface to set symmetry boundary conditions at nodes.
void farfieldbc(tk::Fields& U, const std::array<std::vector<real>, 3>& coord, const std::unordered_map<int, std::unordered_map<std::size_t, std::array<real, 4>>>& bnorm, const std::unordered_set<std::size_t>& nodes) const
Public interface to set farfield boundary conditions at nodes.
void timedepbc(tk::real t, tk::Fields& U, const std::vector<std::unordered_set<std::size_t>>& nodes, const std::vector<tk::Table<5>>& timedepfn) const
Public interface to applying time dependent boundary conditions at nodes.
auto OutVarFn() const -> std::map<std::string, tk::GetVarFn>
Public interface to returning maps of output var functions.
auto analyticFieldNames() const -> std::vector<std::string>
Public interface to returning analytic field output labels.
auto surfNames() const -> std::vector<std::string>
Public interface to returning surface field output labels.
auto histNames() const -> std::vector<std::string>
Public interface to returning time history field output labels.
auto names() const -> std::vector<std::string>
Public interface to returning variable names.
auto surfOutput(const std::map<int, std::vector<std::size_t>>& bnd, const tk::Fields& U) const -> std::vector<std::vector<real>>
Public interface to returning nodal surface field output.
auto elemSurfOutput(const std::map<int, std::vector<std::size_t>>& bface, const std::vector<std::size_t>& triinpoel, const tk::Fields& U) const -> std::vector<std::vector<real>>
Public interface to returning elemental surface field output.
auto histOutput(const std::vector<HistData>& h, const std::vector<std::size_t>& inpoel, const tk::Fields& U) const -> std::vector<std::vector<real>>
Public interface to returning time history output.
auto analyticSolution(real xi, real yi, real zi, real t) const -> tk::InitializeFn::result_type
Public interface to returning analytic solution.
auto solution(tk::real xi, tk::real yi, tk::real zi, tk::real t) const -> tk::InitializeFn::result_type
Public interface to returning the analytic solution for conserved vars.
auto operator=(const CGPDE& x) -> CGPDE&
Copy assignment.
auto operator=(CGPDE&&) noexcept -> CGPDE& defaulted
Move assignment.

Function documentation

template<typename T>
inciter::CGPDE::CGPDE(T x) explicit

Parameters
in Instantiated object of type T given by the template argument.

Constructor taking an object modeling Concept.

The object of class T comes pre-constructed.

template<typename T, typename... Args>
inciter::CGPDE::CGPDE(std::function<T(Args...)> x, Args&&... args) explicit

Constructor taking a function pointer to a constructor of an object modeling Concept.

Parameters
in Function pointer to a constructor of an object modeling Concept.
args in Zero or more constructor arguments

Passing std::function allows late execution of the constructor, i.e., as late as inside this class' constructor, and thus usage from a factory. Note that there are at least two different ways of using this constructor:

  • Bind T's constructor arguments and place it in std::function<T()> and passing no arguments as args.... This case then instantiates the model via its constructor and stores it in here.
  • Bind a single placeholder argument to T's constructor and pass it in as host's args..., which then forwards it to model's constructor. This allows late binding, i.e., binding the argument only here.