16#include <Op_VEF_Face.h>
17#include <Matrice_Morse.h>
18#include <Equation_base.h>
20#include <Probleme_base.h>
22#include <Champ_Uniforme.h>
23#include <Schema_Temps_base.h>
24#include <Milieu_base.h>
25#include <Operateur_base.h>
26#include <Operateur_Diff_base.h>
27#include <Op_Conv_VEF_base.h>
28#include <EcrFicPartage.h>
31#include <Matrice_Morse_Diag.h>
33#include <Dirichlet_homogene.h>
34#include <Periodique.h>
55 la_matrice.
dimensionner(nfin * nb_comp, nfin * nb_comp, 0);
62 const IntTab& elem_faces = le_dom.
elem_faces();
69 IntTrav rang_voisin(nfin * nb_comp);
70 rang_voisin = nb_comp;
73 ToDo_Kokkos(
"Port with kokkos ? It will be called once...");
74 for (
int num_face = 0; num_face < nfin; num_face++)
76 int elem1 = face_voisins(num_face, 0);
77 int elem2 = face_voisins(num_face, 1);
79 for (
int i = 0; i < nb_faces_elem; i++)
81 if ((j = elem_faces(elem1, i)) != num_face)
83 for (
int k = 0; k < nb_comp; k++)
85 rang_voisin(num_face * nb_comp + k) += nb_comp;
89 if ((j = elem_faces(elem2, i)) != num_face)
91 for (
int k = 0; k < nb_comp; k++)
93 rang_voisin(num_face * nb_comp + k) += nb_comp;
103 for (
int num_face = 0; num_face < nfin; num_face++)
105 for (
int k = 0; k < nb_comp; k++)
107 tab1(num_face * nb_comp + 1 + k) = rang_voisin(num_face * nb_comp + k) + tab1(num_face * nb_comp + k);
110 la_matrice.
dimensionner(nfin * nb_comp, tab1(nfin * nb_comp) - 1);
112 for (
int num_face = 0; num_face < nfin; num_face++)
114 for (
int k = 0; k < nb_comp; k++)
116 for (
int kk = 0; kk < nb_comp; kk++)
118 int modulo = (k + kk) % nb_comp;
119 tab2[tab1[num_face * nb_comp + k] - 1 + kk] = num_face * nb_comp + 1 + modulo;
121 rang_voisin[num_face * nb_comp + k] = (int)(tab1[num_face * nb_comp + k] + nb_comp - 1);
126 for (
int num_face = 0; num_face < nfin; num_face++)
128 int elem1 = face_voisins(num_face, 0);
129 int elem2 = face_voisins(num_face, 1);
131 for (
int i = 0; i < nb_faces_elem; i++)
133 if ((j = elem_faces(elem1, i)) != num_face)
135 for (
int k = 0; k < nb_comp; k++)
137 for (
int kk = 0; kk < nb_comp; kk++)
139 int modulo = (k + kk) % nb_comp;
140 tab2[rang_voisin[num_face * nb_comp + k] + kk] = j * nb_comp + 1 + modulo;
142 rang_voisin[num_face * nb_comp + k] += nb_comp;
147 if ((j = elem_faces(elem2, i)) != num_face)
149 for (
int k = 0; k < nb_comp; k++)
151 for (
int kk = 0; kk < nb_comp; kk++)
153 int modulo = (k + kk) % nb_comp;
154 tab2[rang_voisin[num_face * nb_comp + k] + kk] = j * nb_comp + 1 + modulo;
156 rang_voisin[num_face * nb_comp + k] += nb_comp;
176 const int nb_comp = champ_inconnue.
line_size();
177 ArrOfDouble normale(nb_comp);
178 for (
const auto &itr : les_cl)
185 bool has_val_imp = sub_type(
Dirichlet, la_cl);
186 CDoubleTabView val_imp;
187 if (has_val_imp) val_imp = ref_cast(
Dirichlet, la_cl).tab_val_imp().view_ro();
188 auto tab1 = la_matrice.
get_tab1().view_ro();
189 CIntArrView num_face = la_front_dis.
num_face().view_ro();
191 DoubleTabView secmem = tab_secmem.
view_wo();
192 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nfaces, KOKKOS_LAMBDA(
const int ind_face)
194 int face = num_face(ind_face);
195 for (
int comp = 0; comp < nb_comp; comp++)
197 auto idiag = tab1[face * nb_comp + comp] - 1;
200 auto nbvois = tab1[face * nb_comp + 1 + comp] - tab1[face * nb_comp + comp];
201 for (
auto k = 1; k < nbvois; k++)
202 coeff[idiag + k] = 0;
204 int j = nb_comp == 1 ? 0 : comp;
205 secmem(face, j) = has_val_imp ? val_imp(ind_face, j) : 0.;
208 end_gpu_timer(__KERNEL_NAME__);
212 const auto& tab1 = la_matrice.
get_tab1();
213 const auto& tab2 = la_matrice.
get_tab2();
216 ToDo_Kokkos(
"critical");
217 for (
int ind_face = 0; ind_face < nfaces; ind_face++)
219 int face = la_front_dis.
num_face(ind_face);
223 for (
int comp = 0; comp < nb_comp; comp++)
225 normale[comp] = face_normales(face, comp);
226 if (std::fabs(normale[comp]) > std::fabs(max_coef))
228 max_coef = normale[comp];
231 n2 += normale[comp] * normale[comp];
234 max_coef = normale[ind_max];
237 auto nb_coeff_ligne = tab1[face * nb_comp + 1] - tab1[face * nb_comp];
238 for (
auto k = 0; k < nb_coeff_ligne; k++)
240 for (
int comp = 0; comp < nb_comp; comp++)
242 int j = tab2[tab1[face * nb_comp + comp] - 1 + k] - 1;
245 const double coef_ij = la_matrice(face * nb_comp + comp, j);
246 int face2 = j / nb_comp;
247 int comp2 = j - face2 * nb_comp;
248 tab_secmem(face, comp) -= coef_ij * champ_inconnue(face2, comp2);
253 for (
int comp = 0; comp < nb_comp; comp++)
254 somme_b += tab_secmem(face, comp) * normale[comp];
257 for (
int comp = 0; comp < nb_comp; comp++)
258 tab_secmem(face, comp) -= somme_b * normale[comp];
262 for (
int comp = 0; comp < nb_comp; comp++)
264 int j0 = face * nb_comp + comp;
265 ref += la_matrice(j0, j0);
269 for (
int comp = 0; comp < nb_comp; comp++)
271 int j0 = face * nb_comp + comp;
272 double rap = ref / la_matrice(j0, j0);
273 for (
auto k = 0; k < nb_coeff_ligne; k++)
275 int j = tab2[tab1[j0] - 1 + k] - 1;
276 la_matrice(j0, j) *= rap;
278 assert(est_egal(la_matrice(j0, j0), ref));
282 for (
auto k = 1; k < nb_coeff_ligne; k++)
284 for (
int comp = 0; comp < nb_comp; comp++)
286 int j = tab2[tab1[face * nb_comp + comp] - 1 + k] - 1;
287 assert(j != (face * nb_comp + comp));
288 if ((j >= (face * nb_comp)) && (j < (face * nb_comp + nb_comp)))
289 la_matrice(face * nb_comp + comp, j) = 0;
295 for (
auto k = 0; k < nb_coeff_ligne; k++)
298 int j = tab2[tab1[face * nb_comp] - 1 + k] - 1;
302 for (
int comp = 0; comp < nb_comp; comp++)
303 dsomme += la_matrice(face * nb_comp + comp, j) * normale[comp];
307 for (
int comp = 0; comp < nb_comp; comp++)
309 if ((j < (face * nb_comp)) || (j >= (face * nb_comp + nb_comp)))
310 la_matrice(face * nb_comp + comp, j) -= (dsomme) * normale[comp];
313 for (
auto k = 0; k < nb_coeff_ligne; k++)
315 for (
int comp = 0; comp < nb_comp; comp++)
317 int j = tab2[tab1[face * nb_comp + comp] - 1 + k] - 1;
318 int face2 = j / nb_comp;
319 int comp2 = j - face2 * nb_comp;
320 const double coef_ij = la_matrice(face * nb_comp + comp, j);
321 tab_secmem(face, comp) += coef_ij * champ_inconnue(face2, comp2);
327 for (
int comp = 0; comp < nb_comp; comp++)
328 somme_c += tab_secmem(face, comp) * normale[comp];
330 for (
int comp = 0; comp < nb_comp; comp++)
331 tab_secmem(face, comp) -= somme_c * normale[comp];
340 controle_modifier_flux_ = 1;
342 if (flux_bords_.
nb_dim() != 2)
357 CDoubleArrView rho_face =
static_cast<const DoubleVect&
>(rho.
valeurs()).view_ro();
358 CDoubleArrView Cp_face =
static_cast<const DoubleVect&
>(Cp.
valeurs()).view_ro();
359 DoubleArrView flux_bords =
static_cast<DoubleVect&
>(flux_bords_).view_rw();
360 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), nb_faces_bords, KOKKOS_LAMBDA(
365 flux_bords(face) *= (is_rho_u ? 1 : rho_face(rho_uniforme?0:face)) * Cp_face(cp_uniforme?0:face);
367 end_gpu_timer(__KERNEL_NAME__);
377 double coef = rho.
valeurs()(0, 0);
379 DoubleTabView flux_bords = flux_bords_.
view_rw();
381 Kokkos::parallel_for(
382 start_gpu_timer(__KERNEL_NAME__),
383 range_2D({0,0}, {nb_faces_bord,nb_compo}),
384 KOKKOS_LAMBDA (
int face,
int k)
386 flux_bords(face, k) *= coef;
388 end_gpu_timer(__KERNEL_NAME__);
399 const DoubleTab& flux_bords_ = op.
flux_bords();
400 if (flux_bords_.
nb_dim() != 2)
402 Cout <<
"Printing of fluxes is not implemented for the operator " << op.
que_suis_je() << finl;
405 if (controle_modifier_flux_ == 0)
406 if (max_abs_array(flux_bords_) != 0)
408 Cerr << op.
que_suis_je() <<
" appelle Op_VEF_Face::impr sans avoir appeler Op_VEF_Face::modifier_flux, on arrete tout " << finl;
419 const int impr_sum = (le_dom_vef.
domaine().bords_a_imprimer_sum().est_vide() ? 0 : 1);
420 const int impr_bord = (le_dom_vef.
domaine().bords_a_imprimer().est_vide() ? 0 : 1);
428 DoubleVect bilan(nb_compo);
431 DoubleTrav flux_bords(4, nb_cl, nb_compo);
439 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
444 int nfin = ndeb + frontiere_dis.
nb_faces();
445 int perio = (sub_type(
Periodique,la_cl.valeur()) ? 1 : 0);
446 for (
int face = ndeb; face < nfin; face++)
448 for (
int k = 0; k < nb_compo; k++)
450 flux_bords(0, num_cl, k) += flux_bords_(face, k);
453 if (face < (ndeb + frontiere_dis.
nb_faces() / 2))
454 flux_bords(1, num_cl, k) += flux_bords_(face, k);
456 flux_bords(2, num_cl, k) += flux_bords_(face, k);
463 flux_bords(3, num_cl, 0) += flux_bords_(face, 1) * xgr(face, 0) - flux_bords_(face, 0) * xgr(face, 1);
466 flux_bords(3, num_cl, 0) += flux_bords_(face, 2) * xgr(face, 1) - flux_bords_(face, 1) * xgr(face, 2);
467 flux_bords(3, num_cl, 1) += flux_bords_(face, 0) * xgr(face, 2) - flux_bords_(face, 2) * xgr(face, 0);
468 flux_bords(3, num_cl, 2) += flux_bords_(face, 1) * xgr(face, 0) - flux_bords_(face, 0) * xgr(face, 1);
492 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
496 int perio = (sub_type(
Periodique,la_cl.valeur()) ? 1 : 0);
497 for (
int k = 0; k < nb_compo; k++)
501 Flux.add_col(flux_bords(1, num_cl, k));
502 Flux.add_col(flux_bords(2, num_cl, k));
505 Flux.add_col(flux_bords(0, num_cl, k));
507 Flux_moment.add_col(flux_bords(3, num_cl, k));
508 if (le_dom_vef.
domaine().bords_a_imprimer_sum().contient(la_fr.
le_nom()))
509 Flux_sum.add_col(flux_bords(0, num_cl, k));
512 bilan(k) += flux_bords(0, num_cl, k);
517 for (
int k = 0; k < nb_compo; k++)
518 Flux.add_col(bilan(k));
526 const LIST(
Nom) &Liste_bords_a_imprimer = le_dom_vef.
domaine().bords_a_imprimer();
527 if (!Liste_bords_a_imprimer.est_vide())
532 for (
int num_cl = 0; num_cl < nb_cl; num_cl++)
538 int nfin = ndeb + frontiere_dis.
nb_faces();
540 if (Liste_bords_a_imprimer.contient(la_fr.
le_nom()))
542 Flux_face <<
"# Flux par face sur " << la_fr.
le_nom() <<
" au temps ";
544 Flux_face <<
" : " << finl;
545 const DoubleTab& xv = le_dom_vef.
xv();
546 for (
int face = ndeb; face < nfin; face++)
549 Flux_face <<
"# Face a x= " << xv(face, 0) <<
" y= " << xv(face, 1);
551 Flux_face <<
"# Face a x= " << xv(face, 0) <<
" y= " << xv(face, 1) <<
" z= " << xv(face, 2);
552 for (
int k = 0; k < nb_compo; k++)
553 Flux_face <<
" surface_face(m2)= " << le_dom_vef.
face_surfaces(face) <<
" flux_par_surface(W/m2)= " << flux_bords_(face, k) / le_dom_vef.
face_surfaces(face) <<
" flux(W)= "
554 << flux_bords_(face, k);
573 int nb_faces_elem = domaine_VEF.
elem_faces().dimension(1);
574 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
584 int num2 = num1 + le_bord.
nb_faces() / 2;
585 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
586 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
587 CIntArrView face_associee = la_cl_perio.
face_associee().view_ro();
588 Matrice_Morse_View matrice;
589 matrice.set(matrice_morse);
590 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(num1, num2),
591 KOKKOS_LAMBDA(
const int num_face)
593 for (
int dir = 0; dir < 2; dir++)
595 int elem1 = face_voisins(num_face, dir);
596 int fac_asso = face_associee(num_face - num1) + num1;
597 for (
int i = 0; i < nb_faces_elem; i++)
599 int j = elem_faces(elem1, i);
600 for (
int nc = 0; nc < nb_comp; nc++)
602 int n0 = num_face * nb_comp + nc;
603 int n0perio = fac_asso * nb_comp + nc;
604 if (((j == num_face) || (j == fac_asso)))
608 assert(matrice(n0, n0perio) == 0);
609 assert(matrice(n0perio, n0) == 0);
610 assert(matrice(n0, n0) == matrice(n0perio, n0perio));
611 double coeff = (matrice(n0, n0)) / 2.;
612 matrice.store(n0, n0, coeff);
613 matrice.store(n0perio, n0perio, coeff);
618 for (
int nc2 = 0; nc2 < nb_comp; nc2++)
620 int j20 = j * nb_comp + nc2;
621 assert(matrice(n0, j20) == matrice(n0perio, j20));
622 double coeff = (matrice(n0, j20) / 2.);
623 matrice.store(n0, j20, coeff);
624 matrice.store(n0perio, j20, coeff);
631 end_gpu_timer(__KERNEL_NAME__);
643 int nb_faces_elem = domaine_VEF.
elem_faces().dimension(1);
644 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
654 int num2 = num1 + le_bord.
nb_faces() / 2;
655 CIntTabView elem_faces = domaine_VEF.
elem_faces().view_ro();
656 CIntTabView face_voisins = domaine_VEF.
face_voisins().view_ro();
657 CIntArrView face_associee = la_cl_perio.
face_associee().view_ro();
658 Matrice_Morse_View matrice;
659 matrice.set(matrice_morse);
660 Kokkos::parallel_for(start_gpu_timer(__KERNEL_NAME__), Kokkos::RangePolicy<>(num1, num2),
661 KOKKOS_LAMBDA(
const int num_face)
663 for (
int dir = 0; dir < 2; dir++)
665 int elem1 = face_voisins(num_face, dir);
666 int fac_asso = face_associee(num_face - num1) + num1;
667 for (
int i = 0; i < nb_faces_elem; i++)
669 int j = elem_faces(elem1, i);
671 for (
int nc = 0; nc < nb_comp; nc++)
673 int n0 = num_face * nb_comp + nc;
675 int n0perio = fac_asso * nb_comp + nc;
676 if (((j == num_face) || (j == fac_asso)))
680 for (
int nc2 = 0; nc2 < nb_comp; nc2++)
682 int j0 = num_face * nb_comp + nc2;
683 int j0perio = fac_asso * nb_comp + nc2;
684 matrice.atomic_add(n0, j0, matrice(n0, j0perio));
685 matrice.store(n0, j0perio, 0);
686 matrice.atomic_add(n0perio, j0perio, matrice(n0perio, j0));
687 matrice.store(n0perio, j0, 0);
688 double coeff = (matrice(n0, j0) +
689 matrice(n0perio, j0perio));
690 matrice.store(n0, j0, coeff);
693 matrice.store(n0perio, j0, coeff);
694 matrice.store(n0perio, j0perio, 0);
697 matrice.store(n0perio, j0perio, coeff);
703 for (
int nc2 = 0; nc2 < nb_comp; nc2++)
705 int j20 = j * nb_comp + nc2;
706 double coeff = (matrice(n0, j20) + matrice(n0perio, j20));
707 matrice.store(n0, j20, coeff);
708 matrice.store(n0perio, j20, coeff);
715 end_gpu_timer(__KERNEL_NAME__);
730 modif_matrice_pour_periodique_avant_contribuer(matrice, eqn);
744 modif_matrice_pour_periodique_apres_contribuer(matrice, eqn);
755 const auto& tab1 = matrice.
get_tab1();
756 const auto& tab2 = matrice.
get_tab2();
758 for (
int n_bord = 0; n_bord < nb_bords; n_bord++)
771 int num2 = num1 + le_bord.
nb_faces() / 2;
772 for (
int num_face = num1; num_face < num2; num_face++)
773 for (
int nc = 0; nc < nb_comp; nc++)
775 fac_asso = la_cl_perio.
face_associee(num_face - num1) + num1;
776 int n0 = num_face * nb_comp + nc;
777 int n0perio = fac_asso * nb_comp + nc;
779 for (
auto j = tab1[n0] - 1; j < tab1[n0 + 1] - 1; j++)
782 if ((c != n0) && (c != n0perio))
784 double test = matrice(n0, c) - matrice(n0perio, c);
787 Cerr <<
"Pb non-periodic matrix face" << num_face <<
" component " << nc <<
" column " << c << finl;
788 Cerr <<
" diff " << test <<
" coef1 " << matrice(n0, c) <<
" coef2 " << matrice(n0perio, c) << finl;
793 if ((matrice(n0, n0perio) != 0) || (matrice(n0perio, n0) != 0))
795 Cerr <<
"Pb non-periodic matrix face" << num_face <<
" component " << nc << finl;
796 Cerr <<
" non-zero coef" << matrice(n0, n0perio) <<
" " << matrice(n0perio, n0) << finl;
799 if (matrice(n0, n0) != matrice(n0perio, n0perio))
801 double test = matrice(n0, n0perio) - matrice(n0perio, n0);
802 Cerr <<
"Pb non-periodic matrix face" << num_face <<
" component " << nc << finl;
803 Cerr <<
" diff " << test <<
" differing coef " << matrice(n0, n0) <<
" " << matrice(n0perio, n0perio) << finl;
class Champ_Don_base base class of Given Fields (not calculated)
DoubleTab & valeurs() override
Overrides Champ_base::valeurs() Returns the array of values.
DoubleTab & valeurs() override
Returns the array of field values at the current time.
virtual DoubleTab & valeurs()=0
class Champ_base This class is the base of the fields hierarchy.
class Cond_lim_base Base class for the hierarchy of classes that represent the different boundary con...
virtual Frontiere_dis_base & frontiere_dis()
Returns the discretized boundary to which the boundary conditions apply.
class Cond_lim Generic class used to represent any class
class Conds_lim This class represents a vector of boundary conditions.
Classe Dirichlet_homogene This class is the base class of the hierarchy of homogeneous Dirichlet-type...
Dirichlet This class is the base class of the hierarchy of Dirichlet-type boundary conditions.
int nb_faces_elem(int=0) const
Returns the number of faces of type i of the geometric elements that make up the domain.
class Domaine_Cl_dis_base Domaine_Cl_dis_base objects represent discretized boundary conditions
const Cond_lim & les_conditions_limites(int) const
Returns the i-th boundary condition.
virtual const DoubleVect & face_surfaces() const
int nb_faces_tot() const
Returns the total number of faces.
virtual double face_normales(int face, int comp) const
double xv(int num_face, int k) const
int elem_faces(int i, int j) const
Returns the index of the i-th face of element num_elem; the face numbering convention is.
DoubleTab calculer_xgr() const
Computes the xgr array for the computation of moments of forces at boundaries.
int face_voisins(int num_face, int i) const
Returns the neighbouring element of num_face in direction i.
int nb_faces_bord() const
Returns the number of faces on which boundary conditions are applied:
int moments_a_imprimer() const
const Domaine & domaine() const
Sortie & syncfile() override
Triggers writing to disk of the data accumulated on the different processors since the last call to s...
class Equation_base The role of an equation is the calculation of one or more fields....
virtual const Milieu_base & milieu() const =0
virtual const Champ_Inc_base & inconnue() const =0
virtual Domaine_Cl_dis_base & domaine_Cl_dis()
Returns the discretized boundary condition domain associated with the equation.
Probleme_base & probleme()
Returns the problem associated with the equation.
Domaine_dis_base & domaine_dis()
Returns the discretized domain associated with the equation.
const Nom & le_nom() const override
Returns the name of the field.
virtual Nature_du_champ nature_du_champ() const
int num_premiere_face() const
int num_face(const int) const
class Frontiere_dis_base Class representing a discretized boundary.
const Nom & le_nom() const override
Returns the name of the geometric boundary.
Matrice_Morse_Diag class - Represents a sparse symmetric matrix M stored in Morse format.
Matrice_Morse class - Represents a (sparse) matrix M, not necessarily square,.
const auto & get_tab2() const
void dimensionner(int n, _SIZE_ nnz)
Size the matrix with n lines and n columns and nnz zero-values coefficients.
const auto & get_tab1() const
int nb_colonnes() const override
Return local number of columns (=size on the current proc).
virtual const Champ_Don_base & capacite_calorifique() const
Returns the heat capacity of the medium (const version).
virtual const Champ_base & masse_volumique() const
Returns the mass density of the medium (const version).
const Equation_base & equation() const
Returns the reference to the equation pointed to by MorEqn::mon_equation.
class Nom: a character string for naming TRUST objects.
virtual int debute_par(const char *const n) const
const Nom & que_suis_je() const
Returns the string identifying the class.
void modifier_matrice_pour_periodique_apres_contribuer(Matrice_Morse &matrice, const Equation_base &) const
Sums the 2 rows of the associated periodic faces, allowing computations in the code without needing t...
void dimensionner(const Domaine_VEF &, const Domaine_Cl_VEF &, Matrice_Morse &) const
Dimensioning of the matrix that will receive the coefficients from convection and diffusion for the f...
int impr(Sortie &, const Operateur_base &) const
Print the face fluxes of a VEF operator (e.g. diffusion, convection).
void modifier_matrice_pour_periodique_avant_contribuer(Matrice_Morse &matrice, const Equation_base &) const
Divides the coefficients on the periodic face rows by 2 in preparation for applying modifier_matrice_...
void modifier_flux(const Operateur_base &) const
void modifier_pour_Cl(const Domaine_VEF &, const Domaine_Cl_VEF &, Matrice_Morse &, DoubleTab &) const
Modify the matrix coefficients and the right-hand side for Dirichlet boundary conditions.
Operateur_Diff_base This class is the base of the hierarchy of operators representing.
class Operateur_base This class is the base of the hierarchy of objects representing an
void ouvrir_fichier_partage(EcrFicPartage &, const Nom &, const int flag=1) const
Opening/creation of a shared file for printing an operator. To override in derived classes.
void ouvrir_fichier(SFichier &os, const Nom &, const int flag=1) const
Opening/creation of a file for printing an operator. To override in derived classes.
class Periodique This class represents a periodic boundary condition.
int face_associee(int i) const
class Probleme_base It is a Probleme_U that is not a coupling.
virtual const Milieu_base & milieu() const
Returns the physical medium associated with the problem (const version).
const Schema_Temps_base & schema_temps() const
Returns the time scheme associated with the problem.
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
static void exit(int exit_code=-1)
Exit routine for TRUST within a Kokkos region.
static int je_suis_maitre()
Returns 1 if on the master processor of the current group (i.e. me() == 0), 0 otherwise.
double temps_courant() const
Returns the current time.
void imprimer_temps_courant(SFichier &) const
Base class for output streams.
Symetrie On symmetry faces, the following properties hold:
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_wo()
std::enable_if_t< is_default_exec_space< EXEC_SPACE >, View< _TYPE_, _SHAPE_ > > view_rw()
_SIZE_ dimension(int d) const