16#ifndef Iterateur_VDF_Elem_FT_TCL_TPP_included
17#define Iterateur_VDF_Elem_FT_TCL_TPP_included
19#include <Convection_Diffusion_Temperature_FT_Disc.h>
20#include <Transport_Interfaces_FT_Disc.h>
21#include <Triple_Line_Model_FT_Disc.h>
22#include <Probleme_FT_Disc_gen.h>
31template<
class _TYPE_>
template<
typename Type_Double>
32inline void Iterateur_VDF_Elem<_TYPE_>::fill_flux_tables_(
const int face,
const int ncomp,
const double coeff,
const Type_Double& flux, DoubleTab& resu)
const
34 DoubleTab& flux_bords = op_base->flux_bords();
35 const int elem1 = elem(face, 0), elem2 = elem(face, 1);
45 for (
int k = 0; k < ncomp; k++)
47 resu(elem1, k) += coeff * flux[k];
48 flux_bords(face, k) += coeff * flux[k];
49 if ((indicatrice(elem1) != 0.) && (indicatrice(elem1) != 1.))
51 Cerr <<
"echange_externe_impose face-no= " << face <<
" elem1= " << elem1 <<
" flux= " << flux(k) << finl;
59 for (
int k = 0; k < ncomp; k++)
61 resu(elem2, k) -= coeff * flux[k];
62 flux_bords(face, k) -= coeff * flux[k];
64 if ((indicatrice(elem2) != 0.) && (indicatrice(elem2) != 1.))
66 Cerr <<
"echange_externe_impose face-no= " << face <<
" elem2= " << elem2 <<
" flux= " << flux(k) << finl;
76 for (
int k = 0; k < ncomp; k++)
78 resu(elem1, k) += coeff * flux[k];
79 flux_bords(face, k) += coeff * flux[k];
82 for (
int k = 0; k < ncomp; k++)
84 resu(elem2, k) -= coeff * flux[k];
85 flux_bords(face, k) -= coeff * flux[k];
91 for (
int k = 0; k < ncomp; k++)
93 resu(elem1, k) += coeff * flux[k];
94 flux_bords(face, k) += coeff * flux[k];
97 for (
int k = 0; k < ncomp; k++)
99 resu(elem2, k) -= coeff * flux[k];
100 flux_bords(face, k) -= coeff * flux[k];
105template<
class _TYPE_>
template<
typename Type_Double>
106bool Iterateur_VDF_Elem<_TYPE_>::ajouter_blocs_bords_echange_ext_FT_TCL(
const Echange_externe_impose& cl,
const int ndeb,
const int nfin,
const int num_cl,
const int N,
const Front_VF& frontiere_dis,
107 matrices_t mats, DoubleTab& resu,
const tabs_t& semi_impl)
const
109 const DoubleTab& donnee = semi_impl.count(nom_ch_inco_) ? semi_impl.at(nom_ch_inco_) : le_champ_convecte_ou_inc->valeurs();
110 Type_Double flux(N), aii(N), ajj(N), aef(N);
111 int boundary_index = -1;
112 if (le_dom->front_VF(num_cl).le_nom() == frontiere_dis.
le_nom())
113 boundary_index = num_cl;
116 int Mv = le_ch_v ? le_ch_v->valeurs().line_size() : N;
119 const IntTab& face_voisins = le_dom->face_voisins();
127 for (
int face = ndeb; face < nfin; face++)
129 const int local_face = le_dom->front_VF(boundary_index).num_local_face(face);
130 flux_evaluateur.flux_face(donnee, boundary_index, face, local_face, cl, ndeb, flux);
142 const ArrOfInt& elems_with_CL_contrib = tcl->
elems();
144 const ArrOfDouble& Q_from_CL = tcl->
Q();
146 const double sign = (face_voisins(face, 0) == -1) ? -1. : 1.;
147 const int nb_contact_line_contribution = Q_from_CL.
size_array();
149 for (
int idx = 0; idx < nb_contact_line_contribution; idx++)
151 const int elemi = elems_with_CL_contrib[idx];
152 const int facei = boundary_faces[idx];
153 const int elem_bord_with_facei = face_voisins(facei, 0)+face_voisins(facei, 1) +1;
158 const double TCL_wall_flux = Q_from_CL[idx];
162 const double val = sign*TCL_wall_flux;
163 Cerr <<
"GB face: " << face <<
" former-flux = " << flux[k];
174 Cerr <<
" new-flux = " << flux[k] <<
" [contrib #" << nb_contrib <<
"]" << finl;
175 if (elem_bord_with_facei != elemi)
186 fill_flux_tables_(face, N, 1.0 , flux, resu);
189 Matrice_Morse *m_vit = (mats.count(
"vitesse") && is_convective_op()) ? mats.at(
"vitesse") :
nullptr, *mat = (!is_pb_multiphase() && mats.count(nom_ch_inco_)) ? mats.at(nom_ch_inco_) :
nullptr;
191 fill_derivee_cc(mats, semi_impl, d_cc);
196 DoubleTab val_b = use_base_val_b_ ? le_champ_convecte_ou_inc->Champ_base::valeur_aux_bords() : le_champ_convecte_ou_inc->valeur_aux_bords();
197 for (
int face = ndeb; face < nfin; face++)
199 const int local_face = le_dom->front_VF(boundary_index).num_local_face(face);
200 flux_evaluateur.coeffs_face_bloc_vitesse(donnee, val_b, boundary_index, face, local_face, cl, ndeb, aef);
202 for (
int i = 0; i < 2; i++)
203 if ((e = elem(face, i)) >= 0)
204 for (
int n = 0, m = 0; n < N; n++, m += (Mv > 1)) (*m_vit)(N * e + n, Mv * face + m) += (i ? -1.0 : 1.0) * aef(n);
209 if (mat || d_cc.size() > 0)
210 for (
int face = ndeb; face < nfin; face++)
212 const int local_face = le_dom->front_VF(boundary_index).num_local_face(face);
213 flux_evaluateur.coeffs_face(donnee, boundary_index, face, local_face, ndeb, cl, aii, ajj);
214 fill_coeffs_matrices(face, aii, ajj, mat, d_cc);
virtual DoubleTab & valeurs()=0
Transport_Interfaces_FT_Disc & eq_interface()
ArrOfDouble & lost_fluxes()
Classe Echange_externe_impose: Cette classe represente le cas particulier de la classe.
classe Equation_base Le role d'une equation est le calcul d'un ou plusieurs champs....
Probleme_base & probleme()
Renvoie le probleme associe a l'equation.
const Nom & le_nom() const override
Renvoie le nom de la frontiere geometrique.
Classe Matrice_Morse Represente une matrice M (creuse), non necessairement carree.
const Triple_Line_Model_FT_Disc & tcl() const
classe Probleme_base C'est un Probleme_U qui n'est pas un couplage.
virtual const Equation_base & equation(int) const =0
void append_array(_TYPE_ valeur)
_SIZE_ size_array() const
const Champ_base & get_indicatrice() override
getter champ variables_internes_->indicatrice_cache a partir de la position des interfaces.
bool is_activated() const
ArrOfInt & boundary_faces()