map_et_poisson.C

00001 /*
00002  * Method of the class Map_et for the (iterative) resolution of the scalar
00003  *  Poisson equation.
00004  *
00005  * (see file map.h for the documentation).
00006  *
00007  */
00008 
00009 /*
00010  *   Copyright (c) 2004 Francois Limousin
00011  *   Copyright (c) 1999-2003 Eric Gourgoulhon
00012  *   Copyright (c) 2000-2001 Philippe Grandclement
00013  *
00014  *   This file is part of LORENE.
00015  *
00016  *   LORENE is free software; you can redistribute it and/or modify
00017  *   it under the terms of the GNU General Public License as published by
00018  *   the Free Software Foundation; either version 2 of the License, or
00019  *   (at your option) any later version.
00020  *
00021  *   LORENE is distributed in the hope that it will be useful,
00022  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00023  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00024  *   GNU General Public License for more details.
00025  *
00026  *   You should have received a copy of the GNU General Public License
00027  *   along with LORENE; if not, write to the Free Software
00028  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00029  *
00030  */
00031 
00032 
00033 char map_et_poisson_C[] = "$Header: /cvsroot/Lorene/C++/Source/Map/map_et_poisson.C,v 1.6 2005/08/25 12:14:09 p_grandclement Exp $" ;
00034 
00035 
00036 /*
00037  * $Id: map_et_poisson.C,v 1.6 2005/08/25 12:14:09 p_grandclement Exp $
00038  * $Log: map_et_poisson.C,v $
00039  * Revision 1.6  2005/08/25 12:14:09  p_grandclement
00040  * Addition of a new method to solve the scalar Poisson equation, based on a multi-domain Tau-method
00041  *
00042  * Revision 1.5  2005/04/04 21:31:31  e_gourgoulhon
00043  *  Added argument lambda to method poisson_angu
00044  *  to deal with the generalized angular Poisson equation:
00045  *     Lap_ang u + lambda u = source.
00046  *
00047  * Revision 1.4  2004/06/22 12:20:17  j_novak
00048  * *** empty log message ***
00049  *
00050  * Revision 1.3  2004/05/25 14:28:01  f_limousin
00051  * First version of method Map_et::poisson_angu().
00052  *
00053  * Revision 1.2  2003/10/15 21:11:26  e_gourgoulhon
00054  * Added method poisson_angu.
00055  *
00056  * Revision 1.1.1.1  2001/11/20 15:19:27  e_gourgoulhon
00057  * LORENE
00058  *
00059  * Revision 1.7  2000/05/22  14:55:30  phil
00060  * ajout du cas dzpuis = 3
00061  *
00062  * Revision 1.6  2000/03/30  09:18:37  eric
00063  * Modifs affichage.
00064  *
00065  * Revision 1.5  2000/03/29  12:01:38  eric
00066  * *** empty log message ***
00067  *
00068  * Revision 1.4  2000/03/29  11:48:09  eric
00069  * Modifs affichage.
00070  *
00071  * Revision 1.3  2000/03/10  15:48:25  eric
00072  * MODIFS IMPORTANTES:
00073  *   ssj est desormais traitee comme un Cmp (et non plus une Valeur) ce qui
00074  *     permet un traitement automatique du dzpuis associe.
00075  *   Traitement de dzpuis.
00076  *
00077  * Revision 1.2  2000/03/07  16:50:57  eric
00078  * Possibilite d'avoir une source avec dzpuis = 2.
00079  *
00080  * Revision 1.1  1999/12/22  17:11:24  eric
00081  * Initial revision
00082  *
00083  *
00084  * $Header: /cvsroot/Lorene/C++/Source/Map/map_et_poisson.C,v 1.6 2005/08/25 12:14:09 p_grandclement Exp $
00085  *
00086  */
00087 
00088 // Header Lorene:
00089 #include "map.h"
00090 #include "cmp.h"
00091 #include "scalar.h"
00092 #include "param.h"
00093 #include "graphique.h"
00094 
00095 //*****************************************************************************
00096 
00097 void Map_et::poisson(const Cmp& source, Param& par, Cmp& uu) const {
00098 
00099     assert(source.get_etat() != ETATNONDEF) ; 
00100     assert(source.get_mp() == this) ;
00101 
00102     assert( source.check_dzpuis(2) || source.check_dzpuis(4) 
00103         || source.check_dzpuis(3)) ; 
00104      
00105     assert(uu.get_mp() == this) ; 
00106     assert(uu.check_dzpuis(0)) ; 
00107 
00108     int nz = mg->get_nzone() ; 
00109     int nzm1 = nz - 1 ; 
00110     
00111     // Indicator of existence of a compactified external domain
00112     bool zec = false ;      
00113     if (mg->get_type_r(nzm1) == UNSURR) {
00114     zec = true ;
00115     }
00116      
00117     //-------------------------------
00118     // Computation of the prefactor a  ---> Cmp apre
00119     //-------------------------------
00120 
00121     Mtbl unjj = 1 + srdrdt*srdrdt + srstdrdp*srstdrdp ;
00122 
00123     Mtbl apre1(*mg) ; 
00124     apre1.set_etat_qcq() ; 
00125     for (int l=0; l<nz; l++) {
00126     *(apre1.t[l]) = alpha[l]*alpha[l] ; 
00127     }
00128 
00129     apre1 = apre1 * dxdr * dxdr * unjj ;
00130 
00131     Cmp apre(*this) ; 
00132     apre = apre1 ; 
00133     
00134     Tbl amax0 = max(apre1) ;    // maximum values in each domain
00135 
00136     // The maximum values of a in each domain are put in a Mtbl
00137     Mtbl amax1(*mg) ; 
00138     amax1.set_etat_qcq() ; 
00139     for (int l=0; l<nz; l++) {
00140     *(amax1.t[l]) = amax0(l) ; 
00141     }
00142 
00143     Cmp amax(*this) ; 
00144     amax = amax1 ; 
00145 
00146     
00147     //-------------------
00148     //  Initializations 
00149     //-------------------
00150     
00151     int nitermax = par.get_int() ; 
00152     int& niter = par.get_int_mod() ; 
00153     double lambda = par.get_double() ; 
00154     double unmlambda = 1. - lambda ; 
00155     double precis = par.get_double(1) ;     
00156     
00157     Cmp& ssj = par.get_cmp_mod() ; 
00158     
00159     Cmp ssjm1 = ssj ; 
00160     Cmp ssjm2 = ssjm1 ; 
00161 
00162     Valeur& vuu = uu.va ; 
00163 
00164     Valeur vuujm1(*mg) ;
00165     if (uu.get_etat() == ETATZERO) {
00166     vuujm1 = 1 ;    // to take relative differences
00167     vuujm1.set_base( vuu.base ) ; 
00168     }
00169     else{
00170     vuujm1 = vuu ; 
00171     }
00172     
00173     // Affine mapping for the Laplacian-tilde
00174 
00175     Map_af mpaff(*this) ; 
00176     Param par_nul ; 
00177 
00178     cout << "Map_et::poisson : relat. diff. u^J <-> u^{J-1} : " << endl ;
00179     
00180 //==========================================================================
00181 //==========================================================================
00182 //              Start of iteration 
00183 //==========================================================================
00184 //==========================================================================
00185 
00186     Tbl tdiff(nz) ; 
00187     double diff ; 
00188     niter = 0 ; 
00189     
00190     do {
00191 
00192     //====================================================================
00193     //      Computation of R(u)    (the result is put in uu)
00194     //====================================================================
00195 
00196 
00197     //-----------------------
00198     // First operations on uu
00199     //-----------------------
00200     
00201     Valeur duudx = (uu.va).dsdx() ;     // d/dx 
00202 
00203     const Valeur& d2uudtdx = duudx.dsdt() ;     // d^2/dxdtheta
00204 
00205     const Valeur& std2uudpdx = duudx.stdsdp() ;    // 1/sin(theta) d^2/dxdphi   
00206 
00207     //------------------
00208     // Angular Laplacian 
00209     //------------------
00210     
00211     Valeur sxlapang = uu.va ; 
00212 
00213     sxlapang.ylm() ; 
00214     
00215     sxlapang = sxlapang.lapang() ;    
00216     
00217     sxlapang = sxlapang.sx() ;    //  Lap_ang(uu) /x      in the nucleus
00218                   //  Lap_ang(uu)         in the shells
00219                   //  Lap_ang(uu) /(x-1)  in the ZEC
00220     
00221     //---------------------------------------------------------------
00222     //  Computation of 
00223     // [ 2 /(dRdx) ( A - 1 ) duu/dx + 1/R (B - 1) Lap_ang(uu) ] / x
00224     //
00225     // with A = 1/(dRdx) R/(x+beta_l/alpha_l) unjj 
00226     //      B = [1/(dRdx) R/(x+beta_l/alpha_l)]^2 unjj 
00227     // 
00228     //  The result is put in uu (via vuu)
00229     //---------------------------------------------------------------
00230 
00231     Valeur varduudx = duudx ; 
00232 
00233     if (zec) {
00234     varduudx.annule(nzm1) ;     // term in d/dx set to zero in the ZEC
00235     }
00236 
00237     uu.set_etat_qcq() ; 
00238     
00239     Base_val sauve_base = varduudx.base ; 
00240 
00241     vuu = 2. * dxdr * ( rsxdxdr * unjj - 1.) * varduudx 
00242         + ( rsxdxdr*rsxdxdr * unjj - 1.) * xsr * sxlapang ; 
00243 
00244     vuu.set_base(sauve_base) ; 
00245 
00246     vuu = vuu.sx() ; 
00247 
00248     //---------------------------------------
00249     // Computation of  R(u)  
00250     //
00251     //  The result is put in uu (via vuu)
00252     //---------------------------------------
00253 
00254 
00255     sauve_base = vuu.base ; 
00256  
00257     vuu =  xsr * vuu 
00258         + 2. * dxdr * ( sr2drdt * d2uudtdx 
00259                   + sr2stdrdp * std2uudpdx ) ;
00260  
00261     vuu += dxdr * ( lapr_tp + dxdr * ( 
00262         dxdr* unjj * d2rdx2 
00263         - 2. * ( sr2drdt * d2rdtdx  + sr2stdrdp * sstd2rdpdx ) ) 
00264                  ) * duudx ;            
00265 
00266     vuu.set_base(sauve_base) ; 
00267 
00268     // Since the assignment is performed on vuu (uu.va), the treatment
00269     //  of uu.dzpuis must be performed by hand:
00270     
00271     uu.set_dzpuis(4) ; 
00272 
00273     if (source.get_dzpuis() == 2) {
00274     uu.dec2_dzpuis() ;          // uu.dzpuis: 4 -> 2
00275     }
00276     
00277     if (source.get_dzpuis() == 3) {
00278     uu.dec_dzpuis() ;       //uu.dzpuis 4 -> 3
00279     }
00280     
00281     //====================================================================
00282     //   Computation of the effective source s^J of the ``affine''
00283     //     Poisson equation 
00284     //====================================================================
00285     
00286     ssj = lambda * ssjm1 + unmlambda * ssjm2 ; 
00287     
00288     ssj = ( source + uu + (amax - apre) * ssj ) / amax ; 
00289 
00290     (ssj.va).set_base((source.va).base) ; 
00291     
00292     //====================================================================
00293     //   Resolution of the ``affine'' Poisson equation 
00294     //====================================================================
00295     
00296     if ( source.get_dzpuis() == 0 ){
00297     ssj.set_dzpuis( 4 ) ;
00298     }
00299     else {
00300     ssj.set_dzpuis( source.get_dzpuis() ) ;    // Choice of the resolution 
00301                            //  dzpuis = 2, 3 or 4
00302     }
00303 
00304     assert( uu.check_dzpuis( ssj.get_dzpuis() ) ) ; 
00305             
00306     mpaff.poisson(ssj, par_nul, uu) ; 
00307 
00308     tdiff = diffrel(vuu, vuujm1) ; 
00309 
00310     diff = max(tdiff) ;
00311     
00312 
00313     cout << "  step " << niter << " :  " ; 
00314     for (int l=0; l<nz; l++) {
00315     cout << tdiff(l) << "  " ;  
00316     }
00317     cout << endl ; 
00318 
00319     //=================================
00320     //  Updates for the next iteration
00321     //=================================
00322     
00323     ssjm2 = ssjm1 ; 
00324     ssjm1 = ssj ; 
00325     vuujm1 = vuu ; 
00326     
00327     niter++ ; 
00328     
00329     }   // End of iteration 
00330     while ( (diff > precis) && (niter < nitermax) ) ;
00331     
00332 //==========================================================================
00333 //==========================================================================
00334 //              End of iteration 
00335 //==========================================================================
00336 //==========================================================================
00337 
00338 }
00339 
00340 
00341 
00342 //*****************************************************************************
00343 // VERSION WITH A TAU METHOD
00344 //*****************************************************************************
00345 
00346 void Map_et::poisson_tau(const Cmp& source, Param& par, Cmp& uu) const {
00347 
00348     assert(source.get_etat() != ETATNONDEF) ; 
00349     assert(source.get_mp() == this) ;
00350 
00351     assert( source.check_dzpuis(2) || source.check_dzpuis(4) 
00352         || source.check_dzpuis(3)) ; 
00353      
00354     assert(uu.get_mp() == this) ; 
00355     assert(uu.check_dzpuis(0)) ; 
00356 
00357     int nz = mg->get_nzone() ; 
00358     int nzm1 = nz - 1 ; 
00359     
00360     // Indicator of existence of a compactified external domain
00361     bool zec = false ;      
00362     if (mg->get_type_r(nzm1) == UNSURR) {
00363     zec = true ;
00364     }
00365      
00366     //-------------------------------
00367     // Computation of the prefactor a  ---> Cmp apre
00368     //-------------------------------
00369 
00370     Mtbl unjj = 1 + srdrdt*srdrdt + srstdrdp*srstdrdp ;
00371 
00372     Mtbl apre1(*mg) ; 
00373     apre1.set_etat_qcq() ; 
00374     for (int l=0; l<nz; l++) {
00375     *(apre1.t[l]) = alpha[l]*alpha[l] ; 
00376     }
00377 
00378     apre1 = apre1 * dxdr * dxdr * unjj ;
00379 
00380     Cmp apre(*this) ; 
00381     apre = apre1 ; 
00382     
00383     Tbl amax0 = max(apre1) ;    // maximum values in each domain
00384 
00385     // The maximum values of a in each domain are put in a Mtbl
00386     Mtbl amax1(*mg) ; 
00387     amax1.set_etat_qcq() ; 
00388     for (int l=0; l<nz; l++) {
00389     *(amax1.t[l]) = amax0(l) ; 
00390     }
00391 
00392     Cmp amax(*this) ; 
00393     amax = amax1 ; 
00394 
00395     
00396     //-------------------
00397     //  Initializations 
00398     //-------------------
00399     
00400     int nitermax = par.get_int() ; 
00401     int& niter = par.get_int_mod() ; 
00402     double lambda = par.get_double() ; 
00403     double unmlambda = 1. - lambda ; 
00404     double precis = par.get_double(1) ;     
00405     
00406     Cmp& ssj = par.get_cmp_mod() ; 
00407     
00408     Cmp ssjm1 = ssj ; 
00409     Cmp ssjm2 = ssjm1 ; 
00410 
00411     Valeur& vuu = uu.va ; 
00412 
00413     Valeur vuujm1(*mg) ;
00414     if (uu.get_etat() == ETATZERO) {
00415     vuujm1 = 1 ;    // to take relative differences
00416     vuujm1.set_base( vuu.base ) ; 
00417     }
00418     else{
00419     vuujm1 = vuu ; 
00420     }
00421     
00422     // Affine mapping for the Laplacian-tilde
00423 
00424     Map_af mpaff(*this) ; 
00425     Param par_nul ; 
00426 
00427     cout << "Map_et::poisson_tau : relat. diff. u^J <-> u^{J-1} : " << endl ;
00428     
00429 //==========================================================================
00430 //==========================================================================
00431 //              Start of iteration 
00432 //==========================================================================
00433 //==========================================================================
00434 
00435     Tbl tdiff(nz) ; 
00436     double diff ; 
00437     niter = 0 ; 
00438     
00439     do {
00440 
00441     //====================================================================
00442     //      Computation of R(u)    (the result is put in uu)
00443     //====================================================================
00444 
00445 
00446     //-----------------------
00447     // First operations on uu
00448     //-----------------------
00449     
00450     Valeur duudx = (uu.va).dsdx() ;     // d/dx 
00451 
00452     const Valeur& d2uudtdx = duudx.dsdt() ;     // d^2/dxdtheta
00453 
00454     const Valeur& std2uudpdx = duudx.stdsdp() ;    // 1/sin(theta) d^2/dxdphi   
00455 
00456     //------------------
00457     // Angular Laplacian 
00458     //------------------
00459     
00460     Valeur sxlapang = uu.va ; 
00461 
00462     sxlapang.ylm() ; 
00463     
00464     sxlapang = sxlapang.lapang() ;    
00465     
00466     sxlapang = sxlapang.sx() ;    //  Lap_ang(uu) /x      in the nucleus
00467                   //  Lap_ang(uu)         in the shells
00468                   //  Lap_ang(uu) /(x-1)  in the ZEC
00469     
00470     //---------------------------------------------------------------
00471     //  Computation of 
00472     // [ 2 /(dRdx) ( A - 1 ) duu/dx + 1/R (B - 1) Lap_ang(uu) ] / x
00473     //
00474     // with A = 1/(dRdx) R/(x+beta_l/alpha_l) unjj 
00475     //      B = [1/(dRdx) R/(x+beta_l/alpha_l)]^2 unjj 
00476     // 
00477     //  The result is put in uu (via vuu)
00478     //---------------------------------------------------------------
00479 
00480     Valeur varduudx = duudx ; 
00481 
00482     if (zec) {
00483     varduudx.annule(nzm1) ;     // term in d/dx set to zero in the ZEC
00484     }
00485 
00486     uu.set_etat_qcq() ; 
00487     
00488     Base_val sauve_base = varduudx.base ; 
00489 
00490     vuu = 2. * dxdr * ( rsxdxdr * unjj - 1.) * varduudx 
00491         + ( rsxdxdr*rsxdxdr * unjj - 1.) * xsr * sxlapang ; 
00492 
00493     vuu.set_base(sauve_base) ; 
00494 
00495     vuu = vuu.sx() ; 
00496 
00497     //---------------------------------------
00498     // Computation of  R(u)  
00499     //
00500     //  The result is put in uu (via vuu)
00501     //---------------------------------------
00502 
00503 
00504     sauve_base = vuu.base ; 
00505  
00506     vuu =  xsr * vuu 
00507         + 2. * dxdr * ( sr2drdt * d2uudtdx 
00508                   + sr2stdrdp * std2uudpdx ) ;
00509  
00510     vuu += dxdr * ( lapr_tp + dxdr * ( 
00511         dxdr* unjj * d2rdx2 
00512         - 2. * ( sr2drdt * d2rdtdx  + sr2stdrdp * sstd2rdpdx ) ) 
00513                  ) * duudx ;            
00514 
00515     vuu.set_base(sauve_base) ; 
00516 
00517     // Since the assignment is performed on vuu (uu.va), the treatment
00518     //  of uu.dzpuis must be performed by hand:
00519     
00520     uu.set_dzpuis(4) ; 
00521 
00522     if (source.get_dzpuis() == 2) {
00523     uu.dec2_dzpuis() ;          // uu.dzpuis: 4 -> 2
00524     }
00525     
00526     if (source.get_dzpuis() == 3) {
00527     uu.dec_dzpuis() ;       //uu.dzpuis 4 -> 3
00528     }
00529     
00530     //====================================================================
00531     //   Computation of the effective source s^J of the ``affine''
00532     //     Poisson equation 
00533     //====================================================================
00534     
00535     ssj = lambda * ssjm1 + unmlambda * ssjm2 ; 
00536     
00537     ssj = ( source + uu + (amax - apre) * ssj ) / amax ; 
00538 
00539     (ssj.va).set_base((source.va).base) ; 
00540     
00541     //====================================================================
00542     //   Resolution of the ``affine'' Poisson equation 
00543     //====================================================================
00544     
00545     if ( source.get_dzpuis() == 0 ){
00546     ssj.set_dzpuis( 4 ) ;
00547     }
00548     else {
00549     ssj.set_dzpuis( source.get_dzpuis() ) ;    // Choice of the resolution 
00550                            //  dzpuis = 2, 3 or 4
00551     }
00552 
00553     assert( uu.check_dzpuis( ssj.get_dzpuis() ) ) ; 
00554             
00555     mpaff.poisson_tau(ssj, par_nul, uu) ; 
00556 
00557     tdiff = diffrel(vuu, vuujm1) ; 
00558 
00559     diff = max(tdiff) ;
00560     
00561 
00562     cout << "  step " << niter << " :  " ; 
00563     for (int l=0; l<nz; l++) {
00564     cout << tdiff(l) << "  " ;  
00565     }
00566     cout << endl ; 
00567 
00568     //=================================
00569     //  Updates for the next iteration
00570     //=================================
00571     
00572     ssjm2 = ssjm1 ; 
00573     ssjm1 = ssj ; 
00574     vuujm1 = vuu ; 
00575     
00576     niter++ ; 
00577     
00578     }   // End of iteration 
00579     while ( (diff > precis) && (niter < nitermax) ) ;
00580     
00581 //==========================================================================
00582 //==========================================================================
00583 //              End of iteration 
00584 //==========================================================================
00585 //==========================================================================
00586 }
00587 
00588 void Map_et::poisson_angu(const Scalar& source, Param& par, Scalar& uu,
00589     double lambda) const {
00590     
00591     if (lambda != double(0)) {
00592         cout << 
00593         "Map_et::poisson_angu : the case lambda != 0 is not treated yet !"
00594         << endl ; 
00595         abort() ; 
00596     }
00597 
00598     assert(source.get_mp() == *this) ;
00599     assert(uu.get_mp() == *this) ; 
00600 
00601     int nz = mg->get_nzone() ; 
00602     int nzm1 = nz - 1 ; 
00603  
00604     int* nrm6 = new int[nz];
00605     for (int l=0; l<=nzm1; l++) 
00606     nrm6[l] = mg->get_nr(l) - 6 ; 
00607  
00608 //##     // Indicator of existence of a compactified external domain
00609 //     bool zec = false ;       
00610 //     if (mg->get_type_r(nzm1) == UNSURR) {
00611 //  zec = true ;
00612 //     }
00613 
00614     //-------------------
00615     //  Initializations 
00616     //-------------------
00617     
00618     int nitermax = par.get_int() ; 
00619     int& niter = par.get_int_mod() ; 
00620     double relax = par.get_double() ; 
00621     double precis = par.get_double(1) ;     
00622     
00623     Cmp& ssjcmp = par.get_cmp_mod() ; 
00624     
00625     Scalar ssj (ssjcmp) ;
00626     Scalar ssjm1 (ssj) ;
00627  
00628     int dzpuis = source.get_dzpuis() ;
00629     ssj.set_dzpuis(dzpuis) ;
00630     uu.set_dzpuis(dzpuis) ;
00631     ssjm1.set_dzpuis(dzpuis) ;
00632 
00633     Valeur& vuu = uu.set_spectral_va() ;
00634 
00635     Valeur vuujm1(*mg) ;
00636     if (uu.get_etat() == ETATZERO) {
00637     vuujm1 = 1 ;    // to take relative differences
00638     vuujm1.set_base( vuu.base ) ; 
00639     }
00640     else{
00641     vuujm1 = vuu ; 
00642     }
00643  
00644     // Affine mapping for the Laplacian-tilde
00645 
00646     Map_af mpaff(*this) ; 
00647     Param par_nul ; 
00648 
00649     cout << "Map_et::poisson angu : relat. diff. u^J <-> u^{J-1} : " << endl ;
00650     
00651 //==========================================================================
00652 //==========================================================================
00653 //              Start of iteration 
00654 //==========================================================================
00655 //==========================================================================
00656 
00657 
00658     Tbl tdiff(nz) ; 
00659     double diff ; 
00660     niter = 0 ; 
00661     
00662     do {
00663 
00664     //====================================================================
00665     //      Computation of R(u)    (the result is put in uu)
00666     //====================================================================
00667 
00668     //-----------------------
00669     // First operations on uu
00670     //-----------------------
00671     
00672     Valeur duudx = (uu.set_spectral_va()).dsdx() ;      // d/dx 
00673 
00674     const Valeur& d2uudxdx = duudx.dsdx() ;     // d^2/dxdx
00675 
00676 
00677     const Valeur& d2uudtdx = duudx.dsdt() ;     // d^2/dxdtheta
00678 
00679     const Valeur& std2uudpdx = duudx.stdsdp() ;    // 1/sin(theta) d^2/dxdphi  
00680 
00681     //---------------------------------------
00682     // Computation of  R(u)  
00683     //
00684     //  The result is put in uu (via vuu)
00685     //---------------------------------------
00686 
00687     Mtbl unjj = srdrdt*srdrdt + srstdrdp*srstdrdp ;
00688 
00689     Base_val sauve_base = vuu.base ; 
00690 
00691     vuu =  - d2uudxdx * dxdr * dxdr * unjj
00692         + 2. * dxdr * ( sr2drdt * d2uudtdx 
00693                   + sr2stdrdp * std2uudpdx ) ;
00694 
00695     vuu.set_base(sauve_base) ; 
00696 
00697     vuu += dxdr * ( lapr_tp + dxdr * ( 
00698         dxdr * unjj * d2rdx2 
00699         - 2. * ( sr2drdt * d2rdtdx  + sr2stdrdp * sstd2rdpdx ) ) 
00700                  ) * duudx ;            
00701 
00702     vuu.set_base(sauve_base) ; 
00703 
00704     uu.mult_r() ;
00705     uu.mult_r() ;
00706 
00707     //====================================================================
00708     //   Computation of the effective source s^J of the ``affine''
00709     //     Poisson equation 
00710     //====================================================================
00711 
00712     uu.filtre_r(nrm6) ;
00713 //    uu.filtre_phi(1) ;
00714 //    uu.filtre_theta(1) ;
00715  
00716     ssj = source + uu ; 
00717 
00718     ssj = (1-relax) * ssj + relax * ssjm1 ; 
00719  
00720     (ssj.set_spectral_va()).set_base((source.get_spectral_va()).base) ; 
00721 
00722 
00723     //====================================================================
00724     //   Resolution of the ``affine'' Poisson equation 
00725     //====================================================================
00726 
00727     mpaff.poisson_angu(ssj, par_nul, uu) ; 
00728     
00729     tdiff = diffrel(vuu, vuujm1) ; 
00730 
00731     diff = max(tdiff) ;
00732     
00733 
00734     cout << "  step " << niter << " :  " ; 
00735     for (int l=0; l<nz; l++) {
00736     cout << tdiff(l) << "  " ;  
00737     }
00738     cout << endl ; 
00739 
00740     //=================================
00741     //  Updates for the next iteration
00742     //=================================
00743     
00744     vuujm1 = vuu ; 
00745     ssjm1 = ssj ;
00746  
00747     niter++ ; 
00748     
00749     }   // End of iteration 
00750     while ( (diff > precis) && (niter < nitermax) ) ;
00751 
00752 //==========================================================================
00753 //==========================================================================
00754 //              End of iteration 
00755 //==========================================================================
00756 //==========================================================================
00757 
00758     uu.set_dzpuis( source.get_dzpuis() ) ;  // dzpuis unchanged
00759 
00760 }
00761 
00762 
00763 

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