OGS
Utils/CreateLocalAssemblers.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <vector>
7
8#include "BaseLib/Logging.h"
12
13namespace ProcessLib
14{
15template <int GlobalDim,
16 template <typename /* shp fct */, int /* global dim*/>
17 class LocalAssemblerImplementation,
20 typename... ExtraCtorArgs>
22 std::vector<MeshLib::Element*> const& mesh_elements,
23 NumLib::LocalToGlobalIndexMap const& dof_table,
24 std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers,
25 ProviderOrOrder const& provider_or_order,
26 ExtraCtorArgs&&... extra_ctor_args)
27{
28 static_assert(
29 GlobalDim == 1 || GlobalDim == 2 || GlobalDim == 3,
30 "Meshes with dimension greater than three are not supported.");
31
32 DBUG("Create local assemblers.");
33
34 auto const& integration_method_provider =
35 getIntegrationMethodProvider(provider_or_order);
36
37 using IntegrationMethodProvider =
38 std::remove_cvref_t<decltype(integration_method_provider)>;
39 using LocAsmFac = LocalAssemblerFactory<
40 LocalAssemblerInterface, LocalAssemblerImplementation,
41 IntegrationMethodProvider, GlobalDim, ExtraCtorArgs...>;
42
43 LocAsmFac factory(dof_table, integration_method_provider);
44 local_assemblers.resize(mesh_elements.size());
45
46 DBUG("Calling local assembler builder for all mesh elements.");
48 factory, mesh_elements, local_assemblers,
49 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
50}
51
63template <template <typename /* shp fct */, int /* global dim */>
64 class LocalAssemblerImplementation,
65 typename LocalAssemblerInterface,
66 IntegrationMethodProviderOrIntegrationOrder ProviderOrOrder,
67 typename... ExtraCtorArgs>
69 const unsigned dimension,
70 std::vector<MeshLib::Element*> const& mesh_elements,
71 NumLib::LocalToGlobalIndexMap const& dof_table,
72 std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers,
73 ProviderOrOrder const& provider_or_order,
74 ExtraCtorArgs&&... extra_ctor_args)
75{
76 DBUG("Create local assemblers.");
77
78 switch (dimension)
79 {
80 case 1:
82 mesh_elements, dof_table, local_assemblers, provider_or_order,
83 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
84 break;
85 case 2:
87 mesh_elements, dof_table, local_assemblers, provider_or_order,
88 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
89 break;
90 case 3:
92 mesh_elements, dof_table, local_assemblers, provider_or_order,
93 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
94 break;
95 default:
97 "Meshes with dimension greater than three are not supported.");
98 }
99}
100
101} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:22
void createLocalAssemblers(std::vector< MeshLib::Element * > const &mesh_elements, NumLib::LocalToGlobalIndexMap const &dof_table, std::vector< std::unique_ptr< LocalAssemblerInterface > > &local_assemblers, ProviderOrOrder const &provider_or_order, ExtraCtorArgs &&... extra_ctor_args)
LocalAssemblerFactoryForDimGreaterEqualN< 1, LocalAssemblerInterface, LocalAssemblerImplementation, IntegrationMethodProvider, GlobalDim, ConstructorArgs... > LocalAssemblerFactory
By default processes in OGS are defined in 1D, 2D and 3D.
static void transformDereferenced(F const &f, C const &c, Data &data, Args_ &&... args)