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