128 const int ncomp = flux.size_array();
129 double psc = 0.25 * ((dt_vitesse(fac1)*porosite(fac1)+dt_vitesse(fac2)*porosite(fac2))*(surface(fac1)+surface(fac2)));
130 if (DERIVED_T::IS_AMONT)
132 for (
int k = 0; k < ncomp; k++)
134 psc = 0.25 * ((dt_vitesse(fac1,k)*porosite(fac1)+dt_vitesse(fac2,k)*porosite(fac2))*(surface(fac1)+surface(fac2)));
135 const int f = psc > 0 ? fac3 : fac4;
139 const int elem = elem_(f, 0), elem2 = elem_(f, 1);
140 const int e = dt_vitesse(f, k) > 0 ? (elem > -1 ? elem : elem2) : (elem2 > -1 ? elem2 : elem);
144 flux[k] = -psc * inco(f, k);
147 else if (DERIVED_T::IS_CENTRE)
148 for (
int k = 0; k < ncomp; k++) flux[k] = -0.5*(inco(fac3,k)+inco(fac4,k))*psc ;
151 const int ori = orientation(fac1), num0_0 = face_amont_conj_(fac3,ori,0), num1_1 = face_amont_conj_(fac4,ori,1);
152 if (DERIVED_T::IS_CENTRE4)
154 if ( (num0_0 == -1)||(num1_1== -1) )
155 for (
int k = 0; k < ncomp; k++) flux[k] = -0.5*(inco(fac3,k)+inco(fac4,k))*psc ;
158 Type_Double vit_0(ncomp), vit_0_0(ncomp), vit_1_1(ncomp), vit_1(ncomp);
160 const double dx = dist_face_(fac3,fac4,ori), dxam = dist_face_period_(num0_0,fac3,ori), dxav = dist_face_period_(fac4,num1_1,ori);
161 double g1, g2, g3, g4;
162 calcul_g_(dxam,dx,dxav,g1,g2,g3,g4);
163 for (
int k = 0; k < ncomp; k++)
165 vit_0_0[k] = inco(num0_0,k);
166 vit_0[k] = inco(fac3,k);
167 vit_1[k] = inco(fac4,k);
168 vit_1_1[k] = inco(num1_1,k);
169 flux[k] = -conv_centre_(psc,vit_0_0[k],vit_0[k],vit_1[k],vit_1_1[k],g1,g2,g3,g4);
178 for (
int k = 0; k < ncomp; k++) flux[k] = -psc*inco(fac3,k);
181 Type_Double vit_0(ncomp), vit_0_0(ncomp), vit_1(ncomp);
182 const double dx = dist_face_period_(fac3,fac4,ori), dm = dim_face_(fac3,ori), dxam = dist_face_period_(num0_0,fac3,ori);
183 for (
int k = 0; k < ncomp; k++)
185 vit_0[k] = inco(fac3,k);
186 vit_1[k] = inco(fac4,k);
187 vit_0_0[k] = inco(num0_0,k);
188 flux[k] = -conv_quick_sharp_plus_(psc,vit_0[k],vit_1[k],vit_0_0[k],dx,dm,dxam);
195 for (
int k = 0; k < ncomp; k++) flux[k] = -psc*inco(fac4,k);
198 Type_Double vit_0(ncomp), vit_1(ncomp), vit_1_1(ncomp);
199 const double dx = dist_face_period_(fac3,fac4,ori), dm = dim_face_(fac4,ori), dxam = dist_face_period_(fac4,num1_1,ori);
200 for (
int k = 0; k < ncomp; k++)
202 vit_0[k] = inco(fac3,k);
203 vit_1[k] = inco(fac4,k);
204 vit_1_1[k] = inco(num1_1,k);
205 flux[k] = -conv_quick_sharp_moins_(psc,vit_0[k],vit_1[k],vit_1_1[k],dx,dm,dxam);
216 double psc = 0.25*((dt_vitesse(fac1)*porosite(fac1)+dt_vitesse(fac2)*porosite(fac2))*(surface(fac1)+surface(fac2)));
217 if (DERIVED_T::IS_CENTRE)
218 for (
int k = 0; k < flux.size_array(); k++) flux[k] = -psc*0.5*(inco(fac3,k)+inco(fac4,k));
221 for (
int k = 0; k < flux.size_array(); k++)
223 psc = 0.25 * ((dt_vitesse(fac1, k) * porosite(fac1) + dt_vitesse(fac2, k) * porosite(fac2)) * (surface(fac1) + surface(fac2)));
226 const int elem = elem_(fac3, 0) > 0 ? elem_(fac3, 0) : elem_(fac3, 1);
227 if (a_r) psc *= (*a_r)(elem,k);
228 flux[k] = -psc * inco(fac3, k);
232 const int elem = elem_(fac4, 0) > 0 ? elem_(fac4, 0) : elem_(fac4, 1);
233 if (a_r) psc *= (*a_r)(elem,k);
234 flux[k] = -psc * inco(fac4, k);
244 assert(flux3.size_array() == flux1_2.size_array());
245 constexpr bool is_SYM = (Arete_Type == Type_Flux_Arete::NAVIER_FLUIDE);
246 if (DERIVED_T::IS_AXI && is_SYM)
return;
247 const int ncomp = flux3.size_array();
249 const int pfb = premiere_face_bord(), ori = orientation(fac3), rang1 = DERIVED_T::IS_QUICK ? fac1 : (fac1-pfb), rang2 = DERIVED_T::IS_QUICK ? fac2 :(fac2-pfb);
251 for (
int k = 0; k < ncomp; k++)
253 double psc = 0.25*((dt_vitesse(fac1,k)*porosite(fac1)+dt_vitesse(fac2,k)*porosite(fac2))*(surface(fac1)+surface(fac2)));
256 const int elem = elem_(fac3, 0), elem2 = elem_(fac3, 1);
257 const int e = dt_vitesse(fac3, k) > 0 ? (elem > -1 ? elem : elem2) : (elem2 > -1 ? elem2 : elem);
258 const double aa_r = (a_r && DERIVED_T::IS_AMONT) ? (*a_r)(e, k) : 1.0;
259 flux3[k] = -aa_r*inco(fac3,k)*psc ;
263 const int ind = ncomp*ori+k;
264 const double vf1 = Champ_Face_get_val_imp_face_bord_sym(inco,inconnue->temps(),rang1,ind,la_zcl());
265 const double vf2 = Champ_Face_get_val_imp_face_bord_sym(inco,inconnue->temps(),rang2,ind,la_zcl());
266 const int elem = elem_(fac3, 0), elem2 = elem_(fac3, 1);
267 const int e = dt_vitesse(fac3, k) > 0 ? (elem > -1 ? elem : elem2) : (elem2 > -1 ? elem2 : elem);
268 const double aa_r = (a_r && DERIVED_T::IS_AMONT) ? (*a_r)(e, k) : 1.0;
269 flux3[k] = -aa_r * 0.5 * (vf1 + vf2) * psc ;
273 for (
int k = 0; k < ncomp; k++)
275 double psc = 0.5*dt_vitesse(fac3,k)*surface(fac3)*porosite(fac3);
278 const int elem = elem_(fac1, 0), elem2 = elem_(fac1, 1);
279 const int e = dt_vitesse(fac1, k) > 0 ? (elem > -1 ? elem : elem2) : (elem2 > -1 ? elem2 : elem);
280 const double aa_r = (a_r && DERIVED_T::IS_AMONT) ? (*a_r)(e, k) : 1.0;
281 flux1_2[k] = -aa_r * psc * inco(fac1, k);
285 const int elem = elem_(fac2, 0), elem2 = elem_(fac2, 1);
286 const int e = dt_vitesse(fac2, k) > 0 ? (elem > -1 ? elem : elem2) : (elem2 > -1 ? elem2 : elem);
287 const double aa_r = (a_r && DERIVED_T::IS_AMONT) ? (*a_r)(e, k) : 1.0;
288 flux1_2[k] = (DERIVED_T::IS_CENTRE || DERIVED_T::IS_CENTRE4) ? -psc*0.5*(inco(fac1,k)+inco(fac2,k)) : -aa_r * psc * inco(fac2, k);
296 assert(flux3_4.size_array() == flux1_2.size_array());
297 if (DERIVED_T::IS_QUICK)
299 if (DERIVED_T::IS_AXI)
return;
302 flux_arete < Type_Flux_Arete::INTERNE > (inco, a_r, fac1, fac2, fac3, fac4, flux3_4);
303 flux_arete < Type_Flux_Arete::INTERNE > (inco, a_r, fac3, fac4, fac1, fac2, flux1_2);
307 const int ncomp = flux3_4.size_array();
310 if (ncomp > 1)
throw;
312 double psc = 0.25*(dt_vitesse(fac1)*porosite(fac1)+dt_vitesse(fac2)*porosite(fac2))*(surface(fac1) +surface(fac2));
313 if (DERIVED_T::IS_CENTRE)
314 for (
int k = 0; k < ncomp; k++) flux3_4[k] = -psc*0.5*(inco(fac3,k)+inco(fac4,k));
315 else if (DERIVED_T::IS_CENTRE4)
317 const int ori = orientation(fac1), num0_0 = face_amont_conj_(fac3,ori,0),num1_1 = face_amont_conj_(fac4,ori,1);
318 if ( (num0_0 == -1)||(num1_1== -1) )
319 for (
int k = 0; k < ncomp; k++) flux3_4[k] = -psc*0.5*(inco(fac3,k)+inco(fac4,k));
322 Type_Double vit_0(ncomp), vit_0_0(ncomp), vit_1_1(ncomp), vit_1(ncomp);
323 const double dx = dist_face_period_(fac3,fac4,ori), dxam = dist_face_period_(num0_0,fac3,ori), dxav = dist_face_period_(fac4,num1_1,ori);
324 double g1, g2, g3, g4;
325 calcul_g_(dxam,dx,dxav,g1,g2,g3,g4);
326 for (
int k = 0; k < ncomp; k++)
328 vit_0_0[k] = inco(num0_0,k);
329 vit_0[k] = inco(fac3,k);
330 vit_1[k] = inco(fac4,k);
331 vit_1_1[k] = inco(num1_1,k);
332 flux3_4[k] = -conv_centre_(psc,vit_0_0[k],vit_0[k],vit_1[k],vit_1_1[k],g1,g2,g3,g4);
339 for (
int k = 0; k < ncomp; k++)
342 flux3_4[k] = -psc*inco(fac3,k);
344 else for (
int k = 0; k < ncomp; k++)
347 flux3_4[k] = -psc*inco(fac4,k);
351 psc = 0.25*(dt_vitesse(fac3)*porosite(fac3)+dt_vitesse(fac4)*porosite(fac4))*(surface(fac3)+surface(fac4));
352 if (DERIVED_T::IS_CENTRE)
353 for (
int k = 0; k < ncomp; k++) flux1_2[k] = -psc*0.5*(inco(fac1,k)+inco(fac2,k));
354 else if (DERIVED_T::IS_CENTRE4)
356 const int ori = orientation(fac3), num0_0 = face_amont_conj_(fac1,ori,0), num1_1 = face_amont_conj_(fac2,ori,1);
358 if ( (num0_0 == -1)||(num1_1== -1) )
359 for (
int k=0; k<ncomp; k++) flux1_2[k] = -psc*0.5*(inco(fac1,k)+inco(fac2,k));
362 Type_Double vit_0(ncomp), vit_0_0(ncomp), vit_1_1(ncomp), vit_1(ncomp);
363 const double dx = dist_face_period_(fac1,fac2,ori),dxam = dist_face_period_(num0_0,fac1,ori), dxav = dist_face_period_(fac2,num1_1,ori);
364 double g1, g2, g3, g4;
365 calcul_g_(dxam,dx,dxav,g1,g2,g3,g4);
366 for (
int k = 0; k < ncomp; k++)
368 vit_0_0[k] = inco(num0_0,k);
369 vit_0[k] = inco(fac1,k);
370 vit_1[k] = inco(fac2,k);
371 vit_1_1[k]=inco(num1_1,k);
372 flux1_2[k] = -conv_centre_(psc,vit_0_0[k],vit_0[k],vit_1[k],vit_1_1[k],g1,g2,g3,g4);
379 for (
int k = 0; k < ncomp; k++)
382 flux1_2[k] = -psc*inco(fac1,k);
384 else for (
int k = 0; k < ncomp; k++)
387 flux1_2[k] = -psc*inco(fac2,k);
395 assert(flux3.size_array() == flux1_2.size_array());
396 if (!DERIVED_T::IS_AMONT)
398 Cerr <<
"Flux_arete with Type_Flux_Arete::COIN_FLUIDE is only coded for amont scheme !" <<finl;
402 const int ncomp = flux3.size_array();
405 if (ncomp > 1)
throw;
407 double psc = 0.5 * dt_vitesse(fac1) * porosite(fac1) * surface(fac1);
408 if ((psc * signe) > 0)
409 for (
int k = 0; k < ncomp; k++)
412 flux3[k] = -inco(fac3,k) * psc;
416 const int pfb = premiere_face_bord(), rang1 = (fac1 - pfb), ori = orientation(fac3);
417 for (
int k = 0; k < ncomp; k++) flux3[k] = -Champ_Face_get_val_imp_face_bord(inconnue->temps(), rang1, ori, la_zcl()) * psc;
420 psc = 0.5 * dt_vitesse(fac3) * surface(fac3) * porosite(fac3);
422 for (
int k = 0; k < ncomp; k++)
425 flux1_2[k] = -psc * inco(fac1,k);
429 const int pfb = premiere_face_bord(), rang3 = (fac3 - pfb), ori = orientation(fac1);
430 for (
int k = 0; k < ncomp; k++) flux1_2[k] = -psc * Champ_Face_get_val_imp_face_bord(inconnue->temps(), rang3, ori, la_zcl());
441 assert(aii.size_array() == ajj.size_array());
442 if (DERIVED_T::IS_CENTRE || DERIVED_T::IS_AXI || DERIVED_T::IS_CENTRE4)
return;
443 const int elem1 = elem_(face,0), elem2 = elem_(face,1);
445 for (
int k = 0; k < aii.size_array(); k++)
447 double psc = dt_vitesse(face,k) * surface(face) * porosite(face);
448 if (a_r) psc *= (*a_r)((elem1 != -1) ? elem1 : elem2, k);
449 fill_coeffs_proto < Type_Double > (k, psc, psc, aii, ajj);
456 assert(aii.size_array() == ajj.size_array());
457 if (DERIVED_T::IS_CENTRE || DERIVED_T::IS_AXI || DERIVED_T::IS_CENTRE4)
return;
460 for (
int k = 0; k < aii.size_array(); k++)
462 double psc = 0.25 * (dt_vitesse(fac1, k) + dt_vitesse(fac2, k)) * (surface(fac1) + surface(fac2));
463 const int f = psc > 0 ? fac1 : fac2;
467 const int elem = elem_(f, 0), elem2 = elem_(f, 1);
468 const int e = dt_vitesse(f, k) > 0 ? (elem > -1 ? elem : elem2) : (elem2 > -1 ? elem2 : elem);
472 const double psc1 = psc * porosite(fac1), psc2 = psc * porosite(fac2);
473 fill_coeffs_proto<Type_Double>(k, psc1, psc2, aii, ajj);
482 assert(aii.size_array() == ajj.size_array());
483 if (DERIVED_T::IS_CENTRE || DERIVED_T::IS_AXI || DERIVED_T::IS_CENTRE4)
return;
486 for (
int k = 0; k < aii.size_array(); k++)
488 double psc = 0.25 * ((dt_vitesse(fac1, k) * porosite(fac1) + dt_vitesse(fac2, k) * porosite(fac2)) *
489 (surface(fac1) + surface(fac2)));
494 const int elem = elem_(fac3, 0) > 0 ? elem_(fac3, 0) : elem_(fac3, 1);
495 psc *= (*a_r)(elem, k);
499 const int elem = elem_(fac4, 0) > 0 ? elem_(fac4, 0) : elem_(fac4, 1);
500 psc *= (*a_r)(elem, k);
503 fill_coeffs_proto<Type_Double>(k, psc, psc, aii, ajj);