cmp_raccord.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_C[] = "$Header: /cvsroot/Lorene/C++/Source/Cmp/cmp_raccord.C,v 1.2 2003/10/03 15:58:45 j_novak Exp $" ;
00024 
00025 /*
00026  * $Id: cmp_raccord.C,v 1.2 2003/10/03 15:58:45 j_novak Exp $
00027  * $Log: cmp_raccord.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.1  2000/09/07  13:19:58  phil
00035  * *** empty log message ***
00036  *
00037  * Revision 2.0  2000/06/06  12:18:27  phil
00038  * *** empty log message ***
00039  *
00040  *
00041  * $Header: /cvsroot/Lorene/C++/Source/Cmp/cmp_raccord.C,v 1.2 2003/10/03 15:58:45 j_novak Exp $
00042  *
00043  */
00044 
00045 //standard
00046 #include <stdlib.h>
00047 #include <math.h>
00048 
00049 // LORENE
00050 #include "matrice.h"
00051 #include "cmp.h"
00052 #include "proto.h"
00053 
00054 
00055 Matrice matrice_raccord_pair (int cont, double alpha_kernel) {
00056     
00057     Matrice systeme (cont, cont) ;
00058     systeme.set_etat_qcq() ;
00059     for (int i=0 ; i<cont ; i++)
00060     for (int j=0 ; j<cont ; j++)
00061         systeme.set(i, j) = 0 ;
00062     
00063     double somme ;
00064     for (int i=0 ; i<cont ; i++)
00065     for (int k=0 ; k<cont ; k++)
00066         if (k<= 2*i) {
00067         somme = 1 ;
00068         for (int boucle=0 ; boucle<k ; boucle++)
00069         somme *= (4*i*i-boucle*boucle)/(2.*boucle+1.)/alpha_kernel ;
00070         systeme.set(k, i) = somme ;
00071     }
00072     int inf = (cont%2 == 1) ? (cont-1)/2 : (cont-2)/2 ;
00073     systeme.set_band (cont-1, inf) ;
00074     systeme.set_lu() ;
00075     return systeme ;
00076 }
00077 
00078 Matrice matrice_raccord_impair (int cont, double alpha_kernel) {
00079     
00080     Matrice systeme (cont, cont) ;
00081     systeme.set_etat_qcq() ;
00082     for (int i=0 ; i<cont ; i++)
00083     for (int j=0 ; j<cont ; j++)
00084         systeme.set(i, j) = 0 ;
00085     
00086     double somme ;
00087     for (int i=0 ; i<cont ; i++)
00088     for (int k=0 ; k<cont ; k++)
00089         if (k<= 2*i+1) {
00090         somme = 1 ;
00091         for (int boucle=0 ; boucle<k ; boucle++)
00092         somme *= (pow(2*i+1, 2.)-boucle*boucle)/(2.*boucle+1.)/alpha_kernel ;
00093         systeme.set(k, i) = somme ;
00094     }
00095     int inf = (cont%2 == 0) ? cont/2 : (cont-1)/2 ;
00096     systeme.set_band (cont-1, inf) ;
00097     systeme.set_lu() ;
00098     return systeme ;
00099 }
00100 
00101 
00102 Tbl sec_membre_raccord (Tbl coef, int cont, double alpha_shell) {
00103     
00104     assert (coef.get_etat() != ETATNONDEF) ;
00105     int nr = coef.get_dim(0) ;
00106     
00107     Tbl sec_membre(cont) ;
00108     sec_membre.set_etat_qcq() ;
00109     for (int i=0 ; i<cont ; i++)
00110     sec_membre.set(i) = 0 ;
00111     
00112     double somme ;
00113     for (int i=0 ; i<nr ; i++)
00114     for (int k=0 ; k<cont ; k++)
00115         if (k<= i) {
00116         somme = 1 ;
00117         for (int boucle=0 ; boucle<k ; boucle++)
00118         somme *= (i*i-boucle*boucle)/(2.*boucle+1.)/alpha_shell ;
00119         if ((i+k)%2 == 0)
00120         sec_membre.set(k) += coef(i)*somme ;
00121         else
00122         sec_membre.set(k) -= coef(i)*somme ;
00123     }
00124     
00125     return sec_membre ;
00126 }
00127 
00128 
00129 Tbl regularise (Tbl coef, int nr, int base_r) {
00130     
00131     assert ((base_r == R_CHEBI) || (base_r == R_CHEBP)) ;
00132     assert (coef.get_etat() != ETATNONDEF) ;
00133     int cont = coef.get_dim(0) ;
00134     assert (nr >= cont) ;
00135     
00136     Tbl resu (nr) ;
00137     resu.set_etat_qcq() ;
00138     
00139     double* x4coef = new double[nr] ;
00140     for (int i=0 ; i<cont ; i++)
00141     x4coef[i] = coef(i) ;
00142     for (int i=cont ; i<nr ; i++)
00143     x4coef[i] = 0 ;
00144     double* x6coef = new double[nr] ;
00145     
00146     multx2_1d (nr, &x4coef, base_r) ;
00147     multx2_1d (nr, &x4coef, base_r) ;
00148     for (int i=0 ; i<nr ; i++)
00149     x6coef[i] = x4coef[i] ;
00150     multx2_1d (nr, &x6coef, base_r) ;
00151     
00152     for (int i=0 ; i<nr ; i++)
00153     resu.set(i) = 3*x4coef[i]-2*x6coef[i] ;
00154     
00155     delete [] x4coef ;
00156     delete [] x6coef ;
00157     
00158     return resu ;
00159 }
00160 
00161 
00162 
00163 void Cmp::raccord (int aux) {
00164     assert (etat != ETATNONDEF) ;
00165     
00166     assert (aux >=0) ;
00167     int cont = aux+1 ;
00168     
00169     const Map_af* mapping = dynamic_cast<const Map_af*>(get_mp() ) ; 
00170 
00171     if (mapping == 0x0) {
00172     cout << 
00173     "raccord : The mapping does not belong to the class Map_af !"
00174         << endl ; 
00175     abort() ;
00176     }
00177     
00178     assert (mapping->get_mg()->get_type_r(1) == FIN) ;
00179     assert (mapping->get_mg()->get_type_r(0) == RARE) ;
00180     
00181     // On passe en Ylm et vire tout dans la zone interne...
00182     va.coef() ;
00183     va.ylm() ;
00184     va.set_etat_cf_qcq() ;
00185     va.c_cf->t[0]->annule_hard() ;
00186     
00187     // Confort :
00188     int nz = mapping->get_mg()->get_nzone() ;
00189     int nbrer_kernel = mapping->get_mg()->get_nr(0) ;
00190     int nbrer_shell  = mapping->get_mg()->get_nr(1) ;
00191     
00192     int nbret_kernel = mapping->get_mg()->get_nt(0) ;
00193     int nbret_shell  = mapping->get_mg()->get_nt(1) ;
00194     
00195     int nbrep_kernel = mapping->get_mg()->get_np(0) ;
00196     int nbrep_shell  = mapping->get_mg()->get_np(1) ;
00197     
00198     double alpha_kernel = mapping->get_alpha()[0] ;
00199     double alpha_shell  = mapping->get_alpha()[1] ;
00200     
00201     int base_r, m_quant, l_quant ;
00202     
00203     for (int k=0 ; k<nbrep_kernel+1 ; k++)
00204     for (int j=0 ; j<nbret_kernel ; j++)
00205         if (nullite_plm(j, nbret_kernel, k,nbrep_kernel, va.base) == 1)
00206          if (nullite_plm(j, nbret_shell, k, nbrep_shell, va.base) == 1)
00207     {
00208         // calcul des nombres quantiques :
00209         donne_lm(nz, 0, j, k, va.base, m_quant, l_quant, base_r) ;
00210         assert ((base_r == R_CHEBP) || (base_r == R_CHEBI)) ;
00211         
00212         Matrice systeme(cont, cont) ;
00213         
00214         Tbl facteur (nbrer_kernel) ;
00215         facteur.annule_hard() ;
00216         for (int i=0 ; i<nbrer_shell ; i++)
00217         if (i<nbrer_kernel)
00218             facteur.set(i) = (*va.c_cf)(1, k, j, i) ;
00219         
00220         Tbl sec_membre (sec_membre_raccord (facteur, cont, alpha_shell)) ;
00221        
00222         if (base_r == R_CHEBP)
00223         systeme = matrice_raccord_pair (cont, alpha_kernel) ;       
00224         else
00225         systeme = matrice_raccord_impair (cont, alpha_kernel) ;
00226         
00227         Tbl soluce (systeme.inverse(sec_membre)) ;
00228         Tbl regulier (nbrer_kernel) ;
00229         
00230         if (l_quant == 0)
00231         for (int i=0 ; i<cont ; i++)
00232             va.c_cf->set(0, k, j, i) = soluce(i) ;
00233         else {
00234         if (l_quant %2 == 0)
00235             regulier = regularise (soluce, nbrer_kernel, R_CHEBP) ;
00236         else
00237             regulier = regularise (soluce, nbrer_kernel, R_CHEBI) ;
00238         
00239         for (int i=0 ; i<nbrer_kernel ; i++)
00240             va.c_cf->set(0, k, j, i) = regulier(i) ;
00241         }
00242         }
00243     va.ylm_i() ;
00244 }

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