42 using namespace
Input::Type;
47 return Record(
"DualPorosity",
48 "Dual porosity model in transport problems.\n" 49 "Provides computing the concentration of substances in mobile and immobile zone.\n" 53 "Containes region specific data necessary to construct dual porosity model.")
55 "Tolerance according to which the explicit Euler scheme is used or not." 56 "Set 0.0 to use analytic formula only (can be slower).")
63 .make_output_field_selection(
64 "DualPorosity_output_fields",
65 "Selection of field names of Dual Porosity model available for output.")
67 Default(
"\"conc_immobile\""),
"List of fields to write to output stream.")
72 Input::register_class< DualPorosity, Mesh &, Input::Record >(
"DualPorosity") +
78 .
name(
"diffusion_rate_immobile")
79 .
description(
"Diffusion coefficient of non-equilibrium linear exchange between mobile and immobile zone.")
84 .
name(
"porosity_immobile")
90 .
name(
"init_conc_immobile")
91 .
description(
"Initial concentration of substances in the immobile zone.")
181 .set_time_governor(*
time_);
190 .set_time_governor(*
time_);
294 conc_mob, conc_immob,
295 previous_conc_mob, previous_conc_immob,
310 temp_exponent = (por_mob + por_immob) / (por_mob * por_immob) *
time_->
dt();
314 exponent = diff_vec[sbi] * temp_exponent;
320 conc_average = ((por_mob * previous_conc_mob) + (por_immob * previous_conc_immob))
321 / (por_mob + por_immob);
323 conc_max = std::max(previous_conc_mob-conc_average, previous_conc_immob-conc_average);
327 double temp = diff_vec[sbi]*(previous_conc_immob - previous_conc_mob) *
time_->
dt();
329 conc_mob = temp / por_mob + previous_conc_mob;
332 conc_immob = -temp / por_immob + previous_conc_immob;
336 double temp = exp(-exponent);
338 conc_mob = (previous_conc_mob - conc_average) * temp + conc_average;
341 conc_immob = (previous_conc_immob - conc_average) * temp + conc_average;
360 for (sbi = 0; sbi < n_subst; sbi++) {
void output_type(OutputTime::DiscreteSpace rt)
unsigned int size() const
get global size
void set_input_list(Input::Array input_list)
Sorption model in immobile zone in case dual porosity is considered.
void set_initial_condition()
Sets initial condition from input.
VecScatter vconc_out_scatter
Output vector scatter.
std::shared_ptr< ReactionTerm > reaction_mobile
Reaction running in mobile zone.
void output_data(void) override
Main output routine.
double ** concentration_matrix_
const std::vector< std::string > & names()
MultiField< 3, FieldValue< 3 >::Scalar > conc_immobile
Calculated concentrations in the immobile zone.
FieldSet output_fields
Fields indended for output, i.e. all input fields plus those representing solution.
static Input::Type::Abstract & get_input_type()
void set_time(const TimeStep &time, LimitSide limit_side)
SubstanceList substances_
Names belonging to substances.
RegionSet get_region_set(const string &set_name) const
void zero_time_step() override
Field< 3, FieldValue< 3 >::Scalar > porosity_immobile
Immobile porosity field.
int * row_4_el_
Indices of rows belonging to elements.
~DualPorosity(void)
Destructor.
std::vector< VectorSeqDouble > conc_immobile_out
concentration array output for immobile phase (gathered - sequential)
const RegionDB & region_db() const
ElementAccessor< 3 > element_accessor(unsigned int idx, bool boundary=false)
void allocate_output_mpi(void)
Allocates petsc vectors, prepares them for output and creates output vector scatter.
const TimeStep & step(int index=-1) const
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.
Input::Array output_array
Class Dual_por_exchange implements the model of dual porosity.
double scheme_tolerance_
Dual porosity computational scheme tolerance.
std::shared_ptr< ReactionTerm > reaction_immobile
Reaction running in immobile zone.
void make_reactions()
Resolves construction of following reactions.
unsigned int n_elements() const
void initialize() override
Prepares the object to usage.
Distribution * distribution_
Pointer to reference to distribution of elements between processors.
static constexpr Mask equation_result
Match result fields. These are never given by input or copy of input.
static constexpr Mask input_copy
A field that is input of its equation and can not read from input, thus must be set by copy...
FieldCommon & input_default(const string &input_default)
#define START_TIMER(tag)
Starts a timer with specified tag.
#define OLD_ASSERT_LESS(a, b)
void initialize_fields()
Initializes field sets.
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.
void * xmalloc(size_t size)
Memory allocation with checking.
Support classes for parallel programing.
Sorption model in mobile zone in case dual porosity is considered.
void output_vector_gather(void) override
Gathers all the parallel vectors to enable them to be output.
FieldCommon & description(const string &description)
virtual MultiFieldValue::return_type value(const Point &p, const ElementAccessor< spacedim > &elm) const
Input::Record input_record_
void output(std::shared_ptr< OutputTime > stream)
void set_components(const std::vector< string > &names)
int * el_4_loc_
Indices of elements belonging to local dofs.
double ** compute_reaction(double **concentrations, int loc_el) override
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.
arma::vec::fixed< spacedim > centre() const
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.
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.
Vec * vconc_immobile
PETSC concentration vector for immobile phase (parallel).
This file contains classes representing sorption model. Sorption model can be computed both in case t...
#define FLOW123D_FORCE_LINK_IN_CHILD(x)
ElementVector element
Vector of elements of the mesh.
unsigned int lsize(int proc) const
get local size