00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 char poisson_tau_C[] = "$Header: /cvsroot/Lorene/C++/Source/Non_class_members/PDE/poisson_tau.C,v 1.7 2008/08/27 08:51:15 jl_cornou Exp $" ;
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 #include <stdlib.h>
00051 #include <math.h>
00052
00053
00054 #include "matrice.h"
00055 #include "map.h"
00056 #include "proto.h"
00057 #include "type_parite.h"
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 Mtbl_cf sol_poisson_tau(const Map_af& mapping, const Mtbl_cf& source, int dzpuis)
00081 {
00082
00083
00084 int nz = source.get_mg()->get_nzone() ;
00085 assert (nz>1) ;
00086 assert ((source.get_mg()->get_type_r(0) == RARE) || (source.get_mg()->get_type_r(0) == FINJAC)) ;
00087 assert (source.get_mg()->get_type_r(nz-1) == UNSURR) ;
00088 for (int l=1 ; l<nz-1 ; l++)
00089 assert(source.get_mg()->get_type_r(l) == FIN) ;
00090
00091 assert ((dzpuis==4) || (dzpuis==2) || (dzpuis==3)) ;
00092
00093
00094 const Base_val& base = source.base ;
00095
00096
00097 Mtbl_cf resultat(source.get_mg(), base) ;
00098 resultat.annule_hard() ;
00099
00100
00101 int nr, nt, np ;
00102 int base_r ;
00103 double alpha, beta, echelle ;
00104 int l_quant, m_quant;
00105
00106
00107 int size = 0 ;
00108 int max_nr = 0 ;
00109 for (int l=0 ; l<nz ; l++) {
00110 nr = mapping.get_mg()->get_nr(l) ;
00111 size += nr ;
00112 if (nr > max_nr)
00113 max_nr = nr ;
00114 }
00115
00116 Matrice systeme (size, size) ;
00117 systeme.set_etat_qcq() ;
00118 Tbl sec_membre (size) ;
00119
00120 np = mapping.get_mg()->get_np(0) ;
00121 nt = mapping.get_mg()->get_nt(0) ;
00122 Matrice* work ;
00123
00124
00125 for (int k=0 ; k<np+1 ; k++)
00126 for (int j=0 ; j<nt ; j++)
00127 if (nullite_plm(j, nt, k, np, base) == 1) {
00128
00129
00130
00131
00132 systeme.annule_hard() ;
00133 sec_membre.annule_hard() ;
00134
00135 int column_courant = 0 ;
00136 int ligne_courant = 0 ;
00137
00138
00139
00140
00141
00142 nr = mapping.get_mg()->get_nr(0) ;
00143 alpha = mapping.get_alpha()[0] ;
00144 base.give_quant_numbers (0, k, j, m_quant, l_quant, base_r) ;
00145 work = new Matrice (laplacien_mat(nr, l_quant, 0., 0, base_r)) ;
00146
00147 int nbr_cl = 0 ;
00148
00149 if (source.get_mg()->get_type_r(0) == RARE) {
00150
00151 if (l_quant > 1) {
00152 nbr_cl = 1 ;
00153 if (l_quant%2==0) {
00154
00155 for (int col=0 ; col<nr ; col++)
00156 if (col%2==0)
00157 systeme.set(ligne_courant, col+column_courant) = 1 ;
00158 else
00159 systeme.set(ligne_courant, col+column_courant) = -1 ;
00160 }
00161 else {
00162
00163 for (int col=0 ; col<nr ; col++)
00164 if (col%2==0)
00165 systeme.set(ligne_courant, col+column_courant) = 2*col+1 ;
00166 else
00167 systeme.set(ligne_courant, col+column_courant) = -(2*col+1) ;
00168 }
00169 }
00170 }
00171
00172
00173 else {
00174
00175 if (l_quant == 0) {
00176 nbr_cl = 1 ;
00177 for (int col=0 ; col<nr ; col++) {
00178 systeme.set(ligne_courant, col+column_courant) = col*(col+1)*(col+2)*(col+3)/double(12)*(2*(col%2)-1);
00179 }
00180 }
00181 else if (l_quant == 1) {
00182 nbr_cl = 1 ;
00183 for (int col=0 ; col<nr ; col++) {
00184 systeme.set(ligne_courant, col+column_courant) = (col+1)*(col+2)/double(2)*(1-2*(col%2)) ;
00185 }
00186 }
00187 else {
00188 nbr_cl = 2 ;
00189 for (int col=0 ; col<nr ; col++) {
00190 systeme.set(ligne_courant, col+column_courant) = (col+1)*(col+2)/double(2)*(1-2*(col%2)) ;
00191 systeme.set(ligne_courant+1, col+column_courant) = col*(col+1)*(col+2)*(col+3)/double(12)*(2*(col%2)-1) ;
00192 }
00193 }
00194 }
00195 ligne_courant += nbr_cl ;
00196
00197
00198 for (int lig=0 ; lig<nr-1-nbr_cl ; lig++) {
00199 for (int col=0 ; col<nr ; col++)
00200 systeme.set(lig+ligne_courant,col+column_courant) = (*work)(lig,col) ;
00201 sec_membre.set(lig+ligne_courant) = alpha*alpha*source(0, k, j, lig) ;
00202 }
00203
00204 delete work ;
00205 ligne_courant += nr-1-nbr_cl ;
00206
00207
00208 for (int col=0 ; col<nr ; col++) {
00209 if (source.get_mg()->get_type_r(0) == RARE) {
00210
00211 systeme.set(ligne_courant, col+column_courant) = 1 ;
00212
00213 if (l_quant%2==0) {
00214 systeme.set(ligne_courant+1, col+column_courant) = 4*col*col/alpha ;
00215 }
00216 else {
00217 systeme.set(ligne_courant+1, col+column_courant) = (2*col+1)*(2*col+1)/alpha ;
00218 }
00219 }
00220 else {
00221
00222 systeme.set(ligne_courant, col+column_courant) = 1 ;
00223
00224 systeme.set(ligne_courant+1, col+column_courant) = col*(col+3)/double(2)/alpha ;
00225 }
00226 }
00227
00228 column_courant += nr ;
00229
00230
00231
00232
00233
00234
00235
00236 for (int l=1 ; l<nz-1 ; l++) {
00237
00238 nr = mapping.get_mg()->get_nr(l) ;
00239 alpha = mapping.get_alpha()[l] ;
00240 beta = mapping.get_beta()[l] ;
00241 echelle = beta/alpha ;
00242
00243 base.give_quant_numbers (l, k, j, m_quant, l_quant, base_r) ;
00244 work = new Matrice (laplacien_mat(nr, l_quant, echelle, 0, base_r)) ;
00245
00246
00247 for (int col=0 ; col<nr ; col++) {
00248
00249 if (col%2==0)
00250 systeme.set(ligne_courant, col+column_courant) = -1 ;
00251 else
00252 systeme.set(ligne_courant, col+column_courant) = 1 ;
00253
00254 if (col%2==0)
00255 systeme.set(ligne_courant+1, col+column_courant) = col*col/alpha ;
00256 else
00257 systeme.set(ligne_courant+1, col+column_courant) = -col*col/alpha ;
00258 }
00259 ligne_courant += 2 ;
00260
00261
00262
00263
00264 Tbl source_aux(nr) ;
00265 source_aux.set_etat_qcq() ;
00266 for (int i=0 ; i<nr ; i++)
00267 source_aux.set(i) = source(l,k,j,i)*alpha*alpha ;
00268 Tbl xso(source_aux) ;
00269 Tbl xxso(source_aux) ;
00270 multx_1d(nr, &xso.t, R_CHEB) ;
00271 multx_1d(nr, &xxso.t, R_CHEB) ;
00272 multx_1d(nr, &xxso.t, R_CHEB) ;
00273 source_aux = beta*beta/alpha/alpha*source_aux+2*beta/alpha*xso+xxso ;
00274
00275 for (int lig=0 ; lig<nr-2 ; lig++) {
00276 for (int col=0 ; col<nr ; col++)
00277 systeme.set(lig+ligne_courant,col+column_courant) = (*work)(lig,col) ;
00278 sec_membre.set(lig+ligne_courant) = source_aux(lig) ;
00279 }
00280
00281 delete work ;
00282 ligne_courant += nr-2 ;
00283
00284 for (int col=0 ; col<nr ; col++) {
00285
00286 systeme.set(ligne_courant, col+column_courant) = 1 ;
00287
00288 systeme.set(ligne_courant+1, col+column_courant) = col*col/alpha ;
00289 }
00290
00291 column_courant += nr ;
00292 }
00293
00294
00295
00296
00297
00298 nr = mapping.get_mg()->get_nr(nz-1) ;
00299 alpha = mapping.get_alpha()[nz-1] ;
00300 beta = mapping.get_beta()[nz-1] ;
00301
00302 base.give_quant_numbers (nz-1, k, j, m_quant, l_quant, base_r) ;
00303 work = new Matrice(laplacien_mat(nr, l_quant, 0., dzpuis, base_r)) ;
00304
00305
00306 for (int col=0 ; col<nr ; col++) {
00307
00308 if (col%2==0)
00309 systeme.set(ligne_courant, col+column_courant) = -1 ;
00310 else
00311 systeme.set(ligne_courant, col+column_courant) = 1 ;
00312
00313 if (col%2==0)
00314 systeme.set(ligne_courant+1, col+column_courant) = -4*alpha*col*col ;
00315 else
00316 systeme.set(ligne_courant+1, col+column_courant) = 4*alpha*col*col ;
00317 }
00318 ligne_courant += 2 ;
00319
00320
00321 nbr_cl =0 ;
00322 switch (dzpuis) {
00323 case 4 :
00324 if (l_quant==0) {
00325 nbr_cl = 1 ;
00326
00327 for (int col=0 ; col<nr ; col++)
00328 systeme.set(ligne_courant, col+column_courant) = 1 ;
00329 }
00330 else {
00331 nbr_cl = 2 ;
00332
00333 for (int col=0 ; col<nr ; col++)
00334 systeme.set(ligne_courant, col+column_courant) = 1 ;
00335
00336 for (int col=0 ; col<nr ; col++)
00337 systeme.set(ligne_courant+1, col+column_courant) = -4*alpha*col*col ;
00338 }
00339 break ;
00340
00341 case 3 :
00342 nbr_cl = 1 ;
00343
00344 for (int col=0 ; col<nr ; col++)
00345 systeme.set(ligne_courant, col+column_courant) = 1 ;
00346 break ;
00347
00348 case 2 :
00349 if (l_quant==0) {
00350 nbr_cl = 1 ;
00351
00352 for (int col=0 ; col<nr ; col++)
00353 systeme.set(ligne_courant, col+column_courant) = 1 ;
00354 }
00355 break ;
00356 default :
00357 cout << "Unknown dzpuis in sol_poisson_tau ..." << endl ;
00358 abort() ;
00359 }
00360
00361 ligne_courant += nbr_cl ;
00362
00363
00364 double indic = 1 ;
00365 switch (dzpuis) {
00366 case 4 :
00367 indic = alpha*alpha ;
00368 break ;
00369 case 3 :
00370 indic = alpha ;
00371 break ;
00372 default :
00373 break ;
00374 }
00375
00376
00377 for (int lig=0 ; lig<nr-1-nbr_cl ; lig++) {
00378 for (int col=0 ; col<nr ; col++)
00379 systeme.set(lig+ligne_courant,col+column_courant) = (*work)(lig,col) ;
00380 sec_membre.set(lig+ligne_courant) = indic*source(nz-1, k, j, lig) ;
00381 }
00382 delete work ;
00383
00384
00385 systeme.set_band (max_nr, max_nr) ;
00386 systeme.set_lu() ;
00387 Tbl soluce (systeme.inverse(sec_membre)) ;
00388
00389
00390 int conte = 0 ;
00391 for (int l=0 ; l<nz ; l++) {
00392 nr = mapping.get_mg()->get_nr(l) ;
00393 for (int i=0 ; i<nr ; i++) {
00394 resultat.set(l,k,j,i) = soluce(conte) ;
00395 conte ++ ;
00396 }
00397 }
00398
00399 }
00400
00401 return resultat ;
00402 }