16#include <Champ_P1NC_implementation.h>
17#include <Dirichlet_paroi_defilante.h>
18#include <Dirichlet_paroi_fixe.h>
19#include <Modele_turbulence_hyd_base.h>
20#include <Champ_Fonc_P1NC.h>
21#include <Equation_base.h>
22#include <distances_VEF.h>
23#include <LecFicDiffuse.h>
24#include <Matrice_Bloc.h>
25#include <TRUSTLists.h>
26#include <Champ_P1NC.h>
27#include <Periodique.h>
33#include <TRUSTArray_kokkos.tpp>
35static int methode_calcul_valeurs_sommets_static = 2 ;
56static const double coeff_penalisation = 1e9;
70 const DoubleTab& ch = cha.
valeurs();
76 DoubleTab& vit_som=cha.
ch_som();
79 DoubleTab secmem(cha.
ch_som());
107 fic.
ouvrir(
"solveur.bar");
111 Cerr <<
Process::me() <<
"solveur.bar ouvert pour lire: " << solv << finl;
115 Cerr<<
"On remplit la matrice cha.MatP1NC2P1_L2 pour le champ "<< cha.
le_nom() <<finl;
119 IntLists voisins(nb_som);
120 DoubleLists coeffs(nb_som);
121 DoubleVect diag(nb_som);
123 for (elem=0; elem<nb_elem_tot; elem++)
125 double coeff_ij=mijK*domaine_VEF.
volumes(elem);
126 double coeff_ii=miiK*domaine_VEF.
volumes(elem);
127 for (
int isom=0; isom<nb_som_elem; isom++)
129 int som=elem_som(elem,isom);
132 for (
int jsom=isom+1; jsom<nb_som_elem; jsom++)
134 int asom=elem_som(elem,jsom);
143 rang=voisins[i].rang(j);
147 coeffs[i].add(coeff_ij);
152 coeffs[i][rang]+=coeff_ij;
162 IntVect test_cl_imposee(nb_som);
165 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
176 for (
int ind_face=num1; ind_face<num2; ind_face++)
183 if (test_cl_imposee(som) == 0)
185 diag[som] += coeff_penalisation;
186 test_cl_imposee(som) += 1;
194 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
205 for (
int ind_face=num1; ind_face<num2; ind_face++)
212 if (test_cl_imposee(som) == 0)
214 diag[som] += coeff_penalisation;
215 test_cl_imposee(som) += 1;
222 for (
int i=0; i<nb_som; i++)
230 mat.
remplir(voisins, coeffs, diag) ;
261 int nb_faces=domaine_VEF.
nb_faces();
263 ArrOfInt virtfait(nb_faces_tot-nb_faces);
270 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
275 int nb_faces_bord = le_bord.
nb_faces();
282 for (
int ind_face=num1; ind_face<num2; ind_face++)
285 if (ind_face-nb_faces_bord>=0) virtfait[face-nb_faces]=1;
286 int elem1=face_voisins(face,0);
287 int elem2=face_voisins(face,1);
288 double volume=domaine_VEF.
volumes(elem1);
290 volume+=domaine_VEF.
volumes(elem2);
291 for(
int isom=0; isom<nb_som_face; isom++)
293 int som=face_sommets(face,isom);
295 for(
int k=0; k<nb_comp; k++)
296 secmem(som1,k)+=0.5*coeff*volume*ch(face,k);
301 for (
int ind_face=num1; ind_face<num2; ind_face++)
304 if (ind_face-nb_faces_bord>=0) virtfait[face-nb_faces]=1;
305 int elem1=face_voisins(face,0);
306 int elem2=face_voisins(face,1);
307 double volume=domaine_VEF.
volumes(elem1);
309 volume+=domaine_VEF.
volumes(elem2);
310 for(
int isom=0; isom<nb_som_face; isom++)
312 int som=face_sommets(face,isom);
314 for(
int k=0; k<nb_comp; k++)
315 secmem(som1,k)+=coeff*volume*ch(face,k);
320 for(face=premiere_face_int; face<nb_faces_tot; face++)
322 int indvirtface=face-nb_faces;
325 if (virtfait[indvirtface]==1)
continue;
327 int elem1=face_voisins(face,0);
328 int elem2=face_voisins(face,1);
329 double volume=domaine_VEF.
volumes(elem1);
331 volume+=domaine_VEF.
volumes(elem2);
332 for(
int isom=0; isom<nb_som_face; isom++)
334 int som=face_sommets(face,isom);
336 for(
int k=0; k<nb_comp; k++)
337 secmem(som1,k)+=coeff*volume*ch(face,k);
351 IntVect test_cl_imposee(nb_som);
355 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
366 for (
int ind_face=num1; ind_face<num2; ind_face++)
369 for(
int isom=0; isom<nb_som_face; isom++)
371 int som=face_sommets(face,isom);
373 for(
int k=0; k<nb_comp; k++)
375 if (test_cl_imposee(som1)==0)
378 secmem(som1,k) += coeff_penalisation * ch(face,k);
380 test_cl_imposee(som1) += 1;
388 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
398 for (
int ind_face=num1; ind_face<num2; ind_face++)
401 for(
int isom=0; isom<nb_som_face; isom++)
403 int som=face_sommets(face,isom);
405 for(
int k=0; k<nb_comp; k++)
407 if (test_cl_imposee(som1)==0)
410 secmem(som1,k) += coeff_penalisation * ch(face,k);
412 test_cl_imposee(som1) += 1;
438 for(
int som=0; som<nb_som; som++)
443 for(
int k=0; k<nb_comp; k++)
446 for(som=0; som<nb_som; som++)
448 solution(som)=vit_som(som,k);
449 secmemk(som)=secmem(som,k);
459 for(som=0; som<nb_som; som++)
486 const DoubleTab& ch = cha.
valeurs();
488 const IntTab& elem_som = dom.
les_elems();
490 DoubleTab& vit_som=cha.
ch_som();
493 DoubleTab secmem(cha.
ch_som());
509 double non_prepare=0;
518 fic.
ouvrir(
"solveur.bar");
522 Cerr <<
Process::me() <<
"solveur.bar ouvert pour lire: " << solv << finl;
526 Cerr<<
"On remplit la matrice cha.MatP1NC2P1_L2 pour le champ "<< cha.
le_nom() <<finl;
530 IntLists voisins(nb_som);
531 DoubleLists coeffs(nb_som);
532 DoubleVect diag(nb_som);
534 for (elem=0; elem<nb_elem_tot; elem++)
536 double coeff_ij=mijK*domaine_VEF.
volumes(elem);
537 double coeff_ii=miiK*domaine_VEF.
volumes(elem);
538 for (
int isom=0; isom<nb_som_elem; isom++)
540 int som=elem_som(elem,isom);
543 for (
int jsom=isom+1; jsom<nb_som_elem; jsom++)
545 int asom=elem_som(elem,jsom);
554 rang=voisins[i].rang(j);
558 coeffs[i].add(coeff_ij);
563 coeffs[i][rang]+=coeff_ij;
571 for (
int i=0; i<nb_som; i++)
577 mat.
remplir(voisins, coeffs, diag) ;
608 int nb_faces=domaine_VEF.
nb_faces();
610 ArrOfInt virtfait(nb_faces_tot-nb_faces);
616 for(face=0; face<nb_faces_tot; face++)
618 int indvirtface=face-nb_faces;
621 if (virtfait[indvirtface]==1)
continue;
623 int elem1=face_voisins(face,0);
624 int elem2=face_voisins(face,1);
625 double volume=domaine_VEF.
volumes(elem1);
627 volume+=domaine_VEF.
volumes(elem2);
628 for(
int isom=0; isom<nb_som_face; isom++)
630 int som=face_sommets(face,isom);
635 for(
int k=0; k<nb_comp; k++)
636 secmem(som1,k)+=coeff*volume*ch(face,k);
658 for(
int som=0; som<nb_som; som++)
663 for(
int k=0; k<nb_comp; k++)
666 for(som=0; som<nb_som; som++)
668 solution(som)=vit_som(som,k);
669 secmemk(som)=secmem(som,k);
679 for(som=0; som<nb_som; som++)
706 const Domaine& domaine = dom;
708 int nb_som = domaine.nb_som();
709 int nb_som_elem = domaine.nb_som_elem();
710 const DoubleTab& ch = cha.
valeurs();
714 const IntTab& elem_som = domaine.les_elems();
715 const IntTab& elem_faces=domaine_VEF.
elem_faces();
717 int nb_comp=
ch_som.dimension(1);
731 static double diag_ref;
732 double non_prepare=0;
739 if(fic.
ouvrir(
"solveur.bar"))
747 IntLists voisins(nb_som);
748 DoubleLists coeffs(nb_som);
749 DoubleVect diag(nb_som);
750 for (elem=0; elem<nb_elem_tot; elem++)
752 double volume=domaine_VEF.
volumes(elem);
753 for (
int isom=0; isom<nb_som_elem; isom++)
755 int facei=elem_faces(elem,isom);
757 for (
int jsom=isom+1; jsom<nb_som_elem; jsom++)
759 int facej=elem_faces(elem,jsom);
762 for(
int k=0; k<dimension; k++)
763 coeffij+=normales(facei,k)*normales(facej,k);
767 coeffij*=mijK/volume;
775 rang=voisins[ii].rang(jj);
779 coeffs[ii].add(coeffij);
784 coeffs[ii][rang]+=coeffij;
792 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
798 int num2 = num1 + le_bord.
nb_faces();
800 for (
int face=num1; face<num2; face++)
803 for(
int isom=0; isom<dimension; isom++)
807 diag[som]=1.e1*diag_ref;
813 mat.
remplir(voisins, coeffs, diag) ;
822 double coeff=-1./dimension;
824 for(
int comp=0; comp<nb_comp; comp++)
827 DoubleVect secmem(nb_som);
828 DoubleVect solution(nb_som);
829 for (elem=0; elem<nb_elem_tot; elem++)
832 double volume=domaine_VEF.
volumes(elem);
833 for (
int isom=0; isom<nb_som_elem; isom++)
835 int facei=elem_faces(elem,isom);
837 for (
int jsom=0; jsom<nb_som_elem; jsom++)
839 int facej=elem_faces(elem,jsom);
841 for(k=0; k<dimension; k++)
842 coeffij+=normales(facei,k)*normales(facej,k);
845 coeffij*=coeff/volume;
846 secmem(i)+=coeffij*ch(facej,comp);
850 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
856 int num2 = num1 + le_bord.
nb_faces();
858 for (
int face=num1; face<num2; face++)
861 for(
int isom=0; isom<dimension; isom++)
873 for(
int som=0; som<nb_som; som++)
889 DoubleTab xv=domaine_VEF.
xv();
890 Cerr <<
"TEST filtrer_H1 solution = " << mp_norme_vect(xv) << finl;
892 xv-=domaine_VEF.
xv();
893 Cerr <<
"TEST filtrer_H1 erreur = " << mp_norme_vect(xv) << finl;
894 Cerr <<
"err = " << xv
895 <<
"domaine_VEF.xv() " << domaine_VEF.
xv() << finl;
899 Cerr <<
"erreur sur les constantes : " << mp_norme_vect(xv) << finl;
905 DoubleTab valeurs_fac(cha.
valeurs());
908 DoubleTab vit_som(nb_som, nb_comp);
913 for(
int face=0; face<nb_faces; face++)
920 for(
int comp=0; comp<nb_comp; comp++)
923 somme+=(vit_som(s1,comp)+vit_som(s2,comp));
925 somme+=vit_som(s3,comp);
926 valeurs(face, comp)=coeff*somme;
934 const Domaine& dom=domaine_VEF.
domaine();
941 Cerr<<
"on ne doit pas filtre_L2 des champs qui ne sont pas de type P1NC"<<finl;
969 const Domaine& domchF = domaine_VE_chF.
domaine();
970 const IntTab& face_voisins = domaine_VE_chF.
face_voisins();
971 const IntTab& elem_faces = domaine_VE_chF.
elem_faces();
973 int nb_cl=les_cl.size();
975 int num_cl,fac,ind_fac;
978 double norm_v,val0,val1,val2,norm_tau,u_tau;
980 for (num_cl=0; num_cl<nb_cl; num_cl++)
983 const Cond_lim& la_cl = les_cl[num_cl];
990 for (ind_fac=ndeb; ind_fac<nfin ; ind_fac++)
992 fac = la_front_dis.
num_face(ind_fac);
993 int elem = face_voisins(fac,0);
997 num[0]=elem_faces(elem,0);
998 num[1]=elem_faces(elem,1);
999 if (num[0]==fac) num[0]=elem_faces(elem,2);
1000 else if (num[1]==fac) num[1]=elem_faces(elem,2);
1002 norm_v=norm_2D_vit1_lp(valeurs,fac,num[0],num[1],domaine_VE_chF,val0,val1);
1003 norm_tau=sqrt(tau_tan(fac,0)*tau_tan(fac,0)+tau_tan(fac,1)*tau_tan(fac,1));
1004 u_tau=sqrt(norm_tau);
1016 valeurs(fac,0)=(norm_v-u_tau/kappa)*val0;
1017 valeurs(fac,1)=(norm_v-u_tau/kappa)*val1;
1025 num[0]=elem_faces(elem,0);
1026 num[1]=elem_faces(elem,1);
1027 num[2]=elem_faces(elem,2);
1028 if (num[0]==fac) num[0]=elem_faces(elem,3);
1029 else if (num[1]==fac) num[1]=elem_faces(elem,3);
1030 else if (num[2]==fac) num[2]=elem_faces(elem,3);
1032 norm_v=norm_3D_vit1_lp(valeurs,fac,num[0],num[1],num[2],domaine_VE_chF,val0,val1,val2);
1033 norm_tau=sqrt(tau_tan(fac,0)*tau_tan(fac,0)+tau_tan(fac,1)*tau_tan(fac,1)+tau_tan(fac,2)*tau_tan(fac,2));
1034 u_tau=sqrt(norm_tau);
1046 valeurs(fac,0)=(norm_v-u_tau/kappa)*val0;
1047 valeurs(fac,1)=(norm_v-u_tau/kappa)*val1;
1048 valeurs(fac,2)=(norm_v-u_tau/kappa)*val2;
1068 DoubleTab valeurs_fac(cha.
valeurs());
1085 valeurs_fac=valeurs;
1087 for(
int face=0; face<nb_faces; face++)
1096 for(
int comp=0; comp<nb_comp; comp++)
1102 valeurs(face, comp)=coeff*somme;
1114 double non_prepare=0;
1121 DoubleTab vit_som_sa=cha.
ch_som();
1130 const Domaine& dom =domaine_VEF.
domaine();
1136 DoubleTab resu_som(cha.
ch_som());
1139 ArrOfInt virtfait(nb_faces_tot-nb_faces);
1144 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
1149 int nb_faces_bord = le_bord.
nb_faces();
1151 int num2 = nb_faces_tot_bord;
1157 IntVect fait(nb_faces_tot_bord);
1158 for (ind_face=num1; ind_face<num2; ind_face++)
1161 if (fait(ind_face) == 0)
1164 if (ind_face-nb_faces_bord>=0) virtfait[face-nb_faces]=1;
1166 fait(face_associee) = 1;
1167 if (ind_face-nb_faces_bord>=0)
1169 face_associee = le_bord.
num_face(face_associee);
1170 virtfait[face_associee-nb_faces]=1;
1175 int som=face_sommets(face,isom);
1177 for (
int comp=0; comp<nb_comp; comp++)
1178 resu_som(som, comp)+=coeff*resu(face, comp);
1186 for (ind_face=num1; ind_face<num2; ind_face++)
1189 if (ind_face-nb_faces_bord>=0) virtfait[face-nb_faces]=1;
1192 int som=face_sommets(face,isom);
1194 for (
int comp=0; comp<nb_comp; comp++)
1195 resu_som(som, comp)+=coeff*resu(face, comp);
1205 for(face=deb; face<nb_faces_tot; face++)
1207 int indvirtface=face-nb_faces;
1210 if (virtfait[indvirtface]==1)
continue;
1213 int som=face_sommets(face,isom);
1215 for(
int comp=0; comp<nb_comp; comp++)
1216 resu_som(som, comp)+=coeff*resu(face, comp);
1233 test_cl_imposee = 0;
1235 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
1245 for (ind_face=num1; ind_face<num2; ind_face++)
1248 double vol=volumes_entrelaces(face);
1251 int som=face_sommets(face,isom);
1253 for (
int comp=0; comp<nb_comp; comp++)
1255 if (test_cl_imposee(som)==0)
1256 resu_som(som,comp) = 0;
1257 resu_som(som, comp) += coeff_penalisation * resu(face, comp)/vol;
1259 test_cl_imposee(som) += 1;
1281 for(
int k=0; k<nb_comp; k++)
1284 for(i=0; i<nbs; i++)
1285 secmem(i)=resu_som(i,k);
1291 for(i=0; i<nbs; i++)
1292 resu_som(i,k)=solution(i);
1297 for(face=0; face<nb_faces; face++)
1302 for(
int comp=0; comp<nb_comp; comp++)
1303 resu(face, comp)+=coeff*resu_som(som, comp);
1308 for(face=0; face<nb_faces; face++)
1310 double vol=volumes_entrelaces(face);
1311 for(
int comp=0; comp<nb_comp; comp++)
1312 resu(face, comp)*=vol;
1326 const IntTab& sommet_poly = domaine_geom.
les_elems();
1327 const IntTab& elem_faces=domaine_VEF.
elem_faces();
1328 const DoubleTab& ch = cha.
valeurs();
1333 const double xs = position(0), ys = position(1),
1334 zs = (D == 3) ? position(2) : 0;
1335 for (
int i = 0; i < D + 1; i++)
1337 const int f = elem_faces(le_poly, i);
1338 for(
int n = 0; n < N; n++)
1339 val(n) += ch(f, n) * ((D == 2) ?
fonction_forme_2D(xs, ys, le_poly, i, sommet_poly, coord) :
fonction_forme_3D(xs, ys, zs, le_poly, i, sommet_poly, coord));
1354 const IntTab& sommet_poly = domaine_geom.
les_elems();
1355 const IntTab& elem_faces=domaine_VEF.
elem_faces();
1356 const DoubleTab& ch = cha.
valeurs();
1362 const double xs = position(0), ys = position(1),
1363 zs = (D == 3) ? position(2) : 0;
1364 for (
int i = 0; i < D + 1; i++)
1366 const int f = elem_faces(le_poly,i);
1367 val += ch(f, ncomp) * ((D == 2) ?
fonction_forme_2D(xs, ys, le_poly, i, sommet_poly, coord) :
fonction_forme_3D(xs, ys, zs, le_poly, i, sommet_poly, coord));
1396 int nb_compo_ = cha.
nb_comp();
1398 if (domaine_VEF.
domaine() != dom)
Process::exit(
"Error, you must use valeur_aux_centres_de_gravite() on the whole discretized mesh.");
1399 if (tab_val.
nb_dim() > 2)
1401 Cerr <<
"Erreur TRUST dans Champ_P1NC_implementation::valeur_aux_elems()\n";
1402 Cerr <<
"Le DoubleTab val a plus de 2 entrees\n";
1413 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
1414 DoubleTabView val = tab_val.
view_wo();
1415 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0,0}, {nb_elem,nb_compo_}), KOKKOS_LAMBDA(
const int le_poly,
const int ncomp)
1418 for (
int i = 0; i < D + 1; i++)
1420 int face = elem_faces(le_poly, i);
1421 sum += ch(face, ncomp);
1423 val(le_poly, ncomp) = sum / (D + 1);
1425 end_gpu_timer(__KERNEL_NAME__);
1431 const IntVect& les_polys,
1432 DoubleTab& tab_val)
const
1434 if (les_polys.
size() == 0)
return tab_val;
1438 Cerr <<
"Warning, Champ_P1NC_implementation::valeur_aux_elems(...) called whereas call to Champ_P1NC_implementation::valeur_aux_centres_de_gravite(...) could be more efficient!" << finl;
1442 const DoubleTab& ch = cha.
valeurs();
1446 const IntTab& sommet_poly = domaine_geom.
les_elems();
1447 if (tab_val.
nb_dim() > 2)
1449 Cerr <<
"Erreur TRUST dans Champ_P1NC_implementation::valeur_aux_elems()\n";
1450 Cerr <<
"Le DoubleTab val a plus de 2 entrees\n";
1459 CIntTabView sommet_poly_v = sommet_poly.
view_ro();
1460 CDoubleTabView coord_v = coord.
view_ro();
1461 CDoubleTabView ch_v = ch.
view_ro();
1462 CIntTabView elem_faces_v = domaine_VEF.
elem_faces().view_ro();
1463 CDoubleTabView positions_v = positions.
view_ro();
1464 CIntArrView les_polys_v = les_polys.view_ro();
1465 DoubleTabView val = tab_val.
view_wo();
1466 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0,0}, {les_polys.
size(),nb_compo_}), KOKKOS_LAMBDA(
1467 const int rang_poly,
const int ncomp)
1469 int le_poly=les_polys_v(rang_poly);
1471 val(rang_poly, ncomp) = 0;
1474 double xs = positions_v(rang_poly,0);
1475 double ys = positions_v(rang_poly,1);
1476 double zs = (D == 3) ? positions_v(rang_poly,2) : 0;
1478 for (
int i = 0; i < D + 1; i++)
1480 int face = elem_faces_v(le_poly, i);
1481 sum += ch_v(face, ncomp) *
1482 ((D == 2) ?
fonction_forme_2D_v(xs, ys, le_poly, i, sommet_poly_v, coord_v) :
fonction_forme_3D_v(xs, ys, zs, le_poly, i, sommet_poly_v, coord_v));
1484 val(rang_poly, ncomp) = sum;
1487 end_gpu_timer(__KERNEL_NAME__);
1493 const IntVect& les_polys,
1494 DoubleVect& val,
int ncomp)
const
1496 if (les_polys.
size() == 0)
return val;
1497 int les_polys_size = les_polys.
size();
1504 const IntTab& sommet_poly = domaine_geom.
les_elems();
1509 const DoubleTab& ch = cha.
valeurs();
1510 ToDo_Kokkos(
"critical");
1511 for(
int rang_poly=0; rang_poly<les_polys_size; rang_poly++)
1513 le_poly=les_polys(rang_poly);
1514 if (le_poly == -1) val(rang_poly) = 0;
1519 xs = positions(rang_poly,0);
1520 ys = positions(rang_poly,1);
1521 zs = (D == 3) ? positions(rang_poly,2) : 0.;
1522 for (
int i=0; i < D + 1; i++)
1525 val(rang_poly) += ch(face, ncomp) *
1538 const IntVect& les_polys,
1543 Cerr <<
"L'option chsom des sondes ne s'applique pour le moment que pour les Champ_P1NC en VEF" << finl;
1546 Cerr <<
"TRUST a provoque une erreur et va s'arreter" << finl;
1552 const DoubleTab& ch_sommet= (
ch_som());
1555 const Domaine& dom=domaine_VEF.
domaine();
1557 const IntTab& sommet_poly = domaine_geom.
les_elems();
1565 Cerr <<
"Erreur TRUST dans Champ_P1NC_implementation::valeur_aux_elems_smooth()\n";
1566 Cerr <<
"Le DoubleTab val a plus de 2 entrees\n";
1575 DoubleTab val_sauv=cha.
valeurs();
1585 ToDo_Kokkos(
"critical");
1586 for(
int rang_poly=0; rang_poly<les_polys_size; rang_poly++)
1587 if ((p = les_polys(rang_poly)) != -1)
1589 const double xs = positions(rang_poly,0), ys = positions(rang_poly,1),
1590 zs = (D == 3) ? positions(rang_poly,2) : 0.;
1591 for(
int ncomp=0; ncomp<nb_compo_; ncomp++)
1592 for (
int i = 0; i < D + 1; i++)
1594 int som = sommet_poly(p, i);
1596 val(rang_poly, ncomp) += ch_sommet(som1, ncomp) * ((D == 2) ?
coord_barycentrique(sommet_poly, coord, xs, ys, p, i) :
coord_barycentrique(sommet_poly, coord, xs, ys, zs, p, i));
1605 const IntVect& les_polys,
1606 DoubleVect& val,
int ncomp)
1610 Cerr <<
"L'option chsom des sondes ne s'applique pour le moment que pour les Champ_P1NC en VEF" << finl;
1613 Cerr <<
"TRUST a provoque une erreur et va s'arreter" << finl;
1618 const DoubleTab& ch_sommet= (
ch_som());
1620 const Domaine& dom=domaine_VEF.
domaine();
1623 const IntTab& sommet_poly = domaine_geom.
les_elems();
1630 DoubleTab val_sauv=cha.
valeurs();
1641 ToDo_Kokkos(
"critical");
1642 for(
int rang_poly=0; rang_poly<les_polys_size; rang_poly++)
1643 if ((p = les_polys(rang_poly)) != -1)
1645 const double xs = positions(rang_poly,0), ys = positions(rang_poly,1),
1646 zs = (D == 3) ? positions(rang_poly,2) : 0.;
1647 for (
int i = 0; i < D + 1; i++)
1649 int som = sommet_poly(p, i);
1651 val(rang_poly) += ch_sommet(som1, ncomp)
1652 * ((D == 2) ?
coord_barycentrique(sommet_poly, coord, xs, ys, p, i) :
coord_barycentrique(sommet_poly, coord, xs, ys, zs, p, i));
1660 DoubleTab& tab_champ_som)
const
1665 IntTrav tab_compteur(nb_som);
1669 if (methode_calcul_valeurs_sommets_static>0)
1674 DoubleTrav tab_min_som(nb_som,nb_compo_) ;
1675 DoubleTrav tab_max_som(nb_som,nb_compo_) ;
1677 tab_min_som = 1.e+30;
1678 tab_max_som = 1.e-30;
1679 if (getenv(
"TRUST_FIX_P1NC_POST_SOM")!=
nullptr) tab_max_som = -1.e+30;
1684 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
1687 IntArrView compteur =
static_cast<ArrOfInt&
>(tab_compteur).view_rw();
1688 DoubleTabView champ_som = tab_champ_som.
view_rw();
1689 DoubleTabView min_som = tab_min_som.
view_rw();
1690 DoubleTabView max_som = tab_max_som.
view_rw();
1691 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0,0}, {nb_elem_tot,nb_som_elem}), KOKKOS_LAMBDA(
1692 const int num_elem,
const int j)
1694 int num_som = sommet_elem(num_elem, j);
1695 if (num_som < nb_som_return)
1697 Kokkos::atomic_inc(&compteur(num_som));
1698 for (
int ncomp = 0; ncomp < nb_compo_; ncomp++)
1700 Kokkos::atomic_add(&champ_som(num_som, ncomp),
valeur_a_sommet_compo(num_som, num_elem, ncomp, elem_faces, sommet_elem, ch));
1701 for (
int face_adj = 0; face_adj < nb_som_elem; face_adj++)
1705 int face_glob = elem_faces(num_elem, face_adj);
1706 Kokkos::atomic_min(&min_som(num_som, ncomp), ch(face_glob, ncomp));
1707 Kokkos::atomic_max(&max_som(num_som, ncomp), ch(face_glob, ncomp));
1713 end_gpu_timer(__KERNEL_NAME__);
1717 int methode_calcul_valeurs_sommets = methode_calcul_valeurs_sommets_static;
1718 CDoubleTabView min_som = tab_min_som.
view_ro();
1719 CDoubleTabView max_som = tab_max_som.
view_ro();
1720 CIntArrView compteur =
static_cast<ArrOfInt&
>(tab_compteur).view_ro();
1721 DoubleTabView champ_som = tab_champ_som.
view_rw();
1722 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::MDRangePolicy<Kokkos::Rank<2>>({0,0}, {nb_som_return,nb_compo_}), KOKKOS_LAMBDA(
1723 const int num_som,
const int ncomp)
1725 if (compteur(num_som)>0)
1727 champ_som(num_som, ncomp) /= compteur(num_som);
1728 if (methode_calcul_valeurs_sommets > 1)
1730 if (champ_som(num_som, ncomp) < min_som(num_som, ncomp))
1731 champ_som(num_som, ncomp) = min_som(num_som, ncomp);
1732 if (champ_som(num_som, ncomp) > max_som(num_som, ncomp))
1733 champ_som(num_som, ncomp) = max_som(num_som, ncomp);
1737 end_gpu_timer(__KERNEL_NAME__);
1742 assert(methode_calcul_valeurs_sommets_static==-1);
1745 int nb_comp=nb_compo_;
1750 ToDo_Kokkos(
"critical");
1751 for(
int face=0; face<nb_faces_tot; face++)
1754 for(
int isom=0; isom<nb_som_face; isom++)
1756 int som1=face_sommets(face,isom);
1757 if (som1<nb_som_return)
1759 tab_compteur[som1]++;
1760 for(
int k=0; k<nb_comp; k++)
1761 tab_champ_som(som1,k)+=ch(face,k);
1767 for (
int num_som=0; num_som<nb_som_return; num_som++)
1768 for (
int ncomp=0; ncomp<nb_compo_; ncomp++)
1770 tab_champ_som(num_som,ncomp) /= tab_compteur[num_som];
1773 return tab_champ_som;
1786 int face = elem_faces(num_elem,i);
1787 if (sommet_elem(num_elem,i)==num_som)
1790 val += ch(face, ncomp);
1796KOKKOS_INLINE_FUNCTION
1802 int nb_som = (int)sommet_elem.extent(1);
1803 for (
int i=0; i<nb_som; i++)
1805 int face = elem_faces(num_elem,i);
1806 if (sommet_elem(num_elem,i)==num_som)
1807 val -= (nb_som-2)*ch(face, ncomp);
1809 val += ch(face, ncomp);
1839 DoubleVect& champ_som,
1847 int nb_som = dom.
nb_som();
1849 IntVect compteur(nb_som);
1850 if (methode_calcul_valeurs_sommets_static>0)
1854 int num_elem,num_som,j;
1857 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1860 DoubleVect min_som(nb_som) ;
1861 DoubleVect max_som(nb_som) ;
1862 int face_adj,face_glob;
1864 for (j=0; j<nb_som; j++)
1866 min_som(j) = 1.e+30 ;
1867 max_som(j) = 1.e-30 ;
1869 ToDo_Kokkos(
"critical");
1870 for (num_elem=0; num_elem<nb_elem_tot; num_elem++)
1872 for (j=0; j<nb_som_elem; j++)
1875 if(num_som < nb_som)
1877 compteur[num_som]++;
1881 for(face_adj=0; face_adj<nb_som_elem; face_adj ++)
1885 face_glob = elem_faces(num_elem, face_adj);
1886 min_som(num_som) = std::min
1887 ( ch(face_glob,ncomp),min_som(num_som) ) ;
1888 max_som(num_som) = std::max
1889 ( ch(face_glob,ncomp),max_som(num_som) ) ;
1896 ToDo_Kokkos(
"critical");
1897 for (num_som=0; num_som<nb_som; num_som++)
1899 champ_som(num_som) /= compteur[num_som];
1900 if (methode_calcul_valeurs_sommets_static>1)
1902 if ( champ_som(num_som) < min_som(num_som) ) champ_som(num_som) = min_som(num_som) ;
1903 if ( champ_som(num_som) > max_som(num_som) ) champ_som(num_som) = max_som(num_som) ;
1916 ToDo_Kokkos(
"critical");
1917 for(face=0; face<nb_faces_tot; face++)
1920 for(
int isom=0; isom<nb_som_face; isom++)
1922 int som1=face_sommets(face,isom);
1926 champ_som(som1)+=ch(face,ncomp);
1931 ToDo_Kokkos(
"critical");
1932 for (
int num_som=0; num_som<nb_som; num_som++)
1934 champ_som(num_som) /= compteur[num_som];
1944 const DoubleTab& xv = zvef.
xv();
1950 Cerr <<
"Erreur dans Champ_P1NC_implementation::remplir_coord_noeuds()" << finl;
1951 Cerr <<
"Les centres de gravite des faces n'ont pas ete calcules" << finl;
1959 IntVect& polys)
const
1966 ToDo_Kokkos(
"critical");
1967 for(
int i= 0; i< nb_faces; i++)
1969 polys(i)=face_voisins(i, 0);
1977 const DoubleTab& pos_face=domaine_VEF.
xv();
1978 const int nb_faces = domaine_VEF.
nb_faces();
1980 const DoubleTab& val = cha.
valeurs();
1982 os << nb_faces << finl;
1983 for (fac=0; fac<nb_faces; fac++)
1986 os << pos_face(fac,0) <<
" " << pos_face(fac,1) <<
" " << pos_face(fac,2) <<
" " ;
1988 os << pos_face(fac,0) <<
" " << pos_face(fac,1) <<
" " ;
1989 os << val(fac,ncomp) << finl;
1992 Cout <<
"Champ_P1NC_implementation::imprime_P1NC FIN >>>>>>>>>> " << finl;
2051 const auto& tab1 = la_matrice.
get_tab1();
2052 const auto& tab2 = la_matrice.
get_tab2();
2054 matrice_tmp.typer(
"Matrice_Bloc");
2057 matrice.
get_bloc(0,0).typer(
"Matrice_Morse_Sym");
2058 matrice.
get_bloc(0,1).typer(
"Matrice_Morse");
2070 IntVect compteur_MBrr(n2);
2071 IntVect compteur_MBrv(n2);
2078 for (iligne=0; iligne<n2; iligne++)
2080 for (
auto k=tab1(iligne)-1; k<tab1(iligne+1)-1; k++)
2082 jcolonne = tab2(k)-1;
2086 if ((jcolonne >= iligne) && (jcolonne < n2))
2089 compteur_MBrr(iligne)++;
2095 compteur_MBrv(iligne)++;
2104 for(
int i=0; i<n2; i++)
2106 tab1RR(i+1)=compteur_MBrr(i)+tab1RR(i);
2107 tab1RV(i+1)=compteur_MBrv(i)+tab1RV(i);
2114 for (iligne=0; iligne<n2; iligne++)
2116 auto compteurRR = tab1RR(iligne)-1;
2117 auto compteurRV = tab1RV(iligne)-1;
2118 for (
auto k=tab1(iligne)-1; k<tab1(iligne+1)-1; k++)
2120 jcolonne = tab2(k)-1;
2124 if ((jcolonne >= iligne) && (jcolonne < n2))
2127 tab2RR(compteurRR) = tab2(k);
2134 tab2RV(compteurRV) = tab2(k)-n2;
2161 DoubleTab ligne_tmp(n1);
2162 for(
int i=0; i<n2; i++)
2166 for (
auto k=la_matrice.
get_tab1()(i)-1; k<la_matrice.
get_tab1()(i+1)-1; k++)
2170 for (
auto k=tab1RR(i)-1; k<tab1RR(i+1)-1; k++)
2171 coeffRR[k] = ligne_tmp(tab2RR[k] - 1);
2174 for (
auto k=tab1RV(i)-1; k<tab1RV(i+1)-1; k++)
2175 coeffRV[k] = ligne_tmp(n2 + tab2RV[k] - 1);
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
const Domaine_VEF & domaine_vef() const override
const Domaine & domaine() const
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
int fixer_nb_valeurs_nodales(int)
double valeur_a_sommet_compo(int num_som, int le_poly, int ncomp) const
DoubleTab & valeur_aux_sommets(const Domaine &dom, DoubleTab &ch_som) const override
virtual const Domaine_VEF & domaine_vef() const =0
Matrice_Morse_Sym MatP1NC2P1_L2
double valeur_a_elem_compo(const DoubleVect &position, int le_poly, int ncomp) const override
friend DoubleTab & valeur_P1_H1(const Champ_P1NC &, const Domaine &, DoubleTab &)
int imprime_P1NC(Sortie &, int) const
DoubleVect & valeur_aux_elems_compo(const DoubleTab &positions, const IntVect &les_polys, DoubleVect &valeurs, int ncomp) const override
DoubleTab & remplir_coord_noeuds(DoubleTab &positions) const override
DoubleVect & valeur_aux_elems_compo_smooth(const DoubleTab &positions, const IntVect &les_polys, DoubleVect &valeurs, int ncomp)
double coord_barycentrique(const IntTab &sommet_poly, const DoubleTab &coord, double x, double y, int le_poly, int face) const
double fonction_forme_3D(double x, double y, double z, int le_poly, int face, const IntTab &sommet_poly, const DoubleTab &coord) const
int filtrer_L2_deja_appele_
Champ_P1NC_implementation()
void dimensionner_Mat_Bloc_Morse_Sym(Matrice &matrice_tmp)
DoubleVect & valeur_aux_sommets_compo(const Domaine &dom, DoubleVect &ch_som, int ncomp) const override
DoubleVect & ch_som_vect()
void filtrer_H1(DoubleTab &) const
int remplir_coord_noeuds_et_polys(DoubleTab &positions, IntVect &polys) const override
void Mat_Morse_to_Mat_Bloc(Matrice &matrice_tmp)
void filtrer_resu(DoubleTab &) const
DoubleTab & valeur_aux_elems_smooth(const DoubleTab &positions, const IntVect &les_polys, DoubleTab &valeurs)
KOKKOS_INLINE_FUNCTION double fonction_forme_3D_v(double x, double y, double z, int le_poly, int face, CIntTabView sommet_poly, CDoubleTabView coord) const
DoubleTab & valeur_aux_centres_de_gravite(const Domaine &, DoubleTab &valeurs) const
Computes values at the centers of gravity for a P1NC field.
DoubleTab & valeur_aux_elems(const DoubleTab &positions, const IntVect &les_polys, DoubleTab &valeurs) const override
friend int test(Champ_P1NC &, const Domaine &)
friend DoubleTab & valeur_P1_L2(Champ_P1NC &, const Domaine &)
Projection du champ P1NC "cha" sur l'espace des champs P1.
Matrice_Morse_Sym MatP1NC2P1_H1
const Matrice_Morse_Sym & get_MatP1NC2P1_L2() const
Matrice MatP1NC2P1_L2_Parallele
KOKKOS_INLINE_FUNCTION double fonction_forme_2D_v(double x, double y, int le_poly, int face, CIntTabView sommet_poly, CDoubleTabView coord) const
void filtrer_L2(DoubleTab &) const
double fonction_forme_2D(double x, double y, int le_poly, int face, const IntTab &sommet_poly, const DoubleTab &coord) const
DoubleVect & valeur_a_elem(const DoubleVect &position, DoubleVect &val, int le_poly) const override
double valeur_a_sommet_compo(int num_som, int le_poly, int ncomp) const override
renvoi la compo eme corrdonne des valeurs a l'element le_poly au sommet sommet
const Domaine_VEF & domaine_vef() const override
virtual DoubleTab & valeurs()=0
classe Champ_base Cette classe est la base de la hierarchie des champs.
const Domaine & get_domaine_geom() const
virtual Champ_base & le_champ()=0
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_paroi_fixe Represente une paroi immobile dans une equation de type Navier_Stokes.
int nb_som_elem() const
Renvoie le nombre de sommets des elements geometriques constituants le domaine.
int_t nb_elem_tot() const
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.
int_t sommet_elem(int_t i, int j) const
Renvoie le numero (global) du j-ieme sommet du i-ieme element.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
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.
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 oriente_normale(int f, int e) const
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.
const Domaine & domaine() const
Fichier en lecture Cette classe est a la classe C++ ifstream ce que la classe Entree est a la.
virtual int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::in)
const Nom & le_nom() const override
Renvoie le nom de l'equation.
virtual const RefObjU & get_modele(Type_modele type) const
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
const Nom & le_nom() const override
Renvoie le nom du champ.
virtual int nb_comp() const
int num_premiere_face() const
int num_face(const int) const
Cette classe implemente les operateurs et les methodes virtuelles de la classe EFichier de la facon s...
int ouvrir(const char *name, IOS_OPEN_MODE mode=ios::in) override
Ouverture du fichier.
virtual void dimensionner(int N, int M)
virtual const Matrice & get_bloc(int i, int j) const
Classe Matrice_Morse_Sym Represente une matrice M (creuse) symetrique stockee au format Morse.
void compacte(int elim_coeff_nul=0)
Suppression des doublons on ordonne tab2;.
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
const auto & get_coeff() const
void remplir(const IntLists &, const DoubleLists &, const DoubleVect &)
int nb_lignes() const override
Return local number of lines (=size on the current proc).
void set_est_definie(int)
Classe Matrice Classe generique de la hierarchie des matrices.
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
bool utiliser_loi_paroi() const
const Turbulence_paroi_base & loi_paroi() const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
classe Periodique Cette classe represente une condition aux limites periodique.
int face_associee(int i) const
static double mp_min(double)
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.
class SolveurSys Un SolveurSys represente n'importe qu'elle classe
int resoudre_systeme(const Matrice_Base &matrice, const DoubleVect &secmem, DoubleVect &solution)
Classe de base des flux de sortie.
virtual void ref(const TRUSTTab &)
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_wo()
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
_SIZE_ dimension(int d) const
_SIZE_ size_totale() const
_SIZE_ size_reelle() const
void resize(_SIZE_, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
const Objet_U & valeur() const
Classe Turbulence_paroi_base Classe de base pour la hierarchie des classes representant les modeles.
const DoubleTab & Cisaillement_paroi() const