Plugins
Loading...
Searching...
No Matches
smile_Kd_eps.hpp
Go to the documentation of this file.
1/*
2 * smile_Kd.hpp
3 */
4
5#ifndef _SMILE_KD_HPP_
6#define _SMILE_KD_HPP_
7
9
10#include "smile_chem_eq.hpp"
11#include "smile_cloud.hpp"
12
13namespace ug {
14namespace smile {
15
16template <int dim>
17class SmartKd
18 : public StdDataLinker< SmartKd<dim>, number, dim>
19{
21
23 static inline void compute_I_pH_m3
24 (
25 number s, number H, number Ca, number Al, number DIC, number SO4, // [i]
26 number& I, number& pH // [o]
27 )
28 {
29 Compute_I_pH (NaCl_sat*s/1000, H/1000, Ca/1000, Al/1000, DIC/1000, SO4/1000, I, pH);
30 }
31
32 public:
33 SmartKd(Cloud *cloud,
41
42 : m_cloud(cloud), m_spH(spH), m_spS(spS), m_spCa(spCa), m_spDIC(spDIC),
43 m_spSO4(spSO4), m_spAl(spAl), m_entry(entry)
44 {
45 this->set_num_input(6);
46 m_spDH = m_spH.template cast_dynamic<DependentUserData<number, dim> >();
47 m_spDS = m_spS.template cast_dynamic<DependentUserData<number, dim> >();
48 m_spDCa = m_spCa.template cast_dynamic<DependentUserData<number, dim> >();
49 m_spDDIC = m_spDIC.template cast_dynamic<DependentUserData<number, dim> >();
50 m_spDSO4 = m_spSO4.template cast_dynamic<DependentUserData<number, dim> >();
51 m_spDAl = m_spAl.template cast_dynamic<DependentUserData<number, dim> >();
52 base_type::set_input(0, spH, spH );
53 base_type::set_input(1, spS, spS );
54 base_type::set_input(2, spCa, spCa );
55 base_type::set_input(3, spDIC, spDIC);
56 base_type::set_input(4, spSO4, spSO4);
57 base_type::set_input(5, spAl, spAl );
58 }
59
60 inline void evaluate (number& Kd,
61 const MathVector<dim>& globIP,
62 number time, int si) const
63 {
64 number H;
65 (*m_spH) (H, globIP, time, si);
66 number s;
67 (*m_spS) (s, globIP, time, si);
68 number Ca;
69 (*m_spCa) (Ca, globIP, time, si);
70 number DIC;
71 (*m_spDIC)(DIC, globIP, time, si);
72 number SO4;
73 (*m_spSO4)(SO4, globIP, time, si);
74 number Al;
75 (*m_spAl)(Al, globIP, time, si);
76
77 number I, pH;
78 compute_I_pH_m3(s, H, Ca, Al, DIC, SO4, I, pH);
79
80 number x[6];
81 x[0] = pH; x[1] = DIC; x[2] = I; x[3] = Ca; x[4] = Al; x[5] = SO4;
82
83 Kd = m_cloud->interpolate(x, m_entry);
84 }
85
86 template <int refDim>
87 inline void evaluate(number vKd[],
88 const MathVector<dim> vGlobIP[],
89 number time, int si,
90 GridObject* elem,
91 const MathVector<dim> vCornerCoords[],
92 const MathVector<refDim> vLocIP[],
93 const size_t nip,
94 LocalVector* u,
95 const MathMatrix<refDim, dim>* vJT = NULL) const
96 {
97 std::vector<number> vH(nip);
98 (*m_spH) (&vH[0], vGlobIP, time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
99 std::vector<number> vS(nip);
100 (*m_spS) (&vS[0], vGlobIP, time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
101 std::vector<number> vCa(nip);
102 (*m_spCa) (&vCa[0], vGlobIP, time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
103 std::vector<number> vDIC(nip);
104 (*m_spDIC)(&vDIC[0], vGlobIP, time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
105 std::vector<number> vSO4(nip);
106 (*m_spSO4)(&vSO4[0], vGlobIP, time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
107 std::vector<number> vAl(nip);
108 (*m_spAl) (&vAl[0], vGlobIP, time, si, elem, vCornerCoords, vLocIP, nip, u, vJT);
109
110 for(size_t ip = 0; ip < nip; ++ip)
111 {
112 number I, pH;
113 compute_I_pH_m3(vS[ip], vH[ip], vCa[ip], vAl[ip], vDIC[ip], vSO4[ip], I, pH);
114
115 number x[6];
116 x[0] = pH; x[1] = vDIC[ip]; x[2] = I; x[3] = vCa[ip]; x[4] = vAl[ip]; x[5] = vSO4[ip];
117
118 vKd[ip] = m_cloud->interpolate(x, m_entry);
119 }
120 }
121
122 template <int refDim>
124 const MathVector<dim> vGlobIP[],
125 number time, int si,
126 GridObject* elem,
127 const MathVector<dim> vCornerCoords[],
128 const MathVector<refDim> vLocIP[],
129 const size_t nip,
130 LocalVector* u,
131 bool bDeriv,
132 int s,
133 std::vector<std::vector<number> > vvvDeriv[],
134 const MathMatrix<refDim, dim>* vJT = NULL) const
135 {
136 const number* vH = m_spH ->values(s);
137 const number* vS = m_spS ->values(s);
138 const number* vCa = m_spCa ->values(s);
139 const number* vDIC = m_spDIC->values(s);
140 const number* vSO4 = m_spSO4->values(s);
141 const number* vAl = m_spAl ->values(s);
142
143 for(size_t ip = 0; ip < nip; ++ip)
144 {
145 number I, pH;
146 compute_I_pH_m3(vS[ip], vH[ip], vCa[ip], vAl[ip], vDIC[ip], vSO4[ip], I, pH);
147
148 number x[6];
149 x[0] = pH; x[1] = vDIC[ip]; x[2] = I; x[3] = vCa[ip]; x[4] = vAl[ip]; x[5] = vSO4[ip];
150
151 vKd[ip] = m_cloud->interpolate(x, m_entry);
152 }
153
154 if (bDeriv)
155 {
156 // clear all derivative values
157 this->set_zero(vvvDeriv, nip);
158
159 // Derivatives w.r.t. H
160 if (m_spDH.valid() && !m_spDH->zero_derivative())
161 for(size_t ip = 0; ip < nip; ++ip)
162 for(size_t fct = 0; fct < m_spDH->num_fct(); ++fct)
163 {
164 const number* vDH = m_spDH->deriv(s, ip, fct);
165 const size_t commonFct = this->input_common_fct(0, fct);
166 for(size_t sh = 0; sh < this->num_sh(commonFct); ++sh)
167 {
168 number eps = 1e-3*vH[ip];
169
170 number I, pH;
171 compute_I_pH_m3(vS[ip], vH[ip] + eps, vCa[ip], vAl[ip], vDIC[ip], vSO4[ip], I, pH);
172
173 number x[6];
174 x[0] = pH; x[1] = vDIC[ip]; x[2] = I; x[3] = vCa[ip]; x[4] = vAl[ip]; x[5] = vSO4[ip];
176
177 compute_I_pH_m3(vS[ip], vH[ip] - eps, vCa[ip], vAl[ip], vDIC[ip], vSO4[ip], I, pH);
178
179 x[0] = pH; x[1] = vDIC[ip]; x[2] = I; x[3] = vCa[ip]; x[4] = vAl[ip]; x[5] = vSO4[ip];
181
182 vvvDeriv[ip][commonFct][sh] += vDH[sh]*(Kd1 - Kd2)/(2*eps);
183 }
184 }
185
186 // Derivatives w.r.t. S
187 if (m_spDS.valid() && !m_spDS->zero_derivative())
188 for(size_t ip = 0; ip < nip; ++ip)
189 for(size_t fct = 0; fct < m_spDS->num_fct(); ++fct)
190 {
191 const number* vDS = m_spDS->deriv(s, ip, fct);
192 const size_t commonFct = this->input_common_fct(1, fct);
193 for(size_t sh = 0; sh < this->num_sh(commonFct); ++sh)
194 {
195 number eps1, eps2;
196 if (vS[ip] > 0.0)
197 eps1 = eps2 = 1e-3*vS[ip];
198 else {
199 eps1 = 1e-3;
200 eps2 = 0.0;
201 }
202
203 number I, pH;
204 compute_I_pH_m3(vS[ip] + eps1, vH[ip], vCa[ip], vAl[ip], vDIC[ip], vSO4[ip], I, pH);
205
206 number x[6];
207 x[0] = pH; x[1] = vDIC[ip]; x[2] = I; x[3] = vCa[ip]; x[4] = vAl[ip]; x[5] = vSO4[ip];
209
210 compute_I_pH_m3(vS[ip] - eps2, vH[ip], vCa[ip], vAl[ip], vDIC[ip], vSO4[ip], I, pH);
211
212 x[0] = pH; x[1] = vDIC[ip]; x[2] = I; x[3] = vCa[ip]; x[4] = vAl[ip]; x[5] = vSO4[ip];
214
215 vvvDeriv[ip][commonFct][sh] += vDS[sh]*(Kd1 - Kd2)/(eps1 + eps2);
216 }
217 }
218
219 // Derivatives w.r.t. Ca
220 if (m_spDCa.valid() && !m_spDCa->zero_derivative())
221 for(size_t ip = 0; ip < nip; ++ip)
222 for(size_t fct = 0; fct < m_spDCa->num_fct(); ++fct)
223 {
224 const number* vDCa = m_spDCa->deriv(s, ip, fct);
225 const size_t commonFct = this->input_common_fct(2, fct);
226 for(size_t sh = 0; sh < this->num_sh(commonFct); ++sh)
227 {
228 number eps = 1e-3*vCa[ip];
229
230 number I, pH;
231 compute_I_pH_m3(vS[ip], vH[ip], vCa[ip] + eps, vAl[ip], vDIC[ip], vSO4[ip], I, pH);
232
233 number x[6];
234 x[0] = pH; x[1] = vDIC[ip]; x[2] = I; x[3] = vCa[ip] + eps; x[4] = vAl[ip]; x[5] = vSO4[ip];
236
237 compute_I_pH_m3(vS[ip], vH[ip], vCa[ip] - eps, vAl[ip], vDIC[ip], vSO4[ip], I, pH);
238
239 x[0] = pH; x[1] = vDIC[ip]; x[2] = I; x[3] = vCa[ip] - eps; x[4] = vAl[ip]; x[5] = vSO4[ip];
241
242 vvvDeriv[ip][commonFct][sh] += vDCa[sh]*(Kd1 - Kd2)/(2*eps);
243 }
244 }
245
246 // Derivatives w.r.t. DIC
247 if (m_spDDIC.valid() && !m_spDDIC->zero_derivative())
248 for(size_t ip = 0; ip < nip; ++ip)
249 for(size_t fct = 0; fct < m_spDDIC->num_fct(); ++fct)
250 {
251 const number* vDDIC = m_spDDIC->deriv(s, ip, fct);
252 const size_t commonFct = this->input_common_fct(3, fct);
253 for(size_t sh = 0; sh < this->num_sh(commonFct); ++sh)
254 {
255 number eps = 1e-3*vDIC[ip];
256
257 number I, pH;
258 compute_I_pH_m3(vS[ip], vH[ip], vCa[ip], vAl[ip], vDIC[ip] + eps, vSO4[ip], I, pH);
259
260 number x[6];
261 x[0] = pH; x[1] = vDIC[ip] + eps; x[2] = I; x[3] = vCa[ip]; x[4] = vAl[ip]; x[5] = vSO4[ip];
263
264 compute_I_pH_m3(vS[ip], vH[ip], vCa[ip], vAl[ip], vDIC[ip] - eps, vSO4[ip], I, pH);
265
266 x[0] = pH; x[1] = vDIC[ip] - eps; x[2] = I; x[3] = vCa[ip]; x[4] = vAl[ip]; x[5] = vSO4[ip];
268
269 vvvDeriv[ip][commonFct][sh] += vDDIC[sh]*(Kd1 - Kd2)/(2*eps);
270 }
271 }
272
273 // Derivatives w.r.t. SO4
274 if (m_spDSO4.valid() && !m_spDSO4->zero_derivative())
275 for(size_t ip = 0; ip < nip; ++ip)
276 for(size_t fct = 0; fct < m_spDSO4->num_fct(); ++fct)
277 {
278 const number* vDSO4 = m_spDSO4->deriv(s, ip, fct);
279 const size_t commonFct = this->input_common_fct(4, fct);
280 for(size_t sh = 0; sh < this->num_sh(commonFct); ++sh)
281 {
282 number eps1, eps2;
283 if (vSO4[ip] > 0.0)
284 eps1 = eps2 = 1e-3*vSO4[ip];
285 else {
286 eps1 = 1e-3;
287 eps2 = 0.0;
288 }
289
290 number I, pH;
291 compute_I_pH_m3(vS[ip], vH[ip], vCa[ip], vAl[ip], vDIC[ip], vSO4[ip] + eps1, I, pH);
292
293 number x[6];
294 x[0] = pH; x[1] = vDIC[ip]; x[2] = I; x[3] = vCa[ip]; x[4] = vAl[ip]; x[5] = vSO4[ip] + eps1;
296
297 compute_I_pH_m3(vS[ip], vH[ip], vCa[ip], vAl[ip], vDIC[ip], vSO4[ip] - eps2, I, pH);
298
299 x[0] = pH; x[1] = vDIC[ip]; x[2] = I; x[3] = vCa[ip]; x[4] = vAl[ip]; x[5] = vSO4[ip] - eps2;
301
302 vvvDeriv[ip][commonFct][sh] += vDSO4[sh]*(Kd1 - Kd2)/(eps1 + eps2);
303 }
304 }
305
306 // Derivatives w.r.t. Al
307 if (m_spDAl.valid() && !m_spDAl->zero_derivative())
308 for(size_t ip = 0; ip < nip; ++ip)
309 for(size_t fct = 0; fct < m_spDAl->num_fct(); ++fct)
310 {
311 const number* vDDIC = m_spDAl->deriv(s, ip, fct);
312 const size_t commonFct = this->input_common_fct(5, fct);
313 for(size_t sh = 0; sh < this->num_sh(commonFct); ++sh)
314 {
315 number eps1, eps2;
316 if (vAl[ip] > 0.0)
317 eps1 = eps2 = 1e-3*vAl[ip];
318 else {
319 eps1 = 1e-3;
320 eps2 = 0.0;
321 }
322
323 number I, pH;
324 compute_I_pH_m3(vS[ip], vH[ip], vCa[ip], vAl[ip] + eps1, vDIC[ip], vSO4[ip], I, pH);
325
326 number x[6];
327 x[0] = pH; x[1] = vDIC[ip]; x[2] = I; x[3] = vCa[ip]; x[4] = vAl[ip] + eps1; x[5] = vSO4[ip];
329
330 compute_I_pH_m3(vS[ip], vH[ip], vCa[ip], vAl[ip] - eps2, vDIC[ip], vSO4[ip], I, pH);
331
332 x[0] = pH; x[1] = vDIC[ip]; x[2] = I; x[3] = vCa[ip]; x[4] = vAl[ip] - eps2; x[5] = vSO4[ip];
334
335 vvvDeriv[ip][commonFct][sh] += vDDIC[sh]*(Kd1 - Kd2)/(eps1 + eps2);
336 }
337 }
338 }
339 }
340
341 protected:
342
343 Cloud *m_cloud;
356 const number m_entry;
357};
358
359} // end namespace smile
360} // end namespace ug
361
362#endif
parameterString s
Definition Biogas.lua:2
number time() const
const MathVector< dim > & ip(size_t s, size_t ip) const
size_t input_common_fct(size_t i, size_t fct) const
virtual void set_input(size_t i, SmartPtr< ICplUserData< dim > > input, SmartPtr< UserDataInfo > info)
Definition smile_cloud.hpp:15
double interpolate(double *x, int k)
Definition smile_cloud.cpp:68
SmartPtr< DependentUserData< number, dim > > m_spDCa
Definition smile_Kd.hpp:343
SmartPtr< CplUserData< number, dim > > m_spS
Definition smile_Kd.hpp:340
SmartPtr< CplUserData< number, dim > > m_spSO4
Definition smile_Kd.hpp:346
const number m_entry
Definition smile_Kd.hpp:350
StdDataLinker< SmartKd< dim >, number, dim > base_type
Definition smile_Kd_eps.hpp:20
SmartPtr< DependentUserData< number, dim > > m_spDAl
Definition smile_Kd.hpp:349
SmartPtr< CplUserData< number, dim > > m_spDIC
Definition smile_Kd.hpp:344
SmartPtr< CplUserData< number, dim > > m_spCa
Definition smile_Kd.hpp:342
SmartPtr< CplUserData< number, dim > > m_spH
Definition smile_Kd.hpp:338
void evaluate(number &Kd, const MathVector< dim > &globIP, number time, int si) const
Definition smile_Kd_eps.hpp:60
static void compute_I_pH_m3(number s, number H, number Ca, number Al, number DIC, number SO4, number &I, number &pH)
Recompute the concentration from per m^3 to per l.
Definition smile_Kd_eps.hpp:24
void evaluate(number vKd[], const MathVector< dim > vGlobIP[], number time, int si, GridObject *elem, const MathVector< dim > vCornerCoords[], const MathVector< refDim > vLocIP[], const size_t nip, LocalVector *u, const MathMatrix< refDim, dim > *vJT=NULL) const
Definition smile_Kd_eps.hpp:87
SmartKd(Cloud *cloud, SmartPtr< CplUserData< number, dim > > spH, SmartPtr< CplUserData< number, dim > > spS, SmartPtr< CplUserData< number, dim > > spCa, SmartPtr< CplUserData< number, dim > > spDIC, SmartPtr< CplUserData< number, dim > > spSO4, SmartPtr< CplUserData< number, dim > > spAl, number entry)
Definition smile_Kd_eps.hpp:33
SmartPtr< CplUserData< number, dim > > m_spAl
Definition smile_Kd.hpp:348
void eval_and_deriv(number vKd[], const MathVector< dim > vGlobIP[], number time, int si, GridObject *elem, const MathVector< dim > vCornerCoords[], const MathVector< refDim > vLocIP[], const size_t nip, LocalVector *u, bool bDeriv, int s, std::vector< std::vector< number > > vvvDeriv[], const MathMatrix< refDim, dim > *vJT=NULL) const
Definition smile_Kd_eps.hpp:123
SmartPtr< DependentUserData< number, dim > > m_spDS
Definition smile_Kd.hpp:341
SmartPtr< DependentUserData< number, dim > > m_spDDIC
Definition smile_Kd.hpp:345
SmartPtr< DependentUserData< number, dim > > m_spDH
Definition smile_Kd.hpp:339
SmartPtr< DependentUserData< number, dim > > m_spDSO4
Definition smile_Kd.hpp:347
Cloud * m_cloud
Definition smile_Kd.hpp:337
value_type & entry(std::size_t row, std::size_t col)
double number
void Compute_I_pH(number s, number H, number Ca, number Al, number DIC, number SO4, number &I, number &pH)
Definition smile_chem_eq.cpp:24
const double NaCl_sat
Definition smile_chem_eq.hpp:55