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 template <int GlobalDim,
21  template <typename, typename, int> class LocalAssemblerImplementation,
22  typename LocalAssemblerInterface, typename... ExtraCtorArgs>
24  NumLib::LocalToGlobalIndexMap const& dof_table,
25  const unsigned shapefunction_order,
26  std::vector<MeshLib::Element*> const& mesh_elements,
27  std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers,
28  ExtraCtorArgs&&... extra_ctor_args)
29 {
30  static_assert(
31  GlobalDim == 1 || GlobalDim == 2 || GlobalDim == 3,
32  "Meshes with dimension greater than three are not supported.");
33  // Shape matrices initializer
34  using LocalDataInitializer =
36  LocalAssemblerImplementation, GlobalDim,
37  ExtraCtorArgs...>;
38 
39  DBUG("Create local assemblers.");
40  // Populate the vector of local assemblers.
41  local_assemblers.resize(mesh_elements.size());
42 
43  LocalDataInitializer initializer(dof_table, shapefunction_order);
44 
45  DBUG("Calling local assembler builder for all mesh elements.");
47  initializer, mesh_elements, local_assemblers,
48  std::forward<ExtraCtorArgs>(extra_ctor_args)...);
49 }
50 
62 template <template <typename, typename, int> class LocalAssemblerImplementation,
63  typename LocalAssemblerInterface, typename... ExtraCtorArgs>
65  const unsigned dimension,
66  std::vector<MeshLib::Element*> const& mesh_elements,
67  NumLib::LocalToGlobalIndexMap const& dof_table,
68  const unsigned shapefunction_order,
69  std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers,
70  ExtraCtorArgs&&... extra_ctor_args)
71 {
72  DBUG("Create local assemblers.");
73 
74  switch (dimension)
75  {
76  case 1:
77  createLocalAssemblers<1, LocalAssemblerImplementation>(
78  dof_table, shapefunction_order, mesh_elements, local_assemblers,
79  std::forward<ExtraCtorArgs>(extra_ctor_args)...);
80  break;
81  case 2:
82  createLocalAssemblers<2, LocalAssemblerImplementation>(
83  dof_table, shapefunction_order, mesh_elements, local_assemblers,
84  std::forward<ExtraCtorArgs>(extra_ctor_args)...);
85  break;
86  case 3:
87  createLocalAssemblers<3, LocalAssemblerImplementation>(
88  dof_table, shapefunction_order, mesh_elements, local_assemblers,
89  std::forward<ExtraCtorArgs>(extra_ctor_args)...);
90  break;
91  default:
92  OGS_FATAL(
93  "Meshes with dimension greater than three are not supported.");
94  }
95 }
96 
97 } // 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)
static void transformDereferenced(F const &f, C const &c, Data &data, Args_ &&... args)