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<<
"Erreur flora: matrice non inversible a l'indice "<<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<<
"Erreur flora: matrice non inversible a l'indice"<<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<<
"Erreur flora: matrice non inversible a l'indice "<<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() n'est pas parallele" << 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();
449 int poly,face_adj,fa7,i,j,n_bord;
450 int num_face, rang ,itypcl;
452 int ncomp_ch_transporte, first;
453 if (transporte.
nb_dim() == 1)
454 ncomp_ch_transporte=1;
456 ncomp_ch_transporte= transporte.
dimension(1);
463 DoubleTab derive(1,1) ;
464 int N ,M , sing , cal_amont;
465 DoubleVect trans(ncomp_ch_transporte) ;
470 derive.
resize(N,ncomp_ch_transporte) ;
476 derive.
resize(N,ncomp_ch_transporte) ;
484 int nb_faces_perio = 0;
486 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
492 nb_faces_perio += le_bord.
nb_faces();
497 if (ncomp_ch_transporte == 1)
498 tab.
resize(nb_faces_perio);
500 tab.
resize(nb_faces_perio,ncomp_ch_transporte);
504 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
512 int num2 = num1 + le_bord.
nb_faces();
513 for (num_face=num1; num_face<num2; num_face++)
515 if (ncomp_ch_transporte == 1)
516 tab(nb_faces_perio) = resu(num_face);
518 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
519 tab(nb_faces_perio,comp) = resu(num_face,comp);
536 for (poly=0; poly<nb_elem_tot; poly++)
539 rang = rang_elem_non_std(poly);
546 for (face_adj=0; face_adj<nfac; face_adj++)
547 face[face_adj]= elem_faces(poly,face_adj);
552 vs[j] = la_vitesse.
valeurs()(face[0],j);
553 for (i=1; i<nfac; i++)
554 vs[j]+= la_vitesse.
valeurs()(face[i],j);
556 for (i=0; i<nsom; i++)
562 itypcl,porosite_face);
573 int elem0,elem1,face_adj_glob;
574 for (face_adj=0; face_adj<nfac; face_adj++)
576 face_adj_glob = face[face_adj];
577 elem0 = face_voisins(face_adj_glob,0);
578 elem1 = face_voisins(face_adj_glob,1);
579 if ((elem0 == -1) || (elem1 == -1))
586 if ( cal_amont == 0)
poly_DI_L2_2d(N,M,derive,poly,ncomp_ch_transporte,transporte,sing);
590 if ( cal_amont == 0)
poly_DI_L2_3d(N,M,derive,poly,ncomp_ch_transporte,transporte,sing);
595 for (fa7=0; fa7<nfa7; fa7++)
599 cc[i] = facette_normales(poly,fa7,i);
602 cc[i] = normales_facettes_Cl(rang,fa7,i);
611 for (i=0; i<nb_som_facette-1; i++)
617 psc+= (vc(j)/
double(nb_som_facette-1)+vsom(KEL(i+2,fa7),j))*cc[j];
618 psc /= nb_som_facette;
620 num10 = face[KEL(0,fa7)];
621 num20 = face[KEL(1,fa7)];
625 convbis(psc,num10,num20,transporte,ncomp_ch_transporte,resu,
fluent_);
631 reconst_DI_L2_2d(derive,poly,psc,num10,num20,transporte,ncomp_ch_transporte,resu,
fluent_,sing,
636 reconst_DI_L2_3d(derive,poly,psc,num10,num20,transporte,ncomp_ch_transporte,resu,
fluent_,sing,
646 Cerr <<
" limitiert in " << nlim <<
" valeurs " << finl ;
662 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
672 int num2 = num1 + le_bord.
nb_faces();
673 for (num_face=num1; num_face<num2; num_face++)
677 psc += la_vitesse.
valeurs()(num_face,i)*face_normales(num_face,i);
679 if (ncomp_ch_transporte == 1)
681 resu(num_face) -= psc*transporte(num_face);
682 flux_b(num_face,0) -= psc*transporte(num_face);
685 for (i=0; i<ncomp_ch_transporte; i++)
687 resu(num_face,i) -= psc*transporte(num_face,i);
688 flux_b(num_face,i) -= psc*transporte(num_face,i);
692 if (ncomp_ch_transporte == 1)
694 resu(num_face) -= psc*la_sortie_libre.
val_ext(num_face-num1);
695 flux_b(num_face,0) -= psc*la_sortie_libre.
val_ext(num_face-num1);
698 for (i=0; i<ncomp_ch_transporte; i++)
700 resu(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
701 flux_b(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1);
712 int num2 = num1 + le_bord.
nb_faces();
715 for (num_face=num1; num_face<num2; num_face++)
717 if (fait[num_face-num1] == 0)
721 if (ncomp_ch_transporte == 1)
723 diff1 = resu(num_face)-tab(nb_faces_perio);
724 diff2 = resu(voisine)-tab(nb_faces_perio+voisine-num_face);
725 resu(voisine) += diff1;
726 resu(num_face) += diff2;
727 flux_b(voisine,1) += diff1;
728 flux_b(num_face,0) += diff2;
731 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
733 diff1 = resu(num_face,comp)-tab(nb_faces_perio,comp);
734 diff2 = resu(voisine,comp)-tab(nb_faces_perio+voisine-num_face,comp);
735 resu(voisine,comp) += diff1;
736 resu(num_face,comp) += diff2;
737 flux_b(voisine,comp) += diff1;
738 flux_b(num_face,comp) += diff2;
741 fait[num_face-num1]= 1;
742 fait[voisine-num1] = 1;
755 double psc,
int num1,
int num2,
756 const DoubleTab& transporte,
759 DoubleVect& tab_fluent,
int sing,
int& nlim)
const
764 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
766 const IntTab& elem_faces = domaine_VEF.
elem_faces();
769 const Domaine& domaine = domaine_VEF.
domaine();
773 const DoubleTab& xv = domaine_VEF.
xv();
774 const DoubleTab& xp = domaine_VEF.
xp();
779 int i, j, face_adj , face_glob, numg=-1 ;
781 DoubleVect trans_c_g(ncomp) ;
782 DoubleVect vs(ncomp) ;
783 DoubleVect trans(ncomp) ;
788 for (j=0; j<ncomp; j++)
790 for(face_adj=0; face_adj<nfac; face_adj ++)
792 face_glob = elem_faces(poly, face_adj);
794 if (ncomp == 1) trans_c_g(0) += transporte(face_glob)/double(nfac) ;
795 else trans_c_g(j) += transporte(face_glob,j)/double(nfac) ;
797 if ((face_glob != num1) && (face_glob != num2)) numg = face_glob ;
801 int num3 = elem_faces(poly, 0 ) ;
807 coor_trans(0,0) = 1. ;
808 coor_trans(0,1) = 0. ;
809 coor_trans(1,0) = 0. ;
810 coor_trans(1,1) = 1. ;
818 dist(i) += (2.*xp(poly,j) - xv(numg,j) - xv(num3,j) - vs(j)*dt/2. ) * coor_trans(i,j) ;
820 double dtrans_max, dtrans_min, dtrans_cen ;
835 for (j=0; j<ncomp; j++)
842 trans(0) = transporte(num3) + derive(4)*dist(0) * coor_trans(0,0)
843 + derive(3)*dist(1) * coor_trans(1,1)
844 + 1./2.*( derive(2)*dist(0)*dist(0) + derive(1)*dist(1)*dist(1) )
845 + derive(0)*dist(0)*dist(1) ;
847 dtrans_cen = transporte(amont) + transporte(aval) - trans_c_g(0) ;
848 dtrans_max = std::max( transporte(amont), dtrans_cen ) ;
849 dtrans_min = std::min( transporte(amont), dtrans_cen ) ;
853 trans(j) = transporte(num3,j) + derive(4,j)*dist(0) * coor_trans(0,0)
854 + derive(3,j)*dist(1) * coor_trans(1,1)
855 + 1./2.*( derive(2,j)*dist(0)*dist(0) + derive(1,j)*dist(1)*dist(1) )
856 + derive(0,j)*dist(0)*dist(1) ;
861 dtrans_cen = transporte(num1,j) + transporte(num2,j) - trans_c_g(j) ;
864 dtrans_max = std::max( transporte(amont,j) , dtrans_cen) ;
865 dtrans_min = std::min( transporte(amont,j) , dtrans_cen) ;
870 if (trans(j) > dtrans_max )
874 trans(j) = dtrans_max ;
876 if (trans(j) < dtrans_min )
880 trans(j) = dtrans_min ;
885 if(ncomp == 1) trans(0) = ( transporte(num1) + transporte(num2) ) - trans_c_g(0) ;
886 else trans(j) = ( transporte(num1,j) + transporte(num2,j) ) - trans_c_g(j) ;
887 Cerr <<
" singx != 0 " << finl ;
920 tab_fluent[num2] += psc;
924 tab_fluent[num1] -= psc;
935 for (i=0; i<ncomp; i++)
938 resu(num1,i) -= flux;
939 resu(num2,i) += flux;
946 double psc,
int num1,
int num2,
947 const DoubleTab& transporte,
950 DoubleVect& tab_fluent ,
951 int sing,
int first, DoubleVect& trans,
955 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
957 const IntTab& elem_faces = domaine_VEF.
elem_faces();
966 const Domaine& domaine = domaine_VEF.
domaine();
972 const DoubleTab& xv = domaine_VEF.
xv();
973 const DoubleTab& xp = domaine_VEF.
xp();
979 double dtrans_max, dtrans_min, dtrans_cen;
981 int i, j, face_adj , face_glob ;
986 DoubleVect trans_c_g(ncomp) ;
1009 for(face_adj=0; face_adj<nfac; face_adj ++)
1011 face_glob = elem_faces(poly, face_adj );
1012 face(face_adj) = face_glob ;
1013 for (i=0; i<ncomp; i++)
1014 trans_c_g(i) += transporte(face_glob,i)/double(nfac) ;
1017 int num3 = elem_faces(poly, 0 ) ;
1019 coor_trans(0,0) = cos(3.14159/4.) ;
1020 coor_trans(0,1) = cos(3.14159/4.) ;
1021 coor_trans(0,2) = cos(3.14159/2.) ;
1023 coor_trans(1,0) = cos(3.14159/2.-3.14159/4.) ;
1024 coor_trans(1,1) = cos(3.14159/2.+3.14159/4.) ;
1025 coor_trans(1,2) = cos(3.14159/2.) ;
1027 coor_trans(2,0) = cos(3.14159/2.) ;
1028 coor_trans(2,1) = cos(3.14159/2.) ;
1029 coor_trans(2,2) = cos(0.) ;
1037 for(face_adj=0; face_adj<nfac; face_adj ++)
1039 face_glob = elem_faces(poly, face_adj );
1040 face(face_adj) = face_glob ;
1042 vs(i) -= la_vitesse.
valeurs()(face_glob,i)/
double(nfac) ;
1049 for(face_adj=0; face_adj<nfac; face_adj ++)
1051 face_glob = elem_faces(poly, face_adj);
1052 if ((face_glob == num1) || (face_glob == num2 ))
1055 dist(i) += xv(face_glob,j) * coor_trans(i,j) ;
1060 dist(i) -= (xp(poly,j) + xv(num3,j) + vs(j)*dt/2.) * coor_trans(i,j) ;
1062 for (j=0; j<ncomp; j++)
1068 trans(j) = transporte(num3,j) + derive(8)*dist(0) * coor_trans(0,0)
1069 + derive(7)*dist(1) * coor_trans(1,1)
1070 + derive(6)*dist(2) * coor_trans(2,2)
1071 + 1./2.*( derive(5)*dist(0)*dist(0) + derive(4)*dist(1)*dist(1)
1072 + derive(3)*dist(2)*dist(2) )
1073 + derive(2)*dist(0)*dist(1) + derive(1)*dist(0)*dist(2)
1074 + derive(0)*dist(1)*dist(2) ;
1076 dtrans_cen = transporte(amont) + transporte(aval) - trans_c_g(0) ;
1078 dtrans_max = std::max( transporte(amont), dtrans_cen ) ;
1079 dtrans_min = std::min( transporte(amont), dtrans_cen ) ;
1084 trans(j) = transporte(num3,j) + derive(8,j)*dist(0) * coor_trans(0,0)
1085 + derive(7,j)*dist(1) * coor_trans(1,1)
1086 + derive(6,j)*dist(2) * coor_trans(2,2)
1087 + 1./2.*( derive(5,j)*dist(0)*dist(0) + derive(4,j)*dist(1)*dist(1)
1088 + derive(3,j)*dist(2)*dist(2) )
1089 + derive(2,j)*dist(0)*dist(1) + derive(1,j)*dist(0)*dist(2)
1090 + derive(0,j)*dist(1)*dist(2) ;
1092 dtrans_cen = transporte(amont,j) + transporte(aval,j) - trans_c_g(j) ;
1093 dtrans_max = std::max( transporte(amont,j), dtrans_cen ) ;
1095 dtrans_min = std::min( transporte(amont,j), dtrans_cen ) ;
1099 if (trans(j) > dtrans_max )
1102 trans(j) = dtrans_max ;
1105 if (trans(j) < dtrans_min )
1108 trans(j) = dtrans_min ;
1117 trans(0) = transporte(num1) + transporte(num2) - trans_c_g(0) ;
1122 trans(j) = transporte(num1,j) + transporte(num2,j) - trans_c_g(j) ;
1166 tab_fluent[num2] += psc;
1170 tab_fluent[num1] -= psc;
1175 flux = trans(0)*psc;
1181 for (i=0; i<ncomp; i++)
1183 flux = trans(i)*psc;
1184 resu(num1,i) -= flux;
1185 resu(num2,i) += flux;
1191 const DoubleTab& transporte,
int& sing)
const
1194 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
1196 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1197 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1199 const Domaine& domaine = domaine_VEF.
domaine();
1203 const DoubleTab& xv = domaine_VEF.
xv();
1204 const DoubleTab& xp = domaine_VEF.
xp();
1206 int i, j, face_adj , face_glob , poly1 ;
1209 IntVect face(nfac) ;
1212 DoubleTab B(M,ncomp) ;
1213 DoubleVect dTransp_x(N) ;
1219 for(face_adj=0; face_adj<nfac; face_adj ++)
1221 face_glob = elem_faces(poly, face_adj );
1222 face(face_adj) = face_glob ;
1225 int num3 = elem_faces(poly, 0);
1234 coor_trans(0,0) = 1. ;
1235 coor_trans(0,1) = 0. ;
1236 coor_trans(1,0) = 0. ;
1237 coor_trans(1,1) = 1. ;
1240 for(
int face_adj_poly =0; face_adj_poly < nfac; face_adj_poly ++)
1242 poly1 = face_voisins(face[face_adj_poly],0);
1243 if (poly1 == poly ) poly1 = face_voisins(face[face_adj_poly], 1);
1245 for(face_adj=0; face_adj<nfac; face_adj ++)
1247 face_glob = elem_faces(poly1, face_adj);
1248 if (face_glob != num3 )
1254 dist(i) += (xv(face_glob,j) - xv(num3,j)) * coor_trans(i,j) ;
1258 poid += ( (xv(face_glob,i)-xp(poly,i)) * (xv(face_glob,i)-xp(poly,i)) );
1259 poid = 1./sqrt(poid) ;
1261 L(row,4) = poid * dist(0) * coor_trans(0,0) ;
1262 L(row,3) = poid * dist(1) * coor_trans(1,1) ;
1263 L(row,2) = poid * 1./2.*dist(0)*dist(0) ;
1264 L(row,1) = poid * 1./2.*dist(1)*dist(1) ;
1265 L(row,0) = poid * dist(0)*dist(1) ;
1268 B(row,0) = poid * (transporte(face_glob) - transporte(num3) ) ;
1269 else for (j=0; j<ncomp; j++)
1270 B(row,j) = poid * (transporte(face_glob,j) - transporte(num3,j)) ;
1277 DoubleTab Lij(N,N) ;
1278 DoubleTab Bij(N,ncomp) ;
1281 for (i=0; i<ncomp; i++)
1282 for (
int k=0; k<M; k++) Bij(j,i) += L(k,j) * B(k,i) ;
1286 for (
int k=0; k<M; k++) Lij(i,j) += L(k,i) * L(k,j) ;
1289 for (j=0; j<ncomp; j++)
1291 for (i=0; i<N; i++) SM(i)=Bij(i,j) ;
1293 qrsolv(Lij, N, SM, dTransp_x, sing, j, C, D);
1299 for (
int val_N= 0; val_N < N ; val_N++ )
1300 derive(val_N) = dTransp_x(val_N) ;
1304 for (
int val_N= 0; val_N < N ; val_N++ )
1305 derive(val_N,j) = dTransp_x(val_N) ;
1312 const DoubleTab& transporte ,
int& sing)
const
1315 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
1317 const IntTab& elem_faces = domaine_VEF.
elem_faces();
1318 const IntTab& face_voisins = domaine_VEF.
face_voisins();
1320 const Domaine& domaine = domaine_VEF.
domaine();
1324 const DoubleTab& xv = domaine_VEF.
xv();
1325 const DoubleTab& xp = domaine_VEF.
xp();
1327 int i, j, face_adj , face_glob , poly1 ;
1331 IntVect face(nfac) ;
1334 DoubleTab B(M,ncomp) ;
1335 DoubleVect dTransp_x(N) ;
1342 for(face_adj=0; face_adj<nfac; face_adj ++)
1344 face_glob = elem_faces(poly, face_adj );
1345 face(face_adj) = face_glob ;
1349 int num3 = elem_faces(poly, 0);
1351 coor_trans(0,0) = cos(3.14159/4.) ;
1352 coor_trans(0,1) = cos(3.14159/4.) ;
1353 coor_trans(0,2) = cos(3.14159/2.) ;
1355 coor_trans(1,0) = cos(3.14159/2.-3.14159/4.) ;
1356 coor_trans(1,1) = cos(3.14159/2.+3.14159/4.) ;
1357 coor_trans(1,2) = cos(3.14159/2.) ;
1359 coor_trans(2,0) = cos(3.14159/2.) ;
1360 coor_trans(2,1) = cos(3.14159/2.) ;
1361 coor_trans(2,2) = cos(0.) ;
1371 for(
int face_adj_poly =0; face_adj_poly < nfac; face_adj_poly ++)
1373 poly1 = face_voisins(face[face_adj_poly],0);
1376 if (poly1 == poly ) poly1 = face_voisins(face[face_adj_poly], 1);
1378 for(face_adj=0; face_adj<nfac; face_adj ++)
1380 face_glob = elem_faces(poly1, face_adj);
1381 if (face_glob != num3 )
1387 dist(i) += (xv(face_glob,j) - xv(num3,j)) * coor_trans(i,j) ;
1391 poid += ( (xv(face_glob,i)-xp(poly,i)) * (xv(face_glob,i)-xp(poly,i)) );
1395 L(row,8) = poid*dist(0) * coor_trans(0,0) ;
1396 L(row,7) = poid*dist(1) * coor_trans(1,1) ;
1397 L(row,6) = poid*dist(2) * coor_trans(2,2) ;
1398 L(row,5) = poid*1./2.*dist(0)*dist(0) ;
1399 L(row,4) = poid*1./2.*dist(1)*dist(1) ;
1400 L(row,3) = poid*1./2.*dist(2)*dist(2) ;
1401 L(row,2) = poid*dist(0)*dist(1) ;
1402 L(row,1) = poid*dist(0)*dist(2) ;
1403 L(row,0) = poid*dist(1)*dist(2) ;
1406 B(row,0) = poid * (transporte(face_glob) - transporte(num3) ) ;
1407 else for (j=0; j<ncomp; j++)
1408 B(row,j) = poid * (transporte(face_glob,j) - transporte(num3,j)) ;
1415 DoubleTab Lij(N,N) ;
1416 DoubleTab Bij(N,ncomp) ;
1419 for (i=0; i<ncomp; i++)
1420 for (
int k=0; k<M; k++) Bij(j,i) += L(k,j) * B(k,i) ;
1426 for (
int k=0; k<M; k++) Lij(i,j) += L(k,i) * L(k,j) ;
1430 for (j=0; j<ncomp; j++)
1432 for (i=0; i<N; i++) SM(i)=Bij(i,j) ;
1434 qrsolv(Lij, N, SM, dTransp_x, sing, j, C, D);
1440 for (
int val_N= 0; val_N < N ; val_N++ )
1441 derive(val_N) = dTransp_x(val_N) ;
1445 for (
int val_N= 0; val_N < N ; val_N++ )
1446 derive(val_N,j) = dTransp_x(val_N) ;
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 Cond_lim Classe generique servant a representer n'importe quelle classe
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
int type_elem_Cl(int i) const
DoubleTab & normales_facettes_Cl()
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
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
renvoie le numero de le ieme face de la maille num_elem la facon dont ces faces sont numerotees est
double xp(int num_elem, int k) const
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 :
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()
Renvoie le schema en temps associe a l'equation.
int num_premiere_face() const
DoubleVect & porosite_face()
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
classe Neumann_sortie_libre Cette classe represente une frontiere ouverte sans vitesse imposee
double val_ext(int i) const override
Renvoie la valeur de la i-eme composante du champ impose a l'exterieur de 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_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
classe Periodique Cette classe represente une condition aux limites periodique.
int face_associee(int i) const
static bool is_parallel()
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static bool is_sequential()
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
Classe de base des flux de sortie.
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)