1#ifndef __CS_CONVECTION_DIFFUSION_PRIV_H__
2#define __CS_CONVECTION_DIFFUSION_PRIV_H__
96 cs_real_t beta_m, rfc, r1f, r1, r2, r3, b1, b2;
101 rfc = (nvf_r_f-nvf_r_c)/(1.-nvf_r_c);
103 if (nvf_p_c < beta_m) {
104 nvf_p_f = nvf_p_c*(1.+rfc*(1.-nvf_p_c)/beta_m);
106 r1f = (1.-nvf_r_f)/(1.-nvf_r_c);
108 nvf_p_f = r1f*nvf_p_c+rfc;
114 if (nvf_p_c < (nvf_r_c/3.)) {
115 r1 = nvf_r_f*(1.-3.*nvf_r_c+2.*nvf_r_f);
116 r2 = nvf_r_c*(1.-nvf_r_c);
118 nvf_p_f = nvf_p_c*r1/r2;
119 }
else if (nvf_p_c <= (nvf_r_c*(1.+nvf_r_f-nvf_r_c)/nvf_r_f)) {
120 rfc = (nvf_r_f-nvf_r_c)/(1.-nvf_r_c);
121 r1f = (1.-nvf_r_f)/(1.-nvf_r_c);
123 nvf_p_f = nvf_r_f*(r1f*nvf_p_c/nvf_r_c + rfc);
131 if (nvf_p_c < (3.*nvf_r_c/4.)) {
132 rfc = (nvf_r_f-nvf_r_c)/(1.-nvf_r_c);
134 nvf_p_f = nvf_r_f*(1.+rfc/3.)*nvf_p_c/nvf_r_c;
135 }
else if (nvf_p_c <= (nvf_r_c*(1.+2.*(nvf_r_f-nvf_r_c))/(2.*nvf_r_f-nvf_r_c))) {
136 rfc = (nvf_r_f-nvf_r_c)/(1.-nvf_r_c);
137 r1f = (1.-nvf_r_f)/(1.-nvf_r_c);
139 nvf_p_f = nvf_r_f*(r1f*nvf_p_c/nvf_r_c+rfc);
141 r1f = (1.-nvf_r_f)/(1.-nvf_r_c);
143 nvf_p_f = 1.-.5*r1f*(1.-nvf_p_c);
149 if (nvf_p_c < (nvf_r_c/(2.-nvf_r_c))) {
150 nvf_p_f = (2.*nvf_r_f-nvf_r_c)*nvf_p_c/nvf_r_c;
151 }
else if (nvf_p_c < nvf_r_c) {
152 rfc = (nvf_r_f-nvf_r_c)/(1.-nvf_r_c);
153 r1f = (1.-nvf_r_f)/(1.-nvf_r_c);
155 nvf_p_f = r1f*nvf_p_c+rfc;
156 }
else if (nvf_p_c < (nvf_r_c/nvf_r_f)) {
157 nvf_p_f = nvf_r_f*nvf_p_c/nvf_r_c;
165 if (nvf_p_c < (.5*nvf_r_c)) {
166 nvf_p_f = (2.*nvf_r_f-nvf_r_c)*nvf_p_c/nvf_r_c;
167 }
else if (nvf_p_c < (1.+nvf_r_c-nvf_r_f)) {
168 nvf_p_f = nvf_p_c+nvf_r_f-nvf_r_c;
176 if (nvf_p_c < nvf_r_c) {
177 nvf_p_f = nvf_r_f*nvf_p_c/nvf_r_c;
179 rfc = (nvf_r_f-nvf_r_c)/(1.-nvf_r_c);
180 r1f = (1.-nvf_r_f)/(1.-nvf_r_c);
182 nvf_p_f = r1f*nvf_p_c+rfc;
188 r1 = nvf_r_c*nvf_r_c-nvf_r_f;
189 r2 = nvf_r_c*(nvf_r_c-1.);
190 r3 = nvf_r_f-nvf_r_c;
192 nvf_p_f = nvf_p_c*(r1+r3*nvf_p_c)/r2;
197 b1 = (nvf_r_c-nvf_r_f)*nvf_r_c;
198 b2 = nvf_r_c+nvf_r_f+2.*nvf_r_f*nvf_r_f-4.*nvf_r_f*nvf_r_c;
200 if (nvf_p_c < (b1/b2)) {
201 r1 = -nvf_r_f*(1.-3.*nvf_r_c+2.*nvf_r_f);
202 r2 = nvf_r_c*(nvf_r_c-1.);
204 nvf_p_f = nvf_p_c*r1/r2;
205 }
else if (nvf_p_c < nvf_r_c) {
206 rfc = (nvf_r_f-nvf_r_c)/(1.-nvf_r_c);
207 r1f = (1.-nvf_r_f)/(1.-nvf_r_c);
209 nvf_p_f = r1f*nvf_p_c+rfc;
210 }
else if (nvf_p_c < (nvf_r_c*(1.+nvf_r_f-nvf_r_c)/nvf_r_f)) {
211 rfc = (nvf_r_f-nvf_r_c)/(1.-nvf_r_c);
212 r1f = (1.-nvf_r_f)/(1.-nvf_r_c);
214 nvf_p_f = nvf_r_f*(nvf_p_c*r1f/nvf_r_c+rfc);
222 if (nvf_p_c < (nvf_r_c/nvf_r_f)) {
223 nvf_p_f = nvf_r_f*nvf_p_c/nvf_r_c;
231 r1 = nvf_r_c*nvf_r_f*(nvf_r_f-nvf_r_c);
232 r2 = 2.*nvf_r_c*(1.-nvf_r_c)-nvf_r_f*(1.-nvf_r_f);
234 if (nvf_p_c < (r1/r2)) {
235 nvf_p_f = 2.*nvf_p_c;
236 }
else if (nvf_p_c <= (nvf_r_c*(1.+nvf_r_f-nvf_r_c)/nvf_r_f)) {
237 rfc = (nvf_r_f-nvf_r_c)/(1.-nvf_r_c);
238 r1f = (1.-nvf_r_f)/(1.-nvf_r_c);
240 nvf_p_f = nvf_r_f*(nvf_p_c*r1f/nvf_r_c+rfc);
284 cs_real_t blend, high_order, low_order, ratio;
294 high_order = 2.*nvf_p_c;
314 nvf_p_f = blend*high_order + (1.-blend)*low_order;
317 if (c_courant < .7 && c_courant > .3) {
318 nvf_p_f = nvf_p_f + (nvf_p_f - low_order)*(.7 - c_courant )/.4;
319 }
else if (c_courant >= .7) {
324 if (c_courant <= .3) {
326 }
else if (c_courant <= .6) {
328 }
else if (c_courant <= .7) {
333 high_order = 10.*( (.7-c_courant)*
cs_math_fmin(1., nvf_p_c/.3)
334 + (c_courant-.6)*superbee);
358 nvf_p_f = blend*high_order + (1.-blend)*low_order;
381 nvf_p_f = blend*high_order + (1.-blend)*low_order;
422 *testij = grdpai[0]*grdpaj[0]
423 + grdpai[1]*grdpaj[1]
424 + grdpai[2]*grdpaj[2];
426 if (i_massflux > 0.) {
427 dcc = gradi[0]*i_face_u_normal[0]
428 + gradi[1]*i_face_u_normal[1]
429 + gradi[2]*i_face_u_normal[2];
430 ddi = grdpai[0]*i_face_u_normal[0]
431 + grdpai[1]*i_face_u_normal[1]
432 + grdpai[2]*i_face_u_normal[2];
436 dcc = gradj[0]*i_face_u_normal[0]
437 + gradj[1]*i_face_u_normal[1]
438 + gradj[2]*i_face_u_normal[2];
440 ddj = grdpaj[0]*i_face_u_normal[0]
441 + grdpaj[1]*i_face_u_normal[1]
442 + grdpaj[2]*i_face_u_normal[2];
469template <cs_lnum_t str
ide>
483 cs_real_t dcc[stride], ddi[stride], ddj[stride];
490 for (
int i = 0; i < stride; i++) {
491 *testij += gradsti[i][0]*gradstj[i][0]
492 + gradsti[i][1]*gradstj[i][1]
493 + gradsti[i][2]*gradstj[i][2];
495 if (i_massflux > 0.) {
496 dcc[i] = gradi[i][0]*i_face_u_normal[0]
497 + gradi[i][1]*i_face_u_normal[1]
498 + gradi[i][2]*i_face_u_normal[2];
499 ddi[i] = gradsti[i][0]*i_face_u_normal[0]
500 + gradsti[i][1]*i_face_u_normal[1]
501 + gradsti[i][2]*i_face_u_normal[2];
502 ddj[i] = (pj[i]-pi[i])/distf;
505 dcc[i] = gradj[i][0]*i_face_u_normal[0]
506 + gradj[i][1]*i_face_u_normal[1]
507 + gradj[i][2]*i_face_u_normal[2];
508 ddi[i] = (pj[i]-pi[i])/distf;
509 ddj[i] = gradstj[i][0]*i_face_u_normal[0]
510 + gradstj[i][1]*i_face_u_normal[1]
511 + gradstj[i][2]*i_face_u_normal[2];
549 cs_real_t gradpf[3] = {0.5*(gradi[0] + gradj[0]),
550 0.5*(gradi[1] + gradj[1]),
551 0.5*(gradi[2] + gradj[2])};
581template <cs_lnum_t str
ide>
599 for (
int isou = 0; isou < stride; isou++) {
601 for (
int jsou = 0; jsou < 3; jsou++)
602 dpvf[jsou] = 0.5*( gradi[isou][jsou]
603 + gradj[isou][jsou]);
610 pip[isou] = pi[isou] + recoi[isou];
611 pjp[isou] = pj[isou] + recoj[isou];
647 *pir = pi/relaxp - (1.-relaxp)/relaxp * pia;
648 *pjr = pj/relaxp - (1.-relaxp)/relaxp * pja;
650 *pipr = *pir + recoi;
651 *pjpr = *pjr + recoj;
675template <cs_lnum_t str
ide>
689 for (
int isou = 0; isou < stride; isou++) {
690 pir[isou] = pi[isou] /relaxp - (1.-relaxp)/relaxp * pia[isou];
691 pjr[isou] = pj[isou] /relaxp - (1.-relaxp)/relaxp * pja[isou];
693 pipr[isou] = pir[isou] + recoi[isou];
694 pjpr[isou] = pjr[isou] + recoj[isou];
726template <cs_lnum_t str
ide>
731 for (
int isou = 0; isou < stride; isou++)
752 *pf = pnd*pip + (1.-pnd)*pjp;
769template <cs_lnum_t str
ide>
776 for (
int isou = 0; isou < stride; isou++)
777 pf[isou] = pnd*pip[isou] + (1.-pnd)*pjp[isou];
801 df[0] = i_face_cog[0] - cell_cen[0];
802 df[1] = i_face_cog[1] - cell_cen[1];
803 df[2] = i_face_cog[2] - cell_cen[2];
823template <cs_lnum_t str
ide>
833 for (
cs_lnum_t jsou = 0; jsou < 3; jsou++)
834 df[jsou] = i_face_cog[jsou] - cell_cen[jsou];
836 for (
cs_lnum_t isou = 0; isou < stride; isou++) {
837 pf[isou] =
p[isou] + df[0]*grad[isou][0]
838 + df[1]*grad[isou][1]
839 + df[2]*grad[isou][2];
860 *pf = blencp * (*pf) + (1. - blencp) *
p;
878template <cs_lnum_t str
ide>
884 for (
int isou = 0; isou < stride; isou++)
885 pf[isou] = blencp*(pf[isou])+(1.-blencp)*
p[isou];
928 flui = 0.5*(i_massflux + fabs(i_massflux));
929 fluj = 0.5*(i_massflux - fabs(i_massflux));
931 fluxij[0] += iconvp*xcppi*(thetap*(flui*pifri + fluj*pjfri) - imasac*i_massflux*pi);
932 fluxij[1] += iconvp*xcppj*(thetap*(flui*pifrj + fluj*pjfrj) - imasac*i_massflux*pj);
958template <cs_lnum_t str
ide>
975 flui = 0.5*(i_massflux + fabs(i_massflux));
976 fluj = 0.5*(i_massflux - fabs(i_massflux));
978 for (
int isou = 0; isou < stride; isou++) {
979 fluxi[isou] += iconvp*( thetap*(flui*pifri[isou] + fluj*pjfri[isou])
980 - imasac*i_massflux*pi[isou]);
981 fluxj[isou] += iconvp*( thetap*(flui*pifrj[isou] + fluj*pjfrj[isou])
982 - imasac*i_massflux*pj[isou]);
1011 fluxij[0] += idiffp*thetap*i_visc*(pipr -pjp);
1012 fluxij[1] += idiffp*thetap*i_visc*(pip -pjpr);
1034template <cs_lnum_t str
ide>
1046 for (
int isou = 0; isou < stride; isou++) {
1047 fluxi[isou] += idiffp*thetap*i_visc*(pipr[isou] -pjp[isou]);
1048 fluxj[isou] += idiffp*thetap*i_visc*(pip[isou] -pjpr[isou]);
1164template <cs_lnum_t str
ide>
1290template <cs_lnum_t str
ide>
1360 const double relaxp,
1361 const double blencp,
1434 }
else if (ischcp == 0) {
1541template <cs_lnum_t str
ide>
1677 const double blencp,
1726 }
else if (ischcp == 0) {
1742 }
else if (ischcp == 3) {
1772 hybrid_blend_interp = fmin(hybrid_blend_i,hybrid_blend_j);
1773 *pif = hybrid_blend_interp*(*pif) + (1. - hybrid_blend_interp)*pif_up;
1774 *pjf = hybrid_blend_interp*(*pjf) + (1. - hybrid_blend_interp)*pjf_up;
1836template <cs_lnum_t str
ide>
1882 else if (ischcp == 3) {
1892 cs_real_t pif_up[stride], pjf_up[stride];
1906 hybrid_blend_interp = fmin(hybrid_blend_i, hybrid_blend_j);
1907 for (
int isou = 0; isou < stride; isou++) {
1908 pif[isou] = hybrid_blend_interp *pif[isou]
1909 + (1. - hybrid_blend_interp)*pif_up[isou];
1910 pjf[isou] = hybrid_blend_interp *pjf[isou]
1911 + (1. - hybrid_blend_interp)*pjf_up[isou];
1989 const double relaxp,
1990 const double blencp,
1991 const double blend_st,
2024 *upwind_switch =
false;
2086 }
else if (ischcp == 0) {
2143 if (tesqck <= 0. || testij <= 0.) {
2158 *upwind_switch =
true;
2236template <cs_lnum_t str
ide>
2314 for (isou = 0; isou < stride; isou++) {
2333 cs_solu_f_val(cell_ceni, i_face_cog, gradi[isou], pir[isou],
2337 cs_solu_f_val(cell_cenj, i_face_cog, gradj[isou], pjr[isou],
2347 if (tesqck <= 0. || testij <= 0.) {
2354 *upwind_switch =
true;
2369 for (isou = 0; isou < stride; isou++) {
2421 const double blencp,
2422 const double blend_st,
2450 *upwind_switch =
false;
2492 }
else if (ischcp == 0) {
2529 if (tesqck<=0. || testij<=0.) {
2538 *upwind_switch =
true;
2582 if (i_massflux >= 0.) {
2635 cs_real_t diff[3] = {cell_cen_d[0] - cell_cen_c[0],
2636 cell_cen_d[1] - cell_cen_c[1],
2637 cell_cen_d[2] - cell_cen_c[2]};
2650 const cs_real_t dist_du = dist_dc + dist_cu;
2656 const cs_real_t grad2c = ((p_d - p_c)/dist_dc - gradc)/dist_dc;
2658 cs_real_t p_u = p_c + (grad2c*dist_cu - gradc)*dist_cu;
2662 const cs_real_t nvf_r_f = (dist_fc+dist_cu)/dist_du;
2663 const cs_real_t nvf_r_c = dist_cu/dist_du;
2670 if (
CS_ABS(p_d-p_u) <= _small) {
2674 const cs_real_t nvf_p_c = (p_c - p_u)/(p_d - p_u);
2676 if (nvf_p_c <= 0. || nvf_p_c >= 1.) {
2698 *pif = p_u + nvf_p_f*(p_d - p_u);
2749template <cs_lnum_t str
ide>
2807 for (isou = 0; isou < stride; isou++) {
2844 if (tesqck <= 0. || testij <= 0.) {
2852 *upwind_switch =
true;
2865 for (isou = 0; isou < stride; isou++) {
2889 *recoi = bldfrp * ( gradi[0]*diipb[0]
2891 + gradi[2]*diipb[2]);
2908template <cs_lnum_t str
ide>
2915 for (
int isou = 0; isou < stride; isou++) {
2916 recoi[isou] = bldfrp * ( gradi[isou][0]*diipb[0]
2917 + gradi[isou][1]*diipb[1]
2918 + gradi[isou][2]*diipb[2]);
2943 *pir = pi/relaxp - (1.-relaxp)/relaxp*pia;
2944 *pipr = *pir + recoi;
2963template <cs_lnum_t str
ide>
2972 for (
int isou = 0; isou < stride; isou++) {
2973 pir[isou] = pi[isou]/relaxp - (1.-relaxp)/relaxp*pia[isou];
2974 pipr[isou] = pir[isou] + recoi[isou];
3033 flui = 0.5*(b_massflux +fabs(b_massflux));
3034 fluj = 0.5*(b_massflux -fabs(b_massflux));
3037 pfac = inc*coefap + coefbp*pipr;
3038 *flux += iconvp*xcpp*(thetap*(flui*pir + fluj*pfac) -imasac*( b_massflux*pi));
3044 pfac = inc*coface + cofbce*pipr;
3045 *flux += iconvp*xcpp*(-imasac*(b_massflux*pi) + thetap*(pfac));
3076template <cs_lnum_t str
ide>
3105 flui = 0.5*(b_massflux +fabs(b_massflux));
3106 fluj = 0.5*(b_massflux -fabs(b_massflux));
3109 for (
int isou = 0; isou < stride; isou++)
3110 flux[isou] += iconvp*( thetap*(flui*pir[isou] + fluj*pfac[isou])
3111 - imasac*b_massflux*pi[isou]);
3118 for (
int isou = 0; isou < stride; isou++) {
3119 pfac[isou] = inc*coface[isou];
3120 for (
int jsou = 0; jsou < stride; jsou++) {
3121 pfac[isou] += cofbce[isou][jsou]*pipr[jsou];
3123 flux[isou] += iconvp*( thetap*pfac[isou]
3124 - imasac*b_massflux*pi[isou]);
3174 flui = 0.5*(b_massflux +fabs(b_massflux));
3175 fluj = 0.5*(b_massflux -fabs(b_massflux));
3178 pfac = inc*coefap + coefbp*pipr;
3179 *flux += iconvp*xcpp*(thetap*(flui*pir + fluj*pfac) -imasac*( b_massflux*pi));
3202template <cs_lnum_t str
ide>
3221 flui = 0.5*(b_massflux +fabs(b_massflux));
3222 fluj = 0.5*(b_massflux -fabs(b_massflux));
3225 for (
int isou = 0; isou < stride; isou++)
3226 flux[isou] += iconvp*( thetap*(flui*pir[isou] + fluj*pfac[isou])
3227 - imasac*b_massflux*pi[isou]);
3255 cs_real_t pfacd = inc*cofafp + cofbfp*pipr;
3256 *flux += idiffp*thetap*b_visc*pfacd;
3274template <cs_lnum_t str
ide>
3282 for (
int isou = 0; isou < stride; isou++)
3283 flux[isou] += idiffp*thetap*b_visc*pfacd[isou];
3304 const double relaxp,
3346template <cs_lnum_t str
ide>
3418template <cs_lnum_t str
ide>
3433 for (
int isou = 0; isou< stride; isou++)
3434 pip[isou] = pi[isou] + recoi[isou];
3457 *fluxi += idiffp*b_visc*(pi - pj);
3476template <cs_lnum_t str
ide>
3484 for (
int k = 0;
k < stride;
k++)
3485 fluxi[
k] += idiffp*b_visc*(pi[
k] - pj[
k]);
cs_nvd_type_t
Definition cs_convection_diffusion.h:61
@ CS_NVD_SUPERBEE
Definition cs_convection_diffusion.h:66
@ CS_NVD_SMART
Definition cs_convection_diffusion.h:64
@ CS_NVD_CUBISTA
Definition cs_convection_diffusion.h:65
@ CS_NVD_STOIC
Definition cs_convection_diffusion.h:70
@ CS_NVD_WASEB
Definition cs_convection_diffusion.h:72
@ CS_NVD_CLAM
Definition cs_convection_diffusion.h:69
@ CS_NVD_OSHER
Definition cs_convection_diffusion.h:71
@ CS_NVD_VOF_CICSAM
Definition cs_convection_diffusion.h:74
@ CS_NVD_GAMMA
Definition cs_convection_diffusion.h:63
@ CS_NVD_MINMOD
Definition cs_convection_diffusion.h:68
@ CS_NVD_VOF_HRIC
Definition cs_convection_diffusion.h:73
@ CS_NVD_MUSCL
Definition cs_convection_diffusion.h:67
static CS_F_HOST_DEVICE void cs_b_diff_flux_coupling(int idiffp, cs_real_t pi, cs_real_t pj, cs_real_t b_visc, cs_real_t *fluxi)
Add diffusive flux to flux at an internal coupling face.
Definition cs_convection_diffusion_priv.h:3451
static CS_F_HOST_DEVICE void cs_i_diff_flux_strided(int idiffp, cs_real_t thetap, const cs_real_t pip[stride], const cs_real_t pjp[stride], const cs_real_t pipr[stride], const cs_real_t pjpr[stride], const cs_real_t i_visc, cs_real_t fluxi[stride], cs_real_t fluxj[stride])
Add diffusive fluxes to fluxes at face ij.
Definition cs_convection_diffusion_priv.h:1036
static CS_F_HOST_DEVICE cs_real_t cs_nvd_vof_scheme_scalar(cs_nvd_type_t limiter, const cs_nreal_t i_face_u_normal[3], cs_real_t nvf_p_c, cs_real_t nvf_r_f, cs_real_t nvf_r_c, const cs_real_t gradv_c[3], const cs_real_t c_courant)
Compute the normalised face scalar using the specified NVD scheme for the case of a Volume-of-Fluid (...
Definition cs_convection_diffusion_priv.h:273
static CS_F_HOST_DEVICE void cs_centered_f_val_strided(double pnd, const cs_real_t pip[stride], const cs_real_t pjp[stride], cs_real_t pf[stride])
Prepare value at face ij by using a centered scheme.
Definition cs_convection_diffusion_priv.h:771
static CS_F_HOST_DEVICE void cs_i_cd_unsteady_slope_test_strided(bool *upwind_switch, int iconvp, cs_real_t bldfrp, int ischcp, double blencp, double blend_st, cs_real_t weight, cs_real_t i_dist, const cs_real_t cell_ceni[3], const cs_real_t cell_cenj[3], const cs_nreal_t i_face_u_normal[3], const cs_real_t i_face_cog[3], const cs_rreal_t diipf[3], const cs_rreal_t djjpf[3], cs_real_t i_massflux, const cs_real_t gradi[stride][3], const cs_real_t gradj[stride][3], const cs_real_t grdpai[stride][3], const cs_real_t grdpaj[stride][3], const cs_real_t pi[stride], const cs_real_t pj[stride], cs_real_t pif[stride], cs_real_t pjf[stride], cs_real_t pip[stride], cs_real_t pjp[stride])
Handle preparation of internal face values for the fluxes computation in case of a unsteady algorithm...
Definition cs_convection_diffusion_priv.h:2751
static CS_F_HOST_DEVICE void cs_i_cd_unsteady(const cs_real_t bldfrp, const int ischcp, const double blencp, const cs_real_t weight, const cs_real_3_t cell_ceni, const cs_real_3_t cell_cenj, const cs_real_3_t i_face_cog, const cs_real_t hybrid_blend_i, const cs_real_t hybrid_blend_j, const cs_rreal_3_t diipf, const cs_rreal_3_t djjpf, const cs_real_3_t gradi, const cs_real_3_t gradj, const cs_real_3_t gradupi, const cs_real_3_t gradupj, const cs_real_t pi, const cs_real_t pj, cs_real_t *pif, cs_real_t *pjf, cs_real_t *pip, cs_real_t *pjp)
Handle preparation of internal face values for the fluxes computation in case of a unsteady algorithm...
Definition cs_convection_diffusion_priv.h:1675
static CS_F_HOST_DEVICE void cs_i_relax_c_val_strided(cs_real_t relaxp, const cs_real_t pia[stride], const cs_real_t pja[stride], const cs_real_t recoi[stride], const cs_real_t recoj[stride], const cs_real_t pi[stride], const cs_real_t pj[stride], cs_real_t pir[stride], cs_real_t pjr[stride], cs_real_t pipr[stride], cs_real_t pjpr[stride])
Compute relaxed values at cell i and j.
Definition cs_convection_diffusion_priv.h:677
static CS_F_HOST_DEVICE void cs_b_relax_c_val_strided(const double relaxp, const cs_real_t pi[stride], const cs_real_t pia[stride], const cs_real_t recoi[stride], cs_real_t pir[stride], cs_real_t pipr[stride])
Compute relaxed values at boundary cell i.
Definition cs_convection_diffusion_priv.h:2965
static CS_F_HOST_DEVICE void cs_i_cd_unsteady_upwind_strided(const cs_real_t bldfrp, const cs_rreal_t diipf[3], const cs_rreal_t djjpf[3], const cs_real_t gradi[stride][3], const cs_real_t gradj[stride][3], const cs_real_t pi[stride], const cs_real_t pj[stride], cs_real_t pif[stride], cs_real_t pjf[stride], cs_real_t pip[stride], cs_real_t pjp[stride])
Handle preparation of internal face values for the fluxes computation in case of an unsteady algorith...
Definition cs_convection_diffusion_priv.h:1292
static CS_F_HOST_DEVICE void cs_b_upwind_flux(const int iconvp, const cs_real_t thetap, const int imasac, const int inc, const int bc_type, const cs_real_t pi, const cs_real_t pir, const cs_real_t pipr, const cs_real_t coefap, const cs_real_t coefbp, const cs_real_t b_massflux, const cs_real_t xcpp, cs_real_t *flux)
Add convective flux (substracting the mass accumulation from it) to flux at boundary face....
Definition cs_convection_diffusion_priv.h:3153
static CS_F_HOST_DEVICE void cs_solu_f_val(const cs_real_t cell_cen[3], const cs_real_t i_face_cog[3], const cs_real_t grad[3], const cs_real_t p, cs_real_t *pf)
Prepare value at face ij by using a Second Order Linear Upwind scheme.
Definition cs_convection_diffusion_priv.h:793
static void cs_sync_scalar_halo(const cs_mesh_t *m, cs_halo_type_t halo_type, cs_real_t pvar[])
Definition cs_convection_diffusion_priv.h:67
static CS_F_HOST_DEVICE void cs_b_cd_steady_strided(cs_real_t bldfrp, double relaxp, const cs_rreal_t diipb[3], const cs_real_t gradi[stride][3], const cs_real_t pi[stride], const cs_real_t pia[stride], cs_real_t pir[stride], cs_real_t pipr[stride])
Handle preparation of boundary face values for the flux computation in case of a steady algorithm.
Definition cs_convection_diffusion_priv.h:3348
static CS_F_HOST_DEVICE void cs_i_relax_c_val(const double relaxp, const cs_real_t pia, const cs_real_t pja, const cs_real_t recoi, const cs_real_t recoj, const cs_real_t pi, const cs_real_t pj, cs_real_t *pir, cs_real_t *pjr, cs_real_t *pipr, cs_real_t *pjpr)
Compute relaxed values at cell i and j.
Definition cs_convection_diffusion_priv.h:635
static CS_F_HOST_DEVICE void cs_i_cd_steady_upwind_strided(const cs_real_t bldfrp, const cs_real_t relaxp, const cs_rreal_t diipf[3], const cs_rreal_t djjpf[3], const cs_real_t gradi[stride][3], const cs_real_t gradj[stride][3], const cs_real_t pi[stride], const cs_real_t pj[stride], const cs_real_t pia[stride], const cs_real_t pja[stride], cs_real_t pifri[stride], cs_real_t pifrj[stride], cs_real_t pjfri[stride], cs_real_t pjfrj[stride], cs_real_t pip[stride], cs_real_t pjp[stride], cs_real_t pipr[stride], cs_real_t pjpr[stride])
Handle preparation of internal face values for the fluxes computation in case of a steady algorithm a...
Definition cs_convection_diffusion_priv.h:1166
static CS_F_HOST_DEVICE void cs_i_cd_unsteady_slope_test(bool *upwind_switch, const int iconvp, const cs_real_t bldfrp, const int ischcp, const double blencp, const double blend_st, const cs_real_t weight, const cs_real_t i_dist, const cs_real_3_t cell_ceni, const cs_real_3_t cell_cenj, const cs_nreal_3_t i_face_u_normal, const cs_real_3_t i_face_cog, const cs_rreal_3_t diipf, const cs_rreal_3_t djjpf, const cs_real_t i_massflux, const cs_real_3_t gradi, const cs_real_3_t gradj, const cs_real_3_t gradupi, const cs_real_3_t gradupj, const cs_real_3_t gradsti, const cs_real_3_t gradstj, const cs_real_t pi, const cs_real_t pj, cs_real_t *pif, cs_real_t *pjf, cs_real_t *pip, cs_real_t *pjp)
Handle preparation of internal face values for the fluxes computation in case of a steady algorithm a...
Definition cs_convection_diffusion_priv.h:2417
static CS_F_HOST_DEVICE void cs_b_upwind_flux_strided(int iconvp, cs_real_t thetap, int imasac, int bc_type, const cs_real_t pi[stride], const cs_real_t pir[stride], const cs_real_t b_massflux, const cs_real_t pfac[stride], cs_real_t flux[stride])
Add convective flux (substracting the mass accumulation from it) to flux at boundary face....
Definition cs_convection_diffusion_priv.h:3204
static CS_F_HOST_DEVICE void cs_i_cd_unsteady_nvd(const cs_nvd_type_t limiter, const double beta, const cs_real_3_t cell_cen_c, const cs_real_3_t cell_cen_d, const cs_nreal_3_t i_face_u_normal, const cs_real_3_t i_face_cog, const cs_real_3_t gradv_c, const cs_real_t p_c, const cs_real_t p_d, const cs_real_t local_max_c, const cs_real_t local_min_c, const cs_real_t courant_c, cs_real_t *pif, cs_real_t *pjf)
Handle preparation of internal face values for the convection flux computation in case of an unsteady...
Definition cs_convection_diffusion_priv.h:2615
static CS_F_HOST_DEVICE void cs_b_diff_flux_coupling_strided(int idiffp, const cs_real_t pi[stride], const cs_real_t pj[stride], cs_real_t b_visc, cs_real_t fluxi[stride])
Add diffusive flux to flux at an internal coupling face for a vector.
Definition cs_convection_diffusion_priv.h:3478
static CS_F_HOST_DEVICE void cs_upwind_f_val_strided(const cs_real_t p[stride], cs_real_t pf[stride])
Prepare value at face ij by using an upwind scheme.
Definition cs_convection_diffusion_priv.h:728
static CS_F_HOST_DEVICE void cs_b_cd_steady(const cs_real_t bldfrp, const double relaxp, const cs_rreal_3_t diipb, const cs_real_3_t gradi, const cs_real_t pi, const cs_real_t pia, cs_real_t *pir, cs_real_t *pipr)
Handle preparation of boundary face values for the flux computation in case of a steady algorithm.
Definition cs_convection_diffusion_priv.h:3303
static CS_F_HOST_DEVICE void cs_b_cd_unsteady_strided(cs_real_t bldfrp, const cs_rreal_t diipb[3], const cs_real_t gradi[stride][3], const cs_real_t pi[stride], cs_real_t pip[stride])
Handle preparation of boundary face values for the flux computation in case of a steady algorithm.
Definition cs_convection_diffusion_priv.h:3420
static CS_F_HOST_DEVICE void cs_b_cd_unsteady(const cs_real_t bldfrp, const cs_rreal_t diipb[3], const cs_real_t gradi[3], const cs_real_t pi, cs_real_t *pip)
Handle preparation of boundary face values for the flux computation in case of an unsteady algorithm.
Definition cs_convection_diffusion_priv.h:3386
static CS_F_HOST_DEVICE void cs_b_relax_c_val(const double relaxp, const cs_real_t pi, const cs_real_t pia, const cs_real_t recoi, cs_real_t *pir, cs_real_t *pipr)
Compute relaxed values at boundary cell i.
Definition cs_convection_diffusion_priv.h:2936
static CS_F_HOST_DEVICE void cs_i_compute_quantities(const cs_real_t bldfrp, const cs_rreal_3_t diipf, const cs_rreal_3_t djjpf, const cs_real_3_t gradi, const cs_real_3_t gradj, const cs_real_t pi, const cs_real_t pj, cs_real_t *recoi, cs_real_t *recoj, cs_real_t *pip, cs_real_t *pjp)
Reconstruct values in I' and J'.
Definition cs_convection_diffusion_priv.h:537
static CS_F_HOST_DEVICE void cs_slope_test(const cs_real_t pi, const cs_real_t pj, const cs_real_t distf, const cs_nreal_t i_face_u_normal[3], const cs_real_t gradi[3], const cs_real_t gradj[3], const cs_real_t grdpai[3], const cs_real_t grdpaj[3], const cs_real_t i_massflux, cs_real_t *testij, cs_real_t *tesqck)
Compute slope test criteria at internal face between cell i and j.
Definition cs_convection_diffusion_priv.h:406
static CS_F_HOST_DEVICE void cs_centered_f_val(double pnd, cs_real_t pip, cs_real_t pjp, cs_real_t *pf)
Prepare value at face ij by using a centered scheme.
Definition cs_convection_diffusion_priv.h:747
static CS_F_HOST_DEVICE void cs_i_cd_steady_upwind(const cs_real_t bldfrp, const cs_real_t relaxp, const cs_rreal_t diipf[3], const cs_rreal_t djjpf[3], const cs_real_t gradi[3], const cs_real_t gradj[3], const cs_real_t pi, const cs_real_t pj, const cs_real_t pia, const cs_real_t pja, cs_real_t *pifri, cs_real_t *pifrj, cs_real_t *pjfri, cs_real_t *pjfrj, cs_real_t *pip, cs_real_t *pjp, cs_real_t *pipr, cs_real_t *pjpr)
Handle preparation of internal face values for the fluxes computation in case of a steady algorithm a...
Definition cs_convection_diffusion_priv.h:1079
static CS_F_HOST_DEVICE void cs_b_imposed_conv_flux_strided(int iconvp, cs_real_t thetap, int imasac, int inc, int bc_type, int icvfli, const cs_real_t pi[stride], const cs_real_t pir[stride], const cs_real_t pipr[stride], const cs_real_t coface[stride], const cs_real_t cofbce[stride][stride], cs_real_t b_massflux, cs_real_t pfac[stride], cs_real_t flux[stride])
Add convective flux (substracting the mass accumulation from it) to flux at boundary face....
Definition cs_convection_diffusion_priv.h:3078
static CS_F_HOST_DEVICE void cs_i_cd_steady_slope_test_strided(bool *upwind_switch, int iconvp, cs_real_t bldfrp, int ischcp, double relaxp, double blencp, double blend_st, cs_real_t weight, cs_real_t i_dist, const cs_real_t cell_ceni[3], const cs_real_t cell_cenj[3], const cs_nreal_t i_face_u_normal[3], const cs_real_t i_face_cog[3], const cs_rreal_t diipf[3], const cs_rreal_t djjpf[3], cs_real_t i_massflux, const cs_real_t gradi[stride][3], const cs_real_t gradj[stride][3], const cs_real_t grdpai[stride][3], const cs_real_t grdpaj[stride][3], const cs_real_t pi[stride], const cs_real_t pj[stride], const cs_real_t pia[stride], const cs_real_t pja[stride], cs_real_t pifri[stride], cs_real_t pifrj[stride], cs_real_t pjfri[stride], cs_real_t pjfrj[stride], cs_real_t pip[stride], cs_real_t pjp[stride], cs_real_t pipr[stride], cs_real_t pjpr[stride])
Handle preparation of internal face values for the fluxes computation in case of a steady algorithm a...
Definition cs_convection_diffusion_priv.h:2238
static CS_F_HOST_DEVICE void cs_i_cd_unsteady_upwind(const cs_real_t bldfrp, const cs_rreal_t diipf[3], const cs_rreal_t djjpf[3], const cs_real_t gradi[3], const cs_real_t gradj[3], const cs_real_t pi, const cs_real_t pj, cs_real_t *pif, cs_real_t *pjf, cs_real_t *pip, cs_real_t *pjp)
Handle preparation of internal face values for the fluxes computation in case of an unsteady algorith...
Definition cs_convection_diffusion_priv.h:1238
static CS_F_HOST_DEVICE void cs_blend_f_val_strided(const double blencp, const cs_real_t p[stride], cs_real_t pf[stride])
Blend face values for a centered or SOLU scheme with face values for an upwind scheme.
Definition cs_convection_diffusion_priv.h:880
static CS_F_HOST_DEVICE void cs_i_conv_flux_strided(int iconvp, cs_real_t thetap, int imasac, const cs_real_t pi[stride], const cs_real_t pj[stride], const cs_real_t pifri[stride], const cs_real_t pifrj[stride], const cs_real_t pjfri[stride], const cs_real_t pjfrj[stride], cs_real_t i_massflux, cs_real_t fluxi[stride], cs_real_t fluxj[stride])
Add convective fluxes (substracting the mass accumulation from them) to fluxes at face ij.
Definition cs_convection_diffusion_priv.h:960
static CS_F_HOST_DEVICE void cs_upwind_f_val(const cs_real_t p, cs_real_t *pf)
Prepare value at face ij by using an upwind scheme.
Definition cs_convection_diffusion_priv.h:708
static CS_F_HOST_DEVICE void cs_b_diff_flux(const int idiffp, const cs_real_t thetap, const int inc, const cs_real_t pipr, const cs_real_t cofafp, const cs_real_t cofbfp, const cs_real_t b_visc, cs_real_t *flux)
Add diffusive flux to flux at boundary face.
Definition cs_convection_diffusion_priv.h:3246
static CS_F_HOST_DEVICE void cs_i_diff_flux(const int idiffp, const cs_real_t thetap, const cs_real_t pip, const cs_real_t pjp, const cs_real_t pipr, const cs_real_t pjpr, const cs_real_t i_visc, cs_real_t fluxij[2])
Add diffusive fluxes to fluxes at face ij.
Definition cs_convection_diffusion_priv.h:1002
static CS_F_HOST_DEVICE void cs_i_cd_steady_strided(cs_real_t bldfrp, int ischcp, double relaxp, double blencp, cs_real_t weight, const cs_real_t cell_ceni[3], const cs_real_t cell_cenj[3], const cs_real_t i_face_cog[3], const cs_rreal_t diipf[3], const cs_rreal_t djjpf[3], const cs_real_t gradi[stride][3], const cs_real_t gradj[stride][3], const cs_real_t pi[stride], const cs_real_t pj[stride], const cs_real_t pia[stride], const cs_real_t pja[stride], cs_real_t pifri[stride], cs_real_t pifrj[stride], cs_real_t pjfri[stride], cs_real_t pjfrj[stride], cs_real_t pip[stride], cs_real_t pjp[stride], cs_real_t pipr[stride], cs_real_t pjpr[stride])
Handle preparation of internal face values for the fluxes computation in case of a steady algorithm a...
Definition cs_convection_diffusion_priv.h:1543
static CS_F_HOST_DEVICE void cs_solu_f_val_strided(const cs_real_t cell_cen[3], const cs_real_t i_face_cog[3], const cs_real_t grad[stride][3], const cs_real_t p[stride], cs_real_t pf[stride])
Prepare value at face ij by using a Second Order Linear Upwind scheme.
Definition cs_convection_diffusion_priv.h:825
static CS_F_HOST_DEVICE void cs_b_diff_flux_strided(int idiffp, cs_real_t thetap, cs_real_t b_visc, const cs_real_t pfacd[stride], cs_real_t flux[stride])
Add diffusive flux to flux at boundary face.
Definition cs_convection_diffusion_priv.h:3276
static CS_F_HOST_DEVICE void cs_i_cd_steady(const cs_real_t bldfrp, const int ischcp, const double relaxp, const double blencp, const cs_real_t weight, const cs_real_t cell_ceni[3], const cs_real_t cell_cenj[3], const cs_real_t i_face_cog[3], const cs_rreal_t diipf[3], const cs_rreal_t djjpf[3], const cs_real_t gradi[3], const cs_real_t gradj[3], const cs_real_t gradupi[3], const cs_real_t gradupj[3], const cs_real_t pi, const cs_real_t pj, const cs_real_t pia, const cs_real_t pja, cs_real_t *pifri, cs_real_t *pifrj, cs_real_t *pjfri, cs_real_t *pjfrj, cs_real_t *pip, cs_real_t *pjp, cs_real_t *pipr, cs_real_t *pjpr)
Handle preparation of internal face values for the fluxes computation in case of a steady algorithm a...
Definition cs_convection_diffusion_priv.h:1358
static CS_F_HOST_DEVICE void cs_b_compute_quantities_strided(const cs_rreal_t diipb[3], const cs_real_t gradi[stride][3], const cs_real_t bldfrp, cs_real_t recoi[stride])
Reconstruct values in I' at boundary cell i.
Definition cs_convection_diffusion_priv.h:2910
static CS_F_HOST_DEVICE void cs_central_downwind_cells(const cs_lnum_t ii, const cs_lnum_t jj, const cs_real_t i_massflux, cs_lnum_t *ic, cs_lnum_t *id)
Determine the upwind and downwind sides of an internal face and matching cell indices.
Definition cs_convection_diffusion_priv.h:2576
static CS_F_HOST_DEVICE void cs_i_conv_flux(const int iconvp, const cs_real_t thetap, const int imasac, const cs_real_t pi, const cs_real_t pj, const cs_real_t pifri, const cs_real_t pifrj, const cs_real_t pjfri, const cs_real_t pjfrj, const cs_real_t i_massflux, const cs_real_t xcppi, const cs_real_t xcppj, cs_real_2_t fluxij)
Add convective fluxes (substracting the mass accumulation from them) to fluxes at face ij.
Definition cs_convection_diffusion_priv.h:912
static CS_F_HOST_DEVICE void cs_i_compute_quantities_strided(const cs_real_t bldfrp, const cs_rreal_t diipf[3], const cs_rreal_t djjpf[3], const cs_real_t gradi[stride][3], const cs_real_t gradj[stride][3], const cs_real_t pi[stride], const cs_real_t pj[stride], cs_real_t recoi[stride], cs_real_t recoj[stride], cs_real_t pip[stride], cs_real_t pjp[stride])
Reconstruct values in I' and J'.
Definition cs_convection_diffusion_priv.h:583
static CS_F_HOST_DEVICE cs_real_t cs_nvd_scheme_scalar(const cs_nvd_type_t limiter, const cs_real_t nvf_p_c, const cs_real_t nvf_r_f, const cs_real_t nvf_r_c)
Compute the normalized face scalar using the specified NVD scheme.
Definition cs_convection_diffusion_priv.h:89
static CS_F_HOST_DEVICE void cs_b_compute_quantities(const cs_rreal_t diipb[3], const cs_real_t gradi[3], const cs_real_t bldfrp, cs_real_t *recoi)
Reconstruct values in I' at boundary cell i.
Definition cs_convection_diffusion_priv.h:2884
static CS_F_HOST_DEVICE void cs_i_cd_steady_slope_test(bool *upwind_switch, const int iconvp, const cs_real_t bldfrp, const int ischcp, const double relaxp, const double blencp, const double blend_st, const cs_real_t weight, const cs_real_t i_dist, const cs_real_t cell_ceni[3], const cs_real_t cell_cenj[3], const cs_nreal_t i_face_u_normal[3], const cs_real_t i_face_cog[3], const cs_rreal_t diipf[3], const cs_rreal_t djjpf[3], const cs_real_t i_massflux, const cs_real_t gradi[3], const cs_real_t gradj[3], const cs_real_t gradupi[3], const cs_real_t gradupj[3], const cs_real_t gradsti[3], const cs_real_t gradstj[3], const cs_real_t pi, const cs_real_t pj, const cs_real_t pia, const cs_real_t pja, cs_real_t *pifri, cs_real_t *pifrj, cs_real_t *pjfri, cs_real_t *pjfrj, cs_real_t *pip, cs_real_t *pjp, cs_real_t *pipr, cs_real_t *pjpr)
Handle preparation of internal face values for the fluxes computation in case of a steady algorithm a...
Definition cs_convection_diffusion_priv.h:1985
static CS_F_HOST_DEVICE void cs_blend_f_val(const double blencp, const cs_real_t p, cs_real_t *pf)
Blend face values for a centered or SOLU scheme with face values for an upwind scheme.
Definition cs_convection_diffusion_priv.h:856
static CS_F_HOST_DEVICE void cs_i_cd_unsteady_strided(cs_real_t bldfrp, int ischcp, double blencp, cs_real_t weight, const cs_real_t cell_ceni[3], const cs_real_t cell_cenj[3], const cs_real_t i_face_cog[3], const cs_real_t hybrid_blend_i, const cs_real_t hybrid_blend_j, const cs_rreal_t diipf[3], const cs_rreal_t djjpf[3], const cs_real_t gradi[stride][3], const cs_real_t gradj[stride][3], const cs_real_t pi[stride], const cs_real_t pj[stride], cs_real_t pif[stride], cs_real_t pjf[stride], cs_real_t pip[stride], cs_real_t pjp[stride])
Handle preparation of internal face values for the fluxes computation in case of an unsteady algorith...
Definition cs_convection_diffusion_priv.h:1838
static CS_F_HOST_DEVICE void cs_b_imposed_conv_flux(int iconvp, cs_real_t thetap, int imasac, int inc, int bc_type, int icvfli, cs_real_t pi, cs_real_t pir, cs_real_t pipr, cs_real_t coefap, cs_real_t coefbp, cs_real_t coface, cs_real_t cofbce, cs_real_t b_massflux, cs_real_t xcpp, cs_real_t *flux)
Add convective flux (substracting the mass accumulation from it) to flux at boundary face....
Definition cs_convection_diffusion_priv.h:3005
static CS_F_HOST_DEVICE void cs_slope_test_strided(const cs_real_t pi[stride], const cs_real_t pj[stride], const cs_real_t distf, const cs_nreal_t i_face_u_normal[3], const cs_real_t gradi[stride][3], const cs_real_t gradj[stride][3], const cs_real_t gradsti[stride][3], const cs_real_t gradstj[stride][3], const cs_real_t i_massflux, cs_real_t *testij, cs_real_t *tesqck)
Compute slope test criteria at internal face between cell i and j.
Definition cs_convection_diffusion_priv.h:471
#define CS_F_HOST_DEVICE
Definition cs_defs.h:561
cs_rreal_t cs_rreal_3_t[3]
Definition cs_defs.h:388
cs_nreal_t cs_nreal_3_t[3]
Definition cs_defs.h:385
double cs_real_t
Floating-point value.
Definition cs_defs.h:342
#define CS_ABS(a)
Definition cs_defs.h:504
cs_real_t cs_real_2_t[2]
vector of 2 floating-point values
Definition cs_defs.h:358
#define CS_UNUSED(x)
Definition cs_defs.h:528
double cs_rreal_t
Definition cs_defs.h:348
double cs_nreal_t
Definition cs_defs.h:346
int cs_lnum_t
local mesh entity id
Definition cs_defs.h:335
cs_real_t cs_real_3_t[3]
vector of 3 floating-point values
Definition cs_defs.h:359
@ p
Definition cs_field_pointer.h:67
@ k
Definition cs_field_pointer.h:72
void cs_halo_sync_var(const cs_halo_t *halo, cs_halo_type_t sync_mode, cs_real_t var[])
Definition cs_halo.cpp:2083
cs_halo_type_t
Definition cs_halo.h:56
static CS_F_HOST_DEVICE cs_real_t cs_math_3_distance(const cs_real_t xa[3], const cs_real_t xb[3])
Compute the (euclidean) distance between two points xa and xb in a Cartesian coordinate system of dim...
Definition cs_math.h:629
static CS_F_HOST_DEVICE cs_real_t cs_math_3_dot_product(const cs_real_t u[3], const cs_real_t v[3])
Compute the dot product of two vectors of 3 real values.
Definition cs_math.h:696
const cs_real_t cs_math_epzero
static CS_F_HOST_DEVICE cs_real_t cs_math_3_norm(const cs_real_t v[3])
Compute the euclidean norm of a vector of dimension 3.
Definition cs_math.h:765
static CS_F_HOST_DEVICE cs_real_t cs_math_fabs(cs_real_t x)
Compute the absolute value of a real value.
Definition cs_math.h:466
static CS_F_HOST_DEVICE cs_real_t cs_math_fmin(cs_real_t x, cs_real_t y)
Compute the min value of two real values.
Definition cs_math.h:484
static CS_F_HOST_DEVICE cs_real_t cs_math_sq(cs_real_t x)
Compute the square of a real value.
Definition cs_math.h:545
static CS_F_HOST_DEVICE cs_real_t cs_math_fmax(cs_real_t x, cs_real_t y)
Compute the max value of two real values.
Definition cs_math.h:503
@ CS_COUPLED_FD
Definition cs_parameters.h:101
cs_halo_t * halo
Definition cs_mesh.h:156