165 DoubleTab& resu)
const
168 const Domaine_VEF& domaine_VEF = le_dom_vef.valeur();
170 const IntTab& elem_faces = domaine_VEF.
elem_faces();
171 const DoubleTab& face_normales = domaine_VEF.
face_normales();
174 const Domaine& domaine = domaine_VEF.
domaine();
175 const int nb_faces = domaine_VEF.
nb_faces();
177 const int nb_elem = domaine_VEF.
nb_elem();
180 const IntTab& face_voisins = domaine_VEF.
face_voisins();
182 const DoubleVect& volumes = domaine_VEF.
volumes();
183 const DoubleTab& xv = domaine_VEF.
xv();
184 const DoubleTab& xg = domaine_VEF.
xp();
185 const DoubleTab& coord = domaine.coord_sommets();
187 const IntTab& les_Polys = domaine.les_elems();
193 int nfac = domaine.nb_faces_elem();
194 int nsom = domaine.nb_som_elem();
195 int nb_som_facette = domaine.type_elem()->nb_som_face();
209 if ((nom_elem==
"Tetra_VEF")||(nom_elem==
"Tri_VEF"))
221 int poly,poly1,poly2,face_adj,fa7,i,j,n_bord;
222 int num_face, rang ,itypcl;
223 int num10,num20,num3,num_som;
224 int ncomp_ch_transporte;
226 if (transporte.
nb_dim() == 1)
227 ncomp_ch_transporte=1;
229 ncomp_ch_transporte= transporte.
dimension(1);
231 int fac,elem1,elem2,comp0;
232 int nb_faces_ = domaine_VEF.
nb_faces();
235 DoubleVect flux(ncomp_ch_transporte);
236 DoubleVect fluxsom(ncomp_ch_transporte);
237 DoubleVect fluxg(ncomp_ch_transporte);
241 int nb_faces_perio = 0;
242 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
249 int num2 = num1 + le_bord.
nb_faces();
250 for (num_face=num1; num_face<num2; num_face++)
256 if (ncomp_ch_transporte == 1)
257 tab.
resize(nb_faces_perio);
259 tab.
resize(nb_faces_perio,ncomp_ch_transporte);
262 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
270 int num2 = num1 + le_bord.
nb_faces();
271 for (num_face=num1; num_face<num2; num_face++)
273 if (ncomp_ch_transporte == 1)
274 tab(nb_faces_perio) = resu(num_face);
276 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
277 tab(nb_faces_perio,comp) = resu(num_face,comp);
290 DoubleTab gradient_elem(0, ncomp_ch_transporte,
dimension);
296 for (fac=0; fac< premiere_face_int; fac++)
298 elem1=face_voisins(fac,0);
299 if(ncomp_ch_transporte==1)
302 gradient_elem(elem1, 0, i) +=
303 face_normales(fac,i)*transporte(fac);
306 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
308 gradient_elem(elem1, comp0, i) +=
309 face_normales(fac,i)*transporte(fac,comp0);
313 for (; fac<nb_faces_; fac++)
315 elem1=face_voisins(fac,0);
316 elem2=face_voisins(fac,1);
317 if(ncomp_ch_transporte==1)
320 gradient_elem(elem1, 0, i) +=
321 face_normales(fac,i)*transporte(fac);
322 gradient_elem(elem2, 0, i) -=
323 face_normales(fac,i)*transporte(fac);
326 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
329 gradient_elem(elem1, comp0, i) +=
330 face_normales(fac,i)*transporte(fac,comp0);
331 gradient_elem(elem2, comp0, i) -=
332 face_normales(fac,i)*transporte(fac,comp0);
337 for (
int elem=0; elem<nb_elem; elem++)
338 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
340 gradient_elem(elem,comp0,i) /= volumes(elem);
367 const IntTab& KEL=type_elemvef.
KEL();
368 for (poly=0; poly<nb_elem_tot; poly++)
372 rang = rang_elem_non_std(poly);
380 for (face_adj=0; face_adj<nfac; face_adj++)
382 face(face_adj)= elem_faces(poly,face_adj);
393 vs(j) = la_vitesse.
valeurs()(face(0),j)*porosite_face(face(0));
394 for (i=1; i<nfac; i++)
395 vs(j)+= la_vitesse.
valeurs()(face(i),j)*porosite_face(face(i));
401 for (j=0; j<nsom; j++)
412 for (j=0; j<nsom; j++)
414 num_som = domaine.sommet_elem(poly,j);
429 for (fa7=0; fa7<nfa7; fa7++)
434 num10 = face(KEL(0,fa7));
435 num20 = face(KEL(1,fa7));
436 num3 = face(KEL(2,fa7));
440 poly1 = face_voisins(num10,0);
443 poly1 = face_voisins(num10,1);
446 poly2 = face_voisins(num20,0);
449 poly2 = face_voisins(num20,1);
452 scom = les_Polys(poly,KEL(2,fa7));
457 rx0(i) = xv(num20,i)-xv(num10,i);
463 cc[i] = facette_normales(poly, fa7, i);
466 cc[i] = normales_facettes_Cl(rang,fa7,i);
474 for (i=0; i<nb_som_facette-1; i++)
483 psc+=((vsom(KEL(i+2,fa7),j) + la_vitesse.
valeurs()(num3,j) * porosite_face(num3)))*cc[j];
486 coord_som(j)=coord(scom,j);
488 convkschemas_centre(
K,ncomp_ch_transporte,
dimension,poly,poly1,poly2,num10,num20,psc,transporte,
489 fluent_,flux,rx0,gradient_elem,coord_som);
504 if (ncomp_ch_transporte == 1)
508 xm = 0.5 *(coord(scom,j)+xv(num3,j));
513 fluxsom(0) += gradient_elem(poly,0,j)*(coord(scom,j)-xm);
517 fluxsom(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly1,0,j))*(coord(scom,j)-xm);
525 fluxsom(0) += gradient_elem(poly,0,j)*(coord(scom,j)-xm);
529 fluxsom(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly2,0,j))*(coord(scom,j)-xm);
533 fluxsom(0) += flux(0);
539 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
541 fluxsom(comp0) = flux(comp0);
544 xm = 0.5 *(coord(scom,j)+xv(num3,j));
549 fluxsom(comp0) += gradient_elem(poly,comp0,j)*(coord(scom,j)-xm);
553 fluxsom(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly1,comp0,j))*(coord(scom,j)-xm);
561 fluxsom(comp0) += gradient_elem(poly,comp0,j)*(coord(scom,j)-xm);
565 fluxsom(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly2,comp0,j))*(coord(scom,j)-xm);
571 fluxsom(comp0) *= psc;
581 if (ncomp_ch_transporte == 1)
585 xm = 0.5 *(coord(scom,j)+xv(num3,j));
590 fluxg(0) += gradient_elem(poly,0,j)*(xg(poly,j)-xm);
594 fluxg(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly1,0,j))*(xg(poly,j)-xm);
602 fluxg(0) += gradient_elem(poly,0,j)*(xg(poly,j)-xm);
606 fluxg(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly2,0,j))*(xg(poly,j)-xm);
617 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
619 fluxg(comp0) = flux(comp0);
622 xm = 0.5 *(coord(scom,j)+xv(num3,j));
627 fluxg(comp0) += gradient_elem(poly,comp0,j)*(xg(poly,j)-xm);
631 fluxg(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly1,comp0,j))*(xg(poly,j)-xm);
639 fluxg(comp0) += gradient_elem(poly,comp0,j)*(xg(poly,j)-xm);
643 fluxg(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly2,comp0,j))*(xg(poly,j)-xm);
658 if (ncomp_ch_transporte == 1)
660 resu(num10) -=flux(0)*psc;
661 resu(num20) += flux(0)*psc;
666 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
668 resu(num10,comp0) -= flux(comp0)*psc;
669 resu(num20,comp0) += flux(comp0)*psc;
677 for (poly=0; poly<nb_elem_tot; poly++)
680 for (face_adj=0; face_adj<nfac; face_adj++)
681 if(face_adj<nb_faces)
break;
684 rang = rang_elem_non_std(poly);
692 for (face_adj=0; face_adj<nfac; face_adj++)
694 face(face_adj)= elem_faces(poly,face_adj);
704 vs(j) = la_vitesse.
valeurs()(face(0),j)*porosite_face(face(0));
705 for (i=1; i<nfac; i++)
706 vs(j)+= la_vitesse.
valeurs()(face(i),j)*porosite_face(face(i));
712 for (j=0; j<nsom; j++)
723 for (j=0; j<nsom; j++)
725 num_som = domaine.sommet_elem(poly,j);
740 for (fa7=0; fa7<nfa7; fa7++)
745 num10 = face(KEL(0,fa7));
746 num20 = face(KEL(1,fa7));
747 num3 = face(KEL(2,fa7));
751 poly1 = face_voisins(num10,0);
754 poly1 = face_voisins(num10,1);
757 poly2 = face_voisins(num20,0);
760 poly2 = face_voisins(num20,1);
763 scom = les_Polys(poly,KEL(2,fa7));
768 rx0(i) = xv(num20,i)-xv(num10,i);
774 cc[i] = facette_normales(poly, fa7, i);
777 cc[i] = normales_facettes_Cl(rang,fa7,i);
785 for (i=0; i<nb_som_facette-1; i++)
794 psc+=((vsom(KEL(i+2,fa7),j) + la_vitesse.
valeurs()(num3,j) * porosite_face(num3)))*cc[j];
797 coord_som(j)=coord(scom,j);
798 convkschemas_centre(
K,ncomp_ch_transporte,
dimension,poly,poly1,poly2,num10,num20,psc,transporte,
799 fluent_,flux,rx0,gradient_elem,coord_som);
814 if (ncomp_ch_transporte == 1)
818 xm = 0.5 *(coord(scom,j)+xv(num3,j));
823 fluxsom(0) += gradient_elem(poly,0,j)*(coord(scom,j)-xm);
827 fluxsom(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly1,0,j))*(coord(scom,j)-xm);
835 fluxsom(0) += gradient_elem(poly,0,j)*(coord(scom,j)-xm);
839 fluxsom(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly2,0,j))*(coord(scom,j)-xm);
843 fluxsom(0) += flux(0);
849 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
851 fluxsom(comp0) = flux(comp0);
854 xm = 0.5 *(coord(scom,j)+xv(num3,j));
859 fluxsom(comp0) += gradient_elem(poly,comp0,j)*(coord(scom,j)-xm);
863 fluxsom(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly1,comp0,j))*(coord(scom,j)-xm);
871 fluxsom(comp0) += gradient_elem(poly,comp0,j)*(coord(scom,j)-xm);
875 fluxsom(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly2,comp0,j))*(coord(scom,j)-xm);
881 fluxsom(comp0) *= psc;
891 if (ncomp_ch_transporte == 1)
895 xm = 0.5 *(coord(scom,j)+xv(num3,j));
900 fluxg(0) += gradient_elem(poly,0,j)*(xg(poly,j)-xm);
904 fluxg(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly1,0,j))*(xg(poly,j)-xm);
912 fluxg(0) += gradient_elem(poly,0,j)*(xg(poly,j)-xm);
916 fluxg(0) += (teta*gradient_elem(poly,0,j) + (1.- teta)*gradient_elem(poly2,0,j))*(xg(poly,j)-xm);
927 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
929 fluxg(comp0) = flux(comp0);
932 xm = 0.5 *(coord(scom,j)+xv(num3,j));
937 fluxg(comp0) += gradient_elem(poly,comp0,j)*(xg(poly,j)-xm);
941 fluxg(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly1,comp0,j))*(xg(poly,j)-xm);
949 fluxg(comp0) += gradient_elem(poly,comp0,j)*(xg(poly,j)-xm);
953 fluxg(comp0) += (teta*gradient_elem(poly,comp0,j) + (1.-teta)*gradient_elem(poly2,comp0,j))*(xg(poly,j)-xm);
968 if (ncomp_ch_transporte == 1)
970 resu(num10) -= flux(0)*psc;
971 resu(num20) += flux(0)*psc;
976 for (comp0=0; comp0<ncomp_ch_transporte; comp0++)
978 resu(num10,comp0) -= flux(comp0)*psc;
979 resu(num20,comp0) +=flux(comp0)*psc;
999 for (n_bord=0; n_bord<domaine_VEF.
nb_front_Cl(); n_bord++)
1008 int num2 = num1 + le_bord.
nb_faces();
1009 for (num_face=num1; num_face<num2; num_face++)
1013 psc += la_vitesse.
valeurs()(num_face,i)*face_normales(num_face,i)*porosite_face(num_face);
1015 if (ncomp_ch_transporte == 1)
1017 resu(num_face) -= psc*transporte(num_face);
1018 flux_b(num_face,0) -= psc*transporte(num_face);
1021 for (i=0; i<ncomp_ch_transporte; i++)
1023 resu(num_face,i) -= psc*transporte(num_face,i);
1024 flux_b(num_face,i) -= psc*transporte(num_face,i);
1028 if (ncomp_ch_transporte == 1)
1030 resu(num_face) -= psc*la_sortie_libre.
val_ext(num_face-num1);
1031 flux_b(num_face,0) -= psc*la_sortie_libre.
val_ext(num_face-num1);
1034 for (i=0; i<ncomp_ch_transporte; i++)
1036 resu(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
1037 flux_b(num_face,i) -= psc*la_sortie_libre.
val_ext(num_face-num1,i);
1043 else if (sub_type(
Periodique,la_cl.valeur()))
1048 int num2 = num1 + le_bord.
nb_faces();
1051 for (num_face=num1; num_face<num2; num_face++)
1053 if (fait[num_face-num1] == 0)
1057 if (ncomp_ch_transporte == 1)
1059 diff1 = resu(num_face)-tab(nb_faces_perio);
1060 diff2 = resu(voisine)-tab(nb_faces_perio+voisine-num_face);
1061 resu(voisine) += diff1;
1062 resu(num_face) += diff2;
1063 flux_b(voisine,0) += diff1;
1064 flux_b(num_face,0) += diff2;
1067 for (
int comp=0; comp<ncomp_ch_transporte; comp++)
1069 diff1 = resu(num_face,comp)-tab(nb_faces_perio,comp);
1070 diff2 = resu(voisine,comp)-tab(nb_faces_perio+voisine-num_face,comp);
1071 resu(voisine,comp) += diff1;
1072 resu(num_face,comp) += diff2;
1073 flux_b(num_face,comp) += diff1;
1074 flux_b(num_face,comp) += diff2;
1077 fait[num_face-num1]= 1;
1078 fait[voisine-num1] = 1;