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 is not designed to verify your discretization." << 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 <<
"Checking real element " << i <<
" of processor " << proc;
183 else if (nb_elem_tot<=i && i<nb_elem_tot+nb_som)
185 int sommet=i-nb_elem_tot;
186 Cerr <<
"Checking real vertex ";
187 if (domaine.get_renum_som_perio(sommet)!=sommet) Cerr <<
"periodic ";
188 Cerr << i-nb_elem_tot <<
" of processor " << 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 <<
"Checking real, non-redundant, non-periodic edge " << arete <<
" of processor " << 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() <<
"] FAIL at row " << i <<
" for proc " << proc <<
" (AP,P)= " << app <<
" error= " << erreur_absolue << finl;
255 Cerr <<
"[" <<
Process::me() <<
"] invqtentrelacee = ";
256 inverse_quantitee_entrelacee.
ecrit(Cerr);
260 Cerr <<
"[" <<
Process::me() <<
"] OK at row " << i <<
" for proc " << proc <<
" (AP,P)= " << app <<
" error= " << erreur_absolue << finl;
267 Cerr <<
"[" <<
Process::me() <<
"] Pressure matrix:" << finl;
269 Cerr <<
"Failure in the assembler's verifier method. Check the FAIL entries above." << 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 <<
"Not handled: elem1==-1 case" << 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
Returns the array of field values at the current time.
class Cond_lim_base Base class for the hierarchy of classes that represent the different boundary con...
virtual Frontiere_dis_base & frontiere_dis()
Returns the discretized boundary to which the boundary conditions apply.
class Cond_lim Generic class used to represent any class
class Conds_lim This class represents a vector of boundary conditions.
Classe Dirichlet_homogene This class is the base class of the hierarchy of homogeneous Dirichlet-type...
Dirichlet This class is the base class of the hierarchy of Dirichlet-type boundary conditions.
const IntTab_t & aretes_som() const
returns the connectivity array edges/vertices.
int_t get_renum_som_perio(int_t i) const
int_t nb_aretes() const
Returns the number of real edges.
int_t elem_aretes(int_t i, int j) const
returns the number of the j-th edge of the i-th element.
int_t nb_som_tot() const
Returns the total number of vertices of the domain i.e. the number of real and virtual vertices on th...
int_t nb_som() const
Returns the number of vertices of the domain.
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
const Cond_lim & les_conditions_limites(int) const
Returns the i-th boundary condition.
const IntVect & get_ok_arete() const
const ArrOfInt & get_renum_arete_perio() const
int nb_faces_tot() const
Returns the total number of faces.
virtual double face_normales(int face, int comp) const
int face_sommets(int i, int j) const
Returns the index of the i-th vertex of face num_face.
int est_une_face_virt_bord(int) const
Returns 1 if face is a virtual boundary face, 0 otherwise.
int elem_faces(int i, int j) const
Returns the index of the i-th face of element num_elem; the face numbering convention is.
int premiere_face_int() const
A face is internal if and only if it separates two elements.
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
class Domaine_dis_base This class is the base of the hierarchy of discretized domains.
const Domaine & domaine() const
Solveur_Masse_base & solv_masse()
Returns the mass solver associated with the equation.
int num_face(const int) const
virtual DoubleVect & multvect(const DoubleVect &, DoubleVect &) const
Multiplication of a vector by the matrix.
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)
Matrice_Morse_Sym class - Represents a sparse symmetric matrix M stored in Morse format.
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
Matrice class - Generic class in the matrix hierarchy.
Navier_Stokes_std This class carries the terms of the momentum equation.
const Champ_Inc_base & inconnue() const override
Returns the velocity (unknown field of the equation) (const version).
Operateur_Div & operateur_divergence()
Returns the divergence operator associated with the equation.
Operateur_Grad & operateur_gradient()
Returns the gradient operator associated with the equation.
Champ_Inc_base & pression()
Neumann_sortie_libre This class represents an open boundary without imposed velocity.
class Op_Grad_VEF_P1B_Face
Operateur_Div Generic class of the hierarchy of operators computing the divergence.
Classe Operateur_Grad Generic class of the hierarchy of operators computing the gradient.
virtual DoubleTab & calculer(const DoubleTab &, DoubleTab &) const
class Periodique This class represents a periodic boundary condition.
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()
Returns the number of processors in the current group. See Comm_Group::nproc() and PE_Groups::current...
static int me()
Returns the rank of the local processor in the current communication group. See Comm_Group::rank() an...
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
Solveur_Masse_base Represents the mass matrix of an equation.
virtual DoubleTab & appliquer(DoubleTab &) const
Returns appliquer_impl(x/temporal_coefficient) if a temporal coefficient is set, otherwise returns ap...
Symetrie On symmetry faces, the following properties hold:
_SIZE_ size_array() const
void ecrit(Sortie &) const override
_SIZE_ dimension(int d) const