65 "Transport of substances.")
71 return Record(
"Transport_OS",
72 "Transport by convection and/or diffusion\n" 73 "coupled with reaction and adsorption model (ODE per element)\n" 74 " via operator splitting.")
77 "Time governor setting for the secondary equation.")
79 "Settings for computing balance.")
81 "Parameters of output stream.")
83 "Specification of transported substances.")
86 "Type of numerical method for solute transport.")
88 "Reaction model involved in transport.")
98 Input::register_class< TransportOperatorSplitting, Mesh &, const Input::Record>(
"Transport_OS") +
110 ADD_FIELD(porosity,
"Mobile porosity",
"1");
116 ADD_FIELD(sources_density,
"Density of concentration sources.",
"0");
117 sources_density.units(
UnitSI().kg().m(-3).s(-1) )
120 ADD_FIELD(sources_sigma,
"Concentration flux.",
"0");
121 sources_sigma.units(
UnitSI().s(-1) )
122 .flags_add(in_main_matrix & in_rhs);
124 ADD_FIELD(sources_conc,
"Concentration sources threshold.",
"0");
125 sources_conc.units(
UnitSI().kg().m(-3) )
142 Semchem_reactions(NULL)
155 convection->substances().initialize(in_rec.
val<
Input::Array>(
"substances"));
163 if (it->val<
bool>(
"balance_on"))
167 convection->set_balance_object(
balance_);
170 convection->initialize();
174 this->
eq_data_ = &(convection->data());
176 convection->get_par_info(el_4_loc, el_distribution);
178 if ( reactions_it ) {
183 reaction->substances(convection->substances())
184 .concentration_matrix(convection->get_concentration_matrix(),
185 el_distribution, el_4_loc, convection->get_row_4_el())
186 .output_stream(convection->output_stream())
202 reaction->data().set_field(
"porosity", convection->data()[
"porosity"]);
224 convection->output_stream()->write_time_frame();
243 convection->output_stream()->write_time_frame();
265 double cfl_convection, cfl_reaction;
266 bool cfl_changed =
convection->evaluate_time_constraint(cfl_convection);
272 convection->time().set_upper_constraint(cfl_convection,
"Time step constrained due to CFL condition (including both flow and sources).");
279 if (steps == 1 || cfl_changed)
convection->time().view(
"Convection");
289 for (
unsigned int sbi=0; sbi<
convection->n_substances(); sbi++)
294 source[sbi] -= region_mass[ri];
316 for (
unsigned int sbi=0; sbi<
convection->n_substances(); sbi++)
321 source[sbi] += region_mass[ri];
324 balance_->add_cumulative_source(sbi, source[sbi]);
static const Input::Type::Record & get_input_type()
Main balance input record type.
Abstract base class for equation clasess.
#define ADD_FIELD(name,...)
void zero_time_step() override
unsigned int bulk_size() const
static const Input::Type::Record & get_input_type()
Declare input record type for the equation TransportOperatorSplittiong.
static Input::Type::Abstract & get_input_type()
virtual void set_velocity_field(const MH_DofHandler &dh) override
void next_time()
Proceed to the next time according to current estimated time step.
TimeMark::Type type_output()
void update_solution(void)
bool is_current(const TimeMark::Type &mask) const
const RegionDB & region_db() const
static const Input::Type::Record & get_input_type()
The specification of output stream.
static const Input::Type::Record & get_input_type()
Input type for a substance.
TransportOperatorSplitting(Mesh &init_mesh, const Input::Record in_rec)
Constructor.
static Input::Type::Abstract & get_input_type()
Common specification of the input record for secondary equations.
I/O functions with filename storing, able to track current line in opened file. All standard stdio fu...
Basic time management functionality for unsteady (and steady) solvers (class Equation).
static TimeMarks & marks()
Basic time management class.
void view(const char *name="") const
Class ReactionTerm is an abstract class representing reaction term in transport.
Class Dual_por_exchange implements the model of dual porosity.
static Input::Type::Abstract & get_input_type()
Common specification of the input record for secondary equations.
std::shared_ptr< ReactionTerm > reaction
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...
#define START_TIMER(tag)
Starts a timer with specified tag.
FLOW123D_FORCE_LINK_IN_CHILD(transportOperatorSplitting)
Class representing dual porosity model in transport.
static std::shared_ptr< OutputTime > create_output_stream(const Input::Record &in_rec)
This method delete all object instances of class OutputTime stored in output_streams vector...
virtual void set_time_governor(TimeGovernor &time)
void update_solution() override
Support classes for parallel programing.
void output_data() override
Write computed fields.
std::shared_ptr< ConcentrationTransportBase > convection
Semchem_interface * Semchem_reactions
FLOW123D_FORCE_LINK_IN_PARENT(firstOrderReaction)
Vector classes to support both Iterator, index and Id access and creating co-located vectors...
static const Input::Type::Record & get_input_type()
#define END_TIMER(tag)
Ends a timer with specified tag.
boost::shared_ptr< Balance > balance_
object for calculation and writing the mass balance to file.
Simple sorption model without dual porosity.
Class for representation SI units of Fields.
static UnitSI & dimensionless()
Returns dimensionless unit.
This file contains classes representing sorption model. Sorption model can be computed both in case t...
virtual ~TransportOperatorSplitting()
Destructor.
static const int registrar
Registrar of class to factory.