TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Operateur_IJK_elem_diff_base.cpp
1/****************************************************************************
2* Copyright (c) 2015 - 2016, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#include <Operateur_IJK_elem_diff_base.h>
17#include <IJK_Navier_Stokes_tools_cut_cell.h>
18
19Implemente_base_sans_constructeur(Operateur_IJK_elem_diff_base_double, "Operateur_IJK_elem_diff_base_double", Operateur_IJK_elem_base_double);
20
22{
23 input_field_ = nullptr;
24 uniform_lambda_ = nullptr;
25 uniform_lambda_liquid_ = nullptr;
26 uniform_lambda_vapour_ = nullptr;
27 lambda_ = nullptr;
28
30
31 coeff_field_x_ = nullptr;
32 coeff_field_y_ = nullptr;
33 coeff_field_z_ = nullptr;
34
35 is_anisotropic_ = false;
36 is_vectorial_ = false;
37 is_structural_ = false;
38 is_uniform_ = false;
39 is_corrected_ = false;
40
41 perio_k_ = false;
42 is_hess_ = false;
43 is_flux_ = false;
44
45 corrige_flux_ = nullptr;
46 indicatrice_ = nullptr;
47}
48
50{
51 return os;
52}
53
55{
56 return is;
57}
58
59const IJK_Field_local_double& Operateur_IJK_elem_diff_base_double::get_model(DIRECTION _DIR_)
60{
61 assert(is_vectorial_);
62 switch(_DIR_)
63 {
64 case DIRECTION::X:
65 return *coeff_field_x_;
66 case DIRECTION::Y:
67 return *coeff_field_y_;
68 case DIRECTION::Z:
69 return *coeff_field_z_;
70 default:
71 Cerr << "Error in Operateur_IJK_elem_diff_base_double::get_model: wrong direction..." << finl;
73 }
74 return *coeff_field_x_;
75}
76
78{
79 channel_data_.initialize(splitting);
80 perio_k_= splitting.get_periodic_flag(DIRECTION_K);
81}
82
83void Operateur_IJK_elem_diff_base_double::calculer(const IJK_Field_double& field,
84 IJK_Field_double& result,
85 const IJK_Field_local_double& boundary_flux_kmin,
86 const IJK_Field_local_double& boundary_flux_kmax)
87{
88 // Cerr << "Uniform lambda: " << get_uniform_lambda() << finl;
89 input_field_ = &field;
90 boundary_flux_kmin_ = &boundary_flux_kmin;
91 boundary_flux_kmax_ = &boundary_flux_kmax;
92 compute_set(result);
93 input_field_ = nullptr;
94 lambda_ = nullptr; // TODO: Why reset to nullptr? we could attribute it once only at initialize and never change it later. What was the reason?
95 coeff_field_x_ = nullptr;
96 coeff_field_y_ = nullptr;
97 coeff_field_z_ = nullptr;
99}
100
101void Operateur_IJK_elem_diff_base_double::ajouter(const IJK_Field_double& field,
102 IJK_Field_double& result,
103 const IJK_Field_local_double& boundary_flux_kmin,
104 const IJK_Field_local_double& boundary_flux_kmax)
105{
106 input_field_ = &field;
107 boundary_flux_kmin_ = &boundary_flux_kmin;
108 boundary_flux_kmax_ = &boundary_flux_kmax;
109 compute_add(result);
110 input_field_ = nullptr;
111 lambda_ = nullptr;
112 coeff_field_x_ = nullptr;
113 coeff_field_y_ = nullptr;
114 coeff_field_z_ = nullptr;
116}
117
118Implemente_instanciable_sans_constructeur(OpDiffUniformIJKScalar_double, "OpDiffUniformIJKScalar_double", Operateur_IJK_elem_diff_base_double);
119
121{
122 // Operateur_IJK_elem_diff_base_double::printOn(os);
123 return os;
124}
125
127{
128 // Operateur_IJK_elem_diff_base_double::readOn(is);
129 return is;
130}
131
132Implemente_instanciable_sans_constructeur(OpDiffUniformIJKScalarCorrection_double, "OpDiffUniformIJKScalarCorrection_double", Operateur_IJK_elem_diff_base_double);
133
135{
136 // Operateur_IJK_elem_diff_base_double::printOn(os);
137 return os;
138}
139
141{
142 // Operateur_IJK_elem_diff_base_double::readOn(is);
143 return is;
144}
145
146void OpDiffUniformIJKScalarCorrection_double::correct_flux(IJK_Field_local_double *const flux, const int k_layer, const int dir)
147{
148 corrige_flux_->valeur().corrige_flux_diff_faceIJ(flux, k_layer, dir);
149}
150
151void OpDiffUniformIJKScalarCorrection_double::correct_flux_spherical(Simd_double& a, Simd_double& b, const int& i, const int& j, int k_layer, int dir)
152{
153 corrige_flux_->valeur().correct_flux_spherical(a, b, i, j, k_layer, dir);
154}
155
156Implemente_instanciable_sans_constructeur(OpDiffIJKScalar_cut_cell_double, "OpDiffIJKScalar_cut_cell_double", Operateur_IJK_elem_diff_base_double);
157
159{
160 return os;
161}
162
164{
165 return is;
166}
167
168void OpDiffIJKScalar_cut_cell_double::correct_flux(IJK_Field_local_double *const flux, int k_layer, const int dir)
169{
170 if (dir == 0)
171 {
172 correct_flux_<DIRECTION::X>(flux, k_layer);
173 }
174 else if (dir == 1)
175 {
176 correct_flux_<DIRECTION::Y>(flux, k_layer);
177 }
178 else if (dir == 2)
179 {
180 correct_flux_<DIRECTION::Z>(flux, k_layer);
181 }
182 else
183 {
184 Cerr << "Unexpected value of dir in OpDiffIJKScalar_cut_cell_double::correct_flux" << finl;
186 }
187
188 // Fluxes are stored in the flux variable (IJK_Field_local_double) for pure cells
189 // as well as within the cut_cell_flux_ variable for cut cells.
190 // The two variables must agrees for the fluxes between pure and cut cells.
191 assert((*cut_cell_flux_)[dir].verify_consistency_within_layer(dir, k_layer, *flux));
192
193
194
196 {
197 Cut_field_vector3_double& cut_field_current_fluxes = static_cast<Cut_field_vector3_double&>(*current_fluxes_);
198 Cut_field_vector3_double& cut_field_RK3_F_fluxes = static_cast<Cut_field_vector3_double&>(*RK3_F_fluxes_);
199
200 assert(&(*cut_cell_flux_)[0].get_cut_cell_disc() == &(*cut_cell_flux_)[1].get_cut_cell_disc());
201 assert(&(*cut_cell_flux_)[0].get_cut_cell_disc() == &(*cut_cell_flux_)[2].get_cut_cell_disc());
202 const Cut_cell_FT_Disc& cut_cell_disc = (*cut_cell_flux_)[0].get_cut_cell_disc();
203
204 {
205 int ni = (dir == 0) ? flux->ni() : flux->ni() - 1;
206 int nj = (dir == 1) ? flux->nj() : flux->nj() - 1;
207 for (int j = 0; j < nj; j++)
208 {
209 for (int i = 0; i < ni; i++)
210 {
211 cut_field_current_fluxes[dir].pure_(i,j,k_layer) = (*flux)(i,j,0);
212 int n = cut_cell_disc.get_n(i, j, k_layer);
213 if (n >= 0)
214 {
215 cut_field_current_fluxes[dir].diph_l_(n) = (*cut_cell_flux_)[dir].diph_l_(n);
216 cut_field_current_fluxes[dir].diph_v_(n) = (*cut_cell_flux_)[dir].diph_v_(n);
217 }
218 }
219 }
220 }
221
222 {
223 int ni = (dir == 0) ? flux->ni() : flux->ni() - 1;
224 int nj = (dir == 1) ? flux->nj() : flux->nj() - 1;
225 for (int j = 0; j < nj; j++)
226 {
227 for (int i = 0; i < ni; i++)
228 {
229 int n = cut_cell_disc.get_n(i, j, k_layer);
230 if (n >= 0)
231 {
232 const DoubleTabFT_cut_cell_vector3& indicatrice_surfacique = cut_cell_disc.get_interfaces().get_indicatrice_surfacique_efficace_face();
233 double indicatrice_surface = indicatrice_surfacique(n,dir);
234
235 cut_field_RK3_F_fluxes[dir].diph_l_(n) = cut_field_RK3_F_fluxes[dir].diph_l_(n)*indicatrice_surface;
236 cut_field_RK3_F_fluxes[dir].diph_v_(n) = cut_field_RK3_F_fluxes[dir].diph_v_(n)*(1 -indicatrice_surface);
237 }
238 }
239 }
240 }
241
242 runge_kutta3_update_surfacic_fluxes(cut_field_current_fluxes[dir], cut_field_RK3_F_fluxes[dir], rk_step_, k_layer, dir, dt_tot_, *cellule_rk_restreint_diff_main_);
243
244 {
245 int ni = (dir == 0) ? flux->ni() : flux->ni() - 1;
246 int nj = (dir == 1) ? flux->nj() : flux->nj() - 1;
247 for (int j = 0; j < nj; j++)
248 {
249 for (int i = 0; i < ni; i++)
250 {
251 (*flux)(i,j,0) = cut_field_current_fluxes[dir].pure_(i,j,k_layer);
252 int n = cut_cell_disc.get_n(i, j, k_layer);
253 if (n >= 0)
254 {
255 (*cut_cell_flux_)[dir].diph_l_(n) = cut_field_current_fluxes[dir].diph_l_(n);
256 (*cut_cell_flux_)[dir].diph_v_(n) = cut_field_current_fluxes[dir].diph_v_(n);
257 }
258 }
259 }
260 }
261
262 {
263 int ni = (dir == 0) ? flux->ni() : flux->ni() - 1;
264 int nj = (dir == 1) ? flux->nj() : flux->nj() - 1;
265 for (int j = 0; j < nj; j++)
266 {
267 for (int i = 0; i < ni; i++)
268 {
269 int n = cut_cell_disc.get_n(i, j, k_layer);
270 if (n >= 0)
271 {
272 const DoubleTabFT_cut_cell_vector3& indicatrice_surfacique = cut_cell_disc.get_interfaces().get_indicatrice_surfacique_efficace_face();
273 double indicatrice_surface = indicatrice_surfacique(n,dir);
274
275 cut_field_RK3_F_fluxes[dir].diph_l_(n) = (indicatrice_surface == 0.) ? 0. : cut_field_RK3_F_fluxes[dir].diph_l_(n)/indicatrice_surface;
276 cut_field_RK3_F_fluxes[dir].diph_v_(n) = ((1 - indicatrice_surface) == 0.) ? 0. : cut_field_RK3_F_fluxes[dir].diph_v_(n)/(1 -indicatrice_surface);
277 }
278 }
279 }
280 }
281 }
282
283 assert((*cut_cell_flux_)[dir].verify_consistency_within_layer(dir, k_layer, *flux));
284}
285
287 const IJK_Field_local_double& flux_x,
288 const IJK_Field_local_double& flux_y,
289 const IJK_Field_local_double& flux_zmin,
290 const IJK_Field_local_double& flux_zmax,
291 IJK_Field_double& resu, int k_layer, bool add)
292{
293 assert(&(cut_cell_flux[0].get_cut_cell_disc()) == &(cut_cell_flux[1].get_cut_cell_disc()));
294 assert(&(cut_cell_flux[0].get_cut_cell_disc()) == &(cut_cell_flux[2].get_cut_cell_disc()));
295 const Cut_cell_FT_Disc& cut_cell_disc = cut_cell_flux[0].get_cut_cell_disc();
296
297 Cut_field_double& cut_field_resu = static_cast<Cut_field_double&>(resu);
298
299 for (int index = cut_cell_disc.get_k_value_index(k_layer); index < cut_cell_disc.get_k_value_index(k_layer+1); index++)
300 {
301 int n = cut_cell_disc.get_n_from_k_index(index);
302 Int3 ijk = cut_cell_disc.get_ijk(n);
303
304 int i = ijk[0];
305 int j = ijk[1];
306 int k = ijk[2];
307
308 if (!cut_cell_disc.get_domaine().within_ghost(i, j, k, 0, 0))
309 continue;
310
311 BOUNDARY_FLUX type_boundary_flux = flux_determined_by_boundary_condition_<DIRECTION::Z>(k);
312 if (type_boundary_flux != BOUNDARY_FLUX::NOT_DETERMINED_BY_BOUNDARY)
313 {
314 Cerr << "Le cas d'une cellule diphasique avec flux condition aux limites n'est pas traite" << finl;
316 }
317 else
318 {
319 for (int phase = 0; phase < 2; phase++)
320 {
321 const DoubleTabFT_cut_cell& diph_flux_x = (phase == 0) ? cut_cell_flux[0].diph_v_ : cut_cell_flux[0].diph_l_;
322 const DoubleTabFT_cut_cell& diph_flux_y = (phase == 0) ? cut_cell_flux[1].diph_v_ : cut_cell_flux[1].diph_l_;
323 const DoubleTabFT_cut_cell& diph_flux_z = (phase == 0) ? cut_cell_flux[2].diph_v_ : cut_cell_flux[2].diph_l_;
324 DoubleTabFT_cut_cell& diph_resu = (phase == 0) ? cut_field_resu.diph_v_ : cut_field_resu.diph_l_;
325
326 int n_ip1 = cut_cell_disc.get_n(i+1,j,k);
327 int n_jp1 = cut_cell_disc.get_n(i,j+1,k);
328 int n_kp1 = cut_cell_disc.get_n(i,j,k+1); // ???k
329
330 double fx_centre = diph_flux_x(n);
331 double fy_centre = diph_flux_y(n);
332 double fz_centre = diph_flux_z(n);
333
334 double fx_right = (n_ip1 < 0) ? (cut_cell_disc.indic_pure(i+1,j,k) == phase)*flux_x(i+1,j,0) : diph_flux_x(n_ip1);
335 double fy_right = (n_jp1 < 0) ? (cut_cell_disc.indic_pure(i,j+1,k) == phase)*flux_y(i,j+1,0) : diph_flux_y(n_jp1);
336 double fz_right = (n_kp1 < 0) ? (cut_cell_disc.indic_pure(i,j,k+1) == phase)*flux_zmax(i,j,0) : diph_flux_z(n_kp1);
337
338 double r = 0;
339 r += fx_centre - fx_right;
340 r += fy_centre - fy_right;
341 r += fz_centre - fz_right;
342
343 if (add)
344 {
345 r += diph_resu(n);
346 }
347 diph_resu(n) = r;
348 }
349 }
350 }
351}
352
353Implemente_instanciable_sans_constructeur(OpDiffIJKScalar_double, "OpDiffIJKScalar_double", Operateur_IJK_elem_diff_base_double);
354
356{
357 // Operateur_IJK_elem_diff_base_double::printOn(os);
358 return os;
359}
360
362{
363 // Operateur_IJK_elem_diff_base_double::readOn(is);
364 return is;
365}
366
367Implemente_instanciable_sans_constructeur(OpDiffAnisotropicIJKScalar_double, "OpDiffAnisotropicIJKScalar_double", Operateur_IJK_elem_diff_base_double);
368
370{
371 // Operateur_IJK_elem_diff_base_double::printOn(os);
372 return os;
373}
374
376{
377 // Operateur_IJK_elem_diff_base_double::readOn(is);
378 return is;
379}
380
381Implemente_instanciable_sans_constructeur(OpDiffVectorialIJKScalar_double, "OpDiffVectorialIJKScalar_double", Operateur_IJK_elem_diff_base_double);
382
384{
385 // Operateur_IJK_elem_diff_base_double::printOn(os);
386 return os;
387}
388
390{
391 // Operateur_IJK_elem_diff_base_double::readOn(is);
392 return is;
393}
394
395Implemente_instanciable_sans_constructeur(OpDiffVectorialAnisotropicIJKScalar_double, "OpDiffVectorialAnisotropicIJKScalar_double", Operateur_IJK_elem_diff_base_double);
396
398{
399 // Operateur_IJK_elem_diff_base_double::printOn(os);
400 return os;
401}
402
404{
405 // Operateur_IJK_elem_diff_base_double::readOn(is);
406 return is;
407}
408
409Implemente_instanciable_sans_constructeur(OpDiffStructuralOnlyIJKScalar_double, "OpDiffStructuralOnlyIJKScalar_double", Operateur_IJK_elem_diff_base_double);
410
412{
413 // Operateur_IJK_elem_diff_base_double::printOn(os);
414 return os;
415}
416
418{
419 // Operateur_IJK_elem_diff_base_double::readOn(is);
420 return is;
421}
const Domaine_IJK & get_domaine() const
const IJK_Interfaces & get_interfaces() const
int get_n_from_k_index(int index) const
Int3 get_ijk(int n) const
int get_k_value_index(int k) const
double indic_pure(const int i, const int j, const int k) const
int get_n(int i, int j, int k) const
TRUSTTabFT_cut_cell< _TYPE_ > diph_l_
Definition Cut_field.h:49
TRUSTTabFT_cut_cell< _TYPE_ > diph_v_
Definition Cut_field.h:50
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
Definition Domaine_IJK.h:47
bool within_ghost(int i, int j, int k, int negative_ghost_size, int positive_ghost_size) const
bool get_periodic_flag(int direction) const
Method returns true if periodic in this direction.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
const DoubleTabFT_cut_cell_vector3 & get_indicatrice_surfacique_efficace_face() const
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
void compute_cut_cell_divergence(const FixedVector< Cut_cell_double, 3 > &cut_cell_flux, const IJK_Field_local_double &flux_x, const IJK_Field_local_double &flux_y, const IJK_Field_local_double &flux_zmin, const IJK_Field_local_double &flux_zmax, IJK_Field_double &resu, int k_layer, bool add)
virtual void compute_add(IJK_Field_double &dx)
virtual void compute_set(IJK_Field_double &dx)
virtual void ajouter(const IJK_Field_double &field, IJK_Field_double &result, const IJK_Field_local_double &boundary_flux_kmin, const IJK_Field_local_double &boundary_flux_kmax)
const IJK_Field_local_double * boundary_flux_kmin_
virtual void calculer(const IJK_Field_double &field, IJK_Field_double &result, const IJK_Field_local_double &boundary_flux_kmin, const IJK_Field_local_double &boundary_flux_kmax)
virtual void initialize(const Domaine_IJK &splitting) override
const IJK_Field_local_double & get_model(DIRECTION _DIR_)
const IJK_Field_local_double * boundary_flux_kmax_
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
Classe de base des flux de sortie.
Definition Sortie.h:52