108 const tabs_t& semi_impl)
const
113 const IntTab& f_e = domaine.face_voisins(), &fcl = ch.
fcl();
115 const DoubleTab& vf_dir = domaine.volumes_entrelaces_dir(), &n_f = domaine.face_normales();
116 const DoubleTab& pvit = ch.
passe(),
122 &y_elem = domaine.y_elem(),
123 &y_faces = domaine.y_faces(),
124 &n_y_elem = domaine.normale_paroi_elem(),
125 &n_y_faces = domaine.normale_paroi_faces(),
132 int Np = press.line_size();
133 int Nk = (k_turb) ? (*k_turb).dimension(1) : 1;
135 int nf_tot = domaine.nb_faces_tot();
136 const int nf = domaine.nb_faces();
137 int ne_tot = domaine.nb_elem_tot();
138 const int cR = (rho.dimension_tot(0) == 1);
139 const int cM = (mu.dimension_tot(0) == 1);
141 DoubleTrav nut(domaine.nb_elem_tot(), N);
164 const int nb_max_sat = N*(N - 1)/2;
165 DoubleTrav Sigma_tab(ne_tot, nb_max_sat);
169 for (
int k = 0; k < N; k++)
170 for (
int l = k + 1; l < N; l++)
175 const int ind_trav = sigma_pair_index(k, l, N);
179 for (
int ii = 0; ii < ne_tot; ii++)
180 Sigma_tab(ii, ind_trav) = sig(ii);
185 const int ind_trav = sigma_pair_index(k, l, N);
186 for (
int i = 0 ; i<ne_tot ; i++)
187 Sigma_tab(i,ind_trav) = sat.
sigma(temp(i,k),press(i,k * (Np > 1))) ;
192 for (
int f = 0; f < nf; f++)
197 for (
int c = 0; c < 2 && (e = f_e(f, c)) >= 0; c++)
199 for (
int n = 0; n < N; n++)
201 in.
alpha[n] += vf_dir(f, c)/vf(f) * alpha(e, n);
202 in.
p[n] += vf_dir(f, c)/vf(f) * press(e, n * (Np > 1));
203 in.
T[n] += vf_dir(f, c)/vf(f) * temp(e, n);
204 in.
rho[n] += vf_dir(f, c)/vf(f) * rho(!cR * e, n);
205 in.
mu[n] += vf_dir(f, c)/vf(f) * mu(!cM * e, n);
206 in.
nut[n] +=
is_turb ? vf_dir(f, c)/vf(f) * nut(e,n) : 0;
207 in.
d_bulles[n] += vf_dir(f, c)/vf(f) * d_bulles(e,n);
208 for (
int k = n + 1; k < N; k++)
211 const int ind_trav = sigma_pair_index(n, k, N);
212 in.
sigma[ind_trav] += vf_dir(f, c) / vf(f) * Sigma_tab(e, ind_trav);
214 for (
int k = 0; k < N; k++)
215 in.
nv(k, n) += vf_dir(f, c)/vf(f) * ch.
v_norm(pvit, pvit, e, f, k, n,
nullptr,
nullptr);
217 for (
int n = 0; n <Nk; n++) in.
k_turb[n] += (k_turb) ? vf_dir(f, c)/vf(f) * (*k_turb)(e,0) : 0;
218 in.
k_WIT += (k_WIT) ? vf_dir(f, c)/vf(f) * (*k_WIT)(e,0) : 0.;
224 double sum_alphag_wall = 0 ;
225 for (
int k = 0; k<N ; k++)
228 for (
int k = 0; k < N; k++)
233 for (
int d = 0 ; d<D ; d++) fac += n_y_faces(f, d) * n_f(f, d)/fs(f);
237 secmem(f, k) += fac * out.
Ctd(
n_l, k) * 1/y_faces(f) * sum_alphag_wall;
239 secmem(f,
n_l) -= fac * out.
Ctd(
n_l, k) * 1/y_faces(f) * sum_alphag_wall;
244 for (
int e = 0; e < ne_tot; e++)
247 for (
int n = 0; n < N; n++)
249 in.
alpha[n] = alpha(e, n);
250 in.
p[n] = press(e, n * (Np > 1));
251 in.
T[n] = temp(e, n);
252 in.
rho[n] = rho(!cR * e, n);
253 in.
mu[n] = mu(!cM * e, n);
256 for (
int k = n+1; k < N; k++)
259 const int ind_trav = sigma_pair_index(n, k, N);
260 in.
sigma[ind_trav] = Sigma_tab(e, ind_trav);
262 for (
int k = 0; k < N; k++)
263 in.
nv(k, n) = ch.
v_norm(pvit, pvit, e, -1, k, n,
nullptr,
nullptr);
265 for (
int n = 0; n <Nk; n++) in.
k_turb[n] = (k_turb) ? (*k_turb)(e,0) : 0;
266 in.
k_WIT = (k_WIT) ? (*k_WIT)(e,0) : 0;
271 double sum_alphag_wall = 0 ;
272 for (
int k = 0; k<N ; k++)
274 for (
int d = 0, i = nf_tot + D * e; d < D; d++, i++)
275 for (
int k = 0; k < N; k++)
281 secmem(i, k) += fac * out.
Ctd(k,
n_l) * 1/y_elem(e) * alpha(e,k) * (
portee_disp_*d_bulles(e,k)-2*y_elem(e))/(
portee_disp_*d_bulles(e,k)-y_elem(e)) * n_y_elem(e, d);
282 secmem(i, k) += fac * out.
Ctd(
n_l, k) * 1/y_elem(e) * sum_alphag_wall * n_y_elem(e, d);
283 secmem(i,
n_l) -= fac * out.
Ctd(k,
n_l) * 1/y_elem(e) * alpha(e,k) * (
portee_disp_*d_bulles(e,k)-2*y_elem(e))/(
portee_disp_*d_bulles(e,k)-y_elem(e)) * n_y_elem(e, d);
284 secmem(i,
n_l) -= fac * out.
Ctd(
n_l, k) * 1/y_elem(e) * sum_alphag_wall * n_y_elem(e, d);
295 const IntTab& f_e = domaine.face_voisins(), &fcl = ch.
fcl(), &e_f = domaine.elem_faces();
297 const DoubleTab& vf_dir = domaine.volumes_entrelaces_dir(), &n_f = domaine.face_normales();
298 const DoubleTab& pvit = ch.
passe(),
305 &y_elem = domaine.y_elem(),
306 &y_faces = domaine.y_faces(),
313 int N = pvit.
line_size() , Np = press.line_size(), Nk = (k_turb) ? (*k_turb).dimension(1) : 1, D =
dimension,
314 nf_tot = domaine.nb_faces_tot(), cR = (rho.dimension_tot(0) == 1), cM = (mu.dimension_tot(0) == 1);
316 DoubleTrav vr_l(N,D), scal_ur(N), scal_u(N), pvit_l(N, D), vort_l( D==2 ? 1 :D), grad_l(D,D), scal_grad(D);
327 const int ne_tot = domaine.nb_elem_tot(), nb_max_sat = N * (N-1) /2;
328 DoubleTrav Sigma_tab(ne_tot,nb_max_sat);
331 for (
int k = 0; k < N; k++)
332 for (
int l = k + 1; l < N; l++)
337 const int ind_trav = sigma_pair_index(k, l, N);
341 assert(press.line_size() == 1);
342 assert(temp.line_size() == N);
343 z_sat.
get_sigma(temp.get_span_tot(), press.get_span_tot(), Sigma_tab.get_span_tot(), nb_max_sat, ind_trav);
348 const int ind_trav = sigma_pair_index(k, l, N);
349 for (
int i = 0 ; i<ne_tot ; i++) Sigma_tab(i,ind_trav) = sat.
sigma(temp(i,k),press(i,k * (Np > 1))) ;
355 for (
int e = 0; e < ne_tot; e++)
358 for (
int n=0; n<N; n++)
360 in.
alpha[n] = alpha(e, n);
361 in.
p[n] = press(e, n * (Np > 1));
362 in.
T[n] = temp(e, n);
363 in.
rho[n] = rho(!cR * e, n);
364 in.
mu[n] = mu(!cM * e, n);
366 for (
int k = n+1; k < N; k++)
369 const int ind_trav = sigma_pair_index(n, k, N);
370 in.
sigma[ind_trav] = Sigma_tab(e, ind_trav);
372 for (
int k = 0; k < N; k++)
373 in.
nv(k, n) = ch.
v_norm(pvit, pvit, e, -1, k, n,
nullptr,
nullptr);
375 for (
int n = 0; n <Nk; n++) in.
k_turb[n] = (k_turb) ? (*k_turb)(e,0) : 0;
380 int i = nf_tot + D * e;
385 for (
int d = 0 ; d < D ; d++) vl_norm += pvit(i+d,
n_l)*pvit(i+d,
n_l);
386 vl_norm = std::sqrt(vl_norm);
389 for (
int k = 0; k < N; k++)
390 for (
int d = 0 ; d < D ; d++) scal_ur(k) += pvit(i+d,
n_l)/vl_norm * (pvit(i+d, k) -pvit(i+d,
n_l));
391 for (
int k = 0; k < N; k++)
392 for (
int d = 0 ; d < D ; d++) vr_l(k, d) = pvit(i+d,
n_l)/vl_norm * scal_ur(k) ;
394 else for (
int k=0 ; k<N ; k++)
395 for (
int d=0 ; d<D ; d++) vr_l(k, d) = pvit(i+d, k) -pvit(i+d,
n_l) ;
399 for (
int k = 0; k < N; k++)
403 if (y_elem(e) < .5*d_bulles(e,k)*
portee_lift_) fac_e *= -1 ;
404 else if (y_elem(e) > d_bulles(e,k)*
portee_lift_) fac_e *= 0 ;
405 else fac_e *= (3*std::pow(2*y_elem(e)/(d_bulles(e,k)*
portee_lift_)-1, 2) - 2*std::pow(2*y_elem(e)/(d_bulles(e,k)*
portee_lift_)-1, 3)) - 1;
407 secmem(i,
n_l) += fac_e * out.
Cl(
n_l, k) * vr_l(k, 1) * vort(e, 0) ;
408 secmem(i, k ) -= fac_e * out.
Cl(
n_l, k) * vr_l(k, 1) * vort(e, 0) ;
409 secmem(i+1,
n_l)-= fac_e * out.
Cl(
n_l, k) * vr_l(k, 0) * vort(e, 0) ;
410 secmem(i+1, k )+= fac_e * out.
Cl(
n_l, k) * vr_l(k, 0) * vort(e, 0) ;
412 for (
int b = 0; b < e_f.dimension(1) && (f = e_f(e, b)) >= 0; b++)
413 if (f<domaine.nb_faces())
415 for (
int k = 0; k < N; k++)
418 int c = (e == f_e(f, 0)) ? 0 : 1 ;
419 double fac_f =
beta_lift_*pf(f) * vf_dir(f, c);
421 if (y_elem(e) < .5*d_bulles(e,k)*
portee_lift_) fac_f *= -1 ;
422 else if (y_elem(e) > d_bulles(e,k)*
portee_lift_) fac_f *= 0 ;
423 else fac_f *= (3*std::pow(2*y_elem(e)/(d_bulles(e,k)*
portee_lift_)-1, 2) - 2*std::pow(2*y_elem(e)/(d_bulles(e,k)*
portee_lift_)-1, 3)) - 1;
425 secmem(f,
n_l) += fac_f * n_f(f, 0)/fs(f) * out.
Cl(
n_l, k) * vr_l(k, 1) * vort(e, 0) ;
426 secmem(f, k ) -= fac_f * n_f(f, 0)/fs(f) * out.
Cl(
n_l, k) * vr_l(k, 1) * vort(e, 0) ;
427 secmem(f,
n_l) -= fac_f * n_f(f, 1)/fs(f) * out.
Cl(
n_l, k) * vr_l(k, 0) * vort(e, 0) ;
428 secmem(f, k ) += fac_f * n_f(f, 1)/fs(f) * out.
Cl(
n_l, k) * vr_l(k, 0) * vort(e, 0) ;
435 for (
int k = 0; k < N; k++)
439 if (y_elem(e) < .5*d_bulles(e,k)*
portee_lift_) fac_e *= -1 ;
440 else if (y_elem(e) > d_bulles(e,k)*
portee_lift_) fac_e *= 0 ;
441 else fac_e *= (3*std::pow(2*y_elem(e)/(d_bulles(e,k)*
portee_lift_)-1, 2) - 2*std::pow(2*y_elem(e)/(d_bulles(e,k)*
portee_lift_)-1, 3)) - 1;
443 secmem(i,
n_l) += fac_e * out.
Cl(
n_l, k) * (vr_l(k, 1) * vort(e, 2*N+
n_l) - vr_l(k, 2) * vort(e, 1*N+
n_l)) ;
444 secmem(i, k ) -= fac_e * out.
Cl(
n_l, k) * (vr_l(k, 1) * vort(e, 2*N+
n_l) - vr_l(k, 2) * vort(e, 1*N+
n_l)) ;
445 secmem(i+1,
n_l)+= fac_e * out.
Cl(
n_l, k) * (vr_l(k, 2) * vort(e, 0*N+
n_l) - vr_l(k, 0) * vort(e, 2*N+
n_l)) ;
446 secmem(i+1, k )-= fac_e * out.
Cl(
n_l, k) * (vr_l(k, 2) * vort(e, 0*N+
n_l) - vr_l(k, 0) * vort(e, 2*N+
n_l)) ;
447 secmem(i+2,
n_l)+= fac_e * out.
Cl(
n_l, k) * (vr_l(k, 0) * vort(e, 1*N+
n_l) - vr_l(k, 1) * vort(e, 0*N+
n_l)) ;
448 secmem(i+2, k )-= fac_e * out.
Cl(
n_l, k) * (vr_l(k, 0) * vort(e, 1*N+
n_l) - vr_l(k, 1) * vort(e, 0*N+
n_l)) ;
454 int c, e, n, k, d, d2;
458 for (f = 0 ; f<domaine.nb_faces() ; f++)
462 for ( c = 0; c < 2 && (e = f_e(f, c)) >= 0; c++)
464 for (n = 0; n < N; n++)
466 in.
alpha[n] += vf_dir(f, c)/vf(f) * alpha(e, n);
467 in.
p[n] += vf_dir(f, c)/vf(f) * press(e, n * (Np > 1));
468 in.
T[n] += vf_dir(f, c)/vf(f) * temp(e, n);
469 in.
rho[n] += vf_dir(f, c)/vf(f) * rho(!cR * e, n);
470 in.
mu[n] += vf_dir(f, c)/vf(f) * mu(!cM * e, n);
471 in.
d_bulles[n] += vf_dir(f, c)/vf(f) *d_bulles(e,n) ;
472 for (k = n+1; k < N; k++)
475 const int ind_trav = sigma_pair_index(n, k, N);
476 in.
sigma[ind_trav] += vf_dir(f, c) / vf(f) * Sigma_tab(e, ind_trav);
478 for (k = 0; k < N; k++)
479 in.
nv(k, n) += vf_dir(f, c)/vf(f) * ch.
v_norm(pvit, pvit, e, f, k, n,
nullptr,
nullptr);
481 for (n = 0; n <Nk; n++) in.
k_turb[n] += (k_turb) ? vf_dir(f, c)/vf(f) * (*k_turb)(e,0) : 0;
487 for (d = 0 ; d<D ; d++)
488 for (d2 = 0 ; d2<D ; d2++)
489 for (c=0 ; c<2 && (e = f_e(f, c)) >= 0; c++)
490 grad_l(d, d2) += vf_dir(f, c)/vf(f)*grad_v(nf_tot + D*e + d2 ,
n_l * D + d) ;
493 for (d = 0 ; d<D ; d++)
494 for (d2 = 0 ; d2<D ; d2++)
495 scal_grad(d) += grad_l(d, d2)*n_f(f, d2)/fs(f);
496 for (d = 0 ; d<D ; d++)
497 for (d2 = 0 ; d2<D ; d2++)
498 grad_l(d, d2) += (grad_v(f ,
n_l*D+d) - scal_grad(d)) * n_f(f, d2)/fs(f);
500 vort_l(0) = grad_l(2, 1) - grad_l(1, 2);
501 vort_l(1) = grad_l(0, 2) - grad_l(2, 0);
502 vort_l(2) = grad_l(1, 0) - grad_l(0, 1);
506 for (d = 0 ; d<D ; d++)
507 for (k = 0 ; k<N ; k++)
508 for (c=0 ; c<2 && (e = f_e(f, c)) >= 0; c++)
509 pvit_l(k, d) += vf_dir(f, c)/vf(f)*pvit(domaine.nb_faces_tot()+D*e+d, k) ;
511 for (k = 0 ; k<N ; k++)
512 for (d = 0 ; d<D ; d++)
513 scal_u(k) += pvit_l(k, d)*n_f(f, d)/fs(f);
514 for (k = 0 ; k<N ; k++)
515 for (d = 0 ; d<D ; d++)
516 pvit_l(k, d) += (pvit(f, k) - scal_u(k)) * n_f(f, d)/fs(f) ;
519 for (d = 0 ; d < D ; d++) vl_norm += pvit_l(
n_l, d)*pvit_l(
n_l, d);
520 vl_norm = std::sqrt(vl_norm);
523 for (k = 0; k < N; k++)
524 for (d = 0 ; d < D ; d++) scal_ur(k) += pvit_l(
n_l, d)/vl_norm * (pvit_l(k, d) -pvit_l(
n_l, d));
525 for (k = 0; k < N; k++)
526 for (d = 0 ; d < D ; d++) vr_l(k, d) = pvit_l(
n_l, d)/vl_norm * scal_ur(k) ;
528 else for (k=0 ; k<N ; k++)
529 for (d=0 ; d<D ; d++) vr_l(k, d) = pvit_l(k, d)-pvit_l(
n_l, d) ;
534 for (k = 0; k < N; k++)
543 secmem(f,
n_l) += fac_f * n_f(f, 0)/fs(f) * out.
Cl(
n_l, k) * (vr_l(k, 1) * vort_l(2) - vr_l(k, 2) * vort_l(1)) ;
544 secmem(f, k ) -= fac_f * n_f(f, 0)/fs(f) * out.
Cl(
n_l, k) * (vr_l(k, 1) * vort_l(2) - vr_l(k, 2) * vort_l(1)) ;
545 secmem(f,
n_l) += fac_f * n_f(f, 1)/fs(f) * out.
Cl(
n_l, k) * (vr_l(k, 2) * vort_l(0) - vr_l(k, 0) * vort_l(2)) ;
546 secmem(f, k ) -= fac_f * n_f(f, 1)/fs(f) * out.
Cl(
n_l, k) * (vr_l(k, 2) * vort_l(0) - vr_l(k, 0) * vort_l(2)) ;
547 secmem(f,
n_l) += fac_f * n_f(f, 2)/fs(f) * out.
Cl(
n_l, k) * (vr_l(k, 0) * vort_l(1) - vr_l(k, 1) * vort_l(0)) ;
548 secmem(f, k ) -= fac_f * n_f(f, 2)/fs(f) * out.
Cl(
n_l, k) * (vr_l(k, 0) * vort_l(1) - vr_l(k, 1) * vort_l(0)) ;
565 const DoubleTab& y_elem = domaine.y_elem(),
566 &y_faces = domaine.y_faces();
568 const DoubleTab& vf_dir = domaine.volumes_entrelaces_dir(), &xp = domaine.xp(), &xv = domaine.xv();
569 const DoubleVect& pe =
equation().
milieu().
porosite_elem(), &ve = domaine.volumes(), &fs = domaine.face_surfaces(), &vf = domaine.volumes_entrelaces();
570 const DoubleTab& normales_f = domaine.face_normales();
571 const IntTab& voisins_f = domaine.face_voisins(), &e_f = domaine.elem_faces(), &f_e = domaine.face_voisins();
578 DoubleTrav Rij(0, N, D, D);
582 DoubleTrav grad_Rij(0, N, D, D);
588 DoubleTab fg_w = ch_alpha.
fgrad_w;
591 for (
int n = 0; n < N; n++)
592 for (
int f = 0; f < nf_tot; f++)
593 for (
int d_i = 0; d_i <D ; d_i++)
594 for (
int d_j = 0; d_j <D ; d_j++)
596 grad_Rij(f, n, d_i, d_j) = 0;
599 for (
int j = fg_d(f); j < fg_d(f+1) ; j++)
603 if ( (f_bord = e - ne_tot) < 0)
604 grad_Rij(f, n, d_i, d_j) += fg_w(j) * Rij(e, n, d_i, d_j);
605 else if ( (ch_alpha.
fcl()(f_bord, 0) == 1) || (ch_alpha.
fcl()(f_bord, 0) == 2)
606 || (ch_alpha.
fcl()(f_bord, 0) == 3) || (ch_alpha.
fcl()(f_bord, 0) == 6))
608 Process::exit(
"You must have a neumann limit condition on alpha for RIJ_BIF to work !");
614 for (
int n = 0; n < N; n++)
615 for (
int e = 0; e < ne_tot; e++)
616 for (
int d_d=0 ; d_d<D ; d_d++)
617 for (
int d_i = 0; d_i <D ; d_i++)
618 for (
int d_j = 0; d_j <D ; d_j++)
620 grad_Rij(nf_tot + D *e + d_d, n, d_i, d_j) = 0;
621 for (
int j = 0, f; j < e_f.dimension(1) && (f = e_f(e, j)) >= 0; j++)
622 grad_Rij(nf_tot + D *e + d_d, n, d_i, d_j) += (e == f_e(f, 0) ? 1 : -1) * fs(f) * (xv(f, d_d) - xp(e, d_d)) / ve(e) * grad_Rij(f, n, d_i, d_j);
627 for(
int e = 0 ; e < ne_tot ; e++)
628 for(
int n = 0; n<N ; n++)
629 for (
int d_i = 0; d_i < D; d_i++)
633 for(
int k = 0; k<N ; k++)
635 if (k!=
n_l && d_bulles(e,k)>d_b_elem) d_b_elem = d_bulles(e,k);
638 if (y_elem(e) < 0.5 * d_b_elem)
640 double secmem_en = 0;
641 for (
int d_j = 0; d_j < D; d_j++)
642 secmem_en -= grad_Rij(nf_tot + D *e + d_j, n, d_i, d_j) ;
643 secmem_en *= (-1) * pe(e) * ve(e) * tab_alp(e, n) * tab_rho(e, n) ;
644 secmem(nf_tot + e*D + d_i, n) += secmem_en;
653 for(
int f = 0 ; f < nf ; f++)
654 for(
int n = 0; n<N ; n++)
655 for (
int i = 0; i < 2 && (e = voisins_f(f, i)) >= 0; i++)
659 for(
int k = 0; k<N ; k++)
661 if (k!=
n_l && d_bulles(e,k)>d_b_face) d_b_face = d_bulles(e,k);
664 double d_b = vf_dir(f, i)/vf(f) * d_b_face ;
665 if (y_faces(f) < 0.5 * d_b)
667 DoubleTrav secmem_en(3);
669 for (
int d_i = 0; d_i < D; d_i++)
670 for (
int d_j = 0; d_j < D; d_j++)
672 secmem_en(d_i) -= grad_Rij(nf_tot + D *e + d_j, n, d_i, d_j) ;
675 for (
int d_i = 0; d_i < D; d_i++)
676 secmem_en(d_i) *= (-1) * pe(e) * vf_dir(f, i) * tab_alp(e, n) * tab_rho(e, n);
677 double flux_face = domaine.dot(&normales_f(f, 0), &secmem_en(0));
678 secmem(f, n) += flux_face;