23char dal_inverse_C[] =
"$Header: /cvsroot/Lorene/C++/Source/Non_class_members/PDE/dal_inverse.C,v 1.9 2014/10/13 08:53:28 j_novak Exp $" ;
92Tbl _dal_inverse_pas_prevu (
const Matrice&,
const Tbl&,
const bool) {
93 cout <<
" Inversion du dalembertien pas prevue ..... : "<< endl ;
105Tbl _dal_inverse_r_cheb_o2d_s(
const Matrice &op,
const Tbl &source,
110 int nr = op.get_dim(0) ;
116 for (
int i=0; i<nr-4; i++) {
117 int nrmin = (i>1 ? i-1 : 0) ;
118 int nrmax = (i<nr-9 ? i+10 : nr) ;
119 for (
int j=nrmin; j<nrmax; j++)
120 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
122 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
123 if (i==0) dirac = 1 ;
125 for (
int i=0; i<nr-4; i++) {
126 int nrmin = (i>1 ? i-1 : 0) ;
127 int nrmax = (i<nr-9 ? i+10 : nr) ;
128 for (
int j=nrmin; j<nrmax; j++)
129 barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
130 if (part) aux.set(i) = aux(i+2) - aux(i) ;
134 barre.set_band(5,1) ;
141 return barre.inverse(aux) ;
144Tbl _dal_inverse_r_cheb_o2d_l(
const Matrice &op,
const Tbl &source,
149 int nr = op.get_dim(0) ;
155 for (
int i=0; i<nr-4; i++) {
156 int nrmin = (i>1 ? i-1 : 0) ;
157 int nrmax = (i<nr-9 ? i+10 : nr) ;
158 for (
int j=nrmin; j<nrmax; j++)
159 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
161 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
162 if (i==0) dirac = 1 ;
164 for (
int i=0; i<nr-4; i++) {
165 int nrmin = (i>1 ? i-1 : 0) ;
166 int nrmax = (i<nr-9 ? i+10 : nr) ;
167 for (
int j=nrmin; j<nrmax; j++)
168 barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
169 if (part) aux.set(i) = aux(i+2) - aux(i) ;
177 double temp1, temp2 ;
180 for (
int i=nr-3; i>=0; i--) {
181 int nrmin = (i>1 ? i-1 : 0) ;
182 int nrmax = (i<nr-9 ? i+10 : nr) ;
183 for (
int j=nrmin; j<nrmax; j++)
184 barre.set(i+2,j) = barre(i,j) ;
185 aux.set(i+2) = aux(i) ;
190 barre.set(0,0) = 0.5 ;
191 barre.set(0,1) = 1. ;
192 barre.set(0,2) = 1. ;
193 barre.set(0,3) = 1. ;
194 barre.set(0,4) = 0. ;
196 barre.set(1,0) = 0. ;
197 barre.set(1,1) = 0.5 ;
198 barre.set(1,2) = 1. ;
199 barre.set(1,3) = -1. ;
200 barre.set(1,4) = 1. ;
201 barre.set(1,5) = 0. ;
204 barre.set_band(3,3) ;
211 return barre.inverse(aux) ;
214Tbl _dal_inverse_r_cheb_o2_s(
const Matrice &op,
const Tbl &source,
219 int nr = op.get_dim(0) ;
225 for (
int i=0; i<nr-4; i++) {
226 int nrmin = (i>2 ? i-2 : 0) ;
227 int nrmax = (i<nr-10 ? i+11 : nr) ;
228 for (
int j=nrmin; j<nrmax; j++)
229 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
231 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
232 if (i==0) dirac = 1 ;
234 for (
int i=0; i<nr-4; i++) {
235 int nrmin = (i>2 ? i-2 : 0) ;
236 int nrmax = (i<nr-10 ? i+11 : nr) ;
237 for (
int j=nrmin; j<nrmax; j++)
238 barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
239 if (part) aux.set(i) = aux(i+2) - aux(i) ;
243 barre.set_band(6,2) ;
250 return barre.inverse(aux) ;
253Tbl _dal_inverse_r_cheb_o2_l(
const Matrice &op,
const Tbl &source,
258 int nr = op.get_dim(0) ;
264 for (
int i=0; i<nr-4; i++) {
265 int nrmin = (i>2 ? i-2 : 0) ;
266 int nrmax = (i<nr-10 ? i+11 : nr) ;
267 for (
int j=nrmin; j<nrmax; j++)
268 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
270 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
271 if (i==0) dirac = 1 ;
273 for (
int i=0; i<nr-4; i++) {
274 int nrmin = (i>2 ? i-2 : 0) ;
275 int nrmax = (i<nr-10 ? i+11 : nr) ;
276 for (
int j=nrmin; j<nrmax; j++)
277 barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
278 if (part) aux.set(i) = aux(i+2) - aux(i) ;
286 double temp1, temp2 ;
289 for (
int i=nr-3; i>=0; i--) {
290 int nrmin = (i>2 ? i-2 : 0) ;
291 int nrmax = (i<nr-10 ? i+11 : nr) ;
292 for (
int j=nrmin; j<nrmax; j++)
293 barre.set(i+2,j) = barre(i,j) ;
294 aux.set(i+2) = aux(i) ;
299 barre.set(0,0) = 0.5 ;
300 barre.set(0,1) = 1. ;
301 barre.set(0,2) = 1. ;
302 barre.set(0,3) = 1. ;
303 barre.set(0,4) = 1. ;
304 barre.set(0,5) = 0. ;
306 barre.set(1,0) = 0. ;
307 barre.set(1,1) = 0.5 ;
308 barre.set(1,2) = -1. ;
309 barre.set(1,3) = 1. ;
310 barre.set(1,4) = -1. ;
311 barre.set(1,5) = 1. ;
312 barre.set(1,6) = 0. ;
315 barre.set_band(4,4) ;
322 return barre.inverse(aux) ;
329Tbl _dal_inverse_r_chebp_o2d_s(
const Matrice &op,
const Tbl &source,
334 int nr = op.get_dim(0) ;
348 for (
int i=0; i<nr-4; i++) {
349 int nrmax = (i<nr-7 ? i+8 : nr) ;
350 for (
int j=i; j<nrmax; j++)
351 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
353 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
354 if (i==0) dirac = 1 ;
356 for (
int i=0; i<nr-4; i++) {
357 int nrmax = (i<nr-7 ? i+8 : nr) ;
358 for (
int j=i; j<nrmax; j++) barre.set(i,j) = barre(i+1,j) - barre(i,j) ;
359 if (part) aux.set(i) = aux(i+1) - aux(i) ;
361 if (fabs(barre(nr-5,nr-1)) >= 1.e-16) {
362 if (fabs(barre(nr-5,nr-1)) > fabs(barre(nr-2,nr-1))) {
363 double lambda = barre(nr-2,nr-1)/barre(nr-5,nr-1) ;
364 for (
int j=nr-5; j<nr; j++) barre.set(nr-5,j) = barre(nr-5,j)*lambda
366 if (part) aux.set(nr-5) = aux(nr-5)*lambda - aux(nr-2) ;
369 double lambda = barre(nr-5,nr-1)/barre(nr-2,nr-1) ;
370 for (
int j=nr-5; j<nr; j++) barre.set(nr-5,j) -= lambda*barre(nr-2,j) ;
371 if (part) aux.set(nr-5) -= lambda*aux(nr-2) ;
376 barre.set_band(3,0) ;
383 return barre.inverse(aux) ;
388Tbl _dal_inverse_r_chebp_o2d_l(
const Matrice &op,
const Tbl &source,
393 int nr = op.get_dim(0) ;
407 for (
int i=0; i<nr-4; i++) {
408 int nrmax = (i<nr-7 ? i+8 : nr) ;
409 for (
int j=i; j<nrmax; j++)
410 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
412 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
413 if (i==0) dirac = 1 ;
415 for (
int i=0; i<nr-4; i++) {
416 int nrmax = (i<nr-7 ? i+8 : nr) ;
417 for (
int j=i; j<nrmax; j++) barre.set(i,j) = barre(i+1,j) - barre(i,j) ;
418 if (part) aux.set(i) = aux(i+1) - aux(i) ;
420 if (fabs(barre(nr-5,nr-1)) >= 1.e-16) {
421 if (fabs(barre(nr-5,nr-1)) > fabs(barre(nr-2,nr-1))) {
422 double lambda = barre(nr-2,nr-1)/barre(nr-5,nr-1) ;
423 for (
int j=nr-5; j<nr; j++) barre.set(nr-5,j) = barre(nr-5,j)*lambda
425 if (part) aux.set(nr-5) = aux(nr-5)*lambda - aux(nr-2) ;
428 double lambda = barre(nr-5,nr-1)/barre(nr-2,nr-1) ;
429 for (
int j=nr-5; j<nr; j++) barre.set(nr-5,j) -= lambda*barre(nr-2,j) ;
430 if (part) aux.set(nr-5) -= lambda*aux(nr-2) ;
439 for (
int i=nr-2; i>=0; i--) {
440 for (
int j=i; j<((i+5 > nr) ? nr : i+5); j++)
441 barre.set(i+1,j) = barre(i,j) ;
442 if (part) aux.set(i+1) = aux(i) ;
444 barre.set(0,0) = 0.5 ;
445 barre.set(0,1) = 1. ;
446 barre.set(0,2) = 1. ;
447 barre.set(0,3) = 0. ;
449 if (part) aux.set(0) = 0 ;
452 barre.set_band(2,1) ;
459 return barre.inverse(aux);
464Tbl _dal_inverse_r_chebp_o2_s(
const Matrice &op,
const Tbl &source,
469 int nr = op.get_dim(0) ;
473 for (
int i=nr-4; i<nr-1; i++) aux.set(i) = source(i) ;
483 for (
int i=0; i<nr-4; i++) {
484 int nrmax = (i<nr-7 ? i+8 : nr) ;
485 for (
int j=i; j<nrmax; j++)
486 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
488 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
489 if (i==0) dirac = 1 ;
491 for (
int i=0; i<nr-4; i++) {
492 int nrmax = (i<nr-7 ? i+8 : nr) ;
493 for (
int j=i; j<nrmax; j++) barre.set(i,j) = barre(i+1,j) - barre(i,j) ;
494 if (part) aux.set(i) = aux(i+1) - aux(i) ;
499 Matrice tilde(nr-1,nr-1) ;
500 tilde.set_etat_qcq() ;
501 for (
int i=0; i<nr-1; i++)
502 for (
int j=0; j<nr-1;j++)
503 tilde.set(i,j) = barre(i,j+1) + barre(i,j) ;
506 tilde.set_band(3,1) ;
512 Tbl res0(tilde.inverse(aux)) ;
517 res.set(0) = res0(0) ;
518 res.set(nr-1) = res0(nr-2) ;
519 for (
int i=1; i<nr-1; i++) res.set(i) = res0(i-1) + res0(i);
526Tbl _dal_inverse_r_chebp_o2_l(
const Matrice &op,
const Tbl &source,
531 int nr = op.get_dim(0) ;
535 for (
int i=nr-4; i<nr-1; i++) aux.set(i) = source(i) ;
545 for (
int i=0; i<nr-4; i++) {
546 int nrmax = (i<nr-7 ? i+8 : nr) ;
547 for (
int j=i; j<nrmax; j++) {
548 barre.set(i,j) = (op(i+2,j) - dirac*op(i,j))/(i+1) ;
551 aux.set(i) = (source(i+2) - dirac*source(i))/(i+1) ;
552 if (i==0) dirac = 1 ;
554 for (
int i=0; i<nr-4; i++) {
555 int nrmax = (i<nr-7 ? i+8 : nr) ;
556 for (
int j=i; j<nrmax; j++) barre.set(i,j) = barre(i+1,j) - barre(i,j) ;
557 if (part) aux.set(i) = aux(i+1) - aux(i) ;
562 Matrice tilde(nr-1,nr-1) ;
563 tilde.set_etat_qcq() ;
564 for (
int i=0; i<nr-1; i++)
565 for (
int j=0; j<nr-1;j++)
566 tilde.set(i,j) = barre(i,j+1) + barre(i,j) ;
573 for (
int i=nr-3; i>=0; i--) {
574 for (
int j=((i>0) ? i-1 : 0); j<((i+5 > nr-1) ? nr-1 : i+5); j++)
575 tilde.set(i+1,j) = tilde(i,j) ;
576 if (part) aux.set(i+1) = aux(i) ;
578 tilde.set(0,0) = 0.5 ;
579 tilde.set(0,1) = 1. ;
580 tilde.set(0,2) = 1. ;
581 tilde.set(0,3) = 0. ;
583 if (part) aux.set(0) = 0 ;
586 tilde.set_band(2,2) ;
592 Tbl res0(tilde.inverse(aux)) ;
598 res.set(0) = res0(0) ;
599 res.set(nr-1) = res0(nr-2) ;
600 for (
int i=1; i<nr-1; i++) res.set(i) = res0(i-1) + res0(i);
610Tbl _dal_inverse_r_chebi_o2d_s(
const Matrice &op,
const Tbl &source,
615 Matrice barre(nr-1,nr-1) ;
616 barre.set_etat_qcq() ;
617 for (
int i=0; i<nr-1; i++)
618 for (
int j=0; j<nr-1; j++)
619 barre.set(i,j) = op(i,j) ;
623 for (
int i=nr-4; i<nr-1; i++) aux.set(i) = source(i) ;
633 for (
int i=0; i<nr-4; i++) {
634 for (
int j=i; j<nr-1; j++) {
635 barre.set(i,j) = (op(i+1,j) - op(i,j))/(i+1) ;
637 if (part) aux.set(i) = (source(i+1) - source(i))/(i+1) ;
639 for (
int i=0; i<nr-5; i++) {
640 for (
int j=i; j<nr-1; j++) barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
641 if (part) aux.set(i) = aux(i+2) - aux(i) ;
643 if (fabs(barre(nr-6,nr-2)) >= 1.e-16) {
644 if (fabs(barre(nr-6,nr-2)) > fabs(barre(nr-3,nr-2))) {
645 double lambda = barre(nr-3,nr-2)/barre(nr-6,nr-2) ;
646 for (
int j=0; j<nr-1; j++) barre.set(nr-6,j) = barre(nr-6,j)*lambda
648 if (part) aux.set(nr-6) = aux(nr-6)*lambda - aux(nr-3) ;
651 double lambda = barre(nr-6,nr-2)/barre(nr-3,nr-2) ;
652 for (
int j=0; j<nr-1; j++) barre.set(nr-6,j) -= lambda*barre(nr-3,j) ;
653 if (part) aux.set(nr-6) -= lambda*aux(nr-3) ;
658 barre.set_band(3,0) ;
664 Tbl res0(barre.inverse(aux)) ;
667 for (
int i=0; i<nr-1; i++) res.set(i) = res0(i) ;
673Tbl _dal_inverse_r_chebi_o2d_l(
const Matrice &op,
const Tbl &source,
678 int nr = op.get_dim(0) ;
682 for (
int i=0; i<nr-2; i++) aux.set(i) = source(i) ;
692 for (
int i=0; i<nr-4; i++) {
693 for (
int j=i; j<nr-1; j++) {
694 barre.set(i,j) = (op(i+1,j) - op(i,j))/(i+1) ;
696 if (part) aux.set(i) = (source(i+1) - source(i))/(i+1) ;
698 for (
int i=0; i<nr-5; i++) {
699 for (
int j=i; j<nr-1; j++) barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
700 if (part) aux.set(i) = aux(i+2) - aux(i) ;
702 if (fabs(barre(nr-6,nr-2)) >= 1.e-16) {
703 if (fabs(barre(nr-6,nr-2)) > fabs(barre(nr-3,nr-2))) {
704 double lambda = barre(nr-3,nr-2)/barre(nr-6,nr-2) ;
705 for (
int j=0; j<nr-1; j++) barre.set(nr-6,j) = barre(nr-6,j)*lambda
707 if (part) aux.set(nr-6) = aux(nr-6)*lambda - aux(nr-3) ;
710 double lambda = barre(nr-6,nr-2)/barre(nr-3,nr-2) ;
711 for (
int j=0; j<nr-1; j++) barre.set(nr-6,j) -= lambda*barre(nr-3,j) ;
712 aux.set(nr-6) -= lambda*aux(nr-3) ;
721 Matrice tilde(nr-1,nr-1) ;
722 tilde.set_etat_qcq() ;
723 for (
int i=nr-3; i>=0; i--) {
724 for (
int j=0; j<nr-1; j++)
725 tilde.set(i+1,j) = barre(i,j) ;
726 if (part) aux.set(i+1) = aux(i) ;
728 tilde.set(0,0) = 1. ;
729 tilde.set(0,1) = 1. ;
730 tilde.set(0,2) = 1. ;
731 tilde.set(0,3) = 0. ;
733 if (part) aux.set(0) = 0 ;
737 tilde.set_band(2,1) ;
743 Tbl res0(tilde.inverse(aux)) ;
746 for (
int i=0; i<nr-1; i++) res.set(i) = res0(i) ;
752Tbl _dal_inverse_r_chebi_o2_s(
const Matrice &op,
const Tbl &source,
757 int nr = op.get_dim(0) ;
761 aux.set(nr-4) = source(nr-4) ;
771 for (
int i=0; i<nr-4; i++) {
772 for (
int j=i; j<nr; j++) {
773 barre.set(i,j) = (op(i+1,j) - op(i,j))/(i+1) ;
776 aux.set(i) = (source(i+1) - source(i))/(i+1) ;
778 for (
int i=0; i<nr-5; i++) {
779 for (
int j=i; j<nr; j++) barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
780 if (part) aux.set(i) = aux(i+2) - aux(i) ;
785 Matrice tilde(nr-2,nr-2) ;
786 tilde.set_etat_qcq() ;
787 for (
int i=0; i<nr-2; i++)
788 for (
int j=0; j<nr-2;j++)
789 tilde.set(i,j) = barre(i,j+1)*(2*j+1) + barre(i,j)*(2*j+3) ;
792 tilde.set_band(3,1) ;
798 Tbl res0(tilde.inverse(aux)) ;
804 res.set(0) = 3*res0(0) ;
805 for (
int i=1; i<nr-2; i++) res.set(i) = res0(i-1)*(2*i-1)
807 res.set(nr-2) = res0(nr-3)*(2*nr-5) ;
813Tbl _dal_inverse_r_chebi_o2_l(
const Matrice &op,
const Tbl &source,
818 int nr = op.get_dim(0) ;
822 aux.set(nr-4) = source(nr-4) ;
832 for (
int i=0; i<nr-4; i++) {
833 for (
int j=i; j<nr; j++) {
834 barre.set(i,j) = (op(i+1,j) - op(i,j))/(i+1) ;
837 aux.set(i) = (source(i+1) - source(i))/(i+1) ;
839 for (
int i=0; i<nr-5; i++) {
840 for (
int j=i; j<nr; j++) barre.set(i,j) = barre(i+2,j) - barre(i,j) ;
841 if (part) aux.set(i) = aux(i+2) - aux(i) ;
846 Matrice tilde(nr-2,nr-2) ;
847 tilde.set_etat_qcq() ;
848 for (
int i=0; i<nr-2; i++)
849 for (
int j=0; j<nr-2;j++)
850 tilde.set(i,j) = barre(i,j+1)*(2*j+1) + barre(i,j)*(2*j+3) ;
857 for (
int i=nr-4; i>=0; i--) {
858 for (
int j=((i>0) ? i-1 : 0); j<((i+5 > nr-2) ? nr-2 : i+5); j++)
859 tilde.set(i+1,j) = tilde(i,j) ;
860 if (part) aux.set(i+1) = aux(i) ;
862 tilde.set(0,0) = 1. ;
863 tilde.set(0,1) = 1. ;
864 tilde.set(0,2) = 1. ;
865 tilde.set(0,3) = 0. ;
867 if (part) aux.set(0) = 0 ;
871 tilde.set_band(2,2) ;
877 Tbl res0(tilde.inverse(aux)) ;
881 res.set(0) = 3*res0(0) ;
882 for (
int i=1; i<nr-2; i++) res.set(i) = res0(i-1)*(2*i-1)
884 res.set(nr-2) = res0(nr-3)*(2*nr-5) ;
890Tbl _dal_inverse_r_jaco02(
const Matrice &op,
const Tbl &source,
895 int nr = op.get_dim(0) ;
899 aux.set(nr-2) = source(nr-2) ;
909 for (
int i=0; i<nr; i++) {
910 for (
int j=0; j<nr; j++) {
911 barre.set(i,j) = (op(i,j)) ;
914 aux.set(i) = (source(i));
916 for (
int i=0; i<nr; i++) {
917 for (
int j=0; j<nr; j++) barre.set(i,j) = barre(i,j) ;
918 if (part) aux.set(i) = aux(i) ;
923 Matrice tilde(nr,nr) ;
924 tilde.set_etat_qcq() ;
925 for (
int i=0; i<nr; i++)
926 for (
int j=0; j<nr;j++)
927 tilde.set(i,j) = barre(i,j) ;
933 Tbl res0(tilde.inverse(aux)) ;
937 for (
int i=0; i<nr; i++) res.set(i) = res0(i) ;
949Tbl dal_inverse(
const int& base_r,
const int& type_dal,
const
950 Matrice& operateur,
const Tbl& source,
const bool part) {
953 static Tbl (*dal_inverse[
MAX_BASE][
MAX_DAL])(
const Matrice&,
const Tbl&,
960 for (
int i=0 ; i<
MAX_DAL ; i++) {
962 dal_inverse[i][j] = _dal_inverse_pas_prevu ;
971 _dal_inverse_r_cheb_o2d_s ;
973 _dal_inverse_r_cheb_o2d_l ;
975 _dal_inverse_r_cheb_o2_s ;
977 _dal_inverse_r_cheb_o2_l ;
984 _dal_inverse_r_chebp_o2d_s ;
986 _dal_inverse_r_chebp_o2d_l ;
988 _dal_inverse_r_chebp_o2_s ;
990 _dal_inverse_r_chebp_o2_l ;
996 _dal_inverse_r_chebi_o2d_s ;
998 _dal_inverse_r_chebi_o2d_l ;
1000 _dal_inverse_r_chebi_o2_s ;
1002 _dal_inverse_r_chebi_o2_l ;
1005 _dal_inverse_r_jaco02 ;
1007 _dal_inverse_r_jaco02 ;
1009 _dal_inverse_r_jaco02 ;
1011 _dal_inverse_r_jaco02 ;
1014 return dal_inverse[type_dal][base_r](operateur, source, part) ;
int get_dim(int i) const
Gives the i-th dimension (ie dim.dim[i])
#define MAX_BASE
Nombre max. de bases differentes.
#define R_JACO02
base de Jacobi(0,2) ordinaire (finjac)
#define MAX_DAL
Nombre max d'operateurs (pour l'instant)
#define O2DEGE_SMALL
Operateur du deuxieme ordre degenere .
#define R_CHEBI
base de Cheb. impaire (rare) seulement
#define O2NOND_LARGE
Operateur du deuxieme ordre non degenere .
#define O2DEGE_LARGE
Operateur du deuxieme ordre degenere .
#define O2NOND_SMALL
Operateur du deuxieme ordre non degenere .
#define TRA_R
Translation en R, used for a bitwise shift (in hex)
#define R_CHEB
base de Chebychev ordinaire (fin)
#define R_CHEBP
base de Cheb. paire (rare) seulement