34 bool const use_monolithic_scheme);
38 std::vector<std::reference_wrapper<MeshLib::Mesh>>
const& submeshes,
39 std::vector<std::vector<std::string>>
const& residuum_names,
40 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
const&
64 std::vector<ProcessLib::Assembly::SubmeshAssemblyData>
71 std::optional<ProcessLib::Assembly::BulkMeshAssemblyData>
93template <
typename Process>
124 std::vector<std::reference_wrapper<MeshLib::Mesh>>
const& submeshes,
125 std::vector<std::vector<std::string>>
const& residuum_names)
128 derived().getMesh(), submeshes, residuum_names,
129 derived().getProcessVariables());
141 double const t,
double const dt, std::vector<GlobalVector*>
const& x,
142 std::vector<GlobalVector*>
const& x_prev,
int const process_id,
144 std::vector<std::size_t>
const*
const sorted_element_subset =
nullptr,
145 bool const copy_residua_to_mesh =
false)
147 DBUG(
"AssemblyMixin assemble(t={:g}, dt={:g}, process_id={}).", t, dt,
152 std::vector<NumLib::LocalToGlobalIndexMap const*>
const dof_tables =
155 std::exception_ptr
const exception =
158 M, K, b, sorted_element_subset)
160 M, K, b, sorted_element_subset,
161 copy_residua_to_mesh);
167 std::rethrow_exception(exception);
178 dt, *x[process_id], *x_prev[process_id], M, K, b);
181 neg_res_bulkmesh, *(dof_tables[process_id]),
190 double const t,
double const dt, std::vector<GlobalVector*>
const& x,
191 std::vector<GlobalVector*>
const& x_prev,
int const process_id,
193 std::vector<std::size_t>
const*
const sorted_element_subset =
nullptr,
194 bool const copy_residua_to_mesh =
false)
197 "AssemblyMixin assembleWithJacobian(t={:g}, dt={:g}, "
211 "You specified that this process is linear. The assembly for "
212 "the Newton-Raphson method will be run anyways.");
215 std::vector<NumLib::LocalToGlobalIndexMap const*>
const dof_tables =
218 std::exception_ptr
const exception =
222 process_id, b, Jac, sorted_element_subset)
224 t, dt, x, x_prev, dof_tables, process_id, b, Jac,
225 sorted_element_subset, copy_residua_to_mesh);
231 std::rethrow_exception(exception);
245 b, *(dof_tables[process_id]),
252 std::vector<GlobalVector*>
const& x,
253 std::vector<GlobalVector*>
const& x_prev,
254 int const process_id)
258 WARN(
"AssemblyMixin. Skipping preOutput() step.");
277 return static_cast<Process const&
>(*this);
284 std::vector<GlobalVector*>
const& x,
285 std::vector<GlobalVector*>
const& x_prev,
286 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
288 std::vector<std::size_t>
const*
const sorted_element_subset)
290 std::exception_ptr exception =
nullptr;
294 auto const& loc_asms =
derived().local_assemblers_;
300 dof_tables, t, dt, x, x_prev, process_id, M, K, b);
304 exception = std::current_exception();
313 DBUG(
"Saving global M, K, b for later reuse.");
320 INFO(
"[time] Saving global M, K, b took {:g} s",
328 double const t,
double const dt, std::vector<GlobalVector*>
const& x,
329 std::vector<GlobalVector*>
const& x_prev,
330 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
332 std::vector<std::size_t>
const*
const sorted_element_subset)
338 x_prev, dof_tables, process_id, M, K, b, sorted_element_subset);
341 DBUG(
"Reusing saved global M, K, b.");
344 time_restore.
start();
351 INFO(
"[time] Restoring global M, K, b took {:g} s",
358 double const t,
double const dt, std::vector<GlobalVector*>
const& x,
359 std::vector<GlobalVector*>
const& x_prev,
360 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
362 std::vector<std::size_t>
const*
const sorted_element_subset,
363 bool const copy_residua_to_mesh)
370 std::unique_ptr<GlobalMatrix> M_tmp;
371 std::unique_ptr<GlobalMatrix> K_tmp;
372 std::unique_ptr<GlobalVector> b_tmp;
374 auto getMKb = [&M_tmp, &K_tmp, &b_tmp,
382 if (!(M_tmp && K_tmp && b_tmp))
392 return std::tie(*M_tmp, *K_tmp, *b_tmp);
395 std::exception_ptr exception =
nullptr;
396 for (
auto const& [sad, mat_cache] :
400 auto [M_submesh, K_submesh, b_submesh] = getMKb(mat_cache);
402 if (!mat_cache.hasMKb())
409 sad, mat_cache, t, dt, x, x_prev, dof_tables, process_id,
410 M_submesh, K_submesh, b_submesh, sorted_element_subset);
420 if (copy_residua_to_mesh)
425 M_submesh, K_submesh, b_submesh);
428 process_id, neg_res_submesh, *(dof_tables[process_id]),
438 [[nodiscard]] std::exception_ptr
441 double const dt, std::vector<GlobalVector*>
const& x,
442 std::vector<GlobalVector*>
const& x_prev,
443 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
445 std::vector<std::size_t>
const*
const sorted_element_subset)
447 auto const& loc_asms =
derived().local_assemblers_;
448 std::exception_ptr exception =
nullptr;
452 pvma_.assembleWithJacobian(
456 dof_tables, t, dt, x, x_prev, process_id, b, Jac);
460 exception = std::current_exception();
469 double const t,
double const dt, std::vector<GlobalVector*>
const& x,
470 std::vector<GlobalVector*>
const& x_prev,
471 std::vector<NumLib::LocalToGlobalIndexMap const*>
const& dof_tables,
473 std::vector<std::size_t>
const*
const sorted_element_subset,
476 std::exception_ptr exception =
nullptr;
484 b_submesh->setZero();
487 sad, t, dt, x, x_prev, dof_tables, process_id, *b_submesh, Jac,
488 sorted_element_subset);
497 process_id, *b_submesh, *(dof_tables[process_id]), sad);
506 std::vector<GlobalVector*>
const& x,
507 std::vector<GlobalVector*>
const& x_prev,
508 int const process_id)
510 auto const matrix_specification =
514 matrix_specification);
516 matrix_specification);
518 matrix_specification);
524 assemble(t, dt, x, x_prev, process_id, *M, *K, *b,
nullptr,
true);
529 std::vector<GlobalVector*>
const& ,
530 std::vector<GlobalVector*>
const& ,
536 auto const matrix_specification =
540 matrix_specification);
542 matrix_specification);
MathLib::EigenMatrix GlobalMatrix
MathLib::EigenVector GlobalVector
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
void WARN(fmt::format_string< Args... > fmt, Args &&... args)
double elapsed() const
Get the elapsed time in seconds.
void start()
Start the timer.
Base class for Jacobian assemblers.
void initializeAssemblyOnSubmeshes(MeshLib::Mesh &bulk_mesh, std::vector< std::reference_wrapper< MeshLib::Mesh > > const &submeshes, std::vector< std::vector< std::string > > const &residuum_names, std::vector< std::vector< std::reference_wrapper< ProcessVariable > > > const &pvs)
AssemblyMixinBase(AbstractJacobianAssembler &jacobian_assembler, bool const is_linear, bool const use_monolithic_scheme)
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)
@ NO_DEACTIVATED_SUBDOMAINS
@ HAS_DEACTIVATED_SUBDOMAINS
std::optional< NumLib::NonlinearSolverTag > last_assembly_was_
void updateActiveElementsImpl(Process const &process)
std::vector< AssembledMatrixCache > submesh_matrix_cache_
AssembledMatrixCache for each submesh.
static void copyResiduumVectorsToSubmesh(int const process_id, GlobalVector const &rhs, NumLib::LocalToGlobalIndexMap const &local_to_global_index_map, ProcessLib::Assembly::SubmeshAssemblyData const &sad)
ActiveElementIDsState ids_state_
void updateActiveElements(ProcessLib::Process const &process)
std::vector< ProcessLib::Assembly::SubmeshAssemblyData > submesh_assembly_data_
SubmeshAssemblyData for each submesh.
std::optional< ProcessLib::Assembly::BulkMeshAssemblyData > bulk_mesh_assembly_data_
Empty if submesh assembly is used.
AssembledMatrixCache bulk_mesh_matrix_cache_
AssemblyMixinBase(AbstractJacobianAssembler &jacobian_assembler, bool const is_linear, bool const use_monolithic_scheme)
void assemble(double const 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, std::vector< std::size_t > const *const sorted_element_subset=nullptr, bool const copy_residua_to_mesh=false)
std::exception_ptr assembleOnSubmeshes(double const t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, std::vector< std::size_t > const *const sorted_element_subset, bool const copy_residua_to_mesh)
std::exception_ptr assembleOnBulkMeshOrOnSubmeshCommon(Assembly::CommonAssemblyData const &assembly_data, AssembledMatrixCache &mat_cache, double const t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, std::vector< std::size_t > const *const sorted_element_subset)
Common code for Picard assembly on the bulk mesh or on submeshes.
Process const & derived() const
std::exception_ptr assembleWithJacobianOnBulkMeshOrOnSubmeshCommon(Assembly::CommonAssemblyData const &assembly_data, double const t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, int const process_id, GlobalVector &b, GlobalMatrix &Jac, std::vector< std::size_t > const *const sorted_element_subset)
void preOutputPicard(double const t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id)
std::exception_ptr assembleOnBulkMesh(double const t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, std::vector< std::size_t > const *const sorted_element_subset)
void updateActiveElements()
void preOutput(double const t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id)
void preOutputNewton(double const, double const, std::vector< GlobalVector * > const &, std::vector< GlobalVector * > const &, int const)
void initializeAssemblyOnSubmeshes(std::vector< std::reference_wrapper< MeshLib::Mesh > > const &submeshes, std::vector< std::vector< std::string > > const &residuum_names)
void assembleWithJacobian(double const t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id, GlobalVector &b, GlobalMatrix &Jac, std::vector< std::size_t > const *const sorted_element_subset=nullptr, bool const copy_residua_to_mesh=false)
std::exception_ptr assembleWithJacobianOnSubmeshes(double const t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, int const process_id, GlobalVector &b, GlobalMatrix &Jac, std::vector< std::size_t > const *const sorted_element_subset, bool const)
std::vector< NumLib::LocalToGlobalIndexMap const * > getDOFTables(int const number_of_processes) const
MathLib::MatrixSpecifications getMatrixSpecifications(const int process_id) const override
static bool anyOf(bool const val, Mpi const &mpi=Mpi{OGS_COMM_WORLD})
void finalizeAssembly(PETScMatrix &A)
void copy(PETScVector const &x, PETScVector &y)
void axpy(PETScVector &y, PetscScalar const a, PETScVector const &x)
GlobalVector computeResiduum(double const dt, GlobalVector const &x, GlobalVector const &x_prev, GlobalMatrix const &M, GlobalMatrix const &K, GlobalVector const &b)
Stores assembled global M, K, b matrices/vectors for later reuse.
void storeMKb(GlobalMatrix const &M, GlobalMatrix const &K, GlobalVector const &b)
Store data.
std::shared_ptr< std::vector< std::size_t > const > activeElementIDsSorted(std::vector< std::size_t > const *const sorted_element_subset) const