16#include <Champ_Face_PolyMAC_CDO.h>
17#include <Masse_PolyMAC_CDO_Face.h>
18#include <Domaine_Cl_PolyMAC_family.h>
19#include <Domaine_PolyMAC_CDO.h>
20#include <TRUSTTab_parts.h>
21#include <Equation_base.h>
22#include <Probleme_base.h>
23#include <Matrix_tools.h>
24#include <Array_tools.h>
37 assert(le_dom_PolyMAC_CDO);
38 assert(le_dom_Cl_PolyMAC_CDO);
49 Cerr <<
"Masse_PolyMAC_CDO_Face::appliquer : erreur dans la taille de sm" << finl;
54 for (
int f = 0; f < domaine_PolyMAC_CDO.
nb_faces(); f++)
55 if (ch.
fcl()(f, 0) > 1)
56 for (
int k = 0; k < nc; k++)
67 int i, j, k, e, a, f, fb, nf_tot = domaine.nb_faces_tot(), na_tot =
dimension < 3 ? domaine.domaine().nb_som_tot() : domaine.domaine().nb_aretes_tot();
68 const bool only_m2 = (matrix.
nb_lignes() == nf_tot);
70 domaine.init_m1(), domaine.init_m2(), ch.
init_ra();
74 for (e = 0; e < domaine.nb_elem_tot(); e++)
75 for (i = 0, j = domaine.m2d(e); j < domaine.m2d(e + 1); i++, j++)
76 if (ch.
fcl()(f = e_f(e, i), 0) > 1 && f < domaine.nb_faces())
79 for (k = domaine.m2i(j); f < domaine.nb_faces() && k < domaine.m2i(j + 1); k++)
80 if (ch.
fcl()(fb = e_f(e, domaine.m2j(k)), 0) < 2)
85 for (a = 0;
no_diff_ && a < (
dimension < 3 ? domaine.nb_som() : domaine.domaine().nb_aretes()); a++)
88 tableau_trier_retirer_doublons(indice);
96 Cerr <<
"Masse_PolyMAC_CDO_Face::ajouter_masse : use_old_volumes is not supported." << finl;
101 const Conds_lim& cls = le_dom_Cl_PolyMAC_CDO->les_conditions_limites();
102 const IntTab& e_f = domaine.elem_faces(), &f_e = domaine.face_voisins();
103 const DoubleTab& nf = domaine.face_normales();
105 DoubleVect coef(
equation().milieu().porosite_face());
107 int i, j, k, l, e, f, fb;
111 domaine.init_m1(), domaine.init_m2(), ch.
init_ra();
114 for (f = 0; f < domaine.premiere_face_int(); f++)
115 if (ch.
fcl()(f, 0) == 3 && (!polymac_flica5 || sub_type(
Dirichlet, cls[ch.
fcl()(f, 1)].valeur())))
116 for (k = 0, secmem(f) = 0; k <
dimension; k++)
117 secmem(f) += nf(f, k) * ref_cast(
Dirichlet, cls[ch.
fcl()(f, 1)].valeur()).val_imp(ch.
fcl()(f, 2), k) / fs(f);
118 else if (ch.
fcl()(f, 0) > 1)
122 for (e = 0; e < domaine.nb_elem_tot(); e++)
123 for (i = 0, j = domaine.m2d(e); j < domaine.m2d(e + 1); i++, j++)
124 for (f = e_f(e, i), k = domaine.m2i(j); ch.
fcl()(f, 0) < 2 && f < domaine.nb_faces() && k < domaine.m2i(j + 1); k++)
125 if (ch.
fcl()(fb = e_f(e, domaine.m2j(k)), 0) < 2)
126 secmem(f) += ve(e) * pe(e) * domaine.m2c(k) * (e == f_e(f, 0) ? 1 : -1) * (e == f_e(fb, 0) ? 1 : -1) * coef(f) * inco(fb) / dt;
127 else if (ch.
fcl()(fb, 0) == 3 && (!polymac_flica5 || sub_type(
Dirichlet, cls[ch.
fcl()(f, 1)].valeur())))
129 secmem(f) += ve(e) * pe(e) * domaine.m2c(k) * (e == f_e(f, 0) ? 1 : -1) * (e == f_e(fb, 0) ? 1 : -1) * coef(f)
130 * ref_cast(
Dirichlet, cls[ch.
fcl()(fb, 1)].valeur()).val_imp(ch.
fcl()(fb, 2), l) * nf(fb, l) / (fs(fb) * dt);
139 const IntTab& e_f = domaine.elem_faces(), &f_e = domaine.face_voisins();
141 DoubleVect coef(
equation().milieu().porosite_face());
143 int i, j, k, e, a, f, fb, nf_tot = domaine.nb_faces_tot();
148 domaine.init_m1(), domaine.init_m2(), ch.
init_ra();
151 for (f = 0; f < domaine.premiere_face_int(); f++)
152 if (ch.
fcl()(f, 0) > 1)
156 for (e = 0; e < domaine.nb_elem_tot(); e++)
157 for (i = 0, j = domaine.m2d(e); j < domaine.m2d(e + 1); i++, j++)
158 for (f = e_f(e, i), k = domaine.m2i(j); ch.
fcl()(f, 0) < 2 && f < domaine.nb_faces() && k < domaine.m2i(j + 1); k++)
159 if (ch.
fcl()(fb = e_f(e, domaine.m2j(k)), 0) < 2)
160 mat(f, fb) += ve(e) * pe(e) * domaine.m2c(k) * (e == f_e(f, 0) ? 1 : -1) * (e == f_e(fb, 0) ? 1 : -1) * coef(f) / dt;
164 for (a = 0;
no_diff_ && a < (
dimension < 3 ? domaine.nb_som() : domaine.domaine().nb_aretes()); a++)
165 mat(nf_tot + a, nf_tot + a) = 1;
const IntTab & fcl() const
classe Conds_lim Cette classe represente un vecteur de conditions aux limites.
classe Dirichlet Cette classe est la classe de base de la hierarchie des conditions aux limites de ty...
int_t nb_aretes_tot() const
renvoie le nombre d'aretes total (reelles+virtuelles).
int nb_faces() const
renvoie le nombre global de faces.
int nb_faces_tot() const
renvoie le nombre total de faces.
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
const Domaine & domaine() const
Class defining operators and methods for all reading operation in an input flow (file,...
virtual const Milieu_base & milieu() const =0
void dimensionner(Matrice_Morse &matrix) const override
DoubleTab & appliquer_impl(DoubleTab &) const override
DoubleTab & ajouter_masse(double dt, DoubleTab &x, const DoubleTab &y, int penalisation=1, bool use_old_volumes=false) const override
void appliquer_coef(DoubleVect &coef) const
Classe Matrice_Base Classe de base de la hierarchie des matrices.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
int nb_lignes() const override
Return local number of lines (=size on the current proc).
DoubleVect & porosite_elem()
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
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 const Nom & le_nom() const
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
int has_coefficient_temporel_
Classe de base des flux de sortie.
_SIZE_ dimension_tot(int) const override