58 using namespace
Input::Type;
64 "Transport of soluted substances.")
70 return Record(
"Coupling_OperatorSplitting",
71 "Transport by convection and/or diffusion\n" 72 "coupled with reaction and adsorption model (ODE per element)\n" 73 " via operator splitting.")
78 "Settings for computing mass balance.")
80 "Output stream settings.\n Specify file format, precision etc.")
82 "Specification of transported substances.")
85 "Type of the numerical method for the transport equation.")
87 "Reaction model involved in transport.")
97 Input::register_class< TransportOperatorSplitting, Mesh &, const Input::Record>(
"Coupling_OperatorSplitting") +
108 *
this += porosity.name(
"porosity")
109 .description(
"Porosity of the mobile phase.")
110 .input_default(
"1.0")
112 .flags_add(in_main_matrix & in_rhs);
114 *
this += water_content.name(
"water_content")
115 .description(
"INTERNAL. Water content passed from unsaturated Darcy flow model.")
117 .flags_add(input_copy & in_time_term & in_main_matrix & in_rhs);
119 *
this += cross_section.name(
"cross_section")
121 .flags_add(in_time_term & in_main_matrix & in_rhs);
123 *
this += sources_density.name(
"sources_density")
124 .description(
"Density of concentration sources.")
125 .input_default(
"0.0")
126 .units(
UnitSI().kg().m(-3).s(-1) )
129 *
this += sources_sigma.name(
"sources_sigma")
130 .description(
"Concentration flux.")
131 .input_default(
"0.0")
133 .flags_add(in_main_matrix & in_rhs);
135 *
this += sources_conc.name(
"sources_conc")
136 .description(
"Concentration sources threshold.")
137 .input_default(
"0.0")
138 .units(
UnitSI().kg().m(-3) )
167 ASSERT( time_->is_default() == false ).error(
"Missing key 'time' in Coupling_OperatorSplitting.");
168 convection->set_time_governor(
time());
171 convection->substances().initialize(in_rec.
val<
Input::Array>(
"substances"));
183 convection->set_balance_object(
balance_);
185 convection->initialize();
192 this->
eq_data_ = &(convection->data());
194 convection->get_par_info(el_4_loc, el_distribution);
196 if ( reactions_it ) {
203 shared_ptr<DOFHandlerMultiDim> dof_handler = make_shared<DOFHandlerMultiDim>(*mesh_);
204 shared_ptr<DiscreteSpace> ds = make_shared<EqualOrderDiscreteSpace>(
mesh_, fe);
205 dof_handler->distribute_dofs(ds);
207 reaction->substances(convection->substances())
208 .concentration_matrix(convection->get_concentration_matrix(),
209 el_distribution, el_4_loc, convection->get_row_4_el())
210 .output_stream(convection->output_stream())
253 convection->output_stream()->write_time_frame();
269 convection->output_stream()->write_time_frame();
294 bool cfl_changed = cfl_convection_changed || cfl_reaction_changed;
296 if (steps == 1 || cfl_changed)
298 convection->time().set_upper_constraint(
cfl_convection,
"Time step constrained by transport CFL condition (including both flow and sources).");
299 convection->time().set_upper_constraint(
cfl_reaction,
"Time step constrained by reaction CFL condition.");
315 for (
unsigned int sbi=0; sbi<
convection->n_substances(); sbi++)
320 source[sbi] -= region_mass[ri];
342 for (
unsigned int sbi=0; sbi<
convection->n_substances(); sbi++)
347 source[sbi] += region_mass[ri];
350 balance_->add_cumulative_source(sbi, source[sbi]);
357 LogOut().fmt(
"CONVECTION: steps: {}\n", steps);
static const Input::Type::Record & get_input_type()
Main balance input record type.
Abstract base class for equation clasess.
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 const Input::Type::Record & get_input_type()
The specification of output stream.
void next_time()
Proceed to the next time according to current estimated time step.
static std::shared_ptr< OutputTime > create_output_stream(const std::string &equation_name, const Input::Record &in_rec, std::string unit_str)
This method delete all object instances of class OutputTime stored in output_streams vector...
static string subfields_address()
const RegionDB & region_db() const
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library...
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
Basic time management functionality for unsteady (and steady) solvers (class Equation).
static const Type none_type
Mark Type with all bits unset.
#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::Record & record_template()
Template Record with common keys for derived equations.
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
virtual void set_velocity_field(std::shared_ptr< FieldFE< 3, FieldValue< 3 >::VectorFixed >> flux_field) override
Definitions of basic Lagrangean finite elements with polynomial shape functions.
#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.
Class representing dual porosity model in transport.
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
int LongIdx
Define type that represents indices of large arrays (elements, nodes, dofs etc.)
#define END_TIMER(tag)
Ends a timer with specified tag.
double cfl_reaction
Time restriction due to reactions.
Simple sorption model without dual porosity.
#define FLOW123D_FORCE_LINK_IN_PARENT(x)
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...
#define FLOW123D_FORCE_LINK_IN_CHILD(x)
virtual ~TransportOperatorSplitting()
Destructor.
static const int registrar
Registrar of class to factory.