tenseur_pde.C

00001 /*
00002  *   Copyright (c) 2000-2001 Eric Gourgoulhon
00003  *   Copyright (c) 2000-2001 Philippe Grandclement
00004  *
00005  *   This file is part of LORENE.
00006  *
00007  *   LORENE is free software; you can redistribute it and/or modify
00008  *   it under the terms of the GNU General Public License as published by
00009  *   the Free Software Foundation; either version 2 of the License, or
00010  *   (at your option) any later version.
00011  *
00012  *   LORENE is distributed in the hope that it will be useful,
00013  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  *   GNU General Public License for more details.
00016  *
00017  *   You should have received a copy of the GNU General Public License
00018  *   along with LORENE; if not, write to the Free Software
00019  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00020  *
00021  */
00022 
00023 
00024 char tenseur_pde_C[] = "$Header: /cvsroot/Lorene/C++/Source/Tenseur/tenseur_pde.C,v 1.6 2006/06/01 12:47:54 p_grandclement Exp $" ;
00025 
00026 /*
00027  * $Id: tenseur_pde.C,v 1.6 2006/06/01 12:47:54 p_grandclement Exp $
00028  * $Log: tenseur_pde.C,v $
00029  * Revision 1.6  2006/06/01 12:47:54  p_grandclement
00030  * update of the Bin_ns_bh project
00031  *
00032  * Revision 1.5  2005/08/30 08:35:13  p_grandclement
00033  * Addition of the Tau version of the vectorial Poisson equation for the Tensors
00034  *
00035  * Revision 1.4  2003/10/03 15:58:51  j_novak
00036  * Cleaning of some headers
00037  *
00038  * Revision 1.3  2002/08/07 16:14:11  j_novak
00039  * class Tenseur can now also handle tensor densities, this should be transparent to older codes
00040  *
00041  * Revision 1.2  2002/07/09 16:46:23  p_grandclement
00042  * The Param in the case of an affine mapping is now 0x0 and not deleted
00043  * (I wonder why it was working before)
00044  *
00045  * Revision 1.1.1.1  2001/11/20 15:19:30  e_gourgoulhon
00046  * LORENE
00047  *
00048  * Revision 2.13  2000/10/04  14:58:32  eric
00049  * Ajout de shift.set_etat_qcq() avant l'affection de shift.
00050  *
00051  * Revision 2.12  2000/09/27  15:07:22  eric
00052  * Traitement source nulle dans poisson_vect.
00053  *
00054  * Revision 2.11  2000/05/22  15:48:18  phil
00055  * modification de Oohara pour passer avec dzpuis == 2
00056  *      pardon                  3
00057  *
00058  * Revision 2.10  2000/05/22  15:00:46  phil
00059  * Modification de la methode de Shibata :
00060  * on doit passer une source en r^4 et l equation scalaire est alors resolue en utilisant l'algotihme avec dzpuis == 3
00061  *
00062  * Revision 2.9  2000/03/10  15:51:42  eric
00063  * Traitement dzpuis de source_scal.
00064  *
00065  * Revision 2.8  2000/03/08  10:21:05  eric
00066  * Appel de delete sur le Param* retourne par Map_et::donne_para_poisson_vect[
00067  * lorsqu'il n'est plus utilise (correction Memory leak).
00068  *
00069  * Revision 2.7  2000/03/07  16:53:42  eric
00070  * *** empty log message ***
00071  *
00072  * Revision 2.6  2000/03/07  15:43:32  phil
00073  * gestion des cas dzpuis ==4
00074  *
00075  * Revision 2.5  2000/02/21  12:55:09  eric
00076  * Traitement des triades.
00077  *
00078  * Revision 2.4  2000/02/16  17:13:05  eric
00079  * Correction
00080  *   mp->donne_para_poisson_vect(para, 4)
00081  * devient
00082  *   mp->donne_para_poisson_vect(para, 3)
00083  * dans Tenseur::poisson_vect
00084  * /
00085  *
00086  * Revision 2.3  2000/02/15  10:26:49  phil
00087  * le calcul de sol n'appelle plus Map::poisson_vect mais est fait dans
00088  * Tenseur::poisson_vect (respectivement poisson_vect_oohara)
00089  *
00090  * Revision 2.2  2000/02/09  19:32:58  eric
00091  * La triade de decomposition est desormais passee en argument des constructeurs.
00092  *
00093  * Revision 2.1  2000/02/09  10:01:32  phil
00094  * ajout version oohara
00095  *
00096  * Revision 2.0  2000/01/21  12:58:57  phil
00097  * *** empty log message ***
00098  *
00099  *
00100  * $Header: /cvsroot/Lorene/C++/Source/Tenseur/tenseur_pde.C,v 1.6 2006/06/01 12:47:54 p_grandclement Exp $
00101  *
00102  */
00103 
00104 // Header Lorene:
00105 #include "param.h"
00106 #include "tenseur.h"
00107 
00108             //-----------------------------------//
00109             //      Vectorial Poisson equation   //
00110             //-----------------------------------//
00111 
00112 // Version avec parametres
00113 // -----------------------
00114 void Tenseur::poisson_vect(double lambda, Param& para, Tenseur& shift
00115                 , Tenseur& vecteur, Tenseur& scalaire) const {
00116     assert (lambda != -1) ;
00117     
00118     // Verifications d'usage ...
00119     assert (valence == 1) ;
00120     assert (shift.get_valence() == 1) ;
00121     assert (shift.get_type_indice(0) == type_indice(0)) ;
00122     assert (vecteur.get_valence() == 1) ;
00123     assert (vecteur.get_type_indice(0) == type_indice(0)) ;
00124     assert (scalaire.get_valence() == 0) ;
00125     assert (etat != ETATNONDEF) ;
00126 
00127     // Nothing to do if the source is zero
00128     if (etat == ETATZERO) {
00129 
00130     shift.set_etat_zero() ; 
00131 
00132     vecteur.set_etat_qcq() ;
00133     for (int i=0; i<3; i++) {
00134         vecteur.set(i) = 0 ; 
00135     }
00136 
00137     scalaire.set_etat_qcq() ;
00138     scalaire.set() = 0 ;  
00139 
00140     return ; 
00141     }
00142 
00143     for (int i=0 ; i<3 ; i++)
00144     assert ((*this)(i).check_dzpuis(4)) ;
00145 
00146     // On construit le tableau contenant le terme P_i ...
00147     for (int i=0 ; i<3 ; i++) {
00148     Param* par = mp->donne_para_poisson_vect(para, i) ; 
00149 
00150     (*this)(i).poisson(*par, vecteur.set(i)) ;
00151 
00152     if (par != 0x0)
00153       delete par ; 
00154     }
00155     vecteur.set_triad( *triad ) ; 
00156     
00157     // Equation de Poisson scalaire :
00158     Tenseur source_scal (-skxk(*this)) ;
00159       
00160     assert (source_scal().check_dzpuis(3)) ; 
00161 
00162     Param* par = mp->donne_para_poisson_vect(para, 3) ; 
00163 
00164     source_scal().poisson(*par, scalaire.set()) ;
00165     
00166     if (par !=0x0)
00167       delete par ; 
00168 
00169     // On construit le tableau contenant le terme d xsi / d x_i ...
00170     Tenseur auxiliaire(scalaire) ;
00171     Tenseur dxsi (auxiliaire.gradient()) ;
00172     dxsi.dec2_dzpuis() ;
00173  
00174     // On construit le tableau contenant le terme x_k d P_k / d x_i
00175     Tenseur dp (skxk(vecteur.gradient())) ;
00176     dp.dec_dzpuis() ;
00177     
00178     // Il ne reste plus qu'a tout ranger dans P :
00179     // The final computation is done component by component because
00180     // d_khi and x_d_w are covariant comp. whereas w_shift is
00181     // contravariant
00182 
00183     shift.set_etat_qcq() ; 
00184 
00185     for (int i=0 ; i<3 ; i++)
00186     shift.set(i) = (lambda+2)/2/(lambda+1) * vecteur(i) 
00187                 - (lambda/2/(lambda+1)) * (dxsi(i) + dp(i)) ;   
00188                 
00189     shift.set_triad( *(vecteur.triad) ) ; 
00190 
00191 }
00192 
00193 
00194 // Version sans parametres
00195 // -----------------------
00196 Tenseur Tenseur::poisson_vect(double lambda, Tenseur& vecteur, 
00197                     Tenseur& scalaire) const {
00198       
00199     Param bidon ;
00200     Tenseur resu(*mp, valence, type_indice, triad, metric, poids) ;
00201     resu.set_etat_qcq() ;
00202     poisson_vect(lambda, bidon, resu, vecteur, scalaire) ;
00203     return resu ;
00204 }
00205 
00206 
00207             //-----------------------------------//
00208             //      Vectorial Poisson equation   //
00209             //      using Oohara scheme      //
00210             //-----------------------------------//
00211             
00212 // Version avec parametres
00213 // -----------------------
00214 void Tenseur::poisson_vect_oohara(double lambda, Param& para, Tenseur& shift, 
00215                 Tenseur& chi) const {
00216     
00217      // Ne marche pas pour lambda =-1
00218     assert (lambda != -1) ;
00219     
00220     // Verifications d'usage ...
00221     assert (valence == 1) ;
00222     assert (shift.get_valence() == 1) ;
00223     assert (shift.get_type_indice(0) == type_indice(0)) ;
00224     assert (chi.get_valence() == 0) ;
00225     assert (etat != ETATNONDEF) ;
00226 
00227     // Nothing to do if the source is zero
00228     if (etat == ETATZERO) {
00229     shift.set_etat_zero() ; 
00230     chi.set_etat_qcq() ;
00231     chi.set() = 0 ; 
00232     return ; 
00233     }
00234 
00235     for (int i=0 ; i<3 ; i++)
00236     assert ((*this)(i).check_dzpuis(3) ||
00237         (*this)(i).check_dzpuis(4)) ;
00238     
00239 
00240     Tenseur copie(*this) ;
00241     copie.dec2_dzpuis() ;
00242     if ((*this)(0).check_dzpuis(4))
00243     copie.dec2_dzpuis() ;
00244     else
00245     copie.dec_dzpuis() ;
00246     
00247     Tenseur source_scal(contract(copie.gradient(), 0, 1)/(1.+lambda)) ;
00248     source_scal.inc2_dzpuis() ;
00249     
00250     Param* par = mp->donne_para_poisson_vect(para, 3) ; 
00251     
00252     source_scal().poisson(*par, chi.set());
00253     if (par !=0x0)
00254       delete par ; 
00255   
00256     Tenseur source_vect(*this) ;
00257     if ((*this)(0).check_dzpuis(4))
00258     source_vect.dec_dzpuis() ;
00259     Tenseur chi_grad (chi.gradient()) ;
00260     chi_grad.inc_dzpuis() ;
00261     
00262     for (int i=0 ; i<3 ; i++)
00263     source_vect.set(i) -= lambda*chi_grad(i) ;
00264     assert( *(source_vect.triad) == *((chi.gradient()).get_triad()) ) ;
00265     
00266     if (shift.get_etat() == ETATZERO) {
00267         shift.set_etat_qcq() ;
00268         for (int i=0 ; i<3 ; i++) 
00269              shift.set(i) = 0 ;
00270     }
00271 
00272     for (int i=0 ; i<3 ; i++) {
00273     par = mp->donne_para_poisson_vect(para, i) ;
00274         source_vect(i).poisson(*par, shift.set(i)) ;   
00275 
00276     if (par !=0x0)
00277       delete par ; 
00278     }
00279     shift.set_triad( *(source_vect.triad) ) ; 
00280 
00281 }
00282 
00283 
00284 // Version sans parametres
00285 // -----------------------
00286 Tenseur Tenseur::poisson_vect_oohara(double lambda, Tenseur& scalaire) const {
00287       
00288     Param bidon ;
00289     Tenseur resu(*mp, valence, type_indice, triad, metric, poids) ;
00290     resu.set_etat_qcq() ;
00291     poisson_vect_oohara(lambda, bidon, resu, scalaire) ;
00292     return resu ;
00293 }
00294 
00295 
00296             //---------------------------------------------//
00297             //      Vectorial Poisson equation   TAU method//
00298             //---------------------------------------------//
00299 
00300 // Version avec parametres
00301 // -----------------------
00302 void Tenseur::poisson_vect_tau(double lambda, Param& para, Tenseur& shift
00303                 , Tenseur& vecteur, Tenseur& scalaire) const {
00304     assert (lambda != -1) ;
00305     
00306     // Verifications d'usage ...
00307     assert (valence == 1) ;
00308     assert (shift.get_valence() == 1) ;
00309     assert (shift.get_type_indice(0) == type_indice(0)) ;
00310     assert (vecteur.get_valence() == 1) ;
00311     assert (vecteur.get_type_indice(0) == type_indice(0)) ;
00312     assert (scalaire.get_valence() == 0) ;
00313     assert (etat != ETATNONDEF) ;
00314 
00315     // Nothing to do if the source is zero
00316     if (etat == ETATZERO) {
00317 
00318     shift.set_etat_zero() ; 
00319 
00320     vecteur.set_etat_qcq() ;
00321     for (int i=0; i<3; i++) {
00322         vecteur.set(i) = 0 ; 
00323     }
00324 
00325     scalaire.set_etat_qcq() ;
00326     scalaire.set() = 0 ;  
00327 
00328     return ; 
00329     }
00330 
00331     for (int i=0 ; i<3 ; i++)
00332     assert ((*this)(i).check_dzpuis(4)) ;
00333 
00334     // On construit le tableau contenant le terme P_i ...
00335     for (int i=0 ; i<3 ; i++) {
00336     Param* par = mp->donne_para_poisson_vect(para, i) ; 
00337 
00338     (*this)(i).poisson_tau(*par, vecteur.set(i)) ;
00339 
00340     if (par != 0x0)
00341       delete par ; 
00342     }
00343     vecteur.set_triad( *triad ) ; 
00344     
00345     // Equation de Poisson scalaire :
00346     Tenseur source_scal (-skxk(*this)) ;
00347       
00348     assert (source_scal().check_dzpuis(3)) ; 
00349 
00350     Param* par = mp->donne_para_poisson_vect(para, 3) ; 
00351 
00352     source_scal().poisson_tau(*par, scalaire.set()) ;
00353     
00354     if (par !=0x0)
00355       delete par ; 
00356 
00357     // On construit le tableau contenant le terme d xsi / d x_i ...
00358     Tenseur auxiliaire(scalaire) ;
00359     Tenseur dxsi (auxiliaire.gradient()) ;
00360     dxsi.dec2_dzpuis() ;
00361  
00362     // On construit le tableau contenant le terme x_k d P_k / d x_i
00363     Tenseur dp (skxk(vecteur.gradient())) ;
00364     dp.dec_dzpuis() ;
00365     
00366     // Il ne reste plus qu'a tout ranger dans P :
00367     // The final computation is done component by component because
00368     // d_khi and x_d_w are covariant comp. whereas w_shift is
00369     // contravariant
00370 
00371     shift.set_etat_qcq() ; 
00372 
00373     for (int i=0 ; i<3 ; i++)
00374     shift.set(i) = (lambda+2)/2/(lambda+1) * vecteur(i) 
00375                 - (lambda/2/(lambda+1)) * (dxsi(i) + dp(i)) ;   
00376                 
00377     shift.set_triad( *(vecteur.triad) ) ; 
00378 
00379 }
00380 
00381 
00382 // Version sans parametres
00383 // -----------------------
00384 Tenseur Tenseur::poisson_vect_tau(double lambda, Tenseur& vecteur, 
00385                     Tenseur& scalaire) const {
00386       
00387     Param bidon ;
00388     Tenseur resu(*mp, valence, type_indice, triad, metric, poids) ;
00389     resu.set_etat_qcq() ;
00390     poisson_vect_tau(lambda, bidon, resu, vecteur, scalaire) ;
00391     return resu ;
00392 }
00393 
00394 
00395             //-----------------------------------//
00396             //      Vectorial Poisson equation   //
00397             //      using Oohara scheme      //
00398             //-----------------------------------//
00399             
00400 // Version avec parametres
00401 // -----------------------
00402 void Tenseur::poisson_vect_oohara_tau(double lambda, Param& para, Tenseur& shift, 
00403                 Tenseur& chi) const {
00404     
00405      // Ne marche pas pour lambda =-1
00406     assert (lambda != -1) ;
00407     
00408     // Verifications d'usage ...
00409     assert (valence == 1) ;
00410     assert (shift.get_valence() == 1) ;
00411     assert (shift.get_type_indice(0) == type_indice(0)) ;
00412     assert (chi.get_valence() == 0) ;
00413     assert (etat != ETATNONDEF) ;
00414 
00415     // Nothing to do if the source is zero
00416     if (etat == ETATZERO) {
00417     shift.set_etat_zero() ; 
00418     chi.set_etat_qcq() ;
00419     chi.set() = 0 ; 
00420     return ; 
00421     }
00422 
00423     for (int i=0 ; i<3 ; i++)
00424     assert ((*this)(i).check_dzpuis(3) ||
00425         (*this)(i).check_dzpuis(4)) ;
00426     
00427 
00428     Tenseur copie(*this) ;
00429     copie.dec2_dzpuis() ;
00430     if ((*this)(0).check_dzpuis(4))
00431     copie.dec2_dzpuis() ;
00432     else
00433     copie.dec_dzpuis() ;
00434     
00435     Tenseur source_scal(contract(copie.gradient(), 0, 1)/(1.+lambda)) ;
00436     source_scal.inc2_dzpuis() ;
00437     
00438     Param* par = mp->donne_para_poisson_vect(para, 3) ; 
00439     
00440     source_scal().poisson_tau(*par, chi.set());
00441     
00442     if (par !=0x0)
00443       delete par ; 
00444   
00445     Tenseur source_vect(*this) ;
00446     if ((*this)(0).check_dzpuis(4))
00447     source_vect.dec_dzpuis() ;
00448     
00449     Tenseur chi_grad (chi.gradient()) ;
00450     chi_grad.inc_dzpuis() ;
00451     
00452     for (int i=0 ; i<3 ; i++)
00453     source_vect.set(i) -= lambda*chi_grad(i) ;
00454     
00455     assert( *(source_vect.triad) == *((chi.gradient()).get_triad()) ) ;
00456     
00457     for (int i=0 ; i<3 ; i++) {
00458     par = mp->donne_para_poisson_vect(para, i) ;
00459 
00460     source_vect(i).poisson_tau(*par, shift.set(i)) ;   
00461 
00462     if (par !=0x0)
00463       delete par ; 
00464     }
00465     shift.set_triad( *(source_vect.triad) ) ; 
00466 
00467 }
00468 
00469 
00470 // Version sans parametres
00471 // -----------------------
00472 Tenseur Tenseur::poisson_vect_oohara_tau(double lambda, Tenseur& scalaire) const {
00473       
00474     Param bidon ;
00475     Tenseur resu(*mp, valence, type_indice, triad, metric, poids) ;
00476     resu.set_etat_qcq() ;
00477     poisson_vect_oohara_tau(lambda, bidon, resu, scalaire) ;
00478     return resu ;
00479 }
00480 

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