16#include <Op_Diff_VEFP1NCP1B_Face.h>
17#include <Champ_P1NC.h>
19#include <Dirichlet_homogene.h>
20#include <Periodique.h>
21#include <Neumann_paroi.h>
22#include <Neumann_homogene.h>
23#include <Neumann_sortie_libre.h>
24#include <Echange_externe_impose.h>
26#include <Champ_Uniforme.h>
29#include <TRUSTLists.h>
30#include <Champ_front_txyz.h>
31#include <Champ_Don_lu.h>
32#include <Champ_Don_Fonc_xyz.h>
33#include <Champ_Uniforme_Morceaux.h>
34#include <Porosites_champ.h>
35#include <Check_espace_virtuel.h>
36#include <Conduction.h>
44static inline double maximum(
const double x,
75 Motcle motlu, accouverte =
"{" , accfermee =
"}" ;
78 les_mots[0] =
"alphaE";
79 les_mots[1] =
"alphaS";
80 les_mots[2] =
"alphaA";
82 les_mots[4] =
"decentrage";
83 les_mots[5] =
"epsilon";
88 if (motlu!=accouverte)
90 Cerr <<
"Erreur Op_Diff_VEFP1NCP1B_Face::readOn()" << finl;
91 Cerr <<
"Depuis la 1.5.5, la syntaxe du mot cle P1NCP1B a change." << finl;
92 Cerr <<
"Il faut commencer par une accolade ouvrante {" << finl;
93 Cerr <<
"et les options eventuelles sont entre les accolades :" << finl;
94 Cerr <<
"Diffusion { P1NCP1B } -> Diffusion { P1NCB { } }" << finl;
101 while(motlu!=accfermee)
103 int rang = les_mots.search(motlu);
123 Cerr <<
"Erreur Op_Diff_VEFP1NCP1B_Face::readOn()" << finl;
124 Cerr <<
"L'option alphaA ne peut etre activee qu'en " <<
"dimension 3" << finl;
125 Cerr <<
"Sortie du programme" << finl;
147 Cerr <<
"Erreur Op_Diff_VEFP1NCP1B_Face::readOn()" << finl;
148 Cerr <<
"Mot clef " << motlu <<
" non reconnu" << finl;
149 Cerr <<
"Les mots clef reconnus sont : " << les_mots << finl;
150 Cerr <<
"Sortie du programme" << finl;
187 Cerr <<
"\nBoundary conditions of 'Symetrie' type with P1NCP1B diffusion operator are only allowed for Conduction equation!" << finl;
188 Cerr <<
"Here you use a P1NCP1B diffusion operator in a '" <<
equation().
que_suis_je() <<
"' equation where" << finl;
189 Cerr <<
"boundary condition number " << i <<
", on boundary '" << la_cl->frontiere_dis().le_nom() <<
"' has been assigned to: '" << la_cl->que_suis_je() <<
"'." << finl;
215 const Domaine& domaine=domaine_VEF.
domaine();
219 const int nb_faces=domaine_VEF.
nb_faces();
225 DoubleTab coeffOperateur(nb_faces_tot);
230 const int nb_bords=les_cl.size();
238 double dt_stab=DMAXFLOAT;
242 modif_par_porosite_si_flag(
nu_,nu,!marq,porosite_elem);
249 domaine.creer_tableau_sommets(nu_p1);
261 for (face=0; face<nb_faces; face++)
263 coeffOperateur(face)/=volumes_entrelaces(face);
264 assert(coeffOperateur(face)>=0.);
265 coeffOperateur(face)=1./(coeffOperateur(face)+DMINFLOAT);
269 for (n_bord=0; n_bord<nb_bords; n_bord++)
280 for (ind_face=num1; ind_face<num2; ind_face++)
283 coeffOperateur(face)=1.e20;
289 for (face=0; face<nb_faces; face++)
290 if (coeffOperateur(face)<dt_stab)
291 dt_stab=coeffOperateur(face);
301 const Domaine& domaine=domaine_VEF.
domaine();
306 const DoubleVect& volumes=domaine_VEF.
volumes();
308 const IntTab& elem_faces=domaine_VEF.
elem_faces();
310 const int nb_elem_tot=domaine.nb_elem_tot();
311 const int nb_faces_elem=domaine.nb_faces_elem();
312 const int nb_bords=les_cl.size();
315 int face=0,face_loc=0;
316 int faceAss=0,faceAss_loc=0;
327 for (elem=0; elem<nb_elem_tot; elem++)
329 volume=volumes(elem);
332 for (face_loc=0; face_loc<nb_faces_elem; face_loc++)
334 face=elem_faces(elem,face_loc);
338 psc+=face_normales(face,dim)*face_normales(face,dim);
344 coeffOperateur(face)+=coeff;
348 for (n_bord=0; n_bord<nb_bords; n_bord++)
360 for (ind_face=num1; ind_face<num2; ind_face++)
364 faceAss=le_bord.
num_face(faceAss_loc);
368 coeffOperateur(faceAss)+=coeffOperateur(face);
369 coeffOperateur(face)=coeffOperateur(faceAss);
381 const int nb_faces=domaine_VEF.
nb_faces();
390 for (face=0; face<nb_faces; face++)
400 Cerr<<
"Error in Op_Diff_VEFP1NCP1B_Face::calculer_dt_stab_aretes()"<<finl;
401 Cerr<<
"Function not coded"<<finl;
412 const Domaine& domaine = domaine_VEF.
domaine();
413 const DoubleTab& face_normales = domaine_VEF.
face_normales();
414 const DoubleVect& volumes = domaine_VEF.
volumes();
415 const IntTab& elem_faces=domaine_VEF.
elem_faces();
418 const int nb_faces_elem=domaine.nb_faces_elem();
419 const int nb_elem_tot=domaine.nb_elem_tot();
420 int elem=0,face_loc=0,face=0,compi=0,compj=0;
426 for(elem=0; elem<nb_elem_tot; elem++)
427 for(face_loc=0; face_loc<nb_faces_elem; face_loc++)
429 face=elem_faces(elem,face_loc);
432 if(elem!=face_voisins(face,0)) signe=-1;
434 for(compi=0; compi<
dim_ch_; compi++)
438 face_normales(face,compj);
442 for (elem=0; elem<nb_elem_tot; elem++)
444 volume = volumes(elem);
446 for (compi=0; compi<
dim_ch_; compi++)
465 const Domaine& domaine = domaine_VEF.
domaine();
466 const Domaine& dom=domaine;
470 const int nb_faces_elem=domaine.nb_faces_elem();
473 const int nb_som=domaine_VEF.
nb_som();
474 const int nb_som_tot=domaine_VEF.
nb_som_tot();
475 const int nb_bords =les_cl.size();
476 int elem=0,face_loc=0,som_loc=0,face=0;
477 int compi=0,compj=0,som=0,num1=0,num2=0;
484 const DoubleTab& face_normales = domaine_VEF.
face_normales();
495 const IntTab& som_elem=domaine.les_elems();
496 const IntTab& elem_faces=domaine_VEF.
elem_faces();
502 for(elem=0; elem<nb_elem_tot; elem++)
505 for(face_loc=0; face_loc<nb_faces_elem; face_loc++)
507 face = elem_faces(elem,face_loc);
509 for(compi=0; compi<
dim_ch_; compi++)
510 sigma[compi]+=inconnue[face*
dim_ch_+compi];
513 for(face_loc=0; face_loc<nb_faces_elem; face_loc++)
516 face = elem_faces(elem,face_loc);
519 if(elem!=face_voisins(face,0)) signe=-1;
521 for(compi=0; compi<
dim_ch_; compi++)
523 secmem(som,compi,compj)+=coeff_som*signe*
524 sigma[compi]*face_normales(face,compj);
532 for (n_bord=0; n_bord<nb_bords; n_bord++)
544 else if (sub_type(
Dirichlet,la_cl.valeur()))
549 double x=0.,y=0.,z=0.;
550 double inconnue_pt=0.;
560 for (ind_face=num1; ind_face<num2; ind_face++)
564 for(som_loc=0; som_loc<nb_som_face; som_loc++)
572 x=coord_sommets(som,0);
573 y=coord_sommets(som,1);
576 for (compi=0; compi<
dim_ch_; compi++)
582 secmem(som,compi,compj) +=
583 1./6*(2*inconnue[face*
dim_ch_+compi]+inconnue_pt)
584 *face_normales(face,compj) ;
593 int som2=face_sommets(face,(som_loc+i)%nb_som_face);
597 x=(coord_sommets(som,0)+coord_sommets(som2,0))/2.;
598 y=(coord_sommets(som,1)+coord_sommets(som2,1))/2.;
599 z=(coord_sommets(som,2)+coord_sommets(som2,2))/2.;
602 for (compi=0; compi<
dim_ch_; compi++)
608 secmem(som, compi, compj) += 1./
dimension*
609 1/2.*inconnue_pt*face_normales(face,compj) ;
621 for (ind_face=num1; ind_face<num2; ind_face++)
625 for(som_loc=0; som_loc<nb_som_face; som_loc++)
629 for (compi=0; compi<
dim_ch_; compi++)
632 inconnue[face*
dim_ch_+compi]*face_normales(face,compj) ;
641 else if (!sub_type(
Periodique,la_cl.valeur()))
643 for (ind_face=num1; ind_face<num2; ind_face++)
647 for(som_loc=0; som_loc<nb_som_face; som_loc++)
651 for (compi=0; compi<
dim_ch_; compi++)
654 inconnue[face*
dim_ch_+compi]*face_normales(face,compj) ;
668 for (compi=0; compi<
dim_ch_; compi++)
671 for(i=0; i<nb_som_tot; i++)
674 secmemij(som)=secmem(som,compi,compj);
678 for(i=0; i<nb_som; i++)
681 gradij(som)=secmemij(som)/(
coeff_*volume_aux_sommets(som));
684 for(i=0; i<nb_som_tot; i++)
707 DoubleVect& div)
const
715 const int nb_bords =les_cl.size();
716 int n_bord=0, num1=0, num2=0;
717 int face=0, face_asso_loc=0, face_associee=0;
718 int ind_face=0, comp=0;
722 for (n_bord=0; n_bord<nb_bords; n_bord++)
736 for (ind_face=num1; ind_face<num2; ind_face++)
740 face_associee=le_bord.
num_face(face_asso_loc);
742 if (face<face_associee)
743 for (comp=0; comp<
dim_ch_; comp++)
758 for (ind_face=num1; ind_face<num2; ind_face++)
762 assert(face_voisins(face,0)!=-1);
764 for (comp=0; comp<
dim_ch_; comp++)
779 for (ind_face=num1; ind_face<num2; ind_face++)
783 for (comp=0; comp<
dim_ch_; comp++)
785 flux=la_cl_paroi.
h_imp(ind_face,comp)
787 flux*=(la_cl_paroi.
T_ext(ind_face,comp)-inconnue[face*
dim_ch_+comp]);
805 const DoubleTab& face_normales = domaine_VEF.
face_normales();
807 const IntTab& elem_faces=domaine_VEF.
elem_faces();
812 int elem=0,face_loc=0,face=0,compi=0,compj=0;
816 for(elem=0; elem<nb_elem_tot; elem++)
817 for(face_loc=0; face_loc<nb_faces_elem; face_loc++)
819 face=elem_faces(elem,face_loc);
822 if(elem!=face_voisins(face,0)) signe=-1.;
824 for(compi=0; compi<
dim_ch_; compi++)
828 *signe*face_normales(face,compj);
840 const Domaine& domaine = domaine_VEF.
domaine();
841 const Domaine& dom=domaine;
843 const DoubleTab& face_normales = domaine_VEF.
face_normales();
846 const IntTab& som_elem=domaine.les_elems();
847 const IntTab& elem_faces=domaine_VEF.
elem_faces();
850 const int nb_faces_elem=domaine.nb_faces_elem();
853 int elem=0,face_loc=0,face_loc2=0,face=0;
854 int compi=0,compj=0,som=0,ind_face=0;
855 int num1=0, num2=0,som_loc=0;
861 for(elem=0; elem<nb_elem_tot; elem++)
862 for(face_loc=0; face_loc<nb_faces_elem; face_loc++)
865 face=elem_faces(elem,face_loc);
868 if(elem!=face_voisins(face,0)) signe=-1;
871 sigma[compj]=signe*face_normales(face,compj);
873 for(face_loc2=0; face_loc2<nb_faces_elem; face_loc2++)
874 for(compi=0; compi<
dim_ch_; compi++)
876 div[elem_faces(elem,face_loc2)*
dim_ch_+compi]-=
883 const IntTab& face_sommets = domaine_VEF.
face_sommets();
884 const int nb_bords =les_cl.size();
888 for (
int n_bord=0; n_bord<nb_bords; n_bord++)
895 if (sub_type(
Neumann,la_cl.valeur()) ||
901 for (ind_face=num1; ind_face<num2; ind_face++)
907 elem=face_voisins(face,0);
913 for (som_loc=0; som_loc<nb_som_face; som_loc++)
917 for(compi=0; compi<
dim_ch_; compi++)
919 gradient_bord(compi,compj)+=
926 for(compi=0; compi<
dim_ch_; compi++)
929 gradient_bord(compi,compj)
930 *face_normales(face,compj);
975ajouter(
const DoubleTab& inconnue, DoubleTab& resu)
const
978 const Domaine& domaine=domaine_VEF.
domaine();
990 DoubleTab nu,nu_p1,nu_pA;
991 modif_par_porosite_si_flag(
nu_,nu,!marq,porosite_elem);
994 modif_par_porosite_si_flag(inconnue,inconnue1,marq,porosite_face);
996 const DoubleVect& inconnue2 = inconnue1;
997 DoubleVect& resu2 = resu;
998 DoubleVect resu3(resu2);
1015 nu_pA.
resize(nb_aretes_tot);
1038 domaine.creer_tableau_sommets(nu_p1);
1058calculer(
const DoubleTab& inconnue, DoubleTab& resu)
const
1061 return ajouter(inconnue,resu);
1067 tab_multiply_any_shape(grad, nu);
1114 int n_bord=0,ind_face=0;
1116 int compi=0,compj=0;
1121 double coeff_conv=1.;
1124 for (n_bord=0; n_bord<nb_bords; n_bord++)
1137 for (ind_face=num1; ind_face<num2; ind_face++)
1142 for (compi=0; compi<
dim_ch_; compi++)
1153 for (ind_face=num1; ind_face<num2; ind_face++)
1158 for (compi=0; compi<
dim_ch_; compi++)
1160 Text=la_cl_paroi.
T_ext(ind_face,compi);
1162 flux_bords_(face,compi)=coeff_conv*la_cl_paroi.
h_imp(ind_face,compi)*surface;
1172 for (ind_face=num1; ind_face<num2; ind_face++)
1176 for (compi=0; compi<
dim_ch_; compi++)
1182 for (ind_face=num1; ind_face<num2; ind_face++)
1185 elem=face_voisins(face,0);
1189 for (compi=0; compi<
dim_ch_; compi++)
1192 *face_normales(face,compj);
1203 const Domaine& domaine = domaine_VEF.
domaine();
1204 const Domaine& dom=domaine;
1214 int som=0,som_loc=0;
1215 int n_bord=0,ind_face=0;
1217 int compi=0,compj=0;
1221 double coeff_conv=1.;
1224 for (n_bord=0; n_bord<nb_bords; n_bord++)
1237 for (ind_face=num1; ind_face<num2; ind_face++)
1242 for (compi=0; compi<
dim_ch_; compi++)
1253 for (ind_face=num1; ind_face<num2; ind_face++)
1258 for (compi=0; compi<
dim_ch_; compi++)
1260 Text=la_cl_paroi.
T_ext(ind_face,compi);
1262 flux_bords_(face,compi)=coeff_conv*la_cl_paroi.
h_imp(ind_face,compi)*surface;
1272 for (ind_face=num1; ind_face<num2; ind_face++)
1276 for (compi=0; compi<
dim_ch_; compi++)
1282 for (ind_face=num1; ind_face<num2; ind_face++)
1287 for (som_loc=0; som_loc<nb_som_face; som_loc++)
1289 som=face_sommets(face,som_loc);
1292 for (compi=0; compi<
dim_ch_; compi++)
1295 face_normales(face,compj);
1298 for (compi=0; compi<
dim_ch_; compi++)
1308 Cerr<<
"Op_Dift_VEF_P1NCP1B_Face::calculer_flux_bords_aretes() not coded"<<finl;
1322 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
1323 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1324 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1327 int nb_faces=domaine_VEF.
nb_faces();
1339 for (
int n_bord=0; n_bord<nb_bords; n_bord++)
1344 int num2 = num1 + le_bord.
nb_faces();
1350 for (num_face=num1; num_face<num2; num_face++)
1352 elem1 = face_voisins(num_face,0);
1361 while ((fac_loc<nb_faces_elem) && (elem_faces(elem1,fac_loc)!=num_face)) fac_loc++;
1362 if (fac_loc==nb_faces_elem) ok=0;
1364 for (i=0; i<nb_faces_elem; i++)
1365 if ( ( (j= elem_faces(elem1,i)) > num_face ) && (j != fac_asso ) )
1367 val =
viscA(num_face,j,elem1,nu(elem1));
1373 for (
int nc=0; nc<nb_comp; nc++)
1375 int n0=num_face*nb_comp+nc;
1376 int j0=j*nb_comp+nc;
1378 matrice(n0,n0)+=val*porosite_face(num_face)*coeff;
1379 matrice(n0,j0)-=val*porosite_face(j)*coeff;
1381 if (!ok) n0=fac_asso*nb_comp+nc;
1384 matrice(j0,n0)-=val*porosite_face((n0-nc)/nb_comp)*coeff;
1385 matrice(j0,j0)+=val*porosite_face(j)*coeff;
1392 elem2 = face_voisins(num_face,1);
1394 for (i=0; i<nb_faces_elem; i++)
1395 if ( ( (j= elem_faces(elem2,i)) > num_face ) && (j != fac_asso ) )
1397 val =
viscA(num_face,j,elem2,nu(elem2));
1399 for (
int nc=0; nc<nb_comp; nc++)
1401 int n0=num_face*nb_comp+nc;
1402 int j0=j*nb_comp+nc;
1404 matrice(n0,n0)+=val*porosite_face(num_face)*coeff;
1405 matrice(n0,j0)-=val*porosite_face(j)*coeff;
1413 for (num_face=num1; num_face<num2; num_face++)
1415 elem1 = face_voisins(num_face,0);
1417 for (i=0; i<nb_faces_elem; i++)
1418 if ( (j= elem_faces(elem1,i)) > num_face )
1420 val =
viscA(num_face,j,elem1,nu(elem1));
1421 for (
int nc=0; nc<nb_comp; nc++)
1423 int n0=num_face*nb_comp+nc;
1424 int j0=j*nb_comp+nc;
1426 matrice(n0,n0)+=val*porosite_face(num_face)*coeff;
1427 matrice(n0,j0)-=val*porosite_face(j)*coeff;
1430 matrice(j0,n0)-=val*porosite_face(num_face)*coeff;
1431 matrice(j0,j0)+=val*porosite_face(j)*coeff;
1443 elem1 = face_voisins(num_face,0);
1444 elem2 = face_voisins(num_face,1);
1446 for (i=0; i<nb_faces_elem; i++)
1448 if ( (j=elem_faces(elem1,i)) > num_face )
1450 val =
viscA(num_face,j,elem1,nu(elem1));
1451 for (
int nc=0; nc<nb_comp; nc++)
1453 int n0=num_face*nb_comp+nc;
1454 int j0=j*nb_comp+nc;
1456 matrice(n0,n0)+=val*porosite_face(num_face)*coeff;
1457 matrice(n0,j0)-=val*porosite_face(j)*coeff;
1460 matrice(j0,n0)-=val*porosite_face(num_face)*coeff;
1461 matrice(j0,j0)+=val*porosite_face(j)*coeff;
1467 if ( (j=elem_faces(elem2,i)) > num_face )
1469 val=
viscA(num_face,j,elem2,nu(elem2));
1470 for (
int nc=0; nc<nb_comp; nc++)
1472 int n0=num_face*nb_comp+nc;
1473 int j0=j*nb_comp+nc;
1475 matrice(n0,n0)+=val*porosite_face(num_face)*coeff;
1476 matrice(n0,j0)-=val*porosite_face(j)*coeff;
1479 matrice(j0,n0)-=val*porosite_face(num_face)*coeff;
1480 matrice(j0,j0)+=val*porosite_face(j)*coeff;
1502 const int nb_faces=domaine_VEF.
nb_faces();
1511 DoubleTab coeff_perio(nb_faces_tot);
1513 for (n_bord=0; n_bord<nb_bords; n_bord++)
1521 for (ind_face=num1; ind_face<num2; ind_face++)
1524 coeff_perio(face)=0.5;
1538 for (face=premiere_face_int; face<nb_faces; face++)
1541 gradient0,gradient1,
1542 porosite_face,nu_som,
1543 coeff_perio,matrice);
1546 for (n_bord=0; n_bord<nb_bords; n_bord++)
1558 for (ind_face=num1; ind_face<num2; ind_face++)
1566 gradient0,gradient1,
1567 porosite_face,nu_som,
1568 coeff_perio,matrice);
1572 else if (sub_type(
Symetrie,la_cl.valeur()))
1573 for (ind_face=num1; ind_face<num2; ind_face++)
1578 gradient0,gradient1,
1579 porosite_face,nu_som,
1580 coeff_perio,matrice);
1584 for (ind_face=num1; ind_face<num2; ind_face++)
1589 gradient0,gradient1,
1590 porosite_face,nu_som,
1591 coeff_perio,matrice);
1606 DoubleTab& gradient0, DoubleTab& gradient1,
1607 const DoubleVect& porosite_face,
const DoubleTab& nu_som,
1612 const auto& tab1=matrice.
get_tab1();
1613 const auto& tab2=matrice.
get_tab2();
1617 const int nb_faces=domaine_VEF.
nb_faces();
1620 int face2=0,face2_C=0;
1621 int som_loc=0,som=0;
1622 int som_loc0=0,som_loc1=0;
1623 int compi=0,compj=0;
1624 int elem0=0,elem1=0;
1628 double coeff_som=0.,coeff_mat=0.;
1629 double coeff_diff=0.;
1633 double coeff_conv=1.;
1637 assert(gradient0.
nb_dim()==2);
1640 assert(gradient1.
nb_dim()==1);
1655 for (som_loc=0; som_loc<nnz; som_loc++)
1657 som=liste_som(som_loc);
1658 coeff_som=volume_aux_sommets(som)*
coeff_;
1662 psc+=gradient0(compj,som_loc)
1663 *gradient0(compj,som_loc);
1670 coeff_mat*=coeff_conv;
1672 for (compi=0; compi<
dim_ch_; compi++)
1675 matrice(face_C,face_C)+=coeff_mat;
1684 auto debut=tab1[face_C]-1;
1685 auto size=tab1[face_C+1]-tab1[face_C];
1687 for (i=1; i<size; i++)
1689 face2_C=tab2[debut+i]-1;
1695 for (som_loc=0; som_loc<nnz; som_loc++)
1697 som=liste_som(som_loc);
1698 coeff_som=volume_aux_sommets(som)*
coeff_;
1699 isInStencil(face2,som,elem0,som_loc0,elem1,som_loc1);
1703 assert(som_loc0!=-1);
1705 gradient_som(face2,som,elem0,som_loc0,elem1,som_loc1,gradient1);
1709 psc+=gradient0(compj,som_loc)
1717 coeff_mat*=coeff_conv;
1718 coeff_diff=-1.*delta*maximum(0.,coeff_mat);
1719 coeff_mat+=coeff_diff;
1721 for (compi=0; compi<
dim_ch_; compi++)
1726 matrice(face_C,face2_C)+=coeff_mat*coeff_perio(face2);
1727 matrice(face_C,face_C)-=coeff_diff*coeff_perio(face2);
1730 matrice(face2_C,face_C)+=coeff_mat;
1731 matrice(face2_C,face2_C)-=coeff_diff;
1742 DoubleTab& gradient0, DoubleTab& gradient1,
1743 const DoubleVect& porosite_face,
const DoubleTab& nu_som,
1748 const auto& tab1=matrice.
get_tab1();
1749 const auto& tab2=matrice.
get_tab2();
1753 const int nb_faces=domaine_VEF.
nb_faces();
1756 int face2=0,face2_C=0;
1757 int som_loc=0,som=0;
1758 int som_loc0=0,som_loc1=0;
1759 int compi=0,compj=0;
1760 int elem0=0,elem1=0;
1764 double coeff_som=0.,coeff_mat=0.;
1765 double coeff_diff=0.;
1769 double coeff_conv=1.;
1773 assert(gradient0.
nb_dim()==2);
1776 assert(gradient1.
nb_dim()==1);
1791 for (som_loc=0; som_loc<nnz; som_loc++)
1793 som=liste_som(som_loc);
1794 coeff_som=volume_aux_sommets(som)*
coeff_;
1798 psc+=gradient0(compj,som_loc)
1799 *gradient0(compj,som_loc);
1806 coeff_mat*=coeff_conv;
1808 for (compi=0; compi<
dim_ch_; compi++)
1811 matrice(face_C,face_C)+=coeff_mat;
1820 auto debut=tab1[face_C]-1;
1821 auto size=tab1[face_C+1]-tab1[face_C];
1823 for (i=1; i<size; i++)
1825 face2_C=tab2[debut+i]-1;
1831 for (som_loc=0; som_loc<nnz; som_loc++)
1833 som=liste_som(som_loc);
1834 coeff_som=volume_aux_sommets(som)*
coeff_;
1835 isInStencil(face2,som,elem0,som_loc0,elem1,som_loc1);
1839 assert(som_loc0!=-1);
1841 gradient_som(face2,som,elem0,som_loc0,elem1,som_loc1,gradient1);
1845 psc+=gradient0(compj,som_loc)
1853 coeff_mat*=coeff_conv;
1854 coeff_diff=-1.*delta*maximum(0.,coeff_mat);
1855 coeff_mat+=coeff_diff;
1857 for (compi=0; compi<
dim_ch_; compi++)
1862 matrice(face_C,face2_C)+=coeff_mat*coeff_perio(face2);
1863 matrice(face_C,face_C)-=coeff_diff*coeff_perio(face2);
1866 matrice(face2_C,face_C)+=coeff_mat;
1867 matrice(face2_C,face2_C)-=coeff_diff;
1878 DoubleTab& gradient0, DoubleTab& gradient1,
1879 const DoubleVect& porosite_face,
const DoubleTab& nu_som,
1884 const auto& tab1=matrice.
get_tab1();
1885 const auto& tab2=matrice.
get_tab2();
1889 const int nb_faces=domaine_VEF.
nb_faces();
1892 int face2=0,face2_C=0;
1893 int som_loc=0,som=0;
1894 int som_loc0=0,som_loc1=0;
1895 int compi=0,compj=0;
1896 int elem0=0,elem1=0;
1900 double coeff_som=0.,coeff_mat=0.;
1901 double coeff_diff=0.;
1905 double coeff_conv=1.;
1909 assert(gradient0.
nb_dim()==2);
1912 assert(gradient1.
nb_dim()==1);
1927 for (som_loc=0; som_loc<nnz; som_loc++)
1929 som=liste_som(som_loc);
1930 coeff_som=volume_aux_sommets(som)*
coeff_;
1934 psc+=gradient0(compj,som_loc)
1935 *gradient0(compj,som_loc);
1942 coeff_mat*=coeff_conv;
1944 for (compi=0; compi<
dim_ch_; compi++)
1947 matrice(face_C,face_C)+=coeff_mat;
1959 auto debut=tab1[face_C]-1;
1960 auto size=tab1[face_C+1]-tab1[face_C];
1963 for (i=1; i<size; i++)
1965 face2_C=tab2[debut+i]-1;
1971 for (som_loc=0; som_loc<nnz; som_loc++)
1973 som=liste_som(som_loc);
1974 coeff_som=volume_aux_sommets(som)*
coeff_;
1975 isInStencil(face2,som,elem0,som_loc0,elem1,som_loc1);
1979 assert(som_loc0!=-1);
1981 gradient_som(face2,som,elem0,som_loc0,elem1,som_loc1,gradient1);
1985 psc+=gradient0(compj,som_loc)
1993 coeff_mat*=coeff_conv;
1994 coeff_diff=-1.*delta*maximum(0.,coeff_mat);
1995 coeff_mat+=coeff_diff;
1997 for (compi=0; compi<
dim_ch_; compi++)
2002 matrice(face_C,face2_C)+=coeff_mat*coeff_perio(face2);
2003 matrice(face_C,face_C)-=coeff_diff*coeff_perio(face2);
2006 matrice(face2_C,face_C)+=coeff_mat;
2007 matrice(face2_C,face2_C)-=coeff_diff;
2018 DoubleTab& gradient0, DoubleTab& gradient1,
2019 const DoubleVect& porosite_face,
const DoubleTab& nu_som,
2024 const auto& tab1=matrice.
get_tab1();
2025 const auto& tab2=matrice.
get_tab2();
2029 const int nb_faces=domaine_VEF.
nb_faces();
2032 int face2=0,face2_C=0;
2033 int som_loc=0,som=0;
2034 int som_loc0=0,som_loc1=0;
2035 int compi=0,compj=0;
2036 int elem0=0,elem1=0;
2040 double coeff_som=0.,coeff_mat=0.;
2041 double coeff_diff=0.;
2045 double coeff_conv=1.;
2049 assert(gradient0.
nb_dim()==2);
2052 assert(gradient1.
nb_dim()==1);
2067 for (som_loc=0; som_loc<nnz; som_loc++)
2069 som=liste_som(som_loc);
2070 coeff_som=volume_aux_sommets(som)*
coeff_;
2074 psc+=gradient0(compj,som_loc)
2075 *gradient0(compj,som_loc);
2082 coeff_mat*=coeff_conv;
2084 for (compi=0; compi<
dim_ch_; compi++)
2087 matrice(face_C,face_C)+=coeff_mat;
2096 auto debut=tab1[face_C]-1;
2097 auto size=tab1[face_C+1]-tab1[face_C];
2099 for (i=1; i<size; i++)
2101 face2_C=tab2[debut+i]-1;
2107 for (som_loc=0; som_loc<nnz; som_loc++)
2109 som=liste_som(som_loc);
2110 coeff_som=volume_aux_sommets(som)*
coeff_;
2111 isInStencil(face2,som,elem0,som_loc0,elem1,som_loc1);
2115 assert(som_loc0!=-1);
2117 gradient_som(face2,som,elem0,som_loc0,elem1,som_loc1,gradient1);
2121 psc+=gradient0(compj,som_loc)
2129 coeff_mat*=coeff_conv;
2130 coeff_diff=-1.*delta*maximum(0.,coeff_mat);
2131 coeff_mat+=coeff_diff;
2133 for (compi=0; compi<
dim_ch_; compi++)
2138 matrice(face_C,face2_C)+=coeff_mat*coeff_perio(face2);
2139 matrice(face_C,face_C)-=coeff_diff*coeff_perio(face2);
2142 matrice(face2_C,face_C)+=coeff_mat*coeff_perio(face);
2143 matrice(face2_C,face2_C)-=coeff_diff*coeff_perio(face);
2154 const Domaine& domaine=domaine_VEF.
domaine();
2161 DoubleVect porosite_face(
equation().milieu().porosite_face());
2162 if (!marq) porosite_face=1.;
2165 DoubleTab nu,nu_p1,nu_pA;
2167 modif_par_porosite_si_flag(
nu_,nu,!marq,porosite_elem);
2174 domaine.creer_tableau_sommets(nu_p1);
2199remplir_nu_p1(
const DoubleTab& nu_elem,DoubleTab& nu_p1)
const
2202 const Domaine& domaine=domaine_VEF.
domaine();
2203 const Domaine& dom=domaine;
2205 const int nb_som = dom.
nb_som();
2206 const int nb_elem_tot=domaine.nb_elem_tot();
2207 const int nb_som_elem=domaine.nb_som_elem();
2210 int som_loc=0,som=0;
2212 const IntTab& elem_som=domaine.les_elems();
2214 ArrOfInt nb_elem_per_som(nb_som);
2216 assert(nu_elem.
get_md_vector() == domaine.md_vector_elements());
2219 assert_espace_virtuel_vect(nu_elem);
2225 for (elem=0; elem<nb_elem_tot; elem++)
2227 const double nu = nu_elem[elem];
2228 for (som_loc=0; som_loc<nb_som_elem; som_loc++)
2230 som=elem_som(elem,som_loc);
2237 nb_elem_per_som[som]++;
2242 for (som = 0; som < nb_som; som++)
2245 int nvoisins = nb_elem_per_som[som_perio];
2250 nu_p1(som_perio) /= nvoisins;
2251 nb_elem_per_som[som_perio] = 0;
2253 if (som != som_perio)
2254 nu_p1(som) = nu_p1(som_perio);
2280remplir_nu_pA(
const DoubleTab& nu_elem,DoubleTab& nu_pA)
const
2282 Cerr <<
"Op_Diff_VEFP1NCP1B_Face::remplir_nu_pA() not coded" << finl;
2283 Cerr <<
"Exit" << finl;
2297 const Domaine& domaine = domaine_VEF.
domaine();
2298 const Domaine& dom=domaine;
2301 const IntTab& som_elem=domaine.
les_elems();
2302 const IntTab& elem_faces=domaine_VEF.
elem_faces();
2308 const int nb_som_elem=domaine.nb_som_elem();
2310 const int nb_faces_elem=domaine.nb_faces_elem();
2315 int elem=0,elem_loc=0;
2316 int som=0,som_loc=0;
2318 int n_bord=0,ind_face=0;
2322 IntTab faces_perio(nb_faces_tot);
2323 ArrOfBit fait(nb_faces_tot);
2324 IntLists sommets_faces(nb_som_tot);
2328 for (face=0; face<nb_faces_tot; face++)
2329 faces_perio(face)=face;
2331 for (n_bord=0; n_bord<nb_bords; n_bord++)
2344 for (ind_face=num1; ind_face<num2; ind_face++)
2356 faces_perio(face)=faceAss;
2357 faces_perio(faceAss)=face;
2364 for (elem=0; elem<nb_elem_tot; elem++)
2365 for (som_loc=0; som_loc<nb_som_elem; som_loc++)
2367 som=som_elem(elem,som_loc);
2370 for (face_loc=0; face_loc<nb_faces_elem; face_loc++)
2372 face=elem_faces(elem,face_loc);
2374 sommets_faces[som].add(face);
2375 if (faces_perio(face)!=face)
2376 sommets_faces[som].add(faces_perio(face));
2386 for (n_bord=0; n_bord<nb_bords; n_bord++)
2399 for (ind_face=num1; ind_face<num2; ind_face++)
2415 size=liste[face].
size();
2416 for (i=0; i<size; i++)
2417 fait.
setbit(liste[face][i]);
2424 liste[face][0]=face;
2425 liste[face].add(tmp);
2426 tmp=liste[faceAss][0];
2427 liste[faceAss][0]=faceAss;
2428 liste[faceAss].add(tmp);
2432 liste[face].add(face);
2433 liste[faceAss].add(faceAss);
2440 for (elem_loc=0; elem_loc<2; elem_loc++)
2442 elem=face_voisins(face,elem_loc);
2445 for (som_loc=0; som_loc<nb_som_elem; som_loc++)
2447 som=som_elem(elem,som_loc);
2450 size=sommets_faces[som].
size();
2451 for (i=0; i<size; i++)
2453 face2=sommets_faces[som][i];
2458 liste[face].add(face2);
2459 liste[faceAss].add(face2);
2460 liste[face2].add(face);
2461 liste[face2].add(faceAss);
2474 for (n_bord=0; n_bord<nb_bords; n_bord++)
2483 for (ind_face=num1; ind_face<num2; ind_face++)
2491 size=liste[face].
size();
2492 for (i=0; i<size; i++)
2493 fait.
setbit(liste[face][i]);
2500 liste[face][0]=face;
2501 liste[face].add(tmp);
2504 liste[face].add(face);
2509 elem=face_voisins(face,0);
2512 for (som_loc=0; som_loc<nb_som_elem; som_loc++)
2514 som=som_elem(elem,som_loc);
2517 size=sommets_faces[som].
size();
2518 for (i=0; i<size; i++)
2520 face2=sommets_faces[som][i];
2525 liste[face].add(face2);
2534 for (face=firstFaceInt; face<nb_faces_tot; face++)
2541 size=liste[face].
size();
2542 for (i=0; i<size; i++)
2543 fait.
setbit(liste[face][i]);
2550 liste[face][0]=face;
2551 liste[face].add(tmp);
2554 liste[face].add(face);
2559 for (elem_loc=0; elem_loc<2; elem_loc++)
2561 elem=face_voisins(face,elem_loc);
2564 for (som_loc=0; som_loc<nb_som_elem; som_loc++)
2566 som=som_elem(elem,som_loc);
2569 size=sommets_faces[som].
size();
2570 for (i=0; i<size; i++)
2572 face2=sommets_faces[som][i];
2577 liste[face].add(face2);
2612 const int elem0,
const int som_loc0,
2613 const int elem1,
const int som_loc1,
2614 DoubleTab& grad)
const
2621 const IntTab& elem_faces=domaine_VEF.
elem_faces();
2625 const double coeff_som=coeff/(
dimension+1);
2627 int face_opp=0,compj=0;
2631 assert(grad.
nb_dim()==1);
2639 assert(som_loc0!=-1);
2642 face_opp = elem_faces(elem0,som_loc0);
2644 if(elem0!=face_voisins(face_opp,0)) signe=-1.;
2647 grad(compj)=coeff_som*signe*
2648 face_normales(face_opp,compj);
2659 assert(som_loc1==-1);
2660 elem=face_voisins(face,1);
2661 assert(face_voisins(face,0)!=-1);
2664 if (elem==-1 && face_opp!=face)
2666 grad(compj)+=coeff*face_normales(face,compj) ;
2670 assert(som_loc1!=-1);
2671 face_opp=elem_faces(elem1,som_loc1);
2673 if(elem1!=face_voisins(face_opp,0)) signe=-1.;
2677 grad(compj)+=coeff_som*signe*
2678 face_normales(face_opp,compj);
2681 grad/=(
coeff_*volume_aux_sommets(som_glob));
2697gradient_som(
const int face,
int& nnz, IntVect& som_glob,DoubleTab& grad)
const
2700 const Domaine& domaine=domaine_VEF.
domaine();
2701 const Domaine& dom=domaine;
2706 const IntTab& elem_faces=domaine_VEF.
elem_faces();
2708 const IntTab& elem_som=domaine.les_elems();
2711 const double coeff_som=coeff/(
dimension+1);
2713 const int nb_som_elem=domaine.nb_som_elem();
2715 int face_opp=0,compj=0;
2716 int som_loc=0,som=0;
2724 assert(grad.
nb_dim()==2);
2733 elem=face_voisins(face,0);
2736 for (som_loc=0; som_loc<nb_som_elem; som_loc++)
2738 som=elem_som(elem,som_loc);
2741 face_opp=elem_faces(elem,som_loc);
2743 if(elem!=face_voisins(face_opp,0)) signe=-1.;
2746 som_glob(som_loc)=som;
2751 grad(compj,som_loc)=coeff_som*signe*
2752 face_normales(face_opp,compj);
2754 assert(nnz==nb_som_elem);
2757 elem=face_voisins(face,1);
2760 for (som_loc=0; som_loc<nb_som_elem; som_loc++)
2762 som=elem_som(elem,som_loc);
2765 face_opp=elem_faces(elem,som_loc);
2767 if(elem!=face_voisins(face_opp,0)) signe=-1.;
2770 for (loc=0; loc<nnz; loc++)
2771 if (som_glob[loc]==som)
2783 grad(compj,loc)+=coeff_som*signe*
2784 face_normales(face_opp,compj);
2788 for (som_loc=0; som_loc<nnz; som_loc++)
2790 som=som_glob(som_loc);
2791 volume=
coeff_*volume_aux_sommets(som);
2795 grad(compj,som_loc)/=volume;
2812gradient_som_CL(
const int face,
int& nnz, IntVect& som_glob,DoubleTab& grad)
const
2815 const Domaine& domaine=domaine_VEF.
domaine();
2816 const Domaine& dom=domaine;
2821 const IntTab& elem_faces=domaine_VEF.
elem_faces();
2823 const IntTab& elem_som=domaine.les_elems();
2827 const double coeff_som=coeff/(
dimension+1);
2829 const int nb_som_elem=domaine.nb_som_elem();
2832 int face_opp=0,compj=0;
2833 int som_loc=0,som=0;
2841 assert(grad.
nb_dim()==2);
2850 elem=face_voisins(face,0);
2853 for (som_loc=0; som_loc<nb_som_elem; som_loc++)
2855 som=elem_som(elem,som_loc);
2858 face_opp=elem_faces(elem,som_loc);
2860 if(elem!=face_voisins(face_opp,0)) signe=-1.;
2863 som_glob(som_loc)=som;
2868 grad(compj,som_loc)=coeff_som*signe*
2869 face_normales(face_opp,compj);
2871 assert(nnz==nb_som_elem);
2874 assert(face_voisins(face,1)==-1);
2876 for (som_loc=0; som_loc<nb_som_face; som_loc++)
2878 som=face_sommets(face,som_loc);
2881 for (loc=0; loc<nnz; loc++)
2882 if (som_glob(loc)==som)
2884 assert(som_loc<nnz);
2887 grad(compj,loc)+=coeff*face_normales(face,compj) ;
2891 for (som_loc=0; som_loc<nnz; som_loc++)
2893 som=som_glob(som_loc);
2894 volume=
coeff_*volume_aux_sommets(som);
2898 grad(compj,som_loc)/=volume;
2915 int& elem0,
int& som_loc0,
2916 int& elem1,
int& som_loc1)
const
2919 const Domaine& domaine=domaine_VEF.
domaine();
2920 const Domaine& dom=domaine;
2923 const IntTab& elem_som=domaine.les_elems();
2925 const int nb_som_elem=domaine.nb_som_elem();
2927 int elem00=0,elem11=0;
2928 int som_loc=0,som=0;
2930 elem00=face_voisins(face,0);
2933 for (som_loc=0; som_loc<nb_som_elem; som_loc++)
2935 som=elem_som(elem00,som_loc);
2945 if (som_loc==nb_som_elem)
2951 elem11=face_voisins(face,1);
2958 for (som_loc=0; som_loc<nb_som_elem; som_loc++)
2960 som=elem_som(elem11,som_loc);
2970 if (som_loc==nb_som_elem)
2977 if (elem0==-1 && elem1!=-1)
2991 const int nb_comp = inconnue_->valeurs().line_size();
2995 int comp=0,nnz=0,face_f77=0,face_C=0;
2996 int nb_faces_of_symetry=0;
2999 ArrOfBit is_symetry(nb_faces_tot);
3004 IntLists faces_faces;
3024 for (face=0; face<nb_faces_tot; face++)
3025 if (is_symetry[face])
3027 int nb_v=faces_faces[face].
size();
3028 size+=nb_v*(nb_comp-1)*nb_comp;
3034 tab1[nb_faces_tot*nb_comp]=size+1;
3040 size=faces_faces[0].
size();
3041 if (is_symetry[0]) size*=(nb_comp);
3042 for (comp=1; comp<nb_comp; comp++)
3045 tab1[face_C]=tab1[face_C-1]+size;
3049 for (face=1; face<nb_faces_tot; face++)
3051 size=faces_faces[face-1].
size();
3052 if (is_symetry[face-1]) size*=(nb_comp);
3053 for (comp=0; comp<nb_comp; comp++)
3055 face_C=face*nb_comp+comp;
3056 tab1[face_C]=tab1[face_C-1]+size;
3057 size=faces_faces[face].
size();
3058 if (is_symetry[face]) size*=(nb_comp);
3063 for (face=0; face<nb_faces_tot; face++)
3065 size=faces_faces[face].
size();
3067 for (comp=0; comp<nb_comp; comp++)
3069 auto debut=tab1[face*nb_comp+comp]-1;
3071 for (i=0; i<size; i++)
3073 face_C=faces_faces[face][i]*nb_comp+comp;
3075 tab2[debut+i]=face_f77;
3082 for (face=0; face<nb_faces_tot; face++)
3083 if (is_symetry[face])
3085 size=faces_faces[face].
size();
3087 for (comp=0; comp<nb_comp; comp++)
3089 auto debut=tab1[face*nb_comp+comp]-1;
3091 for (
int voi=0; voi<size; voi++)
3093 int face2=faces_faces[face][voi];
3094 for (i=0; i<nb_comp-1; i++)
3097 next=(comp+i+1)%nb_comp;
3098 face_C=face2*nb_comp+next;
3100 tab2[debut+i]=face_f77;
3102 assert(debut+i<tab1[face*nb_comp+comp+1]-1);
3115 Cerr <<
"Erreur Op_Dift_VEFP1NCP1B_Face::dimensionner(Matrice_Morse&)" << finl;
3116 Cerr <<
"Le dimensionnement de la matrice implicite avec l'option alphaA"
3117 <<
" n'est pas encore codee" << finl;
3118 Cerr <<
"Sortie du programme" << finl;
3147 for (n_bord=0; n_bord<nb_bords; n_bord++)
3155 if (sub_type(
Symetrie,la_cl.valeur()))
3159 for (ind_face=num1; ind_face<num2; ind_face++)
3175 const Domaine& domaine = domaine_VEF.
domaine();
3176 const Domaine& dom=domaine;
3185 const DoubleTab& xv=domaine_VEF.
xv();
3188 DoubleTab inco(unknown);
3189 DoubleVect& incoV = inco;
3194 DoubleTab resu(unknown);
3195 DoubleVect& resuV = resu;
3196 DoubleTab resuMat(unknown);
3197 const DoubleVect& resuMatV = resuMat;
3208 DoubleVect poroF(
equation().milieu().porosite_face());
3209 if (!marq) poroF=1.;
3214 modif_par_porosite_si_flag(
nu_,nu,!marq,poroE);
3227 int compi=0,compj=0;
3230 int num1=0,num2=0,ind_face=0;
3253 les_mots[0] =
"matrice";
3254 les_mots[1] =
"result";
3255 les_mots[2] =
"res";
3256 les_mots[3] =
"resMat";
3257 les_mots[4] =
"grad";
3258 les_mots[5] =
"gradMat";
3259 les_mots[6] =
"div";
3260 les_mots[7] =
"ligne_mat";
3265 for (i=0; i<les_mots.size(); i++)
3271 ofstream mat(les_mots[0].getChar());
3273 for (i=0; i<domaine_VEF.
nb_faces(); i++)
3276 mat<<matConst(i,j)<<
",";
3280 double coeff_diag=0.;
3281 double sum_coeff_extra_diag=0.;
3282 ofstream ligneMat(les_mots[7].getChar());
3285 coeff_diag=matConst(i,i);
3286 ligneMat<<
"Ligne : "<<i<<endl;
3287 ligneMat<<
"Coeff diag : "<<coeff_diag<<endl;
3289 ligneMat<<
"Coeff extra diag : ";
3290 sum_coeff_extra_diag=0.;
3292 if (j!=i) sum_coeff_extra_diag+=matConst(i,j);
3293 ligneMat<<sum_coeff_extra_diag<<endl;
3295 ligneMat<<
"Coeff extra diag par colonne : ";
3296 sum_coeff_extra_diag=0.;
3298 if (j!=i) sum_coeff_extra_diag+=matConst(j,i);
3299 ligneMat<<sum_coeff_extra_diag<<endl;
3307 int elem0=0,elem1=0;
3308 int som_loc0=1,som_loc1=1;
3310 const int nb_som_elem=domaine.nb_som_elem();
3312 const IntTab& elem_som=domaine.les_elems();
3313 ofstream grad1(gradi.getChar());
3314 for (face=0; face<size0; face++)
3316 grad1<<
"Face : "<<face<<endl;
3319 grad1<<xv(face,i)<<
",";
3322 for (ii=0; ii<2; ii++)
3324 elem=face_voisins(face,ii);
3326 for (som_loc=0; som_loc<nb_som_elem; som_loc++)
3328 som=elem_som(elem,som_loc);
3330 isInStencil(face,som,elem0,som_loc0,elem1,som_loc1);
3334 elem1,som_loc1,gradient1);
3338 grad1<<xs(som,i)<<
",";
3341 grad1<<gradient1(compj)<<
",";
3347 ofstream result(les_mots[1].getChar());
3348 ofstream res(les_mots[2].getChar());
3349 ofstream resMat(les_mots[3].getChar());
3350 ofstream grad(les_mots[4].getChar());
3351 ofstream gradMat(les_mots[5].getChar());
3352 ofstream div(les_mots[6].getChar());
3354 for (face=firstFaceInt; face<size0; face++)
3364 grad<<
"Face interne : "<<face*size1+comp<<endl;
3367 grad<<xv(face,i)<<
",";
3369 for (som=0; som<nb_som_tot; som++)
3373 grad<<xs(som,i)<<
",";
3375 for (compi=0; compi<
dim_ch_; compi++)
3385 gradMat<<
"Face interne : "<<face*size1+comp<<endl;
3388 gradMat<<xv(face,i)<<
",";
3390 for (i=0; i<nnz; i++)
3392 gradMat<<som_glob[i]<<
"(";
3394 gradMat<<xs(som_glob[i],ii)<<
",";
3397 gradMat<<gradientMat(compj,i)<<
",";
3405 div<<
"Face interne : "<<face*size1+comp<<endl;
3408 div<<xv(face,i)<<
",";
3410 for (i=0; i<size0; i++)
3416 for (j=0; j<size1; j++)
3417 div<<resu[i*size1+j]<<
",";
3422 res<<
"Face interne : "<<face*size1+comp<<endl;
3425 res<<xv(face,i)<<
",";
3427 for (i=0; i<size0; i++)
3433 for (j=0; j<size1; j++)
3434 res<<resu[i*size1+j]<<
",";
3443 resMat<<
"Face interne :"<<face*size1+comp<<endl;
3446 resMat<<xv(face,i)<<
",";
3448 for (i=0; i<size0; i++)
3452 resMat<<xv(i,ii)<<
",";
3454 for (j=0; j<size1; j++)
3455 resMat<<resuMatV[i*size1+j]<<
",";
3466 result<<
"Diff pour face interne : "<<face*size1+comp<<endl;
3469 result<<xv(face,i)<<
",";
3471 for (i=0; i<size0; i++)
3474 for (j=0; j<size1; j++)
3475 test1|=(std::fabs(resuV[i*size1+j])>1.e-14);
3481 result<<xv(i,ii)<<
",";
3483 for (j=0; j<size1; j++)
3484 result <<resuV[i*size1+j]<<
",";
3491 result<<
"Diff pour face interne : "<<face*size1+comp<<endl;
3492 result<<
"Maximum : "<<max<<endl;
3500 for (n_bord=0; n_bord<nb_bords; n_bord++)
3515 else if (sub_type(
Dirichlet,la_cl.valeur()))
3516 for (ind_face=num1; ind_face<num2; ind_face++)
3525 grad<<
"Face Dirichlet : "<<face*size1+comp<<endl;
3528 grad<<xv(face,i)<<
",";
3530 for (som=0; som<nb_som_tot; som++)
3534 grad<<xs(som,i)<<
",";
3536 for (compi=0; compi<
dim_ch_; compi++)
3546 gradMat<<
"Face Dirichlet : "<<face*size1+comp<<endl;
3549 gradMat<<xv(face,i)<<
",";
3551 for (i=0; i<nnz; i++)
3553 gradMat<<som_glob[i]<<
"(";
3555 gradMat<<xs(som_glob[i],ii)<<
",";
3558 gradMat<<gradientMat(compj,i)<<
",";
3562 for (i=0; i<size0; i++)
3563 for (j=0; j<size1; j++)
3564 resuV[i*size1+j]=0.;
3567 else if (sub_type(
Periodique,la_cl.valeur()))
3572 for (ind_face=num1; ind_face<num2; ind_face++)
3586 grad <<
"Face perio : "<<face*size1+comp<<endl;
3589 grad<<xv(face,i)<<
",";
3591 for (som=0; som<nb_som_tot; som++)
3595 grad<<xs(som,i)<<
",";
3597 for (compi=0; compi<
dim_ch_; compi++)
3607 gradMat<<
"Face perio : "<<face*size1+comp<<endl;
3610 gradMat<<xv(face,i)<<
",";
3612 for (i=0; i<nnz; i++)
3614 gradMat<<som_glob[i]<<
"(";
3616 gradMat<<xs(som_glob[i],ii)<<
",";
3619 gradMat<<gradientMat(compj,i)<<
",";
3627 div<<
"Face perio : "<<face*size1+comp<<endl;
3630 div<<xv(face,i)<<
",";
3632 for (i=0; i<size0; i++)
3638 for (j=0; j<size1; j++)
3639 div<<resu[i*size1+j]<<
",";
3644 res<<
"Face perio : "<<face*size1+comp<<endl;
3647 res<<xv(face,i)<<
",";
3649 for (i=0; i<size0; i++)
3655 for (j=0; j<size1; j++)
3656 res<<resu[i*size1+j]<<
",";
3665 resMat<<
"Face perio :"<<face*size1+comp<<endl;
3668 resMat<<xv(face,i)<<
",";
3670 for (i=0; i<size0; i++)
3674 resMat<<xv(i,ii)<<
",";
3676 for (j=0; j<size1; j++)
3677 resMat<<resuMatV[i*size1+j]<<
",";
3688 result<<
"Diff pour face perio : "<<face*size1+comp<<endl;
3691 result<<xv(face,i)<<
",";
3693 for (i=0; i<size0; i++)
3696 for (j=0; j<size1; j++)
3697 test1|=(std::fabs(resuV[i*size1+j])>1.e-14);
3703 result<<xv(i,ii)<<
",";
3705 for (j=0; j<size1; j++)
3706 result <<resuV[i*size1+j]<<
",";
3713 result<<
"Diff pour face perio : "<<face*size1+comp<<endl;
3714 result<<
"Maximum : "<<max<<endl;
3723 for (ind_face=num1; ind_face<num2; ind_face++)
3734 grad <<
"Face CL : "<<face*size1+comp<<endl;
3737 grad<<xv(face,i)<<
",";
3739 for (som=0; som<nb_som_tot; som++)
3743 grad<<xs(som,i)<<
",";
3745 for (compi=0; compi<
dim_ch_; compi++)
3755 gradMat<<
"Face CL : "<<face*size1+comp<<endl;
3758 gradMat<<xv(face,i)<<
",";
3760 for (i=0; i<nnz; i++)
3762 gradMat<<som_glob[i]<<
"(";
3764 gradMat<<xs(som_glob[i],ii)<<
",";
3767 gradMat<<gradientMat(compj,i)<<
",";
3775 div<<
"Face CL : "<<face*size1+comp<<endl;
3778 div<<xv(face,i)<<
",";
3780 for (i=0; i<size0; i++)
3786 for (j=0; j<size1; j++)
3787 div<<resu[i*size1+j]<<
",";
3792 res<<
"Face CL : "<<face*size1+comp<<endl;
3795 res<<xv(face,i)<<
",";
3797 for (i=0; i<size0; i++)
3800 for (j=0; j<size1; j++)
3801 test1|=(std::fabs(resuV[i*size1+j])>max);
3809 for (j=0; j<size1; j++)
3810 res<<resu[i*size1+j]<<
",";
3820 resMat<<
"Face CL :"<<face*size1+comp<<endl;
3823 resMat<<xv(face,i)<<
",";
3825 for (i=0; i<size0; i++)
3829 resMat<<xv(i,ii)<<
",";
3831 for (j=0; j<size1; j++)
3832 resMat<<resuMatV[i*size1+j]<<
",";
3843 result<<
"Diff pour face CL : "<<face*size1+comp<<endl;
3846 result<<xv(face,i)<<
",";
3848 for (i=0; i<size0; i++)
3851 for (j=0; j<size1; j++)
3852 test1|=(std::fabs(resuV[i*size1+j])>1.e-14);
3858 result<<xv(i,ii)<<
",";
3860 for (j=0; j<size1; j++)
3861 result <<resuV[i*size1+j]<<
",";
3868 result<<
"Diff pour face CL : "<<face*size1+comp<<endl;
3869 result<<
"Maximum : "<<max<<endl;
3884 const int nb_bords =les_cl.size();
3885 int n_bord=0, num1=0, num2=0;
3886 int face=0, face_associee=0;
3887 int ind_face=0, comp=0;
3889 for (n_bord=0; n_bord<nb_bords; n_bord++)
3901 for (ind_face=num1; ind_face<num2; ind_face++)
3907 if (face<face_associee)
3908 for (comp=0; comp<
dim_ch_; comp++)
int_t size_array() const
Renvoie la taille du tableau en bits.
void setbit(int_t i) const
Met le bit e a 1.
class Champ_Don_Fonc_xyz Cette classe represente un champ de donnees fonction
: class Champ_Don_lu Cette classe represente un champ de donnees que l'on lit dans un fichier avec le...
classe Champ_Fonc_base Classe de base des champs qui sont fonction d'une grandeur calculee
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
classe Champ_base Cette classe est la base de la hierarchie des champs.
classe Champ_front_txyz Classe derivee de Champ_front_var qui represente les
double valeur_au_temps_et_au_point(double temps, int som, double x, double y, double z, int comp) const override
Champ_front_base & champ_front()
classe Cond_lim Classe generique servant a representer n'importe quelle classe
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
static void verifier(const char *const msg, double)
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...
int_t nb_aretes_tot() const
renvoie le nombre d'aretes total (reelles+virtuelles).
virtual const MD_Vector & md_vector_sommets() const
virtual void creer_tableau_elements(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
creation d'un tableau parallele de valeurs aux elements.
DoubleTab_t & les_sommets()
int_t get_renum_som_perio(int_t i) const
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
const DoubleTab_t & coord_sommets() const
virtual void creer_tableau_sommets(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
Cree un tableau ayant une "ligne" par sommet du maillage.
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
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
const DoubleVect & volume_aux_sommets() const
void creer_tableau_aretes(Array_base &, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT) const
virtual const DoubleVect & face_surfaces() const
int nb_faces() const
renvoie le nombre global de faces.
DoubleVect & volumes_entrelaces()
int nb_faces_tot() const
renvoie le nombre total de faces.
virtual double face_normales(int face, int comp) const
double xv(int num_face, int k) const
double volumes(int i) const
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
virtual double surface(int i) const
int est_une_face_virt_bord(int) const
renvoie 1 si face est une face virtuelle de bord, 0 sinon
int nb_som_face() const
renvoie le nombre de sommets par face.
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.
int nb_faces_bord() const
renvoie le nombre de faces sur lesquelles sont appliquees les conditions limites :
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
Classe Echange_externe_impose: Cette classe represente le cas particulier de la classe.
virtual double h_imp(int num) const
Renvoie la valeur du coefficient d'echange de chaleur impose sur la i-eme composante.
virtual double T_ext(int num) const
Renvoie la valeur de la temperature imposee sur la i-eme composante du champ de frontiere.
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Milieu_base & milieu() const =0
Solveur_Masse_base & solv_masse()
Renvoie le solveur de masse associe a l'equation.
virtual const Champ_Inc_base & inconnue() const =0
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual Nature_du_champ nature_du_champ() const
int num_premiere_face() const
int num_face(const int) const
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const auto & get_tab2() const
void dimensionner(int n, _SIZE_ nnz)
Size the matrix with n lines and n columns and nnz zero-values coefficients.
const auto & get_tab1() const
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
int nb_lignes() const override
Return local number of lines (=size on the current proc).
DoubleTab & ajouter_multTab_(const DoubleTab &, DoubleTab &) const override
Operation de multiplication-accumulation (saxpy) matrice matrice (matrice X representee par un tablea...
DoubleVect & porosite_elem()
DoubleVect & porosite_face()
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Une chaine de caractere (Nom) en majuscules.
Un tableau d'objets de la classe Motcle.
Classe Neumann_homogene Cette classe est la classe de base de la hierarchie des conditions aux limite...
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
Classe Neumann_val_ext Cette classe est la classe de base de la hierarchie des conditions.
Classe Neumann Cette classe est la classe de base de la hierarchie des conditions aux limites de type...
virtual double flux_impose(int i) const
Renvoie la valeur du flux impose sur la i-eme composante du champ representant le flux a la frontiere...
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
class Op_Diff_VEF_Face Cette classe represente l'operateur de diffusion
void coeff_matrice_som(const int, IntVect &, DoubleTab &, DoubleTab &, const DoubleVect &, const DoubleTab &, const DoubleTab &, Matrice_Morse &) const
void associer(const Domaine_dis_base &, const Domaine_Cl_dis_base &, const Champ_Inc_base &) override
DoubleTab & corriger_pour_diffusivite(const DoubleTab &, DoubleTab &) const
void liste_face(IntLists &, int &) const
void coeff_matrice_som_symetrie(const int, IntVect &, DoubleTab &, DoubleTab &, const DoubleVect &, const DoubleTab &, const DoubleTab &, Matrice_Morse &) const
void ajouter_contribution_elem(const DoubleTab &, const DoubleVect &, const DoubleTab &, Matrice_Morse &) const
void coeff_matrice_som_CL(const int, IntVect &, DoubleTab &, DoubleTab &, const DoubleVect &, const DoubleTab &, const DoubleTab &, Matrice_Morse &) const
void calculer_dt_stab_som(const DoubleTab &, DoubleTab &) const
DoubleVect & calculer_divergence_aretes(DoubleVect &) const
void calculer_laplacien_som(const DoubleTab &) const
void gradient_som_CL(const int, int &, IntVect &, DoubleTab &) const
void remplir_nu_pA(const DoubleTab &, DoubleTab &) const
void dimensionner(Matrice_Morse &) const override
on dimensionne notre matrice.
void calculer_flux_bords_elem(const DoubleVect &) const
void isInStencil(int, int, int &, int &, int &, int &) const
DoubleVect & calculer_divergence_som(DoubleVect &) const
const Domaine_VEF & domaine_vef() const
void ajouter_contribution_som(const DoubleTab &, const DoubleVect &, const DoubleTab &, Matrice_Morse &) const
DoubleVect & calculer_gradient_elem(const DoubleVect &) const
void calculer_dt_stab_aretes(const DoubleTab &, DoubleTab &) const
double calculer_dt_stab() const override
Calcul dt_stab.
void ajouter_contribution(const DoubleTab &, Matrice_Morse &) const
DoubleTab & calculer(const DoubleTab &, DoubleTab &) const override
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
void remplir_nu_p1(const DoubleTab &, DoubleTab &) const
Calcule la diffusivite "nu_p1" aux sommets du maillage en fonction de la diffusivite "nu_elem" aux el...
void calculer_flux_bords_som(const DoubleVect &) const
DoubleVect & calculer_gradient_som(const DoubleVect &) const
void ajouter_contribution_aretes(const DoubleTab &, const DoubleVect &, const DoubleTab &, Matrice_Morse &) const
void coeff_matrice_som_perio(const int, const int, IntVect &, DoubleTab &, DoubleTab &, const DoubleVect &, const DoubleTab &, const DoubleTab &, Matrice_Morse &) const
void corriger_Cl_test(DoubleTab &) const
DoubleVect & calculer_gradient_aretes(const DoubleVect &) const
void calculer_dt_stab_elem(const DoubleTab &, DoubleTab &) const
DoubleVect & corriger_div_pour_Cl(const DoubleVect &, const DoubleTab &, DoubleVect &) const
void gradient_som(const int face, const int, const int, const int, const int, const int, DoubleTab &) const
void calculer_flux_bords_aretes(const DoubleVect &) const
DoubleVect & calculer_divergence_elem(DoubleVect &) const
void isFaceOfSymetry(ArrOfBit &, int &) const
Op_Diff_VEFP1NCP1B_Face()
Matrice_Morse laplacien_p1_
void completer() override
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
class Op_Diff_VEF_Face Cette classe represente l'operateur de diffusion
const Champ_base & diffusivite() const override
void completer() override
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
int phi_psi_diffuse(const Equation_base &eq) const
definit si on calcule div(phi nu grad Psi) ou div(nu grap Phi psi)
virtual void remplir_nu(DoubleTab &) const
double viscA(int face_i, int face_j, int num_elem, const _TYPE_ &diffu) const
void dimensionner(const Domaine_VEF &, const Domaine_Cl_VEF &, Matrice_Morse &) const
Dimensionnement de la matrice qui devra recevoir les coefficients provenant de la convection,...
void modifier_flux(const Operateur_base &) const
classe Periodique Cette classe represente une condition aux limites periodique.
int face_associee(int i) const
static double mp_min(double)
static bool is_parallel()
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.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
double temps_courant() const
Renvoie le temps courant.
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 de base des flux de sortie.
virtual void declare_support_masse_volumique(int ok)
Le constructeur d'une classe derivee qui se sert de la masse volumique doit appeler cette fonction av...
classe Symetrie Sur les faces de symetrie on a les proprietes suivantes:
void dimensionner(int)
Redimensionne un tableau de listes.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
_TYPE_ local_max_abs_vect(Mp_vect_options opt=VECT_REAL_ITEMS) const
virtual const MD_Vector & get_md_vector() const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")