Flow123d  JS_before_hm-2115-gf629a871a
sorption_base.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_base.cc
15  * @brief
16  */
17 
23 #include "reaction/isotherm.hh"
24 
25 #include "system/system.hh"
26 #include "system/sys_profiler.hh"
27 
28 #include "la/distribution.hh"
29 #include "mesh/mesh.h"
30 #include "mesh/elements.h"
31 #include "mesh/accessors.hh"
32 #include "input/type_selection.hh"
33 
34 #include "fields/field_set.hh"
35 #include "fields/field_fe.hh"
37 
38 using namespace Input::Type;
39 
41  return Selection("SorptionType")
42  .add_value(Isotherm::none,"none", "No sorption considered.")
43  .add_value(Isotherm::linear, "linear",
44  "Linear isotherm runs the concentration exchange between liquid and solid.")
45  .add_value(Isotherm::langmuir, "langmuir",
46  "Langmuir isotherm runs the concentration exchange between liquid and solid.")
47  .add_value(Isotherm::freundlich, "freundlich",
48  "Freundlich isotherm runs the concentration exchange between liquid and solid.")
49  .close();
50 }
51 
52 
53 
55  return Record("SorptionAux", "AUXILIARY RECORD. Should not be directly part of the input tree.")
56  .declare_key("substances", Array(String(),1), Default::obligatory(),
57  "Names of the substances that take part in the sorption model.")
58  .declare_key("solvent_density", Double(0.0), Default("1.0"),
59  "Density of the solvent.")
60  .declare_key("substeps", Integer(1), Default("1000"),
61  "Number of equidistant substeps, molar mass and isotherm intersections")
62  .declare_key("solubility", Array(Double(0.0)), Default::optional(), //("-1.0"), //
63  "Specifies solubility limits of all the sorbing species.")
64  .declare_key("table_limits", Array(Double(-1.0)), Default::optional(), //("-1.0"), //
65  "Specifies the highest aqueous concentration in the isotherm function interpolation table. "
66  "Use any negative value for an automatic choice according to current maximal concentration (default and recommended). "
67  "Use '0' to always evaluate isotherm function directly (can be very slow). "
68  "Use a positive value to set the interpolation table limit manually "
69  "(if aqueous concentration is higher, then the isotherm function is evaluated directly).")
70  .declare_key("input_fields", Array(EqFields("","").input_field_set_.make_field_descriptor_type("Sorption")), Default::obligatory(), //
71  "Containes region specific data necessary to construct isotherms.")//;
72  .declare_key("reaction_liquid", ReactionTerm::it_abstract_reaction(), Default::optional(), "Reaction model following the sorption in the liquid.")
73  .declare_key("reaction_solid", ReactionTerm::it_abstract_reaction(), Default::optional(), "Reaction model following the sorption in the solid.")
74  .close();
75 }
76 
77 
78 SorptionBase::EqFields::EqFields(const string &output_field_name, const string &output_field_desc)
80 {
81  *this += rock_density.name("rock_density")
82  .description("Rock matrix density.")
83  .input_default("0.0")
84  .units( UnitSI().kg().m(-3) );
85 
86  *this += sorption_type.name("sorption_type")
87  .description("Considered sorption is described by selected isotherm.\n"
88  "If porosity on an element is equal to 1.0 (or even higher), meaning no sorbing surface, then type 'none' will be selected automatically.")
91 
92  *this += distribution_coefficient.name("distribution_coefficient")
93  .description("Distribution coefficient (( $k_l, k_F, k_L $)) of linear, Freundlich or Langmuir isotherm respectively.")
94  .input_default("1.0")
95  .units( UnitSI().m(3).kg(-1) );
96 
97  *this += isotherm_other.name("isotherm_other")
98  .description("Additional parameter (($ \\alpha $)) of nonlinear isotherms.")
99  .input_default("1.0")
101 
102  *this += init_conc_solid.name("init_conc_solid")
103  .description("Initial solid concentration of substances. It is a vector: one value for every substance.")
104  .input_default("0")
105  .units( UnitSI().dimensionless() );
106 
107  input_field_set_ += *this;
108 
109  // porosity field is set from governing equation (transport) later
110  // hence we do not add it to the input_field_set_
111  *this += porosity
112  .name("porosity")
115  .set_limits(0.0);
116 
117  output_fields += *this;
118  output_fields += conc_solid.name(output_field_name)
119  .description(output_field_desc)
120  .units( UnitSI().dimensionless() )
122 }
123 
125 {}
126 
127 
129  : ReactionTerm(init_mesh, in_rec)
130 {
131  // creating reaction from input and setting their parameters
132  make_reactions();
133 }
134 
135 
137 {}
138 
140 {
142 
143  reactions_it = input_record_.find<Input::AbstractRecord>("reaction_liquid");
144  if ( reactions_it )
145  {
146  // TODO: allowed instances in this case are only
147  // FirstOrderReaction, RadioactiveDecay
148  reaction_liquid = (*reactions_it).factory< ReactionTerm, Mesh &, Input::Record >(*mesh_, *reactions_it);
149  } else
150  {
151  reaction_liquid = nullptr;
152  }
153 
154  reactions_it = input_record_.find<Input::AbstractRecord>("reaction_solid");
155  if ( reactions_it )
156  {
157  // TODO: allowed instances in this case are only
158  // FirstOrderReaction, RadioactiveDecay
159  reaction_solid = (*reactions_it).factory< ReactionTerm, Mesh &, Input::Record >(*mesh_, *reactions_it);
160  } else
161  {
162  reaction_solid = nullptr;
163  }
164 }
165 
167 {
168  ASSERT_PTR(time_).error("Time governor has not been set yet.\n");
169  ASSERT(output_stream_).error("Null output stream.\n");
170  ASSERT_LT(0, eq_data_->substances_.size());
171 
172  initialize_substance_ids(); //computes present substances and sets indices
173  initialize_from_input(); //reads non-field data from input
174 
175  //isotherms array resized bellow
176  unsigned int nr_of_regions = mesh_->region_db().bulk_size();
177  isotherms.resize(nr_of_regions);
178  max_conc.resize(nr_of_regions);
179  for(unsigned int i_reg = 0; i_reg < nr_of_regions; i_reg++)
180  {
181  isotherms[i_reg].resize(n_substances_);
182  max_conc[i_reg].resize(n_substances_, 0.0);
183  for(unsigned int i_subst = 0; i_subst < n_substances_; i_subst++)
184  {
185  isotherms[i_reg][i_subst] = Isotherm();
186  }
187  }
188 
190 
191  if(reaction_liquid)
192  {
193  reaction_liquid->substances(eq_data_->substances_)
194  .concentration_fields(eq_fields_->conc_mobile_fe)
195  .set_time_governor(*time_);
196  reaction_liquid->initialize();
197  }
198  if(reaction_solid)
199  {
200  reaction_solid->substances(eq_data_->substances_)
201  .concentration_fields(eq_fields_->conc_solid_fe)
202  .set_time_governor(*time_);
203  reaction_solid->initialize();
204  }
205 }
206 
207 
209 {
210  Input::Array substances_array = input_record_.val<Input::Array>("substances");
211  unsigned int k, global_idx, i_subst = 0;
212  bool found;
213  Input::Iterator<string> spec_iter = substances_array.begin<string>();
214 
215  for(; spec_iter != substances_array.end(); ++spec_iter, i_subst++)
216  {
217  //finding the name of a substance in the global array of names
218  found = false;
219  for(k = 0; k < eq_data_->substances_.size(); k++)
220  {
221  if (*spec_iter == eq_data_->substances_[k].name())
222  {
223  global_idx = k;
224  found = true;
225  break;
226  }
227  }
228 
229  if(!found)
230  THROW(ReactionTerm::ExcUnknownSubstance()
231  << ReactionTerm::EI_Substance(*spec_iter)
232  << substances_array.ei_address());
233 
234  //finding the global index of substance in the local array
235  found = false;
236  for(k = 0; k < substance_global_idx_.size(); k++)
237  {
238  if(substance_global_idx_[k] == global_idx)
239  {
240  found = true;
241  break;
242  }
243  }
244 
245  if(!found)
246  {
247  substance_global_idx_.push_back(global_idx);
248  }
249 
250  }
252 }
253 
255 {
256  // read number of interpolation steps - value checked by the record definition
257  n_interpolation_steps_ = input_record_.val<int>("substeps");
258 
259  // read the density of solvent - value checked by the record definition
260  solvent_density_ = input_record_.val<double>("solvent_density");
261 
262  // read the solubility vector
263  Input::Iterator<Input::Array> solub_iter = input_record_.find<Input::Array>("solubility");
264  if( solub_iter )
265  {
266  if (solub_iter->Array::size() != n_substances_)
267  {
268  THROW(SorptionBase::ExcSubstanceCountMatch()
269  << SorptionBase::EI_ArrayName("solubility")
271  // there is no way to get ei_address from 'solub_iter', only as a string
272  }
273 
274  else solub_iter->copy_to(solubility_vec_);
275  }
276  else{
277  // fill solubility_vec_ with zeros
278  solubility_vec_.clear();
279  solubility_vec_.resize(n_substances_,0.0);
280  }
281 
282  // read the interpolation table limits
283  Input::Iterator<Input::Array> interp_table_limits = input_record_.find<Input::Array>("table_limits");
284  if( interp_table_limits )
285  {
286  if (interp_table_limits->Array::size() != n_substances_)
287  {
288  THROW(SorptionBase::ExcSubstanceCountMatch()
289  << SorptionBase::EI_ArrayName("table_limits")
291  // there is no way to get ei_address from 'interp_table_limits', only as a string
292  }
293 
294  else interp_table_limits->copy_to(table_limit_);
295  }
296  else{
297  // fill table_limit_ with negative values -> automatic limit
298  table_limit_.clear();
299  table_limit_.resize(n_substances_,-1.0);
300  }
301 }
302 
304 {
305  ASSERT_GT(n_substances_, 0).error("Number of substances is wrong, they might have not been set yet.\n");
306 
307  // create vector of substances that are involved in sorption
308  // and initialize eq_fields_ with their names
309  std::vector<std::string> substances_sorption;
310  for (unsigned int i : substance_global_idx_)
311  substances_sorption.push_back(eq_data_->substances_[i].name());
312  eq_fields_->set_components(substances_sorption);
313 
314  // read fields from input file
315  eq_fields_->input_field_set_.set_input_list(input_record_.val<Input::Array>("input_fields"), *time_);
316 
317  eq_fields_->set_mesh(*mesh_);
318 
319  //initialization of output
320  //output_array = input_record_.val<Input::Array>("output_fields");
321  eq_fields_->conc_solid.set_components(eq_data_->substances_.names());
322  eq_fields_->output_fields.set_mesh(*mesh_);
323  eq_fields_->output_fields.output_type(OutputTime::ELEM_DATA);
324  eq_fields_->conc_solid.setup_components();
325 
326  //creating field fe and output multifield for sorbed concentrations
327  eq_fields_->conc_solid_fe.resize(eq_data_->substances_.size());
328  for (unsigned int sbi = 0; sbi < eq_data_->substances_.size(); sbi++)
329  {
330  // create shared pointer to a FieldFE and push this Field to output_field on all regions
331  eq_fields_->conc_solid_fe[sbi] = create_field_fe< 3, FieldValue<3>::Scalar >(eq_data_->dof_handler_);
332  eq_fields_->conc_solid[sbi].set(eq_fields_->conc_solid_fe[sbi], 0);
333  }
334  //output_stream_->add_admissible_field_names(output_array);
335  eq_fields_->output_fields.initialize(output_stream_, mesh_, input_record_.val<Input::Record>("output"), time());
336 }
337 
338 
340 {
341  ASSERT_PTR(time_).error("Time governor has not been set yet.\n");
342  ASSERT(output_stream_).error("Null output stream.\n");
343  ASSERT_LT(0, eq_data_->substances_.size());
344 
345  eq_fields_->set_time(time_->step(), LimitSide::right);
346  std::stringstream ss; // print warning message with table of uninitialized fields
347  if ( FieldCommon::print_message_table(ss, "sorption") ) {
348  WarningOut() << ss.str();
349  }
351 
352  update_max_conc();
353  make_tables();
354 
355  // write initial condition
356  //eq_fields_->output_fields.set_time(time_->step(), LimitSide::right);
357  //eq_fields_->output_fields.output(output_stream_);
358 
359  if(reaction_liquid) reaction_liquid->zero_time_step();
360  if(reaction_solid) reaction_solid->zero_time_step();
361 
362  output_data();
363 }
364 
366 {
367  for ( DHCellAccessor dh_cell : eq_data_->dof_handler_->own_range() ) {
368  IntIdx dof_p0 = dh_cell.get_loc_dof_indices()[0];
369  const ElementAccessor<3> ele = dh_cell.elm();
370 
371  //setting initial solid concentration for substances involved in adsorption
372  for (unsigned int sbi = 0; sbi < n_substances_; sbi++)
373  {
374  int subst_id = substance_global_idx_[sbi];
375  eq_fields_->conc_solid_fe[subst_id]->vec().set( dof_p0, eq_fields_->init_conc_solid[sbi].value(ele.centre(), ele) );
376  }
377  }
378 }
379 
380 
382 {
383  eq_fields_->set_time(time_->step(), LimitSide::right); // set to the last computed time
384 
385  // if parameters changed during last time step, reinit isotherms and eventualy
386  // update interpolation tables in the case of constant rock matrix parameters
387  make_tables();
388  clear_max_conc();
389 
390  START_TIMER("Sorption");
391  for ( DHCellAccessor dh_cell : eq_data_->dof_handler_->own_range() )
392  {
393  compute_reaction(dh_cell);
394  }
395  END_TIMER("Sorption");
396 
397  if(reaction_liquid) reaction_liquid->update_solution();
398  if(reaction_solid) reaction_solid->update_solution();
399 }
400 
401 void SorptionBase::isotherm_reinit(unsigned int i_subst, const ElementAccessor<3> &elem)
402 {
403  START_TIMER("SorptionBase::isotherm_reinit");
404 
405  double mult_coef = eq_fields_->distribution_coefficient[i_subst].value(elem.centre(),elem);
406  double second_coef = eq_fields_->isotherm_other[i_subst].value(elem.centre(),elem);
407 
408  int reg_idx = elem.region().bulk_idx();
409  Isotherm & isotherm = isotherms[reg_idx][i_subst];
410 
411  bool limited_solubility_on = solubility_vec_[i_subst] > 0.0;
412 
413  // in case of no sorbing surface, set isotherm type None
414  if( common_ele_data.no_sorbing_surface_cond <= std::numeric_limits<double>::epsilon())
415  {
416  isotherm.reinit(Isotherm::none, false, solvent_density_,
418  0,0,0);
419  return;
420  }
421 
422  if ( common_ele_data.scale_sorbed <= 0.0)
423  THROW( ExcNotPositiveScaling() << EI_Subst(i_subst) );
424 
425  isotherm.reinit(Isotherm::SorptionType(eq_fields_->sorption_type[i_subst].value(elem.centre(),elem)),
426  limited_solubility_on, solvent_density_,
428  solubility_vec_[i_subst], mult_coef, second_coef);
429 }
430 
432 {
433  for(unsigned int i_subst = 0; i_subst < n_substances_; i_subst++)
434  {
435  isotherm_reinit(i_subst, elem);
436  }
437 }
438 
440 {
441  unsigned int reg_idx, i_subst;
442 
443  // clear max concetrations array
444  unsigned int nr_of_regions = mesh_->region_db().bulk_size();
445  for(reg_idx = 0; reg_idx < nr_of_regions; reg_idx++)
446  for(i_subst = 0; i_subst < n_substances_; i_subst++)
447  max_conc[reg_idx][i_subst] = 0.0;
448 }
449 
451 {
452  unsigned int reg_idx, i_subst, subst_id;
453 
454  clear_max_conc();
455 
456  for ( DHCellAccessor dh_cell : eq_data_->dof_handler_->own_range() ) {
457  IntIdx dof_p0 = dh_cell.get_loc_dof_indices()[0];
458  reg_idx = dh_cell.elm().region().bulk_idx();
459  for(i_subst = 0; i_subst < n_substances_; i_subst++){
460  subst_id = substance_global_idx_[i_subst];
461  max_conc[reg_idx][i_subst] = std::max(max_conc[reg_idx][i_subst], eq_fields_->conc_mobile_fe[subst_id]->vec().get(dof_p0));
462  }
463  }
464 }
465 
467 {
468  START_TIMER("SorptionBase::make_tables");
469  try
470  {
471  ElementAccessor<3> elm;
472  for(const Region &reg_iter: this->mesh_->region_db().get_region_set("BULK"))
473  {
474  int reg_idx = reg_iter.bulk_idx();
475  // true if data has been changed and are constant on the region
476  bool call_reinit = eq_fields_->changed() && eq_fields_->is_constant(reg_iter);
477 
478  if(call_reinit)
479  {
480  ElementAccessor<3> elm(this->mesh_, reg_iter);
481 // DebugOut().fmt("isotherm reinit\n");
483  isotherm_reinit_all(elm);
484  }
485 
486  // find table limit and create interpolation table for every substance
487  for(unsigned int i_subst = 0; i_subst < n_substances_; i_subst++){
488 
489  // clear interpolation tables, if not spacially constant OR switched off
490  if(! eq_fields_->is_constant(reg_iter) || table_limit_[i_subst] == 0.0){
491  isotherms[reg_idx][i_subst].clear_table();
492 // DebugOut().fmt("limit: 0.0 -> clear table\n");
493  continue;
494  }
495 
496  // if true then make_table will be called at the end
497  bool call_make_table = call_reinit;
498  // initialy try to keep the current table limit (it is zero at zero time step)
499  double subst_table_limit = isotherms[reg_idx][i_subst].table_limit();
500 
501  // if automatic, possibly remake tables with doubled range when table maximum was reached
502  if(table_limit_[i_subst] < 0.0)
503  {
504  if(subst_table_limit < max_conc[reg_idx][i_subst])
505  {
506  call_make_table = true;
507  subst_table_limit = 2*max_conc[reg_idx][i_subst];
508 // DebugOut().fmt("limit: max conc\n");
509  }
510  }
511  // if not automatic, set given table limit
512  else
513  {
514  subst_table_limit = table_limit_[i_subst];
515  }
516 
517  if(call_make_table){
518  isotherms[reg_idx][i_subst].make_table(n_interpolation_steps_, subst_table_limit);
519 // DebugOut().fmt("reg: {} i_subst {}: table_limit = {}\n", reg_idx, i_subst, isotherms[reg_idx][i_subst].table_limit());
520  }
521  }
522  }
523  }
524  catch(ExceptionBase const &e)
525  {
526  e << input_record_.ei_address();
527  throw;
528  }
529 }
530 
532 {
533  const ElementAccessor<3> ele = dh_cell.elm();
534  int reg_idx = ele.region().bulk_idx();
535  IntIdx dof_p0 = dh_cell.get_loc_dof_indices()[0];
536  unsigned int i_subst, subst_id;
537  // for checking, that the common element data are computed once at maximum
538  bool is_common_ele_data_valid = false;
539 
540  try{
541  for(i_subst = 0; i_subst < n_substances_; i_subst++)
542  {
543  subst_id = substance_global_idx_[i_subst];
544  Isotherm & isotherm = isotherms[reg_idx][i_subst];
545  if (isotherm.is_precomputed()){
546 // DebugOut().fmt("isotherms precomputed - interpolate, subst[{}]\n", i_subst);
547  double c_aqua = eq_fields_->conc_mobile_fe[subst_id]->vec().get(dof_p0);
548  double c_sorbed = eq_fields_->conc_solid_fe[subst_id]->vec().get(dof_p0);
549  isotherm.interpolate(c_aqua, c_sorbed);
550  eq_fields_->conc_mobile_fe[subst_id]->vec().set(dof_p0, c_aqua);
551  eq_fields_->conc_solid_fe[subst_id]->vec().set(dof_p0, c_sorbed);
552  }
553  else{
554 // DebugOut().fmt("isotherms reinit - compute , subst[{}]\n", i_subst);
555  if(! is_common_ele_data_valid){
557  is_common_ele_data_valid = true;
558  }
559 
560  isotherm_reinit(i_subst, ele);
561  double c_aqua = eq_fields_->conc_mobile_fe[subst_id]->vec().get(dof_p0);
562  double c_sorbed = eq_fields_->conc_solid_fe[subst_id]->vec().get(dof_p0);
563  isotherm.compute(c_aqua, c_sorbed);
564  eq_fields_->conc_mobile_fe[subst_id]->vec().set(dof_p0, c_aqua);
565  eq_fields_->conc_solid_fe[subst_id]->vec().set(dof_p0, c_sorbed);
566  }
567 
568  // update maximal concentration per region (optimization for interpolation)
569  if(table_limit_[i_subst] < 0)
570  max_conc[reg_idx][i_subst] = std::max(max_conc[reg_idx][i_subst],
571  eq_fields_->conc_mobile_fe[subst_id]->vec().get(dof_p0));
572  }
573  }
574  catch(ExceptionBase const &e)
575  {
576  e << input_record_.ei_address();
577  throw;
578  }
579 }
580 
581 
582 /**************************************** OUTPUT ***************************************************/
583 
585 {
586  eq_fields_->output_fields.set_time(time().step(), LimitSide::right);
587  // Register fresh output data
588  eq_fields_->output_fields.output(time().step());
589 }
FieldCommon::units
FieldCommon & units(const UnitSI &units)
Set basic units of the field.
Definition: field_common.hh:152
LimitSide::right
@ right
SorptionBase::table_limit_
std::vector< double > table_limit_
Definition: sorption_base.hh:219
ReactionTerm::output_stream_
std::shared_ptr< OutputTime > output_stream_
Pointer to a transport output stream.
Definition: reaction_term.hh:146
EquationBase::mesh_
Mesh * mesh_
Definition: equation.hh:220
SorptionBase::EqFields::sorption_type
MultiField< 3, FieldValue< 3 >::Enum > sorption_type
Discrete need Selection for initialization.
Definition: sorption_base.hh:90
SorptionBase::get_input_type
static const Input::Type::Record & get_input_type()
Definition: sorption_base.cc:54
ASSERT_GT
#define ASSERT_GT(a, b)
Definition of comparative assert macro (Greater Than)
Definition: asserts.hh:312
UnitSI::dimensionless
static UnitSI & dimensionless()
Returns dimensionless unit.
Definition: unit_si.cc:55
SorptionBase::reaction_liquid
std::shared_ptr< ReactionTerm > reaction_liquid
Definition: sorption_base.hh:241
SorptionBase::initialize_substance_ids
void initialize_substance_ids()
Reads names of substances from input and creates indexing to global vector of substance.
Definition: sorption_base.cc:208
SorptionBase::reaction_solid
std::shared_ptr< ReactionTerm > reaction_solid
Definition: sorption_base.hh:242
ReactionTerm::ReactionTerm
ReactionTerm(Mesh &init_mesh, Input::Record in_rec)
Definition: reaction_term.cc:51
SorptionBase::EqFields::distribution_coefficient
MultiField< 3, FieldValue< 3 >::Scalar > distribution_coefficient
Multiplication coefficients (k, omega) for all types of isotherms.
Definition: sorption_base.hh:95
ExceptionBase
Base of exceptions used in Flow123d.
Definition: exceptions.hh:75
ReactionTerm::EqFields::EqFields
EqFields()
Constructor.
Definition: reaction_term.hh:69
MeshBase::region_db
const RegionDB & region_db() const
Definition: mesh.h:171
SorptionBase::clear_max_conc
void clear_max_conc()
Sets max conc to zeros on all regins.
Definition: sorption_base.cc:439
ASSERT
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library.
Definition: asserts.hh:347
EquationBase::time_
TimeGovernor * time_
Definition: equation.hh:221
SorptionBase::initialize_from_input
void initialize_from_input()
Initializes private members of sorption from the input record.
Definition: sorption_base.cc:254
distribution.hh
Support classes for parallel programing.
Input::Type::Integer
Class for declaration of the integral input data.
Definition: type_base.hh:483
Input::Record::val
const Ret val(const string &key) const
Definition: accessors_impl.hh:31
IntIdx
int IntIdx
Definition: index_types.hh:25
SorptionBase::eq_fields_
std::shared_ptr< EqFields > eq_fields_
Pointer to equation fields. The object is constructed in descendants.
Definition: sorption_base.hh:201
EquationBase::time
TimeGovernor & time()
Definition: equation.hh:149
Input::Type::Selection::close
const Selection & close() const
Close the Selection, no more values can be added.
Definition: type_selection.cc:65
SorptionBase::initialize_fields
void initialize_fields()
Initializes field sets.
Definition: sorption_base.cc:303
SorptionBase::n_interpolation_steps_
unsigned int n_interpolation_steps_
Definition: sorption_base.hh:206
SorptionBase::update_max_conc
void update_max_conc()
Computes maximal aqueous concentration at the current step.
Definition: sorption_base.cc:450
Input::Type::Double
Class for declaration of the input data that are floating point numbers.
Definition: type_base.hh:534
field_set.hh
THROW
#define THROW(whole_exception_expr)
Wrapper for throw. Saves the throwing point.
Definition: exceptions.hh:53
std::vector< std::string >
ElementAccessor< 3 >
SorptionBase::solubility_vec_
std::vector< double > solubility_vec_
Definition: sorption_base.hh:215
system.hh
OutputTime::ELEM_DATA
@ ELEM_DATA
Definition: output_time.hh:111
FieldCommon::set_limits
FieldCommon & set_limits(double min, double max=std::numeric_limits< double >::max())
Definition: field_common.hh:158
FieldCommon::flags
FieldCommon & flags(FieldFlag::Flags::Mask mask)
Definition: field_common.hh:191
sorption_base.hh
Class SorptionBase is abstract class representing model of sorption in transport.
SorptionBase::CommonElementData::no_sorbing_surface_cond
double no_sorbing_surface_cond
Definition: sorption_base.hh:252
field_fe.hh
type_selection.hh
Input::Array::begin
Iterator< ValueType > begin() const
Definition: accessors_impl.hh:145
SorptionBase::EqFields
Definition: sorption_base.hh:79
SorptionBase::isotherm_reinit
void isotherm_reinit(unsigned int i_subst, const ElementAccessor< 3 > &elm)
Reinitializes the isotherm.
Definition: sorption_base.cc:401
Isotherm::interpolate
void interpolate(double &c_aqua, double &c_sorbed)
Definition: isotherm.cc:84
SorptionBase::compute_reaction
void compute_reaction(const DHCellAccessor &dh_cell) override
Compute reaction on a single element.
Definition: sorption_base.cc:531
SorptionBase::output_data
void output_data(void) override
Output method.
Definition: sorption_base.cc:584
ASSERT_LT
#define ASSERT_LT(a, b)
Definition of comparative assert macro (Less Than)
Definition: asserts.hh:296
SorptionBase::compute_common_ele_data
virtual void compute_common_ele_data(const ElementAccessor< 3 > &elem)=0
SorptionBase::EqFields::get_sorption_type_selection
static const Input::Type::Selection & get_sorption_type_selection()
Definition: sorption_base.cc:40
Isotherm::compute
void compute(double &c_aqua, double &c_sorbed)
Definition: isotherm.cc:68
SorptionBase::EqFields::isotherm_other
MultiField< 3, FieldValue< 3 >::Scalar > isotherm_other
Langmuir sorption coeficients alpha (in fraction c_s = omega * (alpha*c_a)/(1- alpha*c_a)).
Definition: sorption_base.hh:97
Region
Definition: region.hh:146
Isotherm::SorptionType
SorptionType
Type of adsorption isotherm.
Definition: isotherm.hh:174
Input::Iterator
Definition: accessors.hh:143
SorptionBase::EqFields::init_conc_solid
MultiField< 3, FieldValue< 3 >::Scalar > init_conc_solid
Initial sorbed concentrations.
Definition: sorption_base.hh:99
Input::Type::Default
Class Input::Type::Default specifies default value of keys of a Input::Type::Record.
Definition: type_record.hh:61
SorptionBase::make_reactions
void make_reactions()
Definition: sorption_base.cc:139
SorptionBase::SorptionBase
SorptionBase()
Isotherm::none
@ none
Definition: isotherm.hh:175
accessors.hh
Input::Record
Accessor to the data with type Type::Record.
Definition: accessors.hh:291
FieldFlag::equation_result
static constexpr Mask equation_result
Match result fields. These are never given by input or copy of input.
Definition: field_flag.hh:55
elements.h
ReactionTerm::it_abstract_reaction
static Input::Type::Abstract & it_abstract_reaction()
Definition: reaction_term.cc:43
sys_profiler.hh
SorptionBase::set_initial_condition
void set_initial_condition()
Reads and sets initial condition for concentration in solid.
Definition: sorption_base.cc:365
RegionDB::bulk_size
unsigned int bulk_size() const
Definition: region.cc:268
SorptionBase::zero_time_step
void zero_time_step() override
Definition: sorption_base.cc:339
TimeGovernor::step
const TimeStep & step(int index=-1) const
Definition: time_governor.cc:753
DHCellAccessor::elm
const ElementAccessor< 3 > elm() const
Return ElementAccessor to element of loc_ele_idx_.
Definition: dh_cell_accessor.hh:71
Input::AbstractRecord
Accessor to the polymorphic input data of a type given by an AbstracRecord object.
Definition: accessors.hh:458
Input::Type::Default::obligatory
static Default obligatory()
The factory function to make an empty default value which is obligatory.
Definition: type_record.hh:110
FieldCommon::print_message_table
static bool print_message_table(ostream &stream, std::string equation_name)
Definition: field_common.cc:96
Input::Record::ei_address
EI_Address ei_address() const
Definition: accessors.cc:178
UnitSI
Class for representation SI units of Fields.
Definition: unit_si.hh:40
EquationBase::input_record_
Input::Record input_record_
Definition: equation.hh:222
RegionDB::get_region_set
RegionSet get_region_set(const std::string &set_name) const
Definition: region.cc:328
SorptionBase::CommonElementData::scale_sorbed
double scale_sorbed
Definition: sorption_base.hh:251
first_order_reaction.hh
Input::Type::Record::declare_key
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
SorptionBase::~SorptionBase
virtual ~SorptionBase(void)
Definition: sorption_base.cc:136
isotherm.hh
SorptionBase::EqFields::conc_solid
MultiField< 3, FieldValue< 3 >::Scalar > conc_solid
Calculated sorbed concentrations, for output only.
Definition: sorption_base.hh:102
mesh.h
Input::Type::Selection
Template for classes storing finite set of named values.
Definition: type_selection.hh:65
Input::Record::find
Iterator< Ret > find(const string &key) const
Definition: accessors_impl.hh:91
Isotherm::is_precomputed
bool is_precomputed(void)
Definition: isotherm.hh:239
FieldFlag::input_copy
static constexpr Mask input_copy
Definition: field_flag.hh:44
Input::Type::Record::close
Record & close() const
Close the Record for further declarations of keys.
Definition: type_record.cc:304
Input::Type
Definition: balance.hh:41
SorptionBase::isotherms
std::vector< std::vector< Isotherm > > isotherms
Definition: sorption_base.hh:231
Input::Type::Record
Record type proxy class.
Definition: type_record.hh:182
SorptionBase::update_solution
void update_solution(void) override
Updates the solution.
Definition: sorption_base.cc:381
SorptionBase::solvent_density_
double solvent_density_
Definition: sorption_base.hh:211
SorptionBase::EqFields::rock_density
Field< 3, FieldValue< 3 >::Scalar > rock_density
Rock matrix density.
Definition: sorption_base.hh:91
SorptionBase::EqFields::output_fields
EquationOutput output_fields
Fields indended for output, i.e. all input fields plus those representing solution.
Definition: sorption_base.hh:109
SorptionBase::substance_global_idx_
std::vector< unsigned int > substance_global_idx_
Mapping from local indexing of substances to global.
Definition: sorption_base.hh:236
SorptionBase::make_tables
void make_tables(void)
Definition: sorption_base.cc:466
FieldCommon::input_default
FieldCommon & input_default(const string &input_default)
Definition: field_common.hh:139
Mesh
Definition: mesh.h:355
Input::Type::Array
Class for declaration of inputs sequences.
Definition: type_base.hh:339
Isotherm::freundlich
@ freundlich
Definition: isotherm.hh:177
dual_porosity.hh
Class Dual_por_exchange implements the model of dual porosity.
Input::Type::String
Class for declaration of the input data that are in string format.
Definition: type_base.hh:582
DHCellAccessor
Cell accessor allow iterate over DOF handler cells.
Definition: dh_cell_accessor.hh:43
Input::Array
Accessor to input data conforming to declared Array.
Definition: accessors.hh:566
WarningOut
#define WarningOut()
Macro defining 'warning' record of log.
Definition: logger.hh:278
SorptionBase::n_substances_
unsigned int n_substances_
Definition: sorption_base.hh:233
ElementAccessor::region
Region region() const
Definition: accessors.hh:201
fe_value_handler.hh
SorptionBase::EqData::EqData
EqData()
Constructor.
Definition: sorption_base.cc:124
Isotherm
Definition: isotherm.hh:158
SorptionBase::isotherm_reinit_all
void isotherm_reinit_all(const ElementAccessor< 3 > &elm)
Calls isotherm_reinit for all isotherms.
Definition: sorption_base.cc:431
DHCellAccessor::get_loc_dof_indices
LocDofVec get_loc_dof_indices() const
Returns the local indices of dofs associated to the cell on the local process.
Definition: dh_cell_accessor.hh:88
SorptionBase::max_conc
std::vector< std::vector< double > > max_conc
Definition: sorption_base.hh:224
SorptionBase::CommonElementData::scale_aqua
double scale_aqua
Definition: sorption_base.hh:250
Isotherm::langmuir
@ langmuir
Definition: isotherm.hh:178
SorptionBase::initialize
void initialize() override
Prepares the object to usage.
Definition: sorption_base.cc:166
Input::Array::ei_address
EI_Address ei_address() const
Definition: accessors.cc:314
FieldCommon::input_selection
FieldCommon & input_selection(Input::Type::Selection element_selection)
Definition: field_common.hh:171
FieldCommon::description
FieldCommon & description(const string &description)
Definition: field_common.hh:127
reaction_term.hh
Class ReactionTerm is an abstract class representing reaction term in transport.
Input::Type::Selection::add_value
Selection & add_value(const int value, const std::string &key, const std::string &description="", TypeBase::attribute_map attributes=TypeBase::attribute_map())
Adds one new value with name given by key to the Selection.
Definition: type_selection.cc:50
ReactionTerm
Definition: reaction_term.hh:46
ASSERT_PTR
#define ASSERT_PTR(ptr)
Definition of assert macro checking non-null pointer (PTR)
Definition: asserts.hh:336
SorptionBase::EqFields::porosity
Field< 3, FieldValue< 3 >::Scalar > porosity
Porosity field copied from transport.
Definition: sorption_base.hh:100
radioactive_decay.hh
Input::Type::Default::optional
static Default optional()
The factory function to make an empty default value which is optional.
Definition: type_record.hh:124
Isotherm::linear
@ linear
Definition: isotherm.hh:176
SorptionBase::EqFields::input_field_set_
FieldSet input_field_set_
Input data set - fields in this set are read from the input file.
Definition: sorption_base.hh:106
RegionIdx::bulk_idx
unsigned int bulk_idx() const
Returns index of the region in the bulk set.
Definition: region.hh:91
START_TIMER
#define START_TIMER(tag)
Starts a timer with specified tag.
Definition: sys_profiler.hh:115
Input::Array::end
IteratorBase end() const
Definition: accessors_impl.hh:157
ReactionTerm::eq_data_
std::shared_ptr< EqData > eq_data_
Equation data - all data needs in assembly class.
Definition: reaction_term.hh:152
FieldSet::make_field_descriptor_type
Input::Type::Record make_field_descriptor_type(const std::string &equation_name) const
Definition: field_set.cc:69
Isotherm::reinit
void reinit(enum SorptionType sorption_type, bool limited_solubility_on, double aqua_density, double scale_aqua, double scale_sorbed, double c_aqua_limit, double mult_coef, double second_coef)
Definition: isotherm.cc:44
END_TIMER
#define END_TIMER(tag)
Ends a timer with specified tag.
Definition: sys_profiler.hh:149
FieldCommon::name
FieldCommon & name(const string &name)
Definition: field_common.hh:120
ElementAccessor::centre
arma::vec::fixed< spacedim > centre() const
Computes the barycenter.
Definition: accessors_impl.hh:89
SorptionBase::common_ele_data
struct SorptionBase::CommonElementData common_ele_data