sym_tensor_trans_dirac.C

00001 /*
00002  *  Methods to impose the Dirac gauge: divergence-free condition.
00003  *
00004  *    (see file sym_tensor.h for documentation).
00005  *
00006  */
00007 
00008 /*
00009  *   Copyright (c) 2006  Jerome Novak
00010  *
00011  *   This file is part of LORENE.
00012  *
00013  *   LORENE is free software; you can redistribute it and/or modify
00014  *   it under the terms of the GNU General Public License version 2
00015  *   as published by the Free Software Foundation.
00016  *
00017  *   LORENE is distributed in the hope that it will be useful,
00018  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00019  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020  *   GNU General Public License for more details.
00021  *
00022  *   You should have received a copy of the GNU General Public License
00023  *   along with LORENE; if not, write to the Free Software
00024  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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  * $Id: sym_tensor_trans_dirac.C,v 1.5 2008/08/29 13:15:22 j_novak Exp $
00032  * $Log: sym_tensor_trans_dirac.C,v $
00033  * Revision 1.5  2008/08/29 13:15:22  j_novak
00034  * Corrected a mistake in the case of no CED.
00035  *
00036  * Revision 1.4  2008/08/29 05:33:18  j_novak
00037  * Minor modif.
00038  *
00039  * Revision 1.3  2008/08/27 08:13:20  j_novak
00040  * Correction of a mistake in the imposition of BCs in sol_Dirac_A. + Treatment of
00041  * the case of BCs imposed on a nucleus (nz_bc = 0).
00042  *
00043  * Revision 1.2  2006/10/24 13:03:19  j_novak
00044  * New methods for the solution of the tensor wave equation. Perhaps, first
00045  * operational version...
00046  *
00047  * Revision 1.1  2006/09/05 15:38:45  j_novak
00048  * The fuctions sol_Dirac... are in a seperate file, with new parameters to
00049  * control the boundary conditions.
00050  *
00051  *
00052  * $Header: /cvsroot/Lorene/C++/Source/Tensor/sym_tensor_trans_dirac.C,v 1.5 2008/08/29 13:15:22 j_novak Exp $
00053  *
00054  */
00055 
00056 // C headers
00057 #include <assert.h>
00058 #include <math.h>
00059 
00060 // Lorene headers
00061 #include "tensor.h"
00062 #include "diff.h"
00063 #include "proto.h"
00064 #include "param.h"
00065 
00066 //----------------------------------------------------------------------------------
00067 //
00068 //                               sol_Dirac_A
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) ; //Only affine mapping for the moment
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     //--  NUCLEUS ---
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         // quantic numbers and spectral bases
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 { //In the odd case, the last coefficient must be zero!
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     // -- Shells --
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         // quantic numbers and spectral bases
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     // Compactified external domain
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         // quantic numbers and spectral bases
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     // Matching of the solutions across the domains and imposition of 
00368     // boundary conditions (if no compactified domain)
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     // Loop on l and m
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         //Nucleus 
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         //shells
00423         for (int zone=1 ; zone<nz_bc ; zone++) {
00424             nr = mgrid.get_nr(zone) ;
00425             ligne-- ;
00426 
00427             //Condition at x = -1
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             // Condition at x=1
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         //Last  domain   
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             //Condition at x = -1
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) {// Special condition at x=1
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         // Solution of the system giving the coefficients for the homogeneous 
00512         // solutions
00513         //-------------------------------------------------------------------
00514         systeme.set_lu() ;
00515         Tbl facteur = systeme.inverse(sec_membre) ;
00516         int conte = 0 ;
00517 
00518         // everything is put to the right place...
00519         //----------------------------------------
00520         nr = mgrid.get_nr(0) ; //nucleus
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++) { //shells
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) ; //compactified external domain
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         } // End of nullite_plm  
00553     } //End of loop on theta
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 //                               sol_Dirac_tilde_B
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) ; //Only affine mapping for the moment
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     //--  NUCLEUS ---
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         // quantic numbers and spectral bases
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 { //In the odd case, the last coefficient must be zero!
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         } //End of case when a calculation is needed
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 { //Homogeneous solution put in by hand in the case l=2
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     // -- Shells --
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         // quantic numbers and spectral bases
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             } //End of case when a calculation is needed
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     // Compactified external domain
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         // quantic numbers and spectral bases
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         } //End of case when a calculation is needed
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     // Loop on l and m
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         //Nucleus 
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         //shells
01205         for (int zone=1 ; zone<nz_bc ; zone++) {
01206             nr = mgrid.get_nr(zone) ;
01207             ligne -= 2 ;
01208 
01209             //Condition at x = -1
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             // Condition at x=1
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         //Last domain
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         //Condition at x = -1
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) {//Special condition at x=1
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 { // Only nucleus
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         // Solution of the system giving the coefficients for the homogeneous 
01349         // solutions
01350         //-------------------------------------------------------------------
01351         systeme.set_lu() ;
01352         Tbl facteur = systeme.inverse(sec_membre) ;
01353         int conte = 0 ;
01354 
01355         // everything is put to the right place, 
01356         //---------------------------------------
01357         nr = mgrid.get_nr(0) ; //nucleus
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++) { //shells
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) ; //compactified external domain
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         } // End of nullite_plm  
01404     } //End of loop on theta
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) ; //Only affine mapping for the moment
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     //--  NUCLEUS ---
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         // quantic numbers and spectral bases
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 { //In the odd case, the last coefficient must be zero!
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         } //End of case when a calculation is needed
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 ; //In the l=0 case:  3*hrr(r=0) = h(r=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     // -- Shells --
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         // quantic numbers and spectral bases
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             } //End of case when a calculation is needed
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     // Compactified external domain
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         // quantic numbers and spectral bases
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         } //End of case when a calculation is needed
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     // Loop on l and m
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         //Nucleus 
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         //shells
01778         for (int zone=1 ; zone<nz-1 ; zone++) {
01779             nr = mgrid.get_nr(zone) ;
01780             ligne-- ;
01781 
01782             //Condition at x = -1
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             // Condition at x=1
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         //Compactified external domain
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         // Solution of the system giving the coefficients for the homogeneous 
01839         // solutions
01840         //-------------------------------------------------------------------
01841         systeme.set_lu() ;
01842         Tbl facteur = systeme.inverse(sec_membre) ;
01843         int conte = 0 ;
01844 
01845         // everything is put to the right place...
01846         //----------------------------------------
01847         nr = mgrid.get_nr(0) ; //nucleus
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++) { //shells
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) ; //compactified external domain
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         } // End of nullite_plm  
01877     } //End of loop on theta
01878 }
01879 

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