map_et_fait_der.C

00001 /*
00002  *   Copyright (c) 1999-2003 Eric Gourgoulhon
00003  *
00004  *   This file is part of LORENE.
00005  *
00006  *   LORENE is free software; you can redistribute it and/or modify
00007  *   it under the terms of the GNU General Public License as published by
00008  *   the Free Software Foundation; either version 2 of the License, or
00009  *   (at your option) any later version.
00010  *
00011  *   LORENE is distributed in the hope that it will be useful,
00012  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *   GNU General Public License for more details.
00015  *
00016  *   You should have received a copy of the GNU General Public License
00017  *   along with LORENE; if not, write to the Free Software
00018  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019  *
00020  */
00021 
00022 
00023 char map_et_fait_der_C[] = "$Header: /cvsroot/Lorene/C++/Source/Map/map_et_fait_der.C,v 1.4 2008/08/27 08:49:01 jl_cornou Exp $" ;
00024 
00025 /*
00026  * $Id: map_et_fait_der.C,v 1.4 2008/08/27 08:49:01 jl_cornou Exp $
00027  * $Log: map_et_fait_der.C,v $
00028  * Revision 1.4  2008/08/27 08:49:01  jl_cornou
00029  * Added R_JACO02 case
00030  *
00031  * Revision 1.3  2003/10/15 10:40:26  e_gourgoulhon
00032  * Added new Coord's drdt and stdrdp.
00033  * Changed cast (const Map_et *) into static_cast<const Map_et*>.
00034  *
00035  * Revision 1.2  2002/10/16 14:36:41  j_novak
00036  * Reorganization of #include instructions of standard C++, in order to
00037  * use experimental version 3 of gcc.
00038  *
00039  * Revision 1.1.1.1  2001/11/20 15:19:27  e_gourgoulhon
00040  * LORENE
00041  *
00042  * Revision 1.2  1999/12/20  17:27:37  eric
00043  * Modif lapr_tp.
00044  *
00045  * Revision 1.1  1999/11/24  11:23:06  eric
00046  * Initial revision
00047  *
00048  *
00049  * $Header: /cvsroot/Lorene/C++/Source/Map/map_et_fait_der.C,v 1.4 2008/08/27 08:49:01 jl_cornou Exp $
00050  *
00051  */
00052 
00053 // Includes
00054 #include <assert.h>
00055 #include <stdlib.h>
00056 #include <math.h>
00057 
00058 #include "map.h"
00059 
00060 
00062 //      Derivees d'ordre 1 du changement de variables       //
00064 
00065 /*
00066  ************************************************************************
00067  *              1/(dR/dx)       ( -1/(dU/dx) ds la ZEC )
00068  ************************************************************************
00069  */
00070 
00071 Mtbl* map_et_fait_dxdr(const Map* cvi) {
00072 
00073     // recup du changement de variable
00074     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
00075     const Mg3d* mg = cv->get_mg() ;
00076     int nz = mg->get_nzone() ;
00077     
00078     // Le resultat
00079     Mtbl* mti = new Mtbl(mg) ;
00080     mti->set_etat_qcq() ;
00081     
00082     // Pour le confort
00083     const double* alpha = cv->alpha ;
00084     const Valeur& ff = cv->ff ; 
00085     const Valeur& gg = cv->gg ; 
00086     
00087     for (int l=0 ; l<nz ; l++) {
00088 
00089     int nr = mg->get_nr(l);
00090     int nt = mg->get_nt(l) ;
00091     int np = mg->get_np(l) ;
00092 
00093     const Tbl& da = *((cv->daa)[l]) ; 
00094     const Tbl& db = *((cv->dbb)[l]) ; 
00095 
00096     Tbl* tb = (mti->t)[l] ;
00097     tb->set_etat_qcq() ;
00098     double* p_r = tb->t ;
00099     
00100     switch(mg->get_type_r(l)) {
00101     
00102         case FIN: case RARE: case FINJAC: {
00103         for (int k=0 ; k<np ; k++) {
00104         for (int j=0 ; j<nt ; j++) {
00105             for (int i=0 ; i<nr ; i++) {
00106             *p_r = 1. / 
00107                   ( alpha[l] * ( 1. + da(i) * ff(l, k, j, 0)
00108                             + db(i) * gg(l, k, j, 0) ) 
00109                   ) ; 
00110             p_r++ ;
00111             }       // Fin de boucle sur r
00112         }   // Fin de boucle sur theta
00113         }       // Fin de boucle sur phi
00114         break ; 
00115         }
00116             
00117         case UNSURR: {
00118         for (int k=0 ; k<np ; k++) {
00119         for (int j=0 ; j<nt ; j++) {
00120             for (int i=0 ; i<nr ; i++) {
00121             *p_r = - 1. / 
00122                     ( alpha[l] * ( 1. + da(i) * ff(l, k, j, 0) )
00123                     ) ; 
00124             p_r++ ;
00125             }       // Fin de boucle sur r
00126         }   // Fin de boucle sur theta
00127         }       // Fin de boucle sur phi
00128         break ; 
00129         }    
00130 
00131         default: {
00132         cout << "map_et_fait_dxdr: unknown type_r !" << endl ;
00133         abort() ;
00134         }
00135     }       // Fin du switch
00136     }           // Fin de boucle sur zone
00137 
00138     // Termine
00139     return mti ;
00140 }
00141 
00142 /*
00143  *******************************************************************************
00144  *               dR/dtheta      ( dans la ZEC: - dU/dth )
00145  *******************************************************************************
00146  */
00147 
00148 Mtbl* map_et_fait_drdt(const Map* cvi) {
00149 
00150     // recup du changement de variable
00151     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
00152     const Mg3d* mg = cv->get_mg() ;
00153     int nz = mg->get_nzone() ;
00154     
00155     // Le resultat
00156     Mtbl* mti = new Mtbl(mg) ;
00157     mti->set_etat_qcq() ;
00158     
00159     // Pour le confort
00160     const double* alpha = cv->alpha ;
00161     const Valeur& ff = cv->ff ; 
00162     const Valeur& gg = cv->gg ; 
00163     const Valeur& dffdt = ff.dsdt() ; 
00164     const Valeur& dggdt = gg.dsdt() ; 
00165 
00166     
00167     for (int l=0 ; l<nz ; l++) {
00168 
00169     int nr = mg->get_nr(l);
00170     int nt = mg->get_nt(l) ;
00171     int np = mg->get_np(l) ;
00172 
00173     const Tbl& aa = *((cv->aa)[l]) ; 
00174     const Tbl& bb = *((cv->bb)[l]) ; 
00175 
00176     Tbl* tb = (mti->t)[l] ;
00177     tb->set_etat_qcq() ;
00178     double* p_r = tb->t ;
00179     
00180     switch(mg->get_type_r(l)) {
00181     
00182             
00183         case RARE : case FIN: case FINJAC :{
00184         for (int k=0 ; k<np ; k++) {
00185         for (int j=0 ; j<nt ; j++) {
00186             for (int i=0 ; i<nr ; i++) {
00187             *p_r = alpha[l] * (   aa(i) * dffdt(l, k, j, 0)
00188                         + bb(i) * dggdt(l, k, j, 0) ) ; 
00189             p_r++ ;
00190             }       // Fin de boucle sur r
00191         }   // Fin de boucle sur theta
00192         }       // Fin de boucle sur phi
00193         break ;
00194         }
00195 
00196         case UNSURR: {
00197         
00198         for (int k=0 ; k<np ; k++) {
00199         for (int j=0 ; j<nt ; j++) {
00200             for (int i=0 ; i<nr ; i++) {
00201             *p_r = - aa(i) * dffdt(l, k, j, 0)  ;
00202             p_r++ ;
00203             }       // Fin de boucle sur r
00204         }   // Fin de boucle sur theta
00205         }       // Fin de boucle sur phi
00206         break ; 
00207         }    
00208 
00209         default: {
00210         cout << "map_et_fait_drdt: unknown type_r !" << endl ;
00211         abort() ;
00212         }
00213     }       // Fin du switch
00214     }           // Fin de boucle sur zone
00215 
00216     // Termine
00217     return mti ;
00218 } 
00219 
00220 
00221 /*
00222  *******************************************************************************
00223  *            1/sin(theta)   dR/dphi        ( dans la ZEC: - 1/sin(th) dU/dth )
00224  *******************************************************************************
00225  */
00226 
00227 Mtbl* map_et_fait_stdrdp(const Map* cvi) {
00228 
00229     // recup du changement de variable
00230     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
00231     const Mg3d* mg = cv->get_mg() ;
00232     int nz = mg->get_nzone() ;
00233     
00234     // Le resultat
00235     Mtbl* mti = new Mtbl(mg) ;
00236     mti->set_etat_qcq() ;
00237     
00238     // Pour le confort
00239     const double* alpha = cv->alpha ;
00240     const Valeur& ff = cv->ff ; 
00241     const Valeur& gg = cv->gg ; 
00242     const Valeur& stdffdp = ff.stdsdp() ; 
00243     const Valeur& stdggdp = gg.stdsdp() ; 
00244 
00245     
00246     for (int l=0 ; l<nz ; l++) {
00247 
00248     int nr = mg->get_nr(l);
00249     int nt = mg->get_nt(l) ;
00250     int np = mg->get_np(l) ;
00251 
00252     const Tbl& aa = *((cv->aa)[l]) ; 
00253     const Tbl& bb = *((cv->bb)[l]) ; 
00254 
00255     Tbl* tb = (mti->t)[l] ;
00256     tb->set_etat_qcq() ;
00257     double* p_r = tb->t ;
00258     
00259     switch(mg->get_type_r(l)) {
00260     
00261             
00262         case RARE : case FIN: case FINJAC: {
00263         for (int k=0 ; k<np ; k++) {
00264         for (int j=0 ; j<nt ; j++) {
00265             for (int i=0 ; i<nr ; i++) {
00266             *p_r = alpha[l] * (   aa(i) * stdffdp(l, k, j, 0)
00267                         + bb(i) * stdggdp(l, k, j, 0) ) ; 
00268             p_r++ ;
00269             }       // Fin de boucle sur r
00270         }   // Fin de boucle sur theta
00271         }       // Fin de boucle sur phi
00272         break ;
00273         }
00274 
00275         case UNSURR: {
00276         
00277         for (int k=0 ; k<np ; k++) {
00278         for (int j=0 ; j<nt ; j++) {
00279             for (int i=0 ; i<nr ; i++) {
00280             *p_r = - aa(i) * stdffdp(l, k, j, 0)    ;
00281             p_r++ ;
00282             }       // Fin de boucle sur r
00283         }   // Fin de boucle sur theta
00284         }       // Fin de boucle sur phi
00285         break ; 
00286         }    
00287 
00288         default: {
00289         cout << "map_et_fait_stdrdp: unknown type_r !" << endl ;
00290         abort() ;
00291         }
00292     }       // Fin du switch
00293     }           // Fin de boucle sur zone
00294 
00295     // Termine
00296     return mti ;
00297 } 
00298 
00299 
00300 /*
00301  *******************************************************************************
00302  *              1/R dR/dtheta       ( dans la ZEC: - 1/U dU/dth )
00303  *******************************************************************************
00304  */
00305 
00306 Mtbl* map_et_fait_srdrdt(const Map* cvi) {
00307 
00308     // recup du changement de variable
00309     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
00310     const Mg3d* mg = cv->get_mg() ;
00311     int nz = mg->get_nzone() ;
00312     
00313     // Le resultat
00314     Mtbl* mti = new Mtbl(mg) ;
00315     mti->set_etat_qcq() ;
00316     
00317     // Pour le confort
00318     const double* alpha = cv->alpha ;
00319     const double* beta = cv->beta ;
00320     const Valeur& ff = cv->ff ; 
00321     const Valeur& gg = cv->gg ; 
00322     const Valeur& dffdt = ff.dsdt() ; 
00323     const Valeur& dggdt = gg.dsdt() ; 
00324 
00325     
00326     for (int l=0 ; l<nz ; l++) {
00327 
00328     const Grille3d* g = mg->get_grille3d(l) ;
00329 
00330     int nr = mg->get_nr(l);
00331     int nt = mg->get_nt(l) ;
00332     int np = mg->get_np(l) ;
00333 
00334     const Tbl& aa = *((cv->aa)[l]) ; 
00335     const Tbl& bb = *((cv->bb)[l]) ; 
00336 
00337     Tbl* tb = (mti->t)[l] ;
00338     tb->set_etat_qcq() ;
00339     double* p_r = tb->t ;
00340     
00341     switch(mg->get_type_r(l)) {
00342     
00343         case RARE: {
00344         
00345         const Tbl& asx = cv->aasx ; 
00346         const Tbl& bsx = cv->bbsx ; 
00347         
00348         for (int k=0 ; k<np ; k++) {
00349         for (int j=0 ; j<nt ; j++) {
00350             for (int i=0 ; i<nr ; i++) {
00351             *p_r =  (   asx(i) * dffdt(l, k, j, 0) 
00352                   + bsx(i) * dggdt(l, k, j, 0)  ) /
00353                 ( 1. + asx(i) * ff(l, k, j, 0)
00354                      + bsx(i) * gg(l, k, j, 0) ) ; 
00355             p_r++ ;
00356             }       // Fin de boucle sur r
00357         }   // Fin de boucle sur theta
00358         }       // Fin de boucle sur phi
00359         break ; 
00360         }
00361 
00362         case FINJAC: {
00363         for (int k=0 ; k<np ; k++) {
00364         for (int j=0 ; j<nt ; j++) {
00365             for (int i=0 ; i<nr ; i++) {
00366             *p_r = alpha[l] * (   aa(i) * dffdt(l, k, j, 0)
00367                         + bb(i) * dggdt(l, k, j, 0) )
00368                 / ( alpha[l] * (
00369                     (g->x)[i] + aa(i) * ff(l, k, j, 0)
00370                           + bb(i) * gg(l, k, j, 0) ) 
00371                       + beta[l] ) ; 
00372             p_r++ ;
00373             }       // Fin de boucle sur r
00374         }   // Fin de boucle sur theta
00375         }       // Fin de boucle sur phi
00376         break ;
00377         }
00378             
00379         case FIN: {
00380         for (int k=0 ; k<np ; k++) {
00381         for (int j=0 ; j<nt ; j++) {
00382             for (int i=0 ; i<nr ; i++) {
00383             *p_r = alpha[l] * (   aa(i) * dffdt(l, k, j, 0)
00384                         + bb(i) * dggdt(l, k, j, 0) )
00385                 / ( alpha[l] * (
00386                     (g->x)[i] + aa(i) * ff(l, k, j, 0)
00387                           + bb(i) * gg(l, k, j, 0) ) 
00388                       + beta[l] ) ; 
00389             p_r++ ;
00390             }       // Fin de boucle sur r
00391         }   // Fin de boucle sur theta
00392         }       // Fin de boucle sur phi
00393         break ;
00394         }
00395 
00396         case UNSURR: {
00397         
00398         const Tbl& asxm1 = cv->zaasx ; 
00399 
00400         for (int k=0 ; k<np ; k++) {
00401         for (int j=0 ; j<nt ; j++) {
00402             for (int i=0 ; i<nr ; i++) {
00403             *p_r = - asxm1(i) * dffdt(l, k, j, 0)
00404                 /  ( 1. + asxm1(i) * ff(l, k, j, 0) )   ;
00405             p_r++ ;
00406             }       // Fin de boucle sur r
00407         }   // Fin de boucle sur theta
00408         }       // Fin de boucle sur phi
00409         break ; 
00410         }    
00411 
00412         default: {
00413         cout << "map_et_fait_srdrdt: unknown type_r !" << endl ;
00414         abort() ;
00415         }
00416     }       // Fin du switch
00417     }           // Fin de boucle sur zone
00418 
00419     // Termine
00420     return mti ;
00421 } 
00422 
00423 /*
00424  *****************************************************************************
00425  *  1/(R sin(theta)) dR/dphi    ( ds la ZEC: - 1/(U sin(th)) dU/dphi )
00426  *****************************************************************************
00427  */
00428 
00429 Mtbl* map_et_fait_srstdrdp(const Map* cvi) {
00430 
00431     // recup du changement de variable
00432     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
00433     const Mg3d* mg = cv->get_mg() ;
00434     int nz = mg->get_nzone() ;
00435     
00436     // Le resultat
00437     Mtbl* mti = new Mtbl(mg) ;
00438     mti->set_etat_qcq() ;
00439     
00440     // Pour le confort
00441     const double* alpha = cv->alpha ;
00442     const double* beta = cv->beta ;
00443     const Valeur& ff = cv->ff ; 
00444     const Valeur& gg = cv->gg ; 
00445     const Valeur& stdffdp = ff.stdsdp() ; 
00446     const Valeur& stdggdp = gg.stdsdp() ; 
00447 
00448     
00449     for (int l=0 ; l<nz ; l++) {
00450 
00451     const Grille3d* g = mg->get_grille3d(l) ;
00452 
00453     int nr = mg->get_nr(l);
00454     int nt = mg->get_nt(l) ;
00455     int np = mg->get_np(l) ;
00456 
00457     const Tbl& aa = *((cv->aa)[l]) ; 
00458     const Tbl& bb = *((cv->bb)[l]) ; 
00459 
00460     Tbl* tb = (mti->t)[l] ;
00461     tb->set_etat_qcq() ;
00462     double* p_r = tb->t ;
00463     
00464     switch(mg->get_type_r(l)) {
00465     
00466         case RARE: {
00467         
00468         const Tbl& asx = cv->aasx ; 
00469         const Tbl& bsx = cv->bbsx ; 
00470         
00471         for (int k=0 ; k<np ; k++) {
00472         for (int j=0 ; j<nt ; j++) {
00473             for (int i=0 ; i<nr ; i++) {
00474             *p_r =  (   asx(i) * stdffdp(l, k, j, 0) 
00475                   + bsx(i) * stdggdp(l, k, j, 0)  ) /
00476                 ( 1. + asx(i) * ff(l, k, j, 0)
00477                      + bsx(i) * gg(l, k, j, 0) ) ; 
00478             p_r++ ;
00479             }       // Fin de boucle sur r
00480         }   // Fin de boucle sur theta
00481         }       // Fin de boucle sur phi
00482         break ; 
00483         }
00484 
00485         case FINJAC: {
00486         for (int k=0 ; k<np ; k++) {
00487         for (int j=0 ; j<nt ; j++) {
00488             for (int i=0 ; i<nr ; i++) {
00489             *p_r = alpha[l] * (   aa(i) * stdffdp(l, k, j, 0)
00490                         + bb(i) * stdggdp(l, k, j, 0) )
00491                 / ( alpha[l] * (
00492                     (g->x)[i] + aa(i) * ff(l, k, j, 0)
00493                           + bb(i) * gg(l, k, j, 0) ) 
00494                       + beta[l] ) ; 
00495             p_r++ ;
00496             }       // Fin de boucle sur r
00497         }   // Fin de boucle sur theta
00498         }       // Fin de boucle sur phi
00499         break ;
00500         }
00501             
00502         case FIN: {
00503         for (int k=0 ; k<np ; k++) {
00504         for (int j=0 ; j<nt ; j++) {
00505             for (int i=0 ; i<nr ; i++) {
00506             *p_r = alpha[l] * (   aa(i) * stdffdp(l, k, j, 0)
00507                         + bb(i) * stdggdp(l, k, j, 0) )
00508                 / ( alpha[l] * (
00509                     (g->x)[i] + aa(i) * ff(l, k, j, 0)
00510                           + bb(i) * gg(l, k, j, 0) ) 
00511                       + beta[l] ) ; 
00512             p_r++ ;
00513             }       // Fin de boucle sur r
00514         }   // Fin de boucle sur theta
00515         }       // Fin de boucle sur phi
00516         break ;
00517         }
00518 
00519         case UNSURR: {
00520         
00521         const Tbl& asxm1 = cv->zaasx ; 
00522 
00523         for (int k=0 ; k<np ; k++) {
00524         for (int j=0 ; j<nt ; j++) {
00525             for (int i=0 ; i<nr ; i++) {
00526             *p_r = - asxm1(i) * stdffdp(l, k, j, 0)
00527                 /  ( 1. + asxm1(i) * ff(l, k, j, 0) )   ;
00528             p_r++ ;
00529             }       // Fin de boucle sur r
00530         }   // Fin de boucle sur theta
00531         }       // Fin de boucle sur phi
00532         break ; 
00533         }    
00534 
00535         default: {
00536         cout << "map_et_fait_srstdrdp: unknown type_r !" << endl ;
00537         abort() ;
00538         }
00539     }       // Fin du switch
00540     }           // Fin de boucle sur zone
00541 
00542     return mti ; 
00543 } 
00544 
00545 /*
00546  *******************************************************************************
00547  *              1/R^2 dR/dtheta ( dans la ZEC: - 1/U^2 dU/dth )
00548  *******************************************************************************
00549  */
00550 
00551 Mtbl* map_et_fait_sr2drdt(const Map* cvi) {
00552 
00553     // recup du changement de variable
00554     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
00555     const Mg3d* mg = cv->get_mg() ;
00556     int nz = mg->get_nzone() ;
00557     
00558     // Le resultat
00559     Mtbl* mti = new Mtbl(mg) ;
00560     mti->set_etat_qcq() ;
00561     
00562     // Pour le confort
00563     const double* alpha = cv->alpha ;
00564     const double* beta = cv->beta ;
00565     const Valeur& ff = cv->ff ; 
00566     const Valeur& gg = cv->gg ; 
00567     const Valeur& dffdt = ff.dsdt() ; 
00568     const Valeur& dggdt = gg.dsdt() ; 
00569 
00570     
00571     for (int l=0 ; l<nz ; l++) {
00572 
00573     const Grille3d* g = mg->get_grille3d(l) ;
00574 
00575     int nr = mg->get_nr(l);
00576     int nt = mg->get_nt(l) ;
00577     int np = mg->get_np(l) ;
00578 
00579     const Tbl& aa = *((cv->aa)[l]) ; 
00580     const Tbl& bb = *((cv->bb)[l]) ; 
00581 
00582     Tbl* tb = (mti->t)[l] ;
00583     tb->set_etat_qcq() ;
00584     double* p_r = tb->t ;
00585     
00586     switch(mg->get_type_r(l)) {
00587     
00588         case RARE: {
00589         
00590         const Tbl& asx = cv->aasx ; 
00591         const Tbl& bsx = cv->bbsx ; 
00592         const Tbl& asx2 = cv->aasx2 ; 
00593         const Tbl& bsx2 = cv->bbsx2 ; 
00594         
00595         for (int k=0 ; k<np ; k++) {
00596         for (int j=0 ; j<nt ; j++) {
00597             for (int i=0 ; i<nr ; i++) {
00598             
00599             double ww =  1. + asx(i) * ff(l, k, j, 0)
00600                         + bsx(i) * gg(l, k, j, 0) ;
00601             
00602             *p_r =  (   asx2(i) * dffdt(l, k, j, 0) 
00603                   + bsx2(i) * dggdt(l, k, j, 0)  ) /
00604                 (alpha[l] * ww*ww) ; 
00605             p_r++ ;
00606             }       // Fin de boucle sur r
00607         }   // Fin de boucle sur theta
00608         }       // Fin de boucle sur phi
00609         break ; 
00610         }
00611 
00612         case FINJAC: {
00613         for (int k=0 ; k<np ; k++) {
00614         for (int j=0 ; j<nt ; j++) {
00615             for (int i=0 ; i<nr ; i++) {
00616 
00617             double ww = alpha[l] * (
00618                     (g->x)[i] + aa(i) * ff(l, k, j, 0)
00619                           + bb(i) * gg(l, k, j, 0) ) 
00620                       + beta[l] ; 
00621 
00622             *p_r = alpha[l] * (   aa(i) * dffdt(l, k, j, 0)
00623                         + bb(i) * dggdt(l, k, j, 0) )
00624                 / ( ww*ww ) ; 
00625             p_r++ ;
00626             }       // Fin de boucle sur r
00627         }   // Fin de boucle sur theta
00628         }       // Fin de boucle sur phi
00629         break ;
00630         }
00631 
00632             
00633         case FIN: {
00634         for (int k=0 ; k<np ; k++) {
00635         for (int j=0 ; j<nt ; j++) {
00636             for (int i=0 ; i<nr ; i++) {
00637 
00638             double ww = alpha[l] * (
00639                     (g->x)[i] + aa(i) * ff(l, k, j, 0)
00640                           + bb(i) * gg(l, k, j, 0) ) 
00641                       + beta[l] ; 
00642 
00643             *p_r = alpha[l] * (   aa(i) * dffdt(l, k, j, 0)
00644                         + bb(i) * dggdt(l, k, j, 0) )
00645                 / ( ww*ww ) ; 
00646             p_r++ ;
00647             }       // Fin de boucle sur r
00648         }   // Fin de boucle sur theta
00649         }       // Fin de boucle sur phi
00650         break ;
00651         }
00652 
00653         case UNSURR: {
00654         
00655         const Tbl& asxm1 = cv->zaasx ; 
00656         const Tbl& asxm1car = cv->zaasx2 ; 
00657 
00658         for (int k=0 ; k<np ; k++) {
00659         for (int j=0 ; j<nt ; j++) {
00660             for (int i=0 ; i<nr ; i++) {
00661             
00662             double ww = 1. + asxm1(i) * ff(l, k, j, 0) ;
00663             
00664             *p_r = - asxm1car(i) * dffdt(l, k, j, 0)
00665                 /  ( alpha[l] * ww*ww ) ;
00666             p_r++ ;
00667             }       // Fin de boucle sur r
00668         }   // Fin de boucle sur theta
00669         }       // Fin de boucle sur phi
00670         break ; 
00671         }    
00672 
00673         default: {
00674         cout << "map_et_fait_sr2drdt: unknown type_r !" << endl ;
00675         abort() ;
00676         }
00677     }       // Fin du switch
00678     }           // Fin de boucle sur zone
00679 
00680     // Termine
00681     return mti ;
00682 } 
00683 
00684 /*
00685  *******************************************************************************
00686  *    1/(R^2 sin(theta)) dR/dphi    ( ds la ZEC: - 1/(U^2 sin(th)) dU/dphi )
00687  *******************************************************************************
00688  */
00689 
00690 Mtbl* map_et_fait_sr2stdrdp(const Map* cvi) {
00691 
00692     // recup du changement de variable
00693     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
00694     const Mg3d* mg = cv->get_mg() ;
00695     int nz = mg->get_nzone() ;
00696     
00697     // Le resultat
00698     Mtbl* mti = new Mtbl(mg) ;
00699     mti->set_etat_qcq() ;
00700     
00701     // Pour le confort
00702     const double* alpha = cv->alpha ;
00703     const double* beta = cv->beta ;
00704     const Valeur& ff = cv->ff ; 
00705     const Valeur& gg = cv->gg ; 
00706     const Valeur& stdffdp = ff.stdsdp() ; 
00707     const Valeur& stdggdp = gg.stdsdp() ; 
00708 
00709     
00710     for (int l=0 ; l<nz ; l++) {
00711 
00712     const Grille3d* g = mg->get_grille3d(l) ;
00713 
00714     int nr = mg->get_nr(l);
00715     int nt = mg->get_nt(l) ;
00716     int np = mg->get_np(l) ;
00717 
00718     const Tbl& aa = *((cv->aa)[l]) ; 
00719     const Tbl& bb = *((cv->bb)[l]) ; 
00720 
00721     Tbl* tb = (mti->t)[l] ;
00722     tb->set_etat_qcq() ;
00723     double* p_r = tb->t ;
00724     
00725     switch(mg->get_type_r(l)) {
00726     
00727         case RARE: {
00728         
00729         const Tbl& asx = cv->aasx ; 
00730         const Tbl& bsx = cv->bbsx ; 
00731         const Tbl& asx2 = cv->aasx2 ; 
00732         const Tbl& bsx2 = cv->bbsx2 ; 
00733         
00734         for (int k=0 ; k<np ; k++) {
00735         for (int j=0 ; j<nt ; j++) {
00736             for (int i=0 ; i<nr ; i++) {
00737             
00738             double ww =  1. + asx(i) * ff(l, k, j, 0)
00739                         + bsx(i) * gg(l, k, j, 0) ;
00740             
00741             *p_r =  (   asx2(i) * stdffdp(l, k, j, 0) 
00742                   + bsx2(i) * stdggdp(l, k, j, 0)  ) /
00743                 (alpha[l] * ww*ww) ; 
00744             p_r++ ;
00745             }       // Fin de boucle sur r
00746         }   // Fin de boucle sur theta
00747         }       // Fin de boucle sur phi
00748         break ; 
00749         }
00750 
00751         case FINJAC: {
00752         for (int k=0 ; k<np ; k++) {
00753         for (int j=0 ; j<nt ; j++) {
00754             for (int i=0 ; i<nr ; i++) {
00755 
00756             double ww = alpha[l] * (
00757                     (g->x)[i] + aa(i) * ff(l, k, j, 0)
00758                           + bb(i) * gg(l, k, j, 0) ) 
00759                       + beta[l] ; 
00760 
00761             *p_r = alpha[l] * (   aa(i) * stdffdp(l, k, j, 0)
00762                         + bb(i) * stdggdp(l, k, j, 0) )
00763                 / ( ww*ww ) ; 
00764             p_r++ ;
00765             }       // Fin de boucle sur r
00766         }   // Fin de boucle sur theta
00767         }       // Fin de boucle sur phi
00768         break ;
00769         }
00770 
00771             
00772         case FIN: {
00773         for (int k=0 ; k<np ; k++) {
00774         for (int j=0 ; j<nt ; j++) {
00775             for (int i=0 ; i<nr ; i++) {
00776 
00777             double ww = alpha[l] * (
00778                     (g->x)[i] + aa(i) * ff(l, k, j, 0)
00779                           + bb(i) * gg(l, k, j, 0) ) 
00780                       + beta[l] ; 
00781 
00782             *p_r = alpha[l] * (   aa(i) * stdffdp(l, k, j, 0)
00783                         + bb(i) * stdggdp(l, k, j, 0) )
00784                 / ( ww*ww ) ; 
00785             p_r++ ;
00786             }       // Fin de boucle sur r
00787         }   // Fin de boucle sur theta
00788         }       // Fin de boucle sur phi
00789         break ;
00790         }
00791 
00792         case UNSURR: {
00793         
00794         const Tbl& asxm1 = cv->zaasx ; 
00795         const Tbl& asxm1car = cv->zaasx2 ; 
00796 
00797         for (int k=0 ; k<np ; k++) {
00798         for (int j=0 ; j<nt ; j++) {
00799             for (int i=0 ; i<nr ; i++) {
00800             
00801             double ww = 1. + asxm1(i) * ff(l, k, j, 0) ;
00802             
00803             *p_r = - asxm1car(i) * stdffdp(l, k, j, 0)
00804                 /  ( alpha[l] * ww*ww ) ;
00805             p_r++ ;
00806             }       // Fin de boucle sur r
00807         }   // Fin de boucle sur theta
00808         }       // Fin de boucle sur phi
00809         break ; 
00810         }    
00811 
00812         default: {
00813         cout << "map_et_fait_sr2stdrdp: unknown type_r !" << endl ;
00814         abort() ;
00815         }
00816     }       // Fin du switch
00817     }           // Fin de boucle sur zone
00818 
00819     // Termine
00820     return mti ;
00821 } 
00822 
00823 /*
00824  ******************************************************************************
00825  *      1/(dR/dx) R/x               ds. le noyau 
00826  *      1/(dR/dx) R/(x + beta_l/alpha_l)    ds. les coquilles
00827  *      1/(dU/dx) U/(x-1)           ds. la ZEC
00828  ******************************************************************************
00829  */
00830 
00831 Mtbl* map_et_fait_rsxdxdr(const Map* cvi) {
00832 
00833     // recup du changement de variable
00834     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
00835     const Mg3d* mg = cv->get_mg() ;
00836     int nz = mg->get_nzone() ;
00837     
00838     // Le resultat
00839     Mtbl* mti = new Mtbl(mg) ;
00840     mti->set_etat_qcq() ;
00841     
00842     // Pour le confort
00843     const double* alpha = cv->alpha ;
00844     const double* beta = cv->beta ;
00845     const Valeur& ff = cv->ff ; 
00846     const Valeur& gg = cv->gg ; 
00847     
00848     for (int l=0 ; l<nz ; l++) {
00849 
00850     const Grille3d* g = mg->get_grille3d(l) ;
00851 
00852     int nr = mg->get_nr(l);
00853     int nt = mg->get_nt(l) ;
00854     int np = mg->get_np(l) ;
00855 
00856     const Tbl& aa = *((cv->aa)[l]) ; 
00857     const Tbl& bb = *((cv->bb)[l]) ; 
00858     const Tbl& da = *((cv->daa)[l]) ; 
00859     const Tbl& db = *((cv->dbb)[l]) ; 
00860 
00861     Tbl* tb = (mti->t)[l] ;
00862     tb->set_etat_qcq() ;
00863     double* p_r = tb->t ;
00864     
00865     switch(mg->get_type_r(l)) {
00866     
00867         case RARE: {
00868         
00869         const Tbl& asx = cv->aasx ; 
00870         const Tbl& bsx = cv->bbsx ; 
00871         
00872         for (int k=0 ; k<np ; k++) {
00873         for (int j=0 ; j<nt ; j++) {
00874             for (int i=0 ; i<nr ; i++) {
00875 
00876             *p_r = ( 1. + asx(i) * ff(l, k, j, 0) 
00877                     + bsx(i) * gg(l, k, j, 0) ) / 
00878                    ( 1. + da(i) * ff(l, k, j, 0) 
00879                     + db(i) * gg(l, k, j, 0) ) ; 
00880             p_r++ ;
00881             }       // Fin de boucle sur r
00882         }   // Fin de boucle sur theta
00883         }       // Fin de boucle sur phi
00884         break ; 
00885         }
00886 
00887         case FINJAC: {
00888         for (int k=0 ; k<np ; k++) {
00889         for (int j=0 ; j<nt ; j++) {
00890             for (int i=0 ; i<nr ; i++) {
00891 
00892             *p_r = ( (g->x)[i] + aa(i) * ff(l, k, j, 0) 
00893                        + bb(i) * gg(l, k, j, 0) 
00894                        + beta[l]/alpha[l]        )  /
00895                    ( ( 1. + da(i) * ff(l, k, j, 0) 
00896                       + db(i) * gg(l, k, j, 0) ) *
00897                  ( (g->x)[i] + beta[l]/alpha[l] ) ) ;           
00898             
00899             p_r++ ;
00900             }       // Fin de boucle sur r
00901         }   // Fin de boucle sur theta
00902         }       // Fin de boucle sur phi
00903         break ;
00904         }
00905 
00906             
00907         case FIN: {
00908         for (int k=0 ; k<np ; k++) {
00909         for (int j=0 ; j<nt ; j++) {
00910             for (int i=0 ; i<nr ; i++) {
00911 
00912             *p_r = ( (g->x)[i] + aa(i) * ff(l, k, j, 0) 
00913                        + bb(i) * gg(l, k, j, 0) 
00914                        + beta[l]/alpha[l]        )  /
00915                    ( ( 1. + da(i) * ff(l, k, j, 0) 
00916                       + db(i) * gg(l, k, j, 0) ) *
00917                  ( (g->x)[i] + beta[l]/alpha[l] ) ) ;           
00918             
00919             p_r++ ;
00920             }       // Fin de boucle sur r
00921         }   // Fin de boucle sur theta
00922         }       // Fin de boucle sur phi
00923         break ;
00924         }
00925 
00926         case UNSURR: {
00927         
00928         const Tbl& asxm1 = cv->zaasx ; 
00929 
00930         for (int k=0 ; k<np ; k++) {
00931         for (int j=0 ; j<nt ; j++) {
00932             for (int i=0 ; i<nr ; i++) {
00933             
00934             *p_r = ( 1. + asxm1(i) * ff(l, k, j, 0) ) /
00935                    ( 1. + da(i) * ff(l, k, j, 0)    ) ; 
00936             
00937             p_r++ ;
00938             }       // Fin de boucle sur r
00939         }   // Fin de boucle sur theta
00940         }       // Fin de boucle sur phi
00941         break ; 
00942         }    
00943 
00944         default: {
00945         cout << "map_et_fait_rsxdxdr: unknown type_r !" << endl ;
00946         abort() ;
00947         }
00948     }       // Fin du switch
00949     }           // Fin de boucle sur zone
00950 
00951     // Termine
00952     return mti ;
00953 } 
00954 
00955 /*
00956  ******************************************************************************
00957  * [ R/ (alpha_l x + beta_l) ]^2 (dR/dx) /alpha_l   ds. le noyau et les coquilles
00958  * dU/dx /alpha_l                   ds. la ZEC
00959  ******************************************************************************
00960  */
00961 
00962 Mtbl* map_et_fait_rsx2drdx(const Map* cvi) {
00963 
00964     // recup du changement de variable
00965     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
00966     const Mg3d* mg = cv->get_mg() ;
00967     int nz = mg->get_nzone() ;
00968     
00969     // Le resultat
00970     Mtbl* mti = new Mtbl(mg) ;
00971     mti->set_etat_qcq() ;
00972     
00973     // Pour le confort
00974     const double* alpha = cv->alpha ;
00975     const double* beta = cv->beta ;
00976     const Valeur& ff = cv->ff ; 
00977     const Valeur& gg = cv->gg ; 
00978     
00979     for (int l=0 ; l<nz ; l++) {
00980 
00981     const Grille3d* g = mg->get_grille3d(l) ;
00982 
00983     int nr = mg->get_nr(l);
00984     int nt = mg->get_nt(l) ;
00985     int np = mg->get_np(l) ;
00986 
00987     const Tbl& aa = *((cv->aa)[l]) ; 
00988     const Tbl& bb = *((cv->bb)[l]) ; 
00989     const Tbl& da = *((cv->daa)[l]) ; 
00990     const Tbl& db = *((cv->dbb)[l]) ; 
00991 
00992     Tbl* tb = (mti->t)[l] ;
00993     tb->set_etat_qcq() ;
00994     double* p_r = tb->t ;
00995     
00996     switch(mg->get_type_r(l)) {
00997     
00998         case RARE: {
00999         
01000         const Tbl& asx = cv->aasx ; 
01001         const Tbl& bsx = cv->bbsx ; 
01002         
01003         for (int k=0 ; k<np ; k++) {
01004         for (int j=0 ; j<nt ; j++) {
01005             for (int i=0 ; i<nr ; i++) {
01006 
01007             double ww =  1. + asx(i) * ff(l, k, j, 0)
01008                         + bsx(i) * gg(l, k, j, 0) ;
01009 
01010             *p_r = ww * ww * 
01011                    ( 1. + da(i) * ff(l, k, j, 0) 
01012                     + db(i) * gg(l, k, j, 0) ) ; 
01013             p_r++ ;
01014             }       // Fin de boucle sur r
01015         }   // Fin de boucle sur theta
01016         }       // Fin de boucle sur phi
01017         break ; 
01018         }
01019 
01020         case FINJAC: {
01021         for (int k=0 ; k<np ; k++) {
01022         for (int j=0 ; j<nt ; j++) {
01023             for (int i=0 ; i<nr ; i++) {
01024 
01025             double ww = ( (g->x)[i] + aa(i) * ff(l, k, j, 0)
01026                         + bb(i) * gg(l, k, j, 0) 
01027                         + beta[l]/alpha[l]    )  /
01028                     ( (g->x)[i] + beta[l]/alpha[l] ) ; 
01029 
01030             *p_r = ww * ww * 
01031                    ( 1. + da(i) * ff(l, k, j, 0) 
01032                     + db(i) * gg(l, k, j, 0) ) ;            
01033             
01034             p_r++ ;
01035             }       // Fin de boucle sur r
01036         }   // Fin de boucle sur theta
01037         }       // Fin de boucle sur phi
01038         break ;
01039         }
01040 
01041             
01042         case FIN: {
01043         for (int k=0 ; k<np ; k++) {
01044         for (int j=0 ; j<nt ; j++) {
01045             for (int i=0 ; i<nr ; i++) {
01046 
01047             double ww = ( (g->x)[i] + aa(i) * ff(l, k, j, 0)
01048                         + bb(i) * gg(l, k, j, 0) 
01049                         + beta[l]/alpha[l]    )  /
01050                     ( (g->x)[i] + beta[l]/alpha[l] ) ; 
01051 
01052             *p_r = ww * ww * 
01053                    ( 1. + da(i) * ff(l, k, j, 0) 
01054                     + db(i) * gg(l, k, j, 0) ) ;            
01055             
01056             p_r++ ;
01057             }       // Fin de boucle sur r
01058         }   // Fin de boucle sur theta
01059         }       // Fin de boucle sur phi
01060         break ;
01061         }
01062 
01063         case UNSURR: {
01064         
01065         for (int k=0 ; k<np ; k++) {
01066         for (int j=0 ; j<nt ; j++) {
01067             for (int i=0 ; i<nr ; i++) {
01068             
01069             *p_r =  1. + da(i) * ff(l, k, j, 0) ;
01070             
01071             p_r++ ;
01072             }       // Fin de boucle sur r
01073         }   // Fin de boucle sur theta
01074         }       // Fin de boucle sur phi
01075         break ; 
01076         }    
01077 
01078         default: {
01079         cout << "map_et_fait_rsx2drdx: unknown type_r !" << endl ;
01080         abort() ;
01081         }
01082     }       // Fin du switch
01083     }           // Fin de boucle sur zone
01084 
01085     // Termine
01086     return mti ;
01087 } 
01088 
01089 
01090 
01092 //      Derivees d'ordre 2 du changement de variables       //
01094 
01095 
01096 /*
01097  *******************************************************************************
01098  *              d^2R/dx^2       ( dans la ZEC: - d^2U/dx^2 )
01099  *******************************************************************************
01100  */
01101 
01102 Mtbl* map_et_fait_d2rdx2(const Map* cvi) {
01103 
01104     // recup du changement de variable
01105     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
01106     const Mg3d* mg = cv->get_mg() ;
01107     int nz = mg->get_nzone() ;
01108     
01109     // Le resultat
01110     Mtbl* mti = new Mtbl(mg) ;
01111     mti->set_etat_qcq() ;
01112     
01113     // Pour le confort
01114     const double* alpha = cv->alpha ;
01115     const Valeur& ff = cv->ff ; 
01116     const Valeur& gg = cv->gg ; 
01117     
01118     for (int l=0 ; l<nz ; l++) {
01119 
01120     int nr = mg->get_nr(l);
01121     int nt = mg->get_nt(l) ;
01122     int np = mg->get_np(l) ;
01123 
01124     const Tbl& dda = *((cv->ddaa)[l]) ; 
01125     const Tbl& ddb = *((cv->ddbb)[l]) ; 
01126 
01127     Tbl* tb = (mti->t)[l] ;
01128     tb->set_etat_qcq() ;
01129     double* p_r = tb->t ;
01130     
01131     switch(mg->get_type_r(l)) {
01132     
01133         case FIN: case RARE: case FINJAC: {
01134         for (int k=0 ; k<np ; k++) {
01135         for (int j=0 ; j<nt ; j++) {
01136             for (int i=0 ; i<nr ; i++) {
01137             
01138             *p_r = alpha[l] * (   dda(i) * ff(l, k, j, 0)
01139                         + ddb(i) * gg(l, k, j, 0) ) ;
01140             p_r++ ;
01141             }       // Fin de boucle sur r
01142         }   // Fin de boucle sur theta
01143         }       // Fin de boucle sur phi
01144         break ; 
01145         }
01146             
01147         case UNSURR: {
01148         for (int k=0 ; k<np ; k++) {
01149         for (int j=0 ; j<nt ; j++) {
01150             for (int i=0 ; i<nr ; i++) {
01151 
01152             *p_r = -  alpha[l] * dda(i) * ff(l, k, j, 0) ;
01153             p_r++ ;
01154             }       // Fin de boucle sur r
01155         }   // Fin de boucle sur theta
01156         }       // Fin de boucle sur phi
01157         break ; 
01158         } 
01159 
01160         default: {
01161         cout << "map_et_fait_d2rdx2: unknown type_r !" << endl ;
01162         abort() ;
01163         }
01164     }       // Fin du switch
01165     }           // Fin de boucle sur zone
01166 
01167     // Termine
01168     return mti ;
01169 } 
01170 
01171 /*
01172  *****************************************************************************
01173  *  1/R^2 (  1/sin(th) d/dth( sin(th) dR/dth ) + 1/sin(th)^2 d^2R/dphi^2  )         
01174  *
01175  * [ dans la ZEC : 
01176  *  - 1/U^2 (  1/sin(th) d/dth( sin(th) dU/dth ) + 1/sin(th)^2 d^2U/dphi^2  )  ]            
01177  *****************************************************************************
01178  */
01179 
01180 Mtbl* map_et_fait_lapr_tp(const Map* cvi) {
01181 
01182     // recup du changement de variable
01183     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
01184     const Mg3d* mg = cv->get_mg() ;
01185     int nz = mg->get_nzone() ;
01186     
01187     // Le resultat
01188     Mtbl* mti = new Mtbl(mg) ;
01189     mti->set_etat_qcq() ;
01190     
01191     // Pour le confort
01192     const double* alpha = cv->alpha ;
01193     const double* beta = cv->beta ;
01194     const Valeur& ff = cv->ff ; 
01195     const Valeur& gg = cv->gg ; 
01196 
01197     Valeur ff_tmp = ff ; 
01198     Valeur gg_tmp = gg ; 
01199     ff_tmp.ylm() ; 
01200     gg_tmp.ylm() ; 
01201     const Valeur& lapff = ff_tmp.lapang() ; 
01202     const Valeur& lapgg = gg_tmp.lapang() ; 
01203 
01204     
01205     for (int l=0 ; l<nz ; l++) {
01206 
01207     const Grille3d* g = mg->get_grille3d(l) ;
01208 
01209     int nr = mg->get_nr(l);
01210     int nt = mg->get_nt(l) ;
01211     int np = mg->get_np(l) ;
01212 
01213     const Tbl& aa = *((cv->aa)[l]) ; 
01214     const Tbl& bb = *((cv->bb)[l]) ; 
01215 
01216     Tbl* tb = (mti->t)[l] ;
01217     tb->set_etat_qcq() ;
01218     double* p_r = tb->t ;
01219     
01220     switch(mg->get_type_r(l)) {
01221     
01222         case RARE: {
01223         
01224         const Tbl& asx = cv->aasx ; 
01225         const Tbl& bsx = cv->bbsx ; 
01226         const Tbl& asx2 = cv->aasx2 ; 
01227         const Tbl& bsx2 = cv->bbsx2 ; 
01228         
01229         for (int k=0 ; k<np ; k++) {
01230         for (int j=0 ; j<nt ; j++) {
01231             for (int i=0 ; i<nr ; i++) {
01232             
01233             double ww =  1. + asx(i) * ff(l, k, j, 0)
01234                         + bsx(i) * gg(l, k, j, 0) ;
01235             
01236             *p_r =  (   asx2(i) * lapff(l, k, j, 0) 
01237                   + bsx2(i) * lapgg(l, k, j, 0)  ) /
01238                 (alpha[l] * ww*ww) ; 
01239             p_r++ ;
01240             }       // Fin de boucle sur r
01241         }   // Fin de boucle sur theta
01242         }       // Fin de boucle sur phi
01243         break ; 
01244         }
01245 
01246         case FINJAC: {
01247         for (int k=0 ; k<np ; k++) {
01248         for (int j=0 ; j<nt ; j++) {
01249             for (int i=0 ; i<nr ; i++) {
01250 
01251             double ww = alpha[l] * (
01252                     (g->x)[i] + aa(i) * ff(l, k, j, 0)
01253                           + bb(i) * gg(l, k, j, 0) ) 
01254                       + beta[l] ; 
01255 
01256             *p_r = alpha[l] * (   aa(i) * lapff(l, k, j, 0)
01257                         + bb(i) * lapgg(l, k, j, 0) )
01258                 / ( ww*ww ) ; 
01259             p_r++ ;
01260             }       // Fin de boucle sur r
01261         }   // Fin de boucle sur theta
01262         }       // Fin de boucle sur phi
01263         break ;
01264         }
01265 
01266             
01267         case FIN: {
01268         for (int k=0 ; k<np ; k++) {
01269         for (int j=0 ; j<nt ; j++) {
01270             for (int i=0 ; i<nr ; i++) {
01271 
01272             double ww = alpha[l] * (
01273                     (g->x)[i] + aa(i) * ff(l, k, j, 0)
01274                           + bb(i) * gg(l, k, j, 0) ) 
01275                       + beta[l] ; 
01276 
01277             *p_r = alpha[l] * (   aa(i) * lapff(l, k, j, 0)
01278                         + bb(i) * lapgg(l, k, j, 0) )
01279                 / ( ww*ww ) ; 
01280             p_r++ ;
01281             }       // Fin de boucle sur r
01282         }   // Fin de boucle sur theta
01283         }       // Fin de boucle sur phi
01284         break ;
01285         }
01286 
01287         case UNSURR: {
01288         
01289         const Tbl& asxm1 = cv->zaasx ; 
01290         const Tbl& asxm1car = cv->zaasx2 ; 
01291 
01292         for (int k=0 ; k<np ; k++) {
01293         for (int j=0 ; j<nt ; j++) {
01294             for (int i=0 ; i<nr ; i++) {
01295             
01296             double ww = 1. + asxm1(i) * ff(l, k, j, 0) ;
01297             
01298             *p_r = - asxm1car(i) * lapff(l, k, j, 0)
01299                 /  ( alpha[l] * ww*ww ) ;
01300             p_r++ ;
01301             }       // Fin de boucle sur r
01302         }   // Fin de boucle sur theta
01303         }       // Fin de boucle sur phi
01304         break ; 
01305         }    
01306 
01307         default: {
01308         cout << "map_et_fait_lapr_tp: unknown type_r !" << endl ;
01309         abort() ;
01310         }
01311     }       // Fin du switch
01312     }           // Fin de boucle sur zone
01313 
01314     // Termine
01315     return mti ;
01316 } 
01317 
01318 /*
01319  *******************************************************************************
01320  *              d^2R/dthdx      ( dans la ZEC: - d^2U/dthdx )
01321  *******************************************************************************
01322  */
01323 
01324 Mtbl* map_et_fait_d2rdtdx(const Map* cvi) {
01325 
01326     // recup du changement de variable
01327     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
01328     const Mg3d* mg = cv->get_mg() ;
01329     int nz = mg->get_nzone() ;
01330     
01331     // Le resultat
01332     Mtbl* mti = new Mtbl(mg) ;
01333     mti->set_etat_qcq() ;
01334     
01335     // Pour le confort
01336     const double* alpha = cv->alpha ;
01337     const Valeur& ff = cv->ff ; 
01338     const Valeur& gg = cv->gg ; 
01339     const Valeur& dffdt = ff.dsdt() ; 
01340     const Valeur& dggdt = gg.dsdt() ; 
01341     
01342     for (int l=0 ; l<nz ; l++) {
01343 
01344     int nr = mg->get_nr(l);
01345     int nt = mg->get_nt(l) ;
01346     int np = mg->get_np(l) ;
01347 
01348     const Tbl& da = *((cv->daa)[l]) ; 
01349     const Tbl& db = *((cv->dbb)[l]) ; 
01350 
01351     Tbl* tb = (mti->t)[l] ;
01352     tb->set_etat_qcq() ;
01353     double* p_r = tb->t ;
01354     
01355     switch(mg->get_type_r(l)) {
01356     
01357         case FIN: case RARE: case FINJAC: {
01358         for (int k=0 ; k<np ; k++) {
01359         for (int j=0 ; j<nt ; j++) {
01360             for (int i=0 ; i<nr ; i++) {
01361             
01362             *p_r = alpha[l] * (   da(i) * dffdt(l, k, j, 0)
01363                         + db(i) * dggdt(l, k, j, 0) ) ;
01364             p_r++ ;
01365             }       // Fin de boucle sur r
01366         }   // Fin de boucle sur theta
01367         }       // Fin de boucle sur phi
01368         break ; 
01369         }
01370             
01371         case UNSURR: {
01372         for (int k=0 ; k<np ; k++) {
01373         for (int j=0 ; j<nt ; j++) {
01374             for (int i=0 ; i<nr ; i++) {
01375 
01376             *p_r = -  alpha[l] * da(i) * dffdt(l, k, j, 0) ;
01377             p_r++ ;
01378             }       // Fin de boucle sur r
01379         }   // Fin de boucle sur theta
01380         }       // Fin de boucle sur phi
01381         break ; 
01382         } 
01383 
01384         default: {
01385         cout << "map_et_fait_d2rdtdx: unknown type_r !" << endl ;
01386         abort() ;
01387         }
01388     }       // Fin du switch
01389     }           // Fin de boucle sur zone
01390 
01391     // Termine
01392     return mti ;
01393 } 
01394 
01395 /*
01396  *******************************************************************************
01397  *      1/sin(th) d^2R/dphidx   ( dans la ZEC: - 1/sin(th) d^2U/dphidx )
01398  *******************************************************************************
01399  */
01400 
01401 Mtbl* map_et_fait_sstd2rdpdx(const Map* cvi) {
01402 
01403     // recup du changement de variable
01404     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
01405     const Mg3d* mg = cv->get_mg() ;
01406     int nz = mg->get_nzone() ;
01407     
01408     // Le resultat
01409     Mtbl* mti = new Mtbl(mg) ;
01410     mti->set_etat_qcq() ;
01411     
01412     // Pour le confort
01413     const double* alpha = cv->alpha ;
01414     const Valeur& ff = cv->ff ; 
01415     const Valeur& gg = cv->gg ; 
01416     const Valeur& stdffdp = ff.stdsdp() ; 
01417     const Valeur& stdggdp = gg.stdsdp() ; 
01418     
01419     for (int l=0 ; l<nz ; l++) {
01420 
01421     int nr = mg->get_nr(l);
01422     int nt = mg->get_nt(l) ;
01423     int np = mg->get_np(l) ;
01424 
01425     const Tbl& da = *((cv->daa)[l]) ; 
01426     const Tbl& db = *((cv->dbb)[l]) ; 
01427 
01428     Tbl* tb = (mti->t)[l] ;
01429     tb->set_etat_qcq() ;
01430     double* p_r = tb->t ;
01431     
01432     switch(mg->get_type_r(l)) {
01433     
01434         case FIN: case RARE: case FINJAC: {
01435         for (int k=0 ; k<np ; k++) {
01436         for (int j=0 ; j<nt ; j++) {
01437             for (int i=0 ; i<nr ; i++) {
01438             
01439             *p_r = alpha[l] * (   da(i) * stdffdp(l, k, j, 0)
01440                         + db(i) * stdggdp(l, k, j, 0) ) ;
01441             p_r++ ;
01442             }       // Fin de boucle sur r
01443         }   // Fin de boucle sur theta
01444         }       // Fin de boucle sur phi
01445         break ; 
01446         }
01447             
01448         case UNSURR: {
01449         for (int k=0 ; k<np ; k++) {
01450         for (int j=0 ; j<nt ; j++) {
01451             for (int i=0 ; i<nr ; i++) {
01452 
01453             *p_r = -  alpha[l] * da(i) * stdffdp(l, k, j, 0) ;
01454             p_r++ ;
01455             }       // Fin de boucle sur r
01456         }   // Fin de boucle sur theta
01457         }       // Fin de boucle sur phi
01458         break ; 
01459         } 
01460 
01461         default: {
01462         cout << "map_et_fait_sstd2rdpdx: unknown type_r !" << endl ;
01463         abort() ;
01464         }
01465     }       // Fin du switch
01466     }           // Fin de boucle sur zone
01467 
01468     // Termine
01469     return mti ;
01470 } 
01471 
01472 /*
01473  *******************************************************************************
01474  *      1/R^2 d^2R/dtheta^2 ( dans la ZEC: - 1/U^2 d^2U/dth^2 )
01475  *******************************************************************************
01476  */
01477 
01478 Mtbl* map_et_fait_sr2d2rdt2(const Map* cvi) {
01479 
01480     // recup du changement de variable
01481     const Map_et* cv = static_cast<const Map_et*>(cvi) ;
01482     const Mg3d* mg = cv->get_mg() ;
01483     int nz = mg->get_nzone() ;
01484     
01485     // Le resultat
01486     Mtbl* mti = new Mtbl(mg) ;
01487     mti->set_etat_qcq() ;
01488     
01489     // Pour le confort
01490     const double* alpha = cv->alpha ;
01491     const double* beta = cv->beta ;
01492     const Valeur& ff = cv->ff ; 
01493     const Valeur& gg = cv->gg ; 
01494     const Valeur& d2ffdt2 = ff.d2sdt2() ; 
01495     const Valeur& d2ggdt2 = gg.d2sdt2() ; 
01496 
01497     
01498     for (int l=0 ; l<nz ; l++) {
01499 
01500     const Grille3d* g = mg->get_grille3d(l) ;
01501 
01502     int nr = mg->get_nr(l);
01503     int nt = mg->get_nt(l) ;
01504     int np = mg->get_np(l) ;
01505 
01506     const Tbl& aa = *((cv->aa)[l]) ; 
01507     const Tbl& bb = *((cv->bb)[l]) ; 
01508 
01509     Tbl* tb = (mti->t)[l] ;
01510     tb->set_etat_qcq() ;
01511     double* p_r = tb->t ;
01512     
01513     switch(mg->get_type_r(l)) {
01514     
01515         case RARE: {
01516         
01517         const Tbl& asx = cv->aasx ; 
01518         const Tbl& bsx = cv->bbsx ; 
01519         const Tbl& asx2 = cv->aasx2 ; 
01520         const Tbl& bsx2 = cv->bbsx2 ; 
01521         
01522         for (int k=0 ; k<np ; k++) {
01523         for (int j=0 ; j<nt ; j++) {
01524             for (int i=0 ; i<nr ; i++) {
01525             
01526             double ww =  1. + asx(i) * ff(l, k, j, 0)
01527                         + bsx(i) * gg(l, k, j, 0) ;
01528             
01529             *p_r =  (   asx2(i) * d2ffdt2(l, k, j, 0) 
01530                   + bsx2(i) * d2ggdt2(l, k, j, 0)  ) /
01531                 (alpha[l] * ww*ww) ; 
01532             p_r++ ;
01533             }       // Fin de boucle sur r
01534         }   // Fin de boucle sur theta
01535         }       // Fin de boucle sur phi
01536         break ; 
01537         }
01538 
01539         case FINJAC: {
01540         for (int k=0 ; k<np ; k++) {
01541         for (int j=0 ; j<nt ; j++) {
01542             for (int i=0 ; i<nr ; i++) {
01543 
01544             double ww = alpha[l] * (
01545                     (g->x)[i] + aa(i) * ff(l, k, j, 0)
01546                           + bb(i) * gg(l, k, j, 0) ) 
01547                       + beta[l] ; 
01548 
01549             *p_r = alpha[l] * (   aa(i) * d2ffdt2(l, k, j, 0)
01550                         + bb(i) * d2ggdt2(l, k, j, 0) )
01551                 / ( ww*ww ) ; 
01552             p_r++ ;
01553             }       // Fin de boucle sur r
01554         }   // Fin de boucle sur theta
01555         }       // Fin de boucle sur phi
01556         break ;
01557         }
01558 
01559             
01560         case FIN: {
01561         for (int k=0 ; k<np ; k++) {
01562         for (int j=0 ; j<nt ; j++) {
01563             for (int i=0 ; i<nr ; i++) {
01564 
01565             double ww = alpha[l] * (
01566                     (g->x)[i] + aa(i) * ff(l, k, j, 0)
01567                           + bb(i) * gg(l, k, j, 0) ) 
01568                       + beta[l] ; 
01569 
01570             *p_r = alpha[l] * (   aa(i) * d2ffdt2(l, k, j, 0)
01571                         + bb(i) * d2ggdt2(l, k, j, 0) )
01572                 / ( ww*ww ) ; 
01573             p_r++ ;
01574             }       // Fin de boucle sur r
01575         }   // Fin de boucle sur theta
01576         }       // Fin de boucle sur phi
01577         break ;
01578         }
01579 
01580         case UNSURR: {
01581         
01582         const Tbl& asxm1 = cv->zaasx ; 
01583         const Tbl& asxm1car = cv->zaasx2 ; 
01584 
01585         for (int k=0 ; k<np ; k++) {
01586         for (int j=0 ; j<nt ; j++) {
01587             for (int i=0 ; i<nr ; i++) {
01588             
01589             double ww = 1. + asxm1(i) * ff(l, k, j, 0) ;
01590             
01591             *p_r = - asxm1car(i) * d2ffdt2(l, k, j, 0)
01592                 /  ( alpha[l] * ww*ww ) ;
01593             p_r++ ;
01594             }       // Fin de boucle sur r
01595         }   // Fin de boucle sur theta
01596         }       // Fin de boucle sur phi
01597         break ; 
01598         }    
01599 
01600         default: {
01601         cout << "map_et_fait_sr2d2rdt2: unknown type_r !" << endl ;
01602         abort() ;
01603         }
01604     }       // Fin du switch
01605     }           // Fin de boucle sur zone
01606 
01607     // Termine
01608     return mti ;
01609 } 
01610 

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