TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
IJK_One_Dimensional_Subproblem_Geometry.cpp
1/****************************************************************************
2* Copyright (c) 2024, 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 <IJK_One_Dimensional_Subproblem_Geometry.h>
17#include <IJK_Navier_Stokes_tools.h>
18#include <Probleme_FTD_IJK.h>
19
20Implemente_instanciable_sans_constructeur( IJK_One_Dimensional_Subproblem_Geometry, "IJK_One_Dimensional_Subproblem_Geometry", Objet_U ) ;
21
22IJK_One_Dimensional_Subproblem_Geometry::IJK_One_Dimensional_Subproblem_Geometry()
23{
24 interfaces_ = nullptr;
25
27
32}
33
35{
36 Objet_U::printOn( os );
37 return os;
38}
39
41{
42 Objet_U::readOn( is );
43 return is;
44}
45
46//void IJK_One_Dimensional_Subproblem_Geometry::compute_interface_basis_vectors()
47//{
48// /*
49// * TODO: Associate a basis to each subproblem
50// * Use Rodrigues' rotation formula to determine ephi ?
51// * Needs an axis of (rotation gravity_dir x relative_vectors)
52// * and an angle (gravity_dir dot relative_vectors) / (norm(gravity_dir)*norm(relative_vectors))
53// * ephi is determined in the gravity_align rising direction
54// * | gravity_dir
55// * |
56// * *****
57// * *** ***
58// * ** **
59// * *** ***
60// * *****
61// * |
62// * |
63// */
64//
65// facet_barycentre_relative_ = facet_barycentre_ - bubble_barycentre_;
66// if (debug_)
67// {
68// Cerr << "bubble_barycentre_"<< bubble_barycentre_[0] << " ; " << bubble_barycentre_[1] << " ; " << bubble_barycentre_[2] << finl;
69// Cerr << "facet_barycentre_"<< facet_barycentre_[0] << " ; " << facet_barycentre_[1] << " ; " << facet_barycentre_[2] << finl;
70// Cerr << "facet_barycentre_relative_"<< facet_barycentre_relative_[0] << " ; " << facet_barycentre_relative_[1] << " ; " << facet_barycentre_relative_[2] << finl;
71// }
72// Vecteur3 facet_barycentre_relative_normed = facet_barycentre_relative_;
73// const double facet_barycentre_relative_norm = facet_barycentre_relative_normed.length();
74// facet_barycentre_relative_normed *= (1 / facet_barycentre_relative_norm);
75// Vecteur3 normal_contrib;
76// const double normal_vector_compo_norm = normal_vector_compo_.length();
77// normal_vector_compo_ *= (1 / normal_vector_compo_norm);
78//
79// if (debug_)
80// Cerr << "Normal vector norm:" << normal_vector_compo_norm << finl;
81// /*
82// * First method with tangential direction of maximum velocity variations
83// */
84// DoubleTab facet_barycentre(1, 3);
85// interfacial_velocity_compo_ = 0.;
86// for (int dir=0; dir<3; dir++)
87// facet_barycentre(0, dir) = facet_barycentre_[dir];
88// for (int dir=0; dir<3; dir++)
89// {
90// DoubleVect interfacial_velocity_component(1);
91// ijk_interpolate_skip_unknown_points((*velocity_)[dir], facet_barycentre, interfacial_velocity_component, INVALID_INTERP);
92// interfacial_velocity_compo_[dir] = interfacial_velocity_component[0];
93// }
94// if (interfacial_velocity_compo_.length() < INVALID_VELOCITY)
95// {
96// normal_contrib = normal_vector_compo_;
97// normal_contrib *= Vecteur3::produit_scalaire(facet_barycentre_relative_normed, normal_vector_compo_);
98// first_tangential_vector_compo_ = facet_barycentre_relative_normed - normal_contrib;
99// }
100// else
101// {
102// // Should I remove the rising velocity ?
103// interfacial_velocity_compo_ = interfacial_velocity_compo_ - bubble_rising_velocity_compo_;
104// normal_contrib = normal_vector_compo_;
105// normal_contrib *= Vecteur3::produit_scalaire(interfacial_velocity_compo_, normal_vector_compo_);
106// interfacial_tangential_velocity_compo_ = interfacial_velocity_compo_ - normal_contrib;
107// first_tangential_vector_compo_ = interfacial_tangential_velocity_compo_;
108// }
109// const double norm_first_tangential_vector = first_tangential_vector_compo_.length();
110// first_tangential_vector_compo_ *= (1 / norm_first_tangential_vector);
111// Vecteur3::produit_vectoriel(normal_vector_compo_, first_tangential_vector_compo_, second_tangential_vector_compo_);
112// const double norm_second_tangential_vector = second_tangential_vector_compo_.length();
113// second_tangential_vector_compo_ *= (1 / norm_second_tangential_vector);
114//
115// /*
116// * Second method with rising velocity
117// */
118// Vecteur3::produit_vectoriel(bubble_rising_vector_, facet_barycentre_relative_, azymuthal_vector_compo_raw_);
119//
120// azymuthal_vector_compo_ = azymuthal_vector_compo_raw_;
121// const double norm_azymuthal_vector_compo_raw_ = azymuthal_vector_compo_raw_.length();
122//// const int sign_vector = signbit(Vecteur3::produit_scalaire(bubble_rising_vector_, normal_vector_compo_));
123//// if (sign_vector)
124//// azymuthal_vector_compo_ *= -1;
125// azymuthal_vector_compo_ *= (1 / norm_azymuthal_vector_compo_raw_);
126//
127// normal_contrib = normal_vector_compo_;
128// normal_contrib *= Vecteur3::produit_scalaire(azymuthal_vector_compo_, normal_vector_compo_);
129// azymuthal_vector_compo_ = azymuthal_vector_compo_ - normal_contrib;
130// Vecteur3::produit_vectoriel(azymuthal_vector_compo_, normal_vector_compo_, first_tangential_vector_compo_from_rising_dir_);
131// const double norm_first_tangential_vector_from_rising_dir = first_tangential_vector_compo_from_rising_dir_.length();
132// first_tangential_vector_compo_from_rising_dir_ *= (1 / norm_first_tangential_vector_from_rising_dir);
133//
134//
135// if (tangential_from_rising_vel_)
136// {
137// first_tangential_vector_compo_solver_ = &first_tangential_vector_compo_from_rising_dir_;
138// second_tangential_vector_compo_solver_ = &azymuthal_vector_compo_;
139// first_tangential_velocity_solver_ = &first_tangential_velocity_from_rising_dir_corrected_;
140// second_tangential_velocity_solver_ = &azymuthal_velocity_corrected_;
141// tangential_temperature_gradient_first_solver_ = &tangential_temperature_gradient_first_from_rising_dir_;
142// tangential_temperature_gradient_second_solver_ = &azymuthal_temperature_gradient_;
143// }
144// else
145// {
146// // By default
147// first_tangential_vector_compo_solver_= &first_tangential_vector_compo_;
148// second_tangential_vector_compo_solver_ = &second_tangential_vector_compo_;
149// first_tangential_velocity_solver_ = &first_tangential_velocity_corrected_;
150// second_tangential_velocity_solver_ = &second_tangential_velocity_corrected_;
151// tangential_temperature_gradient_first_solver_ = &tangential_temperature_gradient_first_;
152// tangential_temperature_gradient_second_solver_ = &tangential_temperature_gradient_second_;
153// }
154//}
155//
156//void IJK_One_Dimensional_Subproblem_Geometry::compute_pure_spherical_basis_vectors()
157//{
158// /*
159// * FIXME: It is align with gravity z but it should be modified to be align with the gravity dir ?
160// */
161// if (debug_)
162// Cerr << "r_sph_ calculation" << finl;
163// r_sph_ = sqrt(facet_barycentre_relative_[0] * facet_barycentre_relative_[0]
164// + facet_barycentre_relative_[1] * facet_barycentre_relative_[1]
165// + facet_barycentre_relative_[2] * facet_barycentre_relative_[2]);
166// if (debug_)
167// {
168// Cerr << "r_sph_ = " << r_sph_ << finl;
169// Cerr << "theta_sph_ calculation" << finl;
170// }
171//
172//// theta_sph_ = atan(sqrt(facet_barycentre_relative_[0] * facet_barycentre_relative_[0]
173//// + facet_barycentre_relative_[1] * facet_barycentre_relative_[1])/ facet_barycentre_relative_[2]);
174// theta_sph_ = atan2(sqrt(facet_barycentre_relative_[0] * facet_barycentre_relative_[0]
175// + facet_barycentre_relative_[1] * facet_barycentre_relative_[1]), facet_barycentre_relative_[2]);
176// const double atan_theta_incr_ini = M_PI / 2;
177// const double atan_incr_factor = -1;
178// theta_sph_ = (theta_sph_ - atan_theta_incr_ini) * atan_incr_factor;
179//
180// if (debug_)
181// {
182// Cerr << "theta_sph_ = " << theta_sph_ << finl;
183// Cerr << "phi_sph_ calculation" << finl;
184// }
185// phi_sph_ = atan2(facet_barycentre_relative_[1], facet_barycentre_relative_[0]);
186//
187// if (debug_)
188// {
189// Cerr << "phi_sph_ = " << phi_sph_ << finl;
190// Cerr << "er_sph_ calculation" << finl;
191// }
192// for (int dir=0; dir<3; dir++)
193// er_sph_[dir] = facet_barycentre_relative_[dir] / r_sph_;
194//
195// const double length = sqrt(facet_barycentre_relative_[0] * facet_barycentre_relative_[0]
196// + facet_barycentre_relative_[1] * facet_barycentre_relative_[1]);
197//
198// if (debug_)
199// {
200// Cerr << "er_sph_ = " << er_sph_[0] << finl;
201// Cerr << "etheta_sph_ calculation" << finl;
202// }
203// for (int dir=0; dir<2; dir++)
204// etheta_sph_[dir] = facet_barycentre_relative_[dir] * facet_barycentre_relative_[2] / (r_sph_ * length);
205// etheta_sph_[2] = - facet_barycentre_relative_[2] * length / r_sph_;
206//
207// ephi_sph_ = {0., 0., 0.};
208// ephi_sph_[0] = - facet_barycentre_relative_[1];
209// ephi_sph_[1] = facet_barycentre_relative_[0];
210//}
211//
212//void IJK_One_Dimensional_Subproblem::compute_local_discretisation()
213//{
214// int i;
215// if (global_probes_characteristics_)
216// {
217// if (!probe_variations_enabled_)
218// {
219// if (!velocities_calculation_counter_)
220// {
221// radial_coordinates_ = radial_coordinates_base_;
222// dr_ = *dr_base_;
223// }
224// }
225// else
226// {
227// dr_ = probe_length_ / (*points_per_thermal_subproblem_ - 1);
228// radial_coordinates_modified_.resize(*points_per_thermal_subproblem_);
229// for (i=0; i < *points_per_thermal_subproblem_; i++)
230// radial_coordinates_modified_(i) = i * dr_;
231// radial_coordinates_ = &radial_coordinates_modified_;
232// }
233// }
234// else
235// {
236// /*
237// * coeff_distance_diagonal_ as well as
238// * points_per_thermal_subproblem_ could be adapted
239// */
240// if (!probe_variations_enabled_)
241// radial_coordinates_modified_.resize(*points_per_thermal_subproblem_);
242// dr_ = probe_length_ / (*points_per_thermal_subproblem_ - 1);
243// for (i=0; i < *points_per_thermal_subproblem_; i++)
244// radial_coordinates_modified_(i) = i * dr_;
245// radial_coordinates_ = &radial_coordinates_modified_;
246// }
247// /*
248// * Following attributes differ anyway !
249// */
250// if (!velocities_calculation_counter_ || probe_variations_enabled_)
251// {
252// dr_inv_ = 1 / dr_;
253// osculating_radial_coordinates_ = (*radial_coordinates_);
254// osculating_radial_coordinates_ += osculating_radius_;
255// if (!probe_variations_enabled_)
256// {
257// radial_coordinates_cartesian_compo_.resize(*points_per_thermal_subproblem_, 3);
258// coordinates_cartesian_compo_.resize(*points_per_thermal_subproblem_, 3);
259// osculating_radial_coordinates_cartesian_compo_.resize(*points_per_thermal_subproblem_, 3);
260// osculating_radial_coordinates_inv_.resize(*points_per_thermal_subproblem_);
261// }
262// for (i=0; i < *points_per_thermal_subproblem_; i++)
263// {
264// osculating_radial_coordinates_inv_[i] = 1 / osculating_radial_coordinates_[i];
265// for (int dir=0; dir<3; dir++)
266// {
267// radial_coordinates_cartesian_compo_(i, dir) = (*radial_coordinates_)(i) * normal_vector_compo_[dir];
268// osculating_radial_coordinates_cartesian_compo_(i, dir) = osculating_radial_coordinates_(i) * normal_vector_compo_[dir];
269// coordinates_cartesian_compo_(i, dir) = radial_coordinates_cartesian_compo_(i, dir) + facet_barycentre_[dir];
270// }
271// }
272// }
273//}
274
276{
278 const IJK_Field_double& indicator = interfaces_->I();
279 ijk_interpolate_skip_unknown_points(indicator, coordinates_cartesian_compo_, indicator_interp_, INVALID_INTERP);
281 {
282 for (int i=(*points_per_thermal_subproblem_)-1; i>=0; i--)
283 {
284 const double indic_last = find_cell_related_indicator_on_probes(i);
285 if (indic_last > LIQUID_INDICATOR_TEST)
286 {
288 return;
289 }
290 disable_probe_collision_ = (i == 0);
291 }
292 }
293 else
294 {
296 {
297
298 const int last_index = (*points_per_thermal_subproblem_) - 1;
299 const double indic_last = find_cell_related_indicator_on_probes(last_index);
300 if (indic_last < LIQUID_INDICATOR_TEST)
301 {
303 return;
304 }
305 }
306 else
307 {
308 for (int i=(*points_per_thermal_subproblem_)-1; i>=0; i--)
309 {
310 const double indicator_val = indicator_interp_(i);
311 if (indicator_val < LIQUID_INDICATOR_TEST)
312 {
314 return;
315 }
316 }
317 }
318 }
319}
320
322{
323 const IJK_Field_double& indicator = interfaces_->I();
324 const Domaine_IJK& geom = ref_ijk_ft_->get_domaine();
325
326 const double dx = geom.get_constant_delta(DIRECTION_I);
327 const double dy = geom.get_constant_delta(DIRECTION_J);
328 const double dz = geom.get_constant_delta(DIRECTION_K);
329 Vecteur3 xyz_cart_end = {coordinates_cartesian_compo_(last_index, 0),
330 coordinates_cartesian_compo_(last_index, 1),
331 coordinates_cartesian_compo_(last_index, 2)
332 };
333 Vecteur3 centre_elem = ref_ijk_ft_->get_domaine().get_coords_of_dof(index_i_, index_j_, index_k_, Domaine_IJK::ELEM);
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
340 };
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,
351 index_j_ + real_offset_y,
352 index_k_ + real_offset_z);
353 return indic_last;
354}
355
357{
359 {
360 Vecteur3 centre = ref_ijk_ft_->get_domaine().get_coords_of_dof(index_i_, index_j_, index_k_, Domaine_IJK::ELEM);
361
362 Vecteur3 facet_to_cell_centre = facet_barycentre_;
363 facet_to_cell_centre *= -1;
364 facet_to_cell_centre += centre;
366
367 Vecteur3 normal_contrib = normal_vector_compo_;
368 normal_contrib *= cell_centre_distance_;
369 Vecteur3 tangential_displacement = normal_contrib;
370 tangential_displacement *= (-1);
371 tangential_displacement += facet_to_cell_centre;
372 cell_centre_tangential_distance_ = tangential_displacement.length();
373 tangential_distance_vector_ = tangential_displacement;
377 }
378 else if (debug_)
379 Cerr << "Cell centre distances have already been computed" << finl;
380}
381
383{
385 {
386 Vecteur3 bary_face {0., 0., .0};
387 Vecteur3 vector_relative {0., 0., 0.};
388 Vecteur3 bary_vertex {0., 0., 0.};
389 int face_dir[6] = FACES_DIR;
390 int m;
391 for (int l=0; l<6; l++)
392 {
393 const int ii = NEIGHBOURS_I[l];
394 const int jj = NEIGHBOURS_J[l];
395 const int kk = NEIGHBOURS_K[l];
396 const double indic_neighbour = ref_ijk_ft_->get_interface().I()(index_i_+ii, index_j_+jj, index_k_+kk);
397 if (fabs(indic_neighbour) > LIQUID_INDICATOR_TEST)
398 {
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];
403 if (ii)
404 bary_face = ref_ijk_ft_->get_domaine().get_coords_of_dof(index_i_+ii_f, index_j_+jj_f, index_k_+kk_f, Domaine_IJK::FACES_I);
405 if (jj)
406 bary_face = ref_ijk_ft_->get_domaine().get_coords_of_dof(index_i_+ii_f, index_j_+jj_f, index_k_+kk_f, Domaine_IJK::FACES_J);
407 if (kk)
408 bary_face = ref_ijk_ft_->get_domaine().get_coords_of_dof(index_i_+ii_f, index_j_+jj_f, index_k_+kk_f, Domaine_IJK::FACES_K);
409
410 // Normal distance
411 vector_relative = facet_barycentre_;
412 vector_relative *= (-1);
413 vector_relative += bary_face;
414 {
415 const double distance_face_centre = Vecteur3::produit_scalaire(vector_relative, normal_vector_compo_);
416 face_centres_distance_[l] = distance_face_centre;
417 // Tangential distance
418 Vecteur3 normal_contrib = normal_vector_compo_;
419 normal_contrib *= distance_face_centre;
420 Vecteur3 tangential_displacement = normal_contrib;
421 tangential_displacement *= (-1);
422 tangential_displacement += vector_relative;
423 face_centres_tangential_distance_[l] = tangential_displacement.length();
425 tangential_displacement *= (1 / face_centres_tangential_distance_[l]);
426 face_tangential_distance_vector_[l] = tangential_displacement;
427 }
428 // Distance to vertex
429 for (m=0; m<4; m++)
430 {
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;
436 face_dir[l],
437 bary_vertex,
438 distance_vertex_centre,
439 tangential_distance_vertex_centre,
440 tangential_distance_vector_vertex_centre);
441 vertices_centres_distance_[l][m] = distance_vertex_centre;
442 vertices_centres_tangential_distance_[l][m] = tangential_distance_vertex_centre;
443 vertices_tangential_distance_vector_[l][m] = tangential_distance_vector_vertex_centre;
444 }
445 }
446 else
447 {
451 face_tangential_distance_vector_[l] = {0., 0., 0.};
452 for (m=0; m<4; m++)
453 {
456 vertices_tangential_distance_vector_[l][m] = {0., 0., 0.};
457 }
458 }
459 }
461 }
462 else if (debug_)
463 Cerr << "Cell face distances have already been computed" << finl;
464}
465
467 const int& face_dir,
468 Vecteur3& bary_vertex,
469 double& distance_vertex_centre,
470 double& tangential_distance_vertex_centre,
471 Vecteur3& tangential_distance_vector_vertex_centre)
472{
473 const Domaine_IJK& geom = ref_ijk_ft_->get_domaine();
474 const double dx = geom.get_constant_delta(DIRECTION_I);
475 const double dy = geom.get_constant_delta(DIRECTION_J);
476 const double dz = geom.get_constant_delta(DIRECTION_K);
477 const double neighbours_first_dir[4] = NEIGHBOURS_FIRST_DIR;
478 const double neighbours_second_dir[4] = NEIGHBOURS_SECOND_DIR;
479 Vecteur3 point_coords {0., 0., 0.};
480 double dl1;
481 double dl2;
482 switch(face_dir)
483 {
484 case 0:
485 dl1 = dy / 2.;
486 dl2 = dz / 2.;
487 point_coords[1] = dl1 * neighbours_first_dir[vertex_number];
488 point_coords[2] = dl2 * neighbours_second_dir[vertex_number];
489 break;
490 case 1:
491 dl1 = dx / 2.;
492 dl2 = dz / 2.;
493 point_coords[0] = dl1 * neighbours_first_dir[vertex_number];
494 point_coords[2] = dl2 * neighbours_second_dir[vertex_number];
495 break;
496 case 2:
497 dl1 = dx / 2.;
498 dl2 = dy / 2.;
499 point_coords[0] = dl1 * neighbours_first_dir[vertex_number];
500 point_coords[1] = dl2 * neighbours_second_dir[vertex_number];
501 break;
502 default:
503 dl1 = dx / 2.;
504 dl2 = dy / 2.;
505 point_coords[0] = dl1 * neighbours_first_dir[vertex_number];
506 point_coords[1] = dl2 * neighbours_second_dir[vertex_number];
507 break;
508 }
509 bary_vertex += point_coords;
510 distance_vertex_centre = Vecteur3::produit_scalaire(bary_vertex, normal_vector_compo_);
511 Vecteur3 tangential_distance_vector = normal_vector_compo_;
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;
519}
520
522{
523 const Domaine_IJK& geom = ref_ijk_ft_->get_domaine();
524 const double dx = geom.get_constant_delta(DIRECTION_I);
525 const double dy = geom.get_constant_delta(DIRECTION_J);
526 const double dz = geom.get_constant_delta(DIRECTION_K);
527 int l, m, n;
528
529 int dxyz_increment_max = get_dxyz_increment_max();
530 /*
531 * 8-1 values for one neighbour in each dir... (Too much, enhance later)
532 * Positive OR Negative dir depending on the normal vector
533 */
534 pure_neighbours_to_correct_.resize(dxyz_increment_max + 1);
535 pure_neighbours_corrected_distance_.resize(dxyz_increment_max + 1);
537 pure_neighbours_corrected_colinearity_.resize(dxyz_increment_max + 1);
538 for (l=dxyz_increment_max; l>=0; l--)
539 {
540 pure_neighbours_to_correct_[l].resize(dxyz_increment_max + 1);
541 pure_neighbours_corrected_distance_[l].resize(dxyz_increment_max + 1);
543 pure_neighbours_corrected_colinearity_[l].resize(dxyz_increment_max + 1);
544 for (m=dxyz_increment_max; m>=0; m--)
545 {
546 pure_neighbours_to_correct_[l][m].resize(dxyz_increment_max + 1);
547 pure_neighbours_corrected_distance_[l][m].resize(dxyz_increment_max + 1);
549 pure_neighbours_corrected_colinearity_[l][m].resize(dxyz_increment_max + 1);
550 for (n=dxyz_increment_max; n>=0; n--)
551 {
552 pure_neighbours_to_correct_[l][m][n] = false;
556 }
557 }
558 }
559
560 // get_maximum_remaining_distance()
561 double remaining_distance_diag = probe_length_ - cell_centre_distance_;
562 Vecteur3 remaining_distance_diag_projected = normal_vector_compo_;
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);
570 {
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);
574 }
575 dxyz_increment_bool_ = (dx_increment || dy_increment || dz_increment);
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)
580 {
581 const int l_dir = (pure_neighbours_corrected_sign_[0]) ? l * (-1) : l;
582 const int m_dir = (pure_neighbours_corrected_sign_[1]) ? m * (-1) : m;
583 const int n_dir = (pure_neighbours_corrected_sign_[2]) ? n * (-1) : n;
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)
586 {
587 pure_neighbours_to_correct_[l][m][n] = true;
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};
595 {
596 const double colinearity = compute_cell_weighting(dx_contrib, dy_contrib, dz_contrib);
597 pure_neighbours_corrected_colinearity_[l][m][n] = colinearity;
598 }
599 }
600 }
601}
602
604 const double& dy_contrib,
605 const double& dz_contrib)
606{
608 return compute_colinearity(dx_contrib, dy_contrib, dz_contrib);
610 return compute_distance_cell_faces(dx_contrib, dy_contrib, dz_contrib);
612 return compute_colinearity(dx_contrib, dy_contrib, dz_contrib) * compute_distance_cell_faces(dx_contrib, dy_contrib, dz_contrib);
613 return 1;
614}
615
617{
618 const Domaine_IJK& geom = ref_ijk_ft_->get_domaine();
619 const double dx = geom.get_constant_delta(DIRECTION_I);
620 const double dy = geom.get_constant_delta(DIRECTION_J);
621 const double dz = geom.get_constant_delta(DIRECTION_K);
622 const double dx_over_two = dx / 2.;
623 const double dy_over_two = dy / 2.;
624 const double dz_over_two = dz / 2.;
625 int l, m, n;
626 int l_cell, m_cell, n_cell;
627
628 int dxyz_increment_max = get_dxyz_increment_max();
629 int dxyz_over_two_increment_max = get_dxyz_over_two_increment_max();
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};
633
634 /*
635 * 8-1 values for one neighbour in each dir... (Too much, enhance later)
636 * Positive OR Negative dir depending on the normal vector
637 */
642 for (int c=0; c<3; c++)
643 {
644 const int first_incr = first_increment[c];
645 const int second_incr = second_increment[c];
646 const int third_incr = third_increment[c];
647 pure_neighbours_last_faces_to_correct_[c].resize(first_incr + 1);
648 pure_neighbours_last_faces_corrected_distance_[c].resize(first_incr + 1);
651 for (l=first_incr; l>=0; l--)
652 {
653 pure_neighbours_last_faces_to_correct_[c][l].resize(second_incr + 1);
654 pure_neighbours_last_faces_corrected_distance_[c][l].resize(second_incr + 1);
656 pure_neighbours_last_faces_corrected_colinearity_[c][l].resize(second_incr + 1);
657 for (m=second_incr; m>=0; m--)
658 {
659 pure_neighbours_last_faces_to_correct_[c][l][m].resize(third_incr + 1);
660 pure_neighbours_last_faces_corrected_distance_[c][l][m].resize(third_incr + 1);
662 pure_neighbours_last_faces_corrected_colinearity_[c][l][m].resize(third_incr + 1);
663 for (n=third_incr; n>=0; n--)
664 {
665 pure_neighbours_last_faces_to_correct_[c][l][m][n] = false;
669 }
670 }
671 }
672 }
673
674 double remaining_distance_diag = probe_length_ - cell_centre_distance_;
675 Vecteur3 remaining_distance_diag_projected = normal_vector_compo_;
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;
689 {
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);
696 }
697 dxyz_over_two_increment_bool_ = (dx_over_two_increment >0 || dy_over_two_increment>0 || dz_over_two_increment >0 );
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--;
704
705 /*
706 * TODO: Should we look to cells faces that are not in the normal vector direction ?
707 */
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--)
711 {
712 const int l_dir = (pure_neighbours_corrected_sign_[0]) ? l * (-1) + 1 : l;
713 const int m_dir = (pure_neighbours_corrected_sign_[1]) ? m_cell * (-1) : m_cell;
714 const int n_dir = (pure_neighbours_corrected_sign_[2]) ? n_cell * (-1) : n_cell;
715 const int l_dir_elem = (pure_neighbours_corrected_sign_[0]) ? (l + 1) * (-1) + 1 : l;
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)
718 {
719 pure_neighbours_last_faces_to_correct_[0][l][m_cell][n_cell] = true;
720 const double lmn_zero = (l > 0) ? 1. : 0.;
721 const double contrib_factor = (pure_neighbours_corrected_sign_[0]) ? (lmn_zero * (2 * abs(l_dir) + 1) - (1. - lmn_zero)) * (-1):
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};
729 if (pure_neighbours_last_faces_corrected_distance_[0][l][m_cell][n_cell] < 0)
730 pure_neighbours_last_faces_to_correct_[0][l][m_cell][n_cell] = false;
732 {
733 const double colinearity = compute_cell_faces_weighting(dx_contrib, dy_contrib, dz_contrib, 0);
734 pure_neighbours_last_faces_corrected_colinearity_[0][l][m_cell][n_cell] = colinearity;
735 }
736 }
737 }
738
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--)
742 {
743 const int l_dir = (pure_neighbours_corrected_sign_[0]) ? l_cell * (-1) : l_cell;
744 const int m_dir = (pure_neighbours_corrected_sign_[1]) ? m * (-1) + 1: m;
745 const int n_dir = (pure_neighbours_corrected_sign_[2]) ? n_cell * (-1) : n_cell;
746 const int m_dir_elem = (pure_neighbours_corrected_sign_[1]) ? (m + 1) * (-1) + 1 : m;
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)
749 {
750 pure_neighbours_last_faces_to_correct_[1][l_cell][m][n_cell] = true;
751 const double lmn_zero = (m > 0) ? 1. : 0.;
752 const double contrib_factor = (pure_neighbours_corrected_sign_[1]) ? (lmn_zero * (2 * abs(m_dir) + 1) - (1. - lmn_zero)) * (-1):
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};
760 if (pure_neighbours_last_faces_corrected_distance_[1][l_cell][m][n_cell] < 0)
761 pure_neighbours_last_faces_to_correct_[1][l_cell][m][n_cell] = false;
763 {
764 const double colinearity = compute_cell_faces_weighting(dx_contrib, dy_contrib, dz_contrib, 1);
765 pure_neighbours_last_faces_corrected_colinearity_[1][l_cell][m][n_cell] = colinearity;
766 }
767 }
768 }
769
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--)
773 {
774 const int l_dir = (pure_neighbours_corrected_sign_[0]) ? l_cell * (-1) : l_cell;
775 const int m_dir = (pure_neighbours_corrected_sign_[1]) ? m_cell * (-1) : m_cell;
776 const int n_dir = (pure_neighbours_corrected_sign_[2]) ? n * (-1) + 1: n;
777 const int n_dir_elem = (pure_neighbours_corrected_sign_[2]) ? (n + 1) * (-1) + 1 : 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)
780 {
781 pure_neighbours_last_faces_to_correct_[2][l_cell][m_cell][n] = true;
782 const double lmn_zero = (n > 0) ? 1. : 0.;
783 const double contrib_factor = (pure_neighbours_corrected_sign_[2]) ? (lmn_zero * (2 * abs(n_dir) + 1) - (1. - lmn_zero)) * (-1):
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};
791 if (pure_neighbours_last_faces_corrected_distance_[2][l_cell][m_cell][n] < 0)
792 pure_neighbours_last_faces_to_correct_[2][l_cell][m_cell][n] = false;
794 {
795 const double colinearity = compute_cell_faces_weighting(dx_contrib, dy_contrib, dz_contrib, 2);
796 pure_neighbours_last_faces_corrected_colinearity_[2][l_cell][m_cell][n] = colinearity;
797 }
798 }
799 }
800}
801
803 const double& dy_contrib,
804 const double& dz_contrib,
805 const int& dir)
806{
808 return compute_colinearity(dx_contrib, dy_contrib, dz_contrib);
810 return compute_colinearity_cell_faces(dx_contrib, dy_contrib, dz_contrib, dir);
812 return compute_distance_cell_faces(dx_contrib, dy_contrib, dz_contrib);
814 return compute_colinearity(dx_contrib, dy_contrib, dz_contrib) * compute_distance_cell_faces(dx_contrib, dy_contrib, dz_contrib);
816 return compute_colinearity_cell_faces(dx_contrib, dy_contrib, dz_contrib, dir) * compute_distance_cell_faces(dx_contrib, dy_contrib, dz_contrib);
817 return 1;
818}
819
821 const double& dy_contrib,
822 const double& dz_contrib)
823{
824 Vecteur3 relative_vector = normal_vector_compo_;
825 relative_vector *= cell_centre_distance_;
826 Vecteur3 tangential_relative_vector = tangential_distance_vector_;
827 tangential_relative_vector *= cell_centre_tangential_distance_;
828 relative_vector += tangential_relative_vector;
829 Vecteur3 dxyz_contrib = {dx_contrib, dy_contrib, dz_contrib};
830 relative_vector += dxyz_contrib;
831 return relative_vector;
832}
833
835 const double& dy_contrib,
836 const double& dz_contrib)
837{
838 Vecteur3 relative_vector = compute_relative_vector_cell_faces(dx_contrib, dy_contrib, dz_contrib);
839 const double relative_vector_norm = relative_vector.length();
840 relative_vector *= (1 / relative_vector_norm);
841 const double colinearity = Vecteur3::produit_scalaire(normal_vector_compo_, relative_vector);
842 return abs(colinearity);
843}
844
846 const double& dy_contrib,
847 const double& dz_contrib,
848 const int& dir)
849{
850 Vecteur3 relative_vector = compute_relative_vector_cell_faces(dx_contrib, dy_contrib, dz_contrib);
851 const double relative_vector_norm = relative_vector.length();
852 relative_vector *= (1 / relative_vector_norm);
853 return abs(relative_vector[dir]);
854}
855
857 const double& dy_contrib,
858 const double& dz_contrib)
859{
860 Vecteur3 relative_vector = compute_relative_vector_cell_faces(dx_contrib, dy_contrib, dz_contrib);
861 const double distance = Vecteur3::produit_scalaire(tangential_distance_vector_, relative_vector);
862 return abs(1 / (distance + 1e-16));
863}
864
866{
867 const Domaine_IJK& geom = ref_ijk_ft_->get_domaine();
868 const double dx = geom.get_constant_delta(DIRECTION_I);
869 const double dy = geom.get_constant_delta(DIRECTION_J);
870 const double dz = geom.get_constant_delta(DIRECTION_K);
871
872 int dxyz_increment_max;
874 {
875 const int dx_increment_max = (int) ((dx + probe_length_) / dx);
876 const int dy_increment_max = (int) ((dy + probe_length_) / dy);
877 const int dz_increment_max = (int) ((dz + probe_length_) / dz);
878 dxyz_increment_max = std::max(std::max(dx_increment_max, dy_increment_max), dz_increment_max);
879 }
880 else
881 {
882 dxyz_increment_max = neighbours_corrected_rank_;
883 }
884 return dxyz_increment_max;
885}
886
888{
889 const Domaine_IJK& geom = ref_ijk_ft_->get_domaine();
890 const double dx = geom.get_constant_delta(DIRECTION_I);
891 const double dy = geom.get_constant_delta(DIRECTION_J);
892 const double dz = geom.get_constant_delta(DIRECTION_K);
893
894 int dxyz_over_two_increment_max;
896 {
897 const int dx_increment_max = (int) ((probe_length_ + dx) / (dx / 2.));
898 const int dy_increment_max = (int) ((probe_length_ + dy) / (dy / 2.));
899 const int dz_increment_max = (int) ((probe_length_ + dz) / (dz / 2.));
900 dxyz_over_two_increment_max = std::max(std::max(dx_increment_max, dy_increment_max), dz_increment_max);
901 }
902 else
903 {
904 dxyz_over_two_increment_max = neighbours_face_corrected_rank_;
905 }
906 return dxyz_over_two_increment_max;
907}
908
910 int& dy_remaining,
911 int& dz_remaining)
912{
913 double remaining_distance_diag = probe_length_ - cell_centre_distance_;
914 Vecteur3 remaining_distance_diag_projected = normal_vector_compo_;
915 dx_remaining = (int) (remaining_distance_diag / remaining_distance_diag_projected[0]);
916 dy_remaining = (int) (remaining_distance_diag / remaining_distance_diag_projected[1]);
917 dz_remaining = (int) (remaining_distance_diag / remaining_distance_diag_projected[2]);
918}
919
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
Definition Domaine_IJK.h:47
double get_constant_delta(int direction) const
Returns the size of cells in a direction.
Class defining operators and methods for all reading operation in an input flow (file,...
Definition Entree.h:42
FixedVector< FixedVector< double, 4 >, 6 > vertices_centres_distance_
double compute_distance_cell_faces(const double &dx_contrib, const double &dy_contrib, const double &dz_contrib)
FixedVector< FixedVector< double, 4 >, 6 > vertices_centres_tangential_distance_
std::vector< std::vector< std::vector< std::vector< double > > > > pure_neighbours_last_faces_corrected_distance_
double compute_cell_faces_weighting(const double &dx_contrib, const double &dy_contrib, const double &dz_contrib, const int &dir)
void compute_vertex_position(const int &vertex_number, const int &face_dir, Vecteur3 &bary_vertex, double &distance_vertex_centre, double &tangential_distance_vertex_centre, Vecteur3 &tangential_distance_vector_vertex_centre)
std::vector< std::vector< std::vector< double > > > pure_neighbours_corrected_distance_
std::vector< std::vector< std::vector< std::vector< double > > > > pure_neighbours_last_faces_corrected_colinearity_
double compute_cell_weighting(const double &dx_contrib, const double &dy_contrib, const double &dz_contrib)
FixedVector< FixedVector< Vecteur3, 4 >, 6 > vertices_tangential_distance_vector_
Vecteur3 compute_relative_vector_cell_faces(const double &dx_contrib, const double &dy_contrib, const double &dz_contrib)
double compute_colinearity_cell_faces(const double &dx_contrib, const double &dy_contrib, const double &dz_contrib, const int &dir)
double compute_colinearity(const double &dx_contrib, const double &dy_contrib, const double &dz_contrib)
std::vector< std::vector< std::vector< double > > > pure_neighbours_corrected_colinearity_
std::vector< std::vector< std::vector< std::vector< bool > > > > pure_neighbours_last_faces_to_correct_
void get_maximum_remaining_distance(int &dx_remaining, int &dy_remaining, int &dz_remaining)
std::vector< std::vector< std::vector< bool > > > pure_neighbours_to_correct_
classe Objet_U Cette classe est la classe de base des Objets de TRUST
Definition Objet_U.h:73
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
Definition Objet_U.cpp:293
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
Definition Objet_U.cpp:282
Classe de base des flux de sortie.
Definition Sortie.h:52
static double produit_scalaire(const Vecteur3 &x, const Vecteur3 &y)
double length() const
Definition Vecteur3.h:51