66 #include "type_parite.h" 67 #include "utilitaires.h" 77 Mtbl_cf sol_poisson_frontiere_double (
const Map_af& mapping,
78 const Mtbl_cf& source,
const Mtbl_cf& lim_func,
const Mtbl_cf& lim_der,
86 assert ((num_zone>0) && (num_zone<nz-1)) ;
87 assert(source.get_mg()->get_type_r(num_zone) == FIN) ;
89 assert (lim_func.get_mg() == source.get_mg()->get_angu()) ;
90 assert (lim_der.get_mg() == source.get_mg()->get_angu()) ;
91 assert (source.get_etat() != ETATNONDEF) ;
92 assert (lim_func.get_etat() != ETATNONDEF) ;
93 assert (lim_der.get_etat() != ETATNONDEF) ;
96 const Base_val& base = source.base ;
99 int nr = source.get_mg()->get_nr(num_zone) ;
100 int nt = source.get_mg()->get_nt(num_zone) ;
101 int np = source.get_mg()->get_np(num_zone) ;;
103 int l_quant, m_quant;
105 double alpha = mapping.get_alpha()[num_zone] ;
106 double beta = mapping.get_beta()[num_zone] ;
107 double echelle = beta/alpha ;
118 Mtbl_cf resultat(source.get_mg(), base) ;
119 resultat.annule_hard() ;
121 for (
int k=0 ; k<np+1 ; k++)
122 for (
int j=0 ; j<nt ; j++)
123 if (nullite_plm(j, nt, k, np, base) == 1)
126 donne_lm(nz, num_zone, j, k, base, m_quant, l_quant, base_r) ;
129 operateur =
new Matrice(laplacien_mat
130 (nr, l_quant, echelle, 0, base_r)) ;
132 (*operateur) = combinaison(*operateur, l_quant, echelle, 0,
136 nondege =
new Matrice(prepa_nondege(*operateur, l_quant,
137 echelle, 0, base_r)) ;
140 sol_hom =
new Tbl(solh(nr, l_quant, echelle, base_r)) ;
145 for (
int i=0 ; i<nr ; i++)
146 so->set(i) = source(num_zone, k, j, i) ;
148 sol_part =
new Tbl (solp(*operateur, *nondege, alpha,
149 beta, *so, 0, base_r)) ;
157 for (
int i=0 ; i<nr ; i++)
159 somme += (*sol_part)(i) ;
161 somme -= (*sol_part)(i) ;
163 facteur = (lim_func(num_zone-1, k, j, 0)-somme)
164 *
pow(echelle-1, l_quant+1) ;
166 for (
int i=0 ; i<nr ; i++)
168 facteur*(*sol_hom)(1, i) ;
171 facteur = -
pow(echelle-1, 2*l_quant+1) ;
172 for (
int i=0 ; i<nr ; i++)
173 sol_hom->set(0, i) +=
174 facteur*(*sol_hom)(1, i) ;
177 double val_der_solp = 0 ;
178 for (
int i=0 ; i<nr ; i++)
180 val_der_solp -= i*i*(*sol_part)(i)/alpha ;
182 val_der_solp += i*i*(*sol_part)(i)/alpha ;
184 double val_der_solh = 0 ;
185 for (
int i=0 ; i<nr ; i++)
187 val_der_solh -= i*i*(*sol_hom)(0, i)/alpha ;
189 val_der_solh += i*i*(*sol_hom)(0, i)/alpha ;
191 assert (val_der_solh != 0) ;
193 facteur = (lim_der(num_zone-1, k, j, 0)-val_der_solp) /
196 for (
int i=0 ; i<nr ; i++)
198 facteur*(*sol_hom)(0, i) ;
201 for (
int i=0 ; i<nr ; i++)
202 resultat.set(num_zone, k, j, i) = (*sol_part)(i) ;
const Mg3d * get_mg() const
Returns the Mg3d on which the Mtbl_cf is defined.
int get_nzone() const
Returns the number of domains.
Cmp pow(const Cmp &, int)
Power .
Tbl & set(int l)
Read/write of the value in a given domain.