83void Vector::poisson_boundary2(
double lam,
Vector& resu, Scalar boundvr, Scalar boundeta, Scalar boundmu,
double dir_vr,
double neum_vr,
double dir_eta,
double neum_eta,
double dir_mu,
double neum_mu)
const {
87 for (
int i=0; i<3; i++)
88 assert(
cmp[i]->check_dzpuis(4)) ;
93 assert( mpaff != 0x0) ;
96 if (fabs(lam + 1.) < 1.e-8) {
98 cout <<
" lambda = -1 is not supported by this code!" << endl;
105 Scalar bound_vr2 = boundvr;
107 Scalar bound_eta2 = boundeta;
120 const Mg3d& mg = *mpaff->get_mg() ;
121 int nz = mg.
get_nzone() ;
int nzm1 = nz - 1;
124 Scalar S_r = *
cmp[0] ;
125 Scalar S_eta =
eta() ;
163 Scalar sou_l0 = (*
cmp[0]) / (1. + lam) ;
167 for (
int l=0; l<nz; l++){
185 double alpha = mpaff->
get_alpha()[1] ;
double alp2 = alpha*alpha ;
186 double beta = mpaff->
get_beta()[1] ;
188 int l_q = 0 ;
int m_q = 0;
int base_r = 0 ;
189 for (
int zone=1 ; zone<nzm1 ; zone++) {
192 assert(nt == mg.
get_nt(zone)) ;
193 assert(np == mg.
get_np(zone)) ;
196 double ech = beta / alpha ;
200 for (
int k=0 ; k<np+1 ; k++) {
201 for (
int j=0 ; j<nt ; j++) {
203 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q != 0) ) {
206 int nr_eq1 = nr - dege1 ;
207 int nr_eq2 = nr - dege2 ;
220 for (
int lin=0; lin<nr_eq1; lin++) {
221 for (
int col=0; col<nr; col++)
223 = m2d2(lin,col) + 2*ech*mxd2(lin,col) + ech*ech*md2(lin,col)
224 + 2*(mxd(lin,col) + ech*md(lin,col))
225 - (lam+1)*l_q*(l_q+1)*mid(lin,col) ;
226 for (
int col=0; col<nr; col++)
228 = lam*(mxd(lin,col) + ech*md(lin,col))
229 + 2*(1+lam)*mid(lin,col) ;
231 oper.
set(nr_eq1, 0) = 1 ;
232 for (
int col=1; col<2*nr; col++)
233 oper.
set(nr_eq1, col) = 0 ;
234 oper.
set(nr_eq1+1, 0) = 0 ;
235 oper.
set(nr_eq1+1, 1) = 1 ;
236 for (
int col=2; col<2*nr; col++)
237 oper.
set(nr_eq1+1, col) = 0 ;
238 for (
int lin=0; lin<nr_eq2; lin++) {
239 for (
int col=0; col<nr; col++)
241 = -l_q*(l_q+1)*(lam*(mxd(lin,col) + ech*md(lin,col))
242 - (lam+2)*mid(lin,col)) ;
243 for (
int col=0; col<nr; col++)
244 oper.
set(lin+nr, col+nr)
245 = (lam+1)*(m2d2(lin,col) + 2*ech*mxd2(lin,col)
246 + ech*ech*md2(lin,col)
247 + 2*(mxd(lin,col) + ech*md(lin,col)))
248 -(2*(lam+1)+l_q*(l_q+1))*mid(lin,col) ;
250 for (
int col=0; col<nr; col++)
251 oper.
set(nr+nr_eq2, col) = 0 ;
252 oper.
set(nr+nr_eq2, nr) = 1 ;
253 for (
int col=nr+1; col<2*nr; col++)
254 oper.
set(nr+nr_eq2, col) = 0 ;
255 for (
int col=0; col<nr+1; col++)
256 oper.
set(nr+nr_eq2+1, col) = 0 ;
257 oper.
set(nr+nr_eq2+1, nr+1) = 1 ;
258 for (
int col=nr+2; col<2*nr; col++)
259 oper.
set(nr+nr_eq2+1, col) = 0 ;
267 for (
int i=0; i<nr; i++) {
271 Tbl xsr= sr ;
Tbl x2sr= sr ;
272 Tbl xseta= seta ;
Tbl x2seta = seta ;
273 multx2_1d(nr, &x2sr.
t, base_r) ; multx_1d(nr, &xsr.
t, base_r) ;
274 multx2_1d(nr, &x2seta.
t, base_r) ; multx_1d(nr, &xseta.
t, base_r) ;
276 for (
int i=0; i<nr_eq1; i++)
277 sec_membre.
set(i) = alpha*(alpha*x2seta(i) + 2*beta*xseta(i))
279 sec_membre.
set(nr_eq1) = 0 ;
280 sec_membre.
set(nr_eq1+1) = 0 ;
281 for (
int i=0; i<nr_eq2; i++)
282 sec_membre.
set(i+nr) = beta*beta*sr(i)
283 + alpha*(alpha*x2sr(i) + 2*beta*xsr(i)) ;
284 sec_membre.
set(nr+nr_eq2) = 0 ;
285 sec_membre.
set(nr+nr_eq2+1) = 0 ;
290 for (
int i=0; i<nr; i++) {
291 sol_part_eta.
set(zone, k, j, i) = big_res(i) ;
292 sol_part_vr.
set(zone, k, j, i) = big_res(nr+i) ;
298 sec_membre.
set(nr_eq1) = 1 ;
299 big_res = oper.
inverse(sec_membre) ;
300 for (
int i=0 ; i<nr ; i++) {
301 sol_hom_un_eta.
set(zone, k, j, i) = big_res(i) ;
302 sol_hom_un_vr.
set(zone, k, j, i) = big_res(nr+i) ;
304 sec_membre.
set(nr_eq1) = 0 ;
305 sec_membre.
set(nr_eq1+1) = 1 ;
306 big_res = oper.
inverse(sec_membre) ;
307 for (
int i=0 ; i<nr ; i++) {
308 sol_hom_deux_eta.
set(zone, k, j, i) = big_res(i) ;
309 sol_hom_deux_vr.
set(zone, k, j, i) = big_res(nr+i) ;
311 sec_membre.
set(nr_eq1+1) = 0 ;
312 sec_membre.
set(nr+nr_eq2) = 1 ;
313 big_res = oper.
inverse(sec_membre) ;
314 for (
int i=0 ; i<nr ; i++) {
315 sol_hom_trois_eta.
set(zone, k, j, i) = big_res(i) ;
316 sol_hom_trois_vr.
set(zone, k, j, i) = big_res(nr+i) ;
318 sec_membre.
set(nr+nr_eq2) = 0 ;
319 sec_membre.
set(nr+nr_eq2+1) = 1 ;
320 big_res = oper.
inverse(sec_membre) ;
321 for (
int i=0 ; i<nr ; i++) {
322 sol_hom_quatre_eta.
set(zone, k, j, i) = big_res(i) ;
323 sol_hom_quatre_vr.
set(zone, k, j, i) = big_res(nr+i) ;
334 assert(nt == mg.
get_nt(nzm1)) ;
335 assert(np == mg.
get_np(nzm1)) ;
336 alpha = mpaff->
get_alpha()[nzm1] ; alp2 = alpha*alpha ;
341 for (
int k=0 ; k<np+1 ; k++) {
342 for (
int j=0 ; j<nt ; j++) {
344 if ( (nullite_plm(j, nt, k, np, base) == 1) && (l_q != 0) ) {
346 int dege2 = (l_q == 1 ? 2 : 3);
347 int nr_eq1 = nr - dege1 ;
348 int nr_eq2 = nr - dege2 ;
358 for (
int lin=0; lin<nr_eq1; lin++) {
359 for (
int col=0; col<nr; col++)
361 = (md2(lin,col) - (lam+1)*l_q*(l_q+1)*ms2(lin,col))/alp2 ;
362 for (
int col=0; col<nr; col++)
363 oper.
set(lin,col+nr) =
364 (-lam*mxd(lin,col) + 2*(1+lam)*ms2(lin,col)) / alp2 ;
366 for (
int col=0; col<nr; col++)
367 oper.
set(nr_eq1, col) = 1 ;
368 for (
int col=nr; col<nrtot; col++)
369 oper.
set(nr_eq1, col) = 0 ;
371 for (
int col=0; col<nr; col++) {
372 oper.
set(nr_eq1+1, col) = pari*col*col ;
375 for (
int col=nr; col<nrtot; col++)
376 oper.
set(nr_eq1+1, col) = 0 ;
377 oper.
set(nr_eq1+2, 0) = 1 ;
378 for (
int col=1; col<nrtot; col++)
379 oper.
set(nr_eq1+2, col) = 0 ;
380 for (
int lin=0; lin<nr_eq2; lin++) {
381 for (
int col=0; col<nr; col++)
382 oper.
set(lin+nr,col) = (l_q*(l_q+1)*(lam*mxd(lin,col)
383 + (lam+2)*ms2(lin,col))) / alp2 ;
384 for (
int col=0; col<nr; col++)
385 oper.
set(lin+nr, col+nr) = ((lam+1)*md2(lin,col)
386 - (2*(lam+1) + l_q*(l_q+1))*ms2(lin,col)) / alp2 ;
388 for (
int col=0; col<nr; col++)
389 oper.
set(nr+nr_eq2, col) = 0 ;
390 for (
int col=nr; col<nrtot; col++)
391 oper.
set(nr+nr_eq2, col) = 1 ;
392 for (
int col=0; col<nr; col++)
393 oper.
set(nr+nr_eq2+1, col) = 0 ;
395 for (
int col=0; col<nr; col++) {
396 oper.
set(nr+nr_eq2+1, nr+col) = pari*col*col ;
400 for (
int col=0; col<nr; col++)
401 oper.
set(nr+nr_eq2+2, col) = 0 ;
402 oper.
set(nr+nr_eq2+2, nr) = 1 ;
403 for (
int col=nr+1; col<nrtot; col++)
404 oper.
set(nr+nr_eq2+2, col) = 0 ;
410 for (
int i=0; i<nr_eq1; i++)
412 for (
int i=nr_eq1; i<nr; i++)
413 sec_membre.
set(i) = 0 ;
414 for (
int i=0; i<nr_eq2; i++)
416 for (
int i=nr_eq2; i<nr; i++)
417 sec_membre.
set(nr+i) = 0 ;
422 for (
int i=0; i<nr; i++) {
423 sol_part_eta.
set(nzm1, k, j, i) = big_res(i) ;
424 sol_part_vr.
set(nzm1, k, j, i) = big_res(i+nr) ;
430 Tbl sol_hom1 = solh(nr, 0, 0., base_r) ;
431 Tbl sol_hom2 = solh(nr, 2, 0., base_r) ;
432 double fac_eta = lam + 2. ;
433 double fac_vr = 2*lam + 2. ;
434 for (
int i=0 ; i<nr ; i++) {
435 sol_hom_deux_eta.
set(nzm1, k, j, i) = sol_hom2(i) ;
436 sol_hom_quatre_eta.
set(nzm1, k, j, i) = fac_eta*sol_hom1(i) ;
437 sol_hom_deux_vr.
set(nzm1, k, j, i) = -2*sol_hom2(i) ;
438 sol_hom_quatre_vr.
set(nzm1, k, j, i) = fac_vr*sol_hom1(i) ;
443 sec_membre.
set(nr-1) = 1 ;
444 big_res = oper.
inverse(sec_membre) ;
446 for (
int i=0; i<nr; i++) {
447 sol_hom_deux_eta.
set(nzm1, k, j, i) = big_res(i) ;
448 sol_hom_deux_vr.
set(nzm1, k, j, i) = big_res(nr+i) ;
450 sec_membre.
set(nr-1) = 0 ;
451 sec_membre.
set(2*nr-1) = 1 ;
452 big_res = oper.
inverse(sec_membre) ;
453 for (
int i=0; i<nr; i++) {
454 sol_hom_quatre_eta.
set(nzm1, k, j, i) = big_res(i) ;
455 sol_hom_quatre_vr.
set(nzm1, k, j, i) = big_res(nr+i) ;
476 int taille = 4*nzm1 -2 ;
477 Tbl sec_membre(taille) ;
478 Matrice systeme(taille, taille) ;
480 int ligne ;
int colonne ;
484 for (
int k=0 ; k<np+1 ; k++)
485 for (
int j=0 ; j<nt ; j++) {
487 if ((nullite_plm(j, nt, k, np, base) == 1)&&(l_q != 0)) {
502 systeme.
set(ligne, colonne)
504 systeme.
set(ligne, colonne+1)
506 systeme.
set(ligne, colonne+2)
508 systeme.
set(ligne, colonne+3)
519 for (
int i=0; i<nr; i++) {
520 systeme.
set(ligne, colonne)
521 -= neum_eta*pari*i*i*sol_hom_un_eta(zone1, k, j, i)/alpha ;
522 systeme.
set(ligne, colonne+1)
523 -= neum_eta*pari*i*i*sol_hom_deux_eta(zone1, k, j, i)/alpha ;
524 systeme.
set(ligne, colonne+2)
525 -= neum_eta*pari*i*i*sol_hom_trois_eta(zone1, k, j, i)/alpha ;
526 systeme.
set(ligne, colonne+3)
527 -= neum_eta*pari*i*i*sol_hom_quatre_eta(zone1, k, j, i)/alpha ;
528 sec_membre.
set(ligne)
529 += neum_eta*pari*i*i* sol_part_eta(zone1, k, j, i)/alpha ;
533 sec_membre.
set(ligne) -= (*bound_eta).val_in_bound_jk(1,j,k);
539 systeme.
set(ligne, colonne)
541 systeme.
set(ligne, colonne+1)
543 systeme.
set(ligne, colonne+2)
545 systeme.
set(ligne, colonne+3)
553 for (
int i=0; i<nr; i++) {
554 systeme.
set(ligne, colonne)
555 -= neum_vr*pari*i*i*sol_hom_un_vr(zone1, k, j, i)/alpha ;
556 systeme.
set(ligne, colonne+1)
557 -= neum_vr*pari*i*i*sol_hom_deux_vr(zone1, k, j, i)/alpha ;
558 systeme.
set(ligne, colonne+2)
559 -= neum_vr*pari*i*i*sol_hom_trois_vr(zone1, k, j, i)/alpha ;
560 systeme.
set(ligne, colonne+3)
561 -= neum_vr*pari*i*i*sol_hom_quatre_vr(zone1, k, j, i)/alpha ;
562 sec_membre.
set(ligne)
563 += neum_vr*pari*i*i* sol_part_vr(zone1, k, j, i)/alpha ;
567 sec_membre.
set(ligne) -= (*bound_vr).val_in_bound_jk(1,j,k);
575 systeme.
set(ligne, colonne)
577 systeme.
set(ligne, colonne+1)
579 systeme.
set(ligne, colonne+2)
581 systeme.
set(ligne, colonne+3)
586 systeme.
set(ligne, colonne)
588 systeme.
set(ligne, colonne+1)
590 systeme.
set(ligne, colonne+2)
592 systeme.
set(ligne, colonne+3)
599 for (
int i=0; i<nr; i++) {
600 systeme.
set(ligne, colonne)
601 += pari*i*i*sol_hom_un_eta(zone1, k, j, i)/alpha ;
602 systeme.
set(ligne, colonne+1)
603 += pari*i*i*sol_hom_deux_eta(zone1, k, j, i)/alpha ;
604 systeme.
set(ligne, colonne+2)
605 += pari*i*i*sol_hom_trois_eta(zone1, k, j, i)/alpha ;
606 systeme.
set(ligne, colonne+3)
607 += pari*i*i*sol_hom_quatre_eta(zone1, k, j, i)/alpha ;
608 sec_membre.
set(ligne)
609 -= pari*i*i* sol_part_eta(zone1, k, j, i)/alpha ;
615 for (
int i=0; i<nr; i++) {
616 systeme.
set(ligne, colonne)
617 += pari*i*i*sol_hom_un_vr(zone1, k, j, i)/alpha ;
618 systeme.
set(ligne, colonne+1)
619 += pari*i*i*sol_hom_deux_vr(zone1, k, j, i)/alpha ;
620 systeme.
set(ligne, colonne+2)
621 += pari*i*i*sol_hom_trois_vr(zone1, k, j, i)/alpha ;
622 systeme.
set(ligne, colonne+3)
623 += pari*i*i*sol_hom_quatre_vr(zone1, k, j, i)/alpha ;
624 sec_membre.
set(ligne)
625 -= pari*i*i* sol_part_vr(zone1, k, j, i)/alpha ;
632 cout <<
"WARNING!! Mapping must contain at least 2 shells!!" << endl;}
633 for (
int zone=2 ; zone<nzm1 ; zone++) {
638 systeme.
set(ligne, colonne)
640 systeme.
set(ligne, colonne+1)
642 systeme.
set(ligne, colonne+2)
644 systeme.
set(ligne, colonne+3)
649 systeme.
set(ligne, colonne)
651 systeme.
set(ligne, colonne+1)
653 systeme.
set(ligne, colonne+2)
655 systeme.
set(ligne, colonne+3)
662 for (
int i=0; i<nr; i++) {
663 systeme.
set(ligne, colonne)
664 -= pari*i*i*sol_hom_un_eta(zone, k, j, i)/alpha ;
665 systeme.
set(ligne, colonne+1)
666 -= pari*i*i*sol_hom_deux_eta(zone, k, j, i)/alpha ;
667 systeme.
set(ligne, colonne+2)
668 -= pari*i*i*sol_hom_trois_eta(zone, k, j, i)/alpha ;
669 systeme.
set(ligne, colonne+3)
670 -= pari*i*i*sol_hom_quatre_eta(zone, k, j, i)/alpha ;
671 sec_membre.
set(ligne)
672 += pari*i*i* sol_part_eta(zone, k, j, i)/alpha ;
678 for (
int i=0; i<nr; i++) {
679 systeme.
set(ligne, colonne)
680 -= pari*i*i*sol_hom_un_vr(zone, k, j, i)/alpha ;
681 systeme.
set(ligne, colonne+1)
682 -= pari*i*i*sol_hom_deux_vr(zone, k, j, i)/alpha ;
683 systeme.
set(ligne, colonne+2)
684 -= pari*i*i*sol_hom_trois_vr(zone, k, j, i)/alpha ;
685 systeme.
set(ligne, colonne+3)
686 -= pari*i*i*sol_hom_quatre_vr(zone, k, j, i)/alpha ;
687 sec_membre.
set(ligne)
688 += pari*i*i* sol_part_vr(zone, k, j, i)/alpha ;
693 systeme.
set(ligne, colonne)
695 systeme.
set(ligne, colonne+1)
697 systeme.
set(ligne, colonne+2)
699 systeme.
set(ligne, colonne+3)
704 systeme.
set(ligne, colonne)
706 systeme.
set(ligne, colonne+1)
708 systeme.
set(ligne, colonne+2)
710 systeme.
set(ligne, colonne+3)
717 for (
int i=0; i<nr; i++) {
718 systeme.
set(ligne, colonne)
719 += pari*i*i*sol_hom_un_eta(zone, k, j, i)/alpha ;
720 systeme.
set(ligne, colonne+1)
721 += pari*i*i*sol_hom_deux_eta(zone, k, j, i)/alpha ;
722 systeme.
set(ligne, colonne+2)
723 += pari*i*i*sol_hom_trois_eta(zone, k, j, i)/alpha ;
724 systeme.
set(ligne, colonne+3)
725 += pari*i*i*sol_hom_quatre_eta(zone, k, j, i)/alpha ;
726 sec_membre.
set(ligne)
727 -= pari*i*i* sol_part_eta(zone, k, j, i)/alpha ;
733 for (
int i=0; i<nr; i++) {
734 systeme.
set(ligne, colonne)
735 += pari*i*i*sol_hom_un_vr(zone, k, j, i)/alpha ;
736 systeme.
set(ligne, colonne+1)
737 += pari*i*i*sol_hom_deux_vr(zone, k, j, i)/alpha ;
738 systeme.
set(ligne, colonne+2)
739 += pari*i*i*sol_hom_trois_vr(zone, k, j, i)/alpha ;
740 systeme.
set(ligne, colonne+3)
741 += pari*i*i*sol_hom_quatre_vr(zone, k, j, i)/alpha ;
742 sec_membre.
set(ligne)
743 -= pari*i*i* sol_part_vr(zone, k, j, i)/alpha ;
755 systeme.
set(ligne, colonne)
757 systeme.
set(ligne, colonne+1)
761 systeme.
set(ligne+1, colonne)
763 systeme.
set(ligne+1, colonne+1)
770 for (
int i=0; i<nr; i++) {
771 systeme.
set(ligne, colonne)
772 -= 4*alpha*pari*i*i*sol_hom_deux_eta(nzm1, k, j, i) ;
773 systeme.
set(ligne, colonne+1)
774 -= 4*alpha*pari*i*i*sol_hom_quatre_eta(nzm1, k, j, i) ;
775 sec_membre.
set(ligne)
776 += 4*alpha*pari*i*i* sol_part_eta(nzm1, k, j, i) ;
782 for (
int i=0; i<nr; i++) {
783 systeme.
set(ligne, colonne)
784 -= 4*alpha*pari*i*i*sol_hom_deux_vr(nzm1, k, j, i) ;
785 systeme.
set(ligne, colonne+1)
786 -= 4*alpha*pari*i*i*sol_hom_quatre_vr(nzm1, k, j, i) ;
787 sec_membre.
set(ligne)
788 += 4*alpha*pari*i*i* sol_part_vr(nzm1, k, j, i) ;
803 for (
int i=0 ; i<nr ; i++) {
804 cf_eta.
set(0, k, j, i) = 0.;
805 cf_vr.
set(0, k, j, i) = 0.;
808 for (
int zone=1 ; zone<nzm1 ; zone++) {
810 for (
int i=0 ; i<nr ; i++) {
811 cf_eta.
set(zone, k, j, i) =
812 sol_part_eta(zone, k, j, i)
813 +facteurs(conte)*sol_hom_un_eta(zone, k, j, i)
814 +facteurs(conte+1)*sol_hom_deux_eta(zone, k, j, i)
815 +facteurs(conte+2)*sol_hom_trois_eta(zone, k, j, i)
816 +facteurs(conte+3)*sol_hom_quatre_eta(zone, k, j, i) ;
817 cf_vr.
set(zone, k, j, i) = sol_part_vr(zone, k, j, i)
818 +facteurs(conte)*sol_hom_un_vr(zone, k, j, i)
819 +facteurs(conte+1)*sol_hom_deux_vr(zone, k, j, i)
820 +facteurs(conte+2)*sol_hom_trois_vr(zone, k, j, i)
821 +facteurs(conte+3)*sol_hom_quatre_vr(zone, k, j, i) ;
826 for (
int i=0 ; i<nr ; i++) {
827 cf_eta.
set(nzm1, k, j, i) = sol_part_eta(nzm1, k, j, i)
828 +facteurs(conte)*sol_hom_deux_eta(nzm1, k, j, i)
829 +facteurs(conte+1)*sol_hom_quatre_eta(nzm1, k, j, i) ;
830 cf_vr.
set(nzm1, k, j, i) = sol_part_vr(nzm1, k, j, i)
831 +facteurs(conte)*sol_hom_deux_vr(nzm1, k, j, i)
832 +facteurs(conte+1)*sol_hom_quatre_vr(nzm1, k, j, i) ;
852 resu.
set_vr_eta_mu(vr, het,
mu().sol_elliptic_boundary(param_mu, (*bound_mu), dir_mu , neum_mu)) ;