00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
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
00051
00052
00053 #include <assert.h>
00054 #include <math.h>
00055
00056
00057 #include "nbr_spx.h"
00058 #include "utilitaires.h"
00059 #include "math.h"
00060 #include "param.h"
00061 #include "param_elliptic.h"
00062 #include "metric.h"
00063 #include "tensor.h"
00064 #include "sym_tensor.h"
00065 #include "diff.h"
00066 #include "proto.h"
00067 #include "param.h"
00068
00069
00070
00071
00072
00073
00074
00075
00076 void Sym_tensor_trans::sol_Dirac_Abound(const Scalar& aaa, Scalar& tilde_mu, Scalar& x_new, Scalar bound_mu, const Param* par_bc) {
00077
00078 const Map_af* mp_aff = dynamic_cast<const Map_af*>(mp) ;
00079 assert(mp_aff != 0x0) ;
00080
00081
00082
00083
00084
00085 const Mg3d& mgrid = *mp_aff->get_mg() ;
00086 assert(mgrid.get_type_r(0) == RARE) ;
00087 if (aaa.get_etat() == ETATZERO) {
00088 tilde_mu = 0 ;
00089 x_new = 0 ;
00090 return ;
00091 }
00092
00093 double dir = 1.;
00094 double neum = 0.;
00095
00096
00097
00098
00099
00100
00101 bound_mu.set_spectral_va().ylm();
00102
00103
00104 assert(aaa.get_etat() != ETATNONDEF) ;
00105 int nz = mgrid.get_nzone() ;
00106 int nzm1 = nz - 1 ;
00107 bool ced = (mgrid.get_type_r(nzm1) == UNSURR) ;
00108 int n_shell = ced ? nz-2 : nzm1 ;
00109 int nz_bc = nzm1 ;
00110 if (par_bc != 0x0)
00111 if (par_bc->get_n_int() > 0) nz_bc = par_bc->get_int() ;
00112 n_shell = (nz_bc < n_shell ? nz_bc : n_shell) ;
00113 bool cedbc = (ced && (nz_bc == nzm1)) ;
00114 #ifndef NDEBUG
00115 if (!cedbc) {
00116 assert(par_bc != 0x0) ;
00117 assert(par_bc->get_n_tbl_mod() >= 3) ;
00118 }
00119 #endif
00120 int nt = mgrid.get_nt(0) ;
00121 int np = mgrid.get_np(0) ;
00122
00123 Scalar source = aaa ;
00124 Scalar source_coq = aaa ;
00125 source_coq.annule_domain(0) ;
00126 if (ced) source_coq.annule_domain(nzm1) ;
00127 source_coq.mult_r() ;
00128 source.set_spectral_va().ylm() ;
00129 source_coq.set_spectral_va().ylm() ;
00130 Base_val base = source.get_spectral_base() ;
00131 base.mult_x() ;
00132
00133 tilde_mu.annule_hard() ;
00134 tilde_mu.set_spectral_base(base) ;
00135 tilde_mu.set_spectral_va().set_etat_cf_qcq() ;
00136 tilde_mu.set_spectral_va().c_cf->annule_hard() ;
00137 x_new.annule_hard() ;
00138 x_new.set_spectral_base(base) ;
00139 x_new.set_spectral_va().set_etat_cf_qcq() ;
00140 x_new.set_spectral_va().c_cf->annule_hard() ;
00141
00142 Mtbl_cf sol_part_mu(mgrid, base) ; sol_part_mu.annule_hard() ;
00143 Mtbl_cf sol_part_x(mgrid, base) ; sol_part_x.annule_hard() ;
00144 Mtbl_cf sol_hom1_mu(mgrid, base) ; sol_hom1_mu.annule_hard() ;
00145 Mtbl_cf sol_hom1_x(mgrid, base) ; sol_hom1_x.annule_hard() ;
00146 Mtbl_cf sol_hom2_mu(mgrid, base) ; sol_hom2_mu.annule_hard() ;
00147 Mtbl_cf sol_hom2_x(mgrid, base) ; sol_hom2_x.annule_hard() ;
00148
00149 int l_q, m_q, base_r ;
00150
00151
00152
00153
00154
00155
00156
00157 { int lz = 0 ;
00158 int nr = mgrid.get_nr(lz) ;
00159
00160
00161
00162
00163 for (int k=0 ; k<np+1 ; k++) {
00164 for (int j=0 ; j<nt ; j++) {
00165
00166 base.give_quant_numbers(lz, k, j, m_q, l_q, base_r) ;
00167 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q > 1)) {
00168
00169
00170 Tbl sol(2*nr) ;
00171 sol.set_etat_zero();
00172 for (int i=0; i<nr; i++) {
00173 sol_part_mu.set(lz, k, j, i) = 0 ;
00174 sol_part_x.set(lz, k, j, i) = 0 ;
00175 }
00176 for (int i=0; i<nr; i++) {
00177 sol_hom2_mu.set(lz, k, j, i) = 0 ;
00178 sol_hom2_x.set(lz, k, j, i) = 0 ;
00179 }
00180 }
00181 }
00182 }
00183 }
00184
00185
00186
00187
00188
00189 for (int lz=1; lz <= n_shell; lz++) {
00190 int nr = mgrid.get_nr(lz) ;
00191 assert(mgrid.get_nt(lz) == nt) ;
00192 assert(mgrid.get_np(lz) == np) ;
00193 double alpha = mp_aff->get_alpha()[lz] ;
00194 double ech = mp_aff->get_beta()[lz] / alpha ;
00195 Matrice ope(2*nr, 2*nr) ;
00196 ope.set_etat_qcq() ;
00197
00198 for (int k=0 ; k<np+1 ; k++) {
00199 for (int j=0 ; j<nt ; j++) {
00200
00201 base.give_quant_numbers(lz, k, j, m_q, l_q, base_r) ;
00202 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q > 1)) {
00203 Diff_xdsdx oxd(base_r, nr) ; const Matrice& mxd = oxd.get_matrice() ;
00204 Diff_dsdx od(base_r, nr) ; const Matrice& md = od.get_matrice() ;
00205 Diff_id oid(base_r, nr) ; const Matrice& mid = oid.get_matrice() ;
00206
00207 for (int lin=0; lin<nr; lin++)
00208 for (int col=0; col<nr; col++)
00209 ope.set(lin,col) = mxd(lin,col) + ech*md(lin,col)
00210 + 3*mid(lin,col) ;
00211 for (int lin=0; lin<nr; lin++)
00212 for (int col=0; col<nr; col++)
00213 ope.set(lin,col+nr) = (2-l_q*(l_q+1))*mid(lin,col) ;
00214 for (int lin=0; lin<nr; lin++)
00215 for (int col=0; col<nr; col++)
00216 ope.set(lin+nr,col) = -mid(lin,col) ;
00217 for (int lin=0; lin<nr; lin++)
00218 for (int col=0; col<nr; col++)
00219 ope.set(lin+nr,col+nr) = mxd(lin,col) + ech*md(lin,col) ;
00220
00221 int ind0 = 0 ;
00222 int ind1 = nr ;
00223 for (int col=0; col<2*nr; col++) {
00224 ope.set(ind0+nr-1, col) = 0 ;
00225 ope.set(ind1+nr-1, col) = 0 ;
00226 }
00227 ope.set(ind0+nr-1, ind0) = 1 ;
00228 ope.set(ind1+nr-1, ind1) = 1 ;
00229
00230 ope.set_lu() ;
00231
00232 Tbl sec(2*nr) ;
00233 sec.set_etat_qcq() ;
00234 for (int lin=0; lin<nr; lin++)
00235 sec.set(lin) = 0 ;
00236 for (int lin=0; lin<nr; lin++)
00237 sec.set(nr+lin) = (*source_coq.get_spectral_va().c_cf)
00238 (lz, k, j, lin) ;
00239 sec.set(ind0+nr-1) = 0 ;
00240 sec.set(ind1+nr-1) = 0 ;
00241 Tbl sol = ope.inverse(sec) ;
00242 for (int i=0; i<nr; i++) {
00243 sol_part_mu.set(lz, k, j, i) = sol(i) ;
00244 sol_part_x.set(lz, k, j, i) = sol(i+nr) ;
00245 }
00246 sec.annule_hard() ;
00247 sec.set(ind0+nr-1) = 1 ;
00248 sol = ope.inverse(sec) ;
00249 for (int i=0; i<nr; i++) {
00250 sol_hom1_mu.set(lz, k, j, i) = sol(i) ;
00251 sol_hom1_x.set(lz, k, j, i) = sol(i+nr) ;
00252 }
00253 sec.set(ind0+nr-1) = 0 ;
00254 sec.set(ind1+nr-1) = 1 ;
00255 sol = ope.inverse(sec) ;
00256 for (int i=0; i<nr; i++) {
00257 sol_hom2_mu.set(lz, k, j, i) = sol(i) ;
00258 sol_hom2_x.set(lz, k, j, i) = sol(i+nr) ;
00259 }
00260 }
00261 }
00262 }
00263 }
00264
00265
00266
00267
00268 if (cedbc) {int lz = nzm1 ;
00269 int nr = mgrid.get_nr(lz) ;
00270 assert(mgrid.get_nt(lz) == nt) ;
00271 assert(mgrid.get_np(lz) == np) ;
00272 double alpha = mp_aff->get_alpha()[lz] ;
00273 Matrice ope(2*nr, 2*nr) ;
00274 ope.set_etat_qcq() ;
00275
00276 for (int k=0 ; k<np+1 ; k++) {
00277 for (int j=0 ; j<nt ; j++) {
00278
00279 base.give_quant_numbers(lz, k, j, m_q, l_q, base_r) ;
00280 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q > 1)) {
00281 Diff_dsdx od(base_r, nr) ; const Matrice& md = od.get_matrice() ;
00282 Diff_sx os(base_r, nr) ; const Matrice& ms = os.get_matrice() ;
00283
00284 for (int lin=0; lin<nr; lin++)
00285 for (int col=0; col<nr; col++)
00286 ope.set(lin,col) = - md(lin,col) + 3*ms(lin,col) ;
00287 for (int lin=0; lin<nr; lin++)
00288 for (int col=0; col<nr; col++)
00289 ope.set(lin,col+nr) = (2-l_q*(l_q+1))*ms(lin,col) ;
00290 for (int lin=0; lin<nr; lin++)
00291 for (int col=0; col<nr; col++)
00292 ope.set(lin+nr,col) = -ms(lin,col) ;
00293 for (int lin=0; lin<nr; lin++)
00294 for (int col=0; col<nr; col++)
00295 ope.set(lin+nr,col+nr) = -md(lin,col) ;
00296
00297 ope *= 1./alpha ;
00298 int ind0 = 0 ;
00299 int ind1 = nr ;
00300 for (int col=0; col<2*nr; col++) {
00301 ope.set(ind0+nr-1, col) = 0 ;
00302 ope.set(ind1+nr-2, col) = 0 ;
00303 ope.set(ind1+nr-1, col) = 0 ;
00304 }
00305 for (int col=0; col<nr; col++) {
00306 ope.set(ind0+nr-1, col+ind0) = 1 ;
00307 ope.set(ind1+nr-1, col+ind1) = 1 ;
00308 }
00309 ope.set(ind1+nr-2, ind1+1) = 1 ;
00310
00311 ope.set_lu() ;
00312
00313 Tbl sec(2*nr) ;
00314 sec.set_etat_qcq() ;
00315 for (int lin=0; lin<nr; lin++)
00316 sec.set(lin) = 0 ;
00317 for (int lin=0; lin<nr; lin++)
00318 sec.set(nr+lin) = (*source.get_spectral_va().c_cf)
00319 (lz, k, j, lin) ;
00320 sec.set(ind0+nr-1) = 0 ;
00321 sec.set(ind1+nr-2) = 0 ;
00322 sec.set(ind1+nr-1) = 0 ;
00323 Tbl sol = ope.inverse(sec) ;
00324 for (int i=0; i<nr; i++) {
00325 sol_part_mu.set(lz, k, j, i) = sol(i) ;
00326 sol_part_x.set(lz, k, j, i) = sol(i+nr) ;
00327 }
00328 sec.annule_hard() ;
00329 sec.set(ind1+nr-2) = 1 ;
00330 sol = ope.inverse(sec) ;
00331 for (int i=0; i<nr; i++) {
00332 sol_hom1_mu.set(lz, k, j, i) = sol(i) ;
00333 sol_hom1_x.set(lz, k, j, i) = sol(i+nr) ;
00334 }
00335 }
00336 }
00337 }
00338 }
00339
00340
00341
00342
00343 int taille = 2*nz_bc ;
00344 if (cedbc) taille-- ;
00345 Mtbl_cf& mmu = *tilde_mu.set_spectral_va().c_cf ;
00346 Mtbl_cf& mw = *x_new.set_spectral_va().c_cf ;
00347
00348 Tbl sec_membre(taille) ;
00349 Matrice systeme(taille, taille) ;
00350 int ligne ; int colonne ;
00351 Tbl pipo(1) ;
00352 const Tbl& mub = (cedbc ? pipo : par_bc->get_tbl_mod(2) );
00353 double c_mu = (cedbc ? 0 : par_bc->get_tbl_mod(0)(0) ) ;
00354 double d_mu = (cedbc ? 0 : par_bc->get_tbl_mod(0)(1) ) ;
00355 double c_x = (cedbc ? 0 : par_bc->get_tbl_mod(0)(2) ) ;
00356 double d_x = (cedbc ? 0 : par_bc->get_tbl_mod(0)(3) ) ;
00357 Mtbl_cf dhom1_mu = sol_hom1_mu ;
00358 Mtbl_cf dhom2_mu = sol_hom2_mu ;
00359 Mtbl_cf dpart_mu = sol_part_mu ;
00360 Mtbl_cf dhom1_x = sol_hom1_x ;
00361 Mtbl_cf dhom2_x = sol_hom2_x ;
00362 Mtbl_cf dpart_x = sol_part_x ;
00363
00364
00365 dhom1_mu.dsdx() ;
00366 dhom2_mu.dsdx() ;
00367 dpart_mu.dsdx() ;
00368 dhom1_x.dsdx() ;
00369 dhom2_x.dsdx() ;
00370 dpart_x.dsdx() ;
00371
00372
00373
00374
00375 for (int k=0 ; k<np+1 ; k++)
00376 for (int j=0 ; j<nt ; j++) {
00377 base.give_quant_numbers(0, k, j, m_q, l_q, base_r) ;
00378 if ((nullite_plm(j, nt, k, np, base) == 1) && (l_q > 1)) {
00379 ligne = 0 ;
00380 colonne = 0 ;
00381 systeme.annule_hard() ;
00382 sec_membre.annule_hard() ;
00383
00384
00385
00386 int nr = mgrid.get_nr(1) ;
00387
00388 systeme.set(ligne, colonne) = dir * sol_hom1_mu.val_in_bound_jk(1, j, k) + neum* dhom1_mu.val_in_bound_jk(1,j,k);
00389 systeme.set(ligne, colonne+1) = dir * sol_hom2_mu.val_in_bound_jk(1, j, k) + neum* dhom2_mu.val_in_bound_jk(1,j,k);
00390
00391 Mtbl_cf *boundmu = bound_mu.get_spectral_va().c_cf;
00392 double blob = (*boundmu).val_in_bound_jk(1,j,k);
00393 sec_membre.set(ligne) = - dir* sol_part_mu.val_in_bound_jk(1, j, k) - neum * dpart_mu.val_in_bound_jk(1,j,k) + blob;
00394
00395
00396
00397 ligne++;
00398
00399 systeme.set(ligne, colonne) =
00400 sol_hom1_mu.val_out_bound_jk(1, j, k) ;
00401 systeme.set(ligne, colonne+1) =
00402 sol_hom2_mu.val_out_bound_jk(1, j, k) ;
00403
00404 sec_membre.set(ligne) -= sol_part_mu.val_out_bound_jk(1, j, k) ;
00405 ligne++ ;
00406
00407 systeme.set(ligne, colonne) =
00408 sol_hom1_x.val_out_bound_jk(1, j, k) ;
00409 systeme.set(ligne, colonne+1) =
00410 sol_hom2_x.val_out_bound_jk(1, j, k) ;
00411
00412 sec_membre.set(ligne) -= sol_part_x.val_out_bound_jk(1, j, k) ;
00413
00414 colonne += 2 ;
00415
00416
00417 for (int zone=2 ; zone<nz_bc ; zone++) {
00418 nr = mgrid.get_nr(zone) ;
00419 ligne-- ;
00420
00421
00422 systeme.set(ligne, colonne) =
00423 - sol_hom1_mu.val_in_bound_jk(zone, j, k) ;
00424 systeme.set(ligne, colonne+1) =
00425 - sol_hom2_mu.val_in_bound_jk(zone, j, k) ;
00426
00427 sec_membre.set(ligne) += sol_part_mu.val_in_bound_jk(zone, j, k) ;
00428 ligne++ ;
00429
00430 systeme.set(ligne, colonne) =
00431 - sol_hom1_x.val_in_bound_jk(zone, j, k) ;
00432 systeme.set(ligne, colonne+1) =
00433 - sol_hom2_x.val_in_bound_jk(zone, j, k) ;
00434
00435 sec_membre.set(ligne) += sol_part_x.val_in_bound_jk(zone, j, k) ;
00436 ligne++ ;
00437
00438
00439 systeme.set(ligne, colonne) =
00440 sol_hom1_mu.val_out_bound_jk(zone, j, k) ;
00441 systeme.set(ligne, colonne+1) =
00442 sol_hom2_mu.val_out_bound_jk(zone, j, k) ;
00443
00444 sec_membre.set(ligne) -= sol_part_mu.val_out_bound_jk(zone, j, k) ;
00445 ligne++ ;
00446
00447 systeme.set(ligne, colonne) =
00448 sol_hom1_x.val_out_bound_jk(zone, j, k) ;
00449 systeme.set(ligne, colonne+1) =
00450 sol_hom2_x.val_out_bound_jk(zone, j, k) ;
00451
00452 sec_membre.set(ligne) -= sol_part_x.val_out_bound_jk(zone, j, k) ;
00453
00454 colonne += 2 ;
00455 }
00456
00457
00458 nr = mgrid.get_nr(nz_bc) ;
00459 double alpha = mp_aff->get_alpha()[nz_bc] ;
00460 ligne-- ;
00461
00462
00463 systeme.set(ligne, colonne) =
00464 - sol_hom1_mu.val_in_bound_jk(nz_bc, j, k) ;
00465 if (!cedbc) systeme.set(ligne, colonne+1) =
00466 - sol_hom2_mu.val_in_bound_jk(nz_bc, j, k) ;
00467
00468 sec_membre.set(ligne) += sol_part_mu.val_in_bound_jk(nz_bc, j, k) ;
00469 ligne++ ;
00470
00471 systeme.set(ligne, colonne) =
00472 - sol_hom1_x.val_in_bound_jk(nz_bc, j, k) ;
00473 if (!cedbc) systeme.set(ligne, colonne+1) =
00474 - sol_hom2_x.val_in_bound_jk(nz_bc, j, k) ;
00475
00476 sec_membre.set(ligne) += sol_part_x.val_in_bound_jk(nz_bc, j, k) ;
00477 ligne++ ;
00478
00479 if (!cedbc) {
00480
00481 systeme.set(ligne, colonne) =
00482 c_mu*sol_hom1_mu.val_out_bound_jk(nz_bc, j, k)
00483 + d_mu*dhom1_mu.val_out_bound_jk(nz_bc, j, k) / alpha
00484 + c_x*sol_hom1_x.val_out_bound_jk(nz_bc, j, k)
00485 + d_x*dhom1_x.val_out_bound_jk(nz_bc, j, k) / alpha ;
00486 systeme.set(ligne, colonne+1) =
00487 c_mu*sol_hom2_mu.val_out_bound_jk(nz_bc, j, k)
00488 + d_mu*dhom2_mu.val_out_bound_jk(nz_bc, j, k) / alpha
00489 + c_x*sol_hom2_x.val_out_bound_jk(nz_bc, j, k)
00490 + d_x*dhom2_x.val_out_bound_jk(nz_bc, j, k) / alpha ;
00491
00492 sec_membre.set(ligne) -= c_mu*sol_part_mu.val_out_bound_jk(nz_bc, j, k)
00493 + d_mu*dpart_mu.val_out_bound_jk(nz_bc, j, k)/alpha
00494 + c_x*sol_part_mu.val_out_bound_jk(nz_bc, j, k)
00495 + d_x*dpart_mu.val_out_bound_jk(nz_bc, j, k)/alpha
00496 - mub(k, j) ;
00497 }
00498
00499
00500
00501
00503
00504
00505
00506 systeme.set_lu() ;
00507 Tbl facteur = systeme.inverse(sec_membre) ;
00508
00509
00510 int conte = 0 ;
00511
00512
00513
00514 nr = mgrid.get_nr(0) ;
00515 for (int i=0 ; i<nr ; i++) {
00516 mmu.set(0, k, j, i) = 0 ;
00517 mw.set(0, k, j, i) = 0 ;
00518 }
00519 nr = mgrid.get_nr(1) ;
00520 for (int i=0 ; i<nr ; i++) {
00521 mmu.set(1, k, j, i) = sol_part_mu(1, k, j, i)
00522 + facteur(conte)*sol_hom1_mu(1, k, j, i)
00523 + facteur(conte+1)*sol_hom2_mu(1, k, j, i);
00524 mw.set(1, k, j, i) = sol_part_x(1, k, j, i)
00525 + facteur(conte)*sol_hom1_x(1, k, j, i)
00526 + facteur(conte+1)*sol_hom2_x(1,k,j,i);
00527 }
00528 conte+=2 ;
00529 for (int zone=2 ; zone<=n_shell ; zone++) {
00530 nr = mgrid.get_nr(zone) ;
00531 for (int i=0 ; i<nr ; i++) {
00532 mmu.set(zone, k, j, i) = sol_part_mu(zone, k, j, i)
00533 + facteur(conte)*sol_hom1_mu(zone, k, j, i)
00534 + facteur(conte+1)*sol_hom2_mu(zone, k, j, i) ;
00535
00536 mw.set(zone, k, j, i) = sol_part_x(zone, k, j, i)
00537 + facteur(conte)*sol_hom1_x(zone, k, j, i)
00538 + facteur(conte+1)*sol_hom2_x(zone, k, j, i) ;
00539 }
00540 conte+=2 ;
00541 }
00542 if (cedbc) {
00543 nr = mgrid.get_nr(nzm1) ;
00544 for (int i=0 ; i<nr ; i++) {
00545 mmu.set(nzm1, k, j, i) = sol_part_mu(nzm1, k, j, i)
00546 + facteur(conte)*sol_hom1_mu(nzm1, k, j, i) ;
00547
00548 mw.set(nzm1, k, j, i) = sol_part_x(nzm1, k, j, i)
00549 + facteur(conte)*sol_hom1_x(nzm1, k, j, i) ;
00550 }
00551 }
00552 }
00553 }
00554
00555 if (tilde_mu.set_spectral_va().c != 0x0)
00556 delete tilde_mu.set_spectral_va().c ;
00557 tilde_mu.set_spectral_va().c = 0x0 ;
00558 tilde_mu.set_spectral_va().ylm_i() ;
00559
00560 if (x_new.set_spectral_va().c != 0x0)
00561 delete x_new.set_spectral_va().c ;
00562 x_new.set_spectral_va().c = 0x0 ;
00563 x_new.set_spectral_va().ylm_i();
00564
00565 }
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575 void Sym_tensor_trans::sol_Dirac_BC2(const Scalar& bb, const Scalar& cc, const Scalar& hh,
00576 Scalar& hrr, Scalar& tilde_eta, Scalar& ww, Scalar bound_eta,double dir, double neum, double rhor, Param* par_bc, Param* par_mat) {
00577
00578 const Map_af* mp_aff = dynamic_cast<const Map_af*>(mp) ;
00579 assert(mp_aff != 0x0) ;
00580
00581 const Mg3d& mgrid = *mp_aff->get_mg() ;
00582 assert(mgrid.get_type_r(0) == RARE) ;
00583
00584 int nz = mgrid.get_nzone() ;
00585 int nzm1 = nz - 1 ;
00586 bool ced = (mgrid.get_type_r(nzm1) == UNSURR) ;
00587 int n_shell = ced ? nz-2 : nzm1 ;
00588 int nz_bc = nzm1 ;
00589 if (par_bc != 0x0)
00590 if (par_bc->get_n_int() > 0)
00591 nz_bc = par_bc->get_int() ;
00592 n_shell = (nz_bc < n_shell ? nz_bc : n_shell) ;
00593 bool cedbc = (ced && (nz_bc == nzm1)) ;
00594 #ifndef NDEBUG
00595 if (!cedbc) {
00596 assert(par_bc != 0x0) ;
00597 assert(par_bc->get_n_tbl_mod() >= 2) ;
00598 }
00599 #endif
00600 int nt = mgrid.get_nt(0) ;
00601 int np = mgrid.get_np(0) ;
00602
00603 int l_q, m_q, base_r;
00604
00605
00606
00607 Scalar bb2 = bb; bb2.set_spectral_va().ylm();
00608 Scalar cc2 = cc; cc2.set_spectral_va().ylm();
00609
00610
00611 Scalar hh2 = hh; hh2.set_spectral_va().ylm();
00612
00613 Base_val base = hh2.get_spectral_base() ;
00614
00615
00616 Scalar tilde_b(*mp_aff); tilde_b.annule_hard(); tilde_b.std_spectral_base();
00617 tilde_b.set_spectral_va().ylm();
00618
00619
00620
00621
00622 for (int lz=0; lz<nz; lz++) {
00623 int nr = mgrid.get_nr(lz);
00624 for (int k=0; k<np+1; k++)
00625 for (int j=0; j<nt; j++) {
00626 base.give_quant_numbers(lz, k, j, m_q, l_q, base_r) ;
00627 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q > 1))
00628 {
00629 for (int i=0; i<nr; i++)
00630 tilde_b.set_spectral_va().c_cf->set(lz, k, j, i)
00631 += 2*(*bb2.get_spectral_va().c_cf)(lz, k, j, i)
00632 + (*cc2.get_spectral_va().c_cf)(lz, k, j, i)/ (2* double(l_q +1.));
00633 }
00634 }
00635 }
00636
00637
00638 if (tilde_b.set_spectral_va().c != 0x0)
00639 delete tilde_b.set_spectral_va().c ;
00640 tilde_b.set_spectral_va().c = 0x0 ;
00641 tilde_b.set_spectral_va().coef_i();
00642
00643
00644 if ( (tilde_b.get_etat() == ETATZERO) && (hh.get_etat() == ETATZERO) ) {
00645 hrr = 0 ;
00646 tilde_eta = 0 ;
00647 ww = 0 ;
00648 return ;
00649 }
00650
00651 bound_eta.set_spectral_va().ylm();
00652 Scalar tilde_b2 = tilde_b;
00653 tilde_b2.set_spectral_va().ylm();
00654
00655 assert (tilde_b.get_etat() != ETATNONDEF) ;
00656 assert (hh.get_etat() != ETATNONDEF) ;
00657
00658 Scalar source = tilde_b ;
00659 Scalar source_coq = tilde_b ;
00660 source_coq.annule_domain(0) ;
00661 source_coq.annule_domain(nzm1) ;
00662 source_coq.mult_r() ;
00663 source.set_spectral_va().ylm() ;
00664 source_coq.set_spectral_va().ylm() ;
00665 bool bnull = (tilde_b.get_etat() == ETATZERO) ;
00666
00667 assert(hh.check_dzpuis(0)) ;
00668 Scalar hoverr = hh ;
00669 hoverr.div_r_dzpuis(2) ;
00670 hoverr.set_spectral_va().ylm() ;
00671 Scalar dhdr = hh.dsdr() ;
00672 dhdr.set_spectral_va().ylm() ;
00673 Scalar h_coq = hh ;
00674 h_coq.set_spectral_va().ylm() ;
00675 Scalar dh_coq = hh.dsdr() ;
00676 dh_coq.mult_r_dzpuis(0) ;
00677 dh_coq.set_spectral_va().ylm() ;
00678 bool hnull = (hh.get_etat() == ETATZERO) ;
00679
00680 int lmax = base.give_lmax(mgrid, 0) + 1;
00681
00682
00683
00684
00685 bool need_calculation = true ;
00686 if (par_mat != 0x0) {
00687 bool param_new = false ;
00688 if ((par_mat->get_n_int_mod() >= 4)
00689 &&(par_mat->get_n_tbl_mod()>=1)
00690 &&(par_mat->get_n_matrice_mod()>=1)
00691 &&(par_mat->get_n_itbl_mod()>=1)) {
00692 if (par_mat->get_int_mod(0) < nz_bc) param_new = true ;
00693 if (par_mat->get_int_mod(1) != lmax) param_new = true ;
00694 if (par_mat->get_int_mod(2) != mgrid.get_type_t() ) param_new = true ;
00695 if (par_mat->get_int_mod(3) != mgrid.get_type_p() ) param_new = true ;
00696 if (par_mat->get_itbl_mod(0)(0) != mgrid.get_nr(0)) param_new = true ;
00697 if (fabs(par_mat->get_tbl_mod(0)(0) - mp_aff->get_alpha()[0]) > 2.e-15)
00698 param_new = true ;
00699 for (int l=1; l<= n_shell; l++) {
00700 if (par_mat->get_itbl_mod(0)(l) != mgrid.get_nr(l)) param_new = true ;
00701 if (fabs(par_mat->get_tbl_mod(0)(l) - mp_aff->get_beta()[l] /
00702 mp_aff->get_alpha()[l]) > 2.e-15) param_new = true ;
00703 }
00704 if (ced) {
00705 if (par_mat->get_itbl_mod(0)(nzm1) != mgrid.get_nr(nzm1)) param_new = true ;
00706 if (fabs(par_mat->get_tbl_mod(0)(nzm1) - mp_aff->get_alpha()[nzm1]) > 2.e-15)
00707 param_new = true ;
00708 }
00709 }
00710 else{
00711 param_new = true ;
00712 }
00713 if (param_new) {
00714 par_mat->clean_all() ;
00715 par_mat->add_int_mod(*(new int(nz_bc)), 0) ;
00716 par_mat->add_int_mod(*(new int(lmax)), 1) ;
00717 par_mat->add_int_mod(*(new int(mgrid.get_type_t())), 2) ;
00718 par_mat->add_int_mod(*(new int(mgrid.get_type_p())), 3) ;
00719 Itbl* pnr = new Itbl(nz) ;
00720 pnr->set_etat_qcq() ;
00721 par_mat->add_itbl_mod(*pnr) ;
00722 for (int l=0; l<nz; l++)
00723 pnr->set(l) = mgrid.get_nr(l) ;
00724 Tbl* palpha = new Tbl(nz) ;
00725 palpha->set_etat_qcq() ;
00726 par_mat->add_tbl_mod(*palpha) ;
00727 palpha->set(0) = mp_aff->get_alpha()[0] ;
00728 for (int l=1; l<nzm1; l++)
00729 palpha->set(l) = mp_aff->get_beta()[l] / mp_aff->get_alpha()[l] ;
00730 palpha->set(nzm1) = mp_aff->get_alpha()[nzm1] ;
00731 }
00732 else need_calculation = false ;
00733 }
00734
00735 hrr.set_etat_qcq() ;
00736 hrr.set_spectral_base(base) ;
00737 hrr.set_spectral_va().set_etat_cf_qcq() ;
00738 hrr.set_spectral_va().c_cf->annule_hard() ;
00739 tilde_eta.annule_hard() ;
00740 tilde_eta.set_spectral_base(base) ;
00741 tilde_eta.set_spectral_va().set_etat_cf_qcq() ;
00742 tilde_eta.set_spectral_va().c_cf->annule_hard() ;
00743 ww.annule_hard() ;
00744 ww.set_spectral_base(base) ;
00745 ww.set_spectral_va().set_etat_cf_qcq() ;
00746 ww.set_spectral_va().c_cf->annule_hard() ;
00747
00748 sol_Dirac_l01(hh2, hrr, tilde_eta, par_mat) ;
00749 tilde_eta.annule_l(0,0, true) ;
00750
00751 Mtbl_cf sol_part_hrr(mgrid, base) ; sol_part_hrr.annule_hard() ;
00752 Mtbl_cf sol_part_eta(mgrid, base) ; sol_part_eta.annule_hard() ;
00753 Mtbl_cf sol_part_w(mgrid, base) ; sol_part_w.annule_hard() ;
00754 Mtbl_cf sol_hom1_hrr(mgrid, base) ; sol_hom1_hrr.annule_hard() ;
00755 Mtbl_cf sol_hom1_eta(mgrid, base) ; sol_hom1_eta.annule_hard() ;
00756 Mtbl_cf sol_hom1_w(mgrid, base) ; sol_hom1_w.annule_hard() ;
00757 Mtbl_cf sol_hom2_hrr(mgrid, base) ; sol_hom2_hrr.annule_hard() ;
00758 Mtbl_cf sol_hom2_eta(mgrid, base) ; sol_hom2_eta.annule_hard() ;
00759 Mtbl_cf sol_hom2_w(mgrid, base) ; sol_hom2_w.annule_hard() ;
00760 Mtbl_cf sol_hom3_hrr(mgrid, base) ; sol_hom3_hrr.annule_hard() ;
00761 Mtbl_cf sol_hom3_eta(mgrid, base) ; sol_hom3_eta.annule_hard() ;
00762 Mtbl_cf sol_hom3_w(mgrid, base) ; sol_hom3_w.annule_hard() ;
00763
00764 Itbl mat_done(lmax) ;
00765
00766
00767
00768
00769
00770
00771
00772
00773 {int lz = 0 ;
00774 int nr = mgrid.get_nr(lz) ;
00775 double alpha = mp_aff->get_alpha()[lz] ;
00776 Matrice ope(3*nr, 3*nr) ;
00777 int ind2 = 2*nr ;
00778 if (need_calculation && (par_mat != 0x0)) mat_done.annule_hard() ;
00779
00780 for (int k=0 ; k<np+1 ; k++) {
00781 for (int j=0 ; j<nt ; j++) {
00782
00783 base.give_quant_numbers(lz, k, j, m_q, l_q, base_r) ;
00784 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q > 1)) {
00785 if (need_calculation) {
00786 ope.set_etat_qcq() ;
00787 Diff_dsdx od(base_r, nr) ; const Matrice& md = od.get_matrice() ;
00788 Diff_sx os(base_r, nr) ; const Matrice& ms = os.get_matrice() ;
00789
00790 for (int lin=0; lin<nr; lin++)
00791 for (int col=0; col<nr; col++)
00792 ope.set(lin,col) = md(lin,col) + 3*ms(lin,col) ;
00793 for (int lin=0; lin<nr; lin++)
00794 for (int col=0; col<nr; col++)
00795 ope.set(lin,col+nr) = -l_q*(l_q+1)*ms(lin,col) ;
00796 for (int lin=0; lin<nr; lin++)
00797 for (int col=0; col<nr; col++)
00798 ope.set(lin,col+2*nr) = 0 ;
00799 for (int lin=0; lin<nr; lin++)
00800 for (int col=0; col<nr; col++)
00801 ope.set(lin+nr,col) = -0.5*ms(lin,col) ;
00802 for (int lin=0; lin<nr; lin++)
00803 for (int col=0; col<nr; col++)
00804 ope.set(lin+nr,col+nr) = md(lin,col) + 3*ms(lin,col) ;
00805 for (int lin=0; lin<nr; lin++)
00806 for (int col=0; col<nr; col++)
00807 ope.set(lin+nr,col+2*nr) = (2. - l_q*(l_q+1))*ms(lin,col) ;
00808 for (int lin=0; lin<nr; lin++)
00809 for (int col=0; col<nr; col++)
00810 ope.set(lin+2*nr,col) = -0.5*md(lin,col)/double(l_q+1)
00811 - 0.5*double(l_q+4)/double(l_q+1)*ms(lin,col) ;
00812 for (int lin=0; lin<nr; lin++)
00813 for (int col=0; col<nr; col++)
00814 ope.set(lin+2*nr,col+nr) = -2*ms(lin,col) ;
00815 for (int lin=0; lin<nr; lin++)
00816 for (int col=0; col<nr; col++)
00817 ope.set(lin+2*nr,col+2*nr) = (l_q+2)*md(lin,col)
00818 + l_q*(l_q+2)*ms(lin,col) ;
00819
00820 ope *= 1./alpha ;
00821 for (int col=0; col<3*nr; col++)
00822 if (l_q>2) ope.set(ind2+nr-2, col) = 0 ;
00823 for (int col=0; col<3*nr; col++) {
00824 ope.set(nr-1, col) = 0 ;
00825 ope.set(2*nr-1, col) = 0 ;
00826 ope.set(3*nr-1, col) = 0 ;
00827 }
00828 int pari = 1 ;
00829 if (base_r == R_CHEBP) {
00830 for (int col=0; col<nr; col++) {
00831 ope.set(nr-1, col) = pari ;
00832 ope.set(2*nr-1, col+nr) = pari ;
00833 ope.set(3*nr-1, col+2*nr) = pari ;
00834 pari = - pari ;
00835 }
00836 }
00837 else {
00838 ope.set(nr-1, nr-1) = 1 ;
00839 ope.set(2*nr-1, 2*nr-1) = 1 ;
00840 ope.set(3*nr-1, 3*nr-1) = 1 ;
00841 }
00842 if (l_q>2)
00843 ope.set(ind2+nr-2, ind2) = 1 ;
00844
00845 ope.set_lu() ;
00846 if ((par_mat != 0x0) && (mat_done(l_q) == 0)) {
00847 Matrice* pope = new Matrice(ope) ;
00848 par_mat->add_matrice_mod(*pope, lz*lmax + l_q) ;
00849 mat_done.set(l_q) = 1 ;
00850 }
00851 }
00852
00853 const Matrice& oper = (par_mat == 0x0 ? ope :
00854 par_mat->get_matrice_mod(lz*lmax + l_q) ) ;
00855 Tbl sec(3*nr) ;
00856 sec.set_etat_qcq() ;
00857 if (hnull) {
00858 for (int lin=0; lin<2*nr; lin++)
00859 sec.set(lin) = 0 ;
00860 for (int lin=0; lin<nr; lin++)
00861 sec.set(2*nr+lin) = (*source.get_spectral_va().c_cf)
00862 (lz, k, j, lin) ;
00863 }
00864 else {
00865 for (int lin=0; lin<nr; lin++)
00866 sec.set(lin) = (*hoverr.get_spectral_va().c_cf)(lz, k, j, lin) ;
00867 for (int lin=0; lin<nr; lin++)
00868 sec.set(lin+nr) = -0.5*(*hoverr.get_spectral_va().c_cf)
00869 (lz, k, j, lin) ;
00870 if (bnull) {
00871 for (int lin=0; lin<nr; lin++)
00872 sec.set(2*nr+lin) = -0.5/double(l_q+1)*(
00873 (*dhdr.get_spectral_va().c_cf)(lz, k, j, lin)
00874 + (l_q+2)*(*hoverr.get_spectral_va().c_cf)(lz, k, j, lin) ) ;
00875 }
00876 else {
00877 for (int lin=0; lin<nr; lin++)
00878 sec.set(2*nr+lin) = -0.5/double(l_q+1)*(
00879 (*dhdr.get_spectral_va().c_cf)(lz, k, j, lin)
00880 + (l_q+2)*(*hoverr.get_spectral_va().c_cf)(lz, k, j, lin) )
00881 + (*source.get_spectral_va().c_cf)(lz, k, j, lin) ;
00882 }
00883 }
00884 if (l_q>2) sec.set(ind2+nr-2) = 0 ;
00885 sec.set(3*nr-1) = 0 ;
00886 Tbl sol = oper.inverse(sec) ;
00887 for (int i=0; i<nr; i++) {
00888 sol_part_hrr.set(lz, k, j, i) = sol(i) ;
00889 sol_part_eta.set(lz, k, j, i) = sol(i+nr) ;
00890 sol_part_w.set(lz, k, j, i) = sol(i+2*nr) ;
00891 }
00892 sec.annule_hard() ;
00893 if (l_q>2) {
00894 sec.set(ind2+nr-2) = 1 ;
00895 sol = oper.inverse(sec) ;
00896 }
00897 else {
00898 sol.annule_hard() ;
00899 sol.set(0) = 4 ;
00900 sol.set(nr) = 2 ;
00901 sol.set(2*nr) = 1 ;
00902 }
00903 for (int i=0; i<nr; i++) {
00904 sol_hom3_hrr.set(lz, k, j, i) = sol(i) ;
00905 sol_hom3_eta.set(lz, k, j, i) = sol(i+nr) ;
00906 sol_hom3_w.set(lz, k, j, i) = sol(i+2*nr) ;
00907 }
00908 }
00909 }
00910 }
00911 }
00912
00913
00914
00915
00916
00917
00918 for (int lz=1; lz<= n_shell; lz++) {
00919 if (need_calculation && (par_mat != 0x0)) mat_done.annule_hard() ;
00920 int nr = mgrid.get_nr(lz) ;
00921 int ind0 = 0 ;
00922 int ind1 = nr ;
00923 int ind2 = 2*nr ;
00924 double alpha = mp_aff->get_alpha()[lz] ;
00925 double ech = mp_aff->get_beta()[lz] / alpha ;
00926 Matrice ope(3*nr, 3*nr) ;
00927
00928 for (int k=0 ; k<np+1 ; k++) {
00929 for (int j=0 ; j<nt ; j++) {
00930
00931 base.give_quant_numbers(lz, k, j, m_q, l_q, base_r) ;
00932 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q > 1)) {
00933 if (need_calculation) {
00934 ope.set_etat_qcq() ;
00935 Diff_xdsdx oxd(base_r, nr) ; const Matrice& mxd = oxd.get_matrice() ;
00936 Diff_dsdx od(base_r, nr) ; const Matrice& md = od.get_matrice() ;
00937 Diff_id oid(base_r, nr) ; const Matrice& mid = oid.get_matrice() ;
00938
00939 for (int lin=0; lin<nr; lin++)
00940 for (int col=0; col<nr; col++)
00941 ope.set(lin,col) = mxd(lin,col) + ech*md(lin,col)
00942 + 3*mid(lin,col) ;
00943 for (int lin=0; lin<nr; lin++)
00944 for (int col=0; col<nr; col++)
00945 ope.set(lin,col+nr) = -l_q*(l_q+1)*mid(lin,col) ;
00946 for (int lin=0; lin<nr; lin++)
00947 for (int col=0; col<nr; col++)
00948 ope.set(lin,col+2*nr) = 0 ;
00949 for (int lin=0; lin<nr; lin++)
00950 for (int col=0; col<nr; col++)
00951 ope.set(lin+nr,col) = -0.5*mid(lin,col) ;
00952 for (int lin=0; lin<nr; lin++)
00953 for (int col=0; col<nr; col++)
00954 ope.set(lin+nr,col+nr) = mxd(lin,col) + ech*md(lin,col)
00955 + 3*mid(lin,col) ;
00956 for (int lin=0; lin<nr; lin++)
00957 for (int col=0; col<nr; col++)
00958 ope.set(lin+nr,col+2*nr) = (2. - l_q*(l_q+1))*mid(lin,col) ;
00959 for (int lin=0; lin<nr; lin++)
00960 for (int col=0; col<nr; col++)
00961 ope.set(lin+2*nr,col) =
00962 -0.5/double(l_q+1)*(mxd(lin,col) + ech*md(lin,col)
00963 + double(l_q+4)*mid(lin,col)) ;
00964 for (int lin=0; lin<nr; lin++)
00965 for (int col=0; col<nr; col++)
00966 ope.set(lin+2*nr,col+nr) = -2*mid(lin,col) ;
00967 for (int lin=0; lin<nr; lin++)
00968 for (int col=0; col<nr; col++)
00969 ope.set(lin+2*nr,col+2*nr) =
00970 double(l_q+2)*(mxd(lin,col) + ech*md(lin,col)
00971 + l_q*mid(lin,col)) ;
00972 for (int col=0; col<3*nr; col++) {
00973 ope.set(ind0+nr-1, col) = 0 ;
00974 ope.set(ind1+nr-1, col) = 0 ;
00975 ope.set(ind2+nr-1, col) = 0 ;
00976 }
00977 ope.set(ind0+nr-1, ind0) = 1 ;
00978 ope.set(ind1+nr-1, ind1) = 1 ;
00979 ope.set(ind2+nr-1, ind2) = 1 ;
00980
00981 ope.set_lu() ;
00982 if ((par_mat != 0x0) && (mat_done(l_q) == 0)) {
00983 Matrice* pope = new Matrice(ope) ;
00984 par_mat->add_matrice_mod(*pope, lz*lmax + l_q) ;
00985 mat_done.set(l_q) = 1 ;
00986 }
00987 }
00988 const Matrice& oper = (par_mat == 0x0 ? ope :
00989 par_mat->get_matrice_mod(lz*lmax + l_q) ) ;
00990 Tbl sec(3*nr) ;
00991 sec.set_etat_qcq() ;
00992 if (hnull) {
00993 for (int lin=0; lin<2*nr; lin++)
00994 sec.set(lin) = 0 ;
00995 for (int lin=0; lin<nr; lin++)
00996 sec.set(2*nr+lin) = (*source_coq.get_spectral_va().c_cf)
00997 (lz, k, j, lin) ;
00998 }
00999 else {
01000 for (int lin=0; lin<nr; lin++)
01001 sec.set(lin) = (*h_coq.get_spectral_va().c_cf)(lz, k, j, lin) ;
01002 for (int lin=0; lin<nr; lin++)
01003 sec.set(lin+nr) = -0.5*(*h_coq.get_spectral_va().c_cf)
01004 (lz, k, j, lin) ;
01005 if (bnull) {
01006 for (int lin=0; lin<nr; lin++)
01007 sec.set(2*nr+lin) = -0.5/double(l_q+1)*(
01008 (*dh_coq.get_spectral_va().c_cf)(lz, k, j, lin)
01009 + (l_q+2)*(*h_coq.get_spectral_va().c_cf)(lz, k, j, lin) ) ;
01010 }
01011 else {
01012 for (int lin=0; lin<nr; lin++)
01013 sec.set(2*nr+lin) = -0.5/double(l_q+1)*(
01014 (*dh_coq.get_spectral_va().c_cf)(lz, k, j, lin)
01015 + (l_q+2)*(*h_coq.get_spectral_va().c_cf)(lz, k, j, lin) )
01016 + (*source_coq.get_spectral_va().c_cf)(lz, k, j, lin) ;
01017 }
01018 }
01019 sec.set(ind0+nr-1) = 0 ;
01020 sec.set(ind1+nr-1) = 0 ;
01021 sec.set(ind2+nr-1) = 0 ;
01022 Tbl sol = oper.inverse(sec) ;
01023 for (int i=0; i<nr; i++) {
01024 sol_part_hrr.set(lz, k, j, i) = sol(i) ;
01025 sol_part_eta.set(lz, k, j, i) = sol(i+nr) ;
01026 sol_part_w.set(lz, k, j, i) = sol(i+2*nr) ;
01027 }
01028 sec.annule_hard() ;
01029 sec.set(ind0+nr-1) = 1 ;
01030 sol = oper.inverse(sec) ;
01031 for (int i=0; i<nr; i++) {
01032 sol_hom1_hrr.set(lz, k, j, i) = sol(i) ;
01033 sol_hom1_eta.set(lz, k, j, i) = sol(i+nr) ;
01034 sol_hom1_w.set(lz, k, j, i) = sol(i+2*nr) ;
01035 }
01036 sec.set(ind0+nr-1) = 0 ;
01037 sec.set(ind1+nr-1) = 1 ;
01038 sol = oper.inverse(sec) ;
01039 for (int i=0; i<nr; i++) {
01040 sol_hom2_hrr.set(lz, k, j, i) = sol(i) ;
01041 sol_hom2_eta.set(lz, k, j, i) = sol(i+nr) ;
01042 sol_hom2_w.set(lz, k, j, i) = sol(i+2*nr) ;
01043 }
01044 sec.set(ind1+nr-1) = 0 ;
01045 sec.set(ind2+nr-1) = 1 ;
01046 sol = oper.inverse(sec) ;
01047 for (int i=0; i<nr; i++) {
01048 sol_hom3_hrr.set(lz, k, j, i) = sol(i) ;
01049 sol_hom3_eta.set(lz, k, j, i) = sol(i+nr) ;
01050 sol_hom3_w.set(lz, k, j, i) = sol(i+2*nr) ;
01051 }
01052 }
01053 }
01054 }
01055 }
01056
01057
01058
01059
01060 if (cedbc) {int lz = nzm1 ;
01061 if (need_calculation && (par_mat != 0x0)) mat_done.annule_hard() ;
01062 int nr = mgrid.get_nr(lz) ;
01063 int ind0 = 0 ;
01064 int ind1 = nr ;
01065 int ind2 = 2*nr ;
01066 double alpha = mp_aff->get_alpha()[lz] ;
01067 Matrice ope(3*nr, 3*nr) ;
01068
01069 for (int k=0 ; k<np+1 ; k++) {
01070 for (int j=0 ; j<nt ; j++) {
01071
01072 base.give_quant_numbers(lz, k, j, m_q, l_q, base_r) ;
01073 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q > 1)) {
01074 if (need_calculation) {
01075 ope.set_etat_qcq() ;
01076 Diff_dsdx od(base_r, nr) ; const Matrice& md = od.get_matrice() ;
01077 Diff_sx os(base_r, nr) ; const Matrice& ms = os.get_matrice() ;
01078
01079 for (int lin=0; lin<nr; lin++)
01080 for (int col=0; col<nr; col++)
01081 ope.set(lin,col) = - md(lin,col) + 3*ms(lin,col) ;
01082 for (int lin=0; lin<nr; lin++)
01083 for (int col=0; col<nr; col++)
01084 ope.set(lin,col+nr) = -l_q*(l_q+1)*ms(lin,col) ;
01085 for (int lin=0; lin<nr; lin++)
01086 for (int col=0; col<nr; col++)
01087 ope.set(lin,col+2*nr) = 0 ;
01088 for (int lin=0; lin<nr; lin++)
01089 for (int col=0; col<nr; col++)
01090 ope.set(lin+nr,col) = -0.5*ms(lin,col) ;
01091 for (int lin=0; lin<nr; lin++)
01092 for (int col=0; col<nr; col++)
01093 ope.set(lin+nr,col+nr) = -md(lin,col) + 3*ms(lin,col) ;
01094 for (int lin=0; lin<nr; lin++)
01095 for (int col=0; col<nr; col++)
01096 ope.set(lin+nr,col+2*nr) = (2. - l_q*(l_q+1))*ms(lin,col) ;
01097 for (int lin=0; lin<nr; lin++)
01098 for (int col=0; col<nr; col++)
01099 ope.set(lin+2*nr,col) = 0.5*md(lin,col)/double(l_q+1)
01100 - 0.5*double(l_q+4)/double(l_q+1)*ms(lin,col) ;
01101 for (int lin=0; lin<nr; lin++)
01102 for (int col=0; col<nr; col++)
01103 ope.set(lin+2*nr,col+nr) = -2*ms(lin,col) ;
01104 for (int lin=0; lin<nr; lin++)
01105 for (int col=0; col<nr; col++)
01106 ope.set(lin+2*nr,col+2*nr) = -(l_q+2)*md(lin,col)
01107 + l_q*(l_q+2)*ms(lin,col) ;
01108 ope *= 1./alpha ;
01109 for (int col=0; col<3*nr; col++) {
01110 ope.set(ind0+nr-2, col) = 0 ;
01111 ope.set(ind0+nr-1, col) = 0 ;
01112 ope.set(ind1+nr-2, col) = 0 ;
01113 ope.set(ind1+nr-1, col) = 0 ;
01114 ope.set(ind2+nr-1, col) = 0 ;
01115 }
01116 for (int col=0; col<nr; col++) {
01117 ope.set(ind0+nr-1, col+ind0) = 1 ;
01118 ope.set(ind1+nr-1, col+ind1) = 1 ;
01119 ope.set(ind2+nr-1, col+ind2) = 1 ;
01120 }
01121 ope.set(ind0+nr-2, ind0+1) = 1 ;
01122 ope.set(ind1+nr-2, ind1+2) = 1 ;
01123
01124 ope.set_lu() ;
01125 if ((par_mat != 0x0) && (mat_done(l_q) == 0)) {
01126 Matrice* pope = new Matrice(ope) ;
01127 par_mat->add_matrice_mod(*pope, lz*lmax + l_q) ;
01128 mat_done.set(l_q) = 1 ;
01129 }
01130 }
01131 const Matrice& oper = (par_mat == 0x0 ? ope :
01132 par_mat->get_matrice_mod(lz*lmax + l_q) ) ;
01133
01134 Tbl sec(3*nr) ;
01135 sec.set_etat_qcq() ;
01136 if (hnull) {
01137 for (int lin=0; lin<2*nr; lin++)
01138 sec.set(lin) = 0 ;
01139 for (int lin=0; lin<nr; lin++)
01140 sec.set(2*nr+lin) = (*source.get_spectral_va().c_cf)
01141 (lz, k, j, lin) ;
01142 }
01143 else {
01144 for (int lin=0; lin<nr; lin++)
01145 sec.set(lin) = (*hoverr.get_spectral_va().c_cf)(lz, k, j, lin) ;
01146 for (int lin=0; lin<nr; lin++)
01147 sec.set(lin+nr) = -0.5*(*hoverr.get_spectral_va().c_cf)
01148 (lz, k, j, lin) ;
01149 if (bnull) {
01150 for (int lin=0; lin<nr; lin++)
01151 sec.set(2*nr+lin) = -0.5/double(l_q+1)*(
01152 (*dhdr.get_spectral_va().c_cf)(lz, k, j, lin)
01153 + (l_q+2)*(*hoverr.get_spectral_va().c_cf)(lz, k, j, lin) ) ;
01154 }
01155 else {
01156 for (int lin=0; lin<nr; lin++)
01157 sec.set(2*nr+lin) = -0.5/double(l_q+1)*(
01158 (*dhdr.get_spectral_va().c_cf)(lz, k, j, lin)
01159 + (l_q+2)*(*hoverr.get_spectral_va().c_cf)(lz, k, j, lin) )
01160 + (*source.get_spectral_va().c_cf)(lz, k, j, lin) ;
01161 }
01162 }
01163 sec.set(ind0+nr-2) = 0 ;
01164 sec.set(ind0+nr-1) = 0 ;
01165 sec.set(ind1+nr-1) = 0 ;
01166 sec.set(ind1+nr-2) = 0 ;
01167 sec.set(ind2+nr-1) = 0 ;
01168 Tbl sol = oper.inverse(sec) ;
01169 for (int i=0; i<nr; i++) {
01170 sol_part_hrr.set(lz, k, j, i) = sol(i) ;
01171 sol_part_eta.set(lz, k, j, i) = sol(i+nr) ;
01172 sol_part_w.set(lz, k, j, i) = sol(i+2*nr) ;
01173 }
01174 sec.annule_hard() ;
01175 sec.set(ind0+nr-2) = 1 ;
01176 sol = oper.inverse(sec) ;
01177 for (int i=0; i<nr; i++) {
01178 sol_hom1_hrr.set(lz, k, j, i) = sol(i) ;
01179 sol_hom1_eta.set(lz, k, j, i) = sol(i+nr) ;
01180 sol_hom1_w.set(lz, k, j, i) = sol(i+2*nr) ;
01181 }
01182 sec.set(ind0+nr-2) = 0 ;
01183 sec.set(ind1+nr-2) = 1 ;
01184 sol = oper.inverse(sec) ;
01185 for (int i=0; i<nr; i++) {
01186 sol_hom2_hrr.set(lz, k, j, i) = sol(i) ;
01187 sol_hom2_eta.set(lz, k, j, i) = sol(i+nr) ;
01188 sol_hom2_w.set(lz, k, j, i) = sol(i+2*nr) ;
01189 }
01190 }
01191 }
01192 }
01193 }
01194
01195
01196
01197
01198
01199 int taille = 3*nz_bc ;
01200 if (cedbc) taille-- ;
01201 Mtbl_cf& mhrr = *hrr.set_spectral_va().c_cf ;
01202 Mtbl_cf& meta = *tilde_eta.set_spectral_va().c_cf ;
01203 Mtbl_cf& mw = *ww.set_spectral_va().c_cf ;
01204 Tbl sec_membre(taille) ;
01205 Matrice systeme(taille, taille) ;
01206 int ligne ; int colonne ;
01207 Tbl pipo(1) ;
01208 const Tbl& hrrb = (cedbc ? pipo : par_bc->get_tbl_mod(1) );
01209 double chrr = (cedbc ? 0 : par_bc->get_tbl_mod()(4) ) ;
01210 double dhrr = (cedbc ? 0 : par_bc->get_tbl_mod()(5) ) ;
01211 double ceta = (cedbc ? 0 : par_bc->get_tbl_mod()(6) ) ;
01212 double deta = (cedbc ? 0 : par_bc->get_tbl_mod()(7) ) ;
01213 double cw = (cedbc ? 0 : par_bc->get_tbl_mod()(8) ) ;
01214 double dw = (cedbc ? 0 : par_bc->get_tbl_mod()(9) ) ;
01215 Mtbl_cf dhom1_hrr = sol_hom1_hrr ;
01216 Mtbl_cf dhom2_hrr = sol_hom2_hrr ;
01217 Mtbl_cf dhom3_hrr = sol_hom3_hrr ;
01218 Mtbl_cf dpart_hrr = sol_part_hrr ;
01219 Mtbl_cf dhom1_eta = sol_hom1_eta ;
01220 Mtbl_cf dhom2_eta = sol_hom2_eta ;
01221 Mtbl_cf dhom3_eta = sol_hom3_eta ;
01222 Mtbl_cf dpart_eta = sol_part_eta ;
01223 Mtbl_cf dhom1_w = sol_hom1_w ;
01224 Mtbl_cf dhom2_w = sol_hom2_w ;
01225 Mtbl_cf dhom3_w = sol_hom3_w ;
01226 Mtbl_cf dpart_w = sol_part_w ;
01227
01228
01229 dhom1_hrr.dsdx() ; dhom1_eta.dsdx() ; dhom1_w.dsdx() ;
01230 dhom2_hrr.dsdx() ; dhom2_eta.dsdx() ; dhom2_w.dsdx() ;
01231 dhom3_hrr.dsdx() ; dhom3_eta.dsdx() ; dhom3_w.dsdx() ;
01232 dpart_hrr.dsdx() ; dpart_eta.dsdx() ; dpart_w.dsdx() ;
01233
01234 Mtbl_cf d2hom1_hrr = dhom1_hrr ;
01235 Mtbl_cf d2hom2_hrr = dhom2_hrr ;
01236 Mtbl_cf d2hom3_hrr = dhom3_hrr;
01237 Mtbl_cf d2part_hrr = dpart_hrr ;
01238 d2hom1_hrr.dsdx(); d2hom2_hrr.dsdx(); d2hom3_hrr.dsdx(); d2part_hrr.dsdx();
01239
01240
01241
01243
01245
01246 for (int k=0 ; k<np+1 ; k++)
01247 for (int j=0 ; j<nt ; j++) {
01248 base.give_quant_numbers(0, k, j, m_q, l_q, base_r) ;
01249 if ((nullite_plm(j, nt, k, np, base) == 1) && (l_q > 1)) {
01250 ligne = 0 ;
01251 colonne = 0 ;
01252 systeme.annule_hard() ;
01253 sec_membre.annule_hard() ;
01254
01255
01256
01257 int nr = mgrid.get_nr(1);
01258 double alpha2 = mp_aff->get_alpha()[1] ;
01259
01260
01261 const Coord& rr = (*mp_aff).r ;
01262 Scalar rrr(*mp_aff); rrr = rr;
01263
01264 systeme.set(ligne, colonne)= (dhom1_w.val_in_bound_jk(1,j,k))/alpha2 + (0.5/rhor)*(double(l_q*(l_q+1)))*sol_hom1_w.val_in_bound_jk(1,j,k) - (1./rhor)*sol_hom1_eta.val_in_bound_jk(1,j,k) - (0.25/rhor)*sol_hom1_hrr.val_in_bound_jk(1,j,k);
01265
01266 systeme.set(ligne, colonne+1)= (dhom2_w.val_in_bound_jk(1,j,k))/alpha2 +(0.5/rhor)*(double(l_q*(l_q+1)))*sol_hom2_w.val_in_bound_jk(1,j,k) - (1./rhor)*sol_hom2_eta.val_in_bound_jk(1,j,k) - (0.25/rhor)*sol_hom2_hrr.val_in_bound_jk(1,j,k);
01267
01268 systeme.set(ligne, colonne+2)= (dhom3_w.val_in_bound_jk(1,j,k))/alpha2 +(0.5/rhor)*(double(l_q*(l_q+1)))*sol_hom3_w.val_in_bound_jk(1,j,k) - (1./rhor)*sol_hom3_eta.val_in_bound_jk(1,j,k) - (0.25/rhor)*sol_hom3_hrr.val_in_bound_jk(1,j,k) ;
01269
01270 sec_membre.set(ligne)= - (dpart_w.val_in_bound_jk(1,j,k)/alpha2 +(0.5/rhor)*(double(l_q*(l_q+1)))*sol_part_w.val_in_bound_jk(1,j,k) - (1./rhor)*sol_part_eta.val_in_bound_jk(1,j,k) - (0.25/rhor)*sol_part_hrr.val_in_bound_jk(1,j,k));
01271
01272 Mtbl_cf *Bbb = bb2.get_spectral_va().c_cf;
01273
01274 sec_membre.set(ligne) += (*Bbb).val_in_bound_jk(1,j,k);
01275
01276
01277 ligne++ ;
01278
01279
01280
01281 systeme.set(ligne, colonne) =
01282 dir*sol_hom1_hrr.val_in_bound_jk(1, j, k) + neum*dhom1_hrr.val_in_bound_jk(1,j,k)/alpha2;
01283 systeme.set(ligne, colonne+1) =
01284 dir*sol_hom2_hrr.val_in_bound_jk(1, j, k) +neum*dhom2_hrr.val_in_bound_jk(1,j,k)/alpha2;
01285 systeme.set(ligne, colonne+2) =
01286 + dir*sol_hom3_hrr.val_in_bound_jk(1, j, k) + neum*dhom3_hrr.val_in_bound_jk(1,j,k)/alpha2;
01287
01288
01289 double blob = (*(bound_eta.get_spectral_va().c_cf)).val_in_bound_jk(1, j, k);
01290 sec_membre.set(ligne) += - sol_part_hrr.val_in_bound_jk(1, j, k) - neum*dpart_hrr.val_in_bound_jk(1,j,k)/alpha2 + blob ;
01291
01292 ligne++ ;
01293
01294
01295
01296
01297 systeme.set(ligne, colonne) =
01298 sol_hom1_hrr.val_out_bound_jk(1, j, k) ;
01299 systeme.set(ligne, colonne+1) =
01300 sol_hom2_hrr.val_out_bound_jk(1, j, k) ;
01301 systeme.set(ligne, colonne+2) =
01302 sol_hom3_hrr.val_out_bound_jk(1, j, k) ;
01303
01304 sec_membre.set(ligne) -= sol_part_hrr.val_out_bound_jk(1, j, k) ;
01305 ligne++ ;
01306
01307 systeme.set(ligne, colonne) =
01308 sol_hom1_eta.val_out_bound_jk(1, j, k) ;
01309 systeme.set(ligne, colonne+1) =
01310 sol_hom2_eta.val_out_bound_jk(1, j, k) ;
01311 systeme.set(ligne, colonne+2) =
01312 sol_hom3_eta.val_out_bound_jk(1, j, k) ;
01313
01314 sec_membre.set(ligne) -= sol_part_eta.val_out_bound_jk(1, j, k) ;
01315 ligne++ ;
01316
01317 systeme.set(ligne, colonne) =
01318 sol_hom1_w.val_out_bound_jk(1, j, k) ;
01319 systeme.set(ligne, colonne+1) =
01320 sol_hom2_w.val_out_bound_jk(1, j, k) ;
01321 systeme.set(ligne, colonne+2) =
01322 sol_hom3_w.val_out_bound_jk(1, j, k) ;
01323
01324 sec_membre.set(ligne) -= sol_part_w.val_out_bound_jk(1, j, k) ;
01325
01326 colonne += 3 ;
01327
01328
01329 for (int zone=2 ; zone<nz_bc ; zone++) {
01330 nr = mgrid.get_nr(zone) ;
01331 ligne -= 2 ;
01332
01333
01334 systeme.set(ligne, colonne) =
01335 - sol_hom1_hrr.val_in_bound_jk(zone, j, k) ;
01336 systeme.set(ligne, colonne+1) =
01337 - sol_hom2_hrr.val_in_bound_jk(zone, j, k) ;
01338 systeme.set(ligne, colonne+2) =
01339 - sol_hom3_hrr.val_in_bound_jk(zone, j, k) ;
01340
01341 sec_membre.set(ligne) += sol_part_hrr.val_in_bound_jk(zone, j, k) ;
01342 ligne++ ;
01343
01344 systeme.set(ligne, colonne) =
01345 - sol_hom1_eta.val_in_bound_jk(zone, j, k) ;
01346 systeme.set(ligne, colonne+1) =
01347 - sol_hom2_eta.val_in_bound_jk(zone, j, k) ;
01348 systeme.set(ligne, colonne+2) =
01349 - sol_hom3_eta.val_in_bound_jk(zone, j, k) ;
01350
01351 sec_membre.set(ligne) += sol_part_eta.val_in_bound_jk(zone, j, k) ;
01352 ligne++ ;
01353
01354 systeme.set(ligne, colonne) =
01355 - sol_hom1_w.val_in_bound_jk(zone, j, k) ;
01356 systeme.set(ligne, colonne+1) =
01357 - sol_hom2_w.val_in_bound_jk(zone, j, k) ;
01358 systeme.set(ligne, colonne+2) =
01359 - sol_hom3_w.val_in_bound_jk(zone, j, k) ;
01360
01361 sec_membre.set(ligne) += sol_part_w.val_in_bound_jk(zone, j, k) ;
01362 ligne++ ;
01363
01364
01365 systeme.set(ligne, colonne) =
01366 sol_hom1_hrr.val_out_bound_jk(zone, j, k) ;
01367 systeme.set(ligne, colonne+1) =
01368 sol_hom2_hrr.val_out_bound_jk(zone, j, k) ;
01369 systeme.set(ligne, colonne+2) =
01370 sol_hom3_hrr.val_out_bound_jk(zone, j, k) ;
01371
01372 sec_membre.set(ligne) -= sol_part_hrr.val_out_bound_jk(zone, j, k) ;
01373 ligne++ ;
01374
01375 systeme.set(ligne, colonne) =
01376 sol_hom1_eta.val_out_bound_jk(zone, j, k) ;
01377 systeme.set(ligne, colonne+1) =
01378 sol_hom2_eta.val_out_bound_jk(zone, j, k) ;
01379 systeme.set(ligne, colonne+2) =
01380 sol_hom3_eta.val_out_bound_jk(zone, j, k) ;
01381
01382 sec_membre.set(ligne) -= sol_part_eta.val_out_bound_jk(zone, j, k) ;
01383 ligne++ ;
01384
01385 systeme.set(ligne, colonne) =
01386 sol_hom1_w.val_out_bound_jk(zone, j, k) ;
01387 systeme.set(ligne, colonne+1) =
01388 sol_hom2_w.val_out_bound_jk(zone, j, k) ;
01389 systeme.set(ligne, colonne+2) =
01390 sol_hom3_w.val_out_bound_jk(zone, j, k) ;
01391
01392 sec_membre.set(ligne) -= sol_part_w.val_out_bound_jk(zone, j, k) ;
01393
01394 colonne += 3 ;
01395 }
01396
01397
01398 nr = mgrid.get_nr(nz_bc) ;
01399 double alpha = mp_aff->get_alpha()[nz_bc] ;
01400 ligne -= 2 ;
01401
01402
01403 systeme.set(ligne, colonne) =
01404 - sol_hom1_hrr.val_in_bound_jk(nz_bc, j, k) ;
01405 systeme.set(ligne, colonne+1) =
01406 - sol_hom2_hrr.val_in_bound_jk(nz_bc, j, k) ;
01407 if (!cedbc) systeme.set(ligne, colonne+2) =
01408 - sol_hom3_hrr.val_in_bound_jk(nz_bc, j, k) ;
01409
01410 sec_membre.set(ligne) += sol_part_hrr.val_in_bound_jk(nz_bc, j, k) ;
01411 ligne++ ;
01412
01413 systeme.set(ligne, colonne) =
01414 - sol_hom1_eta.val_in_bound_jk(nz_bc, j, k) ;
01415 systeme.set(ligne, colonne+1) =
01416 - sol_hom2_eta.val_in_bound_jk(nz_bc, j, k) ;
01417 if (!cedbc) systeme.set(ligne, colonne+2) =
01418 - sol_hom3_eta.val_in_bound_jk(nz_bc, j, k) ;
01419
01420 sec_membre.set(ligne) += sol_part_eta.val_in_bound_jk(nz_bc, j, k) ;
01421 ligne++ ;
01422
01423 systeme.set(ligne, colonne) =
01424 - sol_hom1_w.val_in_bound_jk(nz_bc, j, k) ;
01425 systeme.set(ligne, colonne+1) =
01426 - sol_hom2_w.val_in_bound_jk(nz_bc, j, k) ;
01427 if (!cedbc) systeme.set(ligne, colonne+2) =
01428 - sol_hom3_w.val_in_bound_jk(nz_bc, j, k) ;
01429
01430 sec_membre.set(ligne) += sol_part_w.val_in_bound_jk(nz_bc, j, k) ;
01431 ligne++ ;
01432
01433 if (!cedbc) {
01434 systeme.set(ligne, colonne) =
01435 chrr*sol_hom1_hrr.val_out_bound_jk(nz_bc, j, k)
01436 + dhrr*dhom1_hrr.val_out_bound_jk(nz_bc, j, k) / alpha
01437 + ceta*sol_hom1_eta.val_out_bound_jk(nz_bc, j, k)
01438 + deta*dhom1_eta.val_out_bound_jk(nz_bc, j, k) / alpha
01439 + cw*sol_hom1_w.val_out_bound_jk(nz_bc, j, k)
01440 + dw*dhom1_w.val_out_bound_jk(nz_bc, j, k) / alpha ;
01441 systeme.set(ligne, colonne+1) =
01442 chrr*sol_hom2_hrr.val_out_bound_jk(nz_bc, j, k)
01443 + dhrr*dhom2_hrr.val_out_bound_jk(nz_bc, j, k) / alpha
01444 + ceta*sol_hom2_eta.val_out_bound_jk(nz_bc, j, k)
01445 + deta*dhom2_eta.val_out_bound_jk(nz_bc, j, k) / alpha
01446 + cw*sol_hom2_w.val_out_bound_jk(nz_bc, j, k)
01447 + dw*dhom2_w.val_out_bound_jk(nz_bc, j, k) / alpha ;
01448 systeme.set(ligne, colonne+2) =
01449 chrr*sol_hom3_hrr.val_out_bound_jk(nz_bc, j, k)
01450 + dhrr*dhom3_hrr.val_out_bound_jk(nz_bc, j, k) / alpha
01451 + ceta*sol_hom3_eta.val_out_bound_jk(nz_bc, j, k)
01452 + deta*dhom3_eta.val_out_bound_jk(nz_bc, j, k) / alpha
01453 + cw*sol_hom3_w.val_out_bound_jk(nz_bc, j, k)
01454 + dw*dhom3_w.val_out_bound_jk(nz_bc, j, k) / alpha ;
01455
01456 sec_membre.set(ligne) -= chrr*sol_part_hrr.val_out_bound_jk(nz_bc, j, k)
01457 + dhrr*dpart_hrr.val_out_bound_jk(nz_bc, j, k)/alpha
01458 + ceta*sol_part_eta.val_out_bound_jk(nz_bc, j, k)
01459 + deta*dpart_eta.val_out_bound_jk(nz_bc, j, k)/alpha
01460 + cw*sol_part_w.val_out_bound_jk(nz_bc, j, k)
01461 + dw*dpart_w.val_out_bound_jk(nz_bc, j, k)/alpha
01462 - hrrb(k, j) ;
01463 }
01464
01465
01467
01468
01469
01470
01471
01472
01473
01474 systeme.set_lu() ;
01475 Tbl facteur = systeme.inverse(sec_membre) ;
01476 int conte = 0 ;
01477
01478
01479
01480
01481 nr = mgrid.get_nr(0) ;
01482 for (int i=0 ; i<nr ; i++) {
01483 mhrr.set(0, k, j, i) = 0 ;
01484 meta.set(0, k, j, i) = 0 ;
01485 mw.set(0, k, j, i) = 0 ;
01486 }
01487 for (int zone=1 ; zone<=n_shell ; zone++) {
01488 nr = mgrid.get_nr(zone) ;
01489 for (int i=0 ; i<nr ; i++) {
01490 mhrr.set(zone, k, j, i) = sol_part_hrr(zone, k, j, i)
01491 + facteur(conte)*sol_hom1_hrr(zone, k, j, i)
01492 + facteur(conte+1)*sol_hom2_hrr(zone, k, j, i)
01493 + facteur(conte+2)*sol_hom3_hrr(zone, k, j, i) ;
01494
01495 meta.set(zone, k, j, i) = sol_part_eta(zone, k, j, i)
01496 + facteur(conte)*sol_hom1_eta(zone, k, j, i)
01497 + facteur(conte+1)*sol_hom2_eta(zone, k, j, i)
01498 + facteur(conte+2)*sol_hom3_eta(zone, k, j, i) ;
01499
01500 mw.set(zone, k, j, i) = sol_part_w(zone, k, j, i)
01501 + facteur(conte)*sol_hom1_w(zone, k, j, i)
01502 + facteur(conte+1)*sol_hom2_w(zone, k, j, i)
01503 + facteur(conte+2)*sol_hom3_w(zone, k, j, i) ;
01504 }
01505 conte+=3 ;
01506 }
01507 if (cedbc) {
01508 nr = mgrid.get_nr(nzm1) ;
01509 for (int i=0 ; i<nr ; i++) {
01510 mhrr.set(nzm1, k, j, i) = sol_part_hrr(nzm1, k, j, i)
01511 + facteur(conte)*sol_hom1_hrr(nzm1, k, j, i)
01512 + facteur(conte+1)*sol_hom2_hrr(nzm1, k, j, i) ;
01513
01514 meta.set(nzm1, k, j, i) = sol_part_eta(nzm1, k, j, i)
01515 + facteur(conte)*sol_hom1_eta(nzm1, k, j, i)
01516 + facteur(conte+1)*sol_hom2_eta(nzm1, k, j, i) ;
01517
01518 mw.set(nzm1, k, j, i) = sol_part_w(nzm1, k, j, i)
01519 + facteur(conte)*sol_hom1_w(nzm1, k, j, i)
01520 + facteur(conte+1)*sol_hom2_w(nzm1, k, j, i) ;
01521 }
01522 }
01523 }
01524 }
01525
01526
01527 if (hrr.set_spectral_va().c != 0x0)
01528 delete hrr.set_spectral_va().c;
01529 hrr.set_spectral_va().c = 0x0 ;
01530 hrr.set_spectral_va().ylm_i() ;
01531
01532 if (tilde_eta.set_spectral_va().c != 0x0)
01533 delete tilde_eta.set_spectral_va().c ;
01534 tilde_eta.set_spectral_va().c = 0x0 ;
01535 tilde_eta.set_spectral_va().ylm_i() ;
01536
01537 if (ww.set_spectral_va().c != 0x0)
01538 delete ww.set_spectral_va().c ;
01539 ww.set_spectral_va().c = 0x0 ;
01540 ww.set_spectral_va().ylm_i() ;
01541
01542
01543
01544
01545
01546
01547
01548 }
01549
01550 void Sym_tensor_trans::sol_Dirac_l01_2(const Scalar& hh, Scalar& hrr, Scalar& tilde_eta,
01551 Param* par_mat) {
01552
01553
01554
01555
01556
01557
01558
01559 const Map_af* mp_aff = dynamic_cast<const Map_af*>(mp) ;
01560 assert(mp_aff != 0x0) ;
01561
01562 const Mg3d& mgrid = *mp_aff->get_mg() ;
01563 int nz = mgrid.get_nzone() ;
01564 assert(mgrid.get_type_r(0) == RARE) ;
01565 assert(mgrid.get_type_r(nz-1) == UNSURR) ;
01566
01567 if (hh.get_etat() == ETATZERO) {
01568 hrr.annule_hard() ;
01569 tilde_eta.annule_hard() ;
01570 return ;
01571 }
01572
01573 int nt = mgrid.get_nt(0) ;
01574 int np = mgrid.get_np(0) ;
01575
01576 Scalar source = hh ;
01577 source.div_r_dzpuis(2) ;
01578 Scalar source_coq = hh ;
01579 source.set_spectral_va().ylm() ;
01580 source_coq.set_spectral_va().ylm() ;
01581 Base_val base = source.get_spectral_base() ;
01582 base.mult_x() ;
01583 int lmax = base.give_lmax(mgrid, 0) + 1;
01584
01585 assert (hrr.get_spectral_base() == base) ;
01586 assert (tilde_eta.get_spectral_base() == base) ;
01587 assert (hrr.get_spectral_va().c_cf != 0x0) ;
01588 assert (tilde_eta.get_spectral_va().c_cf != 0x0) ;
01589
01590 Mtbl_cf sol_part_hrr(mgrid, base) ; sol_part_hrr.annule_hard() ;
01591 Mtbl_cf sol_part_eta(mgrid, base) ; sol_part_eta.annule_hard() ;
01592 Mtbl_cf sol_hom1_hrr(mgrid, base) ; sol_hom1_hrr.annule_hard() ;
01593 Mtbl_cf sol_hom1_eta(mgrid, base) ; sol_hom1_eta.annule_hard() ;
01594 Mtbl_cf sol_hom2_hrr(mgrid, base) ; sol_hom2_hrr.annule_hard() ;
01595 Mtbl_cf sol_hom2_eta(mgrid, base) ; sol_hom2_eta.annule_hard() ;
01596
01597 bool need_calculation = true ;
01598 if (par_mat != 0x0)
01599 if (par_mat->get_n_matrice_mod() > 0)
01600 if (&par_mat->get_matrice_mod(0) != 0x0) need_calculation = false ;
01601
01602 int l_q, m_q, base_r ;
01603 Itbl mat_done(lmax) ;
01604
01605
01606
01607
01608 {int lz = 0 ;
01609 int nr = mgrid.get_nr(lz) ;
01610 double alpha = mp_aff->get_alpha()[lz] ;
01611 Matrice ope(2*nr, 2*nr) ;
01612 if (need_calculation && (par_mat != 0x0)) mat_done.annule_hard() ;
01613
01614 for (int k=0 ; k<np+1 ; k++) {
01615 for (int j=0 ; j<nt ; j++) {
01616
01617 base.give_quant_numbers(lz, k, j, m_q, l_q, base_r) ;
01618 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q < 2)) {
01619 if (need_calculation) {
01620 ope.set_etat_qcq() ;
01621 Diff_dsdx od(base_r, nr) ; const Matrice& md = od.get_matrice() ;
01622 Diff_sx os(base_r, nr) ; const Matrice& ms = os.get_matrice() ;
01623
01624 for (int lin=0; lin<nr; lin++)
01625 for (int col=0; col<nr; col++)
01626 ope.set(lin,col) = md(lin,col) + 3*ms(lin,col) ;
01627 for (int lin=0; lin<nr; lin++)
01628 for (int col=0; col<nr; col++)
01629 ope.set(lin,col+nr) = -l_q*(l_q+1)*ms(lin,col) ;
01630 for (int lin=0; lin<nr; lin++)
01631 for (int col=0; col<nr; col++)
01632 ope.set(lin+nr,col) = -0.5*ms(lin,col) ;
01633 for (int lin=0; lin<nr; lin++)
01634 for (int col=0; col<nr; col++)
01635 ope.set(lin+nr,col+nr) = md(lin,col) + 3*ms(lin, col);
01636
01637 ope *= 1./alpha ;
01638 for (int col=0; col<2*nr; col++) {
01639 ope.set(nr-1, col) = 0 ;
01640 ope.set(2*nr-1, col) = 0 ;
01641 }
01642 int pari = 1 ;
01643 if (base_r == R_CHEBP) {
01644 for (int col=0; col<nr; col++) {
01645 ope.set(nr-1, col) = pari ;
01646 ope.set(2*nr-1, col+nr) = pari ;
01647 pari = - pari ;
01648 }
01649 }
01650 else {
01651 ope.set(nr-1, nr-1) = 1 ;
01652 ope.set(2*nr-1, 2*nr-1) = 1 ;
01653 }
01654
01655 ope.set_lu() ;
01656 if ((par_mat != 0x0) && (mat_done(l_q) == 0)) {
01657 Matrice* pope = new Matrice(ope) ;
01658 par_mat->add_matrice_mod(*pope, lz*lmax + l_q) ;
01659 mat_done.set(l_q) = 1 ;
01660 }
01661 }
01662
01663 const Matrice& oper = (par_mat == 0x0 ? ope :
01664 par_mat->get_matrice_mod(lz*lmax + l_q) ) ;
01665 Tbl sec(2*nr) ;
01666 sec.set_etat_qcq() ;
01667 for (int lin=0; lin<nr; lin++)
01668 sec.set(lin) = (*source.get_spectral_va().c_cf)(lz, k, j, lin) ;
01669 for (int lin=0; lin<nr; lin++)
01670 sec.set(nr+lin) = -0.5*(*source.get_spectral_va().c_cf)
01671 (lz, k, j, lin) ;
01672 sec.set(nr-1) = 0 ;
01673 if (base_r == R_CHEBP) {
01674 double h0 = 0 ;
01675 int pari = 1 ;
01676 for (int col=0; col<nr; col++) {
01677 h0 += pari*
01678 (*source_coq.get_spectral_va().c_cf)(lz, k, j, col) ;
01679 pari = - pari ;
01680 }
01681 sec.set(nr-1) = h0 / 3. ;
01682 }
01683 sec.set(2*nr-1) = 0 ;
01684 Tbl sol = oper.inverse(sec) ;
01685 for (int i=0; i<nr; i++) {
01686 sol_part_hrr.set(lz, k, j, i) = sol(i) ;
01687 sol_part_eta.set(lz, k, j, i) = sol(i+nr) ;
01688 }
01689 sec.annule_hard() ;
01690 }
01691 }
01692 }
01693 }
01694
01695
01696
01697
01698
01699 for (int lz=1; lz<nz-1; lz++) {
01700 if (need_calculation && (par_mat != 0x0)) mat_done.annule_hard() ;
01701 int nr = mgrid.get_nr(lz) ;
01702 int ind0 = 0 ;
01703 int ind1 = nr ;
01704 assert(mgrid.get_nt(lz) == nt) ;
01705 assert(mgrid.get_np(lz) == np) ;
01706 double alpha = mp_aff->get_alpha()[lz] ;
01707 double ech = mp_aff->get_beta()[lz] / alpha ;
01708 Matrice ope(2*nr, 2*nr) ;
01709
01710 for (int k=0 ; k<np+1 ; k++) {
01711 for (int j=0 ; j<nt ; j++) {
01712
01713 base.give_quant_numbers(lz, k, j, m_q, l_q, base_r) ;
01714 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q < 2)) {
01715 if (need_calculation) {
01716 ope.set_etat_qcq() ;
01717 Diff_xdsdx oxd(base_r, nr) ; const Matrice& mxd = oxd.get_matrice() ;
01718 Diff_dsdx od(base_r, nr) ; const Matrice& md = od.get_matrice() ;
01719 Diff_id oid(base_r, nr) ; const Matrice& mid = oid.get_matrice() ;
01720
01721 for (int lin=0; lin<nr; lin++)
01722 for (int col=0; col<nr; col++)
01723 ope.set(lin,col) = mxd(lin,col) + ech*md(lin,col)
01724 + 3*mid(lin,col) ;
01725 for (int lin=0; lin<nr; lin++)
01726 for (int col=0; col<nr; col++)
01727 ope.set(lin,col+nr) = -l_q*(l_q+1)*mid(lin,col) ;
01728 for (int lin=0; lin<nr; lin++)
01729 for (int col=0; col<nr; col++)
01730 ope.set(lin+nr,col) = -0.5*mid(lin,col) ;
01731 for (int lin=0; lin<nr; lin++)
01732 for (int col=0; col<nr; col++)
01733 ope.set(lin+nr,col+nr) = mxd(lin,col) + ech*md(lin,col)
01734 + 3*mid(lin, col) ;
01735
01736 for (int col=0; col<2*nr; col++) {
01737 ope.set(ind0+nr-1, col) = 0 ;
01738 ope.set(ind1+nr-1, col) = 0 ;
01739 }
01740 ope.set(ind0+nr-1, ind0) = 1 ;
01741 ope.set(ind1+nr-1, ind1) = 1 ;
01742
01743 ope.set_lu() ;
01744 if ((par_mat != 0x0) && (mat_done(l_q) == 0)) {
01745 Matrice* pope = new Matrice(ope) ;
01746 par_mat->add_matrice_mod(*pope, lz*lmax + l_q) ;
01747 mat_done.set(l_q) = 1 ;
01748 }
01749 }
01750 const Matrice& oper = (par_mat == 0x0 ? ope :
01751 par_mat->get_matrice_mod(lz*lmax + l_q) ) ;
01752 Tbl sec(2*nr) ;
01753 sec.set_etat_qcq() ;
01754 for (int lin=0; lin<nr; lin++)
01755 sec.set(lin) = (*source_coq.get_spectral_va().c_cf)
01756 (lz, k, j, lin) ;
01757 for (int lin=0; lin<nr; lin++)
01758 sec.set(nr+lin) = -0.5*(*source_coq.get_spectral_va().c_cf)
01759 (lz, k, j, lin) ;
01760 sec.set(ind0+nr-1) = 0 ;
01761 sec.set(ind1+nr-1) = 0 ;
01762 Tbl sol = oper.inverse(sec) ;
01763
01764 for (int i=0; i<nr; i++) {
01765 sol_part_hrr.set(lz, k, j, i) = sol(i) ;
01766 sol_part_eta.set(lz, k, j, i) = sol(i+nr) ;
01767 }
01768 sec.annule_hard() ;
01769 sec.set(ind0+nr-1) = 1 ;
01770 sol = oper.inverse(sec) ;
01771 for (int i=0; i<nr; i++) {
01772 sol_hom1_hrr.set(lz, k, j, i) = sol(i) ;
01773 sol_hom1_eta.set(lz, k, j, i) = sol(i+nr) ;
01774 }
01775 sec.set(ind0+nr-1) = 0 ;
01776 sec.set(ind1+nr-1) = 1 ;
01777 sol = oper.inverse(sec) ;
01778 for (int i=0; i<nr; i++) {
01779 sol_hom2_hrr.set(lz, k, j, i) = sol(i) ;
01780 sol_hom2_eta.set(lz, k, j, i) = sol(i+nr) ;
01781 }
01782 }
01783 }
01784 }
01785 }
01786
01787
01788
01789
01790 {int lz = nz-1 ;
01791 if (need_calculation && (par_mat != 0x0)) mat_done.annule_hard() ;
01792 int nr = mgrid.get_nr(lz) ;
01793 int ind0 = 0 ;
01794 int ind1 = nr ;
01795 assert(mgrid.get_nt(lz) == nt) ;
01796 assert(mgrid.get_np(lz) == np) ;
01797 double alpha = mp_aff->get_alpha()[lz] ;
01798 Matrice ope(2*nr, 2*nr) ;
01799
01800 for (int k=0 ; k<np+1 ; k++) {
01801 for (int j=0 ; j<nt ; j++) {
01802
01803 base.give_quant_numbers(lz, k, j, m_q, l_q, base_r) ;
01804 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q < 2)) {
01805 if (need_calculation) {
01806 ope.set_etat_qcq() ;
01807 Diff_dsdx od(base_r, nr) ; const Matrice& md = od.get_matrice() ;
01808 Diff_sx os(base_r, nr) ; const Matrice& ms = os.get_matrice() ;
01809
01810 for (int lin=0; lin<nr; lin++)
01811 for (int col=0; col<nr; col++)
01812 ope.set(lin,col) = - md(lin,col) + 3*ms(lin,col) ;
01813 for (int lin=0; lin<nr; lin++)
01814 for (int col=0; col<nr; col++)
01815 ope.set(lin,col+nr) = -l_q*(l_q+1)*ms(lin,col) ;
01816 for (int lin=0; lin<nr; lin++)
01817 for (int col=0; col<nr; col++)
01818 ope.set(lin+nr,col) = -0.5*ms(lin,col) ;
01819 for (int lin=0; lin<nr; lin++)
01820 for (int col=0; col<nr; col++)
01821 ope.set(lin+nr,col+nr) = -md(lin,col) + 3*ms(lin, col) ;
01822
01823 ope *= 1./alpha ;
01824 for (int col=0; col<2*nr; col++) {
01825 ope.set(ind0+nr-2, col) = 0 ;
01826 ope.set(ind0+nr-1, col) = 0 ;
01827 ope.set(ind1+nr-2, col) = 0 ;
01828 ope.set(ind1+nr-1, col) = 0 ;
01829 }
01830 for (int col=0; col<nr; col++) {
01831 ope.set(ind0+nr-1, col+ind0) = 1 ;
01832 ope.set(ind1+nr-1, col+ind1) = 1 ;
01833 }
01834 ope.set(ind0+nr-2, ind0+1) = 1 ;
01835 ope.set(ind1+nr-2, ind1+1) = 1 ;
01836
01837 ope.set_lu() ;
01838 if ((par_mat != 0x0) && (mat_done(l_q) == 0)) {
01839 Matrice* pope = new Matrice(ope) ;
01840 par_mat->add_matrice_mod(*pope, lz*lmax + l_q) ;
01841 mat_done.set(l_q) = 1 ;
01842 }
01843 }
01844 const Matrice& oper = (par_mat == 0x0 ? ope :
01845 par_mat->get_matrice_mod(lz*lmax + l_q) ) ;
01846 Tbl sec(2*nr) ;
01847 sec.set_etat_qcq() ;
01848 for (int lin=0; lin<nr; lin++)
01849 sec.set(lin) = (*source.get_spectral_va().c_cf)
01850 (lz, k, j, lin) ;
01851 for (int lin=0; lin<nr; lin++)
01852 sec.set(nr+lin) = -0.5*(*source.get_spectral_va().c_cf)
01853 (lz, k, j, lin) ;
01854 sec.set(ind0+nr-2) = 0 ;
01855 sec.set(ind0+nr-1) = 0 ;
01856 sec.set(ind1+nr-2) = 0 ;
01857 sec.set(ind1+nr-1) = 0 ;
01858 Tbl sol = oper.inverse(sec) ;
01859 for (int i=0; i<nr; i++) {
01860 sol_part_hrr.set(lz, k, j, i) = sol(i) ;
01861 sol_part_eta.set(lz, k, j, i) = sol(i+nr) ;
01862 }
01863 sec.annule_hard() ;
01864 sec.set(ind0+nr-2) = 1 ;
01865 sol = oper.inverse(sec) ;
01866 for (int i=0; i<nr; i++) {
01867 sol_hom1_hrr.set(lz, k, j, i) = sol(i) ;
01868 sol_hom1_eta.set(lz, k, j, i) = sol(i+nr) ;
01869 }
01870 sec.set(ind0+nr-2) = 0 ;
01871 sec.set(ind1+nr-2) = 1 ;
01872 sol = oper.inverse(sec) ;
01873 for (int i=0; i<nr; i++) {
01874 sol_hom2_hrr.set(lz, k, j, i) = sol(i) ;
01875 sol_hom2_eta.set(lz, k, j, i) = sol(i+nr) ;
01876 }
01877 }
01878 }
01879 }
01880 }
01881
01882 int taille = 2*(nz-1) ;
01883 Mtbl_cf& mhrr = *hrr.set_spectral_va().c_cf ;
01884 Mtbl_cf& meta = *tilde_eta.set_spectral_va().c_cf ;
01885
01886 Tbl sec_membre(taille) ;
01887 Matrice systeme(taille, taille) ;
01888 int ligne ; int colonne ;
01889
01890
01891
01892 for (int k=0 ; k<np+1 ; k++)
01893 for (int j=0 ; j<nt ; j++) {
01894 base.give_quant_numbers(0, k, j, m_q, l_q, base_r) ;
01895 if ((nullite_plm(j, nt, k, np, base) == 1) && (l_q < 2)) {
01896 ligne = 0 ;
01897 colonne = 0 ;
01898 systeme.annule_hard() ;
01899 sec_membre.annule_hard() ;
01900
01901
01902 int nr = mgrid.get_nr(0) ;
01903
01904 sec_membre.set(ligne) = -sol_part_hrr.val_out_bound_jk(0, j, k) ;
01905 ligne++ ;
01906
01907 sec_membre.set(ligne) = -sol_part_eta.val_out_bound_jk(0, j, k) ;
01908
01909
01910 for (int zone=1 ; zone<nz-1 ; zone++) {
01911 nr = mgrid.get_nr(zone) ;
01912 ligne-- ;
01913
01914
01915 systeme.set(ligne, colonne) =
01916 - sol_hom1_hrr.val_in_bound_jk(zone, j, k) ;
01917 systeme.set(ligne, colonne+1) =
01918 - sol_hom2_hrr.val_in_bound_jk(zone, j, k) ;
01919
01920 sec_membre.set(ligne) += sol_part_hrr.val_in_bound_jk(zone, j, k) ;
01921 ligne++ ;
01922
01923 systeme.set(ligne, colonne) =
01924 - sol_hom1_eta.val_in_bound_jk(zone, j, k) ;
01925 systeme.set(ligne, colonne+1) =
01926 - sol_hom2_eta.val_in_bound_jk(zone, j, k) ;
01927
01928 sec_membre.set(ligne) += sol_part_eta.val_in_bound_jk(zone, j, k) ;
01929 ligne++ ;
01930
01931
01932 systeme.set(ligne, colonne) =
01933 sol_hom1_hrr.val_out_bound_jk(zone, j, k) ;
01934 systeme.set(ligne, colonne+1) =
01935 sol_hom2_hrr.val_out_bound_jk(zone, j, k) ;
01936
01937 sec_membre.set(ligne) -= sol_part_hrr.val_out_bound_jk(zone, j, k) ;
01938 ligne++ ;
01939
01940 systeme.set(ligne, colonne) =
01941 sol_hom1_eta.val_out_bound_jk(zone, j, k) ;
01942 systeme.set(ligne, colonne+1) =
01943 sol_hom2_eta.val_out_bound_jk(zone, j, k) ;
01944
01945 sec_membre.set(ligne) -= sol_part_eta.val_out_bound_jk(zone, j, k) ;
01946
01947 colonne += 2 ;
01948 }
01949
01950
01951 nr = mgrid.get_nr(nz-1) ;
01952
01953 ligne-- ;
01954
01955 systeme.set(ligne, colonne) =
01956 - sol_hom1_hrr.val_in_bound_jk(nz-1, j, k) ;
01957 systeme.set(ligne, colonne+1) =
01958 - sol_hom2_hrr.val_in_bound_jk(nz-1, j, k) ;
01959
01960 sec_membre.set(ligne) += sol_part_hrr.val_in_bound_jk(nz-1, j, k) ;
01961 ligne++ ;
01962
01963 systeme.set(ligne, colonne) =
01964 - sol_hom1_eta.val_in_bound_jk(nz-1, j, k) ;
01965 systeme.set(ligne, colonne+1) =
01966 - sol_hom2_eta.val_in_bound_jk(nz-1, j, k) ;
01967
01968 sec_membre.set(ligne) += sol_part_eta.val_in_bound_jk(nz-1, j, k) ;
01969
01970
01971
01972
01973 systeme.set_lu() ;
01974 Tbl facteur = systeme.inverse(sec_membre) ;
01975 int conte = 0 ;
01976
01977
01978
01979 nr = mgrid.get_nr(0) ;
01980 for (int i=0 ; i<nr ; i++) {
01981 mhrr.set(0, k, j, i) = sol_part_hrr(0, k, j, i) ;
01982 meta.set(0, k, j, i) = sol_part_eta(0, k, j, i) ;
01983 }
01984 for (int zone=1 ; zone<nz-1 ; zone++) {
01985 nr = mgrid.get_nr(zone) ;
01986 for (int i=0 ; i<nr ; i++) {
01987 mhrr.set(zone, k, j, i) = sol_part_hrr(zone, k, j, i)
01988 + facteur(conte)*sol_hom1_hrr(zone, k, j, i)
01989 + facteur(conte+1)*sol_hom2_hrr(zone, k, j, i) ;
01990
01991 meta.set(zone, k, j, i) = sol_part_eta(zone, k, j, i)
01992 + facteur(conte)*sol_hom1_eta(zone, k, j, i)
01993 + facteur(conte+1)*sol_hom2_eta(zone, k, j, i) ;
01994 }
01995 conte+=2 ;
01996 }
01997 nr = mgrid.get_nr(nz-1) ;
01998 for (int i=0 ; i<nr ; i++) {
01999 mhrr.set(nz-1, k, j, i) = sol_part_hrr(nz-1, k, j, i)
02000 + facteur(conte)*sol_hom1_hrr(nz-1, k, j, i)
02001 + facteur(conte+1)*sol_hom2_hrr(nz-1, k, j, i) ;
02002
02003 meta.set(nz-1, k, j, i) = sol_part_eta(nz-1, k, j, i)
02004 + facteur(conte)*sol_hom1_eta(nz-1, k, j, i)
02005 + facteur(conte+1)*sol_hom2_eta(nz-1, k, j, i) ;
02006 }
02007
02008 }
02009 }
02010 }
02011