17#include <Op_Conv_DI_L2_VEF_Face.h>
18#include <Champ_P1NC.h>
19#include <Schema_Temps_base.h>
20#include <Periodique.h>
21#include <Neumann_sortie_libre.h>
53void flora(DoubleTab A,
int& N , DoubleVect B, DoubleVect& U,
int& test_flora)
58 int m, m1, i, i1, k, l;
63 if(std::fabs(A(m,m)) > 1e-20)
69 A(i,k) =A(i,k)-quo*A(m,k);
75 Cerr<<
"Error flora: non-invertible matrix at index "<<m<<finl;
80 if(std::fabs(A(N-1,N-1)) >= 1e-20)
82 U(N-1) = B(N-1)/A(N-1,N-1);
90 U(i) = (B(i)-SU)/A(i,i);
95 Cerr<<
"Error flora: non-invertible matrix at index"<<N-1<<finl;
101void flora_p(DoubleTab& A,
int& N, DoubleVect& B, DoubleVect& U,
int& test_flora)
106 int m, m1, i, j, i1, k, l;
108 double quo, SU, x, y;
112 if(std::fabs(A(m,m)) >= 1.e-10)
118 A(i,k) =A(i,k)-quo*A(m,k);
119 B(i) = B(i)-quo*B(m);
125 while(j<N && test == 0)
127 if(std::fabs(A(m,j)) >= 1.e-10) test =1;
132 Cerr<<
"Error flora: non-invertible matrix at index "<<m<<finl;
152 if(std::fabs(A(N-1,N-1)) >= 1.e-10)
154 U(N-1) = B(N-1)/A(N-1,N-1);
162 U(i) = (B(i)-SU)/A(i,i);
173void qrdcmp(DoubleTab& A,
int& N, DoubleVect& C, DoubleVect& D,
int& sing)
181 double scale, sigma, sum, tau;
187 if(scale < std::fabs(A(i,k))) scale = std::fabs(A(i,k));
188 if(std::fabs(scale)<1.e-15)
191 Cerr <<
" huhu " << finl ;
199 for(i=k; i<N; i++) A(i,k) /= scale;
200 for(sum=0.0,i=k; i<N; i++) sum += (A(i,k) * A(i,k));
201 if(A(k,k)>0) sigma = sqrt(sum);
202 else sigma = -1*sqrt(sum);
205 D(k) = -1*scale*sigma;
208 for(sum=0.0,i=k; i<N; i++) sum += A(i,k)*A(i,j);
210 for(i=k; i<N; i++) A(i,j) -= tau*A(i,k);
215 if(std::fabs(D(N-1)) <1.e-12)
217 Cerr <<
" hoho " << finl ;
223void rsolv(DoubleTab& A,
int& N, DoubleVect& D, DoubleVect& B)
230 for(i=N-2; i>=0; i--)
232 for(sum=0.0,j=i+1; j<N; j++) sum += A(i,j)*B(j);
233 B(i) = (B(i)-sum)/D(i);
237void qrsolv( DoubleTab& A,
int& N, DoubleVect& B, DoubleVect& X,
int& sing,
238 int& ncomp, DoubleVect& C, DoubleVect& D)
244 if(ncomp == 0 ) qrdcmp(A, N, C, D, sing);
249 for(sum=0.0,i=j; i<N; i++) sum += A(i,j)*B(i);
251 for(i=j; i<N; i++) B(i) -= tau*A(i,j);
254 for(i=0; i<N; i++) X(i) = B(i);
263void gradient_biconjugue(DoubleTab A,
int n, DoubleVect b, DoubleVect& x,
int& sing,
int& niter)
267 Cerr <<
"OpVEF_DI_L2.cpp: gradient_biconjugue() is not parallel" << finl;
275 double dold, alfa, beta ;
280 DoubleVect r_tilda(n);
282 DoubleVect p_tilda(n);
285 double r_norme, b_norme = norme_array(b);
290 seuil = 1.e-5/b_norme;
305 r(i) = p(i)-A(i,j)*x(j) ;
310 dold = dotproduct_array(r_tilda, r);
311 r_norme = norme_array(r);
313 if(sqrt(dold) > seuil)
315 while ( ( r_norme > seuil ) && (niter++ < nmax) )
318 dnew = dotproduct_array(r_tilda, r);
320 if(dold == 0.) niter = nmax ;
326 p(i) = r(i)+beta*p(i) ;
327 p_tilda(i) = r_tilda(i)+beta*p_tilda(i) ;
333 q(i) += A(i,j)*p(j) ;
335 beta = dotproduct_array(p_tilda, q) ;
337 if(beta == 0.) niter = nmax ;
343 r.ajoute_sans_ech_esp_virt(-alfa, q);
348 q(i) += A(j,i)*p_tilda(j) ;
350 r_tilda.ajoute_sans_ech_esp_virt(-alfa, q);
354 r_norme = norme_array(r);
362 if ( niter >= nmax) sing = 1 ;
369void convbis(
double psc,
int num1,
int num2,
370 const DoubleTab& transporte,
int ncomp,
371 DoubleTab& resu, DoubleVect& fluent)
389 flux = transporte(amont)*psc;
394 for (comp=0; comp<ncomp; comp++)
396 flux = transporte(amont,comp)*psc;
397 resu(num1,comp) -= flux;
398 resu(num2,comp) += flux;
404 DoubleTab& resu)
const
407 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
410 const IntTab& elem_faces = domaine_VEF.
elem_faces();
411 const DoubleTab& face_normales = domaine_VEF.
face_normales();
414 const Domaine& domaine = domaine_VEF.
domaine();
420 const IntTab& face_voisins = domaine_VEF.
face_voisins();
432 int nfac = domaine.nb_faces_elem();
433 int nsom = domaine.nb_som_elem();
434 int nb_som_facette = domaine.type_elem()->nb_som_face();
448 int poly,face_adj,fa7,i,j,n_bord;
449 int num_face, rang ,itypcl;
451 int ncomp_ch_transporte, first;
452 if (transporte.
nb_dim() == 1)
453 ncomp_ch_transporte=1;
455 ncomp_ch_transporte= transporte.
dimension(1);
462 DoubleTab derive(1,1) ;
463 int N ,M , sing , cal_amont;
464 DoubleVect trans(ncomp_ch_transporte) ;
469 derive.
resize(N,ncomp_ch_transporte) ;
475 derive.
resize(N,ncomp_ch_transporte) ;
482 int nb_faces_perio = 0;
484 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
490 nb_faces_perio += le_bord.
nb_faces();
495 if (ncomp_ch_transporte == 1)
496 tab.
resize(nb_faces_perio);
498 tab.
resize(nb_faces_perio,ncomp_ch_transporte);
502 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
510 int num2 = num1 + le_bord.
nb_faces();
511 for (num_face=num1; num_face<num2; num_face++)
513 if (ncomp_ch_transporte == 1)
514 tab(nb_faces_perio) = resu(num_face);
516 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
517 tab(nb_faces_perio,comp) = resu(num_face,comp);
533 for (poly=0; poly<nb_elem_tot; poly++)
536 rang = rang_elem_non_std(poly);
543 for (face_adj=0; face_adj<nfac; face_adj++)
544 face[face_adj]= elem_faces(poly,face_adj);
549 vs[j] = la_vitesse.
valeurs()(face[0],j);
550 for (i=1; i<nfac; i++)
551 vs[j]+= la_vitesse.
valeurs()(face[i],j);
553 for (i=0; i<nsom; i++)
559 itypcl,porosite_face);
570 int elem0,elem1,face_adj_glob;
571 for (face_adj=0; face_adj<nfac; face_adj++)
573 face_adj_glob = face[face_adj];
574 elem0 = face_voisins(face_adj_glob,0);
575 elem1 = face_voisins(face_adj_glob,1);
576 if ((elem0 == -1) || (elem1 == -1))
583 if ( cal_amont == 0)
poly_DI_L2_2d(N,M,derive,poly,ncomp_ch_transporte,transporte,sing);
587 if ( cal_amont == 0)
poly_DI_L2_3d(N,M,derive,poly,ncomp_ch_transporte,transporte,sing);
592 for (fa7=0; fa7<nfa7; fa7++)
596 cc[i] = facette_normales(poly,fa7,i);
599 cc[i] = normales_facettes_Cl(rang,fa7,i);
608 for (i=0; i<nb_som_facette-1; i++)
614 psc+= (vc(j)/
double(nb_som_facette-1)+vsom(KEL(i+2,fa7),j))*cc[j];
615 psc /= nb_som_facette;
617 num10 = face[KEL(0,fa7)];
618 num20 = face[KEL(1,fa7)];
622 convbis(psc,num10,num20,transporte,ncomp_ch_transporte,resu,
fluent_);
628 reconst_DI_L2_2d(derive,poly,psc,num10,num20,transporte,ncomp_ch_transporte,resu,
fluent_,sing,
633 reconst_DI_L2_3d(derive,poly,psc,num10,num20,transporte,ncomp_ch_transporte,resu,
fluent_,sing,
643 Cerr <<
" limitiert in " << nlim <<
" valeurs " << finl ;
658 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
668 int num2 = num1 + le_bord.
nb_faces();
669 for (num_face=num1; num_face<num2; num_face++)
673 psc += la_vitesse.
valeurs()(num_face,i)*face_normales(num_face,i);
675 if (ncomp_ch_transporte == 1)
677 resu(num_face) -= psc*transporte(num_face);
678 flux_b(num_face,0) -= psc*transporte(num_face);
681 for (i=0; i<ncomp_ch_transporte; i++)
683 resu(num_face,i) -= psc*transporte(num_face,i);
684 flux_b(num_face,i) -= psc*transporte(num_face,i);
688 if (ncomp_ch_transporte == 1)
690 resu(num_face) -= psc*la_sortie_libre.
val_ext(num_face-num1);
691 flux_b(num_face,0) -= psc*la_sortie_libre.
val_ext(num_face-num1);
694 for (i=0; i<ncomp_ch_transporte; i++)
696 resu(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
697 flux_b(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1);
708 int num2 = num1 + le_bord.
nb_faces();
711 for (num_face=num1; num_face<num2; num_face++)
713 if (fait[num_face-num1] == 0)
717 if (ncomp_ch_transporte == 1)
719 diff1 = resu(num_face)-tab(nb_faces_perio);
720 diff2 = resu(voisine)-tab(nb_faces_perio+voisine-num_face);
721 resu(voisine) += diff1;
722 resu(num_face) += diff2;
723 flux_b(voisine,1) += diff1;
724 flux_b(num_face,0) += diff2;
727 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
729 diff1 = resu(num_face,comp)-tab(nb_faces_perio,comp);
730 diff2 = resu(voisine,comp)-tab(nb_faces_perio+voisine-num_face,comp);
731 resu(voisine,comp) += diff1;
732 resu(num_face,comp) += diff2;
733 flux_b(voisine,comp) += diff1;
734 flux_b(num_face,comp) += diff2;
737 fait[num_face-num1]= 1;
738 fait[voisine-num1] = 1;
751 double psc,
int num1,
int num2,
752 const DoubleTab& transporte,
755 DoubleVect& tab_fluent,
int sing,
int& nlim)
const
760 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
762 const IntTab& elem_faces = domaine_VEF.
elem_faces();
765 const Domaine& domaine = domaine_VEF.
domaine();
769 const DoubleTab& xv = domaine_VEF.
xv();
770 const DoubleTab& xp = domaine_VEF.
xp();
775 int i, j, face_adj , face_glob, numg=-1 ;
777 DoubleVect trans_c_g(ncomp) ;
778 DoubleVect vs(ncomp) ;
779 DoubleVect trans(ncomp) ;
784 for (j=0; j<ncomp; j++)
786 for(face_adj=0; face_adj<nfac; face_adj ++)
788 face_glob = elem_faces(poly, face_adj);
790 if (ncomp == 1) trans_c_g(0) += transporte(face_glob)/double(nfac) ;
791 else trans_c_g(j) += transporte(face_glob,j)/double(nfac) ;
793 if ((face_glob != num1) && (face_glob != num2)) numg = face_glob ;
797 int num3 = elem_faces(poly, 0 ) ;
803 coor_trans(0,0) = 1. ;
804 coor_trans(0,1) = 0. ;
805 coor_trans(1,0) = 0. ;
806 coor_trans(1,1) = 1. ;
814 dist(i) += (2.*xp(poly,j) - xv(numg,j) - xv(num3,j) - vs(j)*dt/2. ) * coor_trans(i,j) ;
816 double dtrans_max, dtrans_min, dtrans_cen ;
831 for (j=0; j<ncomp; j++)
838 trans(0) = transporte(num3) + derive(4)*dist(0) * coor_trans(0,0)
839 + derive(3)*dist(1) * coor_trans(1,1)
840 + 1./2.*( derive(2)*dist(0)*dist(0) + derive(1)*dist(1)*dist(1) )
841 + derive(0)*dist(0)*dist(1) ;
843 dtrans_cen = transporte(amont) + transporte(aval) - trans_c_g(0) ;
844 dtrans_max = std::max( transporte(amont), dtrans_cen ) ;
845 dtrans_min = std::min( transporte(amont), dtrans_cen ) ;
849 trans(j) = transporte(num3,j) + derive(4,j)*dist(0) * coor_trans(0,0)
850 + derive(3,j)*dist(1) * coor_trans(1,1)
851 + 1./2.*( derive(2,j)*dist(0)*dist(0) + derive(1,j)*dist(1)*dist(1) )
852 + derive(0,j)*dist(0)*dist(1) ;
857 dtrans_cen = transporte(num1,j) + transporte(num2,j) - trans_c_g(j) ;
860 dtrans_max = std::max( transporte(amont,j) , dtrans_cen) ;
861 dtrans_min = std::min( transporte(amont,j) , dtrans_cen) ;
866 if (trans(j) > dtrans_max )
870 trans(j) = dtrans_max ;
872 if (trans(j) < dtrans_min )
876 trans(j) = dtrans_min ;
881 if(ncomp == 1) trans(0) = ( transporte(num1) + transporte(num2) ) - trans_c_g(0) ;
882 else trans(j) = ( transporte(num1,j) + transporte(num2,j) ) - trans_c_g(j) ;
883 Cerr <<
" singx != 0 " << finl ;
916 tab_fluent[num2] += psc;
920 tab_fluent[num1] -= psc;
931 for (i=0; i<ncomp; i++)
934 resu(num1,i) -= flux;
935 resu(num2,i) += flux;
942 double psc,
int num1,
int num2,
943 const DoubleTab& transporte,
946 DoubleVect& tab_fluent ,
947 int sing,
int first, DoubleVect& trans,
951 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
953 const IntTab& elem_faces = domaine_VEF.
elem_faces();
962 const Domaine& domaine = domaine_VEF.
domaine();
968 const DoubleTab& xv = domaine_VEF.
xv();
969 const DoubleTab& xp = domaine_VEF.
xp();
975 double dtrans_max, dtrans_min, dtrans_cen;
977 int i, j, face_adj , face_glob ;
982 DoubleVect trans_c_g(ncomp) ;
1005 for(face_adj=0; face_adj<nfac; face_adj ++)
1007 face_glob = elem_faces(poly, face_adj );
1008 face(face_adj) = face_glob ;
1009 for (i=0; i<ncomp; i++)
1010 trans_c_g(i) += transporte(face_glob,i)/double(nfac) ;
1013 int num3 = elem_faces(poly, 0 ) ;
1015 coor_trans(0,0) = cos(3.14159/4.) ;
1016 coor_trans(0,1) = cos(3.14159/4.) ;
1017 coor_trans(0,2) = cos(3.14159/2.) ;
1019 coor_trans(1,0) = cos(3.14159/2.-3.14159/4.) ;
1020 coor_trans(1,1) = cos(3.14159/2.+3.14159/4.) ;
1021 coor_trans(1,2) = cos(3.14159/2.) ;
1023 coor_trans(2,0) = cos(3.14159/2.) ;
1024 coor_trans(2,1) = cos(3.14159/2.) ;
1025 coor_trans(2,2) = cos(0.) ;
1033 for(face_adj=0; face_adj<nfac; face_adj ++)
1035 face_glob = elem_faces(poly, face_adj );
1036 face(face_adj) = face_glob ;
1038 vs(i) -= la_vitesse.
valeurs()(face_glob,i)/
double(nfac) ;
1045 for(face_adj=0; face_adj<nfac; face_adj ++)
1047 face_glob = elem_faces(poly, face_adj);
1048 if ((face_glob == num1) || (face_glob == num2 ))
1051 dist(i) += xv(face_glob,j) * coor_trans(i,j) ;
1056 dist(i) -= (xp(poly,j) + xv(num3,j) + vs(j)*dt/2.) * coor_trans(i,j) ;
1058 for (j=0; j<ncomp; j++)
1064 trans(j) = transporte(num3,j) + derive(8)*dist(0) * coor_trans(0,0)
1065 + derive(7)*dist(1) * coor_trans(1,1)
1066 + derive(6)*dist(2) * coor_trans(2,2)
1067 + 1./2.*( derive(5)*dist(0)*dist(0) + derive(4)*dist(1)*dist(1)
1068 + derive(3)*dist(2)*dist(2) )
1069 + derive(2)*dist(0)*dist(1) + derive(1)*dist(0)*dist(2)
1070 + derive(0)*dist(1)*dist(2) ;
1072 dtrans_cen = transporte(amont) + transporte(aval) - trans_c_g(0) ;
1074 dtrans_max = std::max( transporte(amont), dtrans_cen ) ;
1075 dtrans_min = std::min( transporte(amont), dtrans_cen ) ;
1080 trans(j) = transporte(num3,j) + derive(8,j)*dist(0) * coor_trans(0,0)
1081 + derive(7,j)*dist(1) * coor_trans(1,1)
1082 + derive(6,j)*dist(2) * coor_trans(2,2)
1083 + 1./2.*( derive(5,j)*dist(0)*dist(0) + derive(4,j)*dist(1)*dist(1)
1084 + derive(3,j)*dist(2)*dist(2) )
1085 + derive(2,j)*dist(0)*dist(1) + derive(1,j)*dist(0)*dist(2)
1086 + derive(0,j)*dist(1)*dist(2) ;
1088 dtrans_cen = transporte(amont,j) + transporte(aval,j) - trans_c_g(j) ;
1089 dtrans_max = std::max( transporte(amont,j), dtrans_cen ) ;
1091 dtrans_min = std::min( transporte(amont,j), dtrans_cen ) ;
1095 if (trans(j) > dtrans_max )
1098 trans(j) = dtrans_max ;
1101 if (trans(j) < dtrans_min )
1104 trans(j) = dtrans_min ;
1113 trans(0) = transporte(num1) + transporte(num2) - trans_c_g(0) ;
1118 trans(j) = transporte(num1,j) + transporte(num2,j) - trans_c_g(j) ;
1162 tab_fluent[num2] += psc;
1166 tab_fluent[num1] -= psc;
1171 flux = trans(0)*psc;
1177 for (i=0; i<ncomp; i++)
1179 flux = trans(i)*psc;
1180 resu(num1,i) -= flux;
1181 resu(num2,i) += flux;
1187 const DoubleTab& transporte,
int& sing)
const
1190 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
1192 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1193 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1195 const Domaine& domaine = domaine_VEF.
domaine();
1199 const DoubleTab& xv = domaine_VEF.
xv();
1200 const DoubleTab& xp = domaine_VEF.
xp();
1202 int i, j, face_adj , face_glob , poly1 ;
1205 IntVect face(nfac) ;
1208 DoubleTab B(M,ncomp) ;
1209 DoubleVect dTransp_x(N) ;
1215 for(face_adj=0; face_adj<nfac; face_adj ++)
1217 face_glob = elem_faces(poly, face_adj );
1218 face(face_adj) = face_glob ;
1221 int num3 = elem_faces(poly, 0);
1230 coor_trans(0,0) = 1. ;
1231 coor_trans(0,1) = 0. ;
1232 coor_trans(1,0) = 0. ;
1233 coor_trans(1,1) = 1. ;
1236 for(
int face_adj_poly =0; face_adj_poly < nfac; face_adj_poly ++)
1238 poly1 = face_voisins(face[face_adj_poly],0);
1239 if (poly1 == poly ) poly1 = face_voisins(face[face_adj_poly], 1);
1241 for(face_adj=0; face_adj<nfac; face_adj ++)
1243 face_glob = elem_faces(poly1, face_adj);
1244 if (face_glob != num3 )
1250 dist(i) += (xv(face_glob,j) - xv(num3,j)) * coor_trans(i,j) ;
1254 poid += ( (xv(face_glob,i)-xp(poly,i)) * (xv(face_glob,i)-xp(poly,i)) );
1255 poid = 1./sqrt(poid) ;
1257 L(row,4) = poid * dist(0) * coor_trans(0,0) ;
1258 L(row,3) = poid * dist(1) * coor_trans(1,1) ;
1259 L(row,2) = poid * 1./2.*dist(0)*dist(0) ;
1260 L(row,1) = poid * 1./2.*dist(1)*dist(1) ;
1261 L(row,0) = poid * dist(0)*dist(1) ;
1264 B(row,0) = poid * (transporte(face_glob) - transporte(num3) ) ;
1265 else for (j=0; j<ncomp; j++)
1266 B(row,j) = poid * (transporte(face_glob,j) - transporte(num3,j)) ;
1273 DoubleTab Lij(N,N) ;
1274 DoubleTab Bij(N,ncomp) ;
1277 for (i=0; i<ncomp; i++)
1278 for (
int k=0; k<M; k++) Bij(j,i) += L(k,j) * B(k,i) ;
1282 for (
int k=0; k<M; k++) Lij(i,j) += L(k,i) * L(k,j) ;
1285 for (j=0; j<ncomp; j++)
1287 for (i=0; i<N; i++) SM(i)=Bij(i,j) ;
1289 qrsolv(Lij, N, SM, dTransp_x, sing, j, C, D);
1295 for (
int val_N= 0; val_N < N ; val_N++ )
1296 derive(val_N) = dTransp_x(val_N) ;
1300 for (
int val_N= 0; val_N < N ; val_N++ )
1301 derive(val_N,j) = dTransp_x(val_N) ;
1308 const DoubleTab& transporte ,
int& sing)
const
1311 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
1313 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1314 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1316 const Domaine& domaine = domaine_VEF.
domaine();
1320 const DoubleTab& xv = domaine_VEF.
xv();
1321 const DoubleTab& xp = domaine_VEF.
xp();
1323 int i, j, face_adj , face_glob , poly1 ;
1327 IntVect face(nfac) ;
1330 DoubleTab B(M,ncomp) ;
1331 DoubleVect dTransp_x(N) ;
1338 for(face_adj=0; face_adj<nfac; face_adj ++)
1340 face_glob = elem_faces(poly, face_adj );
1341 face(face_adj) = face_glob ;
1345 int num3 = elem_faces(poly, 0);
1347 coor_trans(0,0) = cos(3.14159/4.) ;
1348 coor_trans(0,1) = cos(3.14159/4.) ;
1349 coor_trans(0,2) = cos(3.14159/2.) ;
1351 coor_trans(1,0) = cos(3.14159/2.-3.14159/4.) ;
1352 coor_trans(1,1) = cos(3.14159/2.+3.14159/4.) ;
1353 coor_trans(1,2) = cos(3.14159/2.) ;
1355 coor_trans(2,0) = cos(3.14159/2.) ;
1356 coor_trans(2,1) = cos(3.14159/2.) ;
1357 coor_trans(2,2) = cos(0.) ;
1367 for(
int face_adj_poly =0; face_adj_poly < nfac; face_adj_poly ++)
1369 poly1 = face_voisins(face[face_adj_poly],0);
1372 if (poly1 == poly ) poly1 = face_voisins(face[face_adj_poly], 1);
1374 for(face_adj=0; face_adj<nfac; face_adj ++)
1376 face_glob = elem_faces(poly1, face_adj);
1377 if (face_glob != num3 )
1383 dist(i) += (xv(face_glob,j) - xv(num3,j)) * coor_trans(i,j) ;
1387 poid += ( (xv(face_glob,i)-xp(poly,i)) * (xv(face_glob,i)-xp(poly,i)) );
1391 L(row,8) = poid*dist(0) * coor_trans(0,0) ;
1392 L(row,7) = poid*dist(1) * coor_trans(1,1) ;
1393 L(row,6) = poid*dist(2) * coor_trans(2,2) ;
1394 L(row,5) = poid*1./2.*dist(0)*dist(0) ;
1395 L(row,4) = poid*1./2.*dist(1)*dist(1) ;
1396 L(row,3) = poid*1./2.*dist(2)*dist(2) ;
1397 L(row,2) = poid*dist(0)*dist(1) ;
1398 L(row,1) = poid*dist(0)*dist(2) ;
1399 L(row,0) = poid*dist(1)*dist(2) ;
1402 B(row,0) = poid * (transporte(face_glob) - transporte(num3) ) ;
1403 else for (j=0; j<ncomp; j++)
1404 B(row,j) = poid * (transporte(face_glob,j) - transporte(num3,j)) ;
1411 DoubleTab Lij(N,N) ;
1412 DoubleTab Bij(N,ncomp) ;
1415 for (i=0; i<ncomp; i++)
1416 for (
int k=0; k<M; k++) Bij(j,i) += L(k,j) * B(k,i) ;
1422 for (
int k=0; k<M; k++) Lij(i,j) += L(k,i) * L(k,j) ;
1426 for (j=0; j<ncomp; j++)
1428 for (i=0; i<N; i++) SM(i)=Bij(i,j) ;
1430 qrsolv(Lij, N, SM, dTransp_x, sing, j, C, D);
1436 for (
int val_N= 0; val_N < N ; val_N++ )
1437 derive(val_N) = dTransp_x(val_N) ;
1441 for (
int val_N= 0; val_N < N ; val_N++ )
1442 derive(val_N,j) = dTransp_x(val_N) ;
DoubleTab & valeurs() override
Returns the array of field values at the current time.
class Champ_base This class is the base of the fields hierarchy.
class Cond_lim Generic class used to represent any class
int nb_faces_elem(int=0) const
Returns the number of faces of type i of the geometric elements that make up the domain.
int type_elem_Cl(int i) const
DoubleTab & normales_facettes_Cl()
const Cond_lim & les_conditions_limites(int) const
Returns the i-th boundary condition.
IntVect & rang_elem_non_std()
const Elem_VEF_base & type_elem() const
auto & facette_normales()
virtual double face_normales(int face, int comp) const
double xv(int num_face, int k) const
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.
double xp(int num_elem, int k) const
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
int nb_faces_bord() const
Returns the number of faces on which boundary conditions are applied:
const Domaine & domaine() const
virtual void calcul_vc(const ArrOfInt &, ArrOfDouble &, const ArrOfDouble &, const DoubleTab &, const Champ_Inc_base &, int, const DoubleVect &) const =0
const IntTab & KEL() const
virtual int nb_facette() const =0
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Milieu_base & milieu() const =0
Schema_Temps_base & schema_temps()
Returns the time scheme associated with the equation.
int num_premiere_face() const
DoubleVect & porosite_face()
const Equation_base & equation() const
Returns the reference to the equation pointed to by MorEqn::mon_equation.
Neumann_sortie_libre This class represents an open boundary without imposed velocity.
double val_ext(int i) const override
Returns the value of the i-th component of the field imposed on the exterior of the boundary.
const Nom & que_suis_je() const
Returns the string identifying the class.
virtual Entree & readOn(Entree &)
Reads an Objet_U from an input stream. Virtual method to override.
virtual Sortie & printOn(Sortie &) const
Writes the object to an output stream. Virtual method to override.
class Op_Conv_DI_L2_VEF_Face
void poly_DI_L2_3d(int, int, DoubleTab &, int, int, const DoubleTab &, int &) const
void associer_vitesse(const Champ_base &) override
DoubleTab & ajouter(const DoubleTab &, DoubleTab &) const override
void poly_DI_L2_2d(int, int, DoubleTab &, int, int, const DoubleTab &, int &) const
void reconst_DI_L2_3d(DoubleTab &, int, double, int, int, const DoubleTab &, int, DoubleTab &, DoubleVect &, int, int, DoubleVect &, int &) const
void reconst_DI_L2_2d(DoubleTab &, int, double, int, int, const DoubleTab &, int, DoubleTab &, DoubleVect &, int, int &) const
const Champ_Inc_base & vitesse() const
void modifier_flux(const Operateur_base &) const
class Periodique This class represents a periodic boundary condition.
int face_associee(int i) const
static bool is_parallel()
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
static bool is_sequential()
double pas_de_temps() const
Returns the current time step (delta_t).
Base class for output streams.
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension(int d) const
void ajoute_sans_ech_esp_virt(_SCALAR_TYPE_ alpha, const TRUSTVect &y, Mp_vect_options opt=VECT_REAL_ITEMS)