24 namespace ThermoRichardsFlow
29 std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
30 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
31 unsigned const integration_order,
32 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>&&
36 bool const use_monolithic_scheme)
37 :
Process(std::move(
name), mesh, std::move(jacobian_assembler), parameters,
38 integration_order, std::move(process_variables),
39 std::move(secondary_variables), use_monolithic_scheme),
40 _process_data(std::move(process_data))
42 _heat_flux = MeshLib::getOrCreateMeshProperty<double>(
52 std::make_unique<IntegrationPointWriter>(
53 "saturation_ip", 1 , integration_order,
57 std::make_unique<IntegrationPointWriter>(
58 "porosity_ip", 1 , integration_order,
65 unsigned const integration_order)
69 const int process_id = 0;
70 const int variable_id = 0;
71 ProcessLib::createLocalAssemblers<ThermoRichardsFlowLocalAssembler>(
75 .getShapeFunctionOrder(),
79 auto add_secondary_variable = [&](std::string
const&
name,
80 int const num_components,
81 auto get_ip_values_function)
87 std::move(get_ip_values_function)));
93 add_secondary_variable(
"saturation", 1,
98 add_secondary_variable(
"dry_density_solid", 1,
113 auto const&
name = ip_writer->name();
118 auto const& mesh_property =
122 if (mesh_property.getMeshItemType() !=
131 if (ip_meta_data.n_components !=
132 mesh_property.getNumberOfGlobalComponents())
135 "Different number of components in meta data ({:d}) than in "
136 "the integration point field data for '{:s}': {:d}.",
137 ip_meta_data.n_components,
name,
138 mesh_property.getNumberOfGlobalComponents());
143 std::size_t position = 0;
146 std::size_t
const integration_points_read =
147 local_asm->setIPDataInitialConditions(
148 name, &mesh_property[position],
149 ip_meta_data.integration_order);
150 if (integration_points_read == 0)
153 "No integration points read in the integration point "
154 "initial conditions set function.");
156 position += integration_points_read * ip_meta_data.n_components;
167 std::vector<GlobalVector*>& x,
double const t,
int const process_id)
173 DBUG(
"SetInitialConditions ThermoRichardsFlowProcess.");
182 const double t,
double const dt, std::vector<GlobalVector*>
const& x,
183 std::vector<GlobalVector*>
const& xdot,
int const process_id,
186 DBUG(
"Assemble the equations for ThermoRichardsFlowProcess.");
188 std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>>
200 const double t,
double const dt, std::vector<GlobalVector*>
const& x,
201 std::vector<GlobalVector*>
const& xdot,
const double dxdot_dx,
205 std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>>
209 "Assemble the Jacobian of ThermoRichardsFlow for the monolithic "
218 dxdot_dx, dx_dx, process_id, M, K, b, Jac);
220 auto copyRhs = [&](
int const variable_id,
auto& output_vector)
223 output_vector, std::negate<double>());
231 std::vector<GlobalVector*>
const& x,
double const t,
double const dt,
232 const int process_id)
239 DBUG(
"PostTimestep ThermoRichardsFlowProcess.");
250 const double t,
const double dt, std::vector<GlobalVector*>
const& x,
258 "Compute the secondary variables for "
259 "ThermoRichardsFlowProcess.");
268 std::vector<NumLib::LocalToGlobalIndexMap const*>
271 std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
272 dof_tables.reserve(number_of_processes);
273 std::generate_n(std::back_inserter(dof_tables), number_of_processes,
void DBUG(char const *fmt, Args const &... args)
Global vector based on Eigen vector.
bool isAxiallySymmetric() const
unsigned getDimension() const
Returns the dimension of the mesh (determined by the maximum dimension over all elements).
std::vector< Element * > const & getElements() const
Get the element-vector for the mesh.
Properties & getProperties()
bool existsPropertyVector(std::string const &name) const
virtual void postTimestep(std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, std::vector< GlobalVector * > const &x, double const t, double const dt)
virtual void initialize(std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table)
void setInitialConditions(std::size_t const mesh_item_id, NumLib::LocalToGlobalIndexMap const &dof_table, GlobalVector const &x, double const t, bool const use_monolithic_scheme, int const process_id)
virtual void computeSecondaryVariable(std::size_t const mesh_item_id, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_tables, double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_dot, int const process_id)
std::vector< std::size_t > const & getActiveElementIDs() const
NumLib::Extrapolator & getExtrapolator() const
std::vector< std::unique_ptr< IntegrationPointWriter > > _integration_point_writer
SecondaryVariableCollection _secondary_variables
std::vector< std::reference_wrapper< ProcessVariable > > const & getProcessVariables(const int process_id) const
VectorMatrixAssembler _global_assembler
std::unique_ptr< NumLib::LocalToGlobalIndexMap > _local_to_global_index_map
const bool _use_monolithic_scheme
Handles configuration of several secondary variables from the project file.
void addSecondaryVariable(std::string const &internal_name, SecondaryVariableFunctions &&fcts)
MeshLib::PropertyVector< double > * _heat_flux
MeshLib::PropertyVector< double > * _hydraulic_flow
std::vector< std::unique_ptr< LocalAssemblerIF > > _local_assemblers
void postTimestepConcreteProcess(std::vector< GlobalVector * > const &x, double const t, double const dt, const int process_id) override
void setInitialConditionsConcreteProcess(std::vector< GlobalVector * > &x, double const t, int const) override
ThermoRichardsFlowProcess(std::string name, MeshLib::Mesh &mesh, std::unique_ptr< ProcessLib::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, ThermoRichardsFlowProcessData &&process_data, SecondaryVariableCollection &&secondary_variables, bool const use_monolithic_scheme)
std::vector< NumLib::LocalToGlobalIndexMap const * > getDOFTables(const int number_of_processes) const
void computeSecondaryVariableConcrete(double const t, double const dt, std::vector< GlobalVector * > const &x, GlobalVector const &x_dot, int const process_id) override
ThermoRichardsFlowProcessData _process_data
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) override
void initializeConcreteProcess(NumLib::LocalToGlobalIndexMap const &dof_table, MeshLib::Mesh const &mesh, unsigned const integration_order) override
Process specific initialization called by initialize().
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) override
void assembleWithJacobian(std::size_t const mesh_item_id, LocalAssemblerInterface &local_assembler, std::vector< std::reference_wrapper< NumLib::LocalToGlobalIndexMap >> const &dof_tables, 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)
void assemble(std::size_t const mesh_item_id, LocalAssemblerInterface &local_assembler, std::vector< std::reference_wrapper< NumLib::LocalToGlobalIndexMap >> const &dof_tables, double const t, double const dt, std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &xdot, int const process_id, GlobalMatrix &M, GlobalMatrix &K, GlobalVector &b)
void transformVariableFromGlobalVector(GlobalVector const &input_vector, int const variable_id, NumLib::LocalToGlobalIndexMap const &local_to_global_index_map, MeshLib::PropertyVector< double > &output_vector, Functor mapFunction)
IntegrationPointMetaData getIntegrationPointMetaData(MeshLib::Mesh const &mesh, std::string const &name)
SecondaryVariableFunctions makeExtrapolator(const unsigned num_components, NumLib::Extrapolator &extrapolator, LocalAssemblerCollection const &local_assemblers, typename NumLib::ExtrapolatableLocalAssemblerCollection< LocalAssemblerCollection >::IntegrationPointValuesMethod integration_point_values_method)
static void executeSelectedMemberOnDereferenced(Method method, Container const &container, std::vector< std::size_t > const &active_container_ids, Args &&... args)
static void executeSelectedMemberDereferenced(Object &object, Method method, Container const &container, std::vector< std::size_t > const &active_container_ids, Args &&... args)
static void executeMemberOnDereferenced(Method method, Container const &container, Args &&... args)
virtual std::vector< double > const & getIntPtDarcyVelocity(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const =0
virtual std::vector< double > getSaturation() const =0
virtual std::vector< double > const & getIntPtDryDensitySolid(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const =0
virtual std::vector< double > const & getIntPtSaturation(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const =0
virtual std::vector< double > getPorosity() const =0
virtual std::vector< double > const & getIntPtPorosity(const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< double > &cache) const =0
MeshLib::PropertyVector< double > * element_saturation
MeshLib::PropertyVector< double > * element_porosity