LORENE
map_eps_deriv.C
1/*
2 * Computations of Scalar partial derivatives for a Map_eps mapping
3 */
4
5/*
6 *
7 * This file is part of LORENE.
8 *
9 * LORENE is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * LORENE is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with LORENE; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 *
23 */
24
25// Header Lorene
26#include "map.h"
27#include "valeur.h"
28#include "tensor.h"
29
30
31
32
33namespace Lorene{
34 //---------------------//
35 // d/dr //
36 //---------------------//
37
38
39void Map_eps::dsdr(const Scalar& uu, Scalar& resu) const {
40
41 assert (uu.get_etat() != ETATNONDEF) ;
42 assert (uu.get_mp().get_mg() == mg) ;
43
44
45 if (uu.get_etat() == ETATZERO) {
46 resu.set_etat_zero() ;
47 }
48 else {
49 assert( uu.get_etat() == ETATQCQ ) ;
50
51 const Valeur& uuva = uu.get_spectral_va() ;
52
53 uuva.coef() ; // (uu.va).c_cf is up to date
54
55 int nz = mg->get_nzone() ;
56 int nzm1 = nz - 1 ;
57
58 if ( uu.get_dzpuis() == 0 ) {
59 resu = uuva.dsdx() * dxdr ; // dxdr = dxi/dR, - dxi/dU (ZEC)
60
61 if (mg->get_type_r(nzm1) == UNSURR) {
62 resu.set_dzpuis(2) ; // r^2 d/dr has been computed in the
63 // external domain
64 }
65 }
66 else {
67 int dzp = uu.get_dzpuis() ;
68
69 resu = uuva.dsdx() * dxdr ;
70 if (mg->get_type_r(nzm1) == UNSURR) {
71 resu.annule_domain(nzm1) ; // zero in the CED
72
73 // Special treatment in the CED
74 Valeur tmp_ced = - uuva.dsdx() ;
75 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
76 tmp_ced.mult_xm1_zec() ;
77 tmp_ced.set(nzm1) -= dzp * uuva(nzm1) ;
78
79 // Recombination shells + CED :
80 resu.set_spectral_va() += tmp_ced ;
81 }
82 resu.set_dzpuis(dzp+1) ;
83
84 }
85
86 resu.set_spectral_base( uuva.dsdx().get_base() ) ; // same basis as d/dxi
87
88 }
89
90}
91
92 //-----------------------------------//
93 // 1/sin(theta) d/dphi //
94 //-----------------------------------//
95void Map_eps::stdsdp(const Scalar& ci, Scalar& resu) const {
96
97 assert (ci.get_etat() != ETATNONDEF) ;
98 assert (ci.get_mp().get_mg() == mg) ;
99
100 if (ci.get_etat() == ETATZERO) {
101 resu.set_etat_zero() ;
102 }
103 else {
104
105 assert( ci.get_etat() == ETATQCQ ) ;
106
107 // Computation of 1/sin(theta) df/dphi' ---> stdfdp
108 // ----------------------------
109
110 const Valeur& stdfdp = ci.get_spectral_va().stdsdp() ;
111
112
113 // Computation of 1/(dR/dxi) 1/sin(theta) dR/dphi' df/dx ----> adfdx
114 // -------------------------------------------
115
116 Valeur adfdx = ci.get_spectral_va().dsdx() ; // df/dx
117
118 Base_val sauve_base = adfdx.get_base() ;
119
120 adfdx = adfdx * dxdr * stdrdp ; // df/dx / (dR/dx) * 1/sin(th) dR/dphi'
121
122 adfdx.set_base( sauve_base ) ;
123
124 // Final result
125 // ------------
126
127 resu = stdfdp - adfdx ;
128
129 }
130
131 resu.set_dzpuis( ci.get_dzpuis() ) ; // dzpuis unchanged
132
133}
134
135
136 //------------------------------------//
137 // 1/(r sin(theta)) d/dphi //
138 //------------------------------------//
139
140void Map_eps::srstdsdp(const Scalar& uu, Scalar& resu) const {
141
142 assert (uu.get_etat() != ETATNONDEF) ;
143 assert (uu.get_mp().get_mg() == mg) ;
144
145 if (uu.get_etat() == ETATZERO) {
146 resu.set_etat_zero() ;
147 }
148 else {
149
150 assert( uu.get_etat() == ETATQCQ ) ;
151
152 const Valeur& uuva = uu.get_spectral_va() ;
153 uuva.coef() ; // (uu.va).c_cf is up to date
154
155 int nz = mg->get_nzone() ;
156 int nzm1 = nz - 1 ;
157
158 // Computation of 1/(R sin(theta')) df/dphi' ---> srstdfdp
159 // -----------------------------------------
160
161 Valeur srstdfdp = uuva ;
162
163 srstdfdp = srstdfdp.dsdp() ; // d/dphi
164 srstdfdp = srstdfdp.ssint() ; // 1/sin(theta)
165 srstdfdp = srstdfdp.sx() ; // 1/xi, Id, 1/(xi-1)
166
167 Base_val sauve_base( srstdfdp.base ) ;
168
169 srstdfdp = srstdfdp * xsr ; // xi/R, 1/R, (xi-1)/U
170
171 srstdfdp.base = sauve_base ; // The above operation does not change the basis
172
173 // Computation of 1/(dR/dx) 1/(R sin(theta') dR/dphi' df/dx --> bdfdx
174 // --------------------------------------------------------
175 Valeur bdfdx = uuva ;
176
177 bdfdx = bdfdx.dsdx() ; // df/dx
178
179 sauve_base = bdfdx.base ;
180 bdfdx = bdfdx * dxdr * srstdrdp ;
181 bdfdx.base = sauve_base ;
182
183
184 if (uu.get_dzpuis() == 0) {
185
186 //Final result
187
188 resu = srstdfdp - bdfdx ;
189
190
191 if (mg->get_type_r(nz-1) == UNSURR) {
192 resu.set_dzpuis(2) ; // r d/dtheta has been computed in
193 // the external domain
194 }
195 }
196
197 else {
198 assert(mg->get_type_r(nzm1) == UNSURR) ;
199
200 int dzp = uu.get_dzpuis() ;
201
202 Valeur tmp = srstdfdp - bdfdx ;
203 tmp.annule(nzm1) ;
204
205 // Special treatment in the CED
206
207 Valeur tmp_ced = - bdfdx ;
208 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
209
210 tmp_ced = tmp_ced.mult_x() ; // xi, Id, (xi-1)
211 //s Base_val sauve_base( tmp_ced.get_base() ) ;
212 tmp_ced = tmp_ced / xsr ; // xi/R, 1/R, (xi-1)/U
213
214 tmp_ced = tmp_ced + uuva.dsdp().ssint() ;
215 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
216
217 // Recombination shells + CED :
218 resu = tmp + tmp_ced ;
219
220 resu.set_dzpuis(dzp+1) ;
221 }
222 }
223}
224
225
226 //------------------------//
227 // d/dtheta //
228 //------------------------//
229
230
231void Map_eps::dsdt(const Scalar& ci, Scalar& resu) const {
232
233 assert (ci.get_etat() != ETATNONDEF) ;
234 assert (ci.get_mp().get_mg() == mg) ;
235
236 if (ci.get_etat() == ETATZERO) {
237 resu.set_etat_zero() ;
238 }
239 else {
240
241 assert( ci.get_etat() == ETATQCQ ) ;
242
243 // Computation of df/dtheta' ---> dfdt
244 // ----------------------------
245
246 const Valeur& dfdt = ci.get_spectral_va().dsdt() ;
247
248
249 // Computation of 1/(dR/dxi) dR/dtheta' df/dx ----> adfdx
250 // -------------------------------------------
251
252 Valeur adfdx = ci.get_spectral_va().dsdx() ; // df/dx
253
254 Base_val sauve_base = adfdx.get_base() ;
255
256 adfdx = adfdx * dxdr * drdt ; // df/dx / (dR/dx) * dR/dtheta'
257
258 adfdx.set_base( sauve_base ) ;
259
260 // Final result
261 // ------------
262
263 resu = dfdt - adfdx ;
264
265 }
266
267 resu.set_dzpuis( ci.get_dzpuis() ) ; // dzpuis unchanged
268
269}
270
271void Map_eps::srdsdt(const Scalar& uu, Scalar& resu) const {
272 assert (uu.get_etat() != ETATNONDEF) ;
273 assert (uu.get_mp().get_mg() == mg) ;
274
275 if (uu.get_etat() == ETATZERO) {
276 resu.set_etat_zero() ;
277 }
278 else {
279
280 assert( uu.get_etat() == ETATQCQ ) ;
281
282 const Valeur& uuva = uu.get_spectral_va() ;
283 uuva.coef() ; // (uu.va).c_cf is up to date
284
285 int nz = mg->get_nzone() ;
286 int nzm1 = nz - 1 ;
287
288 // Computation of 1/R df/dtheta' ---> srdfdt
289 // ----------------------------
290 Valeur srdfdt = uuva ;
291
292 srdfdt = srdfdt.dsdt() ; // d/dtheta'
293
294 srdfdt = srdfdt.sx() ; // 1/xi, Id, 1/(xi-1)
295
296 Base_val sauve_base( srdfdt.base ) ;
297
298 srdfdt = srdfdt * xsr ; // xi/R, 1/R, (xi-1)/U
299
300 srdfdt.base = sauve_base ; // The above operation does not change the basis
301 // Computation of 1/(dR/dx) 1/R dR/dtheta' df/dx ----> adfdx
302 // ----------------------------------------------
303
304 Valeur adfdx = uuva ;
305
306 adfdx = adfdx.dsdx() ; // df/dx
307
308 sauve_base = adfdx.base ;
309 adfdx = adfdx * dxdr * srdrdt ; // 1/(dR/dx) 1/R dR/dtheta' df/dx
310 adfdx.base = sauve_base ;
311
312 if (uu.get_dzpuis() == 0) {
313
314 // Final result
315 // ------------
316
317 resu = srdfdt - adfdx ;
318
319 //s int nz = mg->get_nzone() ;
320 if (mg->get_type_r(nz-1) == UNSURR) {
321 resu.set_dzpuis(2) ; // r^2 (1/r d/dtheta) has been computed in
322 // the external domain
323 }
324
325 }
326
327 else {
328 assert(mg->get_type_r(nzm1) == UNSURR) ;
329
330 int dzp = uu.get_dzpuis() ;
331
332 Valeur tmp = srdfdt - adfdx ;
333 tmp.annule(nzm1) ;
334
335 // Special treatment in the CED
336 //-----------------------------
337
338 Valeur tmp_ced = - adfdx ;
339
340 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
341
342 tmp_ced = tmp_ced.mult_x() ; // xi, Id, (xi-1)
343 //s Base_val sauve_base( tmp_ced.get_base() ) ;
344 tmp_ced = tmp_ced / xsr ; // xi/R, 1/R, (xi-1)/U
345
346 tmp_ced = tmp_ced + uuva.dsdt() ;
347 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
348
349 // Recombination shells + CED :
350 resu = tmp + tmp_ced ;
351
352 resu.set_dzpuis(dzp+1) ;
353 }
354
355 }
356
357}
358
359}
Bases of the spectral expansions.
Definition base_val.h:325
virtual void dsdt(const Scalar &, Scalar &) const
Computes of a Scalar .
virtual void srstdsdp(const Scalar &, Scalar &) const
Computes of a Scalar.
virtual void stdsdp(const Scalar &, Scalar &) const
Computes of a Scalar .
virtual void srdsdt(const Scalar &, Scalar &) const
Computes of a Scalar.
virtual void dsdr(const Scalar &ci, Scalar &resu) const
Computes of a Scalar.
Coord srstdrdp
in the nucleus and in the non-compactified shells; \ in the compactified outer domain.
Definition map.h:1607
Coord drdt
in the nucleus and in the non-compactified shells; \ in the compactified external domain (CED).
Definition map.h:1583
Coord srdrdt
in the nucleus and in the non-compactified shells; \ in the compactified outer domain.
Definition map.h:1599
Coord xsr
in the nucleus; \ 1/R in the non-compactified shells; \ in the compactified outer domain.
Definition map.h:1564
Coord dxdr
in the nucleus and in the non-compactified shells; \ in the compactified outer domain.
Definition map.h:1575
Coord stdrdp
in the nucleus and in the non-compactified shells; \ in the compactified external domain (CED).
Definition map.h:1591
Tensor field of valence 0 (or component of a tensorial field).
Definition scalar.h:393
int get_dzpuis() const
Returns dzpuis.
Definition scalar.h:563
virtual void set_etat_zero()
Sets the logical state to ETATZERO (zero).
Definition scalar.C:330
Valeur & set_spectral_va()
Returns va (read/write version).
Definition scalar.h:610
const Valeur & get_spectral_va() const
Returns va (read only version).
Definition scalar.h:607
int get_etat() const
Returns the logical state ETATNONDEF (undefined), ETATZERO (null) or ETATQCQ (ordinary).
Definition scalar.h:560
void set_dzpuis(int)
Modifies the dzpuis flag.
Definition scalar.C:814
void set_spectral_base(const Base_val &)
Sets the spectral bases of the Valeur va.
Definition scalar.C:803
Values and coefficients of a (real-value) function.
Definition valeur.h:297
const Valeur & dsdp() const
Returns of *this.
const Valeur & sx() const
Returns (r -sampling = RARE ) \ Id (r sampling = FIN ) \ (r -sampling = UNSURR ).
Definition valeur_sx.C:113
void mult_xm1_zec()
Applies the following operator to *this : \ Id (r sampling = RARE, FIN ) \ (r -sampling = UNSURR ).
const Base_val & get_base() const
Return the bases for spectral expansions (member base ).
Definition valeur.h:490
const Valeur & stdsdp() const
Returns of *this.
void set_base(const Base_val &)
Sets the bases for spectral expansions (member base ).
Definition valeur.C:813
const Valeur & dsdt() const
Returns of *this.
void annule(int l)
Sets the Valeur to zero in a given domain.
Definition valeur.C:747
Tbl & set(int l)
Read/write of the value in a given domain (configuration space).
Definition valeur.h:373
const Valeur & dsdx() const
Returns of *this.
const Valeur & mult_x() const
Returns (r -sampling = RARE ) \ Id (r sampling = FIN ) \ (r -sampling = UNSURR ).
const Valeur & ssint() const
Returns of *this.
void coef() const
Computes the coeffcients of *this.
Base_val base
Bases on which the spectral expansion is performed.
Definition valeur.h:315
const Map & get_mp() const
Returns the mapping.
Definition tensor.h:874
void annule_domain(int l)
Sets the Tensor to zero in a given domain.
Definition tensor.C:675
Lorene prototypes.
Definition app_hor.h:67