25 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
26 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
27 unsigned const integration_order,
28 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>&&
31 const bool use_monolithic_scheme)
32 :
name(std::move(name_)),
34 _secondary_variables(std::move(secondary_variables)),
35 _global_assembler(std::move(jacobian_assembler)),
36 _use_monolithic_scheme(use_monolithic_scheme),
37 _coupled_solutions(nullptr),
38 _integration_order(integration_order),
39 _process_variables(std::move(process_variables)),
41 [&](const std::size_t number_of_process_variables)
44 std::vector<BoundaryConditionCollection> pcs_BCs;
45 pcs_BCs.reserve(number_of_process_variables);
46 for (std::size_t i = 0; i < number_of_process_variables; i++)
51 }(_process_variables.size())),
52 _source_term_collections(
53 [&](
const std::size_t number_of_processes)
54 -> std::vector<SourceTermCollection>
56 std::vector<SourceTermCollection> pcs_sts;
57 pcs_sts.reserve(number_of_processes);
58 for (std::size_t i = 0; i < number_of_processes; i++)
63 }(_process_variables.size()))
73 per_process_BCs.addBCsForProcessVariables(per_process_variables, dof_table,
77 per_process_sts.addSourceTermsForProcessVariables(
87 for (std::size_t pcs_id = 0; pcs_id < number_of_processes; pcs_id++)
96 DBUG(
"Initialize process.");
98 DBUG(
"Construct dof mappings.");
101 DBUG(
"Compute sparsity pattern");
104 DBUG(
"Initialize the extrapolator");
110 DBUG(
"Initialize boundary conditions.");
115 std::vector<GlobalVector*>& process_solutions,
116 std::vector<GlobalVector*>
const& process_solutions_prev,
118 int const process_id)
120 auto& x = *process_solutions[process_id];
121 auto& x_prev = *process_solutions_prev[process_id];
124 auto const& dof_table_of_process =
getDOFTable(process_id);
127 for (std::size_t variable_id = 0;
128 variable_id < per_process_variables.size();
134 auto const& pv = per_process_variables[variable_id];
135 DBUG(
"Set the initial condition of variable {:s} of process {:d}.",
136 pv.get().getName().data(), process_id);
138 auto const& ic = pv.get().getInitialCondition();
140 auto const num_comp = pv.get().getNumberOfGlobalComponents();
142 for (
int component_id = 0; component_id < num_comp; ++component_id)
144 auto const& mesh_subset =
145 dof_table_of_process.getMeshSubset(variable_id, component_id);
146 auto const mesh_id = mesh_subset.getMeshID();
147 for (
auto const* node : mesh_subset.getNodes())
154 auto const& ic_value = ic(t, pos);
157 std::abs(dof_table_of_process.getGlobalIndex(l, variable_id,
168 if (global_index == x.size())
171 x.set(global_index, ic_value[component_id]);
186 return {l.dofSizeWithoutGhosts(), l.dofSizeWithoutGhosts(),
191 const int process_id)
194 for (
auto const& variable : variables_per_process)
196 variable.get().updateDeactivatedSubdomains(time);
207 std::vector<GlobalVector*>
const& x,
208 std::vector<GlobalVector*>
const& xdot,
212 assert(x.size() == xdot.size());
213 for (std::size_t i = 0; i < x.size(); i++)
231 std::vector<GlobalVector*>
const& x,
232 std::vector<GlobalVector*>
const& xdot,
233 const double dxdot_dx,
const double dx_dx,
238 assert(x.size() == xdot.size());
239 for (std::size_t i = 0; i < x.size(); i++)
246 process_id, M, K, b, Jac);
266 const int specified_process_id = 0;
277 std::vector<MeshLib::MeshSubset> all_mesh_subsets;
283 std::generate_n(std::back_inserter(all_mesh_subsets),
284 pv.getNumberOfGlobalComponents(),
285 [&]() { return *_mesh_subset_all_nodes; });
289 std::vector<int> vec_var_n_components;
291 back_inserter(vec_var_n_components),
296 std::make_unique<NumLib::LocalToGlobalIndexMap>(
297 std::move(all_mesh_subsets), vec_var_n_components,
304 const int specified_process_id)
311 std::vector<MeshLib::MeshSubset> all_mesh_subsets;
314 std::vector<int> vec_var_n_components;
316 std::generate_n(std::back_inserter(all_mesh_subsets),
319 .getNumberOfGlobalComponents(),
325 .getNumberOfGlobalComponents());
327 std::make_unique<NumLib::LocalToGlobalIndexMap>(
328 std::move(all_mesh_subsets), vec_var_n_components,
334 std::tuple<NumLib::LocalToGlobalIndexMap*, bool>
341 const bool manage_storage =
false;
347 std::vector<MeshLib::MeshSubset> all_mesh_subsets_single_component;
350 const bool manage_storage =
true;
353 std::move(all_mesh_subsets_single_component),
364 std::tie(dof_table_single_component, manage_storage) =
367 std::unique_ptr<NumLib::Extrapolator> extrapolator(
369 *dof_table_single_component));
373 std::move(extrapolator), dof_table_single_component, manage_storage);
383 const double delta_t,
const int process_id)
385 for (
auto*
const solution : x)
393 const double delta_t,
int const process_id)
395 for (
auto*
const solution : x)
404 double const dt,
int const process_id)
413 std::vector<GlobalVector*>
const& x,
415 int const process_id)
417 for (
auto const* solution : x)
void DBUG(char const *fmt, Args const &... args)
Global vector based on Eigen vector.
std::vector< Node * > const & getNodes() const
Get the nodes-vector for the mesh.
void setNodeID(std::size_t node_id)
void setCoordinates(MathLib::TemplatePoint< double, 3 > const &coordinates)
int getNumberOfGlobalComponents() const
Returns the number of components of the process variable.
virtual void initializeBoundaryConditions()
virtual NumLib::IterationResult postIterationConcreteProcess(GlobalVector const &)
virtual void preTimestepConcreteProcess(std::vector< GlobalVector * > const &, const double, const double, const int)
std::vector< BoundaryConditionCollection > _boundary_conditions
void constructDofTableOfSpecifiedProcessStaggeredScheme(const int specified_prosess_id)
virtual void postTimestepConcreteProcess(std::vector< GlobalVector * > const &, const double, const double, int const)
void postNonLinearSolver(GlobalVector const &x, GlobalVector const &xdot, const double t, double const dt, int const process_id)
virtual void preIterationConcreteProcess(const unsigned, GlobalVector const &)
virtual void assembleConcreteProcess(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b)=0
void assembleWithJacobian(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, const double dxdot_dx, const double dx_dx, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, GlobalMatrix &Jac) final
void preAssemble(const double t, double const dt, GlobalVector const &x) final
virtual void initializeConcreteProcess(NumLib::LocalToGlobalIndexMap const &dof_table, MeshLib::Mesh const &mesh, unsigned const integration_order)=0
Process specific initialization called by initialize().
void initializeProcessBoundaryConditionsAndSourceTerms(const NumLib::LocalToGlobalIndexMap &dof_table, const int process_id)
void computeSecondaryVariable(double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_dot, int const process_id)
compute secondary variables for the coupled equations or for output.
virtual void computeSecondaryVariableConcrete(double const, double const, std::vector< GlobalVector * > const &, GlobalVector const &, int const)
std::unique_ptr< MeshLib::MeshSubset const > _mesh_subset_all_nodes
std::vector< std::vector< std::reference_wrapper< ProcessVariable > > > _process_variables
virtual NumLib::LocalToGlobalIndexMap const & getDOFTable(const int) const
virtual void postNonLinearSolverConcreteProcess(GlobalVector const &, GlobalVector const &, const double, double const, int const)
virtual void setInitialConditionsConcreteProcess(std::vector< GlobalVector * > &, double const, int const)
NumLib::IterationResult postIteration(GlobalVector const &x) final
void preTimestep(std::vector< GlobalVector * > const &x, const double t, const double delta_t, const int process_id)
Preprocessing before starting assembly for new timestep.
void initializeExtrapolator()
std::vector< std::reference_wrapper< ProcessVariable > > const & getProcessVariables(const int process_id) const
virtual void constructDofTable()
void constructMonolithicProcessDofTable()
virtual void preAssembleConcreteProcess(const double, double const, GlobalVector const &)
virtual void assembleWithJacobianConcreteProcess(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, const double dxdot_dx, const double dx_dx, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b, GlobalMatrix &Jac)=0
unsigned const _integration_order
std::unique_ptr< NumLib::LocalToGlobalIndexMap > _local_to_global_index_map
Process(std::string name_, MeshLib::Mesh &mesh, std::unique_ptr< AbstractJacobianAssembler > &&jacobian_assembler, std::vector< std::unique_ptr< ParameterLib::ParameterBase >> const ¶meters, unsigned const integration_order, std::vector< std::vector< std::reference_wrapper< ProcessVariable >>> &&process_variables, SecondaryVariableCollection &&secondary_variables, const bool use_monolithic_scheme=true)
std::vector< SourceTermCollection > _source_term_collections
void updateDeactivatedSubdomains(double const time, const int process_id)
void computeSparsityPattern()
MathLib::MatrixSpecifications getMatrixSpecifications(const int process_id) const override
void setInitialConditions(std::vector< GlobalVector * > &process_solutions, std::vector< GlobalVector * > const &process_solutions_prev, double const t, int const process_id)
void assemble(const double t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b) final
void postTimestep(std::vector< GlobalVector * > const &x, const double t, const double delta_t, int const process_id)
Postprocessing after a complete timestep.
ExtrapolatorData _extrapolator_data
GlobalSparsityPattern _sparsity_pattern
void preIteration(const unsigned iter, GlobalVector const &x) final
const bool _use_monolithic_scheme
virtual std::tuple< NumLib::LocalToGlobalIndexMap *, bool > getDOFTableForExtrapolatorData() const
Handles configuration of several secondary variables from the project file.
IterationResult
Status flags telling the NonlinearSolver if an iteration succeeded.
void finalizeAssembly(PETScMatrix &A)
void copy(PETScVector const &x, PETScVector &y)
void setLocalAccessibleVector(PETScVector const &x)
@ BY_LOCATION
Ordering data by spatial location.
GlobalSparsityPattern computeSparsityPattern(LocalToGlobalIndexMap const &dof_table, MeshLib::Mesh const &mesh)
Computes a sparsity pattern for the given inputs.