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