23char poisson_frontiere_double_C[] =
"$Header: /cvsroot/Lorene/C++/Source/Non_class_members/PDE/poisson_frontiere_double.C,v 1.3 2014/10/13 08:53:29 j_novak Exp $" ;
60#include "type_parite.h"
61#include "utilitaires.h"
71Mtbl_cf sol_poisson_frontiere_double (
const Map_af& mapping,
72 const Mtbl_cf& source,
const Mtbl_cf& lim_func,
const Mtbl_cf& lim_der,
80 assert ((num_zone>0) && (num_zone<nz-1)) ;
81 assert(source.get_mg()->get_type_r(num_zone) == FIN) ;
83 assert (lim_func.get_mg() == source.get_mg()->get_angu()) ;
84 assert (lim_der.get_mg() == source.get_mg()->get_angu()) ;
85 assert (source.get_etat() != ETATNONDEF) ;
86 assert (lim_func.get_etat() != ETATNONDEF) ;
87 assert (lim_der.get_etat() != ETATNONDEF) ;
90 const Base_val& base = source.base ;
93 int nr = source.get_mg()->get_nr(num_zone) ;
94 int nt = source.get_mg()->get_nt(num_zone) ;
95 int np = source.get_mg()->get_np(num_zone) ;;
99 double alpha = mapping.get_alpha()[num_zone] ;
100 double beta = mapping.get_beta()[num_zone] ;
101 double echelle = beta/alpha ;
112 Mtbl_cf resultat(source.get_mg(), base) ;
113 resultat.annule_hard() ;
115 for (
int k=0 ; k<np+1 ; k++)
116 for (
int j=0 ; j<nt ; j++)
117 if (nullite_plm(j, nt, k, np, base) == 1)
120 donne_lm(nz, num_zone, j, k, base, m_quant, l_quant, base_r) ;
123 operateur =
new Matrice(laplacien_mat
124 (nr, l_quant, echelle, 0, base_r)) ;
126 (*operateur) = combinaison(*operateur, l_quant, echelle, 0,
130 nondege =
new Matrice(prepa_nondege(*operateur, l_quant,
131 echelle, 0, base_r)) ;
134 sol_hom =
new Tbl(solh(nr, l_quant, echelle, base_r)) ;
139 for (
int i=0 ; i<nr ; i++)
140 so->set(i) = source(num_zone, k, j, i) ;
142 sol_part =
new Tbl (solp(*operateur, *nondege, alpha,
143 beta, *so, 0, base_r)) ;
151 for (
int i=0 ; i<nr ; i++)
153 somme += (*sol_part)(i) ;
155 somme -= (*sol_part)(i) ;
157 facteur = (lim_func(num_zone-1, k, j, 0)-somme)
158 *
pow(echelle-1, l_quant+1) ;
160 for (
int i=0 ; i<nr ; i++)
162 facteur*(*sol_hom)(1, i) ;
165 facteur = -
pow(echelle-1, 2*l_quant+1) ;
166 for (
int i=0 ; i<nr ; i++)
167 sol_hom->set(0, i) +=
168 facteur*(*sol_hom)(1, i) ;
171 double val_der_solp = 0 ;
172 for (
int i=0 ; i<nr ; i++)
174 val_der_solp -= i*i*(*sol_part)(i)/alpha ;
176 val_der_solp += i*i*(*sol_part)(i)/alpha ;
178 double val_der_solh = 0 ;
179 for (
int i=0 ; i<nr ; i++)
181 val_der_solh -= i*i*(*sol_hom)(0, i)/alpha ;
183 val_der_solh += i*i*(*sol_hom)(0, i)/alpha ;
185 assert (val_der_solh != 0) ;
187 facteur = (lim_der(num_zone-1, k, j, 0)-val_der_solp) /
190 for (
int i=0 ; i<nr ; i++)
192 facteur*(*sol_hom)(0, i) ;
195 for (
int i=0 ; i<nr ; i++)
196 resultat.set(num_zone, k, j, i) = (*sol_part)(i) ;
Tbl & set(int l)
Read/write of the value in a given domain.
int get_nzone() const
Returns the number of domains.
const Mg3d * get_mg() const
Returns the Mg3d on which the Mtbl_cf is defined.
Cmp pow(const Cmp &, int)
Power .