70 int methode_explicite,
71 const IJK_Field_double& old_indicatrice_ns,
72 const IJK_Field_double& next_indicatrice_ns,
73 const IJK_Field_double& surface_interface_ns_old,
74 const IJK_Field_double& surface_interface_ns_next,
75 const IJK_Field_vector3_double& normal_of_interf_ns_old,
76 const IJK_Field_vector3_double& normal_of_interf_ns_next,
77 DoubleTabFT_cut_cell_vector3& normale_deplacement_interface,
78 DoubleTabFT_cut_cell_scalar& surface_efficace_interface,
79 DoubleTabFT_cut_cell_scalar& surface_efficace_interface_initial)
82 for (
int n = 0; n < cut_cell_disc.
get_n_tot(); n++)
84 Int3 ijk = cut_cell_disc.
get_ijk(n);
92 normale_deplacement_interface(n,0) = 0.;
93 normale_deplacement_interface(n,1) = 0.;
94 normale_deplacement_interface(n,2) = 0.;
95 surface_efficace_interface(n) = 0.;
96 surface_efficace_interface_initial(n) = 0.;
100 if (methode_explicite)
104 surface_efficace_interface(n) = surface_interface_ns_old(i, j, k);
105 for (
int dir = 0 ; dir < 3 ; dir++)
107 normale_deplacement_interface(n,dir) = normal_of_interf_ns_old[dir](i, j, k);
112 surface_efficace_interface(n) = surface_interface_ns_next(i, j, k);
113 for (
int dir = 0 ; dir < 3 ; dir++)
115 normale_deplacement_interface(n,dir) = normal_of_interf_ns_next[dir](i, j, k);
120 surface_efficace_interface(n) = surface_interface_ns_old(i, j, k);
121 for (
int dir = 0 ; dir < 3 ; dir++)
123 normale_deplacement_interface(n,dir) = normal_of_interf_ns_old[dir](i, j, k);
131 surface_efficace_interface(n) = (surface_interface_ns_old(i, j, k) + 3*surface_interface_ns_next(i, j, k)) * 0.25;
132 for (
int dir = 0 ; dir < 3 ; dir++)
134 normale_deplacement_interface(n,dir) = normal_of_interf_ns_old[dir](i, j, k);
139 surface_efficace_interface(n) = (3*surface_interface_ns_old(i, j, k) + surface_interface_ns_next(i, j, k)) * 0.25;
140 for (
int dir = 0 ; dir < 3 ; dir++)
142 normale_deplacement_interface(n,dir) = normal_of_interf_ns_next[dir](i, j, k);
147 surface_efficace_interface(n) = (surface_interface_ns_old(i, j, k) + surface_interface_ns_next(i, j, k)) * 0.5;
148 for (
int dir = 0 ; dir < 3 ; dir++)
150 normale_deplacement_interface(n,dir) = (normal_of_interf_ns_old[dir](i, j, k) + normal_of_interf_ns_next[dir](i, j, k)) * 0.5;
155 double norm_normale = sqrt(normale_deplacement_interface(n,0)*normale_deplacement_interface(n,0) + normale_deplacement_interface(n,1)*normale_deplacement_interface(n,1) + normale_deplacement_interface(n,2)*normale_deplacement_interface(n,2));
156 normale_deplacement_interface(n,0) /= norm_normale;
157 normale_deplacement_interface(n,1) /= norm_normale;
158 normale_deplacement_interface(n,2) /= norm_normale;
160 surface_efficace_interface_initial(n) = surface_efficace_interface(n);
166 const IJK_Field_vector3_double& velocity,
167 const IJK_Field_double& old_indicatrice_ns,
168 const IJK_Field_double& next_indicatrice_ns,
169 const IJK_Field_vector3_double& barycentre_phase1_ns_old,
170 const IJK_Field_vector3_double& barycentre_phase1_ns_next,
171 DoubleTabFT_cut_cell_vector3& coord_deplacement_interface,
172 DoubleTabFT_cut_cell_vector3& vitesse_deplacement_interface)
180 for (
int n = 0; n < cut_cell_disc.
get_n_loc(); n++)
182 Int3 ijk = cut_cell_disc.
get_ijk(n);
187 for (
int dir = 0; dir < 3; dir++)
189 double delta_I = next_indicatrice_ns(i,j,k) - old_indicatrice_ns(i,j,k);
191 double bary_depl_interf;
194 bary_depl_interf = barycentre_phase1_ns_next[dir](i,j,k);
198 bary_depl_interf = (next_indicatrice_ns(i,j,k)*barycentre_phase1_ns_next[dir](i,j,k) - old_indicatrice_ns(i,j,k)*barycentre_phase1_ns_old[dir](i,j,k))/delta_I;
201 if (bary_depl_interf <= 0)
203 bary_depl_interf = 1e-12;
205 else if (bary_depl_interf > 1)
207 bary_depl_interf = 1 - 1e-12;
210 assert((bary_depl_interf >= 0) && (bary_depl_interf <= 1));
213 const int i_dir = select_dir(dir, i, j, k);
215 const double origin_dir = geom.
get_origin(dir);
217 const double coord_dir = origin_dir + (i_dir + offset_dir + bary_depl_interf) * delta_dir;
219 coord_deplacement_interface(n, dir) = coord_dir;
224 ArrOfDouble vinterp_component(cut_cell_disc.
get_n_loc());
225 for (
int dir = 0; dir < 3; dir++)
227 ijk_interpolate_skip_unknown_points(velocity[dir], coord_deplacement_interface, vinterp_component, 1.e5 );
228 for (
int i = 0; i < cut_cell_disc.
get_n_loc(); i++)
230 vitesse_deplacement_interface(i, dir) = vinterp_component[i];
238 const IJK_Field_vector3_double& velocity,
239 const IJK_Field_double& old_indicatrice_ns,
240 const IJK_Field_double& next_indicatrice_ns,
241 const DoubleTabFT_cut_cell_vector3& vitesse_deplacement_interface,
242 const DoubleTabFT_cut_cell_vector3& normale_deplacement_interface,
243 DoubleTabFT_cut_cell_scalar& surface_efficace_interface)
245 statistics().create_custom_counter(
"cut_cell: calcul des surfaces efficaces interface",2,
"IJK");
246 statistics().begin_count(
"cut_cell: calcul des surfaces efficaces interface",statistics().get_last_opened_counter_level()+1);
254 const ArrOfDouble& delta_z_all = geom.
get_delta(DIRECTION_K);
257 for (
int n = 0; n < cut_cell_disc.
get_n_loc(); n++)
259 Int3 ijk = cut_cell_disc.
get_ijk(n);
264 const double delta_z = delta_z_all[k + offset];
265 const double volume = delta_x * delta_y * delta_z;
267 const double vitesse_interface = -vitesse_deplacement_interface(n,0)*normale_deplacement_interface(n,0) - vitesse_deplacement_interface(n,1)*normale_deplacement_interface(n,1) - vitesse_deplacement_interface(n,2)*normale_deplacement_interface(n,2);
268 const double surface_interface = surface_efficace_interface(n);
270 double delta_volume_cible = volume * (next_indicatrice_ns(i, j, k) - old_indicatrice_ns(i, j, k));
271 double delta_volume_interface = vitesse_interface * surface_interface * timestep;
273 double erreur_relative = delta_volume_cible == 0. ? delta_volume_interface/volume : std::fabs((delta_volume_interface - delta_volume_cible)/delta_volume_cible);
275 if (erreur_relative == 0)
280 surface_efficace_interface(n) = delta_volume_cible/(vitesse_interface * timestep);
285 statistics().end_count(
"cut_cell: calcul des surfaces efficaces interface");
290 int methode_explicite,
291 const IJK_Field_vector3_double& old_indicatrice_surfacique_face_ns,
292 const IJK_Field_vector3_double& next_indicatrice_surfacique_face_ns,
293 DoubleTabFT_cut_cell_vector3& indicatrice_surfacique_efficace_face,
294 DoubleTabFT_cut_cell_vector3& indicatrice_surfacique_efficace_face_initial)
296 if (methode_explicite)
299 for (
int n = 0; n < cut_cell_disc.
get_n_tot(); n++)
301 Int3 ijk = cut_cell_disc.
get_ijk(n);
306 for (
int dir = 0; dir < 3; dir++)
308 if ((old_indicatrice_surfacique_face_ns[dir](i, j, k) == 1) && (next_indicatrice_surfacique_face_ns[dir](i, j, k) == 0))
310 indicatrice_surfacique_efficace_face(n, dir) = .5;
312 else if ((old_indicatrice_surfacique_face_ns[dir](i, j, k) == 0) && (next_indicatrice_surfacique_face_ns[dir](i, j, k) == 1))
314 indicatrice_surfacique_efficace_face(n, dir) = .5;
316 else if (
IJK_Interfaces::devient_pure(old_indicatrice_surfacique_face_ns[dir](i, j, k), next_indicatrice_surfacique_face_ns[dir](i, j, k)))
318 indicatrice_surfacique_efficace_face(n, dir) = old_indicatrice_surfacique_face_ns[dir](i, j, k);
322 indicatrice_surfacique_efficace_face(n, dir) = next_indicatrice_surfacique_face_ns[dir](i, j, k);
326 indicatrice_surfacique_efficace_face(n, dir) = old_indicatrice_surfacique_face_ns[dir](i, j, k);
328 indicatrice_surfacique_efficace_face_initial(n, dir) = indicatrice_surfacique_efficace_face(n, dir);
335 for (
int n = 0; n < cut_cell_disc.
get_n_tot(); n++)
337 Int3 ijk = cut_cell_disc.
get_ijk(n);
342 for (
int dir = 0; dir < 3; dir++)
346 indicatrice_surfacique_efficace_face(n, dir) = (old_indicatrice_surfacique_face_ns[dir](i, j, k) + 3*next_indicatrice_surfacique_face_ns[dir](i, j, k)) * 0.25;
350 indicatrice_surfacique_efficace_face(n, dir) = (3*old_indicatrice_surfacique_face_ns[dir](i, j, k) + next_indicatrice_surfacique_face_ns[dir](i, j, k)) * 0.25;
354 indicatrice_surfacique_efficace_face(n, dir) = (old_indicatrice_surfacique_face_ns[dir](i, j, k) + next_indicatrice_surfacique_face_ns[dir](i, j, k)) * 0.5;
356 indicatrice_surfacique_efficace_face_initial(n, dir) = indicatrice_surfacique_efficace_face(n, dir);
364 int methode_explicite,
365 const IJK_Field_vector3_double& old_indicatrice_surfacique_face_ns,
366 const IJK_Field_vector3_double& next_indicatrice_surfacique_face_ns,
367 IJK_Field_vector3_double& indicatrice_surfacique_efficace_face,
368 IJK_Field_vector3_double& indicatrice_surfacique_efficace_face_initial)
370 if (methode_explicite)
372 for (
int dir = 0; dir < 3; dir++)
374 const int ni = indicatrice_surfacique_efficace_face[dir].ni();
375 const int nj = indicatrice_surfacique_efficace_face[dir].nj();
376 const int nk = indicatrice_surfacique_efficace_face[dir].nk();
377 const int ghost = indicatrice_surfacique_efficace_face[dir].ghost();
379 for (
int k = -ghost; k < nk+ghost; k++)
381 for (
int j = -ghost; j < nj+ghost; j++)
383 for (
int i = -ghost; i < ni+ghost; i++)
385 if ((old_indicatrice_surfacique_face_ns[dir](i, j, k) == 1) && (next_indicatrice_surfacique_face_ns[dir](i, j, k) == 0))
387 indicatrice_surfacique_efficace_face[dir](i, j, k) = .5;
389 else if ((old_indicatrice_surfacique_face_ns[dir](i, j, k) == 0) && (next_indicatrice_surfacique_face_ns[dir](i, j, k) == 1))
391 indicatrice_surfacique_efficace_face[dir](i, j, k) = .5;
393 else if (
IJK_Interfaces::devient_pure(old_indicatrice_surfacique_face_ns[dir](i, j, k), next_indicatrice_surfacique_face_ns[dir](i, j, k)))
395 indicatrice_surfacique_efficace_face[dir](i, j, k) = old_indicatrice_surfacique_face_ns[dir](i, j, k);
399 indicatrice_surfacique_efficace_face[dir](i, j, k) = next_indicatrice_surfacique_face_ns[dir](i, j, k);
403 indicatrice_surfacique_efficace_face[dir](i, j, k) = old_indicatrice_surfacique_face_ns[dir](i, j, k);
405 indicatrice_surfacique_efficace_face_initial[dir](i, j, k) = indicatrice_surfacique_efficace_face[dir](i, j, k);
413 for (
int dir = 0; dir < 3; dir++)
415 const int ni = indicatrice_surfacique_efficace_face[dir].ni();
416 const int nj = indicatrice_surfacique_efficace_face[dir].nj();
417 const int nk = indicatrice_surfacique_efficace_face[dir].nk();
418 const int ghost = indicatrice_surfacique_efficace_face[dir].ghost();
420 for (
int k = -ghost; k < nk+ghost; k++)
422 for (
int j = -ghost; j < nj+ghost; j++)
424 for (
int i = -ghost; i < ni+ghost; i++)
428 indicatrice_surfacique_efficace_face[dir](i, j, k) = (old_indicatrice_surfacique_face_ns[dir](i, j, k) + 3*next_indicatrice_surfacique_face_ns[dir](i, j, k)) * 0.25;
432 indicatrice_surfacique_efficace_face[dir](i, j, k) = (3*old_indicatrice_surfacique_face_ns[dir](i, j, k) + next_indicatrice_surfacique_face_ns[dir](i, j, k)) * 0.25;
436 indicatrice_surfacique_efficace_face[dir](i, j, k) = (old_indicatrice_surfacique_face_ns[dir](i, j, k) + next_indicatrice_surfacique_face_ns[dir](i, j, k)) * 0.5;
438 indicatrice_surfacique_efficace_face_initial[dir](i, j, k) = indicatrice_surfacique_efficace_face[dir](i, j, k);
448 int verbosite_surface_efficace_face,
450 const Cut_field_vector3_double& velocity,
451 int& iteration_solver_surface_efficace_face,
452 const IJK_Field_double& old_indicatrice_ns,
453 const IJK_Field_double& next_indicatrice_ns,
454 const IJK_Field_vector3_double& old_indicatrice_surfacique_face_ns,
455 const IJK_Field_vector3_double& next_indicatrice_surfacique_face_ns,
456 DoubleTabFT_cut_cell_vector3& indicatrice_surfacique_efficace_face,
457 const DoubleTabFT_cut_cell_vector3& indicatrice_surfacique_efficace_face_initial,
458 DoubleTabFT_cut_cell_vector6& indicatrice_surfacique_efficace_face_correction,
459 DoubleTabFT_cut_cell_scalar& indicatrice_surfacique_efficace_face_absolute_error)
461 statistics().create_custom_counter(
"cut_cell: calcul des surfaces efficaces",2,
"IJK");
462 statistics().begin_count(
"cut_cell: calcul des surfaces efficaces",statistics().get_last_opened_counter_level()+1);
468 const ArrOfDouble& delta_z_all = geom.
get_delta(DIRECTION_K);
470 for (
int n = 0; n < cut_cell_disc.
get_n_loc(); n++)
472 indicatrice_surfacique_efficace_face_absolute_error(n) = 0.;
476 const int maximum_iteration = 499;
477 const int iteration_impression_intermediaire = 600;
478 int solution_not_found = 0;
481 iteration_solver_surface_efficace_face += 1;
482 solution_not_found = 0;
484 int solution_locally_not_found = 0;
487 for (
int n = 0; n < cut_cell_disc.
get_n_loc(); n++)
489 Int3 ijk = cut_cell_disc.
get_ijk(n);
494 for (
int num_face = 0; num_face < 6; num_face++)
496 int dir = num_face%3;
497 int decalage = num_face/3;
499 int di = decalage*(dir == 0);
500 int dj = decalage*(dir == 1);
501 int dk = decalage*(dir == 2);
503 int n_face = cut_cell_disc.
get_n_face(num_face, n, i, j, k);
506 indicatrice_surfacique_efficace_face_correction(n, num_face) = indicatrice_surfacique_efficace_face(n_face, dir);
510 assert((next_indicatrice_ns(i+di,j+dj,k+dk) == 0) || (next_indicatrice_ns(i+di,j+dj,k+dk) == 1));
511 indicatrice_surfacique_efficace_face_correction(n, num_face) = next_indicatrice_ns(i+di,j+dj,k+dk);
522 for (
int n = 0; n < cut_cell_disc.
get_n_loc(); n++)
524 Int3 ijk = cut_cell_disc.
get_ijk(n);
529 const double delta_z = delta_z_all[k + offset];
530 const double volume = delta_x * delta_y * delta_z;
532 const double fx = delta_y * delta_z * timestep;
533 const double fy = delta_x * delta_z * timestep;
534 const double fz = delta_x * delta_y * timestep;
536 double surface_efficace[6] = {0};
537 double surface_max[6] = {0};
538 double surface_min[6] = {0};
539 double flux_diphasique[6] = {0};
540 double delta_surface_max[6] = {0};
542 double delta_volume_total = 0;
543 double delta_volume_diphasique = 0;
544 for (
int num_face = 0; num_face < 6; num_face++)
546 int dir = num_face%3;
547 int decalage = num_face/3;
548 int sign = decalage*2 -1;
550 int di = decalage*(dir == 0);
551 int dj = decalage*(dir == 1);
552 int dk = decalage*(dir == 2);
554 double f = select_dir(dir, fx, fy, fz);
556 int n_face = cut_cell_disc.
get_n_face(num_face, n, i, j, k);
559 double surface_old = old_indicatrice_surfacique_face_ns[dir](i+di,j+dj,k+dk);
560 double surface_next = next_indicatrice_surfacique_face_ns[dir](i+di,j+dj,k+dk);
561 surface_max[num_face] = std::max(surface_old, surface_next);
562 surface_min[num_face] = std::min(surface_old, surface_next);
563 surface_efficace[num_face] = indicatrice_surfacique_efficace_face(n_face, dir);
564 flux_diphasique[num_face] = (indicatrice_surfacique_efficace_face(n_face, dir) == 1.) ? 0. : sign*f*indicatrice_surfacique_efficace_face(n_face, dir)*velocity[dir].diph_l_(n_face);
565 if (surface_efficace[num_face] == 0.)
567 assert(surface_max[num_face] == 0.);
570 delta_volume_total -= sign*f*surface_efficace[num_face]*velocity[dir].diph_l_(n_face);
571 delta_volume_diphasique -= flux_diphasique[num_face];
576 delta_volume_total -= sign*f*next_indicatrice_ns(i+di,j+dj,k+dk)*velocity[dir].pure_(i+di,j+dj,k+dk);
581 double delta_volume_cible = volume * (next_indicatrice_ns(i, j, k) - old_indicatrice_ns(i, j, k));
582 double delta_volume_pure = delta_volume_total - delta_volume_diphasique;
583 double delta_volume_diphasique_cible = delta_volume_cible - delta_volume_pure;
585 double erreur_absolue = std::fabs(delta_volume_total - delta_volume_cible);
586 double erreur_relative = delta_volume_cible == 0. ? delta_volume_total/volume : std::fabs((delta_volume_total - delta_volume_cible)/delta_volume_cible);
587 double ecart_volume_diphasique = delta_volume_diphasique - delta_volume_diphasique_cible;
589 indicatrice_surfacique_efficace_face_absolute_error(n) = erreur_absolue;
591 if (ecart_volume_diphasique == 0)
596 if (erreur_relative > 1e-5)
598 solution_locally_not_found = 1;
601 double somme_ratio_max_sur_requis = 0;
602 for (
int num_face = 0; num_face < 6; num_face++)
604 if (flux_diphasique[num_face] != 0)
606 bool flux_et_ecart_meme_signe = ((flux_diphasique[num_face] < 0) == (ecart_volume_diphasique < 0));
608 delta_surface_max[num_face] = flux_et_ecart_meme_signe ? surface_max[num_face] - surface_efficace[num_face] : surface_efficace[num_face] - surface_min[num_face];
613 double delta_surface_requis = (std::abs(surface_efficace[num_face]) < 1e-80) ? 0. : std::fabs(ecart_volume_diphasique/flux_diphasique[num_face])*surface_efficace[num_face];
614 somme_ratio_max_sur_requis += (delta_surface_requis == 0.) ? 0. : delta_surface_max[num_face]/delta_surface_requis;
618 for (
int num_face = 0; num_face < 6; num_face++)
620 if (flux_diphasique[num_face] != 0)
622 int dir = num_face%3;
624 int n_face = cut_cell_disc.
get_n_face(num_face, n, i, j, k);
627 bool flux_et_ecart_meme_signe = ((flux_diphasique[num_face] < 0) == (ecart_volume_diphasique < 0));
628 int sign = 2*flux_et_ecart_meme_signe - 1;
635 double correction = (somme_ratio_max_sur_requis == 0) ? 0. : sign*delta_surface_max[num_face]/somme_ratio_max_sur_requis;
637 indicatrice_surfacique_efficace_face_correction(n, num_face) = indicatrice_surfacique_efficace_face(n_face, dir) + correction;
640 double minimal_acceptable_surface = 1e-15;
641 if (indicatrice_surfacique_efficace_face_correction(n, num_face) < (surface_min[num_face] + minimal_acceptable_surface))
643 indicatrice_surfacique_efficace_face_correction(n, num_face) = std::min(surface_min[num_face] + minimal_acceptable_surface, .5*(surface_min[num_face] + surface_max[num_face]));
645 if (indicatrice_surfacique_efficace_face_correction(n, num_face) > (surface_max[num_face] - minimal_acceptable_surface))
647 indicatrice_surfacique_efficace_face_correction(n, num_face) = std::max(surface_max[num_face] - minimal_acceptable_surface, .5*(surface_min[num_face] + surface_max[num_face]));
659 for (
int n = 0; n < cut_cell_disc.
get_n_loc(); n++)
661 Int3 ijk = cut_cell_disc.
get_ijk(n);
666 for (
int dir = 0; dir < 3; dir++)
668 int di = (-1)*(dir == 0);
669 int dj = (-1)*(dir == 1);
670 int dk = (-1)*(dir == 2);
672 int n_face = cut_cell_disc.
get_n(i+di, j+dj, k+dk);
676 double new_surface = (indicatrice_surfacique_efficace_face_absolute_error(n_face) > indicatrice_surfacique_efficace_face_absolute_error(n)) ? indicatrice_surfacique_efficace_face_correction(n_face, dir+3) : indicatrice_surfacique_efficace_face_correction(n, dir);
679 bool centre_switch = (
IJK_Interfaces::devient_pure(old_indicatrice_ns(i,j,k), next_indicatrice_ns(i,j,k)) || (
IJK_Interfaces::devient_diphasique(old_indicatrice_ns(i,j,k), next_indicatrice_ns(i,j,k))));
680 bool decale_switch = (
IJK_Interfaces::devient_pure(old_indicatrice_ns(i+di,j+dj,k+dk), next_indicatrice_ns(i+di,j+dj,k+dk)) || (
IJK_Interfaces::devient_diphasique(old_indicatrice_ns(i+di,j+dj,k+dk), next_indicatrice_ns(i+di,j+dj,k+dk))));
681 if ((centre_switch) && (!decale_switch))
683 new_surface = indicatrice_surfacique_efficace_face_correction(n, dir);
685 else if ((!centre_switch) && (decale_switch))
687 new_surface = indicatrice_surfacique_efficace_face_correction(n_face, dir+3);
692 indicatrice_surfacique_efficace_face(n, dir) = new_surface;
699 if (iteration_solver_surface_efficace_face%iteration_impression_intermediaire == 0)
702 verbosite_surface_efficace_face,
703 iteration_solver_surface_efficace_face,
708 indicatrice_surfacique_efficace_face,
709 indicatrice_surfacique_efficace_face_initial);
714 while (solution_not_found && iteration_solver_surface_efficace_face < maximum_iteration);
715 statistics().end_count(
"cut_cell: calcul des surfaces efficaces");
719 int verbosite_surface_efficace_interface,
721 const IJK_Field_vector3_double& velocity,
722 const IJK_Field_double& old_indicatrice_ns,
723 const IJK_Field_double& next_indicatrice_ns,
724 const DoubleTabFT_cut_cell_scalar& surface_efficace_interface,
725 const DoubleTabFT_cut_cell_scalar& surface_efficace_interface_initial,
726 const DoubleTabFT_cut_cell_vector3& normale_deplacement_interface,
727 const DoubleTabFT_cut_cell_vector3& vitesse_deplacement_interface)
734 const ArrOfDouble& delta_z_all = geom.
get_delta(DIRECTION_K);
738 int n_count_surface = 0;
739 double moyenne_erreur_absolue = 0.;
740 double moyenne_erreur_relative = 0.;
741 double maximum_erreur_absolue = 0.;
742 double maximum_erreur_relative = 0.;
743 double moyenne_ecart_absolue_surface = 0.;
744 double moyenne_ecart_relatif_surface = 0.;
745 double maximum_ecart_absolue_surface = 0.;
746 double maximum_ecart_relatif_surface = 0.;
747 int switch_n_count = 0;
748 int switch_n_count_surface = 0;
749 double switch_moyenne_erreur_absolue = 0.;
750 double switch_moyenne_erreur_relative = 0.;
751 double switch_maximum_erreur_absolue = 0.;
752 double switch_maximum_erreur_relative = 0.;
753 double switch_moyenne_ecart_absolue_surface = 0.;
754 double switch_moyenne_ecart_relatif_surface = 0.;
755 double switch_maximum_ecart_absolue_surface = 0.;
756 double switch_maximum_ecart_relatif_surface = 0.;
757 for (
int n = 0; n < cut_cell_disc.
get_n_loc(); n++)
759 Int3 ijk = cut_cell_disc.
get_ijk(n);
764 bool centre_switch = (
IJK_Interfaces::devient_pure(old_indicatrice_ns(i,j,k), next_indicatrice_ns(i,j,k)) || (
IJK_Interfaces::devient_diphasique(old_indicatrice_ns(i,j,k), next_indicatrice_ns(i,j,k))));
766 const double delta_z = delta_z_all[k + offset];
767 const double volume = delta_x * delta_y * delta_z;
770 double erreur_relative;
771 if (surface_efficace_interface_initial(n) != 0.)
773 erreur_relative = std::fabs((surface_efficace_interface(n) - surface_efficace_interface_initial(n))/surface_efficace_interface_initial(n));
777 erreur_relative = 0.;
778 assert(surface_efficace_interface(n) == 0.);
780 double erreur_absolue = std::fabs(surface_efficace_interface(n) - surface_efficace_interface_initial(n));
782 moyenne_ecart_absolue_surface += erreur_absolue;
783 moyenne_ecart_relatif_surface += erreur_relative;
784 maximum_ecart_relatif_surface = erreur_relative > maximum_ecart_relatif_surface ? erreur_relative : maximum_ecart_relatif_surface;
785 maximum_ecart_absolue_surface = erreur_absolue > maximum_ecart_absolue_surface ? erreur_absolue : maximum_ecart_absolue_surface;
787 n_count_surface += 1;
791 switch_moyenne_ecart_absolue_surface += erreur_absolue;
792 switch_moyenne_ecart_relatif_surface += erreur_relative;
793 switch_maximum_ecart_relatif_surface = erreur_relative > switch_maximum_ecart_relatif_surface ? erreur_relative : switch_maximum_ecart_relatif_surface;
794 switch_maximum_ecart_absolue_surface = erreur_absolue > switch_maximum_ecart_absolue_surface ? erreur_absolue : switch_maximum_ecart_absolue_surface;
796 switch_n_count_surface += 1;
800 const double vitesse_interface = -vitesse_deplacement_interface(n,0)*normale_deplacement_interface(n,0) - vitesse_deplacement_interface(n,1)*normale_deplacement_interface(n,1) - vitesse_deplacement_interface(n,2)*normale_deplacement_interface(n,2);
801 const double surface_interface = surface_efficace_interface(n);
803 double delta_volume_cible = volume * (next_indicatrice_ns(i, j, k) - old_indicatrice_ns(i, j, k));
804 double delta_volume_interface = vitesse_interface * surface_interface * timestep;
806 double erreur_relative = delta_volume_cible == 0. ? delta_volume_interface/volume : std::fabs((delta_volume_interface - delta_volume_cible)/delta_volume_cible);
807 double erreur_absolue = std::fabs(delta_volume_interface - delta_volume_cible);
817 moyenne_erreur_relative += erreur_relative;
818 moyenne_erreur_absolue += erreur_absolue;
819 maximum_erreur_relative = erreur_relative > maximum_erreur_relative ? erreur_relative : maximum_erreur_relative;
820 maximum_erreur_absolue = erreur_absolue > maximum_erreur_absolue ? erreur_absolue : maximum_erreur_absolue;
825 switch_moyenne_erreur_relative += erreur_relative;
826 switch_moyenne_erreur_absolue += erreur_absolue;
827 switch_maximum_erreur_relative = erreur_relative > switch_maximum_erreur_relative ? erreur_relative : switch_maximum_erreur_relative;
828 switch_maximum_erreur_absolue = erreur_absolue > switch_maximum_erreur_absolue ? erreur_absolue : switch_maximum_erreur_absolue;
836 moyenne_ecart_absolue_surface =
Process::mp_sum(moyenne_ecart_absolue_surface);
837 moyenne_ecart_relatif_surface =
Process::mp_sum(moyenne_ecart_relatif_surface);
838 maximum_ecart_absolue_surface =
Process::mp_max(maximum_ecart_absolue_surface);
839 maximum_ecart_relatif_surface =
Process::mp_max(maximum_ecart_relatif_surface);
840 switch_moyenne_erreur_absolue =
Process::mp_sum(switch_moyenne_erreur_absolue);
841 switch_moyenne_erreur_relative =
Process::mp_sum(switch_moyenne_erreur_relative);
842 switch_maximum_erreur_absolue =
Process::mp_max(switch_maximum_erreur_absolue);
843 switch_maximum_erreur_relative =
Process::mp_max(switch_maximum_erreur_relative);
844 switch_moyenne_ecart_absolue_surface =
Process::mp_sum(switch_moyenne_ecart_absolue_surface);
845 switch_moyenne_ecart_relatif_surface =
Process::mp_sum(switch_moyenne_ecart_relatif_surface);
846 switch_maximum_ecart_absolue_surface =
Process::mp_max(switch_maximum_ecart_absolue_surface);
847 switch_maximum_ecart_relatif_surface =
Process::mp_max(switch_maximum_ecart_relatif_surface);
852 assert(n_count_surface == n_count);
853 assert(switch_n_count_surface == switch_n_count);
856 moyenne_erreur_relative /= n_count;
857 moyenne_erreur_absolue /= n_count;
858 moyenne_ecart_absolue_surface /= (n_count_surface);
859 moyenne_ecart_relatif_surface /= (n_count_surface);
861 if (switch_n_count >= 1)
863 switch_moyenne_erreur_relative /= switch_n_count;
864 switch_moyenne_erreur_absolue /= switch_n_count;
865 switch_moyenne_ecart_absolue_surface /= (switch_n_count_surface);
866 switch_moyenne_ecart_relatif_surface /= (switch_n_count_surface);
869 if (verbosite_surface_efficace_interface == 2)
871 Cerr <<
"Calcul surface efficace interface:" << finl;
872 Cerr <<
" moyenne_erreur: " << moyenne_erreur_absolue <<
" (relative: " << moyenne_erreur_relative <<
") max_erreur: " << maximum_erreur_absolue <<
" (relative: " << maximum_erreur_relative <<
")" << finl;
873 Cerr <<
" moyenne_ecart_surface: " << moyenne_ecart_absolue_surface <<
" (relatif: " << moyenne_ecart_relatif_surface <<
") max_ecart_surface: " << maximum_ecart_absolue_surface <<
" (relatif: " << maximum_ecart_relatif_surface <<
")" << finl;
874 Cerr <<
" switch moyenne_erreur: " << switch_moyenne_erreur_absolue <<
" (relative: " << switch_moyenne_erreur_relative <<
") max_erreur: " << switch_maximum_erreur_absolue <<
" (relative: " << switch_maximum_erreur_relative <<
")" << finl;
875 Cerr <<
" switch moyenne_ecart_surface: " << switch_moyenne_ecart_absolue_surface <<
" (relatif: " << switch_moyenne_ecart_relatif_surface <<
") max_ecart_surface: " << switch_maximum_ecart_absolue_surface <<
" (relatif: " << switch_maximum_ecart_relatif_surface <<
")" << finl;
877 else if (verbosite_surface_efficace_interface == 1)
879 Cerr <<
"Calcul surface efficace interface: mean_rel: " << moyenne_erreur_relative <<
" max_rel: " << maximum_erreur_relative <<
" switch_mean_rel: " << switch_moyenne_erreur_relative <<
" switch_max_rel: " << switch_maximum_erreur_relative << finl;
883 Cerr <<
"Cut_cell_surface_efficace::imprimer_informations_surface_efficace_interface non reconnu." << finl;
889 int verbosite_surface_efficace_face,
890 int iteration_solver_surface_efficace_face,
892 const Cut_field_vector3_double& velocity,
893 const IJK_Field_double& old_indicatrice_ns,
894 const IJK_Field_double& next_indicatrice_ns,
895 const DoubleTabFT_cut_cell_vector3& indicatrice_surfacique_efficace_face,
896 const DoubleTabFT_cut_cell_vector3& indicatrice_surfacique_efficace_face_initial)
903 const ArrOfDouble& delta_z_all = geom.
get_delta(DIRECTION_K);
907 int n_count_surface = 0;
908 double moyenne_erreur_absolue = 0.;
909 double moyenne_erreur_relative = 0.;
910 double maximum_erreur_absolue = 0.;
911 double maximum_erreur_relative = 0.;
912 double moyenne_ecart_absolue_surface = 0.;
913 double moyenne_ecart_relatif_surface = 0.;
914 double maximum_ecart_absolue_surface = 0.;
915 double maximum_ecart_relatif_surface = 0.;
916 int switch_n_count = 0;
917 int switch_n_count_surface = 0;
918 double switch_moyenne_erreur_absolue = 0.;
919 double switch_moyenne_erreur_relative = 0.;
920 double switch_maximum_erreur_absolue = 0.;
921 double switch_maximum_erreur_relative = 0.;
922 double switch_moyenne_ecart_absolue_surface = 0.;
923 double switch_moyenne_ecart_relatif_surface = 0.;
924 double switch_maximum_ecart_absolue_surface = 0.;
925 double switch_maximum_ecart_relatif_surface = 0.;
926 for (
int n = 0; n < cut_cell_disc.
get_n_loc(); n++)
928 Int3 ijk = cut_cell_disc.
get_ijk(n);
933 bool centre_switch = (
IJK_Interfaces::devient_pure(old_indicatrice_ns(i,j,k), next_indicatrice_ns(i,j,k)) || (
IJK_Interfaces::devient_diphasique(old_indicatrice_ns(i,j,k), next_indicatrice_ns(i,j,k))));
935 const double delta_z = delta_z_all[k + offset];
936 const double volume = delta_x * delta_y * delta_z;
938 const double fx = delta_y * delta_z * timestep;
939 const double fy = delta_x * delta_z * timestep;
940 const double fz = delta_x * delta_y * timestep;
942 double delta_volume_total = 0;
943 for (
int num_face = 0; num_face < 6; num_face++)
945 int dir = num_face%3;
946 int decalage = num_face/3;
947 int sign = decalage*2 -1;
949 int di = decalage*(dir == 0);
950 int dj = decalage*(dir == 1);
951 int dk = decalage*(dir == 2);
953 double f = select_dir(dir, fx, fy, fz);
955 int n_face = cut_cell_disc.
get_n_face(num_face, n, i, j, k);
958 delta_volume_total -= sign*f*indicatrice_surfacique_efficace_face(n_face, dir)*velocity[dir].diph_l_(n_face);
961 double erreur_relative;
962 if (indicatrice_surfacique_efficace_face_initial(n_face, dir) != 0.)
964 erreur_relative = std::fabs((indicatrice_surfacique_efficace_face(n_face, dir) - indicatrice_surfacique_efficace_face_initial(n_face, dir))/indicatrice_surfacique_efficace_face_initial(n_face, dir));
968 erreur_relative = 0.;
969 assert(indicatrice_surfacique_efficace_face(n_face, dir) == 0.);
971 double erreur_absolue = std::fabs(indicatrice_surfacique_efficace_face(n_face, dir) - indicatrice_surfacique_efficace_face_initial(n_face, dir));
973 moyenne_ecart_absolue_surface += erreur_absolue;
974 moyenne_ecart_relatif_surface += erreur_relative;
975 maximum_ecart_relatif_surface = erreur_relative > maximum_ecart_relatif_surface ? erreur_relative : maximum_ecart_relatif_surface;
976 maximum_ecart_absolue_surface = erreur_absolue > maximum_ecart_absolue_surface ? erreur_absolue : maximum_ecart_absolue_surface;
979 n_count_surface += 1;
983 switch_moyenne_ecart_absolue_surface += erreur_absolue;
984 switch_moyenne_ecart_relatif_surface += erreur_relative;
985 switch_maximum_ecart_relatif_surface = erreur_relative > switch_maximum_ecart_relatif_surface ? erreur_relative : switch_maximum_ecart_relatif_surface;
986 switch_maximum_ecart_absolue_surface = erreur_absolue > switch_maximum_ecart_absolue_surface ? erreur_absolue : switch_maximum_ecart_absolue_surface;
988 switch_n_count_surface += 1;
994 assert((next_indicatrice_ns(i+di,j+dj,k+dk) == 0) || (next_indicatrice_ns(i+di,j+dj,k+dk) == 1));
995 delta_volume_total -= sign*f*next_indicatrice_ns(i+di,j+dj,k+dk)*velocity[dir].pure_(i+di,j+dj,k+dk);
1000 double delta_volume_cible = volume * (next_indicatrice_ns(i, j, k) - old_indicatrice_ns(i, j, k));
1002 double erreur_relative = delta_volume_cible == 0. ? delta_volume_total/volume : std::fabs((delta_volume_total - delta_volume_cible)/delta_volume_cible);
1003 double erreur_absolue = std::fabs(delta_volume_total - delta_volume_cible);
1013 moyenne_erreur_relative += erreur_relative;
1014 moyenne_erreur_absolue += erreur_absolue;
1015 maximum_erreur_relative = erreur_relative > maximum_erreur_relative ? erreur_relative : maximum_erreur_relative;
1016 maximum_erreur_absolue = erreur_absolue > maximum_erreur_absolue ? erreur_absolue : maximum_erreur_absolue;
1020 switch_n_count += 1;
1021 switch_moyenne_erreur_relative += erreur_relative;
1022 switch_moyenne_erreur_absolue += erreur_absolue;
1023 switch_maximum_erreur_relative = erreur_relative > switch_maximum_erreur_relative ? erreur_relative : switch_maximum_erreur_relative;
1024 switch_maximum_erreur_absolue = erreur_absolue > switch_maximum_erreur_absolue ? erreur_absolue : switch_maximum_erreur_absolue;
1032 moyenne_ecart_absolue_surface =
Process::mp_sum(moyenne_ecart_absolue_surface);
1033 moyenne_ecart_relatif_surface =
Process::mp_sum(moyenne_ecart_relatif_surface);
1034 maximum_ecart_absolue_surface =
Process::mp_max(maximum_ecart_absolue_surface);
1035 maximum_ecart_relatif_surface =
Process::mp_max(maximum_ecart_relatif_surface);
1036 switch_moyenne_erreur_absolue =
Process::mp_sum(switch_moyenne_erreur_absolue);
1037 switch_moyenne_erreur_relative =
Process::mp_sum(switch_moyenne_erreur_relative);
1038 switch_maximum_erreur_absolue =
Process::mp_max(switch_maximum_erreur_absolue);
1039 switch_maximum_erreur_relative =
Process::mp_max(switch_maximum_erreur_relative);
1040 switch_moyenne_ecart_absolue_surface =
Process::mp_sum(switch_moyenne_ecart_absolue_surface);
1041 switch_moyenne_ecart_relatif_surface =
Process::mp_sum(switch_moyenne_ecart_relatif_surface);
1042 switch_maximum_ecart_absolue_surface =
Process::mp_max(switch_maximum_ecart_absolue_surface);
1043 switch_maximum_ecart_relatif_surface =
Process::mp_max(switch_maximum_ecart_relatif_surface);
1050 moyenne_erreur_relative /= n_count;
1051 moyenne_erreur_absolue /= n_count;
1052 moyenne_ecart_absolue_surface /= (n_count_surface);
1053 moyenne_ecart_relatif_surface /= (n_count_surface);
1055 if (switch_n_count >= 1)
1057 switch_moyenne_erreur_relative /= switch_n_count;
1058 switch_moyenne_erreur_absolue /= switch_n_count;
1059 switch_moyenne_ecart_absolue_surface /= (switch_n_count_surface);
1060 switch_moyenne_ecart_relatif_surface /= (switch_n_count_surface);
1063 if (verbosite_surface_efficace_face == 2)
1065 Cerr <<
"Calcul surface efficace face: #iteration: " << iteration_solver_surface_efficace_face << finl;
1066 Cerr <<
" moyenne_erreur: " << moyenne_erreur_absolue <<
" (relative: " << moyenne_erreur_relative <<
") max_erreur: " << maximum_erreur_absolue <<
" (relative: " << maximum_erreur_relative <<
")" << finl;
1067 Cerr <<
" moyenne_ecart_surface: " << moyenne_ecart_absolue_surface <<
" (relatif: " << moyenne_ecart_relatif_surface <<
") max_ecart_surface: " << maximum_ecart_absolue_surface <<
" (relatif: " << maximum_ecart_relatif_surface <<
")" << finl;
1068 Cerr <<
" switch moyenne_erreur: " << switch_moyenne_erreur_absolue <<
" (relative: " << switch_moyenne_erreur_relative <<
") max_erreur: " << switch_maximum_erreur_absolue <<
" (relative: " << switch_maximum_erreur_relative <<
")" << finl;
1069 Cerr <<
" switch moyenne_ecart_surface: " << switch_moyenne_ecart_absolue_surface <<
" (relatif: " << switch_moyenne_ecart_relatif_surface <<
") max_ecart_surface: " << switch_maximum_ecart_absolue_surface <<
" (relatif: " << switch_maximum_ecart_relatif_surface <<
")" << finl;
1071 else if (verbosite_surface_efficace_face == 1)
1073 Cerr <<
"Calcul surface efficace face: #" << iteration_solver_surface_efficace_face <<
" mean_rel: " << moyenne_erreur_relative <<
" max_rel: " << maximum_erreur_relative <<
" switch_mean_rel: " << switch_moyenne_erreur_relative <<
" switch_max_rel: " << switch_maximum_erreur_relative << finl;
1077 Cerr <<
"Cut_cell_surface_efficace::imprimer_informations_surface_efficace_face: verbosite_surface_efficace_face non reconnu." << finl;
1084 const IJK_Field_double& indicatrice_avant_deformation,
1085 const IJK_Field_double& indicatrice_apres_deformation,
1086 const IJK_Field_vector3_double& indicatrice_surfacique_efficace_deformation_face,
1087 const Cut_field_vector3_double& deformation_velocity,
1088 IJK_Field_double& delta_volume_theorique_bilan)
1090 assert(&deformation_velocity[0].get_cut_cell_disc() == &deformation_velocity[1].get_cut_cell_disc());
1091 assert(&deformation_velocity[0].get_cut_cell_disc() == &deformation_velocity[2].get_cut_cell_disc());
1092 const Cut_cell_FT_Disc& cut_cell_disc = deformation_velocity[0].get_cut_cell_disc();
1094 const int ni = delta_volume_theorique_bilan.
ni();
1095 const int nj = delta_volume_theorique_bilan.
nj();
1096 const int nk = delta_volume_theorique_bilan.
nk();
1107 double origin_x = geom.
get_origin(DIRECTION_I);
1108 double origin_y = geom.
get_origin(DIRECTION_J);
1109 double origin_z = geom.
get_origin(DIRECTION_K);
1115 int imin = std::max(0, (
int)((bounding_box_bulles(compo, 0, 0) - origin_x)/delta_x - offset_x - 2));
1116 int imax = std::min(ni, (
int)((bounding_box_bulles(compo, 0, 1) - origin_x)/delta_x - offset_x + 2));
1117 int jmin = std::max(0, (
int)((bounding_box_bulles(compo, 1, 0) - origin_y)/delta_y - offset_y - 2));
1118 int jmax = std::min(nj, (
int)((bounding_box_bulles(compo, 1, 1) - origin_y)/delta_y - offset_y + 2));
1119 int kmin = std::max(0, (
int)((bounding_box_bulles(compo, 2, 0) - origin_z)/delta_z - offset_z - 2));
1120 int kmax = std::min(nk, (
int)((bounding_box_bulles(compo, 2, 1) - origin_z)/delta_z - offset_z + 2));
1122 for (
int k = kmin; k < kmax; k++)
1124 for (
int j = jmin; j < jmax; j++)
1126 for (
int i = imin; i < imax; i++)
1128 bool apres_deformation_pure = ((indicatrice_apres_deformation(i,j,k) == 0.) || (indicatrice_apres_deformation(i,j,k) == 1.));
1129 if (apres_deformation_pure)
1131 assert(delta_volume_theorique_bilan(i,j,k) == 0.);
1135 const double fx = delta_y * delta_z * timestep;
1136 const double fy = delta_x * delta_z * timestep;
1137 const double fz = delta_x * delta_y * timestep;
1139 double delta_volume_total[2] = {0};
1141 for (
int phase = 0 ; phase < 2 ; phase++)
1143 for (
int num_face = 0; num_face < 6; num_face++)
1145 int dir = num_face%3;
1146 int decalage = num_face/3;
1147 int sign = decalage*2 -1;
1149 int di = decalage*(dir == 0);
1150 int dj = decalage*(dir == 1);
1151 int dk = decalage*(dir == 2);
1153 double surface_efficace = (phase == 0) ? 1 - indicatrice_surfacique_efficace_deformation_face[dir](i+di,j+dj,k+dk) : indicatrice_surfacique_efficace_deformation_face[dir](i+di,j+dj,k+dk);
1155 double f = select_dir(dir, fx, fy, fz);
1157 int n = cut_cell_disc.
get_n(i, j, k);
1158 int n_face = cut_cell_disc.
get_n_face(num_face, n, i, j, k);
1161 const DoubleTabFT_cut_cell& deformation_diph_velocity = (phase == 0) ? deformation_velocity[dir].diph_v_ : deformation_velocity[dir].diph_l_;
1163 assert(deformation_diph_velocity(n_face) != 6.3e32);
1164 delta_volume_total[phase] -= sign*f*surface_efficace*deformation_diph_velocity(n_face);
1168 assert(deformation_velocity[dir].pure_(i+di,j+dj,k+dk) != 6.3e32);
1169 delta_volume_total[phase] -= sign*f*surface_efficace*deformation_velocity[dir].pure_(i+di,j+dj,k+dk);
1176 double delta_volume_cible = .5*(delta_volume_total[1] - delta_volume_total[0]);
1178 assert(delta_volume_theorique_bilan(i,j,k) == 0.);
1179 delta_volume_theorique_bilan(i,j,k) = -delta_volume_cible;