Flow123d  DF_patch_fe_darcy_complete-579fe1e
sorption.cc
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file sorption.cc
15  * @brief
16  */
17 
18 #include <vector>
19 #include <limits>
20 
21 #include "reaction/isotherm.hh"
22 #include "reaction/sorption.hh"
23 #include "system/sys_profiler.hh"
24 #include "system/asserts.hh"
25 #include "mesh/accessors.hh"
26 #include "input/factory.hh"
27 #include "fields/field_model.hh"
28 
29 FLOW123D_FORCE_LINK_IN_CHILD(sorptionMobile)
30 FLOW123D_FORCE_LINK_IN_CHILD(sorptionImmobile)
32 
33 
34 /********************************* SORPTION_SIMPLE *********************************************************/
35 /********************************* *********************************************************/
36 
37 // Functors for computing models
39  inline double operator() (double por_m) {
40  return por_m;
41  }
42 };
43 
45  inline double operator() (double surface_cond, double rock_density) {
46  return surface_cond * rock_density;
47  }
48 };
49 
51  inline double operator() (double por_m) {
52  return 1 - por_m;
53  }
54 };
55 
56 
58  return IT::Record("Sorption", "Sorption model in the reaction term of transport.")
61  .declare_key("output", make_output_type("Sorption", "conc_solid", "Concentration solution in the solid phase."),
62  IT::Default("{ \"fields\": [ \"conc_solid\" ] }"),
63  "Setting of the fields output.")
64 
65  .close();
66 }
67 
69  : SorptionBase(init_mesh, in_rec)
70 {
71  eq_fields_ = std::make_shared<EqFields>("conc_solid", "Concentration solution in the solid phase.");
72  this->eq_fieldset_ = eq_fields_;
73  this->eq_fields_base_ = std::static_pointer_cast<ReactionTerm::EqFields>(eq_fields_);
74  this->eq_data_->set_eq_fields(eq_fields_);
75 }
76 
77 const int SorptionSimple::registrar =
78  Input::register_class< SorptionSimple, Mesh &, Input::Record >("Sorption") +
80 
82 {}
83 
85 {
86  eq_fields_->scale_aqua.set(Model<3, FieldValue<3>::Scalar>::create(fn_simple_scale_aqua(), eq_fields_->porosity), 0.0);
87  eq_fields_->scale_sorbed.set(Model<3, FieldValue<3>::Scalar>::create(
88  fn_simple_scale_sorbed(), eq_fields_->no_sorbing_surface_cond, eq_fields_->rock_density), 0.0);
89  eq_fields_->no_sorbing_surface_cond.set(Model<3, FieldValue<3>::Scalar>::create(fn_simple_surface_cond(), eq_fields_->porosity), 0.0);
90 }
91 
92 
93 /*********************************** *********************************************************/
94 /*********************************** SORPTION_DUAL *********************************************************/
95 /*********************************** *********************************************************/
96 
97 SorptionDual::EqFields::EqFields(const string &output_field_name, const string &output_field_desc)
98 : SorptionBase::EqFields(output_field_name, output_field_desc)
99 {
100  *this+=immob_porosity_
102  .name("porosity_immobile")
103  .set_limits(0.0);
104 }
105 
107  const string &output_conc_name,
108  const string &output_conc_desc)
109  : SorptionBase(init_mesh, in_rec)
110 {
111  eq_fields_dual_ = std::make_shared<EqFields>(output_conc_name, output_conc_desc);
113  this->eq_fields_base_ = std::static_pointer_cast<ReactionTerm::EqFields>(eq_fields_dual_);
114  this->eq_fields_ = std::static_pointer_cast<SorptionBase::EqFields>(eq_fields_dual_);
115  this->eq_data_->set_eq_fields(this->eq_fields_);
116 }
117 
119 {}
120 
121 /********************************** *******************************************************/
122 /*********************************** SORPTION_MOBILE *******************************************************/
123 /********************************** *******************************************************/
124 
125 // Functors for computing models
127  inline double operator() (double por_m) {
128  return por_m;
129  }
130 };
131 
133  inline double operator() (double por_m, double por_imm, double surface_cond, double rock_density) {
134  double phi = por_m/(por_m + por_imm);
135  return phi * surface_cond * rock_density;
136  }
137 };
138 
140  inline double operator() (double por_m, double por_imm) {
141  return 1 - por_m - por_imm;
142  }
143 };
144 
145 
147  return IT::Record("SorptionMobile", "Sorption model in the mobile zone, following the dual porosity model.")
150  .declare_key("output", make_output_type("SorptionMobile", "conc_solid", "Concentration solution in the solid mobile phase."),
151  IT::Default("{ \"fields\": [ \"conc_solid\" ] }"),
152  "Setting of the fields output.")
153 
154  .close();
155 }
156 
157 
158 const int SorptionMob::registrar =
159  Input::register_class< SorptionMob, Mesh &, Input::Record >("SorptionMobile") +
161 
162 
164  : SorptionDual(init_mesh, in_rec, "conc_solid", "Concentration solution in the solid mobile phase.")
165 {}
166 
167 
169 {}
170 
172 {
173  eq_fields_->scale_aqua.set(Model<3, FieldValue<3>::Scalar>::create(fn_mob_scale_aqua(), eq_fields_->porosity), 0.0);
174  eq_fields_->scale_sorbed.set(Model<3, FieldValue<3>::Scalar>::create(
175  fn_mob_scale_sorbed(), eq_fields_->porosity, eq_fields_dual_->immob_porosity_, eq_fields_->no_sorbing_surface_cond,
176  eq_fields_->rock_density), 0.0);
177  eq_fields_->no_sorbing_surface_cond.set(Model<3, FieldValue<3>::Scalar>::create(
178  fn_mob_surface_cond(), eq_fields_->porosity, eq_fields_dual_->immob_porosity_), 0.0);
179 }
180 
181 
182 /*********************************** *****************************************************/
183 /*********************************** SORPTION_IMMOBILE *****************************************************/
184 /*********************************** *****************************************************/
185 
186 // Functors for computing models
188  inline double operator() (double por_imm) {
189  return por_imm;
190  }
191 };
192 
194  inline double operator() (double por_m, double por_imm, double surface_cond, double rock_density) {
195  double phi = por_m/(por_m + por_imm);
196  return (1 - phi) * surface_cond * rock_density;
197  }
198 };
199 
201  inline double operator() (double por_m, double por_imm) {
202  return 1 - por_m - por_imm;
203  }
204 };
205 
206 
208  return IT::Record("SorptionImmobile", "Sorption model in the immobile zone, following the dual porosity model.")
211  .declare_key("output", make_output_type("SorptionImmobile", "conc_immobile_solid", "Concentration solution in the solid immobile phase."),
212  IT::Default("{ \"fields\": [ \"conc_immobile_solid\" ] }"),
213  "Setting of the fields output.")
214 
215  .close();
216 }
217 
218 const int SorptionImmob::registrar =
219  Input::register_class< SorptionImmob, Mesh &, Input::Record >("SorptionImmobile") +
221 
223 : SorptionDual(init_mesh, in_rec, "conc_immobile_solid", "Concentration solution in the solid immobile phase.")
224 {}
225 
227 {}
228 
230 {
231  eq_fields_->scale_aqua.set(Model<3, FieldValue<3>::Scalar>::create(fn_immob_scale_aqua(), eq_fields_dual_->immob_porosity_), 0.0);
232  eq_fields_->scale_sorbed.set(Model<3, FieldValue<3>::Scalar>::create(
233  fn_immob_scale_sorbed(), eq_fields_->porosity, eq_fields_dual_->immob_porosity_, eq_fields_->no_sorbing_surface_cond,
234  eq_fields_->rock_density), 0.0);
235  eq_fields_->no_sorbing_surface_cond.set(Model<3, FieldValue<3>::Scalar>::create(
236  fn_immob_surface_cond(), eq_fields_->porosity, eq_fields_dual_->immob_porosity_), 0.0);
237 }
Definitions of ASSERTS.
std::shared_ptr< FieldSet > eq_fieldset_
Definition: equation.hh:249
FieldCommon & flags_add(FieldFlag::Flags::Mask mask)
FieldCommon & name(const string &name)
FieldCommon & set_limits(double min, double max=std::numeric_limits< double >::max())
static constexpr Mask input_copy
Definition: field_flag.hh:44
Accessor to the data with type Type::Record.
Definition: accessors.hh:291
Class Input::Type::Default specifies default value of keys of a Input::Type::Record.
Definition: type_record.hh:61
Record type proxy class.
Definition: type_record.hh:182
unsigned int size() const
Returns number of keys in the Record.
Definition: type_record.hh:602
virtual Record & derive_from(Abstract &parent)
Method to derive new Record from an AbstractRecord parent.
Definition: type_record.cc:196
Record & close() const
Close the Record for further declarations of keys.
Definition: type_record.cc:304
Record & copy_keys(const Record &other)
Copy keys from other record.
Definition: type_record.cc:216
Record & declare_key(const string &key, std::shared_ptr< TypeBase > type, const Default &default_value, const string &description, TypeBase::attribute_map key_attributes=TypeBase::attribute_map())
Declares a new key of the Record.
Definition: type_record.cc:503
Definition: mesh.h:362
EqFields()
Constructor.
static Input::Type::Abstract & it_abstract_immobile_term()
std::shared_ptr< EqFields > eq_fields_base_
Equation data - all fields needs in assembly class.
static Input::Type::Abstract & it_abstract_term()
static Input::Type::Abstract & it_abstract_mobile_term()
static const Input::Type::Record & get_input_type()
std::shared_ptr< EqData > eq_data_
Equation data.
static Input::Type::Instance make_output_type(const string &equation_name, const string &output_field_name, const string &output_field_desc)
std::shared_ptr< EqFields > eq_fields_
Pointer to equation fields. The object is constructed in descendants.
Field< 3, FieldValue< 3 >::Scalar > immob_porosity_
Definition: sorption.hh:80
Abstract class of sorption model in case dual porosity is considered.
Definition: sorption.hh:74
~SorptionDual(void)
Destructor.
Definition: sorption.cc:118
SorptionDual(Mesh &init_mesh, Input::Record in_rec, const string &output_conc_name, const string &output_conc_desc)
Constructor.
Definition: sorption.cc:106
std::shared_ptr< EqFields > eq_fields_dual_
Overwrites SorptionBase::eq_fields_.
Definition: sorption.hh:98
SorptionImmob(Mesh &init_mesh, Input::Record in_rec)
Constructor.
Definition: sorption.cc:222
~SorptionImmob(void)
Destructor.
Definition: sorption.cc:226
void init_field_models() override
Implements SorptionBase::init_field_models.
Definition: sorption.cc:229
static const int registrar
Registrar of class to factory.
Definition: sorption.hh:150
static const Input::Type::Record & get_input_type()
Definition: sorption.cc:207
static const int registrar
Registrar of class to factory.
Definition: sorption.hh:124
SorptionMob(Mesh &init_mesh, Input::Record in_rec)
Constructor.
Definition: sorption.cc:163
static const Input::Type::Record & get_input_type()
Definition: sorption.cc:146
void init_field_models() override
Implements SorptionBase::init_field_models.
Definition: sorption.cc:171
~SorptionMob(void)
Destructor.
Definition: sorption.cc:168
static const Input::Type::Record & get_input_type()
Definition: sorption.cc:57
~SorptionSimple(void)
Destructor.
Definition: sorption.cc:81
static const int registrar
Registrar of class to factory.
Definition: sorption.hh:66
void init_field_models() override
Implements SorptionBase::init_field_models.
Definition: sorption.cc:84
SorptionSimple(Mesh &init_mesh, Input::Record in_rec)
Constructor.
Definition: sorption.cc:68
#define FLOW123D_FORCE_LINK_IN_CHILD(x)
Definition: global_defs.h:104
This file contains classes representing sorption model. Sorption model can be computed both in case t...
double operator()(double por_imm)
Definition: sorption.cc:188
double operator()(double por_m, double por_imm, double surface_cond, double rock_density)
Definition: sorption.cc:194
double operator()(double por_m, double por_imm)
Definition: sorption.cc:201
double operator()(double por_m)
Definition: sorption.cc:127
double operator()(double por_m, double por_imm, double surface_cond, double rock_density)
Definition: sorption.cc:133
double operator()(double por_m, double por_imm)
Definition: sorption.cc:140
double operator()(double surface_cond, double rock_density)
Definition: sorption.cc:45
double operator()(double por_m)
Definition: sorption.cc:51