Flow123d  master-94c4283
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"
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  *this += scale_aqua.name("scale_aqua")
124  .description("Scale aqua computed by model.")
125  .input_default("0.0")
127 
128  *this += scale_sorbed.name("scale_sorbed")
129  .description("Scale sorbed computed by model.")
130  .input_default("0.0")
131  .units( UnitSI().kg().m(-3) );
132 
133  *this += no_sorbing_surface_cond.name("no_sorbing_surface_cond")
134  .description("No sorbing surface condition computed by model.")
135  .input_default("0.0")
137 
138 }
139 
140 
142 : ReactionTerm::EqData() {}
143 
144 
146  : ReactionTerm(init_mesh, in_rec),
147  init_condition_assembly_(nullptr),
148  reaction_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  if (reaction_assembly_!=nullptr) delete reaction_assembly_;
162 }
163 
165 {
167 
168  reactions_it = input_record_.find<Input::AbstractRecord>("reaction_liquid");
169  if ( reactions_it )
170  {
171  // TODO: allowed instances in this case are only
172  // FirstOrderReaction, RadioactiveDecay
173  reaction_liquid = (*reactions_it).factory< ReactionTerm, Mesh &, Input::Record >(*mesh_, *reactions_it);
174  } else
175  {
176  reaction_liquid = nullptr;
177  }
178 
179  reactions_it = input_record_.find<Input::AbstractRecord>("reaction_solid");
180  if ( reactions_it )
181  {
182  // TODO: allowed instances in this case are only
183  // FirstOrderReaction, RadioactiveDecay
184  reaction_solid = (*reactions_it).factory< ReactionTerm, Mesh &, Input::Record >(*mesh_, *reactions_it);
185  } else
186  {
187  reaction_solid = nullptr;
188  }
189 }
190 
192 {
193  ASSERT_PERMANENT_PTR(time_).error("Time governor has not been set yet.\n");
194  ASSERT_PERMANENT(output_stream_).error("Null output stream.\n");
195  ASSERT_PERMANENT_LT(0, eq_data_->substances_.size());
196 
197  initialize_substance_ids(); //computes present substances and sets indices
198  initialize_from_input(); //reads non-field data from input
199 
200  //isotherms array resized bellow
201  unsigned int nr_of_regions = mesh_->region_db().bulk_size();
202  eq_data_->isotherms.resize(nr_of_regions);
203  eq_data_->max_conc.resize(nr_of_regions);
204  for(unsigned int i_reg = 0; i_reg < nr_of_regions; i_reg++)
205  {
206  eq_data_->isotherms[i_reg].resize(eq_data_->n_substances_);
207  eq_data_->max_conc[i_reg].resize(eq_data_->n_substances_, 0.0);
208  for(unsigned int i_subst = 0; i_subst < eq_data_->n_substances_; i_subst++)
209  {
210  eq_data_->isotherms[i_reg][i_subst] = Isotherm();
211  }
212  }
213 
216 
217  if(reaction_liquid)
218  {
219  reaction_liquid->substances(eq_data_->substances_)
220  .concentration_fields(eq_fields_->conc_mobile_fe)
221  .set_time_governor(*time_);
222  reaction_liquid->initialize();
223  }
224  if(reaction_solid)
225  {
226  reaction_solid->substances(eq_data_->substances_)
227  .concentration_fields(eq_fields_->conc_solid_fe)
228  .set_time_governor(*time_);
229  reaction_solid->initialize();
230  }
231 
234 }
235 
236 
238 {
239  Input::Array substances_array = input_record_.val<Input::Array>("substances");
240  unsigned int k, global_idx, i_subst = 0;
241  bool found;
242  Input::Iterator<string> spec_iter = substances_array.begin<string>();
243 
244  for(; spec_iter != substances_array.end(); ++spec_iter, i_subst++)
245  {
246  //finding the name of a substance in the global array of names
247  found = false;
248  for(k = 0; k < eq_data_->substances_.size(); k++)
249  {
250  if (*spec_iter == eq_data_->substances_[k].name())
251  {
252  global_idx = k;
253  found = true;
254  break;
255  }
256  }
257 
258  if(!found)
259  THROW(ReactionTerm::ExcUnknownSubstance()
260  << ReactionTerm::EI_Substance(*spec_iter)
261  << substances_array.ei_address());
262 
263  //finding the global index of substance in the local array
264  found = false;
265  for(k = 0; k < eq_data_->substance_global_idx_.size(); k++)
266  {
267  if(eq_data_->substance_global_idx_[k] == global_idx)
268  {
269  found = true;
270  break;
271  }
272  }
273 
274  if(!found)
275  {
276  eq_data_->substance_global_idx_.push_back(global_idx);
277  }
278 
279  }
280  eq_data_->n_substances_ = eq_data_->substance_global_idx_.size();
281 }
282 
284 {
285  // read number of interpolation steps - value checked by the record definition
286  n_interpolation_steps_ = input_record_.val<int>("substeps");
287 
288  // read the density of solvent - value checked by the record definition
289  eq_data_->solvent_density_ = input_record_.val<double>("solvent_density");
290 
291  // read the solubility vector
292  Input::Iterator<Input::Array> solub_iter = input_record_.find<Input::Array>("solubility");
293  if( solub_iter )
294  {
295  if (solub_iter->Array::size() != eq_data_->n_substances_)
296  {
297  THROW(SorptionBase::ExcSubstanceCountMatch()
298  << SorptionBase::EI_ArrayName("solubility")
300  // there is no way to get ei_address from 'solub_iter', only as a string
301  }
302 
303  else solub_iter->copy_to(eq_data_->solubility_vec_);
304  }
305  else{
306  // fill solubility_vec_ with zeros
307  eq_data_->solubility_vec_.clear();
308  eq_data_->solubility_vec_.resize(eq_data_->n_substances_,0.0);
309  }
310 
311  // read the interpolation table limits
312  Input::Iterator<Input::Array> interp_table_limits = input_record_.find<Input::Array>("table_limits");
313  if( interp_table_limits )
314  {
315  if (interp_table_limits->Array::size() != eq_data_->n_substances_)
316  {
317  THROW(SorptionBase::ExcSubstanceCountMatch()
318  << SorptionBase::EI_ArrayName("table_limits")
320  // there is no way to get ei_address from 'interp_table_limits', only as a string
321  }
322 
323  else interp_table_limits->copy_to(eq_data_->table_limit_);
324  }
325  else{
326  // fill table_limit_ with negative values -> automatic limit
327  eq_data_->table_limit_.clear();
328  eq_data_->table_limit_.resize(eq_data_->n_substances_,-1.0);
329  }
330 }
331 
333 {
334  ASSERT_GT(eq_data_->n_substances_, 0).error("Number of substances is wrong, they might have not been set yet.\n");
335 
336  // create vector of substances that are involved in sorption
337  // and initialize eq_fields_ with their names
338  std::vector<std::string> substances_sorption;
339  for (unsigned int i : eq_data_->substance_global_idx_)
340  substances_sorption.push_back(eq_data_->substances_[i].name());
341  eq_fields_->set_components(substances_sorption);
342 
343  // read fields from input file
344  eq_fields_->input_field_set_.set_input_list(input_record_.val<Input::Array>("input_fields"), *time_);
345 
346  eq_fields_->set_mesh(*mesh_);
347 
348  //initialization of output
349  //output_array = input_record_.val<Input::Array>("output_fields");
350  eq_fields_->conc_solid.set_components(eq_data_->substances_.names());
351  eq_fields_->output_fields.set_mesh(*mesh_);
352  eq_fields_->output_fields.output_type(OutputTime::ELEM_DATA);
353  eq_fields_->conc_solid.setup_components();
354 
355  //creating field fe and output multifield for sorbed concentrations
356  eq_fields_->conc_solid_fe.resize(eq_data_->substances_.size());
357  for (unsigned int sbi = 0; sbi < eq_data_->substances_.size(); sbi++)
358  {
359  // create shared pointer to a FieldFE and push this Field to output_field on all regions
360  eq_fields_->conc_solid_fe[sbi] = create_field_fe< 3, FieldValue<3>::Scalar >(eq_data_->dof_handler_);
361  eq_fields_->conc_solid[sbi].set(eq_fields_->conc_solid_fe[sbi], 0);
362  }
363  //output_stream_->add_admissible_field_names(output_array);
364  eq_fields_->output_fields.initialize(output_stream_, mesh_, input_record_.val<Input::Record>("output"), time());
365 }
366 
367 
369 {
370  ASSERT_PTR(time_).error("Time governor has not been set yet.\n");
371  ASSERT(output_stream_).error("Null output stream.\n");
372  ASSERT_LT(0, eq_data_->substances_.size());
373 
374  eq_fields_->set_time(time_->step(), LimitSide::right);
375  std::stringstream ss; // print warning message with table of uninitialized fields
376  if ( FieldCommon::print_message_table(ss, "sorption") ) {
377  WarningOut() << ss.str();
378  }
380 
381  update_max_conc();
382  make_tables();
383 
384  // write initial condition
385  //eq_fields_->output_fields.set_time(time_->step(), LimitSide::right);
386  //eq_fields_->output_fields.output(output_stream_);
387 
388  if(reaction_liquid) reaction_liquid->zero_time_step();
389  if(reaction_solid) reaction_solid->zero_time_step();
390 
391  output_data();
392 }
393 
394 
396 {
397  eq_fields_->set_time(time_->step(), LimitSide::right); // set to the last computed time
398 
399  // if parameters changed during last time step, reinit isotherms and eventualy
400  // update interpolation tables in the case of constant rock matrix parameters
401  make_tables();
402  clear_max_conc();
403 
404  START_TIMER("Sorption");
405  try{
406  reaction_assembly_->assemble(eq_data_->dof_handler_);
407  }
408  catch(ExceptionBase const &e)
409  {
410  e << input_record_.ei_address();
411  throw;
412  }
413 // for ( DHCellAccessor dh_cell : eq_data_->dof_handler_->own_range() )
414 // {
415 // compute_reaction(dh_cell);
416 // }
417  END_TIMER("Sorption");
418 
419  if(reaction_liquid) reaction_liquid->update_solution();
420  if(reaction_solid) reaction_solid->update_solution();
421 }
422 
423 //void SorptionBase::isotherm_reinit(unsigned int i_subst, const ElementAccessor<3> &elem)
424 //{
425 // START_TIMER("SorptionBase::isotherm_reinit");
426 //
427 // double mult_coef = eq_fields_->distribution_coefficient[i_subst].value(elem.centre(),elem);
428 // double second_coef = eq_fields_->isotherm_other[i_subst].value(elem.centre(),elem);
429 //
430 // int reg_idx = elem.region().bulk_idx();
431 // Isotherm & isotherm = eq_data_->isotherms[reg_idx][i_subst];
432 //
433 // bool limited_solubility_on = eq_data_->solubility_vec_[i_subst] > 0.0;
434 //
435 // double scale_aqua = eq_fields_->scale_aqua.value(elem.centre(), elem);
436 // double scale_sorbed = eq_fields_->scale_sorbed.value(elem.centre(), elem);
437 // double no_sorbing_surface_cond = eq_fields_->no_sorbing_surface_cond.value(elem.centre(), elem);
438 //
439 // // in case of no sorbing surface, set isotherm type None
440 // if( no_sorbing_surface_cond <= std::numeric_limits<double>::epsilon())
441 // {
442 // isotherm.reinit(Isotherm::none, false, eq_data_->solvent_density_,
443 // scale_aqua, scale_sorbed,
444 // 0,0,0);
445 // return;
446 // }
447 //
448 // if ( scale_sorbed <= 0.0)
449 // THROW( ExcNotPositiveScaling() << EI_Subst(i_subst) );
450 //
451 // isotherm.reinit(Isotherm::SorptionType(eq_fields_->sorption_type[i_subst].value(elem.centre(),elem)),
452 // limited_solubility_on, eq_data_->solvent_density_,
453 // scale_aqua, scale_sorbed,
454 // eq_data_->solubility_vec_[i_subst], mult_coef, second_coef);
455 //}
456 //
457 //void SorptionBase::isotherm_reinit_all(const ElementAccessor<3> &elem)
458 //{
459 // for(unsigned int i_subst = 0; i_subst < eq_data_->n_substances_; i_subst++)
460 // {
461 // isotherm_reinit(i_subst, elem);
462 // }
463 //}
464 
466 {
467  unsigned int reg_idx, i_subst;
468 
469  // clear max concetrations array
470  unsigned int nr_of_regions = mesh_->region_db().bulk_size();
471  for(reg_idx = 0; reg_idx < nr_of_regions; reg_idx++)
472  for(i_subst = 0; i_subst < eq_data_->n_substances_; i_subst++)
473  eq_data_->max_conc[reg_idx][i_subst] = 0.0;
474 }
475 
477 {
478  unsigned int reg_idx, i_subst, subst_id;
479 
480  clear_max_conc();
481 
482  for ( DHCellAccessor dh_cell : eq_data_->dof_handler_->own_range() ) {
483  IntIdx dof_p0 = dh_cell.get_loc_dof_indices()[0];
484  reg_idx = dh_cell.elm().region().bulk_idx();
485  for(i_subst = 0; i_subst < eq_data_->n_substances_; i_subst++){
486  subst_id = eq_data_->substance_global_idx_[i_subst];
487  eq_data_->max_conc[reg_idx][i_subst] = std::max(eq_data_->max_conc[reg_idx][i_subst], eq_fields_->conc_mobile_fe[subst_id]->vec().get(dof_p0));
488  }
489  }
490 }
491 
493 {
494  START_TIMER("SorptionBase::make_tables");
495  try
496  {
497  ElementAccessor<3> elm;
498  for(const Region &reg_iter: this->mesh_->region_db().get_region_set("BULK"))
499  {
500  int reg_idx = reg_iter.bulk_idx();
501  // true if data has been changed and are constant on the region
502  bool call_reinit = eq_fields_->changed() && eq_fields_->is_constant(reg_iter);
503 
504 // if(call_reinit)
505 // {
506 // ElementAccessor<3> elm(this->mesh_, reg_iter);
507 //// DebugOut().fmt("isotherm reinit\n");
508 // isotherm_reinit_all(elm);
509 // }
510 
511  // find table limit and create interpolation table for every substance
512  for(unsigned int i_subst = 0; i_subst < eq_data_->n_substances_; i_subst++){
513 
514  // clear interpolation tables, if not spacially constant OR switched off
515  if(! eq_fields_->is_constant(reg_iter) || eq_data_->table_limit_[i_subst] == 0.0){
516  eq_data_->isotherms[reg_idx][i_subst].clear_table();
517 // DebugOut().fmt("limit: 0.0 -> clear table\n");
518  continue;
519  }
520 
521  // if true then make_table will be called at the end
522  bool call_make_table = call_reinit;
523  // initialy try to keep the current table limit (it is zero at zero time step)
524  double subst_table_limit = eq_data_->isotherms[reg_idx][i_subst].table_limit();
525 
526  // if automatic, possibly remake tables with doubled range when table maximum was reached
527  if(eq_data_->table_limit_[i_subst] < 0.0)
528  {
529  if(subst_table_limit < eq_data_->max_conc[reg_idx][i_subst])
530  {
531  call_make_table = true;
532  subst_table_limit = 2*eq_data_->max_conc[reg_idx][i_subst];
533 // DebugOut().fmt("limit: max conc\n");
534  }
535  }
536  // if not automatic, set given table limit
537  else
538  {
539  subst_table_limit = eq_data_->table_limit_[i_subst];
540  }
541 
542  if(call_make_table){
543  eq_data_->isotherms[reg_idx][i_subst].make_table(n_interpolation_steps_, subst_table_limit);
544 // DebugOut().fmt("reg: {} i_subst {}: table_limit = {}\n", reg_idx, i_subst, eq_data_->isotherms[reg_idx][i_subst].table_limit());
545  }
546  }
547  }
548  }
549  catch(ExceptionBase const &e)
550  {
551  e << input_record_.ei_address();
552  throw;
553  }
554 }
555 
557 {
558 // const ElementAccessor<3> ele = dh_cell.elm();
559 // int reg_idx = ele.region().bulk_idx();
560 // IntIdx dof_p0 = dh_cell.get_loc_dof_indices()[0];
561 // unsigned int i_subst, subst_id;
562 // // for checking, that the common element data are computed once at maximum
563 //
564 // try{
565 // for(i_subst = 0; i_subst < eq_data_->n_substances_; i_subst++)
566 // {
567 // subst_id = eq_data_->substance_global_idx_[i_subst];
568 // Isotherm & isotherm = eq_data_->isotherms[reg_idx][i_subst];
569 // if (isotherm.is_precomputed()){
570 //// DebugOut().fmt("isotherms precomputed - interpolate, subst[{}]\n", i_subst);
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.interpolate(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 // else{
578 // DebugOut().fmt("isotherms reinit - compute , subst[{}]\n", i_subst);
579 //
580 // isotherm_reinit(i_subst, ele);
581 // double c_aqua = eq_fields_->conc_mobile_fe[subst_id]->vec().get(dof_p0);
582 // double c_sorbed = eq_fields_->conc_solid_fe[subst_id]->vec().get(dof_p0);
583 // isotherm.compute(c_aqua, c_sorbed);
584 // eq_fields_->conc_mobile_fe[subst_id]->vec().set(dof_p0, c_aqua);
585 // eq_fields_->conc_solid_fe[subst_id]->vec().set(dof_p0, c_sorbed);
586 // }
587 //
588 // // update maximal concentration per region (optimization for interpolation)
589 // if(eq_data_->table_limit_[i_subst] < 0)
590 // eq_data_->max_conc[reg_idx][i_subst] = std::max(eq_data_->max_conc[reg_idx][i_subst],
591 // eq_fields_->conc_mobile_fe[subst_id]->vec().get(dof_p0));
592 // }
593 // }
594 // catch(ExceptionBase const &e)
595 // {
596 // e << input_record_.ei_address();
597 // throw;
598 // }
599 }
600 
601 
602 /**************************************** OUTPUT ***************************************************/
603 
605 {
606  eq_fields_->output_fields.set_time(time().step(), LimitSide::right);
607  // Register fresh output data
608  eq_fields_->output_fields.output(time().step());
609 }
FieldCommon::units
FieldCommon & units(const UnitSI &units)
Set basic units of the field.
Definition: field_common.hh:153
LimitSide::right
@ right
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:240
SorptionBase::EqFields::sorption_type
MultiField< 3, FieldValue< 3 >::Enum > sorption_type
Discrete need Selection for initialization.
Definition: sorption_base.hh:94
ASSERT_PERMANENT_PTR
#define ASSERT_PERMANENT_PTR(ptr)
Definition of assert macro checking non-null pointer (PTR)
Definition: asserts.hh:337
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) only for debug mode.
Definition: asserts.hh:317
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:118
SorptionBase::reaction_liquid
std::shared_ptr< ReactionTerm > reaction_liquid
Definition: sorption_base.hh:252
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:237
SorptionBase::reaction_solid
std::shared_ptr< ReactionTerm > reaction_solid
Definition: sorption_base.hh:253
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:99
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:175
SorptionBase::clear_max_conc
void clear_max_conc()
Sets max conc to zeros on all regins.
Definition: sorption_base.cc:465
ASSERT
#define ASSERT(expr)
Definition: asserts.hh:351
SorptionBase::init_field_models
virtual void init_field_models()=0
Initialize FieldModels, method is implemented in descendants.
EquationBase::time_
TimeGovernor * time_
Definition: equation.hh:241
SorptionBase::initialize_from_input
void initialize_from_input()
Initializes private members of sorption from the input record.
Definition: sorption_base.cc:283
distribution.hh
Support classes for parallel programing.
ASSERT_PERMANENT_LT
#define ASSERT_PERMANENT_LT(a, b)
Definition of comparative assert macro (Less Than)
Definition: asserts.hh:297
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:241
EquationBase::time
TimeGovernor & time()
Definition: equation.hh:151
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:332
SorptionBase::n_interpolation_steps_
unsigned int n_interpolation_steps_
Definition: sorption_base.hh:247
SorptionBase::update_max_conc
void update_max_conc()
Computes maximal aqueous concentration at the current step.
Definition: sorption_base.cc:476
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 >
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:159
FieldCommon::flags
FieldCommon & flags(FieldFlag::Flags::Mask mask)
Definition: field_common.hh:192
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:83
SorptionBase::reaction_assembly_
GenericAssembly< ReactionAssemblySorp > * reaction_assembly_
Definition: sorption_base.hh:257
GenericAssembly::assemble
void assemble(std::shared_ptr< DOFHandlerMultiDim > dh) override
General assemble methods.
Definition: generic_assembly.hh:209
SorptionBase::compute_reaction
void compute_reaction(const DHCellAccessor &dh_cell) override
Compute reaction on a single element.
Definition: sorption_base.cc:556
SorptionBase::output_data
void output_data(void) override
Output method.
Definition: sorption_base.cc:604
ASSERT_LT
#define ASSERT_LT(a, b)
Definition of comparative assert macro (Less Than) only for debug mode.
Definition: asserts.hh:301
SorptionBase::EqFields::get_sorption_type_selection
static const Input::Type::Selection & get_sorption_type_selection()
Definition: sorption_base.cc:40
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:101
Region
Definition: region.hh:145
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:103
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:164
SorptionBase::SorptionBase
SorptionBase()
Isotherm::none
@ none
Definition: isotherm.hh:175
assembly_reaction.hh
accessors.hh
SorptionBase::EqData
DualPorosity data.
Definition: sorption_base.hh:124
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
ASSERT_PERMANENT
#define ASSERT_PERMANENT(expr)
Allow use shorter versions of macro names if these names is not used with external library.
Definition: asserts.hh:348
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:368
TimeGovernor::step
const TimeStep & step(int index=-1) const
Definition: time_governor.cc:753
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:242
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:106
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:242
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
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:395
SorptionBase::EqFields::rock_density
Field< 3, FieldValue< 3 >::Scalar > rock_density
Rock matrix density.
Definition: sorption_base.hh:95
SorptionBase::EqFields::output_fields
EquationOutput output_fields
Fields indended for output, i.e. all input fields plus those representing solution.
Definition: sorption_base.hh:113
SorptionBase::make_tables
void make_tables(void)
Definition: sorption_base.cc:492
FieldCommon::input_default
FieldCommon & input_default(const string &input_default)
Definition: field_common.hh:140
Mesh
Definition: mesh.h:362
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::EqData::EqData
EqData()
Collect all fields.
Definition: sorption_base.cc:141
Isotherm
Definition: isotherm.hh:158
SorptionBase::EqFields::scale_aqua
Field< 3, FieldValue< 3 >::Scalar > scale_aqua
Instances of FieldModel used in assembly methods.
Definition: sorption_base.hh:116
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:256
SorptionBase::initialize
void initialize() override
Prepares the object to usage.
Definition: sorption_base.cc:191
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:172
FieldCommon::description
FieldCommon & description(const string &description)
Definition: field_common.hh:128
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) only for debug mode.
Definition: asserts.hh:341
SorptionBase::EqFields::porosity
Field< 3, FieldValue< 3 >::Scalar > porosity
Porosity field copied from transport.
Definition: sorption_base.hh:104
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:110
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:117
FieldSet::make_field_descriptor_type
Input::Type::Record make_field_descriptor_type(const std::string &equation_name) const
Definition: field_set.cc:93
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:121
FMT_UNUSED
#define FMT_UNUSED
Definition: posix.h:75