OGS
SurfaceFlux.cpp
Go to the documentation of this file.
1
11#include "SurfaceFlux.h"
12
13#include <cassert>
14
16
17namespace ProcessLib
18{
20 std::size_t bulk_property_number_of_components,
21 unsigned const integration_order)
22{
23 DBUG("Create local balance assemblers.");
24 // Populate the vector of local assemblers.
25 _local_assemblers.resize(boundary_mesh.getElements().size());
26
27 // needed to create dof table
28 auto mesh_subset_all_nodes = std::make_unique<MeshLib::MeshSubset>(
29 boundary_mesh, boundary_mesh.getNodes());
30
31 // Collect the mesh subsets in a vector.
32 std::vector<MeshLib::MeshSubset> all_mesh_subsets;
33 std::generate_n(std::back_inserter(all_mesh_subsets),
34 bulk_property_number_of_components,
35 [&]() { return *mesh_subset_all_nodes; });
36
37 // needed for creation of local assemblers
38 auto dof_table = std::make_unique<NumLib::LocalToGlobalIndexMap const>(
39 std::move(all_mesh_subsets), NumLib::ComponentOrder::BY_LOCATION);
40
41 auto const bulk_element_ids =
42 boundary_mesh.getProperties().template getPropertyVector<std::size_t>(
45 auto const bulk_face_ids =
46 boundary_mesh.getProperties().template getPropertyVector<std::size_t>(
49
50 ProcessLib::createLocalAssemblers<SurfaceFluxLocalAssembler>(
51 boundary_mesh.getDimension() + 1, // or bulk_mesh.getDimension()?
52 boundary_mesh.getElements(), *dof_table, _local_assemblers,
53 NumLib::IntegrationOrder{integration_order},
54 boundary_mesh.isAxiallySymmetric(), *bulk_element_ids, *bulk_face_ids);
55}
56
58 std::vector<GlobalVector*> const& x,
60 double const t,
61 MeshLib::Mesh const& bulk_mesh,
62 std::vector<std::size_t> const& active_element_ids,
63 std::function<Eigen::Vector3d(
64 std::size_t const, MathLib::Point3d const&, double const,
65 std::vector<GlobalVector*> const&)> const& getFlux)
66{
67 DBUG("Integrate SurfaceFlux.");
68
71 active_element_ids, x, balance, t, bulk_mesh, getFlux);
72}
73
74} // namespace ProcessLib
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:30
bool isAxiallySymmetric() const
Definition Mesh.h:137
std::vector< Node * > const & getNodes() const
Get the nodes-vector for the mesh.
Definition Mesh.h:106
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
Definition Mesh.h:109
unsigned getDimension() const
Returns the dimension of the mesh (determined by the maximum dimension over all elements).
Definition Mesh.h:88
Properties & getProperties()
Definition Mesh.h:134
virtual void integrate(std::size_t const element_id, std::vector< GlobalVector * > const &x, MeshLib::PropertyVector< double > &specific_flux, double const t, MeshLib::Mesh const &bulk_mesh, std::function< Eigen::Vector3d(std::size_t const, MathLib::Point3d const &, double const, std::vector< GlobalVector * > const &)>)=0
void integrate(std::vector< GlobalVector * > const &x, MeshLib::PropertyVector< double > &balance, double const t, MeshLib::Mesh const &bulk_mesh, std::vector< std::size_t > const &active_element_ids, std::function< Eigen::Vector3d(std::size_t const, MathLib::Point3d const &, double const, std::vector< GlobalVector * > const &)> const &getFlux)
SurfaceFlux(MeshLib::Mesh &boundary_mesh, std::size_t bulk_property_number_of_components, unsigned const integration_order)
std::vector< std::unique_ptr< SurfaceFluxLocalAssemblerInterface > > _local_assemblers
Definition SurfaceFlux.h:54
constexpr std::string_view getBulkIDString(MeshItemType mesh_item_type)
Definition Properties.h:188
@ BY_LOCATION
Ordering data by spatial location.
static void executeSelectedMemberOnDereferenced(Method method, Container const &container, std::vector< std::size_t > const &active_container_ids, Args &&... args)