43 using namespace
Input::Type;
48 return Record(
"DualPorosity",
49 "Dual porosity model in transport problems.\n" 50 "Provides computing the concentration of substances in mobile and immobile zone.\n" 54 "Containes region specific data necessary to construct dual porosity model.")
56 "Tolerance according to which the explicit Euler scheme is used or not." 57 "Set 0.0 to use analytic formula only (can be slower).")
62 EqData().output_fields.make_output_type(
"DualPorosity",
""),
63 IT::Default(
"{ \"fields\": [ \"conc_immobile\" ] }"),
64 "Setting of the fields output.")
69 Input::register_class< DualPorosity, Mesh &, Input::Record >(
"DualPorosity") +
75 .
name(
"diffusion_rate_immobile")
76 .
description(
"Diffusion coefficient of non-equilibrium linear exchange between mobile and immobile zone.")
81 .
name(
"porosity_immobile")
88 .
name(
"init_conc_immobile")
89 .
description(
"Initial concentration of substances in the immobile zone.")
95 .
description(
"Concentration solution in the mobile phase.")
101 .
name(
"conc_immobile")
153 ASSERT(
time_ !=
nullptr).error(
"Time governor has not been set yet.\n");
164 .set_time_governor(*
time_);
173 .set_time_governor(*
time_);
210 ASSERT(
time_ !=
nullptr).error(
"Time governor has not been set yet.\n");
229 std::stringstream ss;
248 IntIdx dof_p0 = dh_cell.get_loc_dof_indices()[0];
279 conc_mob, conc_immob,
280 previous_conc_mob, previous_conc_immob,
295 if (por_immob == 0.0)
return;
298 temp_exponent = (por_mob + por_immob) / (por_mob * por_immob) *
time_->
dt();
302 exponent = diff_vec[sbi] * temp_exponent;
308 conc_average = ((por_mob * previous_conc_mob) + (por_immob * previous_conc_immob))
309 / (por_mob + por_immob);
311 conc_max = std::max(previous_conc_mob-conc_average, previous_conc_immob-conc_average);
316 if(
time_->
dt() <= por_mob*por_immob/(max(diff_vec)*(por_mob+por_immob)) &&
319 double temp = diff_vec[sbi]*(previous_conc_immob - previous_conc_mob) *
time_->
dt();
321 conc_mob = temp / por_mob + previous_conc_mob;
324 conc_immob = -temp / por_immob + previous_conc_immob;
328 double temp = exp(-exponent);
330 conc_mob = (previous_conc_mob - conc_average) * temp + conc_average;
333 conc_immob = (previous_conc_immob - conc_average) * temp + conc_average;
359 bool cfl_changed =
false;
370 time_constraint = std::min(time_constraint, cfl_immobile);
void output_type(OutputTime::DiscreteSpace rt)
Sorption model in immobile zone in case dual porosity is considered.
void set_initial_condition()
Sets initial condition from input.
RegionSet get_region_set(const std::string &set_name) const
std::shared_ptr< ReactionTerm > reaction_mobile
Reaction running in mobile zone.
void output_data(void) override
Main output routine.
const std::vector< std::string > & names()
MultiField< 3, FieldValue< 3 >::Scalar > conc_immobile
Calculated concentrations in the immobile zone.
void output(TimeStep step)
SubstanceList substances_
Names belonging to substances.
EquationOutput output_fields
Fields indended for output, i.e. all input fields plus those representing solution.
void zero_time_step() override
Field< 3, FieldValue< 3 >::Scalar > porosity_immobile
Immobile porosity field.
Cell accessor allow iterate over DOF handler cells.
~DualPorosity(void)
Destructor.
LocDofVec get_loc_dof_indices() const
Returns the local indices of dofs associated to the cell on the local process.
const RegionDB & region_db() const
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library...
const TimeStep & step(int index=-1) const
static Input::Type::Abstract & it_abstract_mobile_term()
FieldCommon & units(const UnitSI &units)
Set basic units of the field.
unsigned int size() const
std::shared_ptr< OutputTime > output_stream_
Pointer to a transport output stream.
void update_solution(void) override
ReactionTerm(Mesh &init_mesh, Input::Record in_rec)
Constructor.
Class ReactionTerm is an abstract class representing reaction term in transport.
Class Dual_por_exchange implements the model of dual porosity.
arma::vec::fixed< spacedim > centre() const
Computes the barycenter.
double scheme_tolerance_
Dual porosity computational scheme tolerance.
std::shared_ptr< ReactionTerm > reaction_immobile
Reaction running in immobile zone.
const ElementAccessor< 3 > elm() const
Return ElementAccessor to element of loc_ele_idx_.
void make_reactions()
Resolves construction of following reactions.
void initialize() override
Prepares the object to usage.
static constexpr Mask equation_result
Match result fields. These are never given by input or copy of input.
static constexpr Mask input_copy
FieldCommon & input_default(const string &input_default)
#define START_TIMER(tag)
Starts a timer with specified tag.
bool evaluate_time_constraint(double &time_constraint) override
Computes a constraint for time step.
void initialize_fields()
Initializes field sets.
static Input::Type::Abstract & it_abstract_immobile_term()
void compute_reaction(const DHCellAccessor &dh_cell) override
Compute reaction on a single element.
virtual Value::return_type const & value(const Point &p, const ElementAccessor< spacedim > &elm) const
EqData()
Collect all fields.
Class representing dual porosity model in transport.
static Input::Type::Abstract & it_abstract_term()
Support classes for parallel programing.
Sorption model in mobile zone in case dual porosity is considered.
FieldCommon & description(const string &description)
void set_input_list(Input::Array input_list, const TimeGovernor &tg)
void initialize(std::shared_ptr< OutputTime > stream, Mesh *mesh, Input::Record in_rec, const TimeGovernor &tg)
Input::Record input_record_
void set_components(const std::vector< string > &names)
FieldFEScalarVec conc_immobile_fe
Underlaying FieldFE for each substance of conc_immobile.
#define ASSERT_LT(a, b)
Definition of comparative assert macro (Less Than)
FieldFEScalarVec conc_mobile_fe
FieldFEs representing P0 interpolation of mobile concentration (passed from transport).
bool set_time(const TimeStep &time, LimitSide limit_side)
std::shared_ptr< DOFHandlerMultiDim > dof_handler_
Pointer to DOF handler used through the reaction tree.
#define WarningOut()
Macro defining 'warning' record of log.
FieldCommon & name(const string &name)
#define END_TIMER(tag)
Ends a timer with specified tag.
MultiField< 3, FieldValue< 3 >::Scalar > diffusion_rate_immobile
Mass transfer coefficients between mobile and immobile pores.
static const int registrar
Registrar of class to factory.
void set_mesh(const Mesh &mesh)
MultiField< 3, FieldValue< 3 >::Scalar > init_conc_immobile
Initial concentrations in the immobile zone.
FieldCommon & set_limits(double min, double max=std::numeric_limits< double >::max())
Field< 3, FieldValue< 3 >::Scalar > porosity
Porosity field.
FieldCommon & flags(FieldFlag::Flags::Mask mask)
Class for representation SI units of Fields.
static const Input::Type::Record & get_input_type()
static UnitSI & dimensionless()
Returns dimensionless unit.
static bool print_message_table(ostream &stream, std::string equation_name)
This file contains classes representing sorption model. Sorption model can be computed both in case t...
#define FLOW123D_FORCE_LINK_IN_CHILD(x)