OGS
CreateLocalAssemblers.h
Go to the documentation of this file.
1
10#pragma once
11
12#include <vector>
13
14#include "BaseLib/Logging.h"
17
18namespace ProcessLib
19{
20namespace BoundaryConditionAndSourceTerm
21{
22namespace detail
23{
24template <int GlobalDim,
25 template <typename /* shp */, typename /* lower order shp */,
26 int /* global dim */>
27 class LocalAssemblerImplementation,
28 typename LocalAssemblerInterface, typename... ExtraCtorArgs>
30 NumLib::LocalToGlobalIndexMap const& dof_table,
31 std::vector<MeshLib::Element*> const& mesh_elements,
32 std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers,
33 NumLib::IntegrationOrder const integration_order,
34 ExtraCtorArgs&&... extra_ctor_args)
35{
36 static_assert(
37 GlobalDim == 1 || GlobalDim == 2 || GlobalDim == 3,
38 "Meshes with dimension greater than three are not supported.");
39
40 using LocAsmFactory =
42 LocalAssemblerImplementation, GlobalDim,
43 ExtraCtorArgs...>;
44
45 DBUG("Create local assemblers.");
46
47 NumLib::DefaultIntegrationMethodProvider integration_method_provider{
48 integration_order};
49 LocAsmFactory factory(dof_table, integration_method_provider);
50 local_assemblers.resize(mesh_elements.size());
51
52 DBUG("Calling local assembler builder for all mesh elements.");
54 factory, mesh_elements, local_assemblers,
55 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
56}
57} // namespace detail
69template <template <typename /* shp */, typename /* lower order shp */,
70 int /* global dim */>
71 class LocalAssemblerImplementation,
72 typename LocalAssemblerInterface, typename... ExtraCtorArgs>
74 const unsigned dimension,
75 std::vector<MeshLib::Element*> const& mesh_elements,
76 NumLib::LocalToGlobalIndexMap const& dof_table,
77 std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers,
78 NumLib::IntegrationOrder const integration_order,
79 ExtraCtorArgs&&... extra_ctor_args)
80{
81 DBUG("Create local assemblers.");
82
83 switch (dimension)
84 {
85 case 1:
86 detail::createLocalAssemblersPython<1,
87 LocalAssemblerImplementation>(
88 dof_table, mesh_elements, local_assemblers, integration_order,
89 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
90 break;
91 case 2:
92 detail::createLocalAssemblersPython<2,
93 LocalAssemblerImplementation>(
94 dof_table, mesh_elements, local_assemblers, integration_order,
95 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
96 break;
97 case 3:
98 detail::createLocalAssemblersPython<3,
99 LocalAssemblerImplementation>(
100 dof_table, mesh_elements, local_assemblers, integration_order,
101 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
102 break;
103 default:
104 OGS_FATAL(
105 "Meshes with dimension greater than three are not supported.");
106 }
107}
108} // namespace BoundaryConditionAndSourceTerm
109} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:26
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:30
void createLocalAssemblersPython(NumLib::LocalToGlobalIndexMap const &dof_table, std::vector< MeshLib::Element * > const &mesh_elements, std::vector< std::unique_ptr< LocalAssemblerInterface > > &local_assemblers, NumLib::IntegrationOrder const integration_order, ExtraCtorArgs &&... extra_ctor_args)
void createLocalAssemblersPython(const unsigned dimension, std::vector< MeshLib::Element * > const &mesh_elements, NumLib::LocalToGlobalIndexMap const &dof_table, std::vector< std::unique_ptr< LocalAssemblerInterface > > &local_assemblers, NumLib::IntegrationOrder const integration_order, ExtraCtorArgs &&... extra_ctor_args)
static void transformDereferenced(F const &f, C const &c, Data &data, Args_ &&... args)