16#include <IJK_Ghost_Fluid_tools.h>
17#include <IJK_Field_vector.h>
18#include <Probleme_base.h>
21#include <Operateur_IJK_elem_diff.h>
23static int decoder_numero_bulle(
const int code)
25 const int num_bulle = code >> 6;
29static void extrapolate_with_elem_faces_connectivity(
const Domaine_VF& domaine_vf,
30 const IJK_Field_double& distance,
31 IJK_Field_double& field,
32 const int stencil_width)
34 const double invalid_test = INVALID_TEST;
35 const IntTab& elem_faces = domaine_vf.
elem_faces();
37 const int nb_faces_elem = elem_faces.
dimension(1);
38 const int nb_elem = elem_faces.
dimension(0);
39 IJK_Field_double field_old;
41 IJK_Field_double field_ini(field);
42 const Domaine_IJK& splitting_distance = distance.get_domaine();
47 const double n_iterations = 5 * stencil_width;
48 for (
int iteration = 0; iteration < n_iterations; iteration++)
54 for (
int i_elem = 0; i_elem < nb_elem; i_elem++)
59 const double d = distance(num_elem_ijk[DIRECTION_I],
60 num_elem_ijk[DIRECTION_J],
61 num_elem_ijk[DIRECTION_K]);
67 const double field_ini_val = field_ini(num_elem_ijk[DIRECTION_I],
68 num_elem_ijk[DIRECTION_J],
69 num_elem_ijk[DIRECTION_K]);
70 if ((d > invalid_test) && (field_ini_val == 0))
72 double sum_field = 0.;
74 for (
int i_face = 0; i_face < nb_faces_elem; i_face++)
76 const int face = elem_faces(i_elem, i_face);
77 const int neighbour = faces_elem(face, 0) + faces_elem(face, 1) - i_elem;
82 double field_neighbour = field_old(num_elem_neighbour_ijk[DIRECTION_I],
83 num_elem_neighbour_ijk[DIRECTION_J],
84 num_elem_neighbour_ijk[DIRECTION_K]);
85 const double distance_neighbour = distance(num_elem_neighbour_ijk[DIRECTION_I],
86 num_elem_neighbour_ijk[DIRECTION_J],
87 num_elem_neighbour_ijk[DIRECTION_K]);
91 if (distance_neighbour > invalid_test)
94 if (fabs(distance_neighbour) < INVALID_TEST)
96 Cerr <<
"Distance is very much at zero whereas interfacial_area is zero too... Pathological case to be looked into closely. " << finl;
97 Cerr <<
"Contact TRUST support." << finl;
107 sum_field += field_neighbour;
114 field(num_elem_ijk[DIRECTION_I],
115 num_elem_ijk[DIRECTION_J],
116 num_elem_ijk[DIRECTION_K]) = sum_field / coeff;
124static void extrapolate_with_ijk_indices(
const IJK_Field_double& distance,
125 const IJK_Field_double& indicator,
126 IJK_Field_double& field,
127 const int& stencil_width,
128 const int& recompute_field_ini,
129 const int& zero_neighbour_value_mean,
130 const int& vapour_mixed_only,
131 const int& smooth_factor)
136 const double invalid_test = INVALID_TEST;
137 const double n_iterations = zero_neighbour_value_mean ? smooth_factor * stencil_width : stencil_width;
138 const int ni = field.
ni();
139 const int nj = field.
nj();
140 const int nk = field.
nk();
141 IJK_Field_double field_old;
142 IJK_Field_double field_ini = field;
143 for (
int iteration = 0; iteration < n_iterations; iteration++)
146 for (
int k = 0; k < nk; k++)
147 for (
int j = 0; j < nj; j++)
148 for (
int i = 0; i < ni; i++)
150 const double indic = indicator(i,j,k);
151 const int vapour_mixed = !vapour_mixed_only ? 1 : (indic < LIQUID_INDICATOR_TEST);
154 const double d = distance(i,j,k);
156 const double field_ini_val = (!zero_neighbour_value_mean && !recompute_field_ini) ? field_old(i,j,k) : field_ini(i,j,k);
157 if ((d > invalid_test) && (field_ini_val == 0))
159 double sum_field = 0.;
161 for (
int l=0; l<6; l++)
163 const int ii = NEIGHBOURS_I[l];
164 const int jj = NEIGHBOURS_J[l];
165 const int kk = NEIGHBOURS_K[l];
166 const double distance_neighbour = distance(i+ii,j+jj,k+kk);
167 const double field_neighbour = field_old(i+ii,j+jj,k+kk);
168 const int neighbour_condition = zero_neighbour_value_mean ? 1 : (field_neighbour != 0);
173 if (distance_neighbour > invalid_test && neighbour_condition)
175 sum_field += field_neighbour;
180 field(i,j,k) = sum_field / coeff;
192void compute_eulerian_normal_distance_facet_barycentre_field(
const IJK_Interfaces& interfaces,
193 IJK_Field_double& distance_field,
194 IJK_Field_vector3_double& normal_vect,
195 IJK_Field_vector3_double& facets_barycentre,
196 IJK_Field_vector3_double& tmp_old_vector_val,
197 IJK_Field_vector3_double& tmp_new_vector_val,
198 IJK_Field_double& tmp_old_val,
199 IJK_Field_double& tmp_new_val,
200 IJK_Field_int& tmp_interf_cells,
201 IJK_Field_int& tmp_propagated_cells,
206 const int& avoid_gfm_parallel_calls)
211 const bool use_ijk =
true;
215 static const double invalid_distance_value = INVALID_TEST;
221 const DoubleTab& centre_element = domaine_vf.
xp();
224 distance_field.
data() = invalid_distance_value * 1.1;
225 for (
int dir = 0; dir < dim; dir++)
226 normal_vect[dir].data() = 0.;
235 for (
int l=0; l<dim; l++)
237 interf_cells_indices[l].reset();
238 gfm_first_cells_indices_[l].reset();
239 propagated_cells_indices[l].reset();
241 tmp_interf_cells.
data() = 0;
242 tmp_propagated_cells.
data() = 0;
254 const ArrOfInt& index_elem = intersections.
index_elem();
257 const IntTab& facettes = maillage.
facettes();
258 const DoubleTab& sommets = maillage.
sommets();
261 for (
int elem = 0; elem < nb_elem; elem++)
263 int index = index_elem[elem];
265 double normale[3] = {0., 0., 0.};
267 double centre[3] = {0., 0., 0.};
269 double surface_tot = 0.;
277#ifdef AVEC_BUG_SURFACES
278 const double surface = data.surface_intersection_;
282 surface_tot += surface;
283 for (
int i = 0; i < dim; i++)
285 normale[i] += surface * normale_facettes(num_facette, i);
288 for (
int j = 0; j < dim; j++)
290 const int som = facettes(num_facette, j);
291 const double coord = sommets(som, i);
293 g_i += coord * coeff;
295 centre[i] += surface * g_i;
300 if (surface_tot > 0.)
306 const double inverse_surface_tot = 1. / surface_tot;
309 for (j = 0; j < dim; j++)
311 norme += normale[j] * normale[j];
312 normal_vect[j](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) = normale[j];
313 centre[j] *= inverse_surface_tot;
318 double i_norme = 1./sqrt(norme);
319 double distance = 0.;
320 for (j = 0; j < dim; j++)
322 double n_j = normale[j] * i_norme;
323 distance += (centre_element(elem, j) - centre[j]) * n_j;
325 distance_field(num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) = distance;
328 if (avoid_gfm_parallel_calls)
329 tmp_interf_cells(num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) = 1;
332 for (
int j = 0; j < dim; j++)
333 facets_barycentre[j](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) = centre[j];
338 for (
int dir = 0; dir < dim; dir++)
339 DebogIJK::verifier(
"IJK_Ghost_Fluid_tools::compute_eulerian_normal_distance_field", normal_vect[dir]);
340 DebogIJK::verifier(
"IJK_Ghost_Fluid_tools::compute_eulerian_normal_distance_field", distance_field);
343 if (avoid_gfm_parallel_calls)
345 const int ni = tmp_interf_cells.
ni();
346 const int nj = tmp_interf_cells.
nj();
347 const int nk = tmp_interf_cells.
nk();
348 const int nb_ghost = tmp_interf_cells.
ghost();
349 for (
int k = - nb_ghost; k < nk + nb_ghost; k++)
350 for (
int j = - nb_ghost; j < nj + nb_ghost; j++)
351 for (
int i = - nb_ghost; i < ni + nb_ghost; i++)
352 if (tmp_interf_cells(i,j,k))
353 for (
int l=0; l<dim; l++)
355 const int index = select_dir(l, i, j, k);
356 interf_cells_indices[l].append_array(index);
362 IJK_Field_vector3_double& terme_src = tmp_old_vector_val;
363 IJK_Field_vector3_double& tmp = tmp_new_vector_val;
364 for (
int l=0; l<dim; l++)
366 terme_src[l].data() = normal_vect[l].data();
367 tmp[l].data() = normal_vect[l].data();
371 const IntTab& elem_faces = domaine_vf.
elem_faces();
372 const int nb_elem_voisins = elem_faces.
line_size();
378 tmp_propagated_cells.
data() = tmp_interf_cells.
data();
379 propagated_cells_indices = interf_cells_indices;
381 for (
int l=0; l<dim; l++)
382 propagated_cells_indices_tmp[l].resize_array(1);
385 const int n_iter_tmp = avoid_gfm_parallel_calls ? n_iter + 1: n_iter;
389 const int ni = normal_vect[0].ni();
390 const int nj = normal_vect[0].nj();
391 const int nk = normal_vect[0].nk();
392 const int nghost = normal_vect[0].ghost();
394 for (iteration = 0; iteration < n_iter_tmp; iteration++)
404 const double un_sur_ncontrib = 1. / (1. + nb_elem_voisins);
405 if (avoid_gfm_parallel_calls)
407 propagated_cells_indices_tmp = propagated_cells_indices;
409 for (
int ielem = 0; ielem < propagated_cells_indices_tmp[0].size_array(); ielem++)
411 const int i = propagated_cells_indices_tmp[DIRECTION_I](ielem);
412 const int j = propagated_cells_indices_tmp[DIRECTION_J](ielem);
413 const int k = propagated_cells_indices_tmp[DIRECTION_K](ielem);
416 double n[3] = {0., 0., 0.};
417 for (m = 0; m < dim; m++)
418 n[m] = normal_vect[m](i,j,k);
419 for (
int l=0; l<6; l++)
421 const int ii = NEIGHBOURS_I[l];
422 const int jj = NEIGHBOURS_J[l];
423 const int kk = NEIGHBOURS_K[l];
425 const int is_outside_proc = (i + ii < -nghost || j + jj < -nghost || k + kk < -nghost)
426 || (i + ii >= ni + nghost || j + jj >= nj + nghost || k + kk >= nk + nghost);
427 if (!is_outside_proc)
429 for (m = 0; m < dim; m++)
430 n[m] += normal_vect[m](i+ii,j+jj,k+kk);
432 if (!tmp_propagated_cells(i+ii,j+jj,k+kk))
434 const Int3 ijk_index(i+ii, j+jj, k+kk);
435 for (m=0; m<dim; m++)
436 propagated_cells_indices[m].append_array(ijk_index[m]);
437 tmp_propagated_cells(i+ii,j+jj,k+kk) = 1;
439 for (m=0; m<dim; m++)
440 gfm_first_cells_indices_[m].append_array(ijk_index[m]);
444 for (m = 0; m < dim; m++)
445 tmp[m](i,j,k) = terme_src[m](i,j,k) + n[m] * un_sur_ncontrib;
447 for (
int l=0; l<dim; l++)
448 normal_vect[l].data() = tmp[l].data();
452 for (
int k = 0; k < nk; k++)
453 for (
int j = 0; j < nj; j++)
454 for (
int i = 0; i < ni; i++)
457 double n[3] = {0., 0., 0.};
458 for (m = 0; m < dim; m++)
459 n[m] = normal_vect[m](i,j,k);
460 for (
int l=0; l<6; l++)
462 const int ii = NEIGHBOURS_I[l];
463 const int jj = NEIGHBOURS_J[l];
464 const int kk = NEIGHBOURS_K[l];
465 for (m = 0; m < dim; m++)
466 n[m] += normal_vect[m](i+ii,j+jj,k+kk);
468 for (m = 0; m < dim; m++)
469 tmp[m](i,j,k) = terme_src[m](i,j,k) + n[m] * un_sur_ncontrib;
471 for (
int l=0; l<dim; l++)
472 normal_vect[l].data() = tmp[l].data();
479 for (iteration = 0; iteration < n_iter; iteration++)
488 const double un_sur_ncontrib = 1. / (1. + nb_elem_voisins);
490 for (elem = 0; elem < nb_elem; elem++)
493 double n[3] = {0., 0., 0.};
495 for (i = 0; i < dim; i++)
497 n[i] = normal_vect[i](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]);
499 for (k = 0; k < nb_elem_voisins; k++)
502 const int face = elem_faces(elem, k);
503 const int e_voisin = face_voisins(face, 0) + face_voisins(face, 1) - elem;
506 for (i = 0; i < dim; i++)
507 n[i] += normal_vect[i](num_elem_voisin_ijk[DIRECTION_I],num_elem_voisin_ijk[DIRECTION_J],num_elem_voisin_ijk[DIRECTION_K]);
509 for (i = 0; i < dim; i++)
511 tmp[i](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) =
512 terme_src[i](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) + n[i] * un_sur_ncontrib;
523 ArrOfIntFT liste_elements;
527 for (elem = 0; elem < nb_elem; elem++)
530 double nx = normal_vect[0](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]);
531 double ny = normal_vect[1](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]);
532 double nz = normal_vect[2](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]);
533 double norme2 = nx*nx + ny*ny + nz*nz;
536 double i_norme = 1. / sqrt(norme2);
537 normal_vect[0](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) = nx * i_norme;
538 normal_vect[1](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) = ny * i_norme;
539 normal_vect[2](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) = nz * i_norme;
547 if (!avoid_gfm_parallel_calls)
556 IJK_Field_double& terme_src_dist = tmp_old_val;
557 IJK_Field_double& tmp_dist = tmp_new_val;
558 terme_src_dist.
data() = distance_field.
data();
559 tmp_dist.
data() = distance_field.
data();
561 tmp_propagated_cells.
data() = tmp_interf_cells.
data();
562 propagated_cells_indices = gfm_first_cells_indices_;
563 for (
int l=0; l<dim; l++)
564 propagated_cells_indices_tmp[l].reset();
568 const int ni = normal_vect[0].ni();
569 const int nj = normal_vect[0].nj();
570 const int nk = normal_vect[0].nk();
571 const int nghost = normal_vect[0].ghost();
573 for (iteration = 0; iteration < n_iter; iteration++)
575 if (avoid_gfm_parallel_calls)
577 propagated_cells_indices_tmp = propagated_cells_indices;
578 for (
int l=0; l<dim; l++)
579 propagated_cells_indices[l].reset();
580 for (
int ielem = 0; ielem < propagated_cells_indices_tmp[0].size_array(); ielem++)
582 const int i = propagated_cells_indices_tmp[DIRECTION_I](ielem);
583 const int j = propagated_cells_indices_tmp[DIRECTION_J](ielem);
584 const int k = propagated_cells_indices_tmp[DIRECTION_K](ielem);
587 if (terme_src_dist(i,j,k) > invalid_distance_value)
588 tmp_dist(i,j,k) = distance_field(i,j,k);
591 if (!tmp_propagated_cells(i,j,k))
592 tmp_propagated_cells(i,j,k) = 1;
594 double ncontrib = 0.;
595 double somme_distances = 0.;
596 for (
int l = 0; l < 6; l++)
599 const int ii = NEIGHBOURS_I[l];
600 const int jj = NEIGHBOURS_J[l];
601 const int kk = NEIGHBOURS_K[l];
603 const int is_outside_proc = (i + ii < -nghost || j + jj < -nghost || k + kk < -nghost)
604 || (i + ii >= ni + nghost || j + jj >= nj + nghost || k + kk >= nk + nghost);
605 if (!is_outside_proc)
607 const Int3 ijk_index(i+ii, j+jj, k+kk);
608 if (!tmp_propagated_cells(i+ii,j+jj,k+kk))
610 for (m=0; m<dim; m++)
611 propagated_cells_indices[m].append_array(ijk_index[m]);
612 tmp_propagated_cells(i+ii,j+jj,k+kk) = 1;
615 const double distance_voisin = distance_field(i+ii, j+jj, k+kk);
616 if (distance_voisin > invalid_distance_value)
619 double nx = normal_vect[0](i,j,k) + normal_vect[0](i+ii, j+jj, k+kk);
620 double ny = normal_vect[1](i,j,k) + normal_vect[1](i+ii, j+jj, k+kk);
621 double nz = normal_vect[2](i,j,k) + normal_vect[2](i+ii, j+jj, k+kk);
622 double norm2 = nx*nx + ny*ny + nz*nz;
625 double i_norm = 1./sqrt(norm2);
634 double d = nx * dx + ny * dy + nz * dz + distance_voisin;
635 somme_distances += d;
643 double d = somme_distances / ncontrib;
648 distance_field.
data() = tmp_dist.
data();
652 for (
int k = 0; k < nk; k++)
653 for (
int j = 0; j < nj; j++)
654 for (
int i = 0; i < ni; i++)
657 if (terme_src_dist(i,j,k) > invalid_distance_value)
658 tmp_dist(i,j,k) = distance_field(i,j,k);
662 double ncontrib = 0.;
663 double somme_distances = 0.;
664 for (
int l = 0; l < 6; l++)
667 const int ii = NEIGHBOURS_I[l];
668 const int jj = NEIGHBOURS_J[l];
669 const int kk = NEIGHBOURS_K[l];
670 const double distance_voisin = distance_field(i+ii, j+jj, k+kk);
671 if (distance_voisin > invalid_distance_value)
674 double nx = normal_vect[0](i,j,k) + normal_vect[0](i+ii, j+jj, k+kk);
675 double ny = normal_vect[1](i,j,k) + normal_vect[1](i+ii, j+jj, k+kk);
676 double nz = normal_vect[2](i,j,k) + normal_vect[2](i+ii, j+jj, k+kk);
677 double norm2 = nx*nx + ny*ny + nz*nz;
680 double i_norm = 1./sqrt(norm2);
689 double d = nx * dx + ny * dy + nz * dz + distance_voisin;
690 somme_distances += d;
697 double d = somme_distances / ncontrib;
702 distance_field.
data() = tmp_dist.
data();
709 for (iteration = 0; iteration < n_iter; iteration++)
712 const int liste_elem_size = liste_elements.
size_array();
713 for (i_elem = 0; i_elem < liste_elem_size; i_elem++)
715 elem = liste_elements[i_elem];
717 if (terme_src_dist(num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) > invalid_distance_value)
720 tmp_dist(num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) = distance_field(num_elem_ijk[DIRECTION_I],
721 num_elem_ijk[DIRECTION_J],
722 num_elem_ijk[DIRECTION_K]);
727 double ncontrib = 0.;
728 double somme_distances = 0.;
730 for (k = 0; k < nb_elem_voisins; k++)
733 const int face = elem_faces(elem, k);
734 const int e_voisin = face_voisins(face, 0) + face_voisins(face, 1) - elem;
738 const double distance_voisin = distance_field(num_elem_voisin_ijk[DIRECTION_I],
739 num_elem_voisin_ijk[DIRECTION_J],
740 num_elem_voisin_ijk[DIRECTION_K]);
741 if (distance_voisin > invalid_distance_value)
744 double nx = normal_vect[0](num_elem_ijk[DIRECTION_I],
745 num_elem_ijk[DIRECTION_J],
746 num_elem_ijk[DIRECTION_K]) +
747 normal_vect[0](num_elem_voisin_ijk[DIRECTION_I],
748 num_elem_voisin_ijk[DIRECTION_J],
749 num_elem_voisin_ijk[DIRECTION_K]);
750 double ny = normal_vect[1](num_elem_ijk[DIRECTION_I],
751 num_elem_ijk[DIRECTION_J],
752 num_elem_ijk[DIRECTION_K]) +
753 normal_vect[1](num_elem_voisin_ijk[DIRECTION_I],
754 num_elem_voisin_ijk[DIRECTION_J],
755 num_elem_voisin_ijk[DIRECTION_K]);
756 double nz = normal_vect[2](num_elem_ijk[DIRECTION_I],
757 num_elem_ijk[DIRECTION_J],
758 num_elem_ijk[DIRECTION_K]) +
759 normal_vect[2](num_elem_voisin_ijk[DIRECTION_I],
760 num_elem_voisin_ijk[DIRECTION_J],
761 num_elem_voisin_ijk[DIRECTION_K]);
762 double norm2 = nx*nx + ny*ny + nz*nz;
765 double i_norm = 1./sqrt(norm2);
771 double dx = centre_element(elem, 0) - centre_element(e_voisin, 0);
772 double dy = centre_element(elem, 1) - centre_element(e_voisin, 1);
773 double dz = centre_element(elem, 2) - centre_element(e_voisin, 2);
774 double d = nx * dx + ny * dy + nz * dz + distance_voisin;
775 somme_distances += d;
783 double d = somme_distances / ncontrib;
784 tmp_dist(num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) = d;
788 distance_field = tmp_dist;
792 if (avoid_gfm_parallel_calls)
801void compute_eulerian_curvature_field_from_distance_field(
const IJK_Field_double& distance,
802 IJK_Field_double& curvature,
803 const IJK_Field_local_double& boundary_flux_kmin,
804 const IJK_Field_local_double& boundary_flux_kmax)
816 laplacian_distance.
initialize(distance.get_domaine());
817 const double lambda = 1.;
818 laplacian_distance->set_uniform_lambda(lambda);
820 laplacian_distance->calculer(distance, curvature, boundary_flux_kmin, boundary_flux_kmax);
825 const double vol = dx * dy * dz;
826 const int nx = curvature.
ni();
827 const int ny = curvature.
nj();
828 const int nz = curvature.
nk();
829 for (
int k=0; k < nz ; k++)
830 for (
int j=0; j< ny; j++)
831 for (
int i=0; i < nx; i++)
832 curvature(i,j,k) /= vol;
838void compute_eulerian_curvature_field_from_normal_vector_field(
const IJK_Field_vector3_double& normal_vect,
839 IJK_Field_double& curvature)
844void compute_eulerian_curvature_field_from_interface(
const IJK_Field_vector3_double& normal_vect,
846 IJK_Field_double& interfacial_area,
847 IJK_Field_double& curvature,
848 IJK_Field_double& tmp_old_val,
849 IJK_Field_double& tmp_new_val,
857 const bool use_ijk =
true;
865 static const double invalid_curvature_value = INVALID_TEST;
867 interfacial_area.
data() = invalid_curvature_value * 1.1;
868 curvature.
data() = invalid_curvature_value * 1.1;
879 const IntTab& facettes = maillage.
facettes();
886 for (
int fa7 = 0; fa7 < n_fa7; fa7++)
888 int icompo = compo_facette[fa7];
892 icompo = decoder_numero_bulle(-icompo);
894 if ((compo_to_group[icompo] != igroup) && (igroup != -1))
896 const double sf = surface_facettes[fa7];
904 for (
int isom = 0; isom < 3; isom++)
906 const int num_som = facettes(fa7, isom);
907 const double kappa = courbure[num_som];
909 if (curvature(ijk[DIRECTION_I], ijk[DIRECTION_J], ijk[DIRECTION_K]) < invalid_curvature_value)
910 curvature(ijk[DIRECTION_I], ijk[DIRECTION_J], ijk[DIRECTION_K]) = kappa * surf / 3.;
912 curvature(ijk[DIRECTION_I], ijk[DIRECTION_J], ijk[DIRECTION_K]) += kappa * surf / 3.;
914 if (interfacial_area(ijk[DIRECTION_I], ijk[DIRECTION_J], ijk[DIRECTION_K]) < invalid_curvature_value)
915 interfacial_area(ijk[DIRECTION_I], ijk[DIRECTION_J], ijk[DIRECTION_K]) = surf;
917 interfacial_area(ijk[DIRECTION_I], ijk[DIRECTION_J], ijk[DIRECTION_K]) += surf;
925 const int nx = curvature.
ni();
926 const int ny = curvature.
nj();
927 const int nz = curvature.
nk();
928 for (
int k=0; k < nz ; k++)
929 for (
int j=0; j< ny; j++)
930 for (
int i=0; i < nx; i++)
932 const double kappa = curvature(i,j,k);
933 const double ai = interfacial_area(i,j,k);
935 if ((kappa > invalid_curvature_value) && (ai > invalid_curvature_value))
937 if (fabs(ai) < DMINFLOAT)
939 Cerr <<
"Interfacial_area is very much at zero... Pathological case to be looked into closely. " << finl;
940 Cerr <<
"Curvature is set to invalid value to be overwritten by its neighbours" << finl;
942 curvature(i,j,k) = invalid_curvature_value * 1.1;
947 curvature(i,j,k) = kappa / ai;
956 ArrOfIntFT liste_elements;
959 for (
int elem = 0; elem < nb_elem; elem++)
962 double nx = normal_vect[0](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]);
963 double ny = normal_vect[1](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]);
964 double nz = normal_vect[2](num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]);
965 double norme2 = nx*nx + ny*ny + nz*nz;
975 IJK_Field_double& terme_src_curv = tmp_old_val;
976 IJK_Field_double& tmp_curv = tmp_new_val;
977 terme_src_curv.
data() = curvature.
data();
985 const int ni = normal_vect[0].ni();
986 const int nj = normal_vect[0].nj();
987 const int nk = normal_vect[0].nk();
988 for (
int iteration = 0; iteration < n_iter; iteration++)
990 for (
int k = 0; k < nk; k++)
991 for (
int j = 0; j < nj; j++)
992 for (
int i = 0; i < ni; i++)
995 if (terme_src_curv(i,j,k) > invalid_curvature_value)
996 tmp_curv(i,j,k) = curvature(i,j,k);
1000 double ncontrib = 0.;
1001 double sum_kappa = 0.;
1002 for (
int l = 0; l < 6; l++)
1005 const int ii = NEIGHBOURS_I[l];
1006 const int jj = NEIGHBOURS_J[l];
1007 const int kk = NEIGHBOURS_K[l];
1008 const double curvature_voisin = curvature(i+ii,j+jj,k+kk);
1009 if (curvature_voisin > invalid_curvature_value)
1012 sum_kappa += curvature_voisin;
1019 double kappa = sum_kappa / ncontrib;
1020 tmp_curv(i,j,k) = kappa;
1024 curvature.
data() = tmp_curv.
data();
1030 const IntTab& face_voisins = domaine_vf.
face_voisins();
1031 const IntTab& elem_faces = domaine_vf.
elem_faces();
1032 const int nb_elem_voisins = elem_faces.
line_size();
1033 for (
int iteration = 0; iteration < n_iter; iteration++)
1036 const int liste_elem_size = liste_elements.
size_array();
1037 for (i_elem = 0; i_elem < liste_elem_size; i_elem++)
1039 elem = liste_elements[i_elem];
1041 if (terme_src_curv(num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) > invalid_curvature_value)
1044 tmp_curv(num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) = curvature(num_elem_ijk[DIRECTION_I],
1045 num_elem_ijk[DIRECTION_J],
1046 num_elem_ijk[DIRECTION_K]);
1051 double ncontrib = 0.;
1052 double sum_kappa = 0.;
1054 for (k = 0; k < nb_elem_voisins; k++)
1057 const int face = elem_faces(elem, k);
1058 const int e_voisin = face_voisins(face, 0) + face_voisins(face, 1) - elem;
1062 const double curvature_voisin = curvature(num_elem_voisin_ijk[DIRECTION_I],
1063 num_elem_voisin_ijk[DIRECTION_J],
1064 num_elem_voisin_ijk[DIRECTION_K]);
1065 if (curvature_voisin > invalid_curvature_value)
1068 sum_kappa += curvature_voisin;
1076 double kappa = sum_kappa / ncontrib;
1077 tmp_curv(num_elem_ijk[DIRECTION_I], num_elem_ijk[DIRECTION_J], num_elem_ijk[DIRECTION_K]) = kappa;
1081 curvature = tmp_curv;
1088void compute_eulerian_normal_temperature_gradient_interface(
const IJK_Field_double& distance,
1089 const IJK_Field_double& indicator,
1090 const IJK_Field_double& interfacial_area,
1091 const IJK_Field_double& curvature,
1092 const IJK_Field_double& temperature,
1093 IJK_Field_double& grad_T_interface,
1094 const int& spherical_approx,
1095 const double& temperature_interf)
1105 static const double invalid_value = INVALID_TEST;
1106 static const double liquid_indicator = LIQUID_INDICATOR_TEST;
1107 const int ni = temperature.
ni();
1108 const int nj = temperature.
nj();
1109 const int nk = temperature.
nk();
1112 grad_T_interface.
data() = 0.;
1115 for (
int k = 0; k < nk; k++)
1116 for (
int j = 0; j < nj; j++)
1117 for (
int i = 0; i < ni; i++)
1119 const double ai = interfacial_area(i,j,k);
1120 if (ai > invalid_value)
1122 for (
int l=0; l < 6; l++)
1124 const int ii = NEIGHBOURS_I[l];
1125 const int jj = NEIGHBOURS_J[l];
1126 const int kk = NEIGHBOURS_K[l];
1127 const double d = distance(i+ii,j+jj,k+kk);
1128 const double indic = indicator(i+ii,j+jj,k+kk);
1130 if ((indic > liquid_indicator) && (d > invalid_value) && grad_T_interface(i+ii,j+jj,k+kk) == 0)
1132 const double temperature_liquid = temperature(i+ii,j+jj,k+kk);
1133 const double second_order_gradient = (temperature_liquid - temperature_interf) / d;
1134 const double kappa = curvature(i+ii,j+jj,k+kk);
1135 double grad_T_modified = 0.;
1137 if (spherical_approx)
1138 grad_T_modified = second_order_gradient * (1. - 0.5 * kappa * d);
1141 const double kappa_non_zero = kappa + 1.e-16;
1142 grad_T_modified = pow((d / 2. - 2. / kappa_non_zero),2) * second_order_gradient / (pow((0. - 2. / kappa_non_zero),2) + 1e-16);
1144 grad_T_interface(i+ii,j+jj,k+kk) = grad_T_modified;
1156void propagate_eulerian_normal_temperature_gradient_interface(
const IJK_Interfaces& interfaces,
1157 const IJK_Field_double& distance,
1158 IJK_Field_double& grad_T_interface,
1159 const int& stencil_width,
1160 const int& recompute_field_ini,
1161 const int& zero_neighbour_value_mean,
1162 const int& vapour_mixed_only,
1163 const int& smooth_factor)
1168 const bool use_ijk =
true;
1172 extrapolate_with_ijk_indices(distance,
1176 recompute_field_ini,
1177 zero_neighbour_value_mean,
1186 extrapolate_with_elem_faces_connectivity(domaine_vf, distance, grad_T_interface, stencil_width);
1190void compute_eulerian_extended_temperature(
const IJK_Field_double& indicator,
1191 const IJK_Field_double& distance,
1192 const IJK_Field_double& curvature,
1193 IJK_Field_double& grad_T_interface,
1194 IJK_Field_double& temperature,
1195 const int& spherical_approx,
1196 const double& temperature_interf)
1204 const double invalid_test = INVALID_TEST;
1205 const int ni = temperature.
ni();
1206 const int nj = temperature.
nj();
1207 const int nk = temperature.
nk();
1208 for (
int k = 0; k < nk; k++)
1209 for (
int j = 0; j < nj; j++)
1210 for (
int i = 0; i < ni; i++)
1212 const double indicator_vapour = fabs(1 - indicator(i,j,k));
1213 const double d = distance(i,j,k);
1214 const double grad_T = grad_T_interface(i,j,k);
1215 const double temperature_val = temperature(i,j,k);
1216 if ((d > invalid_test) && (indicator_vapour > VAPOUR_INDICATOR_TEST) && (grad_T != 0) && (temperature_val == 0))
1218 const double kappa = curvature(i,j,k);
1219 double temperature_ghost = 0.;
1220 if (spherical_approx)
1221 temperature_ghost = temperature_interf + d * grad_T * (1. + 0.5 * kappa * d + kappa * kappa * d * d / 6.);
1224 const double kappa_non_zero = kappa + 1.e-16;
1225 temperature_ghost = temperature_interf + grad_T * (- 2 / kappa_non_zero) * (1 - (- 2 / kappa_non_zero) / ((d - (2 / kappa_non_zero)) + 1e-16));
1227 temperature(i,j,k) = temperature_ghost;
1235void smooth_vector_field(IJK_Field_vector3_double& vector_field,
1236 IJK_Field_vector3_double& vector_field_init,
1237 const IJK_Field_vector3_double * eulerian_normal_vectors_ns_normed,
1239 const double (&direct_smoothing_factors) [7],
1240 const double (&gaussian_smoothing_factors) [3][3][3],
1241 const int& smooth_numbers,
1242 const int& remove_normal_compo,
1243 const int& direct_neighbours,
1244 const int& use_field_init,
1245 const int& use_unique_phase)
1247 for (
int c=0; c<3; c++)
1249 IJK_Field_double& field = vector_field[c];
1250 IJK_Field_double& field_init = vector_field_init[c];
1251 smooth_eulerian_field(field,
1255 eulerian_normal_vectors_ns_normed,
1257 direct_smoothing_factors,
1258 gaussian_smoothing_factors,
1260 remove_normal_compo,
1267void smooth_eulerian_field(IJK_Field_double& field,
1268 IJK_Field_double& field_init,
1270 IJK_Field_vector3_double& vector_field_init,
1271 const IJK_Field_vector3_double * eulerian_normal_vectors_ns_normed,
1273 const double (&direct_smoothing_factors) [7],
1274 const double (&gaussian_smoothing_factors) [3][3][3],
1275 const int& smooth_numbers,
1276 const int& remove_normal_compo,
1277 const int& direct_neighbours,
1278 const int& use_field_init,
1279 const int& use_unique_phase)
1281 const IJK_Field_double& indicator = interfaces.
I();
1282 const int smooth_numbers_end = (smooth_numbers < 1) ? 1: smooth_numbers;
1283 const int use_field_init_usr = use_field_init && (smooth_numbers_end == 1);
1284 IJK_Field_double field_copy;
1285 for (
int m=0; m<smooth_numbers_end; m++)
1287 const int ni = field.
ni();
1288 const int nj = field.
nj();
1289 const int nk = field.
nk();
1290 IJK_Field_double& field_raw = use_field_init_usr ? field_init : field_copy;
1291 if (!use_field_init_usr)
1294 field_copy = field_init;
1297 field_copy.echange_espace_virtuel(field_copy.ghost());
1300 double sum_factors = 0;
1301 double sum_factors_phase = 0;
1302 double sum_direct_smoothing_factors = 0.;
1303 double sum_gaussian_smoothing_factors = 0.;
1305 for (
int c=0; c<7; c++)
1306 sum_direct_smoothing_factors += direct_smoothing_factors[c];
1307 for (
int c=0; c<3; c++)
1308 for (
int l=0; l<3; l++)
1309 for (
int n=0; n<3; n++)
1310 sum_gaussian_smoothing_factors += gaussian_smoothing_factors[n][l][c];
1312 sum_factors = (direct_neighbours) ? sum_direct_smoothing_factors : sum_gaussian_smoothing_factors;
1313 sum_factors_phase = sum_factors;
1314 Cerr <<
"Sum of smoothing factors: " << sum_factors << finl;
1315 for (
int k = 0; k < nk; k++)
1316 for (
int j = 0; j < nj; j++)
1317 for (
int i = 0; i < ni; i++)
1319 if (direct_neighbours)
1321 field(i,j,k) = direct_smoothing_factors[6] * field_raw(i,j,k);
1322 for (
int l=0; l<6; l++)
1324 const int ii = NEIGHBOURS_I[l];
1325 const int jj = NEIGHBOURS_J[l];
1326 const int kk = NEIGHBOURS_K[l];
1327 if (!remove_normal_compo)
1328 field(i,j,k) += direct_smoothing_factors[l] * field_raw(i+ii,j+jj,k+kk);
1331 const double normal_vect = (*eulerian_normal_vectors_ns_normed)[dir](i,j,k);
1332 const double normal_compo = (field_raw(i+ii,j+jj,k+kk) *
1333 direct_smoothing_factors[l] *
1339 field(i,j,k) += (direct_smoothing_factors[l] * field_raw(i+ii,j+jj,k+kk) - normal_compo);
1345 sum_factors_phase = use_unique_phase ? 0 : sum_factors;
1346 bool test_indicator;
1349 for (
int c=-1; c<=1; c++)
1350 for (
int l=-1; l<=1; l++)
1351 for (
int n=-1; n<=1; n++)
1353 test_indicator=
true;
1360 const double indic = indicator(i+ii,j+jj,k+kk);
1361 if (use_unique_phase && indic < VAPOUR_INDICATOR_TEST)
1362 test_indicator =
false;
1365 const double smoothing_factor_index = gaussian_smoothing_factors[n+1][l+1][c+1];
1366 if (!remove_normal_compo)
1367 field(i,j,k) += smoothing_factor_index * field_raw(i+ii,j+jj,k+kk);
1370 const double normal_vect = (*eulerian_normal_vectors_ns_normed)[dir](i,j,k);
1374 double normal_compo_tot = 0;
1375 for (
int cc=0; cc<3; cc++)
1377 const double normal_vect_dir = (*eulerian_normal_vectors_ns_normed)[cc](i,j,k);
1378 normal_compo_tot += (smoothing_factor_index *
1379 vector_field_init[cc](i+ii,j+jj,k+kk) *
1380 normal_vect_dir * normal_vect);
1387 field(i,j,k) += (smoothing_factor_index * field_raw(i+ii,j+jj,k+kk) - normal_compo_tot);
1388 if (use_unique_phase)
1389 sum_factors_phase += smoothing_factor_index;
1394 if (sum_factors_phase != 0)
1396 field(i,j,k) /= sum_factors_phase;
1398 if (remove_normal_compo)
1400 const double normal_vect = (*eulerian_normal_vectors_ns_normed)[dir](i,j,k);
1401 double normal_compo_tot = 0;
1402 for (
int cc=0; cc<3; cc++)
1404 const double normal_vect_dir = (*eulerian_normal_vectors_ns_normed)[cc](i,j,k);
1405 normal_compo_tot += vector_field_init[cc](i,j,k) * normal_vect_dir;
1408 const double normal_compo = normal_compo_tot * normal_vect;
1409 field(i,j,k) += normal_compo;
1416void fill_tangential_gradient(
const IJK_Field_vector3_double& vector_field,
1417 const IJK_Field_vector3_double * eulerian_normal_vectors_ns_normed,
1418 IJK_Field_vector3_double& tangential_vector_field)
1420 for (
int c=0; c<3; c++)
1422 IJK_Field_double& field = tangential_vector_field[c];
1423 fill_tangential_gradient_compo(vector_field,
1424 eulerian_normal_vectors_ns_normed,
1429void fill_tangential_gradient_compo(
const IJK_Field_vector3_double& vector_field,
1430 const IJK_Field_vector3_double * eulerian_normal_vectors_ns_normed,
1431 IJK_Field_double& tangential_field,
1434 const int ni = tangential_field.
ni();
1435 const int nj = tangential_field.
nj();
1436 const int nk = tangential_field.
nk();
1437 for (
int k = 0; k < nk; k++)
1438 for (
int j = 0; j < nj; j++)
1439 for (
int i = 0; i < ni; i++)
1441 const double normal_vect = (*eulerian_normal_vectors_ns_normed)[dir](i,j,k);
1442 double normal_compo_tot = 0;
1443 for (
int cc=0; cc<3; cc++)
1445 const double normal_vect_dir = (*eulerian_normal_vectors_ns_normed)[cc](i,j,k);
1446 normal_compo_tot += vector_field[cc](i,j,k) * normal_vect_dir * normal_vect;
1448 tangential_field(i,j,k) = vector_field[dir](i,j,k) - normal_compo_tot;
static void verifier(const char *msg, const IJK_Field_float &)
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
double get_constant_delta(int direction) const
Returns the size of cells in a direction.
FixedVector< int, 3 > convert_packed_to_ijk_cell(int index) const
Convert the local index of an element to a vector with IJK indices.
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
double xp(int num_elem, int k) const
int face_voisins(int num_face, int i) const
renvoie l'element voisin de numface dans la direction i.
classe Domaine_dis_base Cette classe est la base de la hierarchie des domaines discretisees.
const Domaine & domaine() const
void echange_espace_virtuel(int ghost)
Exchange data over "ghost" number of cells.
const Domaine_IJK & get_domaine() const
const Domaine_IJK & get_domaine() const
void echange_espace_virtuel()
const IJK_Field_double & I_ft() const
const Domaine_dis_base & get_domaine_dis() const
const IJK_Field_double & I() const
const ArrOfInt & get_compo_to_group() const
const Maillage_FT_IJK & maillage_ft_ijk() const
int index_element_suivant_
double fraction_surface_intersection_
int index_facette_suivante_
: class Intersections_Elem_Facettes
const ArrOfInt & index_elem() const
Renvoie un tableau de taille domaine.
const ArrOfInt & index_facette() const
Renvoie un tableau de taille "nombre de facettes de l'interface" pour un element 0 <= facette < nb_fa...
const Intersections_Elem_Facettes_Data & data_intersection(int index) const
Renvoie les donnees de l'intersection stockee a l'indice "index" dans le tableau "data" ( 0 <= index ...
const DoubleTab & sommets() const
renvoie le tableau des sommets (reels et virtuels) dimension(0) = nombre de sommets,
int nb_facettes() const
renvoie le nombre de facettes (reelles et virtuelles) (egal a facettes().
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 Intersections_Elem_Facettes & intersections_elem_facettes() 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 ArrOfDouble & get_update_courbure_sommets() const
Calcule la grandeur demandee, stocke le resultat dans un tableau interne a la classe et renvoie le re...
const IntTab & facettes() const
renvoie le tableau des facettes (reelles et virtuelles) dimension(0) = nombre de facettes,
const ArrOfInt & compo_connexe_facettes() const
void typer_diffusion_op(const char *diffusion_op)
void initialize(const Domaine_IJK &splitting)
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
void append_array(_TYPE_ valeur)
_SIZE_ size_array() const
_SIZE_ dimension(int d) const