00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include <stdlib.h>
00047 #include <math.h>
00048
00049
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
00182 va.coef() ;
00183 va.ylm() ;
00184 va.set_etat_cf_qcq() ;
00185 va.c_cf->t[0]->annule_hard() ;
00186
00187
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
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 }