cmp_raccord_zec.C

00001 /*
00002  *   Copyright (c) 2000-2001 Philippe Grandclement
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 cmp_raccord_zec_C[] = "$Header: /cvsroot/Lorene/C++/Source/Cmp/cmp_raccord_zec.C,v 1.2 2003/10/03 15:58:45 j_novak Exp $" ;
00024 
00025 /*
00026  * $Id: cmp_raccord_zec.C,v 1.2 2003/10/03 15:58:45 j_novak Exp $
00027  * $Log: cmp_raccord_zec.C,v $
00028  * Revision 1.2  2003/10/03 15:58:45  j_novak
00029  * Cleaning of some headers
00030  *
00031  * Revision 1.1.1.1  2001/11/20 15:19:27  e_gourgoulhon
00032  * LORENE
00033  *
00034  * Revision 2.7  2001/03/30  13:38:32  phil
00035  * *** empty log message ***
00036  *
00037  * Revision 2.6  2001/03/22  10:25:01  phil
00038  * changement complet : cas plus general
00039  *
00040  * Revision 2.5  2001/02/08  14:21:32  phil
00041  * correction de raccord_zec.C (on prend en compte le dernier coef ...)
00042  *
00043  * Revision 2.4  2001/01/02  11:25:37  phil
00044  * *** empty log message ***
00045  *
00046  * Revision 2.3  2000/12/13  14:59:18  phil
00047  * *** empty log message ***
00048  *
00049  * Revision 2.2  2000/12/13  14:49:54  phil
00050  * changement nom variable appel
00051  * /
00052  *
00053  * Revision 2.1  2000/12/13  14:12:29  phil
00054  * correction bugs
00055  *
00056  * Revision 2.0  2000/12/13  14:09:31  phil
00057  * *** empty log message ***
00058  *
00059  *
00060  * $Header: /cvsroot/Lorene/C++/Source/Cmp/cmp_raccord_zec.C,v 1.2 2003/10/03 15:58:45 j_novak Exp $
00061  *
00062  */
00063 
00064 //standard
00065 #include <stdlib.h>
00066 #include <math.h>
00067 
00068 // LORENE
00069 #include "matrice.h"
00070 #include "cmp.h"
00071 #include "proto.h"
00072 
00073 // Fait le raccord C1 dans la zec ...
00074 // Suppose (pour le moment, le meme nbre de points sur les angles ...)
00075 // et que la zone precedente est une coquille
00076 
00077 void Cmp::raccord_c1_zec (int puis, int nbre, int lmax) {
00078     
00079     assert (nbre>0) ;
00080     assert (etat != ETATNONDEF) ;
00081     if (etat == ETATZERO)
00082     return ;
00083 
00084     // Le mapping doit etre affine :
00085     const Map_af* map  = dynamic_cast<const Map_af*>(mp) ;
00086     if (map == 0x0) {
00087     cout << "Le mapping doit etre affine" << endl ;
00088     abort() ;
00089     }
00090     
00091     int nz = map->get_mg()->get_nzone() ;
00092     int nr = map->get_mg()->get_nr (nz-1) ;
00093     int nt = map->get_mg()->get_nt (nz-1) ;
00094     int np = map->get_mg()->get_np (nz-1) ;
00095     
00096     double alpha = map->get_alpha()[nz-1] ;
00097     double r_cont = -1./2./alpha ;  //Rayon de debut de la zec.
00098   
00099     // On calcul les coefficients des puissances de 1./r
00100     Tbl coef (nbre+2*lmax, nr) ;
00101     coef.set_etat_qcq() ;
00102     
00103     int* deg = new int[3] ;
00104     deg[0] = 1 ; deg[1] = 1 ; deg[2] = nr ;
00105     double* auxi = new double[nr] ;
00106     
00107     for (int conte=0 ; conte<nbre+2*lmax ; conte++) {
00108     for (int i=0 ; i<nr ; i++)
00109         auxi[i] = pow(-1-cos(M_PI*i/(nr-1)), (conte+puis)) ;
00110         
00111     cfrcheb(deg, deg, auxi, deg, auxi) ;
00112     for (int i=0 ; i<nr ; i++)
00113         coef.set(conte, i) = auxi[i]*pow (alpha, conte+puis) ;
00114     }
00115      
00116     delete[] deg ;
00117     // Maintenant on va calculer les valeurs de la ieme derivee :
00118     Tbl valeurs (nbre, nt, np+1) ;
00119     valeurs.set_etat_qcq() ;
00120     
00121     Cmp courant (*this) ;
00122     double* res_val = new double[1] ;
00123     
00124     for (int conte=0 ; conte<nbre ; conte++) {
00125     
00126     courant.va.coef() ;
00127     courant.va.ylm() ;
00128     courant.va.c_cf->t[nz-1]->annule_hard() ;
00129     
00130     int base_r = courant.va.base.get_base_r(nz-2) ;
00131     for (int k=0 ; k<np+1 ; k++)
00132         for (int j=0 ; j<nt ; j++) 
00133         if (nullite_plm(j, nt, k, np, courant.va.base) == 1) {
00134         
00135             for (int i=0 ; i<nr ; i++)
00136             auxi[i] = (*courant.va.c_cf)(nz-2, k, j, i) ;
00137 
00138             switch (base_r) {
00139             case R_CHEB :
00140                 som_r_cheb (auxi, nr, 1, 1, 1, res_val) ;
00141                 break ;
00142             default :
00143                 cout << "Cas non prevu dans raccord_zec" << endl ;
00144                 abort() ;
00145                 break ;
00146             }
00147             valeurs.set(conte, k, j) = res_val[0] ;
00148         }
00149     Cmp copie (courant) ;
00150     copie.dec2_dzpuis() ;
00151     courant = copie.dsdr() ;
00152     }
00153  
00154     delete [] auxi ;
00155     delete [] res_val ; 
00156    
00157     // On boucle sur les harmoniques : construction de la matrice 
00158     // et du second membre
00159     va.coef() ;
00160     va.ylm() ;
00161     va.c_cf->t[nz-1]->annule_hard() ;
00162     va.set_etat_cf_qcq() ;
00163     
00164     const Base_val& base = va.base ;
00165     int base_r, l_quant, m_quant ;
00166     for (int k=0 ; k<np+1 ; k++)
00167     for (int j=0 ; j<nt ; j++) 
00168         if (nullite_plm(j, nt, k, np, va.base) == 1) {
00169         
00170         donne_lm (nz, nz-1, j, k, base, m_quant, l_quant, base_r) ;
00171         
00172         if (l_quant<=lmax) {
00173         
00174         Matrice systeme (nbre, nbre) ;
00175         systeme.set_etat_qcq() ;
00176         
00177         for (int col=0 ; col<nbre ; col++)
00178             for (int lig=0 ; lig<nbre ; lig++) {
00179             
00180             int facteur = (lig%2==0) ? 1 : -1 ;
00181             for (int conte=0 ; conte<lig ; conte++)
00182                 facteur *= puis+col+conte+2*l_quant ;
00183             systeme.set(lig, col) = facteur/pow(r_cont, puis+col+lig+2*l_quant) ;
00184             }
00185         
00186         systeme.set_band(nbre, nbre) ;
00187         systeme.set_lu() ;
00188         
00189             Tbl sec_membre (nbre) ;
00190         sec_membre.set_etat_qcq() ;
00191         for (int conte=0 ; conte<nbre ; conte++)
00192             sec_membre.set(conte) = valeurs(conte, k, j) ;
00193         
00194         Tbl inv (systeme.inverse(sec_membre)) ;
00195         
00196         for (int conte=0 ; conte<nbre ; conte++)
00197             for (int i=0 ; i<nr ; i++)
00198             va.c_cf->set(nz-1, k, j, i)+= 
00199                 inv(conte)*coef(conte+2*l_quant, i) ;    
00200         }
00201     else for (int i=0 ; i<nr ; i++)
00202         va.c_cf->set(nz-1, k, j, i)
00203             = 0 ;
00204     }
00205     
00206     va.ylm_i() ;
00207     set_dzpuis (0) ;
00208 }

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