vector_divfree_A.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 sol_Dirac_A_C[] = "$Header: /cvsroot/Lorene/C++/Source/Tensor/vector_divfree_A.C,v 1.3 2009/10/23 13:18:46 j_novak Exp $" ;
00029 
00030 /*
00031  * $Id: vector_divfree_A.C,v 1.3 2009/10/23 13:18:46 j_novak Exp $
00032  * $Log: vector_divfree_A.C,v $
00033  * Revision 1.3  2009/10/23 13:18:46  j_novak
00034  * Minor modifications
00035  *
00036  * Revision 1.2  2008/08/27 10:55:15  jl_cornou
00037  * Added the case of one zone, which is a nucleus for BC
00038  *
00039  * Revision 1.1  2008/08/27 09:01:27  jl_cornou
00040  * Methods for solving Dirac systems for divergence free vectors
00041  *
00042  *
00043  *
00044  * $Header: /cvsroot/Lorene/C++/Source/Tensor/vector_divfree_A.C,v 1.3 2009/10/23 13:18:46 j_novak Exp $
00045  *
00046  */
00047 
00048 
00049 // C headers
00050 #include <stdlib.h>
00051 #include <assert.h>
00052 #include <math.h>
00053 
00054 // Lorene headers
00055 #include "metric.h"
00056 #include "diff.h"
00057 #include "proto.h"
00058 #include "param.h"
00059 
00060 //----------------------------------------------------------------------------------
00061 //
00062 //                               sol_Dirac_A
00063 //
00064 //----------------------------------------------------------------------------------
00065 
00066 void Vector_divfree::sol_Dirac_A(const Scalar& aaa, Scalar& tilde_vr, Scalar& tilde_eta,
00067                    const Param* par_bc) const {
00068 
00069     const Map_af* mp_aff = dynamic_cast<const Map_af*>(mp) ;
00070     assert(mp_aff != 0x0) ; //Only affine mapping for the moment
00071 
00072     const Mg3d& mgrid = *mp_aff->get_mg() ;
00073     assert(mgrid.get_type_r(0) == RARE)  ;
00074     if (aaa.get_etat() == ETATZERO) {
00075     tilde_vr = 0 ;
00076     tilde_eta = 0 ;
00077     return ;
00078     }
00079     assert(aaa.get_etat() != ETATNONDEF) ;
00080     int nz = mgrid.get_nzone() ;
00081     int nzm1 = nz - 1 ;
00082     bool ced = (mgrid.get_type_r(nzm1) == UNSURR) ;
00083     int n_shell = ced ? nz-2 : nzm1 ;
00084     int nz_bc = nzm1 ;
00085     if (par_bc != 0x0)
00086     if (par_bc->get_n_int() > 0) nz_bc = par_bc->get_int() ;
00087     n_shell = (nz_bc < n_shell ? nz_bc : n_shell) ;
00088     bool cedbc = (ced && (nz_bc == nzm1)) ; 
00089 #ifndef NDEBUG
00090     if (!cedbc) {
00091     assert(par_bc != 0x0) ;
00092     assert(par_bc->get_n_tbl_mod() >= 3) ;
00093     }
00094 #endif
00095     int nt = mgrid.get_nt(0) ;
00096     int np = mgrid.get_np(0) ;
00097 
00098     Scalar source = aaa ;
00099     Scalar source_coq = aaa ;
00100     source_coq.annule_domain(0) ;
00101     if (ced) source_coq.annule_domain(nzm1) ;
00102     source_coq.mult_r() ;
00103     source.set_spectral_va().ylm() ;
00104     source_coq.set_spectral_va().ylm() ;
00105     Base_val base = source.get_spectral_base() ;
00106     base.mult_x() ;
00107 
00108     tilde_vr.annule_hard() ;
00109     tilde_vr.set_spectral_base(base) ;
00110     tilde_vr.set_spectral_va().set_etat_cf_qcq() ;
00111     tilde_vr.set_spectral_va().c_cf->annule_hard() ;   
00112     tilde_eta.annule_hard() ;
00113     tilde_eta.set_spectral_base(base) ;
00114     tilde_eta.set_spectral_va().set_etat_cf_qcq() ;
00115     tilde_eta.set_spectral_va().c_cf->annule_hard() ;   
00116  
00117     Mtbl_cf sol_part_vr(mgrid, base) ; sol_part_vr.annule_hard() ;
00118     Mtbl_cf sol_part_eta(mgrid, base) ; sol_part_eta.annule_hard() ;
00119     Mtbl_cf sol_hom1_vr(mgrid, base) ; sol_hom1_vr.annule_hard() ;
00120     Mtbl_cf sol_hom1_eta(mgrid, base) ; sol_hom1_eta.annule_hard() ;
00121     Mtbl_cf sol_hom2_vr(mgrid, base) ; sol_hom2_vr.annule_hard() ;
00122     Mtbl_cf sol_hom2_eta(mgrid, base) ; sol_hom2_eta.annule_hard() ;
00123 
00124     int l_q, m_q, base_r ;
00125 
00126     //---------------
00127     //--  NUCLEUS ---
00128     //---------------
00129     {int lz = 0 ;  
00130     int nr = mgrid.get_nr(lz) ;
00131     double alpha = mp_aff->get_alpha()[lz] ;
00132     Matrice ope(2*nr, 2*nr) ;
00133     ope.set_etat_qcq() ;
00134     
00135     for (int k=0 ; k<np+1 ; k++) {
00136     for (int j=0 ; j<nt ; j++) {
00137         // quantic numbers and spectral bases
00138         base.give_quant_numbers(lz, k, j, m_q, l_q, base_r) ;
00139         if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q > 0)) {
00140         Diff_dsdx od(base_r, nr) ; const Matrice& md = od.get_matrice() ;
00141         Diff_sx os(base_r, nr) ; const Matrice& ms = os.get_matrice() ;
00142 
00143         for (int lin=0; lin<nr; lin++) 
00144             for (int col=0; col<nr; col++) 
00145             ope.set(lin,col) = md(lin,col) + 2*ms(lin,col) ;
00146         for (int lin=0; lin<nr; lin++) 
00147             for (int col=0; col<nr; col++) 
00148             ope.set(lin,col+nr) = -l_q*(l_q+1)*ms(lin,col) ;
00149         for (int lin=0; lin<nr; lin++) 
00150             for (int col=0; col<nr; col++) 
00151             ope.set(lin+nr,col) = -ms(lin,col) ;
00152         for (int lin=0; lin<nr; lin++) 
00153             for (int col=0; col<nr; col++) 
00154             ope.set(lin+nr,col+nr) = md(lin,col) + ms(lin,col) ;
00155 
00156         ope *= 1./alpha ;
00157         int ind1 = nr ;
00158         
00159         if (l_q==1) {
00160         ind1 += 1 ;
00161         int pari = 1 ;
00162         for (int col=0 ; col<nr; col++) {
00163         ope.set(nr-1,col) = pari ;
00164         ope.set(nr-1,col+nr) = -pari ;
00165         pari = - pari ;
00166         }
00167         ope.set(2*nr-1, nr) = 1;
00168         }
00169         else{
00170         for (int col=0; col<2*nr; col++) 
00171             ope.set(ind1+nr-2, col) = 0 ;
00172         for (int col=0; col<2*nr; col++) {
00173             ope.set(nr-1, col) = 0 ;
00174             ope.set(2*nr-1, col) = 0 ;
00175         }
00176         int pari = 1 ;
00177         if (base_r == R_CHEBP) {
00178             for (int col=0; col<nr; col++) {
00179             ope.set(nr-1, col) = pari ;
00180             ope.set(2*nr-1, col+nr) = pari ;
00181             pari = - pari ;
00182             }
00183         }
00184         else { //In the odd case, the last coefficient must be zero!
00185             ope.set(nr-1, nr-1) = 1 ;
00186             ope.set(2*nr-1, 2*nr-1) = 1 ;
00187         }
00188         
00189         ope.set(ind1+nr-2, ind1) = 1 ; 
00190         }
00191 
00192         ope.set_lu() ;
00193         
00194         Tbl sec(2*nr) ;
00195         sec.set_etat_qcq() ;
00196         for (int lin=0; lin<nr; lin++)
00197             sec.set(lin) = 0 ;
00198         for (int lin=0; lin<nr; lin++) 
00199             sec.set(nr+lin) = (*source.get_spectral_va().c_cf)
00200             (lz, k, j, lin) ;
00201         sec.set(2*nr-1) = 0 ;
00202         sec.set(ind1+nr-2) = 0 ;
00203         Tbl sol = ope.inverse(sec) ;
00204         
00205         
00206 
00207         for (int i=0; i<nr; i++) {
00208             sol_part_vr.set(lz, k, j, i) = sol(i) ;
00209             sol_part_eta.set(lz, k, j, i) = sol(i+nr) ;
00210         }
00211         sec.annule_hard() ;
00212         sec.set(ind1+nr-2) = 1 ;
00213         
00214         sol = ope.inverse(sec) ;
00215         
00216         for (int i=0; i<nr; i++) {
00217             sol_hom2_vr.set(lz, k, j, i) = sol(i) ;
00218             sol_hom2_eta.set(lz, k, j, i) = sol(i+nr) ;
00219         }
00220         }
00221     }
00222     }
00223     }
00224 
00225     //-------------
00226     // -- Shells --
00227     //-------------
00228 
00229     for (int lz=1; lz <= n_shell; lz++) {
00230     int nr = mgrid.get_nr(lz) ;
00231     assert(mgrid.get_nt(lz) == nt) ;
00232     assert(mgrid.get_np(lz) == np) ;
00233     double alpha = mp_aff->get_alpha()[lz] ;
00234     double ech = mp_aff->get_beta()[lz] / alpha ;
00235     Matrice ope(2*nr, 2*nr) ;
00236     ope.set_etat_qcq() ;
00237     
00238     for (int k=0 ; k<np+1 ; k++) {
00239         for (int j=0 ; j<nt ; j++) {
00240         // quantic numbers and spectral bases
00241         base.give_quant_numbers(lz, k, j, m_q, l_q, base_r) ;
00242         if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q > 0)) {
00243             Diff_xdsdx oxd(base_r, nr) ; const Matrice& mxd = oxd.get_matrice() ;
00244             Diff_dsdx od(base_r, nr) ; const Matrice& md = od.get_matrice() ;
00245             Diff_id oid(base_r, nr) ; const Matrice& mid = oid.get_matrice() ;
00246 
00247             for (int lin=0; lin<nr; lin++) 
00248             for (int col=0; col<nr; col++) 
00249                 ope.set(lin,col) = mxd(lin,col) + ech*md(lin,col) 
00250                 + 2*mid(lin,col) ;
00251             for (int lin=0; lin<nr; lin++) 
00252             for (int col=0; col<nr; col++) 
00253                 ope.set(lin,col+nr) = -l_q*(l_q+1)*mid(lin,col) ;
00254             for (int lin=0; lin<nr; lin++) 
00255             for (int col=0; col<nr; col++) 
00256                 ope.set(lin+nr,col) = -mid(lin,col) ;
00257             for (int lin=0; lin<nr; lin++) 
00258             for (int col=0; col<nr; col++) 
00259                 ope.set(lin+nr,col+nr) = mxd(lin,col) + ech*md(lin,col) + mid(lin,col) ;
00260 
00261             int ind0 = 0 ;
00262             int ind1 = nr ;
00263             for (int col=0; col<2*nr; col++) {
00264             ope.set(ind0+nr-1, col) = 0 ;
00265             ope.set(ind1+nr-1, col) = 0 ;
00266             }
00267             ope.set(ind0+nr-1, ind0) = 1 ;
00268             ope.set(ind1+nr-1, ind1) = 1 ;
00269 
00270             ope.set_lu() ;
00271 
00272             Tbl sec(2*nr) ;
00273             sec.set_etat_qcq() ;
00274             for (int lin=0; lin<nr; lin++)
00275             sec.set(lin) = 0 ;
00276             for (int lin=0; lin<nr; lin++)
00277             sec.set(nr+lin) = (*source_coq.get_spectral_va().c_cf)
00278                 (lz, k, j, lin) ;
00279             sec.set(ind0+nr-1) = 0 ;
00280             sec.set(ind1+nr-1) = 0 ;
00281             Tbl sol = ope.inverse(sec) ;
00282             for (int i=0; i<nr; i++) {
00283             sol_part_vr.set(lz, k, j, i) = sol(i) ;
00284             sol_part_eta.set(lz, k, j, i) = sol(i+nr) ;
00285             }
00286         
00287         
00288             sec.annule_hard() ;
00289             sec.set(ind0+nr-1) = 1 ;
00290             sol = ope.inverse(sec) ;
00291 
00292         
00293             for (int i=0; i<nr; i++) {
00294             sol_hom1_vr.set(lz, k, j, i) = sol(i) ;
00295             sol_hom1_eta.set(lz, k, j, i) = sol(i+nr) ;
00296             }           
00297             sec.set(ind0+nr-1) = 0 ;
00298             sec.set(ind1+nr-1) = 1 ;
00299             sol = ope.inverse(sec) ;
00300 
00301         
00302         
00303             for (int i=0; i<nr; i++) {
00304             sol_hom2_vr.set(lz, k, j, i) = sol(i) ;
00305             sol_hom2_eta.set(lz, k, j, i) = sol(i+nr) ;
00306             }           
00307         }
00308         }
00309     }
00310     }
00311 
00312     //------------------------------
00313     // Compactified external domain
00314     //------------------------------
00315     if (cedbc) {int lz = nzm1 ;  
00316     int nr = mgrid.get_nr(lz) ;
00317     assert(mgrid.get_nt(lz) == nt) ;
00318     assert(mgrid.get_np(lz) == np) ;
00319     double alpha = mp_aff->get_alpha()[lz] ;
00320     Matrice ope(2*nr, 2*nr) ;
00321     ope.set_etat_qcq() ;
00322     
00323     for (int k=0 ; k<np+1 ; k++) {
00324     for (int j=0 ; j<nt ; j++) {
00325         // quantic numbers and spectral bases
00326         base.give_quant_numbers(lz, k, j, m_q, l_q, base_r) ;
00327         if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q > 0)) {
00328         Diff_dsdx od(base_r, nr) ; const Matrice& md = od.get_matrice() ;
00329         Diff_sx os(base_r, nr) ; const Matrice& ms = os.get_matrice() ;
00330 
00331 
00332         for (int lin=0; lin<nr; lin++) 
00333             for (int col=0; col<nr; col++) 
00334             ope.set(lin,col) = - md(lin,col) + 2*ms(lin,col) ;
00335         for (int lin=0; lin<nr; lin++) 
00336             for (int col=0; col<nr; col++) 
00337             ope.set(lin,col+nr) = -l_q*(l_q+1)*ms(lin,col) ;
00338         for (int lin=0; lin<nr; lin++) 
00339             for (int col=0; col<nr; col++) 
00340             ope.set(lin+nr,col) = -ms(lin,col) ;
00341         for (int lin=0; lin<nr; lin++) 
00342             for (int col=0; col<nr; col++) 
00343             ope.set(lin+nr,col+nr) = -md(lin,col) + ms(lin,col) ;
00344 
00345         ope *= 1./alpha ;
00346         int ind0 = 0 ;
00347         int ind1 = nr ;
00348         for (int col=0; col<2*nr; col++) {
00349             ope.set(ind0+nr-1, col) = 0 ;
00350             ope.set(ind1+nr-2, col) = 0 ;
00351             ope.set(ind1+nr-1, col) = 0 ;
00352         }
00353         for (int col=0; col<nr; col++) {
00354             ope.set(ind0+nr-1, col+ind0) = 1 ;
00355             ope.set(ind1+nr-1, col+ind1) = 1 ;
00356         }
00357         ope.set(ind1+nr-2, ind1+1) = 1 ;
00358 
00359         ope.set_lu() ;
00360 
00361         Tbl sec(2*nr) ;
00362         sec.set_etat_qcq() ;
00363         for (int lin=0; lin<nr; lin++)
00364             sec.set(lin) = 0 ;
00365         for (int lin=0; lin<nr; lin++)
00366             sec.set(nr+lin) = (*source.get_spectral_va().c_cf)
00367             (lz, k, j, lin) ;
00368         sec.set(ind0+nr-1) = 0 ;
00369         sec.set(ind1+nr-2) = 0 ;
00370         sec.set(ind1+nr-1) = 0 ;
00371         Tbl sol = ope.inverse(sec) ;
00372 
00373         for (int i=0; i<nr; i++) {
00374             sol_part_vr.set(lz, k, j, i) = sol(i) ;
00375             sol_part_eta.set(lz, k, j, i) = sol(i+nr) ;
00376         }
00377         sec.annule_hard() ;
00378         sec.set(ind1+nr-2) = 1 ;
00379         sol = ope.inverse(sec) ;
00380         for (int i=0; i<nr; i++) {
00381             sol_hom1_vr.set(lz, k, j, i) = sol(i) ;
00382             sol_hom1_eta.set(lz, k, j, i) = sol(i+nr) ;
00383         }
00384         }
00385     }
00386     }
00387     }
00388 
00389     int taille = 2*nz_bc + 1;
00390     if (cedbc) taille-- ;
00391     Mtbl_cf& mvr = *tilde_vr.set_spectral_va().c_cf ;
00392     Mtbl_cf& meta = *tilde_eta.set_spectral_va().c_cf ;
00393     
00394     Tbl sec_membre(taille) ; 
00395     Matrice systeme(taille, taille) ; 
00396     int ligne ;  int colonne ;
00397     Tbl pipo(1) ;
00398     const Tbl& mub = (cedbc ? pipo : par_bc->get_tbl_mod(2) );
00399     double c_vr = (cedbc ? 0 : par_bc->get_tbl_mod(0)(0) ) ;
00400     double d_vr = (cedbc ? 0 : par_bc->get_tbl_mod(0)(1) ) ;
00401     double c_eta = (cedbc ? 0 : par_bc->get_tbl_mod(0)(2) ) ;
00402     double d_eta = (cedbc ? 0 : par_bc->get_tbl_mod(0)(3) ) ;
00403 
00404     
00405 
00406     Mtbl_cf dhom1_vr = sol_hom1_vr ; 
00407     Mtbl_cf dhom2_vr = sol_hom2_vr ; 
00408     Mtbl_cf dpart_vr = sol_part_vr ; 
00409     Mtbl_cf dhom1_eta = sol_hom1_eta ; 
00410     Mtbl_cf dhom2_eta = sol_hom2_eta ; 
00411     Mtbl_cf dpart_eta = sol_part_eta ; 
00412     if (!cedbc) {
00413     dhom1_vr.dsdx() ;
00414     dhom2_vr.dsdx() ;
00415     dpart_vr.dsdx() ;
00416     dhom1_eta.dsdx() ;
00417     dhom2_eta.dsdx() ;
00418     dpart_eta.dsdx() ;
00419     }
00420     
00421     // Loop on l and m
00422     //----------------
00423     for (int k=0 ; k<np+1 ; k++)
00424     for (int j=0 ; j<nt ; j++) {
00425         base.give_quant_numbers(0, k, j, m_q, l_q, base_r) ;
00426         if ((nullite_plm(j, nt, k, np, base) == 1) && (l_q > 0)) {
00427         ligne = 0 ;
00428         colonne = 0 ;
00429         systeme.annule_hard() ;
00430         sec_membre.annule_hard() ;
00431 
00432 
00433         if ((nz==1)&&(mgrid.get_type_r(0) == RARE)) {
00434         // Only one zone, which is a nucleus
00435         double alpha = mp_aff->get_alpha()[nz_bc] ;
00436         systeme.set(ligne, colonne) = 
00437             c_vr*sol_hom2_vr.val_out_bound_jk(nz_bc, j, k) 
00438             + d_vr*dhom2_vr.val_out_bound_jk(nz_bc, j, k) / alpha 
00439             + c_eta*sol_hom2_eta.val_out_bound_jk(nz_bc, j, k) 
00440             + d_eta*dhom2_eta.val_out_bound_jk(nz_bc, j, k) / alpha ;
00441         
00442         sec_membre.set(ligne) -= c_vr*sol_part_vr.val_out_bound_jk(nz_bc, j, k) 
00443             + d_vr*dpart_vr.val_out_bound_jk(nz_bc, j, k)/alpha
00444             + c_eta*sol_part_eta.val_out_bound_jk(nz_bc, j, k) 
00445             + d_eta*dpart_eta.val_out_bound_jk(nz_bc, j, k)/alpha
00446             - mub(k, j) ;
00447         }
00448         else {
00449         // General case, two zones at least
00450         //Nucleus 
00451         int nr = mgrid.get_nr(0) ;
00452         
00453         systeme.set(ligne, colonne) = sol_hom2_vr.val_out_bound_jk(0, j, k) ;
00454         sec_membre.set(ligne) = -sol_part_vr.val_out_bound_jk(0, j, k) ;
00455         ligne++ ;
00456 
00457         systeme.set(ligne, colonne) = sol_hom2_eta.val_out_bound_jk(0, j, k) ;
00458         sec_membre.set(ligne) = -sol_part_eta.val_out_bound_jk(0, j, k) ;
00459         colonne++ ;
00460 
00461         //shells
00462         for (int zone=1 ; zone<nz_bc ; zone++) {
00463             nr = mgrid.get_nr(zone) ;
00464             ligne-- ;
00465 
00466             //Condition at x = -1
00467             systeme.set(ligne, colonne) = 
00468             - sol_hom1_vr.val_in_bound_jk(zone, j, k) ;
00469             systeme.set(ligne, colonne+1) = 
00470             - sol_hom2_vr.val_in_bound_jk(zone, j, k) ;
00471 
00472             sec_membre.set(ligne) += sol_part_vr.val_in_bound_jk(zone, j, k) ;
00473             ligne++ ;
00474 
00475             systeme.set(ligne, colonne) = 
00476             - sol_hom1_eta.val_in_bound_jk(zone, j, k) ;
00477             systeme.set(ligne, colonne+1) = 
00478             - sol_hom2_eta.val_in_bound_jk(zone, j, k) ;
00479 
00480             sec_membre.set(ligne) += sol_part_eta.val_in_bound_jk(zone, j, k) ;
00481             ligne++ ;
00482 
00483             // Condition at x=1
00484             systeme.set(ligne, colonne) = 
00485             sol_hom1_vr.val_out_bound_jk(zone, j, k) ;
00486             systeme.set(ligne, colonne+1) = 
00487             sol_hom2_vr.val_out_bound_jk(zone, j, k) ;
00488 
00489             sec_membre.set(ligne) -= sol_part_vr.val_out_bound_jk(zone, j, k) ;
00490             ligne++ ;
00491 
00492             systeme.set(ligne, colonne) = 
00493             sol_hom1_eta.val_out_bound_jk(zone, j, k) ;
00494             systeme.set(ligne, colonne+1) = 
00495             sol_hom2_eta.val_out_bound_jk(zone, j, k) ;
00496 
00497             sec_membre.set(ligne) -= sol_part_eta.val_out_bound_jk(zone, j, k) ;
00498             
00499             colonne += 2 ;
00500         }
00501     
00502         //Last  domain   
00503         nr = mgrid.get_nr(nz_bc) ;
00504         double alpha = mp_aff->get_alpha()[nz_bc] ;
00505         ligne-- ;
00506             
00507         //Condition at x = -1
00508         systeme.set(ligne, colonne) = 
00509             - sol_hom1_vr.val_in_bound_jk(nz_bc, j, k) ;
00510         if (!cedbc) systeme.set(ligne, colonne+1) = 
00511                 - sol_hom2_vr.val_in_bound_jk(nz_bc, j, k) ;
00512         
00513         sec_membre.set(ligne) += sol_part_vr.val_in_bound_jk(nz_bc, j, k) ;
00514         ligne++ ;
00515             
00516         systeme.set(ligne, colonne) = 
00517             - sol_hom1_eta.val_in_bound_jk(nz_bc, j, k) ;
00518         if (!cedbc) systeme.set(ligne, colonne+1) = 
00519                 - sol_hom2_eta.val_in_bound_jk(nz_bc, j, k) ;
00520             
00521         sec_membre.set(ligne) += sol_part_eta.val_in_bound_jk(nz_bc, j, k) ;
00522         ligne++ ;
00523 
00524         if (!cedbc) {// Special condition at x=1
00525         systeme.set(ligne, colonne) = 
00526             c_vr*sol_hom1_vr.val_out_bound_jk(nz_bc, j, k) 
00527             + d_vr*dhom1_vr.val_out_bound_jk(nz_bc, j, k) / alpha 
00528             + c_eta*sol_hom1_eta.val_out_bound_jk(nz_bc, j, k) 
00529             + d_eta*dhom1_eta.val_out_bound_jk(nz_bc, j, k) / alpha ;
00530         systeme.set(ligne, colonne+1) = 
00531             c_vr*sol_hom2_vr.val_out_bound_jk(nz_bc, j, k) 
00532             + d_vr*dhom2_vr.val_out_bound_jk(nz_bc, j, k) / alpha
00533             + c_eta*sol_hom2_eta.val_out_bound_jk(nz_bc, j, k) 
00534             + d_eta*dhom2_eta.val_out_bound_jk(nz_bc, j, k) / alpha ;
00535 
00536         sec_membre.set(ligne) -= c_vr*sol_part_vr.val_out_bound_jk(nz_bc, j, k) 
00537             + d_vr*dpart_vr.val_out_bound_jk(nz_bc, j, k)/alpha
00538             + c_eta*sol_part_eta.val_out_bound_jk(nz_bc, j, k) 
00539             + d_eta*dpart_eta.val_out_bound_jk(nz_bc, j, k)/alpha
00540             - mub(k, j) ;
00541         }
00542         }
00543 
00544         // Solution of the system giving the coefficients for the homogeneous 
00545         // solutions
00546         //-------------------------------------------------------------------
00547         systeme.set_lu() ;
00548         Tbl facteur = systeme.inverse(sec_membre) ;
00549         int conte = 0 ;
00550 
00551         
00552         // everything is put to the right place...
00553         //----------------------------------------
00554         int nr = mgrid.get_nr(0) ; //nucleus
00555         for (int i=0 ; i<nr ; i++) {
00556             mvr.set(0, k, j, i) = sol_part_vr(0, k, j, i)
00557             + facteur(conte)*sol_hom2_vr(0, k, j, i) ;
00558             meta.set(0, k, j, i) = sol_part_eta(0, k, j, i)
00559             + facteur(conte)*sol_hom2_eta(0, k, j, i) ;
00560         }
00561         conte++ ;
00562         for (int zone=1 ; zone<=n_shell ; zone++) { //shells
00563             nr = mgrid.get_nr(zone) ;
00564             for (int i=0 ; i<nr ; i++) {
00565             mvr.set(zone, k, j, i) = sol_part_vr(zone, k, j, i)
00566             + facteur(conte)*sol_hom1_vr(zone, k, j, i) 
00567             + facteur(conte+1)*sol_hom2_vr(zone, k, j, i) ;
00568             
00569             meta.set(zone, k, j, i) = sol_part_eta(zone, k, j, i)
00570             + facteur(conte)*sol_hom1_eta(zone, k, j, i) 
00571             + facteur(conte+1)*sol_hom2_eta(zone, k, j, i) ;
00572             }
00573             conte+=2 ;
00574         }
00575         if (cedbc) {
00576             nr = mgrid.get_nr(nzm1) ; //compactified external domain
00577             for (int i=0 ; i<nr ; i++) {
00578             mvr.set(nzm1, k, j, i) = sol_part_vr(nzm1, k, j, i)
00579                 + facteur(conte)*sol_hom1_vr(nzm1, k, j, i) ;
00580             
00581             meta.set(nzm1, k, j, i) = sol_part_eta(nzm1, k, j, i)
00582                 + facteur(conte)*sol_hom1_eta(nzm1, k, j, i) ;
00583             }
00584         }
00585 
00586         } // End of nullite_plm  
00587     } //End of loop on theta
00588     
00589         
00590     if (tilde_vr.set_spectral_va().c != 0x0) 
00591     delete tilde_vr.set_spectral_va().c ;
00592     tilde_vr.set_spectral_va().c = 0x0 ;
00593     tilde_vr.set_spectral_va().ylm_i() ;
00594 
00595     if (tilde_eta.set_spectral_va().c != 0x0) 
00596     delete tilde_eta.set_spectral_va().c ;
00597     tilde_eta.set_spectral_va().c = 0x0 ;
00598     tilde_eta.set_spectral_va().ylm_i() ;
00599 
00600 
00601 
00602 } 

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