OGS
AssemblyMixin.h
Go to the documentation of this file.
1
11#pragma once
12
18
19namespace ProcessLib
20{
24{
25 explicit SubmeshAssemblyData(
26 MeshLib::Mesh const& mesh,
27 std::vector<std::reference_wrapper<MeshLib::PropertyVector<double>>>&&
29
32 std::vector<std::size_t> active_element_ids;
33 std::vector<std::reference_wrapper<MeshLib::PropertyVector<double>>>
35};
36
40{
47
48protected:
49 explicit AssemblyMixinBase(AbstractJacobianAssembler& jacobian_assembler)
50 : pvma_{jacobian_assembler} {};
51
53 const int process_id,
54 MeshLib::Mesh& bulk_mesh,
55 std::vector<std::reference_wrapper<MeshLib::Mesh>> const& submeshes,
56 std::vector<std::string> const& residuum_names,
57 std::vector<std::reference_wrapper<ProcessVariable>> const& pvs);
58
60
62 GlobalVector const& rhs,
63 NumLib::LocalToGlobalIndexMap const& local_to_global_index_map,
64 std::vector<std::reference_wrapper<MeshLib::PropertyVector<double>>>
65 residuum_vectors);
66
68 GlobalVector const& rhs,
69 NumLib::LocalToGlobalIndexMap const& local_to_global_index_map,
70 SubmeshAssemblyData const& sad);
71
72private:
74
75protected:
76 std::vector<SubmeshAssemblyData> submesh_assembly_data_;
77 std::vector<std::reference_wrapper<MeshLib::PropertyVector<double>>>
79
81 std::size_t b_submesh_id_ = 0;
82
84
85private:
87};
88
94template <typename Process>
96{
97 // Enforce correct use of CRTP, i.e., that Process is derived from
98 // AssemblyMixin<Process>.
100 friend Process;
101
102public:
125 const int process_id,
126 std::vector<std::reference_wrapper<MeshLib::Mesh>> const& submeshes,
127 std::vector<std::string> const& residuum_names)
128 {
130 process_id, derived().getMesh(), submeshes, residuum_names,
131 derived().getProcessVariables(process_id));
132 }
133
134 void updateActiveElements(const int process_id)
135 {
136 // convention: process variable 0 governs where assembly takes place
137 // (active element IDs)
139 derived().getProcessVariables(process_id)[0];
140
142 }
143
144 // cppcheck-suppress functionStatic
145 void assemble(const double /*t*/, double const /*dt*/,
146 std::vector<GlobalVector*> const& /*x*/,
147 std::vector<GlobalVector*> const& /*x_prev*/,
148 int const /*process_id*/, GlobalMatrix& /*M*/,
149 GlobalMatrix& /*K*/, GlobalVector& /*b*/)
150 {
151 /*
152 DBUG("AssemblyMixin assemble(t={}, dt={}, process_id={}).", t, dt,
153 process_id);
154
155 assembleGeneric(&Assembly::ParallelVectorMatrixAssembler::assemble, t,
156 dt, x, x_prev, process_id, M, K, b);
157 */
158 OGS_FATAL("Not yet implemented.");
159 }
160
161 void assembleWithJacobian(const double t, double const dt,
162 std::vector<GlobalVector*> const& x,
163 std::vector<GlobalVector*> const& x_prev,
164 int const process_id, GlobalMatrix& M,
166 GlobalMatrix& Jac)
167 {
168 DBUG("AssemblyMixin assembleWithJacobian(t={}, dt={}, process_id={}).",
169 t, dt, process_id);
170
173 dt, x, x_prev, process_id, M, K, b, Jac);
174 }
175
176private:
177 Process& derived() { return static_cast<Process&>(*this); }
178 Process const& derived() const
179 {
180 return static_cast<Process const&>(*this);
181 }
182
185 template <typename Method, typename... Jac>
186 void assembleGeneric(Method global_assembler_method, const double t,
187 double const dt, std::vector<GlobalVector*> const& x,
188 std::vector<GlobalVector*> const& x_prev,
189 int const process_id, GlobalMatrix& M, GlobalMatrix& K,
190 GlobalVector& b, Jac&... jac_or_not_jac)
191 {
192 // TODO why not getDOFTables(x.size()); ?
193 std::vector<NumLib::LocalToGlobalIndexMap const*> const dof_tables{
195
196 auto const& loc_asms = derived().local_assemblers_;
197
198 if (!submesh_assembly_data_.empty())
199 {
201 b, b_submesh_id_);
202
203 for (auto const& sad : submesh_assembly_data_)
204 {
205 b_submesh.setZero();
206
207 (pvma_.*global_assembler_method)(
208 loc_asms, sad.active_element_ids, dof_tables, t, dt, x,
209 x_prev, process_id, M, K, b_submesh, jac_or_not_jac...);
210
211 MathLib::LinAlg::axpy(b, 1.0, b_submesh);
212
214 b_submesh, *(dof_tables.front()), sad);
215 }
216
218 }
219 else
220 {
221 // convention: process variable 0 governs where assembly takes
222 // place (active element IDs)
224 derived().getProcessVariables(process_id)[0];
225
226 (pvma_.*global_assembler_method)(
227 loc_asms, pv.getActiveElementIDs(), dof_tables, t, dt, x,
228 x_prev, process_id, M, K, b, jac_or_not_jac...);
229 }
230
232 b, *(dof_tables.front()), residuum_vectors_bulk_);
233 }
234};
235
236} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:26
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:30
Global vector based on Eigen vector.
Definition EigenVector.h:25
virtual GlobalVector & getVector(std::size_t &id)=0
Get an uninitialized vector with the given id.
virtual void releaseVector(GlobalVector const &x)=0
Base class for Jacobian assemblers.
void updateActiveElementsImpl(ProcessLib::ProcessVariable const &pv)
static void copyResiduumVectorsToSubmesh(GlobalVector const &rhs, NumLib::LocalToGlobalIndexMap const &local_to_global_index_map, SubmeshAssemblyData const &sad)
AssemblyMixinBase(AbstractJacobianAssembler &jacobian_assembler)
std::vector< std::reference_wrapper< MeshLib::PropertyVector< double > > > residuum_vectors_bulk_
Assembly::ParallelVectorMatrixAssembler pvma_
static void copyResiduumVectorsToBulkMesh(GlobalVector const &rhs, NumLib::LocalToGlobalIndexMap const &local_to_global_index_map, std::vector< std::reference_wrapper< MeshLib::PropertyVector< double > > > residuum_vectors)
void initializeAssemblyOnSubmeshes(const int process_id, MeshLib::Mesh &bulk_mesh, std::vector< std::reference_wrapper< MeshLib::Mesh > > const &submeshes, std::vector< std::string > const &residuum_names, std::vector< std::reference_wrapper< ProcessVariable > > const &pvs)
void updateActiveElements(ProcessLib::ProcessVariable const &pv)
std::size_t b_submesh_id_
ID of the b vector on submeshes, cf. NumLib::VectorProvider.
ActiveElementIDsState ids_state_
std::vector< SubmeshAssemblyData > submesh_assembly_data_
void assembleWithJacobian(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, GlobalMatrix &Jac)
void initializeAssemblyOnSubmeshes(const int process_id, std::vector< std::reference_wrapper< MeshLib::Mesh > > const &submeshes, std::vector< std::string > const &residuum_names)
Process const & derived() const
void assemble(const double, double const, std::vector< GlobalVector * > const &, std::vector< GlobalVector * > const &, int const, GlobalMatrix &, GlobalMatrix &, GlobalVector &)
void assembleGeneric(Method global_assembler_method, const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, Jac &... jac_or_not_jac)
void updateActiveElements(const int process_id)
void assembleWithJacobian(BaseLib::PolymorphicRandomAccessContainerView< LocalAssemblerInterface > const &local_assemblers, std::vector< std::size_t > const &active_elements, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, const double t, double const dt, std::vector< GlobalVector * > const &xs, std::vector< GlobalVector * > const &x_prevs, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, GlobalMatrix &Jac)
std::vector< std::size_t > const & getActiveElementIDs() const
std::vector< std::reference_wrapper< ProcessVariable > > const & getProcessVariables(const int process_id) const
Definition Process.h:155
std::unique_ptr< NumLib::LocalToGlobalIndexMap > _local_to_global_index_map
Definition Process.h:360
void axpy(PETScVector &y, PetscScalar const a, PETScVector const &x)
Definition LinAlg.cpp:57
OGSMesh getMesh(std::string const &name)
static NUMLIB_EXPORT VectorProvider & provider
SubmeshAssemblyData(MeshLib::Mesh const &mesh, std::vector< std::reference_wrapper< MeshLib::PropertyVector< double > > > &&residuum_vectors)
MeshLib::PropertyVector< std::size_t > const & bulk_node_ids
MeshLib::PropertyVector< std::size_t > const & bulk_element_ids
std::vector< std::size_t > active_element_ids
std::vector< std::reference_wrapper< MeshLib::PropertyVector< double > > > residuum_vectors