-
Notifications
You must be signed in to change notification settings - Fork 1
/
convection_diffusion_base.h
301 lines (260 loc) · 9.1 KB
/
convection_diffusion_base.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
/*
* Copyright (c) 2010-2015: G-CSC, Goethe University Frankfurt
* Author: Andreas Vogel
*
* This file is part of UG4.
*
* UG4 is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License version 3 (as published by the
* Free Software Foundation) with the following additional attribution
* requirements (according to LGPL/GPL v3 §7):
*
* (1) The following notice must be displayed in the Appropriate Legal Notices
* of covered and combined works: "Based on UG4 (www.ug4.org/license)".
*
* (2) The following notice must be displayed at a prominent place in the
* terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
*
* (3) The following bibliography is recommended for citation and must be
* preserved in all covered files:
* "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
* parallel geometric multigrid solver on hierarchically distributed grids.
* Computing and visualization in science 16, 4 (2013), 151-164"
* "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
* flexible software system for simulating pde based models on high performance
* computers. Computing and visualization in science 16, 4 (2013), 165-179"
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*/
#ifndef __H__UG__LIB_DISC__CONVECTION_DIFFUSION__CONVECTION_DIFFUSION_BASE__
#define __H__UG__LIB_DISC__CONVECTION_DIFFUSION__CONVECTION_DIFFUSION_BASE__
// other ug4 modules
#include "common/common.h"
#include "lib_grid/lg_base.h"
// library intern headers
#include "lib_disc/spatial_disc/elem_disc/elem_disc_interface.h"
#include "lib_disc/spatial_disc/user_data/data_export.h"
#include "lib_disc/spatial_disc/user_data/data_import.h"
namespace ug{
namespace ConvectionDiffusionPlugin{
/// \addtogroup convection_diffusion
/// \{
/// Discretization for the Convection-Diffusion Equation
/**
* This class implements the IElemDisc interface to provide element local
* assemblings for the convection diffusion equation.
* The Equation has the form
* \f[
* \partial_t (m_1 c + m_2) - \nabla \cdot \left ( D \nabla c - \vec{v} c - \vec{F} \right )
* + r_1 \cdot c + r_2 = f + \nabla \cdot \vec{f}_2
* \f]
* with
* <ul>
* <li> \f$ c \f$ is the unknown solution
* <li> \f$ m_1 \equiv m_1(\vec{x},t) \f$ is the Mass Scaling Term
* <li> \f$ m_2 \equiv m_1(\vec{x},t) \f$ is the Mass Term
* <li> \f$ D \equiv D(\vec{x},t) \f$ is the Diffusion Tensor
* <li> \f$ v \equiv \vec{v}(\vec{x},t) \f$ is the Velocity Field
* <li> \f$ F \equiv \vec{F}(\vec{x},t) \f$ is the Flux
* <li> \f$ r_1 \equiv r_1(\vec{x},t) \f$ is the Reaction Rate
* <li> \f$ r_2 \equiv r_2(\vec{x},t) \f$ is a Reaction Term
* <li> \f$ f \equiv f(\vec{x},t) \f$ is a Source Term
* <li> \f$ \vec{f}_2 \equiv \vec{f}_2(\vec{x},t) \f$ is a Vector Source Term
* </ul>
*
* \tparam TDomain Domain
*/
template< typename TDomain>
class ConvectionDiffusionBase
: public IElemDisc<TDomain>
{
private:
/// Base class type
typedef IElemDisc<TDomain> base_type;
public:
/// World dimension
static const int dim = base_type::dim;
public:
/// Constructor
ConvectionDiffusionBase(const char* functions, const char* subsets);
protected:
void init_imports();
public:
/// sets the diffusion tensor
/**
* This method sets the Diffusion tensor used in computations. If no
* Tensor is set, a zero value is assumed.
*/
/// \{
void set_diffusion(SmartPtr<CplUserData<MathMatrix<dim, dim>, dim> > user);
void set_diffusion(number val);
#ifdef UG_FOR_LUA
void set_diffusion(const char* fctName);
void set_diffusion(LuaFunctionHandle fct);
#endif
/// \}
/// sets the velocity field
/**
* This method sets the Velocity field. If no field is provided a zero
* value is assumed.
*/
/// \{
void set_velocity(SmartPtr<CplUserData<MathVector<dim>, dim> > user);
void set_velocity(const std::vector<number>& vVel);
#ifdef UG_FOR_LUA
void set_velocity(const char* fctName);
void set_velocity(LuaFunctionHandle fct);
#endif
/// \}
/// sets the flux
/**
* This method sets the Flux. If no field is provided a zero
* value is assumed.
*/
/// \{
void set_flux(SmartPtr<CplUserData<MathVector<dim>, dim> > user);
void set_flux(const std::vector<number>& vVel);
#ifdef UG_FOR_LUA
void set_flux(const char* fctName);
void set_flux(LuaFunctionHandle fct);
#endif
/// \}
/// sets the reaction rate
/**
* This method sets the Reaction Rate. A zero value is assumed as default.
*/
/// \{
void set_reaction_rate(SmartPtr<CplUserData<number, dim> > user);
void set_reaction_rate(number val);
#ifdef UG_FOR_LUA
void set_reaction_rate(const char* fctName);
void set_reaction_rate(LuaFunctionHandle fct);
#endif
/// \}
/// sets the reaction
/**
* This method sets the Reaction. A zero value is assumed as default.
*/
/// \{
void set_reaction(SmartPtr<CplUserData<number, dim> > user);
void set_reaction(number val);
#ifdef UG_FOR_LUA
void set_reaction(const char* fctName);
void set_reaction(LuaFunctionHandle fct);
#endif
/// \}
void set_reaction_rate_explicit(SmartPtr<CplUserData<number, dim> > user);
void set_reaction_rate_explicit(number val);
#ifdef UG_FOR_LUA
void set_reaction_rate_explicit(const char* fctName);
#endif
void set_reaction_explicit(SmartPtr<CplUserData<number, dim> > user);
void set_reaction_explicit(number val);
#ifdef UG_FOR_LUA
void set_reaction_explicit(const char* fctName);
#endif
void set_source_explicit(SmartPtr<CplUserData<number, dim> > user);
void set_source_explicit(number val);
#ifdef UG_FOR_LUA
void set_source_explicit(const char* fctName);
#endif
/// sets the source / sink term
/**
* This method sets the source/sink value. A zero value is assumed as
* default.
*/
/// \{
void set_source(SmartPtr<CplUserData<number, dim> > user);
void set_source(number val);
#ifdef UG_FOR_LUA
void set_source(const char* fctName);
void set_source(LuaFunctionHandle fct);
#endif
/// \}
/// sets the vector source term
/**
* This method sets the divergence of the source as an effect of an
* external field. A zero value is assumed as default, thus this term is
* ignored then.
*/
/// \{
void set_vector_source(SmartPtr<CplUserData<MathVector<dim>, dim> > user);
void set_vector_source(const std::vector<number>& vVel);
#ifdef UG_FOR_LUA
void set_vector_source(const char* fctName);
void set_vector_source(LuaFunctionHandle fct);
#endif
/// \}
/// sets mass scale
/**
* This method sets the mass scale value. The default value is 1.0.
*/
/// \{
void set_mass_scale(SmartPtr<CplUserData<number, dim> > user);
void set_mass_scale(number val);
#ifdef UG_FOR_LUA
void set_mass_scale(const char* fctName);
void set_mass_scale(LuaFunctionHandle fct);
#endif
/// \}
/// sets mass
/**
* This method sets the mass value. The default value is 0.0.
*/
/// \{
void set_mass(SmartPtr<CplUserData<number, dim> > user);
void set_mass(number val);
#ifdef UG_FOR_LUA
void set_mass(const char* fctName);
void set_mass(LuaFunctionHandle fct);
#endif
/// \}
protected:
/// Data import for Diffusion
DataImport<MathMatrix<dim,dim>, dim> m_imDiffusion;
/// Data import for the Velocity field
DataImport<MathVector<dim>, dim > m_imVelocity;
/// Data import for the Flux
DataImport<MathVector<dim>, dim > m_imFlux;
/// Data import for the reaction term
DataImport<number, dim> m_imReactionRate;
/// Data import for the reaction term
DataImport<number, dim> m_imReaction;
/// Data import for the reaction_rate term explicit
DataImport<number, dim> m_imReactionRateExpl;
/// Data import for the reaction term explicit
DataImport<number, dim> m_imReactionExpl;
/// Data import for the source term explicit
DataImport<number, dim> m_imSourceExpl;
/// Data import for the right-hand side (volume)
DataImport<number, dim> m_imSource;
/// Data import for the right-hand side (vector)
DataImport<MathVector<dim>, dim > m_imVectorSource;
/// Data import for the mass scale
DataImport<number, dim> m_imMassScale;
/// Data import for the mass scale
DataImport<number, dim> m_imMass;
private:
/// returns if local time series is needed
virtual bool requests_local_time_series() {return false;}
public:
typedef SmartPtr<CplUserData<number, dim> > NumberExport;
typedef SmartPtr<CplUserData<MathVector<dim>, dim> > GradExport;
/// returns the export of the value of associated unknown function
virtual SmartPtr<CplUserData<number, dim> > value();
/// returns the export of the gradient of associated unknown function
virtual SmartPtr<CplUserData<MathVector<dim>, dim> > gradient();
protected:
/// Export for the concentration
SmartPtr<DataExport<number, dim> > m_exValue;
/// Export for the gradient of concentration
SmartPtr<DataExport<MathVector<dim>, dim> > m_exGrad;
};
// end group convection_diffusion
/// \}
} // end ConvectionDiffusionPlugin
} // end namespace ug
#endif /*__H__UG__LIB_DISC__CONVECTION_DIFFUSION__CONVECTION_DIFFUSION_BASE__*/