OGS
BoundaryConditionAndSourceTerm/Python/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"
11
12namespace ProcessLib
13{
15{
16namespace detail
17{
18template <int GlobalDim,
19 template <typename /* shp */, typename /* lower order shp */,
20 int /* global dim */>
21 class LocalAssemblerImplementation,
22 typename LocalAssemblerInterface, typename... ExtraCtorArgs>
24 NumLib::LocalToGlobalIndexMap const& dof_table,
25 std::vector<MeshLib::Element*> const& mesh_elements,
26 std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers,
27 NumLib::IntegrationOrder const integration_order,
28 ExtraCtorArgs&&... extra_ctor_args)
29{
30 using LocAsmFactory =
32 LocalAssemblerImplementation, GlobalDim,
33 ExtraCtorArgs...>;
34
35 DBUG("Create local assemblers.");
36
37 NumLib::DefaultIntegrationMethodProvider integration_method_provider{
38 integration_order};
39 LocAsmFactory factory(dof_table, integration_method_provider);
40 local_assemblers.resize(mesh_elements.size());
41
42 DBUG("Calling local assembler builder for all mesh elements.");
44 factory, mesh_elements, local_assemblers,
45 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
46}
47} // namespace detail
48
59template <template <typename /* shp */, typename /* lower order shp */,
60 int /* global dim */>
61 class LocalAssemblerImplementation,
62 typename LocalAssemblerInterface, typename... ExtraCtorArgs>
64 const unsigned dimension,
65 std::vector<MeshLib::Element*> const& mesh_elements,
66 NumLib::LocalToGlobalIndexMap const& dof_table,
67 std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers,
68 NumLib::IntegrationOrder const integration_order,
69 ExtraCtorArgs&&... extra_ctor_args)
70{
71 DBUG("Create local assemblers.");
72
73 switch (dimension)
74 {
75 case 0:
77 LocalAssemblerImplementation>(
78 dof_table, mesh_elements, local_assemblers, integration_order,
79 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
80 break;
81 case 1:
83 LocalAssemblerImplementation>(
84 dof_table, mesh_elements, local_assemblers, integration_order,
85 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
86 break;
87 case 2:
89 LocalAssemblerImplementation>(
90 dof_table, mesh_elements, local_assemblers, integration_order,
91 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
92 break;
93 case 3:
95 LocalAssemblerImplementation>(
96 dof_table, mesh_elements, local_assemblers, integration_order,
97 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
98 break;
99 default:
100 OGS_FATAL(
101 "Meshes with dimension greater than three are not supported.");
102 }
103}
104} // namespace BoundaryConditionAndSourceTerm
105} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:22
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)
LocalAssemblerFactoryTaylorHood< 0, 0, LocalAssemblerInterface, LocalAssemblerImplementation, NumLib::DefaultIntegrationMethodProvider, GlobalDim, ConstructorArgs... > LocalAssemblerFactoryPython
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)