16#include <Assembleur_P_VEFPreP1B.h>
17#include <Matrice_Bloc_Sym.h>
20#include <Dirichlet_homogene.h>
21#include <Periodique.h>
22#include <Neumann_sortie_libre.h>
24#include <EcrFicCollecteBin.h>
25#include <TRUSTLists.h>
26#include <Navier_Stokes_std.h>
27#include <Op_Div_VEFP1B_Elem.h>
28#include <Op_Grad_VEF_P1B_Face.h>
29#include <Milieu_base.h>
31#include <communications.h>
33static int face_associee=-1;
35static ArrOfDouble gradi(3);
36static ArrOfDouble gradj(3);
38projette(ArrOfDouble& grad,
int face,
const DoubleTab& normales)
42 for(comp=0; comp<dimension; comp++)
44 psc+=grad[comp]*normales(face,comp);
45 norm+=normales(face,comp)*normales(face,comp);
48 if (std::fabs(norm)>=DMINFLOAT) psc/=norm;
49 for(comp=0; comp<dimension; comp++)
51 grad[comp]-=psc*normales(face,comp);
68static inline int okface(
int& ind_face,
int& face,
const Cond_lim& la_cl)
94 else if (sub_type(
Symetrie, la_cl.valeur()))
100 while ( ( (ok==0) || ((ok==2)&&(face_associee<face)) ) && (++ind_face<nb_faces_bord_tot) );
101 if (ind_face==nb_faces_bord_tot) ok=-1;
120 DoubleTab tab(pression);
121 DoubleTab resu(tab), resu2(tab);
124 exemple_champ_non_homogene(domaine_VEF, tab);
136 const DoubleTab& inverse_quantitee_entrelacee)
140 Cerr <<
"Assembleur_P_VEFPreP1B::verifier n'est pas prevu pour verifier votre discretisation." << finl;
155 ko=verifier_complet(ass, matrice, domaine_VEF);
156 DoubleTab pre(pression);
157 DoubleTab resu(pre), resu2(pre), erreur(pre);
159 const Domaine& domaine=domaine_VEF.
domaine();
161 int nb_elem_tot=domaine.nb_elem_tot();
162 int nb_som=domaine.nb_som();
163 int nb_som_tot=domaine.nb_som_tot();
164 int nb_aretes=domaine.nb_aretes();
168 int n = pre.dimension_tot(0);
170 envoyer_broadcast(n, proc);
172 for(
int i=0; i<n; i++)
178 if (0<=i && i<nb_elem)
180 Cerr <<
"On verifie l'element reel " << i <<
" du processeur " << proc;
183 else if (nb_elem_tot<=i && i<nb_elem_tot+nb_som)
185 int sommet=i-nb_elem_tot;
186 Cerr <<
"On verifie le sommet reel ";
187 if (domaine.get_renum_som_perio(sommet)!=sommet) Cerr <<
"periodique ";
188 Cerr << i-nb_elem_tot <<
" du processeur " << proc;
191 else if (nb_elem_tot+nb_som_tot<=i && i<nb_elem_tot+nb_som_tot+nb_aretes && ok_arete[i-nb_elem_tot-nb_som_tot])
193 int arete=i-nb_elem_tot-nb_som_tot;
195 if (renum_arete_perio[arete]==arete)
197 Cerr <<
"On verifie l'arete reelle non superflue et non periodique " << arete <<
" du processeur " << proc;
204 double verifie=mp_max_vect(pre);
208 pre.echange_espace_virtuel();
219 int nbf=inverse_quantitee_entrelacee.
size();
221 for (
int face=0; face<nbf; face++)
222 for(
int k=0; k<d; k++)
223 gradP(face,k)*=inverse_quantitee_entrelacee(face,k);
234 if (est_egal(2*resu(i),resu2(i))) erreur(i)=0;
236 double erreur_carre = local_carre_norme_vect(erreur);
237 double resu2_carre = local_carre_norme_vect(resu2);
238 double resu_carre = local_carre_norme_vect(resu);
240 double erreur_absolue = sqrt(erreur_carre);
241 double erreur_relative = erreur_absolue / (sqrt(resu2_carre) + sqrt(resu_carre) + DMINFLOAT);
242 double app=mp_prodscal(resu,pre);
243 if(erreur_absolue>1.e-12 && erreur_relative>1.e-6)
245 Cerr <<
"[" <<
Process::me() <<
"] KO a la ligne " << i <<
" pour le proc " << proc <<
" (AP,P)= " << app <<
" erreur= " << erreur_absolue << finl;
255 Cerr <<
"[" <<
Process::me() <<
"] invqtentrelacee = ";
256 inverse_quantitee_entrelacee.
ecrit(Cerr);
260 Cerr <<
"[" <<
Process::me() <<
"] OK a la ligne " << i <<
" pour le proc " << proc <<
" (AP,P)= " << app <<
" erreur= " << erreur_absolue << finl;
267 Cerr <<
"[" <<
Process::me() <<
"] Matrice en pression:" << finl;
269 Cerr <<
"Echec de la methode verifier de l'assembleur. Voir les KO." << finl;
278static inline void sort( ArrOfInt& sommets, ArrOfInt& faces_op1, ArrOfInt& faces_op2)
281 if(sommets[sz-1]==-1) sz--;
285 if(sommets[i]>sommets[j])
288 sommets[i]=sommets[j];
291 faces_op1[i]=faces_op1[j];
294 faces_op2[i]=faces_op2[j];
298static inline int chercher_arete(
const Domaine_VEF& domaine_VEF,
299 int elem,
int somi,
int somj,
300 const IntTab& elem_aretes,
301 const IntTab& aretes_som)
304 const Domaine& dom=domaine_VEF.
domaine();
311 for(
int i_arete=0; i_arete<6; i_arete++)
313 int arete=elem_aretes(elem, i_arete);
320 return renum_arete_perio[arete];
323 return renum_arete_perio[arete];
327static inline void swap (
int& i,
int& j)
341static inline void remplir_sommets(
const Domaine_VEF& domaine_VEF,
342 int face,
int elem1,
int elem2,
350 const IntTab& elem_faces = domaine_VEF.
elem_faces();
351 const Domaine& dom=domaine_VEF.
domaine();
357 for(
int i=0; i<dplusun; i++)
358 if( (elem_faces(elem1,i)==face) ||
359 (elem_faces(elem1,i)==face_associee) )
372 faces_op1[k]=elem_faces(elem1, i);
376 Cerr <<
"The discretization used has a P1 component" << finl;
377 Cerr <<
"which is not available to deal your mesh." << finl;
378 Cerr <<
"The mesh with this discretization must contain only ";
385 Cerr <<
"pas prevu ... " << finl;
391 for(
int i=0; i<dplusun; i++)
392 if( (elem_faces(elem2,i)==face)||
393 (elem_faces(elem2,i)==face_associee) )
396 faces_op2[dplusun]=face;
397 faces_op1[dplusun]=-1;
405 faces_op2[k]=elem_faces(elem2, i);
412 faces_op2[dplusun]=-1;
413 faces_op1[dplusun]=-1;
420static void calculer_grad(
const IntTab& face_voisins,
421 int elem1,
int elem2,
422 const ArrOfDouble& coef_som,
423 int s,
int fop1,
int fop2,
424 const DoubleTab& normales,
431 if(elem1!=face_voisins(fop1,0))
433 signe*=coef_som[elem1];
434 for(
int comp=0; comp<dimension; comp++)
435 grad[comp]=signe*normales(fop1,comp);
439 if((elem2!=-1)&&(fop2!=-1))
442 if(elem2!=face_voisins(fop2,0))
444 signe*=coef_som[elem2];
445 for(
int comp=0; comp<dimension; comp++)
446 grad[comp]+=signe*normales(fop2,comp);
453static void calculer_grad_arete(
int face,
454 const IntTab& face_voisins,
456 int elem1,
int elem2,
459 const DoubleTab& normales,
462 assert(face_voisins(face,0)==elem1);
463 int signe1=1,signe2=1,signe3=1,signe4=1;
464 if((!(fop1==-1) && !(face_voisins(fop1,0)==elem1)))
466 if(!(fop3==-1) && !(face_voisins(fop3,0)==elem1))
470 if((!(fop2==-1) && !(face_voisins(fop2,0)==elem2)))
472 if(!(fop4==-1) && !( face_voisins(fop4,0)==elem2))
479 for(
int comp=0; comp<3; comp++)
480 grad[comp]=-2./15.*(signe1*normales(fop1,comp)
481 +signe2*normales(fop2,comp)
482 +signe3*normales(fop3,comp)
483 +signe4*normales(fop4,comp));
487 for(
int comp=0; comp<3; comp++)
488 grad[comp]=-2./15.*(signe1*normales(fop1,comp)
489 +signe3*normales(fop3,comp)
490 +normales(face,comp));
496 for(
int comp=0; comp<3; comp++)
497 grad[comp]=1./15.*(signe1*normales(fop1,comp)
498 +signe3*normales(fop3,comp));
503 for(
int comp=0; comp<3; comp++)
504 grad[comp]=1./15.*(signe2*normales(fop2,comp)
505 +signe4*normales(fop4,comp));
509static double dotproduct_array_fois_inverse_quantitee_entrelacee(
const ArrOfDouble& grad1,
const ArrOfDouble& grad2,
const DoubleTab& inverse_quantitee_entrelacee,
int face )
512 int size=inverse_quantitee_entrelacee.
dimension(1);
513 for (
int i=0; i<size; i++) dot+=grad1[i]*grad2[i]*inverse_quantitee_entrelacee(face,i);
518static void contribuer_matriceP0P1(
int elem1,
int elem2,
const ArrOfInt& sommets,
519 IntLists& voisins, DoubleLists& coeffs)
522 dplusdeux=dimension+2;
524 for(
int i=0; i<dplusdeux; i++)
528 int rang1=voisins[elem1].rang(si);
531 voisins[elem1].add(si);
532 coeffs[elem1].add(0);
536 int rang2=voisins[elem2].rang(si);
539 voisins[elem2].add(si);
540 coeffs[elem2].add(0);
557static void update_matriceP0P1(
const Domaine_VEF& domaine_VEF,
558 const DoubleTab& inverse_quantitee_entrelacee,
559 int face,
int elem1,
int elem2,
560 ArrOfInt& sommets, ArrOfInt& faces_op1,
561 ArrOfInt& faces_op2,
const ArrOfDouble& coef_som,
566 const IntTab& face_voisins = domaine_VEF.
face_voisins();
567 assert(elem1==face_voisins(face, 0));
568 assert(elem2==face_voisins(face, 1));
571 dplusdeux=dimension+2;
575 int nb_elem=domaine_VEF.
nb_elem();
576 int nb_som=domaine_VEF.
nb_som();
577 for(
int i=0; i<dplusdeux; i++)
581 calculer_grad(face_voisins, elem1, elem2, coef_som,si, faces_op1[i],
582 faces_op2[i], normales, gradi);
583 for(
int k=0; k<dimension; k++)
584 gradj[k]=normales(face,k);
585 psc=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradj,
586 inverse_quantitee_entrelacee,face);
587 range(elem1,nb_elem,si,nb_som,ARR,ARV,AVR,AVV,psc);
589 range(elem2,nb_elem,si,nb_som,ARR,ARV,AVR,AVV,-psc);
593static void contribuer_matriceP1P1(
int elem1,
int elem2,
const ArrOfInt& sommets, IntLists& voisins, DoubleLists& coeffs)
597 dplusdeux=dimension+2;
601 while (sommets[dplusdeux-1]==-1)
604 for(
int i=0; i<dplusdeux; i++)
607 for(
int j=i+1; j<dplusdeux; j++)
610 int rang=voisins[si].rang(sj);
623static void update_matriceP1P1(
const Domaine_VEF& domaine_VEF,
624 const DoubleTab& inverse_quantitee_entrelacee,
625 int face,
int elem1,
int elem2,
626 ArrOfInt& sommets, ArrOfInt& faces_op1,
627 ArrOfInt& faces_op2,
const ArrOfDouble& coef_som,
632 const IntTab& face_voisins = domaine_VEF.
face_voisins();
635 dplusdeux=dimension+2;
639 int nb_som_tot=domaine_VEF.
nb_som();
644 while (sommets[dplusdeux-1]==-1)
647 for(i=0; i<dplusdeux; i++)
650 calculer_grad(face_voisins, elem1, elem2, coef_som,si, faces_op1[i],
651 faces_op2[i], normales, gradi);
653 ARR(si,si)+=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradi,
654 inverse_quantitee_entrelacee,face);
655 for(j=i+1; j<dplusdeux; j++)
658 calculer_grad(face_voisins, elem1, elem2,coef_som, sj, faces_op1[j],
659 faces_op2[j], normales, gradj);
660 psc=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradj,inverse_quantitee_entrelacee,face);
666 ARV(si,sj-nb_som_tot)+=psc;
667 else if(sj<nb_som_tot)
668 AVR(si-nb_som_tot,sj)+=psc;
670 AVV(si-nb_som_tot,sj-nb_som_tot)+=psc;
675static void contribuer_matricePaPa(
const Domaine_VEF& domaine_VEF,
676 int elem1,
int elem2,
677 const ArrOfInt& sommets, IntLists& voisins, DoubleLists& coeffs)
684 if(elem2==-1) jmax=4;
685 for(
int i=0; i<3; i++)
688 for(
int j=i+1; j<jmax; j++)
693 arete1 = chercher_arete(domaine_VEF,elem1, si, sj,
694 elem_aretes, aretes_som);
696 arete1 = chercher_arete(domaine_VEF,elem2, si, sj,
697 elem_aretes, aretes_som);
702 for(
int k=i; k<3; k++)
705 for(
int l=jj+1; l<jmax; l++)
710 arete2 = chercher_arete(domaine_VEF,elem1, sl, sk,
714 arete2 = chercher_arete(domaine_VEF,elem2, sl, sk,
721 if(arete1>arete2) swap(arete1, arete2);
722 int rang=voisins[arete1].rang(arete2);
725 voisins[arete1].add(arete2);
726 coeffs[arete1].add(0);
738static void update_matricePaPa(
const Domaine_VEF& domaine_VEF,
739 const DoubleTab& inverse_quantitee_entrelacee,
740 int face,
int elem1,
int elem2,
741 ArrOfInt& sommets, ArrOfInt& faces_op1,
762 if(elem2==-1) jmax=4;
766 for(j=i+1; j<jmax; j++)
771 arete1 = chercher_arete(domaine_VEF,elem1, si, sj,
772 elem_aretes, aretes_som);
774 arete1 = chercher_arete(domaine_VEF,elem2, si, sj,
775 elem_aretes, aretes_som);
779 calculer_grad_arete(face, face_voisins, i, j,
781 faces_op1[i], faces_op2[i],
782 faces_op1[j], faces_op2[j],
784 if(arete1<nb_aretes_tot)
785 ARR(arete1,arete1)+=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradi,
786 inverse_quantitee_entrelacee,face);
791 for(l=jj+1; l<jmax; l++)
796 arete2 = chercher_arete(domaine_VEF,elem1, sl, sk,
800 arete2 = chercher_arete(domaine_VEF,elem2, sl, sk,
806 calculer_grad_arete(face, face_voisins, k, l,
808 faces_op1[k], faces_op2[k],
809 faces_op1[l], faces_op2[l],
811 psc=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradj,
812 inverse_quantitee_entrelacee,face);
814 if(arete1>arete2) swap(arete1, arete2);
815 if(arete1<nb_aretes_tot)
816 if(arete2<nb_aretes_tot)
817 ARR(arete1,arete2)+=psc;
819 ARV(arete1,arete2-nb_aretes_tot)+=psc;
820 else if(arete2<nb_aretes_tot)
821 AVR(arete1-nb_aretes_tot,arete2)+=psc;
823 AVV(arete1-nb_aretes_tot,arete2-nb_aretes_tot)+=psc;
834contribuer_matrice_NeumannP0P1(
int elem,
const ArrOfInt& sommets, IntLists& voisins, DoubleLists& coeffs)
839 for(
int i=0; i<dplusun; i++)
842 int rang1=voisins[elem].rang(si);
845 voisins[elem].add(si);
852update_matrice_NeumannP0P1(
const Domaine_VEF& domaine_VEF,
853 const DoubleTab& inverse_quantitee_entrelacee,
855 ArrOfInt& sommets, ArrOfInt& faces_op1,
const ArrOfDouble& coef_som,
860 const IntTab& face_voisins = domaine_VEF.
face_voisins();
862 int nb_elem_tot=domaine_VEF.
nb_elem();
863 int nb_som_tot=domaine_VEF.
nb_som();
872 for(
int i=0; i<dplusun; i++)
875 calculer_grad(face_voisins, elem, -1, coef_som,si, faces_op1[i],
876 -1, normales, gradi);
877 if(faces_op1[i]!=face)
878 for (
int comp=0; comp<dimension; comp++)
879 gradi[comp]+= normales(face,comp)*unsurdim;
880 for(
int k=0; k<dimension; k++)
881 gradj[k]=normales(face,k);
882 psc=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradj,
883 inverse_quantitee_entrelacee,face);
888 ARV(elem,si-nb_som_tot)+=psc;
889 else if(si<nb_som_tot)
890 AVR(elem-nb_elem_tot,si)+=psc;
892 AVV(elem-nb_elem_tot,si-nb_som_tot)+=psc;
897contribuer_matrice_NeumannP1P1(
int elem,
const ArrOfInt& sommets, IntLists& voisins, DoubleLists& coeffs)
902 for(
int i=0; i<dplusun; i++)
905 for(
int j=i+1; j<dplusun; j++)
908 int rang=voisins[si].rang(sj);
920update_matrice_NeumannP1P1(
const Domaine_VEF& domaine_VEF,
921 const DoubleTab& inverse_quantitee_entrelacee,
923 ArrOfInt& sommets, ArrOfInt& faces_op1,
const ArrOfDouble& coef_som,
928 const IntTab& face_voisins = domaine_VEF.
face_voisins();
938 int nb_som_tot=domaine_VEF.
nb_som();
940 for(i=0; i<dplusun; i++)
943 calculer_grad(face_voisins, elem, -1, coef_som,si, faces_op1[i],
944 -1, normales, gradi);
945 if(faces_op1[i]!=face)
946 for (
int comp=0; comp<dimension; comp++)
947 gradi[comp]+= normales(face,comp)*unsurdim;
949 ARR(si,si)+=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradi,
950 inverse_quantitee_entrelacee,face);
951 for(j=i+1; j<dplusun; j++)
954 calculer_grad(face_voisins, elem, -1, coef_som,sj, faces_op1[j],
955 -1, normales, gradj);
956 if(faces_op1[j]!=face)
957 for (
int comp=0; comp<dimension; comp++)
958 gradj[comp]+= normales(face,comp)*unsurdim;
959 psc=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradj,inverse_quantitee_entrelacee,face);
964 ARV(si,sj-nb_som_tot)+=psc;
965 else if(sj<nb_som_tot)
966 AVR(si-nb_som_tot,sj)+=psc;
968 AVV(si-nb_som_tot,sj-nb_som_tot)+=psc;
974contribuer_matrice_SymetrieP1P1(
int elem,
const ArrOfInt& sommets, IntLists& voisins, DoubleLists& coeffs)
978 for(
int i=0; i<dplusun; i++)
981 for(
int j=i+1; j<dplusun; j++)
984 int rang=voisins[si].rang(sj);
996update_matrice_SymetrieP1P1(
const Domaine_VEF& domaine_VEF,
997 const DoubleTab& inverse_quantitee_entrelacee,
999 ArrOfInt& sommets, ArrOfInt& faces_op1,
const ArrOfDouble& coef_som,
1004 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1007 dplusun=dimension+1;
1013 int nb_som_tot=domaine_VEF.
nb_som();
1015 for(i=0; i<dplusun; i++)
1018 calculer_grad(face_voisins, elem, -1, coef_som, si, faces_op1[i],
1019 -1, normales, gradi);
1020 projette(gradi, face, normales);
1022 ARR(si,si)+=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradi,
1023 inverse_quantitee_entrelacee,face);
1024 for(j=i+1; j<dplusun; j++)
1027 calculer_grad(face_voisins, elem, -1, coef_som,sj, faces_op1[j],
1028 -1, normales, gradj);
1029 projette(gradj, face, normales);
1030 psc=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradj,
1031 inverse_quantitee_entrelacee,face);
1036 ARV(si,sj-nb_som_tot)+=psc;
1037 else if(sj<nb_som_tot)
1038 AVR(si-nb_som_tot,sj)+=psc;
1040 AVV(si-nb_som_tot,sj-nb_som_tot)+=psc;
1046contribuer_matrice_NeumannPaPa(
const Domaine_VEF& domaine_VEF,
int elem,
const ArrOfInt& sommets, IntLists& voisins, DoubleLists& coeffs)
1052 for(
int i=0; i<3; i++)
1055 for(
int j=i+1; j<4; j++)
1059 arete1 = chercher_arete(domaine_VEF,elem, si, sj,
1060 elem_aretes, aretes_som);
1061 if(ok_arete[arete1])
1064 for(
int k=i; k<3; k++)
1067 for(
int l=jj+1; l<4; l++)
1070 int arete2= chercher_arete(domaine_VEF,elem, sl, sk,
1074 if(ok_arete[arete2])
1077 if(arete1>arete2) swap(arete1, arete2);
1078 int rang=voisins[arete1].rang(arete2);
1081 voisins[arete1].add(arete2);
1082 coeffs[arete1].add(0);
1096update_matrice_NeumannPaPa(
const Domaine_VEF& domaine_VEF,
1097 const DoubleTab& inverse_quantitee_entrelacee,
1099 ArrOfInt& sommets, ArrOfInt& faces_op1,
1117 for(j=i+1; j<4; j++)
1121 arete1 = chercher_arete(domaine_VEF,elem, si, sj,
1122 elem_aretes, aretes_som);
1123 if(ok_arete[arete1])
1125 calculer_grad_arete(face, face_voisins, i, j,
1130 if(arete1<nb_aretes_tot)
1131 ARR(arete1,arete1)+=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradi,
1132 inverse_quantitee_entrelacee,face);
1137 for(l=jj+1; l<4; l++)
1140 int arete2= chercher_arete(domaine_VEF,elem, sl, sk,
1144 if(ok_arete[arete2])
1146 calculer_grad_arete(face, face_voisins, k, l,
1151 psc=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradj,
1152 inverse_quantitee_entrelacee,face);
1154 if(arete1>arete2) swap(arete1, arete2);
1155 if(arete1<nb_aretes_tot)
1156 if(arete2<nb_aretes_tot)
1157 ARR(arete1,arete2)+=psc;
1159 ARV(arete1,arete2-nb_aretes_tot)+=psc;
1160 else if(arete2<nb_aretes_tot)
1161 AVR(arete1-nb_aretes_tot,arete2)+=psc;
1163 AVV(arete1-nb_aretes_tot,arete2-nb_aretes_tot)+=psc;
1175contribuer_matrice_SymetriePaPa(
const Domaine_VEF& domaine_VEF,
int elem,
const ArrOfInt& sommets, IntLists& voisins, DoubleLists& coeffs)
1180 for(
int i=0; i<3; i++)
1183 for(
int j=i+1; j<4; j++)
1187 arete1 = chercher_arete(domaine_VEF,elem, si, sj,
1188 elem_aretes, aretes_som);
1189 if(ok_arete[arete1])
1192 for(
int k=i; k<3; k++)
1195 for(
int l=jj+1; l<4; l++)
1198 int arete2= chercher_arete(domaine_VEF,elem, sl, sk,
1202 if(ok_arete[arete2])
1205 if(arete1>arete2) swap(arete1, arete2);
1206 int rang=voisins[arete1].rang(arete2);
1209 voisins[arete1].add(arete2);
1210 coeffs[arete1].add(0);
1224update_matrice_SymetriePaPa(
const Domaine_VEF& domaine_VEF,
1225 const DoubleTab& inverse_quantitee_entrelacee,
1227 ArrOfInt& sommets, ArrOfInt& faces_op1,
1245 for(j=i+1; j<4; j++)
1249 arete1 = chercher_arete(domaine_VEF,elem, si, sj,
1250 elem_aretes, aretes_som);
1251 if(ok_arete[arete1])
1253 calculer_grad_arete(face, face_voisins, i, j,
1258 projette(gradi, face, normales);
1259 if(arete1<nb_aretes_tot)
1260 ARR(arete1,arete1)+=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradi,
1261 inverse_quantitee_entrelacee,face);
1266 for(l=jj+1; l<4; l++)
1269 int arete2= chercher_arete(domaine_VEF,elem, sl, sk,
1273 if(ok_arete[arete2])
1275 calculer_grad_arete(face, face_voisins, k, l,
1280 projette(gradj, face, normales);
1281 psc=dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradj,
1282 inverse_quantitee_entrelacee,face);
1284 if(arete1>arete2) swap(arete1, arete2);
1285 if(arete1<nb_aretes_tot)
1286 if(arete2<nb_aretes_tot)
1287 ARR(arete1,arete2)+=psc;
1289 ARV(arete1,arete2-nb_aretes_tot)+=psc;
1290 else if(arete2<nb_aretes_tot)
1291 AVR(arete1-nb_aretes_tot,arete2)+=psc;
1293 AVV(arete1-nb_aretes_tot,arete2-nb_aretes_tot)+=psc;
1304static void contribuer_matriceP0Pa(
const Domaine_VEF& domaine_VEF,
int elem1,
int elem2,
1305 const ArrOfInt& sommets,
1307 DoubleLists& coeffs)
1314 if(elem2==-1) jmax=4;
1315 for(
int i=0; i<3; i++)
1318 for(
int j=i+1; j<jmax; j++)
1323 arete1 = chercher_arete(domaine_VEF,elem1, si, sj,
1324 elem_aretes, aretes_som);
1326 arete1 = chercher_arete(domaine_VEF,elem2, si, sj,
1327 elem_aretes, aretes_som);
1328 if(ok_arete[arete1])
1330 int rang=voisins[elem1].rang(arete1);
1333 voisins[elem1].add(arete1);
1334 coeffs[elem1].add(0);
1338 int rangbis=voisins[elem2].rang(arete1);
1341 voisins[elem2].add(arete1);
1342 coeffs[elem2].add(0);
1350static void update_matriceP0Pa(
const Domaine_VEF& domaine_VEF,
1351 const DoubleTab& inverse_quantitee_entrelacee,
1352 int face,
int elem1,
int elem2,
1354 ArrOfInt& faces_op1,
1355 ArrOfInt& faces_op2,
1372 if(elem2==-1) jmax=4;
1376 for(j=i+1; j<jmax; j++)
1381 arete1 = chercher_arete(domaine_VEF,elem1, si, sj,
1382 elem_aretes, aretes_som);
1384 arete1 = chercher_arete(domaine_VEF,elem2, si, sj,
1385 elem_aretes, aretes_som);
1386 if(ok_arete[arete1])
1388 calculer_grad_arete(face, face_voisins, i, j,
1390 faces_op1[i], faces_op2[i],
1391 faces_op1[j], faces_op2[j],
1394 for(
int comp=0; comp<3; comp++)
1395 psc+=gradi[comp]*normales(face, comp)
1396 *(-inverse_quantitee_entrelacee(face,comp));
1397 if(elem1<nb_elem_tot)
1398 if(arete1<nb_aretes_tot)
1399 ARR(elem1,arete1)+=psc;
1401 ARV(elem1,arete1-nb_aretes_tot)+=psc;
1402 else if(arete1<nb_aretes_tot)
1403 AVR(elem1-nb_elem_tot,arete1)+=psc;
1405 AVV(elem1-nb_elem_tot,arete1-nb_aretes_tot)+=psc;
1410 if(elem2<nb_elem_tot)
1411 if(arete1<nb_aretes_tot)
1412 ARR(elem2,arete1)+=psc;
1414 ARV(elem2,arete1-nb_aretes_tot)+=psc;
1415 else if(arete1<nb_aretes_tot)
1416 AVR(elem2-nb_elem_tot,arete1)+=psc;
1418 AVV(elem2-nb_elem_tot,arete1-nb_aretes_tot)+=psc;
1426contribuer_matrice_NeumannP0Pa(
const Domaine_VEF& domaine_VEF,
int elem,
1427 const ArrOfInt& sommets,
1429 DoubleLists& coeffs)
1435 for(
int i=0; i<3; i++)
1438 for(
int j=i+1; j<4; j++)
1442 arete1 = chercher_arete(domaine_VEF,elem, si, sj,
1443 elem_aretes, aretes_som);
1444 if(ok_arete[arete1])
1446 int rang=voisins[elem].rang(arete1);
1449 voisins[elem].add(arete1);
1450 coeffs[elem].add(0);
1458update_matrice_NeumannP0Pa(
const Domaine_VEF& domaine_VEF,
1459 const DoubleTab& inverse_quantitee_entrelacee,
1462 ArrOfInt& faces_op1,
1481 for(j=i+1; j<4; j++)
1485 arete1 = chercher_arete(domaine_VEF,elem, si, sj,
1486 elem_aretes, aretes_som);
1487 if(ok_arete[arete1])
1489 calculer_grad_arete(face, face_voisins, i, j,
1495 for(
int comp=0; comp<3; comp++)
1496 psc+=gradi[comp]*normales(face, comp)
1497 *(-inverse_quantitee_entrelacee(face,comp));
1498 if(elem<nb_elem_tot)
1499 if(arete1<nb_aretes_tot)
1500 ARR(elem,arete1)+=psc;
1502 ARV(elem,arete1-nb_aretes_tot)+=psc;
1503 else if(arete1<nb_aretes_tot)
1504 AVR(elem-nb_elem_tot,arete1)+=psc;
1506 AVV(elem-nb_elem_tot,arete1-nb_aretes_tot)+=psc;
1512static void contribuer_matriceP1Pa(
const Domaine_VEF& domaine_VEF,
int elem1,
int elem2,
1513 const ArrOfInt& sommets,
1515 DoubleLists& coeffs)
1522 if(elem2==-1) jmax=4;
1523 for(
int i=0; i<3; i++)
1526 for(
int j=i+1; j<jmax; j++)
1531 arete1 = chercher_arete(domaine_VEF,elem1, si, sj,
1532 elem_aretes, aretes_som);
1534 arete1 = chercher_arete(domaine_VEF,elem2, si, sj,
1535 elem_aretes, aretes_som);
1536 if(ok_arete[arete1])
1538 for(
int k=0; k<jmax; k++)
1541 int rang1=voisins[sk].rang(arete1);
1544 voisins[sk].add(arete1);
1553static void update_matriceP1Pa(
const Domaine_VEF& domaine_VEF,
1554 const DoubleTab& inverse_quantitee_entrelacee,
1555 int face,
int elem1,
int elem2,
1557 ArrOfInt& faces_op1,
1558 ArrOfInt& faces_op2,
const ArrOfDouble& coef_som,
1578 if(elem2==-1) jmax=4;
1582 for(j=i+1; j<jmax; j++)
1587 arete1 = chercher_arete(domaine_VEF,elem1, si, sj,
1588 elem_aretes, aretes_som);
1590 arete1 = chercher_arete(domaine_VEF,elem2, si, sj,
1591 elem_aretes, aretes_som);
1592 if(ok_arete[arete1])
1594 calculer_grad_arete(face, face_voisins, i, j,
1596 faces_op1[i], faces_op2[i],
1597 faces_op1[j], faces_op2[j],
1599 for(k=0; k<jmax; k++)
1602 calculer_grad(face_voisins, elem1, elem2, coef_som, sk,
1603 faces_op1[k], faces_op2[k],
1605 psc=-dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradj,
1606 inverse_quantitee_entrelacee,face);
1608 if(arete1<nb_aretes_tot)
1609 ARR(sk,arete1)+=psc;
1611 ARV(sk,arete1-nb_aretes_tot)+=psc;
1612 else if(arete1<nb_aretes_tot)
1613 AVR(sk-nb_som_tot,arete1)+=psc;
1615 AVV(sk-nb_som_tot,arete1-nb_aretes_tot)+=psc;
1623contribuer_matrice_NeumannP1Pa(
const Domaine_VEF& domaine_VEF,
int elem,
1624 const ArrOfInt& sommets,
1626 DoubleLists& coeffs)
1632 for(
int i=0; i<3; i++)
1635 for(
int j=i+1; j<4; j++)
1639 arete1 = chercher_arete(domaine_VEF,elem, si, sj,
1640 elem_aretes, aretes_som);
1641 if(ok_arete[arete1])
1643 for(
int k=0; k<4; k++)
1646 int rang1=voisins[sk].rang(arete1);
1649 voisins[sk].add(arete1);
1660update_matrice_NeumannP1Pa(
const Domaine_VEF& domaine_VEF,
1661 const DoubleTab& inverse_quantitee_entrelacee,
1664 ArrOfInt& faces_op1,
const ArrOfDouble& coef_som,
1687 for(j=i+1; j<4; j++)
1691 arete1 = chercher_arete(domaine_VEF,elem, si, sj,
1692 elem_aretes, aretes_som);
1693 if(ok_arete[arete1])
1695 calculer_grad_arete(face, face_voisins, i, j,
1703 calculer_grad(face_voisins, elem, -1, coef_som,sk,
1706 if(faces_op1[k]!=face)
1707 for (
int comp=0; comp<dimension; comp++)
1708 gradj[comp]+= normales(face,comp)*unsurdim;
1709 psc=-dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradj,
1710 inverse_quantitee_entrelacee,face);
1712 if(arete1<nb_aretes_tot)
1713 ARR(sk,arete1)+=psc;
1715 ARV(sk,arete1-nb_aretes_tot)+=psc;
1716 else if(arete1<nb_aretes_tot)
1717 AVR(sk-nb_som_tot,arete1)+=psc;
1719 AVV(sk-nb_som_tot,arete1-nb_aretes_tot)+=psc;
1727contribuer_matrice_SymetrieP1Pa(
const Domaine_VEF& domaine_VEF,
int elem,
1728 const ArrOfInt& sommets,
1730 DoubleLists& coeffs)
1736 for(
int i=0; i<3; i++)
1739 for(
int j=i+1; j<4; j++)
1743 arete1 = chercher_arete(domaine_VEF,elem, si, sj,
1744 elem_aretes, aretes_som);
1745 if(ok_arete[arete1])
1747 for(
int k=0; k<4; k++)
1750 int rang1=voisins[sk].rang(arete1);
1753 voisins[sk].add(arete1);
1763update_matrice_SymetrieP1Pa(
const Domaine_VEF& domaine_VEF,
1764 const DoubleTab& inverse_quantitee_entrelacee,
1767 ArrOfInt& faces_op1,
const ArrOfDouble& coef_som,
1789 for(j=i+1; j<4; j++)
1793 arete1 = chercher_arete(domaine_VEF,elem, si, sj,
1794 elem_aretes, aretes_som);
1795 if(ok_arete[arete1])
1797 calculer_grad_arete(face, face_voisins, i, j,
1802 projette(gradi, face, normales);
1806 calculer_grad(face_voisins, elem, -1, coef_som,sk,
1809 projette(gradj, face, normales);
1810 psc=-dotproduct_array_fois_inverse_quantitee_entrelacee(gradi,gradj,
1811 inverse_quantitee_entrelacee,face);
1813 if(arete1<nb_aretes_tot)
1814 ARR(sk,arete1)+=psc;
1816 ARV(sk,arete1-nb_aretes_tot)+=psc;
1817 else if(arete1<nb_aretes_tot)
1818 AVR(sk-nb_som_tot,arete1)+=psc;
1820 AVV(sk-nb_som_tot,arete1-nb_aretes_tot)+=psc;
1831 const DoubleTab& inverse_quantitee_entrelacee)
1836 Assembleur_P0.
remplir(matrice,inverse_quantitee_entrelacee);
1837 Cerr <<
"Assemblage P0 OK" << finl;
1844 const DoubleTab& inverse_quantitee_entrelacee)
1849 Assembleur_P0.
remplir(matrice,inverse_quantitee_entrelacee);
1850 Cerr <<
"Update P0 OK" << finl;
1855 Matrice& matrice,
const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som)
1859 const Domaine& domaine=domaine_VEF.
domaine();
1862 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1866 int elem1, elem2, face, ok;
1867 IntLists voisins(nb_som);
1868 DoubleLists coeffs(nb_som);
1869 ArrOfInt sommets(dimension+2);
1870 ArrOfInt face_opp1(dimension+2);
1871 ArrOfInt face_opp2(dimension+2);
1873 for(
int i=0; i<les_cl.size(); i++)
1878 for(
int ind_face=0; ind_face<nb_faces_bord_tot; ind_face++)
1880 ok=okface(ind_face, face, la_cl);
1882 elem1=face_voisins(face, 0);
1883 elem2=face_voisins(face, 1);
1884 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets,
1885 face_opp1, face_opp2);
1886 sort(sommets, face_opp1, face_opp2);
1889 contribuer_matrice_NeumannP1P1(elem1, sommets, voisins, coeffs);
1893 contribuer_matrice_SymetrieP1P1(elem1, sommets, voisins, coeffs);
1896 contribuer_matriceP1P1(elem1, elem2, sommets, voisins, coeffs);
1900 for(face=nint; face<nb_faces; face++)
1902 elem1=face_voisins(face, 0);
1903 elem2=face_voisins(face, 1);
1906 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets, face_opp1, face_opp2);
1907 sort(sommets, face_opp1, face_opp2);
1908 contribuer_matriceP1P1(elem1, elem2, sommets, voisins, coeffs);
1911 DoubleVect diag(nb_som);
1913 matrice.typer(
"Matrice_Bloc");
1915 matrice_bloc.
remplir(voisins, coeffs, diag, domaine.nb_som(), domaine.nb_som_tot());
1916 Cerr <<
"Assemblage P1 OK" << finl;
1923 const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som)
1929 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1932 int elem1, elem2, face, ok;
1933 ArrOfInt sommets(dimension+2);
1934 ArrOfInt face_opp1(dimension+2);
1935 ArrOfInt face_opp2(dimension+2);
1942 for (
auto &itr : les_cl)
1947 for (
int ind_face = 0; ind_face < nb_faces_bord_tot; ind_face++)
1949 ok = okface(ind_face, face, la_cl);
1952 elem1 = face_voisins(face, 0);
1953 elem2 = face_voisins(face, 1);
1954 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets, face_opp1, face_opp2);
1955 sort(sommets, face_opp1, face_opp2);
1957 update_matrice_NeumannP1P1(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, sommets, face_opp1, coef_som, ARR, ARV, AVR, AVV);
1959 update_matrice_SymetrieP1P1(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, sommets, face_opp1, coef_som, ARR, ARV, AVR, AVV);
1961 update_matriceP1P1(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, elem2, sommets, face_opp1, face_opp2, coef_som, ARR, ARV, AVR, AVV);
1965 for (face = nint; face < nb_faces; face++)
1967 elem1 = face_voisins(face, 0);
1968 elem2 = face_voisins(face, 1);
1971 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets, face_opp1, face_opp2);
1972 sort(sommets, face_opp1, face_opp2);
1973 update_matriceP1P1(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, elem2, sommets, face_opp1, face_opp2, coef_som, ARR, ARV, AVR, AVV);
1977 for(
int i=0; i<nb_som; i++)
1983 Cerr <<
"Update P1 OK" << finl;
1990 const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som)
2006 assert(ref_cast(
Domaine_VEF, z).get_cl_pression_sommet_faible()==0);
2007 int nb_som_tot=z.
nb_som();
2008 for(
auto& itr : les_cl)
2018 for(
int ind_face=0; ind_face<nb_faces_bord; ind_face++)
2020 int face=le_bord.
num_face(ind_face);
2021 for(
int som=0; som<nbsf; som++)
2024 int som_glob=faces(face,som);
2025 if (som_glob<nb_som_tot)
2026 ARR(som_glob,som_glob)=1e12;
2032 Cerr <<
"Modifie P1P1 Neumann OK" << finl;
2038 const DoubleTab& inverse_quantitee_entrelacee)
2042 const Domaine& domaine=domaine_VEF.
domaine();
2045 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2048 int nb_arete = domaine.nb_aretes_tot();
2049 int elem1, elem2, face, ok;
2050 IntLists voisins(nb_arete);
2051 DoubleLists coeffs(nb_arete);
2052 ArrOfInt sommets(dimension+2);
2053 ArrOfInt face_opp1(dimension+2);
2054 ArrOfInt face_opp2(dimension+2);
2056 for(
int i=0; i<les_cl.size(); i++)
2061 for(
int ind_face=0; ind_face<nb_faces_bord_tot; ind_face++)
2063 ok=okface(ind_face, face, la_cl);
2065 elem1=face_voisins(face, 0);
2066 elem2=face_voisins(face, 1);
2067 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets,
2068 face_opp1, face_opp2);
2071 contribuer_matrice_NeumannPaPa(domaine_VEF, elem1, sommets, voisins, coeffs);
2075 contribuer_matrice_SymetriePaPa(domaine_VEF, elem1, sommets, voisins, coeffs);
2078 contribuer_matricePaPa(domaine_VEF, elem1, elem2, sommets, voisins, coeffs);
2082 for(face=nint; face<nb_faces; face++)
2084 elem1=face_voisins(face, 0);
2085 elem2=face_voisins(face, 1);
2088 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets, face_opp1, face_opp2);
2089 contribuer_matricePaPa(domaine_VEF, elem1, elem2, sommets, voisins, coeffs);
2093 DoubleVect diag(nb_arete);
2095 matrice.typer(
"Matrice_Bloc");
2097 matrice_bloc.
remplir(voisins, coeffs, diag, domaine.nb_aretes(), domaine.nb_aretes_tot());
2098 Cerr <<
"Assemblage Pa OK" << finl;
2104 const DoubleTab& inverse_quantitee_entrelacee)
2108 const Domaine& domaine=domaine_VEF.
domaine();
2111 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2114 int nb_arete = domaine.nb_aretes();
2115 int elem1, elem2, face, ok;
2116 ArrOfInt sommets(dimension+2);
2117 ArrOfInt face_opp1(dimension+2);
2118 ArrOfInt face_opp2(dimension+2);
2125 for (
auto &itr : les_cl)
2130 for (
int ind_face = 0; ind_face < nb_faces_bord_tot; ind_face++)
2132 ok = okface(ind_face, face, la_cl);
2135 elem1 = face_voisins(face, 0);
2136 elem2 = face_voisins(face, 1);
2137 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets, face_opp1, face_opp2);
2139 update_matrice_NeumannPaPa(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, sommets, face_opp1, ARR, ARV, AVR, AVV);
2141 update_matrice_SymetriePaPa(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, sommets, face_opp1, ARR, ARV, AVR, AVV);
2143 update_matricePaPa(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, elem2, sommets, face_opp1, face_opp2, ARR, ARV, AVR, AVV);
2147 for (face = nint; face < nb_faces; face++)
2149 elem1 = face_voisins(face, 0);
2150 elem2 = face_voisins(face, 1);
2153 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets, face_opp1, face_opp2);
2154 update_matricePaPa(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, elem2, sommets, face_opp1, face_opp2, ARR, ARV, AVR, AVV);
2157 for(
int i=0; i<nb_arete; i++)
2165 Cerr <<
"Update Pa OK" << finl;
2171 const DoubleTab& inverse_quantitee_entrelacee)
2175 const Domaine& domaine=domaine_VEF.
domaine();
2178 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2181 int nb_elem = domaine.nb_elem_tot();
2182 int elem1, elem2, face, ok;
2183 IntLists voisins(nb_elem);
2184 DoubleLists coeffs(nb_elem);
2185 ArrOfInt sommets(dimension+2);
2186 ArrOfInt face_opp1(dimension+2);
2187 ArrOfInt face_opp2(dimension+2);
2189 for(
int i=0; i<les_cl.size(); i++)
2194 for(
int ind_face=0; ind_face<nb_faces_bord_tot; ind_face++)
2196 ok=okface(ind_face, face, la_cl);
2198 elem1=face_voisins(face, 0);
2199 elem2=face_voisins(face, 1);
2200 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets,
2201 face_opp1, face_opp2);
2204 contribuer_matrice_NeumannP0Pa(domaine_VEF, elem1, sommets, voisins, coeffs);
2211 contribuer_matriceP0Pa(domaine_VEF, elem1, elem2, sommets, voisins, coeffs);
2215 for(face=nint; face<nb_faces; face++)
2217 elem1=face_voisins(face, 0);
2218 elem2=face_voisins(face, 1);
2221 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets,
2222 face_opp1, face_opp2);
2223 contribuer_matriceP0Pa(domaine_VEF, elem1, elem2, sommets, voisins, coeffs);
2226 matrice.typer(
"Matrice_Bloc");
2228 matrice_bloc.
remplir(voisins, coeffs, domaine.nb_elem(), domaine.nb_elem_tot(), domaine.nb_aretes(), domaine.nb_aretes_tot());
2229 Cerr <<
"Assemblage P0Pa OK" << finl;
2235 const DoubleTab& inverse_quantitee_entrelacee)
2241 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2244 int elem1, elem2, face, ok;
2245 ArrOfInt sommets(dimension+2);
2246 ArrOfInt face_opp1(dimension+2);
2247 ArrOfInt face_opp2(dimension+2);
2254 for (
auto &itr : les_cl)
2259 for (
int ind_face = 0; ind_face < nb_faces_bord_tot; ind_face++)
2261 ok = okface(ind_face, face, la_cl);
2264 elem1 = face_voisins(face, 0);
2265 elem2 = face_voisins(face, 1);
2266 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets, face_opp1, face_opp2);
2268 update_matrice_NeumannP0Pa(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, sommets, face_opp1, ARR, ARV, AVR, AVV);
2269 else if (ok == 4) { }
2271 update_matriceP0Pa(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, elem2, sommets, face_opp1, face_opp2, ARR, ARV, AVR, AVV);
2275 for (face = nint; face < nb_faces; face++)
2277 elem1 = face_voisins(face, 0);
2278 elem2 = face_voisins(face, 1);
2281 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets, face_opp1, face_opp2);
2282 update_matriceP0Pa(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, elem2, sommets, face_opp1, face_opp2, ARR, ARV, AVR, AVV);
2285 Cerr <<
"Update P0Pa OK" << finl;
2291 const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som)
2295 const Domaine& domaine=domaine_VEF.
domaine();
2298 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2301 int elem1, elem2, face, ok;
2302 int nb_som = domaine.nb_som_tot();
2303 IntLists voisins(nb_som);
2304 DoubleLists coeffs(nb_som);
2305 ArrOfInt sommets(dimension+2);
2306 ArrOfInt face_opp1(dimension+2);
2307 ArrOfInt face_opp2(dimension+2);
2309 for(
int i=0; i<les_cl.size(); i++)
2314 for(
int ind_face=0; ind_face<nb_faces_bord_tot; ind_face++)
2316 ok=okface(ind_face, face, la_cl);
2318 elem1=face_voisins(face, 0);
2319 elem2=face_voisins(face, 1);
2320 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets,
2321 face_opp1, face_opp2);
2324 contribuer_matrice_NeumannP1Pa(domaine_VEF, elem1, sommets, voisins, coeffs);
2328 contribuer_matrice_SymetrieP1Pa(domaine_VEF, elem1, sommets, voisins, coeffs);
2331 contribuer_matriceP1Pa(domaine_VEF, elem1, elem2, sommets, voisins, coeffs);
2335 for(face=nint; face<nb_faces; face++)
2337 elem1=face_voisins(face, 0);
2338 elem2=face_voisins(face, 1);
2341 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets,
2342 face_opp1, face_opp2);
2343 contribuer_matriceP1Pa(domaine_VEF, elem1, elem2, sommets, voisins, coeffs);
2347 matrice.typer(
"Matrice_Bloc");
2349 matrice_bloc.
remplir(voisins, coeffs, domaine.nb_som(), domaine.nb_som_tot(), domaine.nb_aretes(), domaine.nb_aretes_tot());
2350 Cerr <<
"Assemblage P1Pa OK" << finl;
2356 const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som)
2363 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2366 int elem1, elem2, face, ok;
2370 ArrOfInt sommets(dimension+2);
2371 ArrOfInt face_opp1(dimension+2);
2372 ArrOfInt face_opp2(dimension+2);
2379 for (
auto &itr : les_cl)
2384 for (
int ind_face = 0; ind_face < nb_faces_bord_tot; ind_face++)
2386 ok = okface(ind_face, face, la_cl);
2389 elem1 = face_voisins(face, 0);
2390 elem2 = face_voisins(face, 1);
2391 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets, face_opp1, face_opp2);
2393 update_matrice_NeumannP1Pa(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, sommets, face_opp1, coef_som, ARR, ARV, AVR, AVV);
2395 update_matrice_SymetrieP1Pa(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, sommets, face_opp1, coef_som, ARR, ARV, AVR, AVV);
2397 update_matriceP1Pa(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, elem2, sommets, face_opp1, face_opp2, coef_som, ARR, ARV, AVR, AVV);
2401 for (face = nint; face < nb_faces; face++)
2403 elem1 = face_voisins(face, 0);
2404 elem2 = face_voisins(face, 1);
2407 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets, face_opp1, face_opp2);
2408 update_matriceP1Pa(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, elem2, sommets, face_opp1, face_opp2, coef_som, ARR, ARV, AVR, AVV);
2412 Cerr <<
"Update P1Pa OK" << finl;
2418 const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som)
2422 const Domaine& domaine=domaine_VEF.
domaine();
2425 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2428 int nb_elem = domaine.nb_elem_tot();
2429 int elem1, elem2, face, ok;
2430 IntLists voisins(nb_elem);
2431 DoubleLists coeffs(nb_elem);
2432 ArrOfInt sommets(dimension+2);
2433 ArrOfInt face_opp1(dimension+2);
2434 ArrOfInt face_opp2(dimension+2);
2436 for(
int i=0; i<les_cl.size(); i++)
2441 for(
int ind_face=0; ind_face<nb_faces_bord_tot; ind_face++)
2443 ok=okface(ind_face, face, la_cl);
2445 elem1=face_voisins(face, 0);
2446 elem2=face_voisins(face, 1);
2447 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets, face_opp1, face_opp2);
2448 sort(sommets, face_opp1, face_opp2);
2451 contribuer_matrice_NeumannP0P1(elem1, sommets, voisins, coeffs);
2458 contribuer_matriceP0P1(elem1, elem2, sommets, voisins, coeffs);
2462 for(face=nint; face<nb_faces; face++)
2464 elem1=face_voisins(face, 0);
2465 elem2=face_voisins(face, 1);
2468 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets, face_opp1, face_opp2);
2469 sort(sommets, face_opp1, face_opp2);
2470 contribuer_matriceP0P1(elem1, elem2, sommets, voisins, coeffs);
2474 matrice.typer(
"Matrice_Bloc");
2476 matrice_bloc.
remplir(voisins, coeffs, domaine.nb_elem(), domaine.nb_elem_tot(), domaine.nb_som(), domaine.nb_som_tot());
2477 Cerr <<
"Assemblage POP1 OK" << finl;
2483 const DoubleTab& inverse_quantitee_entrelacee,
const ArrOfDouble& coef_som)
2489 const IntTab& face_voisins = domaine_VEF.
face_voisins();
2492 int elem1, elem2, face, ok;
2493 ArrOfInt sommets(dimension+2);
2494 ArrOfInt face_opp1(dimension+2);
2495 ArrOfInt face_opp2(dimension+2);
2502 for (
auto &itr : les_cl)
2507 for (
int ind_face = 0; ind_face < nb_faces_bord_tot; ind_face++)
2509 ok = okface(ind_face, face, la_cl);
2512 elem1 = face_voisins(face, 0);
2513 elem2 = face_voisins(face, 1);
2514 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets, face_opp1, face_opp2);
2515 sort(sommets, face_opp1, face_opp2);
2517 update_matrice_NeumannP0P1(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, sommets, face_opp1, coef_som, ARR, ARV, AVR, AVV);
2518 else if (ok == 4) { }
2520 update_matriceP0P1(domaine_VEF, inverse_quantitee_entrelacee, face, elem1, elem2, sommets, face_opp1, face_opp2, coef_som, ARR, ARV, AVR, AVV);
2524 for(face=nint; face<nb_faces; face++)
2526 elem1=face_voisins(face, 0);
2527 elem2=face_voisins(face, 1);
2530 remplir_sommets(domaine_VEF, face, elem1, elem2, sommets,
2531 face_opp1, face_opp2);
2532 sort(sommets, face_opp1, face_opp2);
2533 update_matriceP0P1(domaine_VEF,
2534 inverse_quantitee_entrelacee,
2535 face, elem1, elem2, sommets,
2536 face_opp1, face_opp2, coef_som,
2540 Cerr <<
"Update POP1 OK" << finl;
const Equation_base & equation() const
int remplir(Matrice &, const DoubleTab &)
void associer_domaine_cl_dis_base(const Domaine_Cl_dis_base &) override
void associer_domaine_dis_base(const Domaine_dis_base &) override
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
Classe Dirichlet_homogene Cette classe est la classe de base de la hierarchie des conditions aux limi...
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
const IntTab_t & aretes_som() const
renvoie le tableau de connectivite aretes/sommets.
int_t get_renum_som_perio(int_t i) const
int_t nb_aretes() const
Renvoie le nombre d'aretes reelles.
int_t elem_aretes(int_t i, int j) const
renvoie le numero de la jeme arete du ieme element.
int_t nb_som_tot() const
Renvoie le nombre total de sommets du domaine i.e. le nombre de sommets reels et virtuels sur le proc...
int_t nb_som() const
Renvoie le nombre de sommets du domaine.
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
const IntVect & get_ok_arete() const
const ArrOfInt & get_renum_arete_perio() const
int nb_faces_tot() const
renvoie le nombre total de faces.
virtual double face_normales(int face, int comp) const
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
int est_une_face_virt_bord(int) const
renvoie 1 si face est une face virtuelle de bord, 0 sinon
int elem_faces(int i, int j) const
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
int premiere_face_int() const
une face est interne ssi elle separe deux elements.
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
int num_face(const int) const
virtual DoubleVect & multvect(const DoubleVect &, DoubleVect &) const
Multiplication d'un vecteur par la matrice.
Sortie & imprimer_formatte(Sortie &s) const override
virtual const Matrice & get_bloc(int i, int j) const
void remplir(const IntLists &voisins, const DoubleLists &valeurs, const DoubleVect &terme_diag, const int i, const int n)
Classe Matrice_Morse_Sym Represente une matrice M (creuse) symetrique stockee au format Morse.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
Classe Matrice Classe generique de la hierarchie des matrices.
classe Navier_Stokes_std Cette classe porte les termes de l'equation de la dynamique
const Champ_Inc_base & inconnue() const override
Renvoie la vitesse (champ inconnue de l'equation) (version const).
Operateur_Div & operateur_divergence()
Renvoie l'operateur de calcul de la divergence associe a l'equation.
Operateur_Grad & operateur_gradient()
Renvoie l'operateur de calcul du gradient associe a l'equation.
Champ_Inc_base & pression()
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
class Op_Grad_VEF_P1B_Face
classe Operateur_Div Classe generique de la hierarchie des operateurs calculant la divergence
Classe Operateur_Grad Classe generique de la hierarchie des operateurs calculant le gradient.
virtual DoubleTab & calculer(const DoubleTab &, DoubleTab &) const
classe Periodique Cette classe represente une condition aux limites periodique.
int face_associee(int i) const
static void mp_sum_for_each(T &arg1, T &arg2)
C++14 compatible mp_sum_for_each: combine multiple mp_sum calls into one collective operation Usage: ...
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static int me()
renvoie mon rang dans le groupe de communication courant.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
classe Solveur_Masse_base Represente la matrice de masse d'une equation.
virtual DoubleTab & appliquer(DoubleTab &) const
renvoie appliquer_impl(x/coeffient_temporelle) si on a un coefficient temporel sinon renvoie applique...
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
_SIZE_ size_array() const
void ecrit(Sortie &) const override
_SIZE_ dimension(int d) const