TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Post_Processing_Hydrodynamic_Forces_Stokes.cpp
1/****************************************************************************
2* Copyright (c) 2025, 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 <Post_Processing_Hydrodynamic_Forces_Stokes.h>
17
18#include <Convection_Diffusion_Temperature_FT_Disc.h>
19#include <Transport_Interfaces_FT_Disc.h>
20#include <Navier_Stokes_FT_Disc.h>
21#include <Fluide_Incompressible.h>
22#include <Connex_components_FT.h>
23#include <Solid_Particle_base.h>
24#include <Fluide_Diphasique.h>
25#include <Maillage_FT_Disc.h>
26#include <Matrice_Dense.h>
27#include <Domaine_VDF.h>
28#include <TRUSTTab.h>
29
30Implemente_instanciable(Post_Processing_Hydrodynamic_Forces_Stokes,
31 "Post_Processing_Hydrodynamic_Forces_Stokes",
33
38
40{
41 Cerr << "Error: Post_Processing_Hydrodynamic_Forces::printOn is not implemented." << finl;
43 return os;
44}
45
47{
48 is_compute_forces_=post_process_hydro_forces.get_is_compute_forces();
59 location_stress_tensor_=post_process_hydro_forces.get_location_stress_tensor();
60}
61
63{
65 {
66 /***************************************************************
67 * RECUPERATION DES GRANDEURS *
68 ***************************************************************/
69 Cerr << "Post_Processing_Hydrodynamic_Forces_Stokes::compute_hydrodynamic_forces" << finl;
70 Transport_Interfaces_FT_Disc& eq_transport = ptr_eq_transport_.valeur();
71 const Navier_Stokes_FT_Disc& eq_ns = ptr_eq_ns_.valeur();
72 const Maillage_FT_Disc& mesh = eq_transport.maillage_interface_pour_post();
73 const int nb_fa7 = mesh.nb_facettes();
74
75 IntVect compo_connexes_fa7(nb_fa7); // Init a zero
76 int n = search_connex_components_local_FT(mesh, compo_connexes_fa7);
77 int nb_particles_tot=compute_global_connex_components_FT(mesh, compo_connexes_fa7, n);
78
79 resize_and_init_tables(nb_particles_tot);
83
84 if (nb_fa7>0)
85 {
86 resize_data_fa7(nb_fa7);
88
89 const DoubleTab& gravity_center_fa7=mesh.get_gravity_center_fa7();
90 const ArrOfDouble& fa7_surface = mesh.get_update_surface_facettes();
91 const DoubleTab& tab_fa7_normal = mesh.get_update_normale_facettes();
92
93 const IntTab& particles_eulerian_id_number=eq_ns.get_particles_eulerian_id_number();
95 0,
96 gravity_center_fa7,
97 mesh,
98 tab_fa7_normal,
99 particles_eulerian_id_number);
100
101 // ----------------------------- Pressure force -----------------------------
103 Thermal_correction_discretization_method::P1,
104 compo_connexes_fa7, fa7_surface, tab_fa7_normal);
105 // ----------------------------- Friction force -----------------------------
108 {
109 compute_friction_force_complet_tensor(nb_fa7, mesh, compo_connexes_fa7,
110 fa7_surface, tab_fa7_normal);
111 }
114 {
115 compute_friction_force_projected_tensor(nb_fa7, mesh, compo_connexes_fa7,
116 fa7_surface, tab_fa7_normal);
117 }
118 }
119 mp_sum_for_each_item(total_pressure_force_Stokes_th_);
120 mp_sum_for_each_item(total_friction_force_Stokes_th_);
123
125 }
126}
127
129{
130 total_pressure_force_Stokes_th_.resize(nb_particles_tot,dimension);
131 total_friction_force_Stokes_th_.resize(nb_particles_tot,dimension);
132 total_pressure_force_.resize(nb_particles_tot,dimension);
133 total_friction_force_.resize(nb_particles_tot,dimension);
134 total_pressure_force_Stokes_th_=0;
135 total_friction_force_Stokes_th_=0;
138}
139
141{
142 const Navier_Stokes_FT_Disc& eq_ns = ptr_eq_ns_.valeur();
143 const Fluide_Diphasique& two_phase_fluid = eq_ns.fluide_diphasique();
144 const Solid_Particle_base& solid_particle=ref_cast(Solid_Particle_base,
145 two_phase_fluid.fluide_phase(0));
146 const double particle_radius = solid_particle.get_equivalent_radius();
147 const int id_fluid_phase=two_phase_fluid.get_id_fluid_phase();
148 const double mu_f =two_phase_fluid.fluide_phase(id_fluid_phase).
149 viscosite_dynamique().valeurs()(0, 0);
150 const double mu_p = two_phase_fluid.fluide_phase(1-id_fluid_phase).
151 masse_volumique().valeurs()(0, 0);
152 const double rho_f =two_phase_fluid.fluide_phase(id_fluid_phase).
153 viscosite_dynamique().valeurs()(0, 0);
154 const double rho_p = two_phase_fluid.fluide_phase(1-id_fluid_phase).
155 masse_volumique().valeurs()(0, 0);
156 const double phi_mu=mu_p/mu_f;
157 const DoubleTab& gravite = eq_ns.milieu().gravite().valeurs();
158 DoubleVect vect_g(dimension);
159 for (int i=0; i<dimension; i++)
160 vect_g(i)=gravite(0,i);
161 const double norme_g = sqrt(local_carre_norme_vect(vect_g));
162
163 vinf_Stokes_=2./3.*(pow(particle_radius,2)*norme_g/mu_f)*((1+phi_mu)/(2.+3.*phi_mu)*(rho_f-rho_p));
164}
165
167{
168 const Navier_Stokes_FT_Disc& eq_ns = ptr_eq_ns_.valeur();
169 Navier_Stokes_FT_Disc& eq_ns_non_const = ptr_eq_ns_.valeur();
170
171 const Domaine_VDF& domain_vdf = ref_cast(Domaine_VDF, eq_ns.domaine_dis());
172 const DoubleTab& xv = domain_vdf.xv();
173 const Fluide_Diphasique& two_phase_fluid = eq_ns.fluide_diphasique();
174 const Solid_Particle_base& solid_particle=ref_cast(Solid_Particle_base,
175 two_phase_fluid.fluide_phase(0));
176 const double particle_radius = solid_particle.get_equivalent_radius();
177 const int id_fluid_phase=two_phase_fluid.get_id_fluid_phase();
178 const double mu_f =two_phase_fluid.fluide_phase(id_fluid_phase).
179 viscosite_dynamique().valeurs()(0, 0);
180 const double mu_p = two_phase_fluid.fluide_phase(1-id_fluid_phase).
181 masse_volumique().valeurs()(0, 0);
182 const double phi_mu=mu_p/mu_f;
183 const double& vinf_Stokes=get_vinf_Stokes();
184
185 DoubleTab& vitesse_Stokes_th=eq_ns_non_const.get_set_velocity_field_Stokes_th();
186
187 vitesse_Stokes_th=0;
188
189 for (int num_face=0; num_face<vitesse_Stokes_th.dimension_tot(0); num_face++)
190 {
191 double x=xv(num_face,0);
192 double y=xv(num_face,1);
193 double z=xv(num_face,2);
194 if (sqrt(x*x+y*y+z*z)>=particle_radius)
195 {
196 if (domain_vdf.orientation(num_face)==0)
197 vitesse_Stokes_th(num_face)=compute_Stokes_Ux_fluid(x, y, z, vinf_Stokes,
198 particle_radius, phi_mu);
199 else if (domain_vdf.orientation(num_face)==1)
200 vitesse_Stokes_th(num_face)=compute_Stokes_Uy_fluid(x, y, z, vinf_Stokes,
201 particle_radius, phi_mu);
202 else
203 vitesse_Stokes_th(num_face)=compute_Stokes_Uz_fluid(x, y, z, vinf_Stokes,
204 particle_radius, phi_mu);
205 }
206 else
207 {
208 if (domain_vdf.orientation(num_face)==0)
209 {
210 vitesse_Stokes_th(num_face)=vinf_Stokes/(2*pow(particle_radius,2))*
211 (1/(1+phi_mu))*x*z;
212 }
213 else if (domain_vdf.orientation(num_face)==1)
214 {
215 vitesse_Stokes_th(num_face)=vinf_Stokes/(2*pow(particle_radius,2))*
216 (1/(1+phi_mu))*y*z;
217 }
218 else
219 {
220 vitesse_Stokes_th(num_face)=vinf_Stokes/(2*(1+phi_mu))*
221 (1+z*z/(pow(particle_radius,2))-2*(x*x+y*y+z*z)/
222 (pow(particle_radius,2)));
223 }
224 }
225 }
226 vitesse_Stokes_th.echange_espace_virtuel();
227}
228
230{
231 const Navier_Stokes_FT_Disc& eq_ns = ptr_eq_ns_.valeur();
232 Navier_Stokes_FT_Disc& eq_ns_non_const = ptr_eq_ns_.valeur();
233
234 const Domaine_VDF& domain_vdf = ref_cast(Domaine_VDF, eq_ns.domaine_dis());
235 const DoubleTab& xp = domain_vdf.xp();
236 const Fluide_Diphasique& two_phase_fluid = eq_ns.fluide_diphasique();
237 const Solid_Particle_base& solid_particle=ref_cast(Solid_Particle_base,
238 two_phase_fluid.fluide_phase(0));
239 const double particle_radius = solid_particle.get_equivalent_radius();
240 const int id_fluid_phase=two_phase_fluid.get_id_fluid_phase();
241 const double mu_f =two_phase_fluid.fluide_phase(id_fluid_phase).
242 viscosite_dynamique().valeurs()(0, 0);
243 const double mu_p = two_phase_fluid.fluide_phase(1-id_fluid_phase).
244 masse_volumique().valeurs()(0, 0);
245 const double phi_mu=mu_p/mu_f;
246 const double& vinf_Stokes=get_vinf_Stokes();
247 DoubleTab& pressure_Stokes_th=eq_ns_non_const.get_set_pressure_field_Stokes_th();
248
249 for (int num_elem=0; num_elem<pressure_Stokes_th.dimension_tot(0); num_elem++)
250 {
251 double x= xp(num_elem,0);
252 double y= xp(num_elem,1);
253 double z= xp(num_elem,2);
254 if (sqrt(x*x+y*y+z*z)>=particle_radius)
255 {
256 pressure_Stokes_th(num_elem)=mu_f*vinf_Stokes*((2+3*phi_mu)/(1+phi_mu))*
257 1/2*particle_radius*z/(pow(x*x+y*y+z*z,1.5));
258 }
259 else
260 {
261 pressure_Stokes_th(num_elem)=mu_p*vinf_Stokes*5/((1+phi_mu)*(pow(particle_radius,2)))*z;
262 }
263 }
264
265 pressure_Stokes_th.echange_espace_virtuel();
266}
267
269{
271 {
272 pressure_fa7_.resize(nb_fa7);
273 pressure_fa7_=3e15;
274 pressure_fa7_Stokes_th_.resize(nb_fa7);
275 pressure_fa7_Stokes_th_=3e15;
276 }
277
278 pressure_force_Stokes_th_fa7_.resize(nb_fa7,dimension);
279 pressure_force_Stokes_th_fa7_=3e15;
280
281 friction_force_Stokes_th_fa7_.resize(nb_fa7,dimension);
282 friction_force_Stokes_th_fa7_=3e15;
283
284 pressure_force_fa7_.resize(nb_fa7,dimension);
286
287 friction_force_fa7_.resize(nb_fa7,dimension);
289
291 {
292 resize_sigma(nb_fa7);
293 resize_gradU_P1(nb_fa7);
294 resize_gradU_P2(nb_fa7);
295 }
296
297 U_P1_Stokes_th_.resize(nb_fa7,dimension);
298 U_P2_Stokes_th_.resize(nb_fa7,dimension);
299 U_P1_.resize(nb_fa7,dimension);
300 U_P2_.resize(nb_fa7,dimension);
301}
302
304{
305 sigma_xx_fa7_.resize(nb_fa7);
306 sigma_xy_fa7_.resize(nb_fa7);
307 sigma_xz_fa7_.resize(nb_fa7);
308 sigma_yx_fa7_.resize(nb_fa7);
309 sigma_yy_fa7_.resize(nb_fa7);
310 sigma_yz_fa7_.resize(nb_fa7);
311 sigma_zx_fa7_.resize(nb_fa7);
312 sigma_zy_fa7_.resize(nb_fa7);
313 sigma_zz_fa7_.resize(nb_fa7);
314
315 sigma_xx_fa7_Stokes_th_.resize(nb_fa7);
316 sigma_xy_fa7_Stokes_th_.resize(nb_fa7);
317 sigma_xz_fa7_Stokes_th_.resize(nb_fa7);
318 sigma_yy_fa7_Stokes_th_.resize(nb_fa7);
319 sigma_yz_fa7_Stokes_th_.resize(nb_fa7);
320 sigma_zz_fa7_Stokes_th_.resize(nb_fa7);
321}
322
324{
325 dUdx_P1_.resize(nb_fa7);
326 dUdy_P1_.resize(nb_fa7);
327 dUdz_P1_.resize(nb_fa7);
328 dVdx_P1_.resize(nb_fa7);
329 dVdy_P1_.resize(nb_fa7);
330 dVdz_P1_.resize(nb_fa7);
331 dWdx_P1_.resize(nb_fa7);
332 dWdy_P1_.resize(nb_fa7);
333 dWdz_P1_.resize(nb_fa7);
334
335 dUdx_P1_Stokes_th_.resize(nb_fa7);
336 dUdz_P1_Stokes_th_.resize(nb_fa7);
337 dVdz_P1_Stokes_th_.resize(nb_fa7);
338 dWdx_P1_Stokes_th_.resize(nb_fa7);
339 dWdy_P1_Stokes_th_.resize(nb_fa7);
340 dWdz_P1_Stokes_th_.resize(nb_fa7);
341}
342
344{
345 dUdx_P2_.resize(nb_fa7);
346 dUdy_P2_.resize(nb_fa7);
347 dUdz_P2_.resize(nb_fa7);
348 dVdx_P2_.resize(nb_fa7);
349 dVdy_P2_.resize(nb_fa7);
350 dVdz_P2_.resize(nb_fa7);
351 dWdx_P2_.resize(nb_fa7);
352 dWdy_P2_.resize(nb_fa7);
353 dWdz_P2_.resize(nb_fa7);
354
355 dUdx_P2_Stokes_th_.resize(nb_fa7);
356 dUdz_P2_Stokes_th_.resize(nb_fa7);
357 dVdz_P2_Stokes_th_.resize(nb_fa7);
358 dWdx_P2_Stokes_th_.resize(nb_fa7);
359 dWdy_P2_Stokes_th_.resize(nb_fa7);
360 dWdz_P2_Stokes_th_.resize(nb_fa7);
361}
362
364{
365 const Navier_Stokes_FT_Disc& eq_ns = ptr_eq_ns_.valeur();
366 const Fluide_Diphasique& two_phase_fluid = eq_ns.fluide_diphasique();
367 const Solid_Particle_base& solid_particle=ref_cast(Solid_Particle_base,
368 two_phase_fluid.fluide_phase(0));
369 const double& vinf_Stokes=get_vinf_Stokes();
370 const double particle_radius = solid_particle.get_equivalent_radius();
371 const int id_fluid_phase=two_phase_fluid.get_id_fluid_phase();
372 const double mu_f =two_phase_fluid.fluide_phase(id_fluid_phase).
373 viscosite_dynamique().valeurs()(0, 0);
374 const double mu_p = two_phase_fluid.fluide_phase(1-id_fluid_phase).
375 masse_volumique().valeurs()(0, 0);
376 const double phi_mu=mu_p/mu_f;
377 return(mu_f*vinf_Stokes*((2+3*phi_mu)/(1+phi_mu))*1/2*particle_radius*z/(pow(x*x+y*y+z*z,1.5)));
378}
379
381 double vinf_Stokes, double particle_radius, double phi_mu)
382{
383 return (vinf_Stokes*z*x*((2+3*phi_mu)/(1+phi_mu)*(particle_radius)/(4*(pow(x*x+y*y+z*z,1.5)))-
384 3*phi_mu/(1+phi_mu)*pow(particle_radius,3)/(4*pow(x*x+y*y+z*z,2.5))));
385}
386
388 double vinf_Stokes, double particle_radius, double phi_mu)
389{
390 return (vinf_Stokes*z*y*((2+3*phi_mu)/(1+phi_mu)*(particle_radius)/(4*(pow(x*x+y*y+z*z,1.5)))-
391 3*phi_mu/(1+phi_mu)*pow(particle_radius,3)/(4*pow(x*x+y*y+z*z,2.5))));
392}
393
395 double vinf_Stokes, double particle_radius, double phi_mu)
396{
397 return (-vinf_Stokes*(+(z*z)*(1/(x*x+y*y+z*z)-(2+3*phi_mu)/(1+phi_mu)*
398 (particle_radius)/(2*pow(x*x+y*y+z*z,1.5))+phi_mu/(1+phi_mu)*
399 pow(particle_radius,3)/(2*pow(x*x+y*y+z*z,2.5)))+(1-z*z/(x*x+y*y+z*z))*
400 (1-(2+3*phi_mu)/(1+phi_mu)*particle_radius/(4*sqrt(x*x+y*y+z*z))-
401 phi_mu/(1+phi_mu)*pow(particle_radius,3)/(4*pow(x*x+y*y+z*z,1.5)))));
402}
403
405 double particle_radius, double phi_mu)
406{
410
411 U_P1_Stokes_th_(fa7,0) = compute_Stokes_Ux_fluid(x, y, z, vinf_Stokes, particle_radius, phi_mu);
412 U_P1_Stokes_th_(fa7,1) = compute_Stokes_Uy_fluid(x, y, z, vinf_Stokes, particle_radius, phi_mu);
413 U_P1_Stokes_th_(fa7,2) = compute_Stokes_Uz_fluid(x, y, z, vinf_Stokes, particle_radius, phi_mu);
414
418
419 U_P2_Stokes_th_(fa7,0) = compute_Stokes_Ux_fluid(x, y, z, vinf_Stokes, particle_radius, phi_mu);
420 U_P2_Stokes_th_(fa7,1) = compute_Stokes_Uy_fluid(x, y, z, vinf_Stokes, particle_radius, phi_mu);
421 U_P2_Stokes_th_(fa7,2) = compute_Stokes_Uz_fluid(x, y, z, vinf_Stokes, particle_radius, phi_mu);
422}
423
425 const int is_discr_elem_diph,
426 const DoubleTab& gravity_center_fa7,
427 const Maillage_FT_Disc& mesh,
428 const DoubleTab& tab_fa7_normal,
429 const IntTab& particles_eulerian_id_number)
430{
431 const Navier_Stokes_FT_Disc& eq_ns = ptr_eq_ns_.valeur();
432 const Domaine_VDF& domain_vdf = ref_cast(Domaine_VDF, eq_ns.domaine_dis());
433 const Domaine& domain = domain_vdf.domaine();
434 const double& vinf_Stokes=get_vinf_Stokes();
435 const Fluide_Diphasique& two_phase_fluid = eq_ns.fluide_diphasique();
436 const int id_fluid_phase=two_phase_fluid.get_id_fluid_phase();
437 const Solid_Particle_base& solid_particle=ref_cast(Solid_Particle_base,
438 two_phase_fluid.fluide_phase(1-id_fluid_phase));
439 const double particle_radius = solid_particle.get_equivalent_radius(); // On ne se sert de cette fonction que lorsqu'il y a une seule particule dans le domaine
440 const double mu_f =two_phase_fluid.fluide_phase(id_fluid_phase).
441 viscosite_dynamique().valeurs()(0, 0);
442 const double mu_p = two_phase_fluid.fluide_phase(1-id_fluid_phase).
443 masse_volumique().valeurs()(0, 0);
444 const double phi_mu=mu_p/mu_f;
445
446 for (int fa7 =0 ; fa7<nb_fa7 ; fa7++)
447 {
448 if (!mesh.facette_virtuelle(fa7))
449 {
450 DoubleVect normale_fa7(dimension);
451 int elem_diph=domain.chercher_elements(gravity_center_fa7(fa7,0),
452 gravity_center_fa7(fa7,1),
453 gravity_center_fa7(fa7,2));
454 DoubleVect delta_i(dimension);
455
456 // On calcule les epaisseurs des mailles euleriennes dans lesquelles se trouvent les facettes
457 // Si on y a acces, on prend l'epaisseur a l'exterieur de la particule
458 // Sinon, on prend l'epaisseur dans la particule
459 // Cela revient simplement a choisir la maille juxtaposee a la maille diphasique
460 for (int dim=0; dim<dimension; dim++)
461 {
462 int elem_haut=face_voisins_for_interp(elem_faces_for_interp(elem_diph, dim+dimension),1);
463 int elem_bas=face_voisins_for_interp(elem_faces_for_interp(elem_diph, dim),0);
464 if (tab_fa7_normal(fa7,dim)>0)
465 delta_i(dim) = (elem_haut>=0) ?
466 fabs(domain_vdf.dist_elem(elem_diph,elem_haut, dim)) :
467 fabs(domain_vdf.dist_elem(elem_diph,elem_bas, dim));
468 else
469 delta_i(dim) = (elem_bas>=0) ?
470 fabs(domain_vdf.dist_elem(elem_diph,elem_bas, dim)) :
471 fabs(domain_vdf.dist_elem(elem_diph,elem_haut, dim));
472 }
473
474 double epsilon=0;
475 for (int dim=0; dim<dimension; dim++)
476 {
477 epsilon+= fabs(delta_i(dim)*fabs(tab_fa7_normal(fa7,dim))); // la distance d'interpolation varie en fonction du raffinement du maillage
478 }
479
480 for (int dim=0; dim<dimension; dim++)
481 {
482 normale_fa7(dim)=tab_fa7_normal(fa7,dim);
483 coord_neighbor_fluid_fa7_pressure_1_(fa7,dim)=gravity_center_fa7(fa7,dim)+
484 interpolation_distance_pressure_P1_*epsilon*normale_fa7(dim);
485 coord_neighbor_fluid_fa7_pressure_2_(fa7,dim)=gravity_center_fa7(fa7,dim)+
486 interpolation_distance_pressure_P2_*epsilon*normale_fa7(dim);
487 coord_neighbor_fluid_fa7_gradU_1_(fa7,dim)=gravity_center_fa7(fa7,dim)+
488 interpolation_distance_gradU_P1_*epsilon*normale_fa7(dim);
489 coord_neighbor_fluid_fa7_gradU_2_(fa7,dim)=gravity_center_fa7(fa7,dim)+
490 interpolation_distance_gradU_P2_*epsilon*normale_fa7(dim);
491 }
492
493 compute_UP1_UP2_Stokes(fa7, vinf_Stokes, particle_radius, phi_mu);
494 }
495 }
496}
497
499 const Maillage_FT_Disc& mesh,
501 Thermal_correction_discretization_method
502 dummy_value,
503 const IntVect& compo_connexes_fa7,
504 const ArrOfDouble& fa7_surface,
505 const DoubleTab& tab_fa7_normal)
506{
507 DoubleTab pressure_P1(nb_fa7);
508 DoubleTab pressure_P2(nb_fa7);
509 Navier_Stokes_FT_Disc& eq_ns_non_const = ptr_eq_ns_.valeur();
510 DoubleTab& pressure_Stokes_th=eq_ns_non_const.get_set_pressure_field_Stokes_th();
511
512 if (trilinear_interpolation_elem(pressure_Stokes_th,
514 pressure_Stokes_th,
515 coord_neighbor_fluid_fa7_pressure_2_, pressure_P2)) // soit on est capable d'interpoler en P1 et P1 et on calcule la force de p
516 {
517 const DoubleTab& gravity_center_fa7=mesh.get_gravity_center_fa7();
518 const double& vinf_Stokes=get_vinf_Stokes();
519 DoubleTab extrapolated_pressure(nb_fa7);
520 const Navier_Stokes_FT_Disc& eq_ns = ptr_eq_ns_.valeur();
521 const Fluide_Diphasique& two_phase_fluid = eq_ns.fluide_diphasique();
522 const int id_fluid_phase=two_phase_fluid.get_id_fluid_phase();
523 const Solid_Particle_base& solid_particle=ref_cast(Solid_Particle_base,
524 two_phase_fluid.fluide_phase(1-id_fluid_phase));
525 const double particle_radius = solid_particle.get_equivalent_radius(); // On ne se sert de cette fonction que lorsqu'il y a une seule particule dans le domaine
526 const double mu_f =two_phase_fluid.fluide_phase(id_fluid_phase).
527 viscosite_dynamique().valeurs()(0, 0);
528 const double mu_p = two_phase_fluid.fluide_phase(1-id_fluid_phase).
529 masse_volumique().valeurs()(0, 0);
530 const double phi_mu=mu_p/mu_f;
531
532 for (int fa7=0; fa7<nb_fa7; fa7++)
533 {
534 if (!mesh.facette_virtuelle(fa7))
535 {
536 extrapolated_pressure(fa7) = pressure_P2(fa7)-interpolation_distance_pressure_P2_*
537 (pressure_P2(fa7)-pressure_P1(fa7))/
539 interpolation_distance_pressure_P1_); //3*pressure_P2(compo,fa7)-2*pressure_P1(compo,fa7); // Si on n'est pas capable d'interpoler en P1 ET P2, alors on ne calcule pas la force de pressure
540 pressure_fa7_(fa7)=extrapolated_pressure(fa7);
541 pressure_fa7_Stokes_th_(fa7)=compute_pressure_interf(gravity_center_fa7(fa7,0),
542 gravity_center_fa7(fa7,1),gravity_center_fa7(fa7,2));
543 }
544 else
545 {
546 pressure_fa7_(fa7)=1e15;
547 extrapolated_pressure(fa7)=-1e15;
548 }
549 }
550
551 for (int fa7=0; fa7<nb_fa7; fa7++)
552 {
553 int compo=compo_connexes_fa7(fa7);
554 double coeff=-extrapolated_pressure(fa7)*fa7_surface(fa7);
555 DoubleVect pressure_force_fa7(dimension);
556 for (int dim=0; dim<dimension; dim++)
557 pressure_force_fa7(dim)=coeff*tab_fa7_normal(fa7,dim);
558 if (!mesh.facette_virtuelle(fa7))
559 {
560
561 for (int dim=0; dim<dimension; dim++)
562 pressure_force_fa7_(fa7,dim)=pressure_force_fa7(dim);
563
564 pressure_force_Stokes_th_fa7_(fa7,0)=-(mu_f*vinf_Stokes*(2.+3.*phi_mu)/
565 (1.+phi_mu)*1./(2.*particle_radius)*
566 gravity_center_fa7(fa7,2)/particle_radius)*
567 tab_fa7_normal(fa7,0)*fa7_surface(fa7);
568 pressure_force_Stokes_th_fa7_(fa7,1)=-(mu_f*vinf_Stokes*(2.+3.*phi_mu)/(1.+phi_mu)*
569 1./(2.*particle_radius)*
570 gravity_center_fa7(fa7,2)/particle_radius)*
571 tab_fa7_normal(fa7,1)*fa7_surface(fa7);
572 pressure_force_Stokes_th_fa7_(fa7,2)=-(mu_f*vinf_Stokes*(2.+3.*phi_mu)/(1.+phi_mu)*
573 1./(2.*particle_radius)*
574 gravity_center_fa7(fa7,2)/particle_radius)*
575 tab_fa7_normal(fa7,2)*fa7_surface(fa7);
576
577 for (int dim=0; dim<dimension; dim++)
578 {
579 total_pressure_force_(compo,dim)+=pressure_force_fa7(dim);
580 total_pressure_force_Stokes_th_(compo,dim)+=pressure_force_Stokes_th_fa7_(fa7,dim);
581 }
582 }
583 }
584 }
585}
586
588 const Maillage_FT_Disc& mesh,
589 const IntVect& compo_connexes_fa7,
590 const ArrOfDouble& fa7_surface,
591 const DoubleTab& tab_fa7_normal)
592{
593 int interp_gradU_P1_ok=0;
594 int interp_gradU_P2_ok=0;
595 DoubleTab grad_U_P1(nb_fa7, dimension, dimension);
596 DoubleTab grad_U_P2(nb_fa7, dimension, dimension);
597 grad_U_P1=-1e15;
598 grad_U_P2=-1e30;
599 const double& vinf_Stokes=get_vinf_Stokes();
600 const Navier_Stokes_FT_Disc& eq_ns = ptr_eq_ns_.valeur();
601 const Fluide_Diphasique& two_phase_fluid = eq_ns.fluide_diphasique();
602 const int id_fluid_phase=two_phase_fluid.get_id_fluid_phase();
603 const Solid_Particle_base& solid_particle=ref_cast(Solid_Particle_base,
604 two_phase_fluid.fluide_phase(1-id_fluid_phase));
605 const double particle_radius = solid_particle.get_equivalent_radius(); // On ne se sert de cette fonction que lorsqu'il y a une seule particule dans le domaine
606 const double mu_f =two_phase_fluid.fluide_phase(id_fluid_phase).
607 viscosite_dynamique().valeurs()(0, 0);
608 const double mu_p = two_phase_fluid.fluide_phase(1-id_fluid_phase).
609 masse_volumique().valeurs()(0, 0);
610 const double phi_mu=mu_p/mu_f;
611 const DoubleTab& gravity_center_fa7=mesh.get_gravity_center_fa7();
612 Navier_Stokes_FT_Disc& eq_ns_non_const = ptr_eq_ns_.valeur();
613 DoubleTab& velocity_Stokes_th=eq_ns_non_const.get_set_velocity_field_Stokes_th();
615 {
616 interp_gradU_P1_ok=trilinear_interpolation_gradU_face(velocity_Stokes_th,
618 grad_U_P1);
619 interp_gradU_P2_ok=trilinear_interpolation_gradU_face(velocity_Stokes_th,
621 grad_U_P2);
622 }
624 {
625 interp_gradU_P1_ok=trilinear_interpolation_gradU_elem(velocity_Stokes_th,
627 grad_U_P1);
628 interp_gradU_P2_ok=trilinear_interpolation_gradU_elem(velocity_Stokes_th,
630 grad_U_P2);
631 }
632 if ( interp_gradU_P1_ok==1 && interp_gradU_P2_ok==1 )
633 {
634 DoubleTab grad_U_extrapole(nb_fa7, dimension, dimension);
635 grad_U_extrapole=1e20;
636
637 for (int fa7=0; fa7<nb_fa7; fa7++)
638 {
639 if (!mesh.facette_virtuelle(fa7))
640 {
641 fill_gradU_P1(fa7, grad_U_P1);
642 fill_gradU_P2(fa7, grad_U_P2);
643 fill_gradU_P1_Stokes_th(fa7,phi_mu,particle_radius);
644 fill_gradU_P2_Stokes_th(fa7,phi_mu,particle_radius);
645 }
646 for (int i=0; i<dimension; i++)
647 {
648 for (int j=0; j<dimension; j++)
649 {
650 grad_U_extrapole(fa7,i,j) = grad_U_P2(fa7,i,j)-
651 interpolation_distance_gradU_P2_*(grad_U_P2(fa7,i,j)-
652 grad_U_P1(fa7,i,j))/(interpolation_distance_gradU_P2_-
654 }
655 }
656 }
657
658 for (int fa7=0; fa7<nb_fa7; fa7++)
659 {
660 int compo=compo_connexes_fa7(fa7);
661 Matrice_Dense stress_tensor(dimension,dimension);
662 for (int i=0; i<dimension; i++)
663 {
664 for (int j=0; j<dimension; j++)
665 {
666 stress_tensor(i,j) = (grad_U_extrapole(fa7,i,j) +
667 grad_U_extrapole(fa7,j,i));
668 }
669 }
670
672 {
673 fill_sigma(fa7,stress_tensor);
675 }
676
677 DoubleTab la_normale_fa7_x_surface(dimension);
678
679 for (int dim=0; dim<dimension; dim++)
680 la_normale_fa7_x_surface(dim) = fa7_surface(fa7)*tab_fa7_normal(fa7,dim);
681
682 DoubleVect friction_force_fa7=stress_tensor*la_normale_fa7_x_surface;
683
684 if (!mesh.facette_virtuelle(fa7))
685 {
686 for (int dim=0; dim<dimension; dim++)
687 friction_force_fa7_(fa7,dim)=friction_force_fa7(dim);
688
689 friction_force_Stokes_th_fa7_(fa7,0)=-mu_f*vinf_Stokes*gravity_center_fa7(fa7,0)*
690 gravity_center_fa7(fa7,2)/(pow(particle_radius,3))*(9.*phi_mu+8.)/
691 (1.+phi_mu)*fa7_surface(fa7);
692 friction_force_Stokes_th_fa7_(fa7,1)=-mu_f*vinf_Stokes*
693 gravity_center_fa7(fa7,1)*gravity_center_fa7(fa7,2)/(pow(particle_radius,3))*
694 (9.*phi_mu+8.)/(1.+phi_mu)*fa7_surface(fa7);
695 friction_force_Stokes_th_fa7_(fa7,2)=mu_f*vinf_Stokes*1./(2.*
696 particle_radius*(1.+phi_mu))*(-3.*phi_mu+pow(gravity_center_fa7(fa7,2)/
697 particle_radius,2)*(3.*phi_mu-4.))*fa7_surface(fa7);
698
699 for (int dim=0; dim<dimension; dim++)
700 {
702 total_friction_force_Stokes_th_(compo,dim)+=
703 friction_force_Stokes_th_fa7_(fa7,dim);
704 }
705 }
706 }
707 }
708}
709
710double Post_Processing_Hydrodynamic_Forces_Stokes::compute_dUdx_Stokes_th(int fa7, double x_fa7, double y_fa7, double z_fa7,
711 double r_fa7, double phi_mu, double particle_radius)
712{
713 double vinf_Stokes=get_vinf_Stokes();
714 double dUdx=(vinf_Stokes*(pow(x_fa7,2)*z_fa7/pow(r_fa7,3)*
715 ( -(2+3*phi_mu)/(1+phi_mu)*3*particle_radius/(pow(2*r_fa7,2)) +
716 phi_mu/(1+phi_mu)*9*pow(particle_radius,3)/(4*pow(r_fa7,4)) ) +
717 pow(x_fa7,2)/(pow(r_fa7,2)-
718 pow(z_fa7,2))*z_fa7/r_fa7*
719 ( (1-pow(z_fa7/r_fa7,2))*( (2+3*phi_mu)/
720 (1+phi_mu)*particle_radius/
721 (4*pow(r_fa7,2)) + phi_mu/(1+phi_mu)*
722 3*pow(particle_radius,3)/(4*pow(r_fa7,4)) )
723 + pow(z_fa7/r_fa7,2)*( (2+3*phi_mu)/(1+phi_mu)*
724 particle_radius/(4*pow(r_fa7,2))-
725 phi_mu/(1+phi_mu)*3*pow(particle_radius,3)/
726 (4*pow(r_fa7,4)) ) )
727 + pow(y_fa7,2)*z_fa7/(r_fa7*(pow(r_fa7,2)
728 -pow(z_fa7,2)))*((2+3*phi_mu)/(1+phi_mu)*
729 particle_radius/(pow(2*r_fa7,2))-
730 phi_mu/(1+phi_mu)*3*
731 pow(particle_radius,3)/(4*pow(r_fa7,4)))));
732 return dUdx;
733}
734double Post_Processing_Hydrodynamic_Forces_Stokes::compute_dUdz_Stokes_th(int fa7, double x_fa7, double y_fa7, double z_fa7,
735 double r_fa7, double phi_mu, double particle_radius)
736{
737 double vinf_Stokes=get_vinf_Stokes();
738 double dUdz=vinf_Stokes*(x_fa7/r_fa7*(pow(z_fa7/r_fa7,2)*
739 (-(2+3*phi_mu)/(1+phi_mu)*particle_radius/(2*pow(r_fa7,2))+phi_mu/
740 (1+phi_mu)*3*pow(particle_radius,3)/(2*pow(r_fa7,4)))
741 +(1-pow(z_fa7/r_fa7,2))*
742 ((2+3*phi_mu)/(1+phi_mu)*particle_radius/
743 (4*pow(r_fa7,2))-phi_mu/(1+phi_mu)*3*
744 pow(particle_radius,3)/(4*pow(r_fa7,4))))+
745 pow(z_fa7,2)*x_fa7/pow(r_fa7,3)*
746 phi_mu/(1+phi_mu)*3*pow(particle_radius,3)/
747 (2*pow(r_fa7,4)));
748 return dUdz;
749}
750
751double Post_Processing_Hydrodynamic_Forces_Stokes::compute_dVdz_Stokes_th(int fa7, double x_fa7, double y_fa7, double z_fa7,
752 double r_fa7, double phi_mu, double particle_radius)
753{
754 double vinf_Stokes=get_vinf_Stokes();
755 double dVdz=vinf_Stokes*(y_fa7/r_fa7*(pow(z_fa7/r_fa7,2)*
756 (-(2+3*phi_mu)/(1+phi_mu)*particle_radius/(2*pow(r_fa7,2))+phi_mu/
757 (1+phi_mu)*3*pow(particle_radius,3)/(2*pow(r_fa7,4)))
758 +(1-pow(z_fa7/r_fa7,2))*((2+3*phi_mu)/(1+phi_mu)*
759 particle_radius/(4*pow(r_fa7,2))-phi_mu/(1+phi_mu)*
760 3*pow(particle_radius,3)/(4*pow(r_fa7,4))))+
761 pow(z_fa7,2)*y_fa7/pow(r_fa7,3)*
762 phi_mu/(1+phi_mu)*3*pow(particle_radius,3)/(2*pow(r_fa7,4)));
763
764 return dVdz;
765}
766
767double Post_Processing_Hydrodynamic_Forces_Stokes::compute_dWdx_Stokes_th(int fa7, double x_fa7, double y_fa7, double z_fa7,
768 double r_fa7, double phi_mu, double particle_radius)
769{
770 double vinf_Stokes=get_vinf_Stokes();
771 double dWdx=vinf_Stokes*(pow(z_fa7,2)*x_fa7/pow(r_fa7,3)*
772 (-(2+3*phi_mu)/(1+phi_mu)*3*particle_radius/(pow(2*r_fa7,2))+
773 phi_mu/(1+phi_mu)*9*pow(particle_radius,3)/(4*pow(r_fa7,4)))-
774 x_fa7/r_fa7*((1-pow(z_fa7/r_fa7,2))*((2+3*phi_mu)/
775 (1+phi_mu)*particle_radius/pow(2*r_fa7,2)+
776 phi_mu/(1+phi_mu)*3*pow(particle_radius,3)/
777 (4*pow(r_fa7,4)))+pow(z_fa7/r_fa7,2)*
778 ((2+3*phi_mu)/(1+phi_mu)*particle_radius/pow(2*r_fa7,2)-
779 phi_mu/(1+phi_mu)*3*pow(particle_radius,3)/
780 (4*pow(r_fa7,4)))));
781
782 return dWdx;
783}
784
785double Post_Processing_Hydrodynamic_Forces_Stokes::compute_dWdy_Stokes_th(int fa7, double x_fa7, double y_fa7, double z_fa7,
786 double r_fa7, double phi_mu, double particle_radius)
787{
788 double vinf_Stokes=get_vinf_Stokes();
789 double dWdy=vinf_Stokes*(pow(z_fa7,2)*y_fa7/pow(r_fa7,3)*
790 (-(2+3*phi_mu)/(1+phi_mu)*3*particle_radius/(pow(2*r_fa7,2))+
791 phi_mu/(1+phi_mu)*9*pow(particle_radius,3)/(4*pow(r_fa7,4)))-
792 y_fa7/r_fa7*((1-pow(z_fa7/r_fa7,2))*((2+3*phi_mu)/
793 (1+phi_mu)*particle_radius/pow(2*r_fa7,2)+phi_mu/
794 (1+phi_mu)*3*pow(particle_radius,3)/(4*pow(r_fa7,4)))
795 +pow(z_fa7/r_fa7,2)*((2+3*phi_mu)/(1+phi_mu)*
796 particle_radius/pow(2*r_fa7,2)-phi_mu/(1+phi_mu)*
797 3*pow(particle_radius,3)/(4*pow(r_fa7,4)))));
798
799 return dWdy;
800}
801
802double Post_Processing_Hydrodynamic_Forces_Stokes::compute_dWdz_Stokes_th(int fa7, double x_fa7, double y_fa7, double z_fa7,
803 double r_fa7, double phi_mu, double particle_radius)
804{
805 double vinf_Stokes=get_vinf_Stokes();
806 double dWdz=vinf_Stokes*(z_fa7/r_fa7*(pow(z_fa7/r_fa7,2)*
807 (-(2+3*phi_mu)/(1+phi_mu)*particle_radius/(2*pow(r_fa7,2))+
808 phi_mu/(1+phi_mu)*3*pow(particle_radius,3)/(2*pow(r_fa7,4)))+
809 (1-pow(z_fa7/r_fa7,2))*((2+3*phi_mu)/(1+phi_mu)*
810 particle_radius/(pow(2*r_fa7,2))-phi_mu/(1+phi_mu)*
811 3*pow(particle_radius,3)/(4*pow(r_fa7,4))))-
812 z_fa7/r_fa7*(1-pow(z_fa7/r_fa7,2))*
813 phi_mu/(1+phi_mu)*3*pow(particle_radius,3)/(2*pow(r_fa7,4)));
814
815 return dWdz;
816}
817
819 double phi_mu, double particle_radius)
820{
821 double x_fa7_P1=coord_neighbor_fluid_fa7_gradU_1_(fa7,0);
822 double y_fa7_P1=coord_neighbor_fluid_fa7_gradU_1_(fa7,1);
823 double z_fa7_P1=coord_neighbor_fluid_fa7_gradU_1_(fa7,2);
824 double r_fa7_P1=sqrt(x_fa7_P1*x_fa7_P1+y_fa7_P1*y_fa7_P1+z_fa7_P1*z_fa7_P1);
825
826 dUdx_P1_Stokes_th_(fa7)=compute_dUdx_Stokes_th(fa7, x_fa7_P1, y_fa7_P1, z_fa7_P1,
827 r_fa7_P1, phi_mu, particle_radius);
828 dUdz_P1_Stokes_th_(fa7)=compute_dUdz_Stokes_th(fa7, x_fa7_P1, y_fa7_P1, z_fa7_P1,
829 r_fa7_P1, phi_mu, particle_radius);
830 dVdz_P1_Stokes_th_(fa7)=compute_dVdz_Stokes_th(fa7, x_fa7_P1, y_fa7_P1, z_fa7_P1,
831 r_fa7_P1, phi_mu, particle_radius);
832 dWdx_P1_Stokes_th_(fa7)=compute_dWdx_Stokes_th(fa7, x_fa7_P1, y_fa7_P1, z_fa7_P1,
833 r_fa7_P1, phi_mu, particle_radius);
834 dWdy_P1_Stokes_th_(fa7)=compute_dWdy_Stokes_th(fa7, x_fa7_P1, y_fa7_P1, z_fa7_P1,
835 r_fa7_P1, phi_mu, particle_radius);
836 dWdz_P1_Stokes_th_(fa7)=compute_dWdz_Stokes_th(fa7, x_fa7_P1, y_fa7_P1, z_fa7_P1,
837 r_fa7_P1, phi_mu, particle_radius);
838}
839
841 double phi_mu, double particle_radius)
842{
843 double x_fa7_P2=coord_neighbor_fluid_fa7_gradU_2_(fa7,0);
844 double y_fa7_P2=coord_neighbor_fluid_fa7_gradU_2_(fa7,1);
845 double z_fa7_P2=coord_neighbor_fluid_fa7_gradU_2_(fa7,2);
846 double r_fa7_P2=sqrt(x_fa7_P2*x_fa7_P2+y_fa7_P2*y_fa7_P2+z_fa7_P2*z_fa7_P2);
847
848 dUdx_P2_Stokes_th_(fa7)=compute_dUdx_Stokes_th(fa7, x_fa7_P2, y_fa7_P2, z_fa7_P2,
849 r_fa7_P2, phi_mu, particle_radius);
850 dUdz_P2_Stokes_th_(fa7)=compute_dUdz_Stokes_th(fa7, x_fa7_P2, y_fa7_P2, z_fa7_P2,
851 r_fa7_P2, phi_mu, particle_radius);
852 dVdz_P2_Stokes_th_(fa7)=compute_dVdz_Stokes_th(fa7, x_fa7_P2, y_fa7_P2, z_fa7_P2,
853 r_fa7_P2, phi_mu, particle_radius);
854 dWdx_P2_Stokes_th_(fa7)=compute_dWdx_Stokes_th(fa7, x_fa7_P2, y_fa7_P2, z_fa7_P2,
855 r_fa7_P2, phi_mu, particle_radius);
856 dWdy_P2_Stokes_th_(fa7)=compute_dWdy_Stokes_th(fa7, x_fa7_P2, y_fa7_P2, z_fa7_P2,
857 r_fa7_P2, phi_mu, particle_radius);
858 dWdz_P2_Stokes_th_(fa7)=compute_dWdz_Stokes_th(fa7, x_fa7_P2, y_fa7_P2, z_fa7_P2,
859 r_fa7_P2, phi_mu, particle_radius);
860}
861
863{
864 const Transport_Interfaces_FT_Disc& eq_transport = ptr_eq_transport_.valeur();
865 const Navier_Stokes_FT_Disc& eq_ns = ptr_eq_ns_.valeur();
866 const Maillage_FT_Disc& mesh = eq_transport.maillage_interface_pour_post();
867 const Fluide_Diphasique& two_phase_fluid = eq_ns.fluide_diphasique();
868 const int id_fluid_phase=two_phase_fluid.get_id_fluid_phase();
869 const Solid_Particle_base& solid_particle=ref_cast(Solid_Particle_base,
870 two_phase_fluid.fluide_phase(1-id_fluid_phase));
871 const double particle_radius = solid_particle.get_equivalent_radius(); // On ne se sert de cette fonction que lorsqu'il y a une seule particule dans le domaine
872 const double mu_f =two_phase_fluid.fluide_phase(id_fluid_phase).
873 viscosite_dynamique().valeurs()(0, 0);
874 const double mu_p = two_phase_fluid.fluide_phase(1-id_fluid_phase).
875 masse_volumique().valeurs()(0, 0);
876 const double phi_mu=mu_p/mu_f;
877 const double& vinf_Stokes=get_vinf_Stokes();
878
879 const DoubleTab& gravity_center_fa7=mesh.get_gravity_center_fa7();
880 double X_p=gravity_center_fa7(fa7,0);
881 double Y_p=gravity_center_fa7(fa7,1);
882 double Z_p=gravity_center_fa7(fa7,2);
883
884 sigma_xx_fa7_Stokes_th_(fa7)=(mu_f*vinf_Stokes/(particle_radius))*
885 (Z_p/(particle_radius*(1.+phi_mu)))*(pow(X_p/particle_radius,2)*
886 (Z_p*Z_p/(pow(particle_radius,2)*(1.-
887 pow(Z_p/particle_radius,2)))+3.*phi_mu-2.)+
888 (pow(Y_p/particle_radius,2)*(1.-
889 pow(Z_p/particle_radius,2))));
890 sigma_xy_fa7_Stokes_th_(fa7)=(mu_f*vinf_Stokes/(particle_radius))*
891 (Z_p/(particle_radius*(1.+phi_mu)))*X_p*Y_p/(particle_radius*
892 particle_radius)*(3.*phi_mu-3.);
893 sigma_xz_fa7_Stokes_th_(fa7)=(mu_f*vinf_Stokes/(particle_radius))*
894 X_p/(particle_radius*(1.+phi_mu))*(-3./2.*phi_mu*(1.-
895 pow(Z_p/particle_radius,2))+3.*pow(Z_p/particle_radius,2)*
896 (phi_mu/2.-1.));
897 sigma_yy_fa7_Stokes_th_(fa7)=(mu_f*vinf_Stokes/(particle_radius))*
898 (Z_p/(particle_radius*(1.+phi_mu)))*(Y_p*Y_p/pow(particle_radius,2)*
899 (3.*phi_mu-2.+(Z_p*Z_p/pow(particle_radius,2))/
900 (1.-Z_p*Z_p/pow(particle_radius,2)))+
901 X_p*X_p/(pow(particle_radius,2)*(1.-Z_p*Z_p/
902 pow(particle_radius,2))));
903 sigma_yz_fa7_Stokes_th_(fa7)=(mu_f*vinf_Stokes/(particle_radius))*
904 Y_p/(particle_radius*(1.+phi_mu))*(-3./2.*phi_mu*(1.-Z_p*
905 Z_p/pow(particle_radius,2))+3.*Z_p*Z_p/
906 pow(particle_radius,2)*(phi_mu/2.-1.));
907 sigma_zz_fa7_Stokes_th_(fa7)=(mu_f*vinf_Stokes/(particle_radius))*
908 (Z_p/(particle_radius*(1.+phi_mu)))*(-3.*phi_mu/2.*
909 (1.-Z_p*Z_p/pow(particle_radius,2))+1.-3.*
910 Z_p*Z_p/pow(particle_radius,2));
911}
912
914 const Maillage_FT_Disc& mesh,
915 const IntVect& compo_connexes_fa7,
916 const ArrOfDouble& fa7_surface,
917 const DoubleTab& tab_fa7_normal)
918{
919 const Transport_Interfaces_FT_Disc& eq_transport = ptr_eq_transport_.valeur();
920 const Navier_Stokes_FT_Disc& eq_ns = ptr_eq_ns_.valeur();
921 const Fluide_Diphasique& two_phase_fluid = eq_ns.fluide_diphasique();
922 const Domaine_VDF& domain_vdf = ref_cast(Domaine_VDF, eq_ns.domaine_dis());
923 const Domaine& domain = domain_vdf.domaine();
924 const int id_fluid_phase=two_phase_fluid.get_id_fluid_phase();
925 const Solid_Particle_base& solid_particle=ref_cast(Solid_Particle_base,
926 two_phase_fluid.fluide_phase(1-id_fluid_phase));
927 const double particle_radius = solid_particle.get_equivalent_radius(); // On ne se sert de cette fonction que lorsqu'il y a une seule particule dans le domaine
928 const double mu_f =two_phase_fluid.fluide_phase(id_fluid_phase).
929 viscosite_dynamique().valeurs()(0, 0);
930 const double mu_p = two_phase_fluid.fluide_phase(1-id_fluid_phase).
931 masse_volumique().valeurs()(0, 0);
932 const double phi_mu=mu_p/mu_f;
933 const double& vinf_Stokes=get_vinf_Stokes();
934
935 const DoubleTab& gravity_center_fa7=mesh.get_gravity_center_fa7();
936 int interp_U_P1_ok=0;
937 int interp_U_P2_ok=0;
938 U_P1_.resize(nb_fa7, dimension);
939 U_P2_.resize(nb_fa7, dimension);
940
941 DoubleTab U_P1_spherique(nb_fa7, dimension);
942 DoubleTab U_P2_spherique(nb_fa7, dimension);
943 DoubleTab U_cg_spherique(nb_fa7, dimension);
944 DoubleTab Urr(nb_fa7);
945 DoubleTab Uthetar(nb_fa7);
946 DoubleTab Uphir(nb_fa7);
947
948 U_P1_=-1e15;
949 U_P2_=-1e30;
950 U_P1_spherique=-1e15;
951 U_P2_spherique=-1e30;
952 U_cg_spherique=-1e20;
953 Urr=1e8;
954 Uthetar=1e12;
955 Uphir=1e15;
956 const DoubleTab& positions_compo=eq_transport.get_particles_position();
957 double theta=0;
958 double phi=0;
959 double distance_au_cg=0;
960 Navier_Stokes_FT_Disc& eq_ns_non_const = ptr_eq_ns_.valeur();
961 DoubleTab& velocity_Stokes_th=eq_ns_non_const.get_set_velocity_field_Stokes_th();
963 {
964 // 1. On calcule (interpolation trilineaire) la vitesse en P1 et P2 en coord cartesiennes
965 interp_U_P1_ok=trilinear_interpolation_face(velocity_Stokes_th,
967 interp_U_P2_ok=trilinear_interpolation_face(velocity_Stokes_th,
969 }
970 if ( interp_U_P1_ok && interp_U_P2_ok )
971 {
972 // 2. On passe en coordonnees spheriques
973 for (int fa7=0; fa7<nb_fa7; fa7++)
974 {
975 int compo=compo_connexes_fa7(fa7);
976 if (!mesh.facette_virtuelle(fa7))
977 {
978 DoubleVect distance_cg_vect(dimension);
979 for (int i=0; i<dimension; i++)
980 {
981 distance_cg_vect(i)=coord_neighbor_fluid_fa7_gradU_1_(fa7,i)-
982 positions_compo(compo,i);
983 }
984 distance_au_cg=sqrt(local_carre_norme_vect(distance_cg_vect));
985
986 if (fabs((coord_neighbor_fluid_fa7_gradU_1_(fa7,2)-positions_compo(compo,2))/
987 distance_au_cg)<=1)
988 {
989 theta=acos((coord_neighbor_fluid_fa7_gradU_1_(fa7,2)-
990 positions_compo(compo,2))/distance_au_cg);
991 }
992 else if ((coord_neighbor_fluid_fa7_gradU_1_(fa7,2)-positions_compo(compo,2))/
993 distance_au_cg>1)
994 {
995 theta=0;
996 }
997 else if ((coord_neighbor_fluid_fa7_gradU_1_(fa7,2)-positions_compo(compo,2))/
998 distance_au_cg<-1)
999 {
1000 theta=M_PI;
1001 }
1002
1003 if ((coord_neighbor_fluid_fa7_gradU_1_(fa7,0)-positions_compo(compo,0))>0 &&
1004 (coord_neighbor_fluid_fa7_gradU_1_(fa7,1)-positions_compo(compo,1))>=0)
1005 {
1006 phi=atan((coord_neighbor_fluid_fa7_gradU_1_(fa7,1)-
1007 positions_compo(compo,1))/(coord_neighbor_fluid_fa7_gradU_1_(fa7,0)
1008 -positions_compo(compo,0)));
1009 }
1010 else if ((coord_neighbor_fluid_fa7_gradU_1_(fa7,0)-positions_compo(compo,0))>0
1011 && (coord_neighbor_fluid_fa7_gradU_1_(fa7,1)-positions_compo(compo,1))<0)
1012 {
1013 phi=atan((coord_neighbor_fluid_fa7_gradU_1_(fa7,1)-
1014 positions_compo(compo,1))/(coord_neighbor_fluid_fa7_gradU_1_(fa7,0)
1015 -positions_compo(compo,0)))+2*M_PI;
1016 }
1017 else if ((coord_neighbor_fluid_fa7_gradU_1_(fa7,0)-positions_compo(compo,0))<0)
1018 {
1019 phi=atan((coord_neighbor_fluid_fa7_gradU_1_(fa7,1)-
1020 positions_compo(compo,1))/(coord_neighbor_fluid_fa7_gradU_1_(fa7,0)
1021 -positions_compo(compo,0)))+M_PI;
1022 }
1023 else if ((coord_neighbor_fluid_fa7_gradU_1_(fa7,0)-positions_compo(compo,0))==0
1024 && (coord_neighbor_fluid_fa7_gradU_1_(fa7,1)-positions_compo(compo,1))>0)
1025 {
1026 phi=M_PI/2.;
1027 }
1028 else if ((coord_neighbor_fluid_fa7_gradU_1_(fa7,0)-positions_compo(compo,0))==0
1029 && (coord_neighbor_fluid_fa7_gradU_1_(fa7,1)-positions_compo(compo,1))<0)
1030 {
1031 phi=3.*M_PI/2.;
1032 }
1033
1034 U_P1_spherique(fa7,0)=sin(theta)*cos(phi)*U_P1_(fa7,0)+sin(theta)*sin(phi)*
1035 U_P1_(fa7,1)+cos(theta)*U_P1_(fa7,2);
1036 U_P1_spherique(fa7,1)=cos(theta)*cos(phi)*U_P1_(fa7,0)+cos(theta)*sin(phi)*
1037 U_P1_(fa7,1)-sin(theta)*U_P1_(fa7,2);
1038 U_P1_spherique(fa7,2)=-sin(phi)*U_P1_(fa7,0)+cos(phi)*U_P1_(fa7,1);
1039
1040 U_P2_spherique(fa7,0)=sin(theta)*cos(phi)*U_P2_(fa7,0)+sin(theta)*sin(phi)*
1041 U_P2_(fa7,1)+cos(theta)*U_P2_(fa7,2);
1042 U_P2_spherique(fa7,1)=cos(theta)*cos(phi)*U_P2_(fa7,0)+cos(theta)*sin(phi)*
1043 U_P2_(fa7,1)-sin(theta)*U_P2_(fa7,2);
1044 U_P2_spherique(fa7,2)=-sin(phi)*U_P2_(fa7,0)+cos(phi)*U_P2_(fa7,1);
1045
1046 U_cg_spherique(fa7,0)=0;//sin(theta)*cos(phi)*vitesses_compo(compo,0)+sin(theta)*sin(phi)*vitesses_compo(compo,1)+cos(theta)*vitesses_compo(compo,2);
1047 U_cg_spherique(fa7,1)=0;//cos(theta)*cos(phi)*vitesses_compo(compo,0)+cos(theta)*sin(phi)*vitesses_compo(compo,1)-sin(theta)*vitesses_compo(compo,2);
1048 U_cg_spherique(fa7,2)=0;//-sin(phi)*vitesses_compo(compo,0)+cos(phi)*vitesses_compo(compo,1);
1049
1050 // On recalcule delta --> epsilon
1051 int elem_diph=domain.chercher_elements(gravity_center_fa7(fa7,0),
1052 gravity_center_fa7(fa7,1),
1053 gravity_center_fa7(fa7,2));
1054 DoubleVect delta_i(dimension);
1055 delta_i(0) = fabs(domain_vdf.dist_elem(elem_diph, domain_vdf.face_voisins(
1056 domain_vdf.elem_faces(elem_diph, 0+dimension),1), 0));
1057 delta_i(1) = fabs(domain_vdf.dist_elem(elem_diph, domain_vdf.face_voisins(
1058 domain_vdf.elem_faces(elem_diph, 1+dimension),1), 1));
1059
1060 if (tab_fa7_normal(fa7,2)>0)
1061 {
1062 delta_i(2) = fabs(domain_vdf.dist_elem(elem_diph, domain_vdf.face_voisins(
1063 domain_vdf.elem_faces(elem_diph, 2+dimension),1), 2));
1064 }
1065 else
1066 delta_i(2) = fabs(domain_vdf.dist_elem(elem_diph, domain_vdf.face_voisins(
1067 domain_vdf.elem_faces(elem_diph, 2),0), 2));
1068 double epsilon=0;
1069 for (int dim=0; dim<dimension; dim++)
1070 epsilon+= fabs(delta_i(dim)*fabs(tab_fa7_normal(fa7,dim))); // la distance d'interpolation varie en fonction du raffinement du maillage
1071
1072 // On calcule les composantes de la force de frottements en coord spherique (apres simplifications) : ff=mu*(2*Urr, Uthetar, Uphir)
1073 Urr(fa7)=(-U_P2_spherique(fa7,0)+4.*U_P1_spherique(fa7,0)-
1074 3.*U_cg_spherique(fa7,0))/(2.*epsilon);
1075 Uthetar(fa7)=(-U_P2_spherique(fa7,1)+4.*U_P1_spherique(fa7,1)-
1076 3.*U_cg_spherique(fa7,1))/(2.*epsilon);
1077 Uphir(fa7)=(-U_P2_spherique(fa7,2)+4.*U_P1_spherique(fa7,2)-
1078 3.*U_cg_spherique(fa7,2))/(2.*epsilon);
1079
1080 friction_force_fa7_(fa7,0)=mu_f*fa7_surface(fa7)*(2.*sin(theta)*
1081 cos(phi)*Urr(fa7)+cos(theta)*cos(phi)*Uthetar(fa7)-sin(phi)*Uphir(fa7));
1082 friction_force_fa7_(fa7,1)=mu_f*fa7_surface(fa7)*(2.*sin(theta)*
1083 sin(phi)*Urr(fa7)+cos(theta)*sin(phi)*Uthetar(fa7)+cos(phi)*Uphir(fa7));
1084 friction_force_fa7_(fa7,2)=mu_f*fa7_surface(fa7)*(2.*cos(theta)*
1085 Urr(fa7)-sin(theta)*Uthetar(fa7));
1086
1087 friction_force_Stokes_th_fa7_(fa7,0)=-mu_f*vinf_Stokes*gravity_center_fa7(fa7,0)*
1088 gravity_center_fa7(fa7,2)/(pow(particle_radius,3))*(9.*phi_mu+8.)/
1089 (1.+phi_mu)*fa7_surface(fa7);
1090 friction_force_Stokes_th_fa7_(fa7,1)=-mu_f*vinf_Stokes*gravity_center_fa7(fa7,1)*
1091 gravity_center_fa7(fa7,2)/(pow(particle_radius,3))*(9.*phi_mu+8.)/
1092 (1.+phi_mu)*fa7_surface(fa7);
1093 friction_force_Stokes_th_fa7_(fa7,2)=mu_f*vinf_Stokes*1./(2.*particle_radius*(1.+phi_mu))*
1094 (-3.*phi_mu+pow(gravity_center_fa7(fa7,2)/particle_radius,2)*(3.*phi_mu-4.))*fa7_surface(fa7);
1095
1096 for (int dim=0; dim<dimension; dim++)
1097 {
1098 total_friction_force_(compo,dim)+=friction_force_fa7_(fa7,dim);
1099 total_friction_force_Stokes_th_(compo,dim)+=
1100 friction_force_Stokes_th_fa7_(fa7,dim);
1101 }
1102 }
1103 }
1104 }
1105}
DoubleTab & valeurs() override
Surcharge Champ_base::valeurs() Renvoie le tableau des valeurs.
SmallArrOfTID_t & chercher_elements(const DoubleTab &pos, SmallArrOfTID_t &elem, int reel=0) const
Recherche des elements contenant les points dont les coordonnees sont specifiees.
Definition Domaine.cpp:405
class Domaine_VDF
Definition Domaine_VDF.h:64
int orientation(int) const override
inline DoubleVect& Domaine_VDF::porosite_face() {
double dist_elem(int, int, int) const
double xv(int num_face, int k) const
Definition Domaine_VF.h:76
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
Definition Domaine_VF.h:543
double xp(int num_elem, int k) const
Definition Domaine_VF.h:77
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
Definition Domaine_VF.h:418
const Domaine & domaine() const
Domaine_dis_base & domaine_dis()
Renvoie le domaine discretise associe a l'equation.
const Fluide_Incompressible & fluide_phase(int la_phase) const
const int & get_id_fluid_phase() const
: class Maillage_FT_Disc Cette classe decrit un maillage:
int nb_facettes() const
renvoie le nombre de facettes (reelles et virtuelles) (egal a facettes().
int facette_virtuelle(int i) const
Renvoie 0 si la facette m'appartient, 1 sinon.
virtual const DoubleTab & get_update_normale_facettes() const
Calcule la grandeur demandee, stocke le resultat dans un tableau interne a la classe et renvoie le re...
const DoubleTab & get_gravity_center_fa7() const
virtual const ArrOfDouble & get_update_surface_facettes() const
Calcule la grandeur demandee, stocke le resultat dans un tableau interne a la classe et renvoie le re...
virtual const Champ_Don_base & gravite() const
Renvoie la gravite du milieu si elle a ete associe provoque une erreur sinon.
DoubleTab & get_set_velocity_field_Stokes_th()
const Milieu_base & milieu() const override
virtual const Fluide_Diphasique & fluide_diphasique() const
const IntTab & get_particles_eulerian_id_number() const
DoubleTab & get_set_pressure_field_Stokes_th()
virtual void set_param(Param &) const
Definition Objet_U.h:135
static int dimension
Definition Objet_U.h:99
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Helper class to factorize the readOn method of Objet_U classes.
Definition Param.h:112
void compute_UP1_UP2_Stokes(int fa7, double vinf_Stokes, double particle_radius, double phi_mu)
void compute_friction_force_complet_tensor(int nb_fa7, const Maillage_FT_Disc &mesh, const IntVect &compo_connexes_fa7, const ArrOfDouble &fa7_surface, const DoubleTab &tab_fa7_normal) override
double compute_dWdy_Stokes_th(int fa7, double x_fa7, double y_fa7, double z_fa7, double r_fa7, double phi_mu, double particle_radius)
double compute_Stokes_Uy_fluid(double x, double y, double z, double vinf_Stokes, double particle_radius, double phi_mu)
double compute_dWdx_Stokes_th(int fa7, double x_fa7, double y_fa7, double z_fa7, double r_fa7, double phi_mu, double particle_radius)
double compute_dVdz_Stokes_th(int fa7, double x_fa7, double y_fa7, double z_fa7, double r_fa7, double phi_mu, double particle_radius)
double compute_dUdx_Stokes_th(int fa7, double x_fa7, double y_fa7, double z_fa7, double r_fa7, double phi_mu, double particle_radius)
void fill_gradU_P1_Stokes_th(int fa7, double phi_mu, double particle_radius)
void compute_friction_force_projected_tensor(int nb_fa7, const Maillage_FT_Disc &mesh, const IntVect &compo_connexes_fa7, const ArrOfDouble &fa7_surface, const DoubleTab &tab_fa7_normal) override
double compute_Stokes_Ux_fluid(double x, double y, double z, double vinf_Stokes, double particle_radius, double phi_mu)
void set_param(const Post_Processing_Hydrodynamic_Forces &post_process_hydro_forces_)
double compute_dWdz_Stokes_th(int fa7, double x_fa7, double y_fa7, double z_fa7, double r_fa7, double phi_mu, double particle_radius)
double compute_dUdz_Stokes_th(int fa7, double x_fa7, double y_fa7, double z_fa7, double r_fa7, double phi_mu, double particle_radius)
void fill_gradU_P2_Stokes_th(int fa7, double phi_mu, double particle_radius)
void compute_neighbors_coordinates_fluid_fa7(const int nb_fa7, const int is_discr_elem_diph, const DoubleTab &gravity_center_fa7, const Maillage_FT_Disc &mesh, const DoubleTab &tab_fa7_normal, const IntTab &particles_eulerian_id_number) override
void compute_pressure_force_trilinear_linear(int nb_fa7, const Maillage_FT_Disc &mesh, Convection_Diffusion_Temperature_FT_Disc::Thermal_correction_discretization_method dummy_value, const IntVect &compo_connexes_fa7, const ArrOfDouble &fa7_surface, const DoubleTab &tab_fa7_normal) override
double compute_Stokes_Uz_fluid(double x, double y, double z, double vinf_Stokes, double particle_radius, double phi_mu)
int trilinear_interpolation_elem(const DoubleTab &valeurs_champ, DoubleTab &coord, DoubleTab &resu)
int trilinear_interpolation_gradU_elem(const DoubleTab &valeurs_champ, DoubleTab &coord, DoubleTab &resu)
void fill_sigma(int fa7, Matrice_Dense stress_tensor)
const Method_pressure_force_computation & get_method_pressure_force_computation() const
int trilinear_interpolation_face(const DoubleTab &valeurs_champ, DoubleTab &coord, DoubleTab &resu)
Method_pressure_force_computation method_pressure_force_computation_
const Location_stress_tensor & get_location_stress_tensor() const
int trilinear_interpolation_gradU_face(const DoubleTab &valeurs_champ, DoubleTab &coord, DoubleTab &resu)
Method_friction_force_computation method_friction_force_computation_
static void mp_sum_for_each_item(TRUSTArray< _TYPE_ > &x, int n=-1)
Definition Process.cpp:193
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Definition Process.cpp:455
: class Solid_Particle
const double & get_equivalent_radius() const
Classe de base des flux de sortie.
Definition Sortie.h:52
_SIZE_ dimension_tot(int) const override
Definition TRUSTTab.tpp:160
virtual void echange_espace_virtuel(IsExchangeBlocking exchange_type=IsExchangeBlocking::DefaultBlocking, const std::string kernel_name="noname")
virtual const Maillage_FT_Disc & maillage_interface_pour_post() const
Renvoie le maillage stocke specialement pour le postraitement (si on veut postraiter un etat intermed...
const DoubleTab & get_particles_position() const