95 Tbl _dal_inverse_pas_prevu (
const Matrice&,
const Tbl&,
const bool) {
96 cout <<
" Inversion du dalembertien pas prevue ..... : "<< endl ;
108 Tbl _dal_inverse_r_cheb_o2d_s(
const Matrice &op,
const Tbl &source,
113 int nr = op.get_dim(0) ;
119 for (
int i=0; i<nr-4; i++) {
120 int nrmin = (i>1 ? i-1 : 0) ;
121 int nrmax = (i<nr-9 ? i+10 : nr) ;
122 for (
int j=nrmin; j<nrmax; j++)
123 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
125 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
126 if (i==0) dirac = 1 ;
128 for (
int i=0; i<nr-4; i++) {
129 int nrmin = (i>1 ? i-1 : 0) ;
130 int nrmax = (i<nr-9 ? i+10 : nr) ;
131 for (
int j=nrmin; j<nrmax; j++)
132 barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
133 if (part) aux.set(i) = aux(i+2) - aux(i) ;
137 barre.set_band(5,1) ;
144 return barre.inverse(aux) ;
147 Tbl _dal_inverse_r_cheb_o2d_l(
const Matrice &op,
const Tbl &source,
152 int nr = op.get_dim(0) ;
158 for (
int i=0; i<nr-4; i++) {
159 int nrmin = (i>1 ? i-1 : 0) ;
160 int nrmax = (i<nr-9 ? i+10 : nr) ;
161 for (
int j=nrmin; j<nrmax; j++)
162 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
164 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
165 if (i==0) dirac = 1 ;
167 for (
int i=0; i<nr-4; i++) {
168 int nrmin = (i>1 ? i-1 : 0) ;
169 int nrmax = (i<nr-9 ? i+10 : nr) ;
170 for (
int j=nrmin; j<nrmax; j++)
171 barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
172 if (part) aux.set(i) = aux(i+2) - aux(i) ;
180 double temp1, temp2 ;
183 for (
int i=nr-3; i>=0; i--) {
184 int nrmin = (i>1 ? i-1 : 0) ;
185 int nrmax = (i<nr-9 ? i+10 : nr) ;
186 for (
int j=nrmin; j<nrmax; j++)
187 barre.set(i+2,j) = barre(i,j) ;
188 aux.set(i+2) = aux(i) ;
193 barre.set(0,0) = 0.5 ;
194 barre.set(0,1) = 1. ;
195 barre.set(0,2) = 1. ;
196 barre.set(0,3) = 1. ;
197 barre.set(0,4) = 0. ;
199 barre.set(1,0) = 0. ;
200 barre.set(1,1) = 0.5 ;
201 barre.set(1,2) = 1. ;
202 barre.set(1,3) = -1. ;
203 barre.set(1,4) = 1. ;
204 barre.set(1,5) = 0. ;
207 barre.set_band(3,3) ;
214 return barre.inverse(aux) ;
217 Tbl _dal_inverse_r_cheb_o2_s(
const Matrice &op,
const Tbl &source,
222 int nr = op.get_dim(0) ;
228 for (
int i=0; i<nr-4; i++) {
229 int nrmin = (i>2 ? i-2 : 0) ;
230 int nrmax = (i<nr-10 ? i+11 : nr) ;
231 for (
int j=nrmin; j<nrmax; j++)
232 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
234 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
235 if (i==0) dirac = 1 ;
237 for (
int i=0; i<nr-4; i++) {
238 int nrmin = (i>2 ? i-2 : 0) ;
239 int nrmax = (i<nr-10 ? i+11 : nr) ;
240 for (
int j=nrmin; j<nrmax; j++)
241 barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
242 if (part) aux.set(i) = aux(i+2) - aux(i) ;
246 barre.set_band(6,2) ;
253 return barre.inverse(aux) ;
256 Tbl _dal_inverse_r_cheb_o2_l(
const Matrice &op,
const Tbl &source,
261 int nr = op.get_dim(0) ;
267 for (
int i=0; i<nr-4; i++) {
268 int nrmin = (i>2 ? i-2 : 0) ;
269 int nrmax = (i<nr-10 ? i+11 : nr) ;
270 for (
int j=nrmin; j<nrmax; j++)
271 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
273 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
274 if (i==0) dirac = 1 ;
276 for (
int i=0; i<nr-4; i++) {
277 int nrmin = (i>2 ? i-2 : 0) ;
278 int nrmax = (i<nr-10 ? i+11 : nr) ;
279 for (
int j=nrmin; j<nrmax; j++)
280 barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
281 if (part) aux.set(i) = aux(i+2) - aux(i) ;
289 double temp1, temp2 ;
292 for (
int i=nr-3; i>=0; i--) {
293 int nrmin = (i>2 ? i-2 : 0) ;
294 int nrmax = (i<nr-10 ? i+11 : nr) ;
295 for (
int j=nrmin; j<nrmax; j++)
296 barre.set(i+2,j) = barre(i,j) ;
297 aux.set(i+2) = aux(i) ;
302 barre.set(0,0) = 0.5 ;
303 barre.set(0,1) = 1. ;
304 barre.set(0,2) = 1. ;
305 barre.set(0,3) = 1. ;
306 barre.set(0,4) = 1. ;
307 barre.set(0,5) = 0. ;
309 barre.set(1,0) = 0. ;
310 barre.set(1,1) = 0.5 ;
311 barre.set(1,2) = -1. ;
312 barre.set(1,3) = 1. ;
313 barre.set(1,4) = -1. ;
314 barre.set(1,5) = 1. ;
315 barre.set(1,6) = 0. ;
318 barre.set_band(4,4) ;
325 return barre.inverse(aux) ;
332 Tbl _dal_inverse_r_chebp_o2d_s(
const Matrice &op,
const Tbl &source,
337 int nr = op.get_dim(0) ;
351 for (
int i=0; i<nr-4; i++) {
352 int nrmax = (i<nr-7 ? i+8 : nr) ;
353 for (
int j=i; j<nrmax; j++)
354 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
356 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
357 if (i==0) dirac = 1 ;
359 for (
int i=0; i<nr-4; i++) {
360 int nrmax = (i<nr-7 ? i+8 : nr) ;
361 for (
int j=i; j<nrmax; j++) barre.set(i,j) = barre(i+1,j) - barre(i,j) ;
362 if (part) aux.set(i) = aux(i+1) - aux(i) ;
364 if (fabs(barre(nr-5,nr-1)) >= 1.e-16) {
365 if (fabs(barre(nr-5,nr-1)) > fabs(barre(nr-2,nr-1))) {
366 double lambda = barre(nr-2,nr-1)/barre(nr-5,nr-1) ;
367 for (
int j=nr-5; j<nr; j++) barre.set(nr-5,j) = barre(nr-5,j)*lambda
369 if (part) aux.set(nr-5) = aux(nr-5)*lambda - aux(nr-2) ;
372 double lambda = barre(nr-5,nr-1)/barre(nr-2,nr-1) ;
373 for (
int j=nr-5; j<nr; j++) barre.set(nr-5,j) -= lambda*barre(nr-2,j) ;
374 if (part) aux.set(nr-5) -= lambda*aux(nr-2) ;
379 barre.set_band(3,0) ;
386 return barre.inverse(aux) ;
391 Tbl _dal_inverse_r_chebp_o2d_l(
const Matrice &op,
const Tbl &source,
396 int nr = op.get_dim(0) ;
410 for (
int i=0; i<nr-4; i++) {
411 int nrmax = (i<nr-7 ? i+8 : nr) ;
412 for (
int j=i; j<nrmax; j++)
413 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
415 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
416 if (i==0) dirac = 1 ;
418 for (
int i=0; i<nr-4; i++) {
419 int nrmax = (i<nr-7 ? i+8 : nr) ;
420 for (
int j=i; j<nrmax; j++) barre.set(i,j) = barre(i+1,j) - barre(i,j) ;
421 if (part) aux.set(i) = aux(i+1) - aux(i) ;
423 if (fabs(barre(nr-5,nr-1)) >= 1.e-16) {
424 if (fabs(barre(nr-5,nr-1)) > fabs(barre(nr-2,nr-1))) {
425 double lambda = barre(nr-2,nr-1)/barre(nr-5,nr-1) ;
426 for (
int j=nr-5; j<nr; j++) barre.set(nr-5,j) = barre(nr-5,j)*lambda
428 if (part) aux.set(nr-5) = aux(nr-5)*lambda - aux(nr-2) ;
431 double lambda = barre(nr-5,nr-1)/barre(nr-2,nr-1) ;
432 for (
int j=nr-5; j<nr; j++) barre.set(nr-5,j) -= lambda*barre(nr-2,j) ;
433 if (part) aux.set(nr-5) -= lambda*aux(nr-2) ;
442 for (
int i=nr-2; i>=0; i--) {
443 for (
int j=i; j<((i+5 > nr) ? nr : i+5); j++)
444 barre.set(i+1,j) = barre(i,j) ;
445 if (part) aux.set(i+1) = aux(i) ;
447 barre.set(0,0) = 0.5 ;
448 barre.set(0,1) = 1. ;
449 barre.set(0,2) = 1. ;
450 barre.set(0,3) = 0. ;
452 if (part) aux.set(0) = 0 ;
455 barre.set_band(2,1) ;
462 return barre.inverse(aux);
467 Tbl _dal_inverse_r_chebp_o2_s(
const Matrice &op,
const Tbl &source,
472 int nr = op.get_dim(0) ;
476 for (
int i=nr-4; i<nr-1; i++) aux.set(i) = source(i) ;
486 for (
int i=0; i<nr-4; i++) {
487 int nrmax = (i<nr-7 ? i+8 : nr) ;
488 for (
int j=i; j<nrmax; j++)
489 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
491 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
492 if (i==0) dirac = 1 ;
494 for (
int i=0; i<nr-4; i++) {
495 int nrmax = (i<nr-7 ? i+8 : nr) ;
496 for (
int j=i; j<nrmax; j++) barre.set(i,j) = barre(i+1,j) - barre(i,j) ;
497 if (part) aux.set(i) = aux(i+1) - aux(i) ;
502 Matrice tilde(nr-1,nr-1) ;
503 tilde.set_etat_qcq() ;
504 for (
int i=0; i<nr-1; i++)
505 for (
int j=0; j<nr-1;j++)
506 tilde.set(i,j) = barre(i,j+1) + barre(i,j) ;
509 tilde.set_band(3,1) ;
515 Tbl res0(tilde.inverse(aux)) ;
520 res.set(0) = res0(0) ;
521 res.set(nr-1) = res0(nr-2) ;
522 for (
int i=1; i<nr-1; i++) res.set(i) = res0(i-1) + res0(i);
529 Tbl _dal_inverse_r_chebp_o2_l(
const Matrice &op,
const Tbl &source,
534 int nr = op.get_dim(0) ;
538 for (
int i=nr-4; i<nr-1; i++) aux.set(i) = source(i) ;
548 for (
int i=0; i<nr-4; i++) {
549 int nrmax = (i<nr-7 ? i+8 : nr) ;
550 for (
int j=i; j<nrmax; j++) {
551 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
554 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
555 if (i==0) dirac = 1 ;
557 for (
int i=0; i<nr-4; i++) {
558 int nrmax = (i<nr-7 ? i+8 : nr) ;
559 for (
int j=i; j<nrmax; j++) barre.set(i,j) = barre(i+1,j) - barre(i,j) ;
560 if (part) aux.set(i) = aux(i+1) - aux(i) ;
565 Matrice tilde(nr-1,nr-1) ;
566 tilde.set_etat_qcq() ;
567 for (
int i=0; i<nr-1; i++)
568 for (
int j=0; j<nr-1;j++)
569 tilde.set(i,j) = barre(i,j+1) + barre(i,j) ;
576 for (
int i=nr-3; i>=0; i--) {
577 for (
int j=((i>0) ? i-1 : 0); j<((i+5 > nr-1) ? nr-1 : i+5); j++)
578 tilde.set(i+1,j) = tilde(i,j) ;
579 if (part) aux.set(i+1) = aux(i) ;
581 tilde.set(0,0) = 0.5 ;
582 tilde.set(0,1) = 1. ;
583 tilde.set(0,2) = 1. ;
584 tilde.set(0,3) = 0. ;
586 if (part) aux.set(0) = 0 ;
589 tilde.set_band(2,2) ;
595 Tbl res0(tilde.inverse(aux)) ;
601 res.set(0) = res0(0) ;
602 res.set(nr-1) = res0(nr-2) ;
603 for (
int i=1; i<nr-1; i++) res.set(i) = res0(i-1) + res0(i);
613 Tbl _dal_inverse_r_chebi_o2d_s(
const Matrice &op,
const Tbl &source,
618 Matrice barre(nr-1,nr-1) ;
619 barre.set_etat_qcq() ;
620 for (
int i=0; i<nr-1; i++)
621 for (
int j=0; j<nr-1; j++)
622 barre.set(i,j) = op(i,j) ;
626 for (
int i=nr-4; i<nr-1; i++) aux.set(i) = source(i) ;
636 for (
int i=0; i<nr-4; i++) {
637 for (
int j=i; j<nr-1; j++) {
638 barre.set(i,j) = (op(i+1,j) - op(i,j))/(i+1) ;
640 if (part) aux.set(i) = (source(i+1) - source(i))/(i+1) ;
642 for (
int i=0; i<nr-5; i++) {
643 for (
int j=i; j<nr-1; j++) barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
644 if (part) aux.set(i) = aux(i+2) - aux(i) ;
646 if (fabs(barre(nr-6,nr-2)) >= 1.e-16) {
647 if (fabs(barre(nr-6,nr-2)) > fabs(barre(nr-3,nr-2))) {
648 double lambda = barre(nr-3,nr-2)/barre(nr-6,nr-2) ;
649 for (
int j=0; j<nr-1; j++) barre.set(nr-6,j) = barre(nr-6,j)*lambda
651 if (part) aux.set(nr-6) = aux(nr-6)*lambda - aux(nr-3) ;
654 double lambda = barre(nr-6,nr-2)/barre(nr-3,nr-2) ;
655 for (
int j=0; j<nr-1; j++) barre.set(nr-6,j) -= lambda*barre(nr-3,j) ;
656 if (part) aux.set(nr-6) -= lambda*aux(nr-3) ;
661 barre.set_band(3,0) ;
667 Tbl res0(barre.inverse(aux)) ;
670 for (
int i=0; i<nr-1; i++) res.set(i) = res0(i) ;
676 Tbl _dal_inverse_r_chebi_o2d_l(
const Matrice &op,
const Tbl &source,
681 int nr = op.get_dim(0) ;
685 for (
int i=0; i<nr-2; i++) aux.set(i) = source(i) ;
695 for (
int i=0; i<nr-4; i++) {
696 for (
int j=i; j<nr-1; j++) {
697 barre.set(i,j) = (op(i+1,j) - op(i,j))/(i+1) ;
699 if (part) aux.set(i) = (source(i+1) - source(i))/(i+1) ;
701 for (
int i=0; i<nr-5; i++) {
702 for (
int j=i; j<nr-1; j++) barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
703 if (part) aux.set(i) = aux(i+2) - aux(i) ;
705 if (fabs(barre(nr-6,nr-2)) >= 1.e-16) {
706 if (fabs(barre(nr-6,nr-2)) > fabs(barre(nr-3,nr-2))) {
707 double lambda = barre(nr-3,nr-2)/barre(nr-6,nr-2) ;
708 for (
int j=0; j<nr-1; j++) barre.set(nr-6,j) = barre(nr-6,j)*lambda
710 if (part) aux.set(nr-6) = aux(nr-6)*lambda - aux(nr-3) ;
713 double lambda = barre(nr-6,nr-2)/barre(nr-3,nr-2) ;
714 for (
int j=0; j<nr-1; j++) barre.set(nr-6,j) -= lambda*barre(nr-3,j) ;
715 aux.set(nr-6) -= lambda*aux(nr-3) ;
724 Matrice tilde(nr-1,nr-1) ;
725 tilde.set_etat_qcq() ;
726 for (
int i=nr-3; i>=0; i--) {
727 for (
int j=0; j<nr-1; j++)
728 tilde.set(i+1,j) = barre(i,j) ;
729 if (part) aux.set(i+1) = aux(i) ;
731 tilde.set(0,0) = 1. ;
732 tilde.set(0,1) = 1. ;
733 tilde.set(0,2) = 1. ;
734 tilde.set(0,3) = 0. ;
736 if (part) aux.set(0) = 0 ;
740 tilde.set_band(2,1) ;
746 Tbl res0(tilde.inverse(aux)) ;
749 for (
int i=0; i<nr-1; i++) res.set(i) = res0(i) ;
755 Tbl _dal_inverse_r_chebi_o2_s(
const Matrice &op,
const Tbl &source,
760 int nr = op.get_dim(0) ;
764 aux.set(nr-4) = source(nr-4) ;
774 for (
int i=0; i<nr-4; i++) {
775 for (
int j=i; j<nr; j++) {
776 barre.set(i,j) = (op(i+1,j) - op(i,j))/(i+1) ;
779 aux.set(i) = (source(i+1) - source(i))/(i+1) ;
781 for (
int i=0; i<nr-5; i++) {
782 for (
int j=i; j<nr; j++) barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
783 if (part) aux.set(i) = aux(i+2) - aux(i) ;
788 Matrice tilde(nr-2,nr-2) ;
789 tilde.set_etat_qcq() ;
790 for (
int i=0; i<nr-2; i++)
791 for (
int j=0; j<nr-2;j++)
792 tilde.set(i,j) = barre(i,j+1)*(2*j+1) + barre(i,j)*(2*j+3) ;
795 tilde.set_band(3,1) ;
801 Tbl res0(tilde.inverse(aux)) ;
807 res.set(0) = 3*res0(0) ;
808 for (
int i=1; i<nr-2; i++) res.set(i) = res0(i-1)*(2*i-1)
810 res.set(nr-2) = res0(nr-3)*(2*nr-5) ;
816 Tbl _dal_inverse_r_chebi_o2_l(
const Matrice &op,
const Tbl &source,
821 int nr = op.get_dim(0) ;
825 aux.set(nr-4) = source(nr-4) ;
835 for (
int i=0; i<nr-4; i++) {
836 for (
int j=i; j<nr; j++) {
837 barre.set(i,j) = (op(i+1,j) - op(i,j))/(i+1) ;
840 aux.set(i) = (source(i+1) - source(i))/(i+1) ;
842 for (
int i=0; i<nr-5; i++) {
843 for (
int j=i; j<nr; j++) barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
844 if (part) aux.set(i) = aux(i+2) - aux(i) ;
849 Matrice tilde(nr-2,nr-2) ;
850 tilde.set_etat_qcq() ;
851 for (
int i=0; i<nr-2; i++)
852 for (
int j=0; j<nr-2;j++)
853 tilde.set(i,j) = barre(i,j+1)*(2*j+1) + barre(i,j)*(2*j+3) ;
860 for (
int i=nr-4; i>=0; i--) {
861 for (
int j=((i>0) ? i-1 : 0); j<((i+5 > nr-2) ? nr-2 : i+5); j++)
862 tilde.set(i+1,j) = tilde(i,j) ;
863 if (part) aux.set(i+1) = aux(i) ;
865 tilde.set(0,0) = 1. ;
866 tilde.set(0,1) = 1. ;
867 tilde.set(0,2) = 1. ;
868 tilde.set(0,3) = 0. ;
870 if (part) aux.set(0) = 0 ;
874 tilde.set_band(2,2) ;
880 Tbl res0(tilde.inverse(aux)) ;
884 res.set(0) = 3*res0(0) ;
885 for (
int i=1; i<nr-2; i++) res.set(i) = res0(i-1)*(2*i-1)
887 res.set(nr-2) = res0(nr-3)*(2*nr-5) ;
893 Tbl _dal_inverse_r_jaco02(
const Matrice &op,
const Tbl &source,
898 int nr = op.get_dim(0) ;
902 aux.set(nr-2) = source(nr-2) ;
912 for (
int i=0; i<nr; i++) {
913 for (
int j=0; j<nr; j++) {
914 barre.set(i,j) = (op(i,j)) ;
917 aux.set(i) = (source(i));
919 for (
int i=0; i<nr; i++) {
920 for (
int j=0; j<nr; j++) barre.set(i,j) = barre(i,j) ;
921 if (part) aux.set(i) = aux(i) ;
926 Matrice tilde(nr,nr) ;
927 tilde.set_etat_qcq() ;
928 for (
int i=0; i<nr; i++)
929 for (
int j=0; j<nr;j++)
930 tilde.set(i,j) = barre(i,j) ;
936 Tbl res0(tilde.inverse(aux)) ;
940 for (
int i=0; i<nr; i++) res.set(i) = res0(i) ;
952 Tbl dal_inverse(
const int& base_r,
const int& type_dal,
const 953 Matrice& operateur,
const Tbl& source,
const bool part) {
956 static Tbl (*dal_inverse[
MAX_BASE][
MAX_DAL])(
const Matrice&,
const Tbl&,
963 for (
int i=0 ; i<
MAX_DAL ; i++) {
965 dal_inverse[i][j] = _dal_inverse_pas_prevu ;
974 _dal_inverse_r_cheb_o2d_s ;
976 _dal_inverse_r_cheb_o2d_l ;
978 _dal_inverse_r_cheb_o2_s ;
980 _dal_inverse_r_cheb_o2_l ;
987 _dal_inverse_r_chebp_o2d_s ;
989 _dal_inverse_r_chebp_o2d_l ;
991 _dal_inverse_r_chebp_o2_s ;
993 _dal_inverse_r_chebp_o2_l ;
999 _dal_inverse_r_chebi_o2d_s ;
1001 _dal_inverse_r_chebi_o2d_l ;
1003 _dal_inverse_r_chebi_o2_s ;
1005 _dal_inverse_r_chebi_o2_l ;
1008 _dal_inverse_r_jaco02 ;
1010 _dal_inverse_r_jaco02 ;
1012 _dal_inverse_r_jaco02 ;
1014 _dal_inverse_r_jaco02 ;
1017 return dal_inverse[type_dal][base_r](operateur, source, part) ;
#define MAX_DAL
Nombre max d'operateurs (pour l'instant)
#define O2DEGE_LARGE
Operateur du deuxieme ordre degenere .
#define O2NOND_LARGE
Operateur du deuxieme ordre non degenere .
#define R_JACO02
base de Jacobi(0,2) ordinaire (finjac)
#define O2NOND_SMALL
Operateur du deuxieme ordre non degenere .
#define TRA_R
Translation en R, used for a bitwise shift (in hex)
#define R_CHEBI
base de Cheb. impaire (rare) seulement
#define R_CHEBP
base de Cheb. paire (rare) seulement
int get_dim(int i) const
Gives the i-th dimension (ie dim.dim[i])
#define O2DEGE_SMALL
Operateur du deuxieme ordre degenere .
#define MAX_BASE
Nombre max. de bases differentes.
#define R_CHEB
base de Chebychev ordinaire (fin)