Flow123d
release_3.0.0-973-g92f55e826
|
Go to the documentation of this file.
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") +
74 *
this += diffusion_rate_immobile
75 .name(
"diffusion_rate_immobile")
76 .description(
"Diffusion coefficient of non-equilibrium linear exchange between mobile and immobile zone.")
80 *
this += porosity_immobile
81 .name(
"porosity_immobile")
82 .description(
"Porosity of the immobile zone.")
87 *
this += init_conc_immobile
88 .name(
"init_conc_immobile")
89 .description(
"Initial concentration of substances in the immobile zone.")
90 .units(
UnitSI().kg().m(-3) );
95 .description(
"Concentration solution in the mobile phase.")
100 *
this += conc_immobile
101 .name(
"conc_immobile")
102 .units(
UnitSI().kg().m(-3) )
105 output_fields += *
this;
182 .set_time_governor(*
time_);
192 .set_time_governor(*
time_);
216 std::shared_ptr<FieldFE<3, FieldValue<3>::Scalar> > output_field_ptr = make_shared< FieldFE<3, FieldValue<3>::Scalar> >();
250 std::stringstream ss;
301 conc_mob, conc_immob,
302 previous_conc_mob, previous_conc_immob,
319 temp_exponent = (por_mob + por_immob) / (por_mob * por_immob) *
time_->
dt();
323 exponent = diff_vec[sbi] * temp_exponent;
329 conc_average = ((por_mob * previous_conc_mob) + (por_immob * previous_conc_immob))
330 / (por_mob + por_immob);
332 conc_max = std::max(previous_conc_mob-conc_average, previous_conc_immob-conc_average);
337 if(
time_->
dt() <= por_mob*por_immob/(max(diff_vec)*(por_mob+por_immob)) &&
340 double temp = diff_vec[sbi]*(previous_conc_immob - previous_conc_mob) *
time_->
dt();
342 conc_mob = temp / por_mob + previous_conc_mob;
345 conc_immob = -temp / por_immob + previous_conc_immob;
349 double temp = exp(-exponent);
351 conc_mob = (previous_conc_mob - conc_average) * temp + conc_average;
354 conc_immob = (previous_conc_immob - conc_average) * temp + conc_average;
382 bool cfl_changed =
false;
393 time_constraint = std::min(time_constraint, cfl_immobile);
std::shared_ptr< OutputTime > output_stream_
Pointer to a transport output stream.
static const int registrar
Registrar of class to factory.
void initialize() override
Prepares the object to usage.
static UnitSI & dimensionless()
Returns dimensionless unit.
static Input::Type::Abstract & it_abstract_immobile_term()
bool set_time(const TimeStep &time, LimitSide limit_side)
unsigned int lsize(int proc) const
get local size
ReactionTerm(Mesh &init_mesh, Input::Record in_rec)
Constructor.
double scheme_tolerance_
Dual porosity computational scheme tolerance.
void initialize(std::shared_ptr< OutputTime > stream, Mesh *mesh, Input::Record in_rec, const TimeGovernor &tg)
unsigned int size() const
Support classes for parallel programing.
void set_input_list(Input::Array input_list, const TimeGovernor &tg)
void output_type(OutputTime::DiscreteSpace rt)
void update_solution(void) override
#define FLOW123D_FORCE_LINK_IN_CHILD(x)
std::shared_ptr< DOFHandlerMultiDim > dof_handler_
Pointer to DOF handler used through the reaction tree.
void make_reactions()
Resolves construction of following reactions.
double ** concentration_matrix_
const std::vector< std::string > & names()
Sorption model in immobile zone in case dual porosity is considered.
Sorption model in mobile zone in case dual porosity is considered.
void set_components(const std::vector< string > &names)
static constexpr Mask equation_result
Match result fields. These are never given by input or copy of input.
#define OLD_ASSERT_LESS(a, b)
const TimeStep & step(int index=-1) const
std::shared_ptr< ReactionTerm > reaction_mobile
Reaction running in mobile zone.
MultiField< 3, FieldValue< 3 >::Scalar > diffusion_rate_immobile
Mass transfer coefficients between mobile and immobile pores.
This file contains classes representing sorption model. Sorption model can be computed both in case t...
LongIdx * el_4_loc_
Indices of elements belonging to local dofs.
static bool print_message_table(ostream &stream, std::string equation_name)
Class for representation SI units of Fields.
Distribution * distribution_
Pointer to reference to distribution of elements between processors.
const RegionDB & region_db() const
Input::Record input_record_
RegionSet get_region_set(const std::string &set_name) const
Field< 3, FieldValue< 3 >::Scalar > porosity_immobile
Immobile porosity field.
~DualPorosity(void)
Destructor.
std::vector< VectorMPI > conc_immobile_out
concentration array output for immobile phase (parallel, shared with FieldFE)
SubstanceList substances_
Names belonging to substances.
void set_initial_condition()
Sets initial condition from input.
static constexpr Mask input_copy
bool evaluate_time_constraint(double &time_constraint) override
Computes a constraint for time step.
virtual const Value::return_type & value(const Point &p, const ElementAccessor< spacedim > &elm) const
std::shared_ptr< ReactionTerm > reaction_immobile
Reaction running in immobile zone.
void output(TimeStep step)
void output_data(void) override
Main output routine.
Class Dual_por_exchange implements the model of dual porosity.
void zero_time_step() override
static const Input::Type::Record & get_input_type()
void set_mesh(const Mesh &mesh)
#define WarningOut()
Macro defining 'warning' record of log.
EqData()
Collect all fields.
static Input::Type::Abstract & it_abstract_term()
MultiField< 3, FieldValue< 3 >::Scalar > conc_immobile
Calculated concentrations in the immobile zone.
MultiField< 3, FieldValue< 3 >::Scalar > init_conc_immobile
Initial concentrations in the immobile zone.
LongIdx * row_4_el_
Indices of rows belonging to elements.
void initialize_fields()
Initializes field sets.
EquationOutput output_fields
Fields indended for output, i.e. all input fields plus those representing solution.
Class ReactionTerm is an abstract class representing reaction term in transport.
static Input::Type::Abstract & it_abstract_mobile_term()
virtual ElementAccessor< 3 > element_accessor(unsigned int idx) const
Create and return ElementAccessor to element of given idx.
#define START_TIMER(tag)
Starts a timer with specified tag.
Field< 3, FieldValue< 3 >::Scalar > porosity
Porosity field.
double ** compute_reaction(double **concentrations, int loc_el) override
#define END_TIMER(tag)
Ends a timer with specified tag.
arma::vec::fixed< spacedim > centre() const
Computes the barycenter.