323 const IJK_Field_double& indicator =
interfaces_->I();
324 const Domaine_IJK& geom = ref_ijk_ft_->get_domaine();
334 Vecteur3 displacement_centre_probe = centre_elem;
335 displacement_centre_probe *= (-1);
336 displacement_centre_probe += xyz_cart_end;
337 Vecteur3 displacement_factor = {displacement_centre_probe[0] / dx,
338 displacement_centre_probe[1] / dy,
339 displacement_centre_probe[2] / dz
341 const int offset_x = (int) displacement_factor[0];
342 const int offset_y = (int) displacement_factor[1];
343 const int offset_z = (int) displacement_factor[2];
344 const int offset_x_elem = ((abs(displacement_factor[0] - offset_x) >= 0.5) ? 1 : 0);
345 const int offset_y_elem = ((abs(displacement_factor[1] - offset_y) >= 0.5) ? 1 : 0);
346 const int offset_z_elem = ((abs(displacement_factor[2] - offset_z) >= 0.5) ? 1 : 0);
347 const int real_offset_x = offset_x + (signbit(offset_x) ? - offset_x_elem : offset_x_elem);
348 const int real_offset_y = offset_y + (signbit(offset_y) ? - offset_y_elem : offset_y_elem);
349 const int real_offset_z = offset_z + (signbit(offset_z) ? - offset_z_elem : offset_z_elem);
350 const double indic_last = indicator(
index_i_ + real_offset_x,
387 Vecteur3 vector_relative {0., 0., 0.};
389 int face_dir[6] = FACES_DIR;
391 for (
int l=0; l<6; l++)
393 const int ii = NEIGHBOURS_I[l];
394 const int jj = NEIGHBOURS_J[l];
395 const int kk = NEIGHBOURS_K[l];
397 if (fabs(indic_neighbour) > LIQUID_INDICATOR_TEST)
399 const int ii_f = NEIGHBOURS_FACES_I[l];
400 const int jj_f = NEIGHBOURS_FACES_J[l];
401 const int kk_f = NEIGHBOURS_FACES_K[l];
412 vector_relative *= (-1);
413 vector_relative += bary_face;
419 normal_contrib *= distance_face_centre;
420 Vecteur3 tangential_displacement = normal_contrib;
421 tangential_displacement *= (-1);
422 tangential_displacement += vector_relative;
431 double distance_vertex_centre = 0.;
432 double tangential_distance_vertex_centre = 0.;
433 Vecteur3 tangential_distance_vector_vertex_centre = {0., 0., 0.};
434 bary_vertex = vector_relative;
438 distance_vertex_centre,
439 tangential_distance_vertex_centre,
440 tangential_distance_vector_vertex_centre);
463 Cerr <<
"Cell face distances have already been computed" << finl;
469 double& distance_vertex_centre,
470 double& tangential_distance_vertex_centre,
471 Vecteur3& tangential_distance_vector_vertex_centre)
473 const Domaine_IJK& geom = ref_ijk_ft_->get_domaine();
477 const double neighbours_first_dir[4] = NEIGHBOURS_FIRST_DIR;
478 const double neighbours_second_dir[4] = NEIGHBOURS_SECOND_DIR;
487 point_coords[1] = dl1 * neighbours_first_dir[vertex_number];
488 point_coords[2] = dl2 * neighbours_second_dir[vertex_number];
493 point_coords[0] = dl1 * neighbours_first_dir[vertex_number];
494 point_coords[2] = dl2 * neighbours_second_dir[vertex_number];
499 point_coords[0] = dl1 * neighbours_first_dir[vertex_number];
500 point_coords[1] = dl2 * neighbours_second_dir[vertex_number];
505 point_coords[0] = dl1 * neighbours_first_dir[vertex_number];
506 point_coords[1] = dl2 * neighbours_second_dir[vertex_number];
509 bary_vertex += point_coords;
512 tangential_distance_vector *= distance_vertex_centre;
513 tangential_distance_vector *= (-1);
514 tangential_distance_vector += bary_vertex;
515 tangential_distance_vertex_centre = tangential_distance_vector.
length();
516 if (tangential_distance_vertex_centre > 1e-16)
517 tangential_distance_vector *= (1 / tangential_distance_vertex_centre);
518 tangential_distance_vector_vertex_centre = tangential_distance_vector;
523 const Domaine_IJK& geom = ref_ijk_ft_->get_domaine();
538 for (l=dxyz_increment_max; l>=0; l--)
544 for (m=dxyz_increment_max; m>=0; m--)
550 for (n=dxyz_increment_max; n>=0; n--)
563 remaining_distance_diag_projected *= remaining_distance_diag;
564 for (
int i=0; i<3; i++)
566 int dx_increment = (int) abs(remaining_distance_diag_projected[0] / dx);
567 int dy_increment = (int) abs(remaining_distance_diag_projected[1] / dy);
568 int dz_increment = (int) abs(remaining_distance_diag_projected[2] / dz);
571 dx_increment = std::min(dx_increment, dxyz_increment_max);
572 dy_increment = std::min(dy_increment, dxyz_increment_max);
573 dz_increment = std::min(dz_increment, dxyz_increment_max);
576 for (l=dx_increment; l>=0; l--)
577 for (m=dy_increment; m>=0; m--)
578 for (n=dz_increment; n>=0; n--)
579 if (l!=0 || m!=0 || n!=0)
584 const double indic_neighbour = ref_ijk_ft_->get_interface().I()(
index_i_ + l_dir,
index_j_ + m_dir,
index_k_ + n_dir);
585 if (indic_neighbour > LIQUID_INDICATOR_TEST)
588 const double dx_contrib = l_dir * dx;
589 const double dy_contrib = m_dir * dy;
590 const double dz_contrib = n_dir * dz;
591 Vecteur3 distance_contrib = {dx_contrib, dy_contrib, dz_contrib};
618 const Domaine_IJK& geom = ref_ijk_ft_->get_domaine();
622 const double dx_over_two = dx / 2.;
623 const double dy_over_two = dy / 2.;
624 const double dz_over_two = dz / 2.;
626 int l_cell, m_cell, n_cell;
630 const int first_increment[3] = {dxyz_over_two_increment_max + 1, dxyz_increment_max, dxyz_increment_max};
631 const int second_increment[3] = {dxyz_increment_max, dxyz_over_two_increment_max + 1, dxyz_increment_max};
632 const int third_increment[3] = {dxyz_increment_max, dxyz_increment_max, dxyz_over_two_increment_max + 1};
642 for (
int c=0; c<3; c++)
644 const int first_incr = first_increment[c];
645 const int second_incr = second_increment[c];
646 const int third_incr = third_increment[c];
651 for (l=first_incr; l>=0; l--)
657 for (m=second_incr; m>=0; m--)
663 for (n=third_incr; n>=0; n--)
676 remaining_distance_diag_projected *= remaining_distance_diag;
677 for (
int i=0; i<3; i++)
679 int dx_over_two_increment = (int) abs(remaining_distance_diag_projected[0] / dx_over_two);
680 int dy_over_two_increment = (int) abs(remaining_distance_diag_projected[1] / dy_over_two);
681 int dz_over_two_increment = (int) abs(remaining_distance_diag_projected[2] / dz_over_two);
682 int dx_increment = (int) (dx_over_two_increment / 2);
683 int dy_increment = (int) (dy_over_two_increment / 2);
684 int dz_increment = (int) (dz_over_two_increment / 2);
685 dx_over_two_increment -= dx_increment;
686 dy_over_two_increment -= dy_increment;
687 dz_over_two_increment -= dz_increment;
690 dx_over_two_increment = std::min(dx_over_two_increment, dxyz_over_two_increment_max);
691 dy_over_two_increment = std::min(dy_over_two_increment, dxyz_over_two_increment_max);
692 dz_over_two_increment = std::min(dz_over_two_increment, dxyz_over_two_increment_max);
693 dx_increment = std::min(dx_increment, dxyz_increment_max);
694 dy_increment = std::min(dy_increment, dxyz_increment_max);
695 dz_increment = std::min(dz_increment, dxyz_increment_max);
698 if (dx_over_two_increment>0)
699 dx_over_two_increment--;
700 if (dy_over_two_increment>0)
701 dy_over_two_increment--;
702 if (dz_over_two_increment>0)
703 dz_over_two_increment--;
708 for (l=dx_over_two_increment + 1; l>=0; l--)
709 for (m_cell=dy_increment; m_cell>=0; m_cell--)
710 for (n_cell=dz_increment; n_cell>=0; n_cell--)
716 const double indic_neighbour = ref_ijk_ft_->get_interface().I()(
index_i_ + l_dir_elem,
index_j_ + m_dir,
index_k_ + n_dir);
717 if (indic_neighbour > LIQUID_INDICATOR_TEST)
720 const double lmn_zero = (l > 0) ? 1. : 0.;
722 lmn_zero * (2 * (l_dir - 1) + 1) - (1. - lmn_zero);
723 const double dx_contrib = contrib_factor * dx_over_two;
724 const double dy_contrib = m_dir * dy;
725 const double dz_contrib = n_dir * dz;
726 Vecteur3 distance_contrib = {dx_contrib, dy_contrib, dz_contrib};
739 for (l_cell=dx_increment; l_cell>=0; l_cell--)
740 for (m=dy_over_two_increment + 1; m>=0; m--)
741 for (n_cell=dz_increment; n_cell>=0; n_cell--)
747 const double indic_neighbour = ref_ijk_ft_->get_interface().I()(
index_i_ + l_dir,
index_j_ + m_dir_elem,
index_k_ + n_dir);
748 if (indic_neighbour > LIQUID_INDICATOR_TEST)
751 const double lmn_zero = (m > 0) ? 1. : 0.;
753 lmn_zero * (2 * (m_dir - 1) + 1) - (1. - lmn_zero);
754 const double dx_contrib = l_dir * dx;
755 const double dy_contrib = contrib_factor * dy_over_two;
756 const double dz_contrib = n_dir * dz;
757 Vecteur3 distance_contrib = {dx_contrib, dy_contrib, dz_contrib};
770 for (l_cell=dx_increment; l_cell>=0; l_cell--)
771 for (m_cell=dy_increment; m_cell>=0; m_cell--)
772 for (n=dz_over_two_increment + 1; n>=0; n--)
778 const double indic_neighbour = ref_ijk_ft_->get_interface().I()(
index_i_ + l_dir,
index_j_ + m_dir,
index_k_ + n_dir_elem);
779 if (indic_neighbour > LIQUID_INDICATOR_TEST)
782 const double lmn_zero = (n > 0) ? 1. : 0.;
784 lmn_zero * (2 * (n_dir - 1) + 1) - (1. - lmn_zero);
785 const double dx_contrib = l_dir * dx;
786 const double dy_contrib = m_dir * dy;
787 const double dz_contrib = contrib_factor * dz_over_two;
788 Vecteur3 distance_contrib = {dx_contrib, dy_contrib, dz_contrib};
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.