map_et_lap.C

00001 /*
00002  * Computes the Laplacian of a scalar field (represented by a Cmp) when
00003  *  the mapping belongs to the Map_et class
00004  */
00005 
00006 /*
00007  *   Copyright (c) 1999-2001 Eric Gourgoulhon
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_et_lap_C[] = "$Header: /cvsroot/Lorene/C++/Source/Map/map_et_lap.C,v 1.3 2005/11/24 09:25:07 j_novak Exp $" ;
00029 
00030 /*
00031  * $Id: map_et_lap.C,v 1.3 2005/11/24 09:25:07 j_novak Exp $
00032  * $Log: map_et_lap.C,v $
00033  * Revision 1.3  2005/11/24 09:25:07  j_novak
00034  * Added the Scalar version for the Laplacian
00035  *
00036  * Revision 1.2  2003/10/15 16:03:37  j_novak
00037  * Added the angular Laplace operator for Scalar.
00038  *
00039  * Revision 1.1.1.1  2001/11/20 15:19:27  e_gourgoulhon
00040  * LORENE
00041  *
00042  * Revision 1.4  2000/02/25  09:02:18  eric
00043  * Remplacement de (uu.get_dzpuis() == 0) par uu.check_dzpuis(0).
00044  *
00045  * Revision 1.3  2000/01/26  13:11:07  eric
00046  * Reprototypage complet :
00047  * le resultat est desormais suppose alloue a l'exterieur de la routine
00048  * et est passe en argument (Cmp& resu).
00049  *  .
00050  *
00051  * Revision 1.2  2000/01/14  14:55:05  eric
00052  * Suppression de l'assert(sauve_base == vresu.base)
00053  *  car sauve_base == vresu.base n'est pas necessairement vrai (cela
00054  *  depend de l'histoire du Cmp uu, notamment de si uu.p_dsdx est
00055  *  a jour).
00056  *
00057  * Revision 1.1  1999/12/20  17:27:30  eric
00058  * Initial revision
00059  *
00060  *
00061  * $Header: /cvsroot/Lorene/C++/Source/Map/map_et_lap.C,v 1.3 2005/11/24 09:25:07 j_novak Exp $
00062  *
00063  */
00064 
00065 // Header Lorene
00066 #include "cmp.h" 
00067 #include "tensor.h"
00068 
00069 
00070 // Laplacian: Scalar version
00071 void Map_et::laplacien(const Scalar& uu, int zec_mult_r, Scalar& resu) const {
00072  
00073     assert (uu.get_etat() != ETATNONDEF) ; 
00074     assert (uu.get_mp().get_mg() == mg) ; 
00075 
00076     // Particular case of null value:
00077 
00078     if ((uu.get_etat() == ETATZERO) || (uu.get_etat() == ETATUN)) {
00079     resu.set_etat_zero() ; 
00080     return ; 
00081     }
00082 
00083     assert( uu.get_etat() == ETATQCQ ) ; 
00084     assert( uu.check_dzpuis(0) ) ; 
00085     
00086     int nz = get_mg()->get_nzone() ; 
00087     int nzm1 = nz - 1 ;        
00088 
00089     // Indicator of existence of a compactified external domain
00090     bool zec = false ;      
00091     if (mg->get_type_r(nzm1) == UNSURR) {
00092     zec = true ;
00093     }
00094      
00095     if ( zec && (zec_mult_r != 4) ) {
00096     cout << "Map_et::laplacien : the case zec_mult_r = " << 
00097         zec_mult_r << " is not implemented !" << endl ; 
00098     abort() ; 
00099     }
00100  
00101     //--------------------
00102     // First operations
00103     //--------------------
00104     
00105     Valeur duudx = uu.get_spectral_va().dsdx() ;        // d/dx 
00106     Valeur d2uudx2 = uu.get_spectral_va().d2sdx2() ;        // d^2/dx^2
00107 
00108     const Valeur& d2uudtdx = duudx.dsdt() ;     // d^2/dxdtheta
00109 
00110     const Valeur& std2uudpdx = duudx.stdsdp() ;    // 1/sin(theta) d^2/dxdphi   
00111 
00112     //------------------
00113     // Angular Laplacian 
00114     //------------------
00115     
00116     Valeur sxlapang = uu.get_spectral_va() ; 
00117 
00118     sxlapang.ylm() ; 
00119     
00120     sxlapang = sxlapang.lapang() ;    
00121     
00122     sxlapang = sxlapang.sx() ;    // 1/x    in the nucleus
00123                   // Id     in the shells
00124                   // 1/(x-1) in the ZEC
00125     
00126     //------------------------------------
00127     // (2 dx/dR d/dx + x/R 1/x Lap_ang)/x
00128     //------------------------------------
00129 
00130     Valeur varduudx = duudx ; 
00131 
00132     if (zec) {
00133     varduudx.annule(nzm1) ;     // term in d/dx set to zero in the ZEC
00134     }
00135 
00136     resu.set_etat_qcq() ; 
00137     
00138     Valeur& vresu = resu.set_spectral_va() ; 
00139 
00140     Base_val sauve_base = varduudx.base ; 
00141     
00142     vresu = double(2) * dxdr * varduudx + xsr * sxlapang ; 
00143 
00144     vresu.set_base(sauve_base) ; 
00145 
00146     vresu = vresu.sx() ; 
00147 
00148     //--------------
00149     // Final result
00150     //--------------
00151 
00152     Mtbl unjj = double(1) + srdrdt*srdrdt + srstdrdp*srstdrdp ;
00153 
00154     sauve_base = d2uudx2.base ; 
00155 //    assert(sauve_base == vresu.base) ;  // this is not necessary true
00156     
00157     vresu = dxdr*dxdr * unjj * d2uudx2 + xsr * vresu 
00158         - double(2) * dxdr * (  sr2drdt * d2uudtdx 
00159                   + sr2stdrdp * std2uudpdx ) ;
00160 
00161     vresu += - dxdr * ( lapr_tp + dxdr * ( 
00162         dxdr* unjj * d2rdx2 
00163         - double(2) * ( sr2drdt * d2rdtdx  + sr2stdrdp * sstd2rdpdx ) ) 
00164                  ) * duudx ;            
00165 
00166     vresu.set_base(sauve_base) ; 
00167 
00168     if (zec == 1) {
00169     resu.set_dzpuis(zec_mult_r) ; 
00170     }
00171 
00172 }
00173 
00174 
00175 // Laplacian: Cmp version
00176 void Map_et::laplacien(const Cmp& uu, int zec_mult_r, Cmp& resu) const {
00177  
00178     assert (uu.get_etat() != ETATNONDEF) ; 
00179     assert (uu.get_mp()->get_mg() == mg) ; 
00180 
00181     // Particular case of null value:
00182 
00183     if (uu.get_etat() == ETATZERO) {
00184     resu.set_etat_zero() ; 
00185     return ; 
00186     }
00187 
00188     assert( uu.get_etat() == ETATQCQ ) ; 
00189     assert( uu.check_dzpuis(0) ) ; 
00190     
00191     int nz = get_mg()->get_nzone() ; 
00192     int nzm1 = nz - 1 ;        
00193 
00194     // Indicator of existence of a compactified external domain
00195     bool zec = false ;      
00196     if (mg->get_type_r(nzm1) == UNSURR) {
00197     zec = true ;
00198     }
00199      
00200     if ( zec && (zec_mult_r != 4) ) {
00201     cout << "Map_et::laplacien : the case zec_mult_r = " << 
00202         zec_mult_r << " is not implemented !" << endl ; 
00203     abort() ; 
00204     }
00205  
00206     //--------------------
00207     // First operations
00208     //--------------------
00209     
00210     Valeur duudx = (uu.va).dsdx() ;     // d/dx 
00211     Valeur d2uudx2 = (uu.va).d2sdx2() ;     // d^2/dx^2
00212 
00213     const Valeur& d2uudtdx = duudx.dsdt() ;     // d^2/dxdtheta
00214 
00215     const Valeur& std2uudpdx = duudx.stdsdp() ;    // 1/sin(theta) d^2/dxdphi   
00216 
00217     //------------------
00218     // Angular Laplacian 
00219     //------------------
00220     
00221     Valeur sxlapang = uu.va ; 
00222 
00223     sxlapang.ylm() ; 
00224     
00225     sxlapang = sxlapang.lapang() ;    
00226     
00227     sxlapang = sxlapang.sx() ;    // 1/x    in the nucleus
00228                   // Id     in the shells
00229                   // 1/(x-1) in the ZEC
00230     
00231     //------------------------------------
00232     // (2 dx/dR d/dx + x/R 1/x Lap_ang)/x
00233     //------------------------------------
00234 
00235     Valeur varduudx = duudx ; 
00236 
00237     if (zec) {
00238     varduudx.annule(nzm1) ;     // term in d/dx set to zero in the ZEC
00239     }
00240 
00241     resu.set_etat_qcq() ; 
00242     
00243     Valeur& vresu = resu.va ; 
00244 
00245     Base_val sauve_base = varduudx.base ; 
00246     
00247     vresu = double(2) * dxdr * varduudx + xsr * sxlapang ; 
00248 
00249     vresu.set_base(sauve_base) ; 
00250 
00251     vresu = vresu.sx() ; 
00252 
00253     //--------------
00254     // Final result
00255     //--------------
00256 
00257     Mtbl unjj = double(1) + srdrdt*srdrdt + srstdrdp*srstdrdp ;
00258 
00259     sauve_base = d2uudx2.base ; 
00260 //    assert(sauve_base == vresu.base) ;  // this is not necessary true
00261     
00262     vresu = dxdr*dxdr * unjj * d2uudx2 + xsr * vresu 
00263         - double(2) * dxdr * (  sr2drdt * d2uudtdx 
00264                   + sr2stdrdp * std2uudpdx ) ;
00265 
00266     vresu += - dxdr * ( lapr_tp + dxdr * ( 
00267         dxdr* unjj * d2rdx2 
00268         - double(2) * ( sr2drdt * d2rdtdx  + sr2stdrdp * sstd2rdpdx ) ) 
00269                  ) * duudx ;            
00270 
00271     vresu.set_base(sauve_base) ; 
00272 
00273     if (zec == 1) {
00274     resu.set_dzpuis(zec_mult_r) ; 
00275     }
00276 
00277 }
00278 
00279 void Map_et::lapang(const Scalar& , Scalar& ) const {
00280  
00281   cout << "Map_et::lapang : not implemented yet!" << endl ;
00282   abort() ;
00283 
00284 }
00285 
00286 

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