map_af_deriv.C

00001 /*
00002  * Computations of Cmp partial derivatives for a Map_af mapping
00003  */
00004 
00005 /*
00006  *   Copyright (c) 1999-2004 Eric Gourgoulhon
00007  *   Copyright (c) 1999-2001 Philippe Grandclement
00008  *
00009  *   This file is part of LORENE.
00010  *
00011  *   LORENE is free software; you can redistribute it and/or modify
00012  *   it under the terms of the GNU General Public License as published by
00013  *   the Free Software Foundation; either version 2 of the License, or
00014  *   (at your option) any later version.
00015  *
00016  *   LORENE is distributed in the hope that it will be useful,
00017  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  *   GNU General Public License for more details.
00020  *
00021  *   You should have received a copy of the GNU General Public License
00022  *   along with LORENE; if not, write to the Free Software
00023  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00024  *
00025  */
00026 
00027 
00028 char map_af_deriv_C[] = "$Header: /cvsroot/Lorene/C++/Source/Map/map_af_deriv.C,v 1.12 2012/01/17 10:32:09 j_penner Exp $" ;
00029 
00030 /*
00031  * $Id: map_af_deriv.C,v 1.12 2012/01/17 10:32:09 j_penner Exp $
00032  * $Log: map_af_deriv.C,v $
00033  * Revision 1.12  2012/01/17 10:32:09  j_penner
00034  * added a derivative with respect to the computational coordinate xi
00035  *
00036  * Revision 1.11  2008/09/21 13:57:21  j_novak
00037  * Changed the test on the CED in the derivative.
00038  *
00039  * Revision 1.10  2004/12/17 13:35:02  m_forot
00040  * Add the case T_LEG
00041  *
00042  * Revision 1.9  2004/06/22 08:49:58  p_grandclement
00043  * Addition of everything needed for using the logarithmic mapping
00044  *
00045  * Revision 1.8  2004/01/27 09:33:48  j_novak
00046  * New method Map_radial::div_r_zec
00047  *
00048  * Revision 1.7  2004/01/26 16:16:17  j_novak
00049  * Methods of gradient for Scalar s. The input can have any dzpuis.
00050  *
00051  * Revision 1.6  2004/01/22 16:13:00  e_gourgoulhon
00052  * Case dzpuis=2 treated in dsdr, srdsdt and srstdsdp (output: dzpuis =
00053  * 3).
00054  * Reorganization cases dzpuis = 0 and 4.
00055  *
00056  * Revision 1.5  2003/11/11 15:31:43  j_novak
00057  * Added a #ifnedef... to prevent warnings.
00058  *
00059  * Revision 1.4  2003/10/22 13:08:05  j_novak
00060  * Better handling of dzpuis flags
00061  *
00062  * Revision 1.3  2003/10/20 19:45:27  e_gourgoulhon
00063  * Treatment of dzpuis in dsdt and stdsdp.
00064  *
00065  * Revision 1.2  2003/10/15 10:34:07  e_gourgoulhon
00066  * Added new methods dsdt and stdsdp.
00067  *
00068  * Revision 1.1.1.1  2001/11/20 15:19:27  e_gourgoulhon
00069  * LORENE
00070  *
00071  * Revision 2.12  2000/02/25  08:59:51  eric
00072  * Remplacement de ci.get_dzpuis() == 0  par ci.check_dzpuis(0).
00073  * Suppression de l'affectation des dzpuis Mtbl/Mtnl_cf a la fin car
00074  *   c'est fait par Cmp::set_dzpuis.
00075  *
00076  * Revision 2.11  2000/01/26  13:09:18  eric
00077  * Reprototypage complet des routines de derivation:
00078  * le resultat est desormais suppose alloue a l'exterieur de la routine
00079  * et est passe en argument (Cmp& resu), si bien que le prototypage
00080  * complet devient:
00081  *             void DERIV(const Cmp& ci, Cmp& resu) const
00082  *
00083  * Revision 2.10  1999/11/30  12:51:32  eric
00084  * Valeur::base est desormais du type Base_val et non plus Base_val*.
00085  *
00086  * Revision 2.9  1999/11/26  14:23:55  eric
00087  * Traitement dzpuis des Cmp.
00088  *
00089  * Revision 2.8  1999/11/26  10:58:02  eric
00090  * Traitement dzpuis.
00091  *
00092  * Revision 2.7  1999/11/25  16:29:29  eric
00093  * Reorganisation complete du calcul des derivees partielles.
00094  *
00095  * Revision 2.6  1999/10/27  15:45:23  eric
00096  * Suppression du membre Cmp::c.
00097  *
00098  * Revision 2.5  1999/10/27  08:47:03  eric
00099  * Introduction de Cmp::va a la place de *(Cmp::c).
00100  *
00101  * Revision 2.4  1999/10/22  08:16:21  eric
00102  * const Map*.
00103  *
00104  * Revision 2.3  1999/10/14  14:27:17  eric
00105  * Methodes const.
00106  *
00107  * Revision 2.2  1999/10/13  15:54:40  eric
00108  * Mg3d* -> const Mg3d*
00109  *
00110  * Revision 2.1  1999/09/17  10:01:09  phil
00111  * correction pour deriv_x et deriv_y
00112  *
00113  * Revision 2.0  1999/09/14  16:37:06  phil
00114  * *** empty log message ***
00115  *
00116  *
00117  * $Header: /cvsroot/Lorene/C++/Source/Map/map_af_deriv.C,v 1.12 2012/01/17 10:32:09 j_penner Exp $
00118  *
00119  */
00120  
00121 // Header Lorene
00122 #include "map.h"
00123 #include "cmp.h"
00124 #include "tensor.h"
00125 
00126 
00127             //-----------------------//
00128             //        d/d\xi         //
00129             //-----------------------//
00130             
00131 
00132 void Map_af::dsdxi(const Cmp& ci, Cmp& resu) const {
00133 
00134     assert (ci.get_etat() != ETATNONDEF) ; 
00135     assert (ci.get_mp()->get_mg() == mg) ; 
00136 
00137     
00138     if (ci.get_etat() == ETATZERO) {
00139     resu.set_etat_zero() ; 
00140     }
00141     else {   
00142     assert( ci.get_etat() == ETATQCQ ) ; 
00143         
00144 
00145     (ci.va).coef() ;    // (ci.va).c_cf is up to date
00146     
00147     int nz = mg->get_nzone() ; 
00148     int nzm1 = nz - 1 ;
00149 
00150         switch( ci.get_dzpuis() ) {
00151         
00152             case 0 : {
00153             resu = (ci.va).dsdx() ;     // dsdx == d/d\xi
00154     
00155             if (mg->get_type_r(nzm1) == UNSURR) {
00156                 resu.set_dzpuis(2) ;    // r^2 d/dr has been computed in the // SOMETHING IS WRONG HERE
00157                         // external domain
00158             } 
00159                 break ; 
00160             }
00161             
00162             case 2 : {
00163             assert(mg->get_type_r(nzm1) == UNSURR) ;
00164                 
00165             Valeur tmp((ci.va).dsdx() ) ;
00166                 tmp.annule(nzm1) ;  // zero in the CED
00167 
00168                 // Special treatment in the CED
00169                 Valeur tmp_ced = - (ci.va).dsdx() ; 
00170                 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
00171                 tmp_ced.mult_xm1_zec() ; 
00172                 tmp_ced.set(nzm1) -= 2. * ci.va(nzm1) ; 
00173                 
00174                 // Recombination shells + CED : 
00175                 resu = tmp + tmp_ced ;
00176                 
00177                 resu.set_dzpuis(3) ;         
00178                 break ; 
00179             }
00180             
00181             case 4 : {
00182             assert(mg->get_type_r(nzm1) == UNSURR) ;
00183 
00184             Valeur tmp(ci.va.dsdx()) ;
00185             Valeur tmp2 = tmp ;
00186             tmp2.base = (ci.va).dsdx().base ;
00187             tmp.annule(nzm1) ; // not in the CED
00188             tmp2.annule(0, nz-2) ; // special treatment of the CED
00189             tmp2.mult_xm1_zec() ;
00190             tmp2 = tmp2 / xsr ;
00191             tmp2.set(nzm1) -= 4*ci.va(nzm1) ;
00192             tmp2.base = ci.va.base ; //Just for the CED
00193             tmp2.mult_xm1_zec() ;
00194 
00195             resu = tmp + tmp2 / xsr  ; // do not know what this is, but for now I can get away with it, no CED
00196             resu.set_dzpuis(4) ;
00197                 break ; 
00198             }
00199             
00200             default : {
00201                 cerr << "Map_af::dsdxi: unexpected value of input dzpuis !\n"
00202                     << "  ci.get_dzpuis() = " << ci.get_dzpuis() << endl ; 
00203                 abort() ; 
00204                 break ; 
00205             }
00206             
00207         }
00208 
00209       
00210     (resu.va).set_base( (ci.va).dsdx().get_base() ) ; // same basis as d/dxi
00211 
00212     }
00213     
00214 }
00215 
00216 void Map_af::dsdxi(const Scalar& uu, Scalar& resu) const {
00217 
00218   assert (uu.get_etat() != ETATNONDEF) ; 
00219   assert (uu.get_mp().get_mg() == mg) ; 
00220 
00221   Mtbl unity = r/r;
00222     
00223   if (uu.get_etat() == ETATZERO) {
00224     resu.set_etat_zero() ; 
00225   }
00226   else {   
00227     assert( uu.get_etat() == ETATQCQ ) ; 
00228 
00229     const Valeur& uuva = uu.get_spectral_va() ; 
00230 
00231     uuva.coef() ;    // (uu.va).c_cf is up to date
00232     
00233     int nz = mg->get_nzone() ; 
00234     int nzm1 = nz - 1 ;
00235 
00236     if ( uu.get_dzpuis() == 0 ) {
00237       resu = uuva.dsdx() * unity ;     //  dxds == d/d\xi, unity is used to set the correct formated output
00238     
00239       if (mg->get_type_r(nzm1) == UNSURR) {
00240     resu.set_dzpuis(2) ;    // r^2 d/dr has been computed in the
00241                             // external domain
00242       } 
00243     }
00244     else {
00245       int dzp = uu.get_dzpuis() ;
00246       
00247       resu = uuva.dsdx() ; 
00248       if (mg->get_type_r(nzm1) == UNSURR) {
00249       resu.annule_domain(nzm1) ;  // zero in the CED
00250       
00251       // Special treatment in the CED
00252       Valeur tmp_ced = - uuva.dsdx() ; 
00253       tmp_ced.annule(0, nz-2) ; // only non zero in the CED
00254       tmp_ced.mult_xm1_zec() ; 
00255       tmp_ced.set(nzm1) -= dzp * uuva(nzm1) ; 
00256       
00257       // Recombination shells + CED : 
00258       resu.set_spectral_va() += tmp_ced ;
00259       }
00260       resu.set_dzpuis(dzp+1) ;         
00261     
00262     }
00263 
00264     resu.set_spectral_base( uuva.dsdx().get_base() ) ; // same basis as d/dxi
00265 
00266   }
00267     
00268 }
00269 
00270             //---------------------//
00271             //        d/dr         //
00272             //---------------------//
00273             
00274 
00275 void Map_af::dsdr(const Cmp& ci, Cmp& resu) const {
00276 
00277     assert (ci.get_etat() != ETATNONDEF) ; 
00278     assert (ci.get_mp()->get_mg() == mg) ; 
00279 
00280     
00281     if (ci.get_etat() == ETATZERO) {
00282     resu.set_etat_zero() ; 
00283     }
00284     else {   
00285     assert( ci.get_etat() == ETATQCQ ) ; 
00286         
00287 
00288     (ci.va).coef() ;    // (ci.va).c_cf is up to date
00289     
00290     int nz = mg->get_nzone() ; 
00291     int nzm1 = nz - 1 ;
00292 
00293         switch( ci.get_dzpuis() ) {
00294         
00295             case 0 : {
00296             resu = (ci.va).dsdx() * dxdr ;     //  dxdr = dxi/dR, - dxi/dU (ZEC)
00297     
00298             if (mg->get_type_r(nzm1) == UNSURR) {
00299                 resu.set_dzpuis(2) ;    // r^2 d/dr has been computed in the
00300                         // external domain
00301             } 
00302                 break ; 
00303             }
00304             
00305             case 2 : {
00306             assert(mg->get_type_r(nzm1) == UNSURR) ;
00307                 
00308             Valeur tmp((ci.va).dsdx() * dxdr) ;
00309                 tmp.annule(nzm1) ;  // zero in the CED
00310 
00311                 // Special treatment in the CED
00312                 Valeur tmp_ced = - (ci.va).dsdx() ; 
00313                 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
00314                 tmp_ced.mult_xm1_zec() ; 
00315                 tmp_ced.set(nzm1) -= 2. * ci.va(nzm1) ; 
00316                 
00317                 // Recombination shells + CED : 
00318                 resu = tmp + tmp_ced ;
00319                 
00320                 resu.set_dzpuis(3) ;         
00321                 break ; 
00322             }
00323             
00324             case 4 : {
00325             assert(mg->get_type_r(nzm1) == UNSURR) ;
00326 
00327             Valeur tmp(ci.va.dsdx() * dxdr) ;
00328             Valeur tmp2 = tmp ;
00329             tmp2.base = (ci.va).dsdx().base ;
00330             tmp.annule(nzm1) ; // not in the CED
00331             tmp2.annule(0, nz-2) ; // special treatment of the CED
00332             tmp2.mult_xm1_zec() ;
00333             tmp2 = tmp2 / xsr ;
00334             tmp2.set(nzm1) -= 4*ci.va(nzm1) ;
00335             tmp2.base = ci.va.base ; //Just for the CED
00336             tmp2.mult_xm1_zec() ;
00337 
00338             resu = tmp + tmp2 / xsr  ; 
00339             resu.set_dzpuis(4) ;
00340                 break ; 
00341             }
00342             
00343             default : {
00344                 cerr << "Map_af::dsdr: unexpected value of input dzpuis !\n"
00345                     << "  ci.get_dzpuis() = " << ci.get_dzpuis() << endl ; 
00346                 abort() ; 
00347                 break ; 
00348             }
00349             
00350         }
00351 
00352       
00353     (resu.va).set_base( (ci.va).dsdx().get_base() ) ; // same basis as d/dxi
00354 
00355     }
00356     
00357 }
00358 
00359 void Map_af::dsdr(const Scalar& uu, Scalar& resu) const {
00360 
00361   assert (uu.get_etat() != ETATNONDEF) ; 
00362   assert (uu.get_mp().get_mg() == mg) ; 
00363 
00364     
00365   if (uu.get_etat() == ETATZERO) {
00366     resu.set_etat_zero() ; 
00367   }
00368   else {   
00369     assert( uu.get_etat() == ETATQCQ ) ; 
00370 
00371     const Valeur& uuva = uu.get_spectral_va() ; 
00372 
00373     uuva.coef() ;    // (uu.va).c_cf is up to date
00374     
00375     int nz = mg->get_nzone() ; 
00376     int nzm1 = nz - 1 ;
00377 
00378     if ( uu.get_dzpuis() == 0 ) {
00379       resu = uuva.dsdx() * dxdr ;     //  dxdr = dxi/dR, - dxi/dU (ZEC)
00380     
00381       if (mg->get_type_r(nzm1) == UNSURR) {
00382     resu.set_dzpuis(2) ;    // r^2 d/dr has been computed in the
00383                             // external domain
00384       } 
00385     }
00386     else {
00387       int dzp = uu.get_dzpuis() ;
00388       
00389       resu = uuva.dsdx() * dxdr ;
00390       if (mg->get_type_r(nzm1) == UNSURR) {
00391       resu.annule_domain(nzm1) ;  // zero in the CED
00392       
00393       // Special treatment in the CED
00394       Valeur tmp_ced = - uuva.dsdx() ; 
00395       tmp_ced.annule(0, nz-2) ; // only non zero in the CED
00396       tmp_ced.mult_xm1_zec() ; 
00397       tmp_ced.set(nzm1) -= dzp * uuva(nzm1) ; 
00398       
00399       // Recombination shells + CED : 
00400       resu.set_spectral_va() += tmp_ced ;
00401       }
00402       resu.set_dzpuis(dzp+1) ;         
00403     
00404     }
00405 
00406     resu.set_spectral_base( uuva.dsdx().get_base() ) ; // same basis as d/dxi
00407 
00408   }
00409     
00410 }
00411 // VARIABLE RADIALE
00412 
00413 void Map_af::dsdradial(const Scalar& uu, Scalar& resu) const {
00414 
00415   assert (uu.get_etat() != ETATNONDEF) ; 
00416   assert (uu.get_mp().get_mg() == mg) ; 
00417 
00418     
00419   if (uu.get_etat() == ETATZERO) {
00420     resu.set_etat_zero() ; 
00421   }
00422   else {   
00423     assert( uu.get_etat() == ETATQCQ ) ; 
00424 
00425     const Valeur& uuva = uu.get_spectral_va() ; 
00426 
00427     uuva.coef() ;    // (uu.va).c_cf is up to date
00428     
00429     int nz = mg->get_nzone() ; 
00430     int nzm1 = nz - 1 ;
00431 
00432     if ( uu.get_dzpuis() == 0 ) {
00433       resu = uuva.dsdx() * dxdr ;     //  dxdr = dxi/dR, - dxi/dU (ZEC)
00434     
00435       if (mg->get_type_r(nzm1) == UNSURR) {
00436     resu.set_dzpuis(2) ;    // r^2 d/dr has been computed in the
00437                             // external domain
00438       } 
00439     }
00440     else {
00441       assert(mg->get_type_r(nzm1) == UNSURR) ;
00442 
00443       int dzp = uu.get_dzpuis() ;
00444       
00445       resu = uuva.dsdx() * dxdr ;
00446       resu.annule_domain(nzm1) ;  // zero in the CED
00447       
00448       // Special treatment in the CED
00449       Valeur tmp_ced = - uuva.dsdx() ; 
00450       tmp_ced.annule(0, nz-2) ; // only non zero in the CED
00451       tmp_ced.mult_xm1_zec() ; 
00452       tmp_ced.set(nzm1) -= dzp * uuva(nzm1) ; 
00453       
00454       // Recombination shells + CED : 
00455       resu.set_spectral_va() += tmp_ced ;
00456       
00457       resu.set_dzpuis(dzp+1) ;         
00458     
00459     }
00460 
00461     resu.set_spectral_base( uuva.dsdx().get_base() ) ; // same basis as d/dxi
00462 
00463   }
00464     
00465 }
00466 
00467             //------------------------//
00468             //      1/r d/dtheta      //
00469             //------------------------//
00470 
00471 void Map_af::srdsdt(const Cmp& ci, Cmp& resu) const {
00472 
00473     assert (ci.get_etat() != ETATNONDEF) ; 
00474     assert (ci.get_mp()->get_mg() == mg) ; 
00475     
00476     if (ci.get_etat() == ETATZERO) {
00477     resu.set_etat_zero() ; 
00478     }
00479     else {
00480 
00481     assert( ci.get_etat() == ETATQCQ ) ; 
00482 
00483     (ci.va).coef() ;    // (ci.va).c_cf is up to date
00484 
00485     Valeur tmp = ci.va ; 
00486     
00487     tmp = tmp.dsdt() ;  // d/dtheta
00488 
00489     int nz = mg->get_nzone() ; 
00490     int nzm1 = nz - 1 ;
00491 
00492         switch( ci.get_dzpuis() ) {
00493         
00494             case 0 : {
00495             tmp = tmp.sx() ;    // 1/xi, Id, 1/(xi-1)
00496     
00497             Base_val sauve_base( tmp.get_base() ) ; 
00498 
00499             tmp = tmp * xsr ;   // xi/R, 1/R, (xi-1)/U
00500 
00501             tmp.set_base(sauve_base) ;   // The above operation does not the basis
00502             resu = tmp ;
00503       
00504             if (mg->get_type_r(nz-1) == UNSURR) {
00505                 resu.set_dzpuis(2) ;        // r d/dtheta has been computed in
00506                                 // the external domain
00507             }
00508                 break ; 
00509             }
00510             
00511             case 2 : {
00512             assert(mg->get_type_r(nzm1) == UNSURR) ;
00513                 
00514                 // Special treatment in the CED
00515                 Valeur tmp_ced = tmp ;    // d/dtheta 
00516                 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
00517 
00518                 tmp.annule(nzm1) ; 
00519             tmp = tmp.sx() ;    // 1/xi, Id
00520             Base_val sauve_base( tmp.get_base() ) ; 
00521             tmp = tmp * xsr ;   // xi/R, 1/R
00522             tmp.set_base(sauve_base) ;   // The above operation does not the basis
00523                 
00524                 // Recombination shells + CED : 
00525                 resu = tmp + tmp_ced ;
00526                 
00527                 resu.set_dzpuis(3) ;         
00528                 break ; 
00529             }
00530             
00531             case 4 : {
00532             assert(mg->get_type_r(nzm1) == UNSURR) ;
00533 
00534                 // Special treatment in the CED
00535             Valeur tmp_ced = tmp ;  // d/dtheta
00536                 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
00537             tmp_ced.mult_xm1_zec() ;
00538 
00539                 tmp.annule(nzm1) ; 
00540             tmp = tmp.sx() ;    // 1/xi, Id
00541             Base_val sauve_base( tmp.get_base() ) ; 
00542             tmp = tmp * xsr ;   // xi/R, 1/R
00543 
00544                 // Recombination shells + CED : 
00545             resu = tmp + tmp_ced / xsr ;
00546 
00547             resu.va.set_base( sauve_base ) ;
00548             resu.set_dzpuis(4) ;
00549                 break ; 
00550             }
00551             
00552             default : {
00553                 cerr << "Map_af::srdsdt: unexpected value of input dzpuis !\n"
00554                     << "  ci.get_dzpuis() = " << ci.get_dzpuis() << endl ; 
00555                 abort() ; 
00556                 break ; 
00557             }
00558             
00559         }
00560 
00561     }
00562     
00563 }
00564 
00565 void Map_af::srdsdt(const Scalar& uu, Scalar& resu) const {
00566   assert (uu.get_etat() != ETATNONDEF) ; 
00567   assert (uu.get_mp().get_mg() == mg) ; 
00568     
00569   if (uu.get_etat() == ETATZERO) {
00570     resu.set_etat_zero() ; 
00571   }
00572   else {
00573 
00574     assert( uu.get_etat() == ETATQCQ ) ; 
00575 
00576     const Valeur& uuva = uu.get_spectral_va() ;
00577     uuva.coef() ;    // (uu.va).c_cf is up to date
00578 
00579     Valeur tmp  = uuva.dsdt() ; // d/dtheta
00580 
00581     int nz = mg->get_nzone() ; 
00582     int nzm1 = nz - 1 ;
00583 
00584     if (uu.get_dzpuis() == 0) {
00585       tmp = tmp.sx() ;  // 1/xi, Id, 1/(xi-1)
00586     
00587       Base_val sauve_base( tmp.get_base() ) ; 
00588 
00589       tmp = tmp * xsr ; // xi/R, 1/R, (xi-1)/U
00590 
00591       tmp.set_base(sauve_base) ;   // The above operation does not change the basis
00592       resu = tmp ;
00593       
00594       if (mg->get_type_r(nz-1) == UNSURR) {
00595     resu.set_dzpuis(2) ;        // r d/dtheta has been computed in
00596     // the external domain
00597       }
00598     }
00599 
00600     else {
00601       assert(mg->get_type_r(nzm1) == UNSURR) ;
00602           
00603       int dzp = uu.get_dzpuis() ;
00604       // Special treatment in the CED
00605       Valeur tmp_ced = tmp ;    // d/dtheta 
00606       tmp_ced.annule(0, nz-2) ; // only non zero in the CED
00607 
00608       tmp.annule(nzm1) ; 
00609       tmp = tmp.sx() ;  // 1/xi, Id
00610       Base_val sauve_base( tmp.get_base() ) ; 
00611       tmp = tmp * xsr ; // xi/R, 1/R
00612       tmp.set_base(sauve_base) ;   // The above operation does not change the basis
00613                 
00614       // Recombination shells + CED : 
00615       resu = tmp + tmp_ced ;
00616                 
00617       resu.set_dzpuis(dzp+1) ;         
00618     }
00619             
00620   }
00621     
00622 }
00623 
00624 
00625             //------------------------------------//
00626             //       1/(r sin(theta))  d/dphi     //
00627             //------------------------------------//
00628 
00629 void Map_af::srstdsdp(const Cmp& ci, Cmp& resu) const {
00630 
00631     assert (ci.get_etat() != ETATNONDEF) ; 
00632     assert (ci.get_mp()->get_mg() == mg) ; 
00633     
00634     if (ci.get_etat() == ETATZERO) {
00635     resu.set_etat_zero() ; 
00636     }
00637     else {
00638 
00639     assert( ci.get_etat() == ETATQCQ ) ; 
00640 
00641     (ci.va).coef() ;    // (ci.va).c_cf is up to date
00642 
00643     Valeur tmp = ci.va ; 
00644     
00645     tmp = tmp.dsdp() ;  // d/dphi
00646     tmp = tmp.ssint() ; // 1/sin(theta)
00647 
00648     int nz = mg->get_nzone() ; 
00649     int nzm1 = nz - 1 ;
00650 
00651         switch( ci.get_dzpuis() ) {
00652         
00653             case 0 : {
00654             tmp = tmp.sx() ;    // 1/xi, Id, 1/(xi-1)
00655     
00656             Base_val sauve_base( tmp.get_base() ) ; 
00657 
00658             tmp = tmp * xsr ;   // xi/R, 1/R, (xi-1)/U
00659 
00660             tmp.set_base(sauve_base) ;   // The above operation does not the basis
00661             resu = tmp ;
00662       
00663             if (mg->get_type_r(nz-1) == UNSURR) {
00664                 resu.set_dzpuis(2) ;        // r d/dtheta has been computed in
00665                                 // the external domain
00666             }
00667                 break ; 
00668             }
00669             
00670             case 2 : {
00671             assert(mg->get_type_r(nzm1) == UNSURR) ;
00672                 
00673                 // Special treatment in the CED
00674                 Valeur tmp_ced = tmp ;    // 1/sin(theta) d/dphi 
00675                 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
00676 
00677                 tmp.annule(nzm1) ; 
00678             tmp = tmp.sx() ;    // 1/xi, Id
00679             Base_val sauve_base( tmp.get_base() ) ; 
00680             tmp = tmp * xsr ;   // xi/R, 1/R
00681             tmp.set_base(sauve_base) ;   // The above operation does not the basis
00682                 
00683                 // Recombination shells + CED : 
00684                 resu = tmp + tmp_ced ;
00685                 
00686                 resu.set_dzpuis(3) ;         
00687                 break ; 
00688             }
00689             
00690             case 4 : {
00691             assert(mg->get_type_r(nzm1) == UNSURR) ;
00692 
00693                 // Special treatment in the CED
00694             Valeur tmp_ced = tmp ;  // 1/sin(theta) d/dphi 
00695                 tmp_ced.annule(0, nz-2) ; // only non zero in the CED
00696             tmp_ced.mult_xm1_zec() ;
00697 
00698                 tmp.annule(nzm1) ; 
00699             tmp = tmp.sx() ;    // 1/xi, Id
00700             Base_val sauve_base( tmp.get_base() ) ; 
00701             tmp = tmp * xsr ;   // xi/R, 1/R
00702 
00703                 // Recombination shells + CED : 
00704             resu = tmp + tmp_ced / xsr ;
00705 
00706             resu.va.set_base( sauve_base ) ;
00707             resu.set_dzpuis(4) ;
00708                 break ; 
00709             }
00710             
00711             default : {
00712                 cerr << "Map_af::srstdsdp: unexpected value of input dzpuis !\n"
00713                     << "  ci.get_dzpuis() = " << ci.get_dzpuis() << endl ; 
00714                 abort() ; 
00715                 break ; 
00716             }
00717             
00718         }
00719 
00720     }
00721 
00722     
00723 }
00724 
00725 void Map_af::srstdsdp(const Scalar& uu, Scalar& resu) const {
00726 
00727   assert (uu.get_etat() != ETATNONDEF) ; 
00728   assert (uu.get_mp().get_mg() == mg) ; 
00729     
00730   if (uu.get_etat() == ETATZERO) {
00731     resu.set_etat_zero() ; 
00732   }
00733   else {
00734 
00735     assert( uu.get_etat() == ETATQCQ ) ; 
00736 
00737     const Valeur& uuva = uu.get_spectral_va() ;
00738     uuva.coef() ;    // (uu.va).c_cf is up to date
00739 
00740     Valeur tmp = uuva.dsdp() ;
00741     
00742     tmp = tmp.ssint() ; // 1/sin(theta)
00743 
00744     int nz = mg->get_nzone() ; 
00745     int nzm1 = nz - 1 ;
00746 
00747     if (uu.get_dzpuis() == 0) {
00748 
00749       tmp = tmp.sx() ;  // 1/xi, Id, 1/(xi-1)
00750     
00751       Base_val sauve_base( tmp.get_base() ) ; 
00752 
00753       tmp = tmp * xsr ; // xi/R, 1/R, (xi-1)/U
00754 
00755       tmp.set_base(sauve_base) ;   // The above operation does not change the basis
00756       resu = tmp ;
00757       
00758       if (mg->get_type_r(nz-1) == UNSURR) {
00759     resu.set_dzpuis(2) ;        // r d/dtheta has been computed in
00760     // the external domain
00761       }
00762     }
00763 
00764     else {
00765       assert(mg->get_type_r(nzm1) == UNSURR) ;
00766           
00767       int dzp = uu.get_dzpuis() ;
00768 
00769       // Special treatment in the CED
00770       Valeur tmp_ced = tmp ;    // 1/sin(theta) d/dphi 
00771       tmp_ced.annule(0, nz-2) ; // only non zero in the CED
00772 
00773       tmp.annule(nzm1) ; 
00774       tmp = tmp.sx() ;  // 1/xi, Id
00775       Base_val sauve_base( tmp.get_base() ) ; 
00776       tmp = tmp * xsr ; // xi/R, 1/R
00777       tmp.set_base(sauve_base) ;   // The above operation does not change the basis
00778                 
00779       // Recombination shells + CED : 
00780       resu = tmp + tmp_ced ;
00781                 
00782       resu.set_dzpuis(dzp+1) ;         
00783     }
00784   }    
00785 }
00786 
00787 
00788             //------------------------//
00789             //       d/dtheta         //
00790             //------------------------//
00791 
00792 
00793 void Map_af::dsdt(const Scalar& ci, Scalar& resu) const {
00794 
00795     assert (ci.get_etat() != ETATNONDEF) ; 
00796     assert (ci.get_mp().get_mg() == mg) ; 
00797     
00798     if (ci.get_etat() == ETATZERO) {
00799         resu.set_etat_zero() ; 
00800     }
00801     else {
00802 
00803         assert( ci.get_etat() == ETATQCQ ) ; 
00804 
00805         resu = ci.get_spectral_va().dsdt() ;    // d/dtheta
00806         
00807     }
00808 
00809     resu.set_dzpuis( ci.get_dzpuis() ) ;    // dzpuis unchanged
00810     
00811 }
00812 
00813 
00814             //-----------------------------------//
00815             //       1/sin(theta) d/dphi         //
00816             //-----------------------------------//
00817 
00818 
00819 void Map_af::stdsdp(const Scalar& ci, Scalar& resu) const {
00820 
00821     assert (ci.get_etat() != ETATNONDEF) ; 
00822     assert (ci.get_mp().get_mg() == mg) ; 
00823     
00824     if (ci.get_etat() == ETATZERO) {
00825         resu.set_etat_zero() ; 
00826     }
00827     else {
00828 
00829         assert( ci.get_etat() == ETATQCQ ) ; 
00830     
00831         resu = ci.get_spectral_va().stdsdp() ;  // 1/sin(theta) d/dphi
00832         
00833     }
00834     
00835     resu.set_dzpuis( ci.get_dzpuis() ) ;    // dzpuis unchanged
00836 
00837 }
00838 
00839 
00840 
00841 
00842 
00843 
00844 
00845 

Generated on Tue Feb 7 01:35:17 2012 for LORENE by  doxygen 1.4.6