16#include <Dirichlet_paroi_defilante.h>
17#include <Echange_externe_impose.h>
18#include <Scalaire_impose_paroi.h>
19#include <Dirichlet_paroi_fixe.h>
20#include <Modele_turbulence_hyd_base.h>
21#include <Schema_Temps_base.h>
22#include <Neumann_homogene.h>
23#include <Operateur_base.h>
24#include <Champ_Uniforme.h>
25#include <Neumann_paroi.h>
26#include <distances_VEF.h>
27#include <Probleme_base.h>
28#include <Fluide_base.h>
29#include <Periodique.h>
30#include <Champ_P1NC.h>
37#include <TRUSTArray_kokkos.tpp>
68 for (
int ncomp = 0; ncomp <
nb_comp(); ncomp++)
70 return (vit_norm > 0);
83 CDoubleTabView3 gradient_elem = tab_gradient_elem.
view_ro<3>();
88 DoubleArrView vorticite =
static_cast<DoubleVect&
>(tab_vorticite).view_wo();
89 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_elem, KOKKOS_LAMBDA(
const int num_elem)
91 vorticite(num_elem) = gradient_elem(num_elem, 1, 0) - gradient_elem(num_elem, 0, 1);
97 DoubleTabView vorticite = tab_vorticite.
view_wo();
98 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_elem, KOKKOS_LAMBDA(
const int num_elem)
100 vorticite(num_elem, 0) = gradient_elem(num_elem, 2, 1) - gradient_elem(num_elem, 1, 2);
101 vorticite(num_elem, 1) = gradient_elem(num_elem, 0, 2) - gradient_elem(num_elem, 2, 0);
102 vorticite(num_elem, 2) = gradient_elem(num_elem, 1, 0) - gradient_elem(num_elem, 0, 1);
106 end_gpu_timer(__KERNEL_NAME__);
111void calculer_gradientP1NC_2D(
const DoubleTab& tab_variable,
const Domaine_VEF& domaine_VEF,
const Domaine_Cl_VEF& domaine_Cl_VEF, DoubleTab& tab_gradient_elem)
113 const DoubleTab& tab_face_normales = domaine_VEF.
face_normales();
114 const IntTab& tab_face_voisins = domaine_VEF.
face_voisins();
116 const ArrOfInt& tab_est_face_bord = domaine_VEF.
est_face_bord();
118 CDoubleTabView face_normales = tab_face_normales.
view_ro();
119 CIntTabView face_voisins = tab_face_voisins.
view_ro();
120 CDoubleArrView inverse_volumes = tab_inverse_volumes.view_ro();
121 CDoubleArrView variable =
static_cast<const ArrOfDouble&
>(tab_variable).view_ro();
122 CIntArrView est_face_bord = tab_est_face_bord.view_ro();
123 DoubleTabView gradient_elem = tab_gradient_elem.
view_rw();
129 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
131 KOKKOS_LAMBDA (
int fac)
133 int type_face = est_face_bord(fac);
138 int elem1 = face_voisins(fac, 0);
139 int elem2 = face_voisins(fac, 1);
141 for (
int i = 0; i < dimension; i++)
143 double grad = 0.5 * face_normales(fac,i) * variable(fac);
144 Kokkos::atomic_add(&gradient_elem(elem1, i), +grad);
145 Kokkos::atomic_add(&gradient_elem(elem2, i), -grad);
149 else if (type_face == 1)
151 int elem1 = face_voisins(fac,0);
153 for (
int i = 0; i < dimension; i++)
155 double grad = face_normales(fac,i) * variable(fac);
156 Kokkos::atomic_add(&gradient_elem(elem1, i), grad);
160 else if (type_face == 0)
162 int elem1 = face_voisins(fac, 0);
163 int elem2 = face_voisins(fac, 1);
165 for (
int i = 0; i < dimension; i++)
167 double grad = face_normales(fac,i) * variable(fac);
168 if (elem1 >= 0) Kokkos::atomic_add(&gradient_elem(elem1, i), +grad);
169 if (elem2 >= 0) Kokkos::atomic_add(&gradient_elem(elem2, i), -grad);
173 end_gpu_timer(__KERNEL_NAME__);
176 auto vol_div = KOKKOS_LAMBDA (
int elem,
int i)
178 gradient_elem(elem, i) *= inverse_volumes(elem);
180 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), range_2D({0,0}, {nb_elem,dimension}), vol_div);
181 end_gpu_timer(__KERNEL_NAME__);
185template<
int nbcomp_compile_time,
int dims,
int nbface>
186void calculer_gradientP1NC_3D_template(
const DoubleTab& tab_variable,
189 DoubleTab& tab_gradient_elem)
191 const DoubleTab& tab_face_normales = domaine_VEF.
face_normales();
192 const IntTab& tab_face_voisins = domaine_VEF.
face_voisins();
194 const IntTab& tab_elem_faces = domaine_VEF.
elem_faces();
198 CDoubleTabView face_normales = tab_face_normales.
view_ro();
199 CIntTabView face_voisins = tab_face_voisins.
view_ro();
200 CDoubleArrView inverse_volumes = tab_inverse_volumes.view_ro();
201 CDoubleTabView variable = tab_variable.
view_ro();
202 CIntTabView elem_faces = tab_elem_faces.
view_ro();
203 DoubleTabView3 gradient_elem = tab_gradient_elem.
view_rw<3>();
206 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_elem_tot, KOKKOS_LAMBDA (
int elem)
209 double contrib_grad_loc[nbcomp_compile_time*dims]= {};
211 for (
int iface = 0; iface < nbface; iface++)
213 int fac = elem_faces(elem, iface);
215 double coef = (elem == face_voisins(fac, 0) ? 1 : -1);
217 double face_normales_loc[dims];
218 double variable_loc[nbcomp_compile_time];
220 for (
int i = 0; i < dims; i++)
222 face_normales_loc[i] = face_normales(fac, i);
225 for (
int icomp = 0; icomp < nbcomp_compile_time; icomp++)
227 variable_loc[icomp] = variable(fac, icomp);
230 for (
int icomp = 0; icomp < nbcomp_compile_time; icomp++)
231 for (
int i = 0; i < dims; i++)
233 double grad = coef * face_normales_loc[i] * variable_loc[icomp];
234 contrib_grad_loc[dims*icomp + i] += grad;
238 double inverse = inverse_volumes(elem);
240 for (
int icomp = 0; icomp < nbcomp_compile_time; icomp++)
241 for (
int i = 0; i < dims; i++)
243 gradient_elem(elem, icomp, i) = contrib_grad_loc[dims*icomp + i]*inverse;
248 end_gpu_timer(__KERNEL_NAME__);
255template<
int dims,
int nbface>
259 Cerr <<
"Error in calculer_gradientP1NC_3D: unsupported nb_comp, add more in 'dispatch_nbcomp'" << finl;
264template<
int dims,
int nbface,
int nbcomp_compile_time,
int ...Rest>
266 const DoubleTab& tab_variable,
269 DoubleTab& tab_gradient_elem)
271 if (nbcomp_compile_time == nb_comp_runtime)
273 calculer_gradientP1NC_3D_template<nbcomp_compile_time, dims, nbface>(tab_variable, domaine_VEF,
274 domaine_Cl_VEF, tab_gradient_elem);
279 tab_variable, domaine_VEF, domaine_Cl_VEF, tab_gradient_elem);
284template<
int dims,
int nbface>
285void dispatch_nbcomp(
int nb_comp_runtime,
const DoubleTab& tab_variable,
288 DoubleTab& tab_gradient_elem)
291 dispatch_nbcomp_impl<dims, nbface>(nb_comp_runtime,
TemplateIntList<1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20>(),
292 tab_variable, domaine_VEF, domaine_Cl_VEF, tab_gradient_elem);
295void calculer_gradientP1NC_3D(
const DoubleTab& tab_variable,
298 DoubleTab& tab_gradient_elem)
300 const int nb_comp = tab_variable.
line_size();
302 int nb_faces_elem = domaine_VEF.
elem_faces().dimension(1);
311 switch (nb_faces_elem)
317 dispatch_nbcomp<2,3>(nb_comp, tab_variable,
318 domaine_VEF, domaine_Cl_VEF,
323 dispatch_nbcomp<3,3>(nb_comp, tab_variable,
324 domaine_VEF, domaine_Cl_VEF,
329 Cerr <<
"Error in calculer_gradientP1NC_3D: dimensions must be 2 or 3, got "
330 << dimensions << finl;
339 dispatch_nbcomp<2,4>(nb_comp, tab_variable,
340 domaine_VEF, domaine_Cl_VEF,
345 dispatch_nbcomp<3,4>(nb_comp, tab_variable,
346 domaine_VEF, domaine_Cl_VEF,
351 Cerr <<
"Error in calculer_gradientP1NC_3D: dimensions must be 2 or 3, got "
352 << dimensions << finl;
361 dispatch_nbcomp<2,6>(nb_comp, tab_variable,
362 domaine_VEF, domaine_Cl_VEF,
367 dispatch_nbcomp<3,6>(nb_comp, tab_variable,
368 domaine_VEF, domaine_Cl_VEF,
373 Cerr <<
"Error in calculer_gradientP1NC_3D: dimensions must be 2 or 3, got "
374 << dimensions << finl;
380 Cerr <<
"Error in calculer_gradientP1NC_3D: nb_faces_elem must be 3, 4, or 6 got "
381 << nb_faces_elem << finl;
386void calculer_gradientP1NC(
const DoubleTab& tab_variable,
const Domaine_VEF& domaine_VEF,
const Domaine_Cl_VEF& domaine_Cl_VEF, DoubleTab& tab_gradient_elem)
388 const int nb_comp = tab_variable.
line_size();
389 tab_gradient_elem = 0.;
393 if (nb_comp != 1 || tab_gradient_elem.
nb_dim() == 3)
394 calculer_gradientP1NC_3D(tab_variable, domaine_VEF, domaine_Cl_VEF, tab_gradient_elem);
398 calculer_gradientP1NC_2D(tab_variable, domaine_VEF, domaine_Cl_VEF, tab_gradient_elem);
421 const Domaine_VEF& domaine_VEF = le_dom_VEF.valeur();
422 const int nb_faces = domaine_VEF.
nb_faces();
423 const IntTab& face_sommets = domaine_VEF.
face_sommets();
426 Cerr <<
"Affecter Clement : ... " << finl;
435 for(
int face=0; face<nb_faces; face++)
442 somme+=vals(face_sommets(face,isom));
444 somme+=vals(face_sommets(face,isom), comp);
448 tab(face)=1./6.*somme+2./3.*valf(face);
450 tab(face)=17./60.*somme+3./20.*valf(face);
453 tab(face,comp)=1./6.*somme+2./3.*valf(face,comp);
455 tab(face,comp)=17./60.*somme+3./20.*valf(face,comp);
472 int ndeb, nfin, num_face;
474 for (
int i = 0; i < nb_cl; i++)
486 for (num_face = ndeb; num_face < nfin; num_face++)
489 for (
int comp = 0; comp < nb_compo; comp++)
491 if (ch_tab(num_face, comp) != ch_tab(voisine, comp))
493 moy = 0.5 * (ch_tab(num_face, comp) + ch_tab(voisine, comp));
494 ch_tab(num_face, comp) = moy;
495 ch_tab(voisine, comp) = moy;
510 DoubleTrav tab_gradient_elem(nb_elem_tot, dim, dim);
511 const DoubleTab& vitesse =
valeurs();
514 CDoubleTabView3 gradient_elem = tab_gradient_elem.
view_ro<3>();
515 DoubleArrView Critere_Q = tab_Critere_Q.view_rw();
516 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__),
517 range_1D(0, nb_elem), KOKKOS_LAMBDA(
521 for (
int i = 0; i < dim; i++)
522 for (
int j = 0; j < dim; j++)
524 double deriv1 = gradient_elem(num_elem, i, j);
525 double deriv2 = gradient_elem(num_elem, j, i);
526 crit += -0.25 * deriv1 * deriv2;
528 Critere_Q[num_elem] = crit;
530 end_gpu_timer(__KERNEL_NAME__);
540 int ndeb, nfin, l_unif;
547 const DoubleTab& tab_visco = ch_visco_cin.
valeurs();
551 if (tab_visco(0, 0) > DMINFLOAT)
552 visco0 = tab_visco(0, 0);
563 Cerr <<
"In Champ_P1NC::calcul_y_plus : visco = " << tab_visco.
local_min_vect() <<
" <= 0 ? " << finl;
568 DoubleTab yplus_faces(1, 1);
569 int yplus_already_computed = 0;
571 const RefObjU& modele_turbulence = eqn_hydr.
get_modele(TURBULENCE);
581 yplus_already_computed = 1;
596 DoubleTrav counter(y_plus.
size());
603 CDoubleArrView visco =
static_cast<const DoubleVect&
>(tab_visco).view_ro();
604 CDoubleArrView yp_faces =
static_cast<const DoubleVect&
>(yplus_faces).view_ro();
605 DoubleArrView y_plus_view = y_plus.view_rw();
606 DoubleArrView counter_view =
static_cast<DoubleVect&
>(counter).view_wo();
607 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(ndeb, nfin), KOKKOS_LAMBDA (
const int num_face)
609 int elem = face_voisins(num_face, 0);
610 y_plus_view(elem) = 0;
612 end_gpu_timer(__KERNEL_NAME__);
613 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(ndeb, nfin), KOKKOS_LAMBDA (
const int num_face)
615 int elem = face_voisins(num_face, 0);
616 if (yplus_already_computed)
619 Kokkos::atomic_add(&y_plus_view(elem), yp_faces(num_face));
625 for (
int i = 0; i < dim; i++)
627 num[i] = elem_faces(elem, i);
628 if (num[i] == num_face && !ok)
630 num[i] = elem_faces(elem, dim);
635 double dist = distance(dim, num_face, elem, xp, xv, face_normale);
636 dist *= (dim + 1.) / dim;
638 double norm_v = norm_vit1_lp(dim, vit, num_face, nfac, num, face_normale, val);
639 double d_visco = l_unif ? visco0:visco[elem];
642 double norm_tau = d_visco * norm_v / dist;
643 double u_etoile = sqrt(norm_tau);
644 Kokkos::atomic_add(&y_plus_view(elem), dist * u_etoile / d_visco);
646 Kokkos::atomic_add(&counter_view(elem), +1);
648 end_gpu_timer(__KERNEL_NAME__);
649 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(0, y_plus.
size()), KOKKOS_LAMBDA (
const int elem)
651 if (counter_view(elem)>0) y_plus_view(elem)/=counter_view(elem);
653 end_gpu_timer(__KERNEL_NAME__);
662 const DoubleTab& u =
valeurs();
666 calculer_gradientP1NC(u,
domaine_vef(), domaine_Cl_VEF, tab_gradient_elem);
668 CDoubleTabView3 gradient_elem = tab_gradient_elem.
view_ro<3>();
669 DoubleTabView grad_u = tab_grad_u.
view_wo();
670 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(0, nb_elem), KOKKOS_LAMBDA(
const int elem)
673 for (
int i = 0; i < dim; i++)
675 for (
int j = 0; j < dim; j++)
677 grad_u(elem, comp) = gradient_elem(elem, i, j);
682 end_gpu_timer(__KERNEL_NAME__);
687 const DoubleTab& temp =
valeurs();
688 calculer_gradientP1NC(temp,
domaine_vef(), domaine_Cl_VEF, grad_T);
734 const DoubleTab& temp =
valeurs();
745 double T_ref = double(temp_ref);
753 int nfin = ndeb + le_bord.
nb_faces();
762 for (
int num_face = ndeb; num_face < nfin; num_face++)
764 int elem = face_voisins(num_face, 0);
768 h_moy += h_conv(elem);
773 for (
int num_face = ndeb; num_face < nfin; num_face++)
775 int elem = face_voisins(num_face, 0);
777 double norme_flux = 0.;
780 for (
int k = 0; k < Flux.
dimension(1); k++)
781 norme_flux += Flux(num_face, k) * Flux(num_face, k);
784 surf += face_normale(num_face, k) * face_normale(num_face, k);
786 double DT = temp(num_face) - T_ref;
794 h_conv(elem) = sqrt(norme_flux / surf) / DT;
796 h_moy += h_conv(elem);
800 double nb_faces_d =
static_cast<double>(le_bord.
nb_faces());
802 int nb_faces =
static_cast<int>(nb_faces_d);
807 fich_hconv =
"Heat_transfert_Coeff_";
808 fich_hconv += la_fr.
le_nom();
809 fich_hconv +=
".dat";
812 fic.
setf(ios::scientific);
815 fic << le_temps <<
" " << h_moy << finl;
820static double norme_L2(
const DoubleTab& u,
const Domaine_VEF& domaine_VEF)
822 const int nb_faces = domaine_VEF.
nb_faces();
827 CDoubleTabView uview = u.
view_ro();
829 Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__), nb_faces,
830 KOKKOS_LAMBDA (
const int i,
double& s)
832 for (
int j = 0; j < nb_compo_; j++)
833 s += uview(i, j) * uview(i, j);
836 end_gpu_timer(__KERNEL_NAME__);
842 Cerr <<
"Champ_P1NC::norme_L2" << finl;
848 const DoubleTab& u =
valeurs();
859 const int nb_elem = mon_dom.
nb_elem();
874 Kokkos::parallel_reduce(start_gpu_timer(__KERNEL_NAME__),
nb_comp(),
875 KOKKOS_LAMBDA (
const int composante,
double& norme_H1_comp)
877 for (
int K = 0; K < nb_elem; K++)
879 double norme_grad_elem = 0.;
880 for (
int i = 0; i < dim; i++)
882 double int_grad_elem = 0.;
883 for (
int face = 0; face < nb_faces_elem; face++)
885 int face_globale = elem_faces(K, face);
887 int_grad_elem += tab(face_globale, composante) * face_normales(face_globale, i) * oriente_normale(face_globale, K, face_voisins);
890 norme_grad_elem += int_grad_elem * int_grad_elem;
893 norme_H1_comp += norme_grad_elem / volumes(K);
897 end_gpu_timer(__KERNEL_NAME__);
899 return sqrt(dnorme_H1);
918 calculer_gradientP1NC(champ, domaine_VEF, domaine_Cl_VEF, gij);
966 int nb_cl = les_cl.size();
972 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
975 const Cond_lim& la_cl = les_cl[num_cl];
980 int nfin = ndeb + la_front_dis.
nb_faces();
983 CDoubleTabView face_normale = domaine_VEF.
face_normales().view_ro();
984 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
986 CDoubleTabView tau_tan = tab_tau_tan.
view_ro();
987 CDoubleArrView nu =
static_cast<const ArrOfDouble&
>(tab_nu).view_ro();
988 CDoubleArrView nu_turb =
static_cast<const ArrOfDouble&
>(tab_nu_turb).view_ro();
989 DoubleTabView3 gij = tab_gij.
view_rw<3>();
990 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(ndeb, nfin), KOKKOS_LAMBDA (
const int fac)
993 int num1 = face_voisins(fac, 0);
998 for (
int i = 0; i < dim; i++)
999 sum += tau_tan(fac, i) * tau_tan(fac, i);
1000 double norme_tau_tan = sqrt(sum);
1001 for (
int i = 0; i < dim; i++)
1002 P[i][0] = tau_tan(fac, i) / (norme_tau_tan + DMINFLOAT);
1006 for (
int i = 0; i < dim; i++)
1007 sum += face_normale(fac, i) * face_normale(fac, i);
1008 double norme = sqrt(sum);
1010 int signe = -oriente_normale(fac, num1, face_voisins);
1011 for (
int i = 0; i < dim; i++)
1012 P[i][1] = signe * face_normale(fac, i) / norme;
1017 P[0][2] = P[1][0] * P[2][1] - P[2][0] * P[1][1];
1018 P[1][2] = P[2][0] * P[0][1] - P[0][0] * P[2][1];
1019 P[2][2] = P[0][0] * P[1][1] - P[1][0] * P[0][1];
1025 double dutdn_old = 0.;
1026 for (
int i = 0; i < dim; i++)
1027 for (
int j = 0; j < dim; j++)
1029 double gij_value = Kokkos::atomic_fetch_add(&gij(num1, i, j), 0.0);
1030 dutdn_old += gij_value * P[j][1] * P[i][0];
1034 double C = -dutdn_old + norme_tau_tan / (nu[num1] + nu_turb[num1]) * porosite_face(fac);
1038 for (
int i = 0; i < dim; i++)
1039 for (
int j = 0; j < dim; j++)
1040 Kokkos::atomic_add(&gij(num1, i, j), C * P[j][1] * P[i][0]);
1042 end_gpu_timer(__KERNEL_NAME__);
1055 const int nb_elem = domaine_VEF.
nb_elem();
1056 const int nb_elem_tot = domaine_VEF.
nb_elem_tot();
1063 CDoubleTabView3 duidxj_v = duidxj.
view_ro<3>();
1064 DoubleArrView SMA_barre_v = SMA_barre.view_wo();
1065 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_elem, KOKKOS_LAMBDA(
1069 for (
int i = 0; i < dim; i++)
1070 for (
int j = 0; j < dim; j++)
1072 double Sij = 0.5 * (duidxj_v(elem, i, j) + duidxj_v(elem, j, i));
1075 SMA_barre_v(elem) = 2. * temp;
1077 end_gpu_timer(__KERNEL_NAME__);
1084 if (ok != FAUX_EN_PERIO)
1087 Cerr <<
"Champ_P1NC::calculer_integrale_volumique pas encore code juste en perio !" << finl;
1092 const DoubleVect& volume =
domaine.volumes_entrelaces();
1093 const double resu = mp_prodscal(v, volume);
classe Champ_Don_base classe de base des Champs donnes (non calcules)
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
const Domaine & domaine() const
virtual void creer_tableau_distribue(const MD_Vector &, RESIZE_OPTIONS=RESIZE_OPTIONS::COPY_INIT)
int lire_donnees(Entree &)
Lit les valeurs du champs a partir d'un flot d'entree.
const Domaine_Cl_dis_base & domaine_Cl_dis() const
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps du champ inconnue.
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
Champ_base & affecter_(const Champ_base &) override
Affectation d'un OWN_PTR(Champ_base) generique (Champ_base) dans un champ inconnue.
int fixer_nb_valeurs_nodales(int)
int imprime_P1NC(Sortie &, int) const
DoubleTab & trace(const Frontiere_dis_base &fr, const DoubleTab &y, DoubleTab &x, int distant) const
int filtrer_L2_deja_appele_
void calcul_h_conv(const Domaine_Cl_VEF &, DoubleTab &, int temp_ref) const
void abortTimeStep() override
void cal_rot_ordre1(DoubleTab &) const
virtual double norme_H1(const Domaine &) const
void mettre_a_jour(double temps) override
Effectue une mise a jour en temps du champ inconnue.
virtual double norme_L2_H1(const Domaine &dom) const
void calcul_grad_T(const Domaine_Cl_VEF &, DoubleTab &) const
static DoubleVect & calcul_S_barre(const DoubleTab &, DoubleVect &, const Domaine_Cl_VEF &)
void calcul_y_plus(const Domaine_Cl_VEF &, DoubleVect &) const
DoubleTab & remplir_coord_noeuds(DoubleTab &positions) const override
void verifie_valeurs_cl() override
void gradient(DoubleTab &) const
int compo_normale_sortante(int) const
static DoubleTab & calcul_gradient(const DoubleTab &, DoubleTab &, const Domaine_Cl_VEF &)
void calcul_critere_Q(DoubleVect &) const
void filtrer_L2(DoubleTab &x) const
Champ_base & affecter_(const Champ_base &) override
Affectation d'un OWN_PTR(Champ_base) generique (Champ_base) dans un champ inconnue.
void calcul_grad_U(const Domaine_Cl_VEF &, DoubleTab &) const
DoubleTab & trace(const Frontiere_dis_base &, DoubleTab &, double, int distant) const override
voir Champ_base Cas particulier (malheureusement) du Champ_P0_VDF :
static DoubleTab & calcul_duidxj_paroi(DoubleTab &, const DoubleTab &, const DoubleTab &, const DoubleTab &, const Domaine_Cl_VEF &)
int fixer_nb_valeurs_nodales(int nb_noeuds) override
int imprime(Sortie &, int) const override
const Domaine_VEF & domaine_vef() const override
virtual double norme_L2(const Domaine &) const
static double calculer_integrale_volumique(const Domaine_VEF &, const DoubleVect &, Ok_Perio ok)
virtual DoubleTab & valeurs()=0
Champ_base()
Constructeur par defaut d'un Champ_base.
virtual DoubleTab & valeur_aux(const DoubleTab &positions, DoubleTab &valeurs) const
Provoque une erreur ! Doit etre surchargee par les classes derivees.
classe Cond_lim_base Classe de base pour la hierarchie des classes qui representent les differentes c...
virtual Frontiere_dis_base & frontiere_dis()
Renvoie la frontiere discretisee a laquelle les conditions aux limites s'appliquent.
classe Cond_lim Classe generique servant a representer n'importe quelle classe
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
classe Dirichlet_paroi_defilante Impose la vitesse de paroi dnas une equation de type Navier_Stokes.
classe Dirichlet_paroi_fixe Represente une paroi immobile dans une equation de type Navier_Stokes.
int nb_faces_elem(int=0) const
Renvoie le nombre de face de type i des elements geometriques constituants le domaine.
const DoubleTab_t & coord_sommets() const
Domaine_VEF & domaine_vef()
classe Domaine_Cl_dis_base Les objets Domaine_Cl_dis_base representent les conditions aux limites
int nb_cond_lim() const
Renvoie le nombre de conditions aux limites.
const Cond_lim & les_conditions_limites(int) const
Renvoie la i-ieme condition aux limites.
int nb_faces() const
renvoie le nombre global de faces.
const MD_Vector & md_vector_faces() const
DoubleVect & volumes_entrelaces()
int nb_faces_tot() const
renvoie le nombre total de faces.
virtual double face_normales(int face, int comp) const
double xv(int num_face, int k) const
double volumes(int i) const
int face_sommets(int i, int j) const
renvoie le numero du ieme sommet de la face num_face.
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
ArrOfInt & est_face_bord()
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
double inverse_volumes(int i) const
const Domaine & domaine() const
Classe Echange_externe_impose: Cette classe represente le cas particulier de la classe.
Class defining operators and methods for all reading operation in an input flow (file,...
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
virtual const Milieu_base & milieu() const =0
virtual const RefObjU & get_modele(Type_modele type) const
virtual const Champ_Inc_base & inconnue() const =0
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Renvoie le domaine des conditions aux limite discretisee associee a l'equation.
Schema_Temps_base & schema_temps()
Renvoie le schema en temps associe a l'equation.
virtual const Operateur & operateur(int) const =0
const Nom & le_nom() const override
Renvoie le nom du champ.
virtual int nb_comp() const
classe Fluide_base Cette classe represente un d'un fluide incompressible ainsi que
const Champ_Don_base & viscosite_cinematique() const
int num_premiere_face() const
classe Frontiere_dis_base Classe representant une frontiere discretisee.
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
virtual const Champ_Don_base & capacite_calorifique() const
Renvoie la capacite calorifique du milieu.
virtual const Champ_base & masse_volumique() const
Renvoie la masse volumique du milieu.
DoubleVect & porosite_face()
Classe Modele_turbulence_hyd_base Cette classe sert de base a la hierarchie des classes.
const Turbulence_paroi_base & loi_paroi() const
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
Classe Neumann_homogene Cette classe est la classe de base de la hierarchie des conditions aux limite...
Classe Neumann_paroi Cette condition limite correspond a un flux impose pour l'equation de.
class Nom Une chaine de caractere pour nommer les objets de TRUST
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.
virtual Operateur_base & l_op_base()=0
classe Periodique Cette classe represente une condition aux limites periodique.
int face_associee(int i) const
static void mp_sum_for_each(T &arg1, T &arg2)
C++14 compatible mp_sum_for_each: combine multiple mp_sum calls into one collective operation Usage: ...
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Cette classe est a la classe C++ ofstream ce que la classe Sortie est a la classe C++ ostream Elle re...
classe Scalaire_impose_paroi Impose un scalaire a la paroi dans une equation de type Convection-Difus...
double temps_courant() const
Renvoie le temps courant.
double pas_de_temps() const
Renvoie le pas de temps (delta_t) courant.
void setf(IOS_FORMAT code) override
Classe de base des flux de sortie.
virtual void ref(const TRUSTTab &)
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_wo()
void resize(_SIZE_ n, RESIZE_OPTIONS opt=RESIZE_OPTIONS::COPY_INIT)
_SIZE_ dimension_tot(int) const override
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, ConstView< _TYPE_, _SHAPE_ > > view_ro() const
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
_SIZE_ dimension(int d) const
_TYPE_ local_min_vect(Mp_vect_options opt=VECT_REAL_ITEMS) const
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
const Objet_U & valeur() const
Classe Turbulence_paroi_base Classe de base pour la hierarchie des classes representant les modeles.
const DoubleVect & tab_d_plus() const
virtual bool use_shear() const