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