Flow123d  jenkins-Flow123d-windows32-release-multijob-28
heat_model.cc
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2007 Technical University of Liberec. All rights reserved.
4  *
5  * Please make a following refer to Flow123d on your project site if you use the program for any purpose,
6  * especially for academic research:
7  * Flow123d, Research Centre: Advanced Remedial Technologies, Technical University of Liberec, Czech Republic
8  *
9  * This program is free software; you can redistribute it and/or modify it under the terms
10  * of the GNU General Public License version 3 as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along with this program; if not,
17  * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 021110-1307, USA.
18  *
19  *
20  * $Id$
21  * $Revision$
22  * $LastChangedBy$
23  * $LastChangedDate$
24  *
25  * @file
26  * @brief Discontinuous Galerkin method for equation of transport with dispersion.
27  * @author Jan Stebel
28  */
29 
30 #include "input/input_type.hh"
31 #include "mesh/mesh.h"
32 #include "mesh/accessors.hh"
33 #include "flow/darcy_flow_mh.hh"
35 #include "heat_model.hh"
36 
37 
38 
39 using namespace std;
40 using namespace Input::Type;
41 
42 
43 
44 
45 
46 
47 
48 
49 
51 {
52 
53  *this+=bc_temperature
54  .name("bc_temperature")
55  .description("Boundary value of temperature.")
56  .input_default("0.0")
57  .flags_add(in_rhs);
58 
59  *this+=init_temperature
60  .name("init_temperature")
61  .description("Initial temperature.")
62  .input_default("0.0");
63 
64  *this+=porosity
65  .name("porosity")
66  .description("Porosity.")
67  .input_default("1.0")
68  .flags_add(in_main_matrix & in_time_term);
69 
70  *this+=fluid_density
71  .name("fluid_density")
72  .description("Density of fluid.")
73  .flags_add(in_main_matrix & in_time_term);
74 
75  *this+=fluid_heat_capacity
76  .name("fluid_heat_capacity")
77  .description("Heat capacity of fluid.")
78  .flags_add(in_main_matrix & in_time_term);
79 
80  *this+=fluid_heat_conductivity
81  .name("fluid_heat_conductivity")
82  .description("Heat conductivity of fluid.")
83  .flags_add(in_main_matrix);
84 
85 
86  *this+=solid_density
87  .name("solid_density")
88  .description("Density of solid (rock).")
89  .flags_add(in_time_term);
90 
91  *this+=solid_heat_capacity
92  .name("solid_heat_capacity")
93  .description("Heat capacity of solid (rock).")
94  .flags_add(in_time_term);
95 
96  *this+=solid_heat_conductivity
97  .name("solid_heat_conductivity")
98  .description("Heat conductivity of solid (rock).")
99  .flags_add(in_main_matrix);
100 
101  *this+=disp_l
102  .name("disp_l")
103  .description("Longitudal heat dispersivity in fluid.")
104  .input_default("0.0")
105  .flags_add(in_main_matrix);
106 
107  *this+=disp_t
108  .name("disp_t")
109  .description("Transversal heat dispersivity in fluid.")
110  .input_default("0.0")
111  .flags_add(in_main_matrix);
112 
113  *this+=fluid_thermal_source
114  .name("fluid_thermal_source")
115  .description("Thermal source density in fluid.")
116  .input_default("0.0")
117  .flags_add(in_rhs);
118 
119  *this+=solid_thermal_source
120  .name("solid_thermal_source")
121  .description("Thermal source density in solid.")
122  .input_default("0.0")
123  .flags_add(in_rhs);
124 
125  *this+=fluid_heat_exchange_rate
126  .name("fluid_heat_exchange_rate")
127  .description("Heat exchange rate in fluid.")
128  .input_default("0.0")
129  .flags_add(in_rhs);
130 
131  *this+=solid_heat_exchange_rate
132  .name("solid_heat_exchange_rate")
133  .description("Heat exchange rate of source in solid.")
134  .input_default("0.0")
135  .flags_add(in_rhs);
136 
137  *this+=fluid_ref_temperature
138  .name("fluid_ref_temperature")
139  .description("Reference temperature of source in fluid.")
140  .input_default("0.0")
141  .flags_add(in_rhs);
142 
143  *this+=solid_ref_temperature
144  .name("solid_ref_temperature")
145  .description("Reference temperature in solid.")
146  .input_default("0.0")
147  .flags_add(in_rhs);
148 
149  *this+=cross_section
150  .name("cross_section")
151  .flags(input_copy & in_time_term & in_main_matrix);
152 
153  *this+=output_field
154  .name("temperature")
155  .units("M/L^3")
156  .flags(equation_result);
157 }
158 
159 
160 IT::Record &HeatTransferModel::get_input_type(const string &implementation, const string &description)
161 {
162  static IT::Record input_type = IT::Record(ModelEqData::name() + "_" + implementation, description + " for heat transfer.")
164 
165  return input_type;
166 
167 }
168 
169 
170 IT::Selection &HeatTransferModel::ModelEqData::get_output_selection_input_type(const string &implementation, const string &description)
171 {
172  static IT::Selection input_type = IT::Selection(ModelEqData::name() + "_" + implementation + "_Output", "Selection for output fields of " + description + " for heat transfer.");
173 
174  return input_type;
175 }
176 
177 
179  flux_changed(true)
180 {}
181 
182 
184 {
185  names.clear();
186  names.push_back("");
187 }
188 
189 
191  const ElementAccessor<3> &ele_acc,
192  std::vector<double> &mm_coef)
193 {
194  vector<double> elem_csec(point_list.size()),
195  por(point_list.size()),
196  f_rho(point_list.size()),
197  s_rho(point_list.size()),
198  f_c(point_list.size()),
199  s_c(point_list.size());
200 
201  data().cross_section.value_list(point_list, ele_acc, elem_csec);
202  data().porosity.value_list(point_list, ele_acc, por);
203  data().fluid_density.value_list(point_list, ele_acc, f_rho);
204  data().fluid_heat_capacity.value_list(point_list, ele_acc, f_c);
205  data().solid_density.value_list(point_list, ele_acc, s_rho);
206  data().solid_heat_capacity.value_list(point_list, ele_acc, s_c);
207 
208  for (unsigned int i=0; i<point_list.size(); i++)
209  mm_coef[i] = elem_csec[i]*(por[i]*f_rho[i]*f_c[i] + (1.-por[i])*s_rho[i]*s_c[i]);
210 }
211 
212 
214  const std::vector<arma::vec3> &velocity,
215  const ElementAccessor<3> &ele_acc,
218 {
219  const unsigned int qsize = point_list.size();
220  std::vector<double> f_rho(qsize), f_cap(qsize), f_cond(qsize),
221  s_cond(qsize), por(qsize), csection(qsize), disp_l(qsize), disp_t(qsize);
222 
223  data().fluid_density.value_list(point_list, ele_acc, f_rho);
224  data().fluid_heat_capacity.value_list(point_list, ele_acc, f_cap);
225  data().fluid_heat_conductivity.value_list(point_list, ele_acc, f_cond);
226  data().solid_heat_conductivity.value_list(point_list, ele_acc, s_cond);
227  data().disp_l.value_list(point_list, ele_acc, disp_l);
228  data().disp_t.value_list(point_list, ele_acc, disp_t);
229  data().porosity.value_list(point_list, ele_acc, por);
230  data().cross_section.value_list(point_list, ele_acc, csection);
231 
232  for (unsigned int k=0; k<qsize; k++) {
233  ad_coef[0][k] = velocity[k]*f_rho[k]*f_cap[k];
234 
235  // dispersive part of thermal diffusion
236  // Note that the velocity vector is in fact the Darcian flux,
237  // so to obtain |v| we have to divide vnorm by porosity and cross_section.
238  double vnorm = arma::norm(velocity[k], 2);
239  if (fabs(vnorm) > sqrt(numeric_limits<double>::epsilon()))
240  for (int i=0; i<3; i++)
241  for (int j=0; j<3; j++)
242  dif_coef[0][k](i,j) = (velocity[k][i]*velocity[k][j]/(vnorm*vnorm)*(disp_l[k]-disp_t[k]) + disp_t[k]*(i==j?1:0))
243  *vnorm*f_rho[k]*f_cond[k];
244  else
245  dif_coef[0][k].zeros();
246 
247  // conductive part of thermal diffusion
248  dif_coef[0][k] += csection[k]*(por[k]*f_cond[k] + (1.-por[k])*s_cond[k])*arma::eye(3,3);
249  }
250 }
251 
252 
254  const ElementAccessor<3> &ele_acc,
255  std::vector< arma::vec > &init_values)
256 {
257  vector<double> init_value(point_list.size());
258  data().init_temperature.value_list(point_list, ele_acc, init_value);
259  for (unsigned int i=0; i<point_list.size(); i++)
260  init_values[i] = init_value[i];
261 }
262 
263 
265  const ElementAccessor<3> &ele_acc,
266  std::vector< arma::vec > &bc_values)
267 {
268  vector<double> bc_value(point_list.size());
269  data().bc_temperature.value_list(point_list, ele_acc, bc_value);
270  for (unsigned int i=0; i<point_list.size(); i++)
271  bc_values[i] = bc_value[i];
272 }
273 
274 
276  const ElementAccessor<3> &ele_acc,
277  std::vector<arma::vec> &sources_value,
278  std::vector<arma::vec> &sources_density,
279  std::vector<arma::vec> &sources_sigma)
280 {
281  const unsigned int qsize = point_list.size();
282  std::vector<double> por(qsize), csection(qsize), f_rho(qsize), s_rho(qsize), f_cap(qsize), s_cap(qsize),
283  f_source(qsize), s_source(qsize), f_sigma(qsize), s_sigma(qsize), f_temp(qsize), s_temp(qsize);
284  data().porosity.value_list(point_list, ele_acc, por);
285  data().cross_section.value_list(point_list, ele_acc, csection);
286  data().fluid_density.value_list(point_list, ele_acc, f_rho);
287  data().solid_density.value_list(point_list, ele_acc, s_rho);
288  data().fluid_heat_capacity.value_list(point_list, ele_acc, f_cap);
289  data().solid_heat_capacity.value_list(point_list, ele_acc, s_cap);
290  data().fluid_thermal_source.value_list(point_list, ele_acc, f_source);
291  data().solid_thermal_source.value_list(point_list, ele_acc, s_source);
292  data().fluid_heat_exchange_rate.value_list(point_list, ele_acc, f_sigma);
293  data().solid_heat_exchange_rate.value_list(point_list, ele_acc, s_sigma);
294  data().fluid_ref_temperature.value_list(point_list, ele_acc, f_temp);
295  data().solid_ref_temperature.value_list(point_list, ele_acc, s_temp);
296 
297  for (unsigned int k=0; k<point_list.size(); k++)
298  {
299  sources_density[k].resize(1);
300  sources_sigma[k].resize(1);
301  sources_value[k].resize(1);
302 
303  sources_density[k][0] = csection[k]*(por[k]*f_source[k] + (1.-por[k])*s_source[k]);
304  sources_sigma[k][0] = csection[k]*(por[k]*f_rho[k]*f_cap[k]*f_sigma[k] + (1.-por[k])*s_rho[k]*s_cap[k]*s_sigma[k]);
305  if (fabs(sources_sigma[k][0]) > numeric_limits<double>::epsilon())
306  sources_value[k][0] = csection[k]*(por[k]*f_rho[k]*f_cap[k]*f_sigma[k]*f_temp[k]
307  + (1.-por[k])*s_rho[k]*s_cap[k]*s_sigma[k]*s_temp[k])/sources_sigma[k][0];
308  else
309  sources_value[k][0] = 0;
310  }
311 }
312 
313 
315  const ElementAccessor<3> &ele_acc,
316  std::vector<arma::vec> &sources_sigma)
317 {
318  const unsigned int qsize = point_list.size();
319  std::vector<double> por(qsize), csection(qsize), f_rho(qsize), s_rho(qsize), f_cap(qsize), s_cap(qsize),
320  f_source(qsize), s_source(qsize), f_sigma(qsize), s_sigma(qsize), f_temp(qsize), s_temp(qsize);
321  data().porosity.value_list(point_list, ele_acc, por);
322  data().cross_section.value_list(point_list, ele_acc, csection);
323  data().fluid_density.value_list(point_list, ele_acc, f_rho);
324  data().solid_density.value_list(point_list, ele_acc, s_rho);
325  data().fluid_heat_capacity.value_list(point_list, ele_acc, f_cap);
326  data().solid_heat_capacity.value_list(point_list, ele_acc, s_cap);
327  data().fluid_heat_exchange_rate.value_list(point_list, ele_acc, f_sigma);
328  data().solid_heat_exchange_rate.value_list(point_list, ele_acc, s_sigma);
329  for (unsigned int k=0; k<point_list.size(); k++)
330  {
331  sources_sigma[k].resize(1);
332  sources_sigma[k][0] = csection[k]*(por[k]*f_rho[k]*f_cap[k]*f_sigma[k] + (1.-por[k])*s_rho[k]*s_cap[k]*s_sigma[k]);
333  }
334 }
335 
336 
338 {}
339 
Field< 3, FieldValue< 3 >::Scalar > solid_heat_capacity
Heat capacity of solid.
Definition: heat_model.hh:59
void compute_sources_sigma(const std::vector< arma::vec3 > &point_list, const ElementAccessor< 3 > &ele_acc, std::vector< arma::vec > &sources_sigma) override
Definition: heat_model.cc:314
Field< 3, FieldValue< 3 >::Scalar > fluid_density
Density of fluid.
Definition: heat_model.hh:51
BCField< 3, FieldValue< 3 >::Scalar > bc_temperature
Dirichlet boundary condition for temperature.
Definition: heat_model.hh:45
static Input::Type::AbstractRecord input_type
Common specification of the input record for secondary equations.
Field< 3, FieldValue< 3 >::Scalar > disp_t
Transversal heat dispersivity.
Definition: heat_model.hh:65
Field< 3, FieldValue< 3 >::Scalar > cross_section
Pointer to DarcyFlow field cross_section.
Definition: heat_model.hh:80
???
Field< 3, FieldValue< 3 >::Scalar > fluid_heat_exchange_rate
Heat exchange rate in fluid.
Definition: heat_model.hh:71
Field< 3, FieldValue< 3 >::Scalar > solid_heat_exchange_rate
Heat exchange rate in solid.
Definition: heat_model.hh:73
Record & derive_from(AbstractRecord &parent)
Definition: type_record.cc:172
void compute_init_cond(const std::vector< arma::vec3 > &point_list, const ElementAccessor< 3 > &ele_acc, std::vector< arma::vec > &init_values) override
Definition: heat_model.cc:253
Field< 3, FieldValue< 3 >::Scalar > fluid_heat_capacity
Heat capacity of fluid.
Definition: heat_model.hh:53
virtual void value_list(const std::vector< Point > &point_list, const ElementAccessor< spacedim > &elm, std::vector< typename Value::return_type > &value_list) const
Definition: field.hh:413
Field< 3, FieldValue< 3 >::Scalar > porosity
Porosity of solid.
Definition: heat_model.hh:49
Field< 3, FieldValue< 3 >::Scalar > fluid_thermal_source
Thermal source in fluid.
Definition: heat_model.hh:67
Field< 3, FieldValue< 3 >::Scalar > fluid_heat_conductivity
Heat conductivity of fluid.
Definition: heat_model.hh:55
Field< 3, FieldValue< 3 >::Scalar > fluid_ref_temperature
Reference temperature in fluid.
Definition: heat_model.hh:75
void set_component_names(std::vector< string > &names, const Input::Record &in_rec) override
Read or set names of solution components.
Definition: heat_model.cc:183
Field< 3, FieldValue< 3 >::Scalar > init_temperature
Initial temperature.
Definition: heat_model.hh:47
Field< 3, FieldValue< 3 >::Scalar > solid_thermal_source
Thermal source in solid.
Definition: heat_model.hh:69
void compute_mass_matrix_coefficient(const std::vector< arma::vec3 > &point_list, const ElementAccessor< 3 > &ele_acc, std::vector< double > &mm_coef) override
Definition: heat_model.cc:190
void compute_dirichlet_bc(const std::vector< arma::vec3 > &point_list, const ElementAccessor< 3 > &ele_acc, std::vector< arma::vec > &bc_values) override
Definition: heat_model.cc:264
Accessor to the data with type Type::Record.
Definition: accessors.hh:308
Field< 3, FieldValue< 3 >::Scalar > solid_heat_conductivity
Heat conductivity of solid.
Definition: heat_model.hh:61
const double epsilon
Definition: mathfce.h:6
Field< 3, FieldValue< 3 >::Scalar > solid_ref_temperature
Reference temperature in solid.
Definition: heat_model.hh:77
static IT::Selection & get_output_selection_input_type(const string &implementation, const string &description)
Definition: heat_model.cc:170
virtual ModelEqData & data()=0
Derived class should implement getter for ModelEqData instance.
void compute_advection_diffusion_coefficients(const std::vector< arma::vec3 > &point_list, const std::vector< arma::vec3 > &velocity, const ElementAccessor< 3 > &ele_acc, std::vector< std::vector< arma::vec3 > > &ad_coef, std::vector< std::vector< arma::mat33 > > &dif_coef) override
Definition: heat_model.cc:213
~HeatTransferModel() override
Definition: heat_model.cc:337
Field< 3, FieldValue< 3 >::Scalar > solid_density
Density of solid.
Definition: heat_model.hh:57
Discontinuous Galerkin method for equation of transport with dispersion.
mixed-hybrid model of linear Darcy flow, possibly unsteady.
Record type proxy class.
Definition: type_record.hh:161
void compute_source_coefficients(const std::vector< arma::vec3 > &point_list, const ElementAccessor< 3 > &ele_acc, std::vector< arma::vec > &sources_conc, std::vector< arma::vec > &sources_density, std::vector< arma::vec > &sources_sigma) override
Definition: heat_model.cc:275
Template for classes storing finite set of named values.
static IT::Record & get_input_type(const string &implementation, const string &description)
Definition: heat_model.cc:160
Field< 3, FieldValue< 3 >::Scalar > disp_l
Longitudal heat dispersivity.
Definition: heat_model.hh:63