sym_tensor_trans_dirac_bound2.C

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

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