65 "Transport of soluted substances.")
71 return Record(
"Coupling_OperatorSplitting",
72 "Transport by convection and/or diffusion\n" 73 "coupled with reaction and adsorption model (ODE per element)\n" 74 " via operator splitting.")
78 "Time governor setting for the secondary equation.")
80 "Settings for computing balance.")
82 "Parameters of output stream.")
84 "Specification of transported substances.")
87 "Type of numerical method for solute transport.")
89 "Reaction model involved in transport.")
99 Input::register_class< TransportOperatorSplitting, Mesh &, const Input::Record>(
"Coupling_OperatorSplitting") +
111 ADD_FIELD(porosity,
"Mobile porosity",
"1.0");
114 .flags_add(in_main_matrix & in_rhs);
116 add_field(&water_content,
"water_content",
"INTERNAL - water content passed from unsaturated Darcy",
"")
118 .flags_add(input_copy & in_time_term & in_main_matrix & in_rhs);
123 ADD_FIELD(sources_density,
"Density of concentration sources.",
"0");
124 sources_density.units(
UnitSI().kg().m(-3).s(-1) )
127 ADD_FIELD(sources_sigma,
"Concentration flux.",
"0");
128 sources_sigma.units(
UnitSI().s(-1) )
129 .flags_add(in_main_matrix & in_rhs);
131 ADD_FIELD(sources_conc,
"Concentration sources threshold.",
"0");
132 sources_conc.units(
UnitSI().kg().m(-3) )
149 cfl_convection(numeric_limits<double>::max()),
150 cfl_reaction(numeric_limits<double>::max())
161 convection->set_time_governor(
time());
164 convection->substances().initialize(in_rec.
val<
Input::Array>(
"substances"));
176 convection->set_balance_object(
balance_);
178 convection->initialize();
185 this->
eq_data_ = &(convection->data());
187 convection->get_par_info(el_4_loc, el_distribution);
189 if ( reactions_it ) {
194 reaction->substances(convection->substances())
195 .concentration_matrix(convection->get_concentration_matrix(),
196 el_distribution, el_4_loc, convection->get_row_4_el())
197 .output_stream(convection->output_stream())
239 convection->output_stream()->write_time_frame();
254 convection->output_stream()->write_time_frame();
279 bool cfl_changed = cfl_convection_changed || cfl_reaction_changed;
281 if (steps == 1 || cfl_changed)
283 convection->time().set_upper_constraint(
cfl_convection,
"Time step constrained by transport CFL condition (including both flow and sources).");
284 convection->time().set_upper_constraint(
cfl_reaction,
"Time step constrained by reaction CFL condition.");
300 for (
unsigned int sbi=0; sbi<
convection->n_substances(); sbi++)
305 source[sbi] -= region_mass[ri];
327 for (
unsigned int sbi=0; sbi<
convection->n_substances(); sbi++)
332 source[sbi] += region_mass[ri];
335 balance_->add_cumulative_source(sbi, source[sbi]);
342 LogOut().fmt(
"CONVECTION: steps: {}\n", steps);
int IdxInt
Define integers that are indices into large arrays (elements, nodes, dofs etc.)
static const Input::Type::Record & get_input_type()
Main balance input record type.
Abstract base class for equation clasess.
void zero_time_step() override
static std::shared_ptr< OutputTime > create_output_stream(const std::string &equation_name, const Input::Record &in_rec)
This method delete all object instances of class OutputTime stored in output_streams vector...
unsigned int bulk_size() const
static const Input::Type::Record & get_input_type()
Declare input record type for the equation TransportOperatorSplittiong.
static const Input::Type::Record & get_input_type()
The specification of output stream.
virtual void set_velocity_field(const MH_DofHandler &dh) override
void next_time()
Proceed to the next time according to current estimated time step.
static string subfields_address()
const RegionDB & region_db() const
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.
void initialize() override
#define ADD_FIELD(name,...)
Basic time management functionality for unsteady (and steady) solvers (class Equation).
#define LogOut()
Macro defining 'log' record of log.
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
#define START_TIMER(tag)
Starts a timer with specified tag.
double cfl_convection
Time restriction due to transport.
std::shared_ptr< Balance > balance_
object for calculation and writing the mass balance to file.
FLOW123D_FORCE_LINK_IN_CHILD(transportOperatorSplitting)
Class representing dual porosity model in transport.
virtual void set_time_governor(TimeGovernor &time)
void update_solution() override
static Input::Type::Abstract & it_abstract_term()
Support classes for parallel programing.
void output_data() override
Write computed fields.
std::shared_ptr< ConcentrationTransportBase > convection
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.
double cfl_reaction
Time restriction due to reactions.
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.