LORENE
map_af_deriv.C
1/*
2 * Computations of Cmp partial derivatives for a Map_af mapping
3 */
4
5/*
6 * Copyright (c) 1999-2004 Eric Gourgoulhon
7 * Copyright (c) 1999-2001 Philippe Grandclement
8 *
9 * This file is part of LORENE.
10 *
11 * LORENE is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * LORENE is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with LORENE; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 *
25 */
26
27
28
29
30/*
31 * $Id: map_af_deriv.C,v 1.14 2016/12/05 16:17:56 j_novak Exp $
32 * $Log: map_af_deriv.C,v $
33 * Revision 1.14 2016/12/05 16:17:56 j_novak
34 * Suppression of some global variables (file names, loch, ...) to prevent redefinitions
35 *
36 * Revision 1.13 2014/10/13 08:53:02 j_novak
37 * Lorene classes and functions now belong to the namespace Lorene.
38 *
39 * Revision 1.12 2012/01/17 10:32:09 j_penner
40 * added a derivative with respect to the computational coordinate xi
41 *
42 * Revision 1.11 2008/09/21 13:57:21 j_novak
43 * Changed the test on the CED in the derivative.
44 *
45 * Revision 1.10 2004/12/17 13:35:02 m_forot
46 * Add the case T_LEG
47 *
48 * Revision 1.9 2004/06/22 08:49:58 p_grandclement
49 * Addition of everything needed for using the logarithmic mapping
50 *
51 * Revision 1.8 2004/01/27 09:33:48 j_novak
52 * New method Map_radial::div_r_zec
53 *
54 * Revision 1.7 2004/01/26 16:16:17 j_novak
55 * Methods of gradient for Scalar s. The input can have any dzpuis.
56 *
57 * Revision 1.6 2004/01/22 16:13:00 e_gourgoulhon
58 * Case dzpuis=2 treated in dsdr, srdsdt and srstdsdp (output: dzpuis =
59 * 3).
60 * Reorganization cases dzpuis = 0 and 4.
61 *
62 * Revision 1.5 2003/11/11 15:31:43 j_novak
63 * Added a #ifnedef... to prevent warnings.
64 *
65 * Revision 1.4 2003/10/22 13:08:05 j_novak
66 * Better handling of dzpuis flags
67 *
68 * Revision 1.3 2003/10/20 19:45:27 e_gourgoulhon
69 * Treatment of dzpuis in dsdt and stdsdp.
70 *
71 * Revision 1.2 2003/10/15 10:34:07 e_gourgoulhon
72 * Added new methods dsdt and stdsdp.
73 *
74 * Revision 1.1.1.1 2001/11/20 15:19:27 e_gourgoulhon
75 * LORENE
76 *
77 * Revision 2.12 2000/02/25 08:59:51 eric
78 * Remplacement de ci.get_dzpuis() == 0 par ci.check_dzpuis(0).
79 * Suppression de l'affectation des dzpuis Mtbl/Mtnl_cf a la fin car
80 * c'est fait par Cmp::set_dzpuis.
81 *
82 * Revision 2.11 2000/01/26 13:09:18 eric
83 * Reprototypage complet des routines de derivation:
84 * le resultat est desormais suppose alloue a l'exterieur de la routine
85 * et est passe en argument (Cmp& resu), si bien que le prototypage
86 * complet devient:
87 * void DERIV(const Cmp& ci, Cmp& resu) const
88 *
89 * Revision 2.10 1999/11/30 12:51:32 eric
90 * Valeur::base est desormais du type Base_val et non plus Base_val*.
91 *
92 * Revision 2.9 1999/11/26 14:23:55 eric
93 * Traitement dzpuis des Cmp.
94 *
95 * Revision 2.8 1999/11/26 10:58:02 eric
96 * Traitement dzpuis.
97 *
98 * Revision 2.7 1999/11/25 16:29:29 eric
99 * Reorganisation complete du calcul des derivees partielles.
100 *
101 * Revision 2.6 1999/10/27 15:45:23 eric
102 * Suppression du membre Cmp::c.
103 *
104 * Revision 2.5 1999/10/27 08:47:03 eric
105 * Introduction de Cmp::va a la place de *(Cmp::c).
106 *
107 * Revision 2.4 1999/10/22 08:16:21 eric
108 * const Map*.
109 *
110 * Revision 2.3 1999/10/14 14:27:17 eric
111 * Methodes const.
112 *
113 * Revision 2.2 1999/10/13 15:54:40 eric
114 * Mg3d* -> const Mg3d*
115 *
116 * Revision 2.1 1999/09/17 10:01:09 phil
117 * correction pour deriv_x et deriv_y
118 *
119 * Revision 2.0 1999/09/14 16:37:06 phil
120 * *** empty log message ***
121 *
122 *
123 * $Header: /cvsroot/Lorene/C++/Source/Map/map_af_deriv.C,v 1.14 2016/12/05 16:17:56 j_novak Exp $
124 *
125 */
126
127// Header Lorene
128#include "map.h"
129#include "cmp.h"
130#include "tensor.h"
131
132
133 //-----------------------//
134 // d/d\xi //
135 //-----------------------//
136
137
138namespace Lorene {
139void Map_af::dsdxi(const Cmp& ci, Cmp& resu) const {
140
141 assert (ci.get_etat() != ETATNONDEF) ;
142 assert (ci.get_mp()->get_mg() == mg) ;
143
144
145 if (ci.get_etat() == ETATZERO) {
146 resu.set_etat_zero() ;
147 }
148 else {
149 assert( ci.get_etat() == ETATQCQ ) ;
150
151
152 (ci.va).coef() ; // (ci.va).c_cf is up to date
153
154 int nz = mg->get_nzone() ;
155 int nzm1 = nz - 1 ;
156
157 switch( ci.get_dzpuis() ) {
158
159 case 0 : {
160 resu = (ci.va).dsdx() ; // dsdx == d/d\xi
161
162 if (mg->get_type_r(nzm1) == UNSURR) {
163 resu.set_dzpuis(2) ; // r^2 d/dr has been computed in the // SOMETHING IS WRONG HERE
164 // external domain
165 }
166 break ;
167 }
168
169 case 2 : {
170 assert(mg->get_type_r(nzm1) == UNSURR) ;
171
172 Valeur tmp((ci.va).dsdx() ) ;
173 tmp.annule(nzm1) ; // zero in the CED
174
175 // Special treatment in the CED
176 Valeur tmp_ced = - (ci.va).dsdx() ;
177 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
178 tmp_ced.mult_xm1_zec() ;
179 tmp_ced.set(nzm1) -= 2. * ci.va(nzm1) ;
180
181 // Recombination shells + CED :
182 resu = tmp + tmp_ced ;
183
184 resu.set_dzpuis(3) ;
185 break ;
186 }
187
188 case 4 : {
189 assert(mg->get_type_r(nzm1) == UNSURR) ;
190
191 Valeur tmp(ci.va.dsdx()) ;
192 Valeur tmp2 = tmp ;
193 tmp2.base = (ci.va).dsdx().base ;
194 tmp.annule(nzm1) ; // not in the CED
195 tmp2.annule(0, nz-2) ; // special treatment of the CED
196 tmp2.mult_xm1_zec() ;
197 tmp2 = tmp2 / xsr ;
198 tmp2.set(nzm1) -= 4*ci.va(nzm1) ;
199 tmp2.base = ci.va.base ; //Just for the CED
200 tmp2.mult_xm1_zec() ;
201
202 resu = tmp + tmp2 / xsr ; // do not know what this is, but for now I can get away with it, no CED
203 resu.set_dzpuis(4) ;
204 break ;
205 }
206
207 default : {
208 cerr << "Map_af::dsdxi: unexpected value of input dzpuis !\n"
209 << " ci.get_dzpuis() = " << ci.get_dzpuis() << endl ;
210 abort() ;
211 break ;
212 }
213
214 }
215
216
217 (resu.va).set_base( (ci.va).dsdx().get_base() ) ; // same basis as d/dxi
218
219 }
220
221}
222
223void Map_af::dsdxi(const Scalar& uu, Scalar& resu) const {
224
225 assert (uu.get_etat() != ETATNONDEF) ;
226 assert (uu.get_mp().get_mg() == mg) ;
227
228 Mtbl unity = r/r;
229
230 if (uu.get_etat() == ETATZERO) {
231 resu.set_etat_zero() ;
232 }
233 else {
234 assert( uu.get_etat() == ETATQCQ ) ;
235
236 const Valeur& uuva = uu.get_spectral_va() ;
237
238 uuva.coef() ; // (uu.va).c_cf is up to date
239
240 int nz = mg->get_nzone() ;
241 int nzm1 = nz - 1 ;
242
243 if ( uu.get_dzpuis() == 0 ) {
244 resu = uuva.dsdx() * unity ; // dxds == d/d\xi, unity is used to set the correct formated output
245
246 if (mg->get_type_r(nzm1) == UNSURR) {
247 resu.set_dzpuis(2) ; // r^2 d/dr has been computed in the
248 // external domain
249 }
250 }
251 else {
252 int dzp = uu.get_dzpuis() ;
253
254 resu = uuva.dsdx() ;
255 if (mg->get_type_r(nzm1) == UNSURR) {
256 resu.annule_domain(nzm1) ; // zero in the CED
257
258 // Special treatment in the CED
259 Valeur tmp_ced = - uuva.dsdx() ;
260 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
261 tmp_ced.mult_xm1_zec() ;
262 tmp_ced.set(nzm1) -= dzp * uuva(nzm1) ;
263
264 // Recombination shells + CED :
265 resu.set_spectral_va() += tmp_ced ;
266 }
267 resu.set_dzpuis(dzp+1) ;
268
269 }
270
271 resu.set_spectral_base( uuva.dsdx().get_base() ) ; // same basis as d/dxi
272
273 }
274
275}
276
277 //---------------------//
278 // d/dr //
279 //---------------------//
280
281
282void Map_af::dsdr(const Cmp& ci, Cmp& resu) const {
283
284 assert (ci.get_etat() != ETATNONDEF) ;
285 assert (ci.get_mp()->get_mg() == mg) ;
286
287
288 if (ci.get_etat() == ETATZERO) {
289 resu.set_etat_zero() ;
290 }
291 else {
292 assert( ci.get_etat() == ETATQCQ ) ;
293
294
295 (ci.va).coef() ; // (ci.va).c_cf is up to date
296
297 int nz = mg->get_nzone() ;
298 int nzm1 = nz - 1 ;
299
300 switch( ci.get_dzpuis() ) {
301
302 case 0 : {
303 resu = (ci.va).dsdx() * dxdr ; // dxdr = dxi/dR, - dxi/dU (ZEC)
304
305 if (mg->get_type_r(nzm1) == UNSURR) {
306 resu.set_dzpuis(2) ; // r^2 d/dr has been computed in the
307 // external domain
308 }
309 break ;
310 }
311
312 case 2 : {
313 assert(mg->get_type_r(nzm1) == UNSURR) ;
314
315 Valeur tmp((ci.va).dsdx() * dxdr) ;
316 tmp.annule(nzm1) ; // zero in the CED
317
318 // Special treatment in the CED
319 Valeur tmp_ced = - (ci.va).dsdx() ;
320 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
321 tmp_ced.mult_xm1_zec() ;
322 tmp_ced.set(nzm1) -= 2. * ci.va(nzm1) ;
323
324 // Recombination shells + CED :
325 resu = tmp + tmp_ced ;
326
327 resu.set_dzpuis(3) ;
328 break ;
329 }
330
331 case 4 : {
332 assert(mg->get_type_r(nzm1) == UNSURR) ;
333
334 Valeur tmp(ci.va.dsdx() * dxdr) ;
335 Valeur tmp2 = tmp ;
336 tmp2.base = (ci.va).dsdx().base ;
337 tmp.annule(nzm1) ; // not in the CED
338 tmp2.annule(0, nz-2) ; // special treatment of the CED
339 tmp2.mult_xm1_zec() ;
340 tmp2 = tmp2 / xsr ;
341 tmp2.set(nzm1) -= 4*ci.va(nzm1) ;
342 tmp2.base = ci.va.base ; //Just for the CED
343 tmp2.mult_xm1_zec() ;
344
345 resu = tmp + tmp2 / xsr ;
346 resu.set_dzpuis(4) ;
347 break ;
348 }
349
350 default : {
351 cerr << "Map_af::dsdr: unexpected value of input dzpuis !\n"
352 << " ci.get_dzpuis() = " << ci.get_dzpuis() << endl ;
353 abort() ;
354 break ;
355 }
356
357 }
358
359
360 (resu.va).set_base( (ci.va).dsdx().get_base() ) ; // same basis as d/dxi
361
362 }
363
364}
365
366void Map_af::dsdr(const Scalar& uu, Scalar& resu) const {
367
368 assert (uu.get_etat() != ETATNONDEF) ;
369 assert (uu.get_mp().get_mg() == mg) ;
370
371
372 if (uu.get_etat() == ETATZERO) {
373 resu.set_etat_zero() ;
374 }
375 else {
376 assert( uu.get_etat() == ETATQCQ ) ;
377
378 const Valeur& uuva = uu.get_spectral_va() ;
379
380 uuva.coef() ; // (uu.va).c_cf is up to date
381
382 int nz = mg->get_nzone() ;
383 int nzm1 = nz - 1 ;
384
385 if ( uu.get_dzpuis() == 0 ) {
386 resu = uuva.dsdx() * dxdr ; // dxdr = dxi/dR, - dxi/dU (ZEC)
387
388 if (mg->get_type_r(nzm1) == UNSURR) {
389 resu.set_dzpuis(2) ; // r^2 d/dr has been computed in the
390 // external domain
391 }
392 }
393 else {
394 int dzp = uu.get_dzpuis() ;
395
396 resu = uuva.dsdx() * dxdr ;
397 if (mg->get_type_r(nzm1) == UNSURR) {
398 resu.annule_domain(nzm1) ; // zero in the CED
399
400 // Special treatment in the CED
401 Valeur tmp_ced = - uuva.dsdx() ;
402 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
403 tmp_ced.mult_xm1_zec() ;
404 tmp_ced.set(nzm1) -= dzp * uuva(nzm1) ;
405
406 // Recombination shells + CED :
407 resu.set_spectral_va() += tmp_ced ;
408 }
409 resu.set_dzpuis(dzp+1) ;
410
411 }
412
413 resu.set_spectral_base( uuva.dsdx().get_base() ) ; // same basis as d/dxi
414
415 }
416
417}
418// VARIABLE RADIALE
419
420void Map_af::dsdradial(const Scalar& uu, Scalar& resu) const {
421
422 assert (uu.get_etat() != ETATNONDEF) ;
423 assert (uu.get_mp().get_mg() == mg) ;
424
425
426 if (uu.get_etat() == ETATZERO) {
427 resu.set_etat_zero() ;
428 }
429 else {
430 assert( uu.get_etat() == ETATQCQ ) ;
431
432 const Valeur& uuva = uu.get_spectral_va() ;
433
434 uuva.coef() ; // (uu.va).c_cf is up to date
435
436 int nz = mg->get_nzone() ;
437 int nzm1 = nz - 1 ;
438
439 if ( uu.get_dzpuis() == 0 ) {
440 resu = uuva.dsdx() * dxdr ; // dxdr = dxi/dR, - dxi/dU (ZEC)
441
442 if (mg->get_type_r(nzm1) == UNSURR) {
443 resu.set_dzpuis(2) ; // r^2 d/dr has been computed in the
444 // external domain
445 }
446 }
447 else {
448 assert(mg->get_type_r(nzm1) == UNSURR) ;
449
450 int dzp = uu.get_dzpuis() ;
451
452 resu = uuva.dsdx() * dxdr ;
453 resu.annule_domain(nzm1) ; // zero in the CED
454
455 // Special treatment in the CED
456 Valeur tmp_ced = - uuva.dsdx() ;
457 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
458 tmp_ced.mult_xm1_zec() ;
459 tmp_ced.set(nzm1) -= dzp * uuva(nzm1) ;
460
461 // Recombination shells + CED :
462 resu.set_spectral_va() += tmp_ced ;
463
464 resu.set_dzpuis(dzp+1) ;
465
466 }
467
468 resu.set_spectral_base( uuva.dsdx().get_base() ) ; // same basis as d/dxi
469
470 }
471
472}
473
474 //------------------------//
475 // 1/r d/dtheta //
476 //------------------------//
477
478void Map_af::srdsdt(const Cmp& ci, Cmp& resu) const {
479
480 assert (ci.get_etat() != ETATNONDEF) ;
481 assert (ci.get_mp()->get_mg() == mg) ;
482
483 if (ci.get_etat() == ETATZERO) {
484 resu.set_etat_zero() ;
485 }
486 else {
487
488 assert( ci.get_etat() == ETATQCQ ) ;
489
490 (ci.va).coef() ; // (ci.va).c_cf is up to date
491
492 Valeur tmp = ci.va ;
493
494 tmp = tmp.dsdt() ; // d/dtheta
495
496 int nz = mg->get_nzone() ;
497 int nzm1 = nz - 1 ;
498
499 switch( ci.get_dzpuis() ) {
500
501 case 0 : {
502 tmp = tmp.sx() ; // 1/xi, Id, 1/(xi-1)
503
504 Base_val sauve_base( tmp.get_base() ) ;
505
506 tmp = tmp * xsr ; // xi/R, 1/R, (xi-1)/U
507
508 tmp.set_base(sauve_base) ; // The above operation does not the basis
509 resu = tmp ;
510
511 if (mg->get_type_r(nz-1) == UNSURR) {
512 resu.set_dzpuis(2) ; // r d/dtheta has been computed in
513 // the external domain
514 }
515 break ;
516 }
517
518 case 2 : {
519 assert(mg->get_type_r(nzm1) == UNSURR) ;
520
521 // Special treatment in the CED
522 Valeur tmp_ced = tmp ; // d/dtheta
523 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
524
525 tmp.annule(nzm1) ;
526 tmp = tmp.sx() ; // 1/xi, Id
527 Base_val sauve_base( tmp.get_base() ) ;
528 tmp = tmp * xsr ; // xi/R, 1/R
529 tmp.set_base(sauve_base) ; // The above operation does not the basis
530
531 // Recombination shells + CED :
532 resu = tmp + tmp_ced ;
533
534 resu.set_dzpuis(3) ;
535 break ;
536 }
537
538 case 4 : {
539 assert(mg->get_type_r(nzm1) == UNSURR) ;
540
541 // Special treatment in the CED
542 Valeur tmp_ced = tmp ; // d/dtheta
543 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
544 tmp_ced.mult_xm1_zec() ;
545
546 tmp.annule(nzm1) ;
547 tmp = tmp.sx() ; // 1/xi, Id
548 Base_val sauve_base( tmp.get_base() ) ;
549 tmp = tmp * xsr ; // xi/R, 1/R
550
551 // Recombination shells + CED :
552 resu = tmp + tmp_ced / xsr ;
553
554 resu.va.set_base( sauve_base ) ;
555 resu.set_dzpuis(4) ;
556 break ;
557 }
558
559 default : {
560 cerr << "Map_af::srdsdt: unexpected value of input dzpuis !\n"
561 << " ci.get_dzpuis() = " << ci.get_dzpuis() << endl ;
562 abort() ;
563 break ;
564 }
565
566 }
567
568 }
569
570}
571
572void Map_af::srdsdt(const Scalar& uu, Scalar& resu) const {
573 assert (uu.get_etat() != ETATNONDEF) ;
574 assert (uu.get_mp().get_mg() == mg) ;
575
576 if (uu.get_etat() == ETATZERO) {
577 resu.set_etat_zero() ;
578 }
579 else {
580
581 assert( uu.get_etat() == ETATQCQ ) ;
582
583 const Valeur& uuva = uu.get_spectral_va() ;
584 uuva.coef() ; // (uu.va).c_cf is up to date
585
586 Valeur tmp = uuva.dsdt() ; // d/dtheta
587
588 int nz = mg->get_nzone() ;
589 int nzm1 = nz - 1 ;
590
591 if (uu.get_dzpuis() == 0) {
592 tmp = tmp.sx() ; // 1/xi, Id, 1/(xi-1)
593
594 Base_val sauve_base( tmp.get_base() ) ;
595
596 tmp = tmp * xsr ; // xi/R, 1/R, (xi-1)/U
597
598 tmp.set_base(sauve_base) ; // The above operation does not change the basis
599 resu = tmp ;
600
601 if (mg->get_type_r(nz-1) == UNSURR) {
602 resu.set_dzpuis(2) ; // r d/dtheta has been computed in
603 // the external domain
604 }
605 }
606
607 else {
608 assert(mg->get_type_r(nzm1) == UNSURR) ;
609
610 int dzp = uu.get_dzpuis() ;
611 // Special treatment in the CED
612 Valeur tmp_ced = tmp ; // d/dtheta
613 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
614
615 tmp.annule(nzm1) ;
616 tmp = tmp.sx() ; // 1/xi, Id
617 Base_val sauve_base( tmp.get_base() ) ;
618 tmp = tmp * xsr ; // xi/R, 1/R
619 tmp.set_base(sauve_base) ; // The above operation does not change the basis
620
621 // Recombination shells + CED :
622 resu = tmp + tmp_ced ;
623
624 resu.set_dzpuis(dzp+1) ;
625 }
626
627 }
628
629}
630
631
632 //------------------------------------//
633 // 1/(r sin(theta)) d/dphi //
634 //------------------------------------//
635
636void Map_af::srstdsdp(const Cmp& ci, Cmp& resu) const {
637
638 assert (ci.get_etat() != ETATNONDEF) ;
639 assert (ci.get_mp()->get_mg() == mg) ;
640
641 if (ci.get_etat() == ETATZERO) {
642 resu.set_etat_zero() ;
643 }
644 else {
645
646 assert( ci.get_etat() == ETATQCQ ) ;
647
648 (ci.va).coef() ; // (ci.va).c_cf is up to date
649
650 Valeur tmp = ci.va ;
651
652 tmp = tmp.dsdp() ; // d/dphi
653 tmp = tmp.ssint() ; // 1/sin(theta)
654
655 int nz = mg->get_nzone() ;
656 int nzm1 = nz - 1 ;
657
658 switch( ci.get_dzpuis() ) {
659
660 case 0 : {
661 tmp = tmp.sx() ; // 1/xi, Id, 1/(xi-1)
662
663 Base_val sauve_base( tmp.get_base() ) ;
664
665 tmp = tmp * xsr ; // xi/R, 1/R, (xi-1)/U
666
667 tmp.set_base(sauve_base) ; // The above operation does not the basis
668 resu = tmp ;
669
670 if (mg->get_type_r(nz-1) == UNSURR) {
671 resu.set_dzpuis(2) ; // r d/dtheta has been computed in
672 // the external domain
673 }
674 break ;
675 }
676
677 case 2 : {
678 assert(mg->get_type_r(nzm1) == UNSURR) ;
679
680 // Special treatment in the CED
681 Valeur tmp_ced = tmp ; // 1/sin(theta) d/dphi
682 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
683
684 tmp.annule(nzm1) ;
685 tmp = tmp.sx() ; // 1/xi, Id
686 Base_val sauve_base( tmp.get_base() ) ;
687 tmp = tmp * xsr ; // xi/R, 1/R
688 tmp.set_base(sauve_base) ; // The above operation does not the basis
689
690 // Recombination shells + CED :
691 resu = tmp + tmp_ced ;
692
693 resu.set_dzpuis(3) ;
694 break ;
695 }
696
697 case 4 : {
698 assert(mg->get_type_r(nzm1) == UNSURR) ;
699
700 // Special treatment in the CED
701 Valeur tmp_ced = tmp ; // 1/sin(theta) d/dphi
702 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
703 tmp_ced.mult_xm1_zec() ;
704
705 tmp.annule(nzm1) ;
706 tmp = tmp.sx() ; // 1/xi, Id
707 Base_val sauve_base( tmp.get_base() ) ;
708 tmp = tmp * xsr ; // xi/R, 1/R
709
710 // Recombination shells + CED :
711 resu = tmp + tmp_ced / xsr ;
712
713 resu.va.set_base( sauve_base ) ;
714 resu.set_dzpuis(4) ;
715 break ;
716 }
717
718 default : {
719 cerr << "Map_af::srstdsdp: unexpected value of input dzpuis !\n"
720 << " ci.get_dzpuis() = " << ci.get_dzpuis() << endl ;
721 abort() ;
722 break ;
723 }
724
725 }
726
727 }
728
729
730}
731
732void Map_af::srstdsdp(const Scalar& uu, Scalar& resu) const {
733
734 assert (uu.get_etat() != ETATNONDEF) ;
735 assert (uu.get_mp().get_mg() == mg) ;
736
737 if (uu.get_etat() == ETATZERO) {
738 resu.set_etat_zero() ;
739 }
740 else {
741
742 assert( uu.get_etat() == ETATQCQ ) ;
743
744 const Valeur& uuva = uu.get_spectral_va() ;
745 uuva.coef() ; // (uu.va).c_cf is up to date
746
747 Valeur tmp = uuva.dsdp() ;
748
749 tmp = tmp.ssint() ; // 1/sin(theta)
750
751 int nz = mg->get_nzone() ;
752 int nzm1 = nz - 1 ;
753
754 if (uu.get_dzpuis() == 0) {
755
756 tmp = tmp.sx() ; // 1/xi, Id, 1/(xi-1)
757
758 Base_val sauve_base( tmp.get_base() ) ;
759
760 tmp = tmp * xsr ; // xi/R, 1/R, (xi-1)/U
761
762 tmp.set_base(sauve_base) ; // The above operation does not change the basis
763 resu = tmp ;
764
765 if (mg->get_type_r(nz-1) == UNSURR) {
766 resu.set_dzpuis(2) ; // r d/dtheta has been computed in
767 // the external domain
768 }
769 }
770
771 else {
772 assert(mg->get_type_r(nzm1) == UNSURR) ;
773
774 int dzp = uu.get_dzpuis() ;
775
776 // Special treatment in the CED
777 Valeur tmp_ced = tmp ; // 1/sin(theta) d/dphi
778 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
779
780 tmp.annule(nzm1) ;
781 tmp = tmp.sx() ; // 1/xi, Id
782 Base_val sauve_base( tmp.get_base() ) ;
783 tmp = tmp * xsr ; // xi/R, 1/R
784 tmp.set_base(sauve_base) ; // The above operation does not change the basis
785
786 // Recombination shells + CED :
787 resu = tmp + tmp_ced ;
788
789 resu.set_dzpuis(dzp+1) ;
790 }
791 }
792}
793
794
795 //------------------------//
796 // d/dtheta //
797 //------------------------//
798
799
800void Map_af::dsdt(const Scalar& ci, Scalar& resu) const {
801
802 assert (ci.get_etat() != ETATNONDEF) ;
803 assert (ci.get_mp().get_mg() == mg) ;
804
805 if (ci.get_etat() == ETATZERO) {
806 resu.set_etat_zero() ;
807 }
808 else {
809
810 assert( ci.get_etat() == ETATQCQ ) ;
811
812 resu = ci.get_spectral_va().dsdt() ; // d/dtheta
813
814 }
815
816 resu.set_dzpuis( ci.get_dzpuis() ) ; // dzpuis unchanged
817
818}
819
820
821 //-----------------------------------//
822 // 1/sin(theta) d/dphi //
823 //-----------------------------------//
824
825
826void Map_af::stdsdp(const Scalar& ci, Scalar& resu) const {
827
828 assert (ci.get_etat() != ETATNONDEF) ;
829 assert (ci.get_mp().get_mg() == mg) ;
830
831 if (ci.get_etat() == ETATZERO) {
832 resu.set_etat_zero() ;
833 }
834 else {
835
836 assert( ci.get_etat() == ETATQCQ ) ;
837
838 resu = ci.get_spectral_va().stdsdp() ; // 1/sin(theta) d/dphi
839
840 }
841
842 resu.set_dzpuis( ci.get_dzpuis() ) ; // dzpuis unchanged
843
844}
845
846
847
848
849
850
851
852
853}
Bases of the spectral expansions.
Definition base_val.h:325
Component of a tensorial field *** DEPRECATED : use class Scalar instead ***.
Definition cmp.h:446
int get_etat() const
Returns the logical state.
Definition cmp.h:899
Valeur va
The numerical value of the Cmp.
Definition cmp.h:464
int get_dzpuis() const
Returns dzpuis.
Definition cmp.h:903
void set_etat_zero()
Sets the logical state to ETATZERO (zero).
Definition cmp.C:292
void set_dzpuis(int)
Set a value to dzpuis.
Definition cmp.C:657
const Map * get_mp() const
Returns the mapping.
Definition cmp.h:901
virtual void srstdsdp(const Cmp &ci, Cmp &resu) const
Computes of a Cmp.
virtual void dsdradial(const Scalar &, Scalar &) const
Computes of a Scalar.
virtual void dsdr(const Cmp &ci, Cmp &resu) const
Computes of a Cmp.
virtual void dsdt(const Scalar &uu, Scalar &resu) const
Computes of a Scalar.
virtual void stdsdp(const Scalar &uu, Scalar &resu) const
Computes of a Scalar.
virtual void srdsdt(const Cmp &ci, Cmp &resu) const
Computes of a Cmp.
virtual void dsdxi(const Cmp &ci, Cmp &resu) const
Computes of a Cmp.
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
Multi-domain array.
Definition mtbl.h:118
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 & 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
Coord r
r coordinate centered on the grid
Definition map.h:730