16#include <Op_Diff_PolyMAC_HFV_Face.h>
17#include <Champ_Face_PolyMAC_HFV.h>
18#include <Domaine_Cl_PolyMAC_family.h>
19#include <Champ_Don_Fonc_xyz.h>
20#include <Champ_Uniforme.h>
21#include <Pb_Multiphase.h>
22#include <Simpler_Base.h>
23#include <Milieu_base.h>
54 else if (N_nu == N * D)
56 else if (N_nu == N * D * D)
57 nu_.resize(0, N, D, D);
59 Process::exit(
Nom(
"Op_Diff_PolyMAC_HFV_base : diffusivity component count ") +
Nom(N_nu) +
"not among (" +
Nom(N) +
", " +
Nom(N * D) +
", " +
Nom(N * D * D) +
")!");
61 le_dom_poly_->domaine().creer_tableau_elements(
nu_);
68 int e, i, m, n, N =
equation().
inconnue().
valeurs().
line_size(), N_nu =
nu_.line_size(), N_nu_src = nu_src.
line_size(), mult = N_nu / N, c_nu = nu_src.
dimension_tot(0) == 1, d, db, D =
dimension;
69 assert(N_nu % N == 0);
73 for (e = 0; e < domaine.nb_elem_tot(); e++)
74 for (n = 0; n < N_nu; n++)
75 nu_.addr()[N_nu * e + n] = nu_src(!c_nu * e, n);
76 else if (N_nu == N * D && N_nu_src == N)
77 for (e = 0; e < domaine.nb_elem_tot(); e++)
78 for (n = 0; n < N; n++)
79 for (d = 0; d < D; d++)
80 nu_(e, n, d) = nu_src(!c_nu * e, n);
81 else if (N_nu == N * D * D && (N_nu_src == N || N_nu_src == N * D))
82 for (e = 0; e < domaine.nb_elem_tot(); e++)
83 for (n = 0; n < N; n++)
84 for (d = 0; d < D; d++)
85 for (db = 0; db < D; db++)
86 nu_(e, n, d, db) = (d == db) * nu_src(!c_nu * e, N_nu_src == N ? n : D * n + d);
92 for (e = 0; e < domaine.nb_elem_tot(); e++)
93 for (n = 0, i = 0; n < N; n++)
94 for (m = 0; m < mult; m++, i++)
106 const std::string& nom_inco = (le_champ_inco ? le_champ_inco.valeur() :
equation().inconnue()).le_nom().getString();
107 int i, j, n_ext = (int)
op_ext.size(), first_run =
mat_aux.nb_lignes() == 0;
109 for (
mat_aux.dimensionner(n_ext, n_ext), i = 0; i < n_ext; i++)
110 for (j = 0; j < n_ext; j++)
111 mat_aux.get_bloc(i, j).typer(
"Matrice_Morse");
112 std::vector<const Op_Diff_PolyMAC_HFV_base*> opp_ext(n_ext);
113 for (i = 0; i < n_ext; i++)
115 std::vector<matrices_t> lines(n_ext);
116 for (i = 0; i < n_ext; i++)
117 for (j = 0; j < n_ext; j++)
120 for (i = 0; i < n_ext; i++)
124 std::deque<ConstDoubleTab_parts> v_part;
125 for (i = 0; i < n_ext; i++)
126 v_part.emplace_back(
op_ext[i]->has_champ_inco() ?
op_ext[i]->mon_inconnue().valeurs() :
op_ext[i]->equation().inconnue().valeurs());
128 for (i = 0; i < n_ext; i++)
129 mdc.
add_part(v_part[i][1].get_md_vector(), v_part[i][1].line_size());
132 DoubleTrav inco, secmem;
134 DoubleTab_parts p_inc(inco), p_sec(secmem);
135 for (i = 0; i < n_ext; i++)
136 p_inc[i] = v_part[i][1];
140 for (i = 0; i < n_ext; i++)
141 for (j = 0; j < n_ext; j++)
143 for (i = 0; i < n_ext; i++)
146 mat_aux.ajouter_multvect(inco, secmem);
150 if (
equation().parametre_equation())
154 EChaine chl(
"petsc cholesky { }");
163 for (i = 0; i < n_ext; i++)
DoubleTab & valeurs() override
Renvoie le tableau des valeurs du champ au temps courant.
virtual DoubleTab & valeurs()=0
Une entree dont la source est une chaine de caracteres.
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 Champ_Inc_base & inconnue() const =0
Metadata for a distributed composite vector.
void add_part(const MD_Vector &part, int shape=0, Nom name="")
Append the "part" descriptor to the composite vector.
: Cette classe est un OWN_PTR mais l'objet pointe est partage entre plusieurs
void copy(const MD_Vector_base &)
construction d'un objet MD_Vector par copie d'un objet existant.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
DoubleVect & porosite_elem()
const Equation_base & equation() const
Renvoie la reference sur l'equation pointe par MorEqn::mon_equation.
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 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.
class Op_Diff_PolyMAC_CDO_Gen_base
virtual int dimension_min_nu() const
virtual void modifier_mu(DoubleTab &) const
const Champ_base & diffusivite() const override
class Op_Diff_PolyMAC_HFV_base
virtual void ajouter_blocs_ext(int aux_only, matrices_t matrices, DoubleTab &secmem, const tabs_t &semi_impl={ }) const =0
void completer() override
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
void update_aux(double t) const
void update_nu() const override
void mettre_a_jour(double t) override
DOES NOTHING - to override in derived classes.
virtual void dimensionner_blocs_ext(int aux_only, matrices_t matrices, const tabs_t &semi_impl={ }) const =0
std::vector< const Operateur_Diff_base * > op_ext
virtual void mettre_a_jour(double temps)
DOES NOTHING - to override in derived classes.
virtual void completer()
Associe l'operateur au domaine_dis, le domaine_Cl_dis, et a l'inconnue de son equation.
classe Parametre_implicite Un objet Parametre_implicite est un objet regroupant les differentes
classe Pb_Multiphase Cette classe represente un probleme de thermohydraulique multiphase de type "3*N...
static void abort()
Routine de sortie de Trio-U sur une erreur abort().
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.
_SIZE_ dimension_tot(int) const override