TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
SurfaceVapeurIJKComputation.cpp
1/****************************************************************************
2* Copyright (c) 2015 - 2016, 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 <SurfaceVapeurIJKComputation.h>
17
18
20{
21 maillage_bulles_med_ = MEDCouplingUMesh::New("bubbles_surf_mesh", 2);
22 desactive_med_ = true;
24 ref_domaine_ = splitting;
25}
26
28 MEDCouplingUMesh *maillage_bulles_mcu,
29 const Maillage_FT_IJK& maillage_bulles_ft_ijk)
30{
31 const int nbOfNodes = maillage_bulles_ft_ijk.nb_sommets();
32 // Cerr << "nbre de sommet : " << nbOfNodes << finl;
33
34 // Setting nodes coordinates of maillage_bulles_mcu
35 auto coo_ptr = maillage_bulles_ft_ijk.sommets().addr();
36 DAD coordsArr = DataArrayDouble::New();
37 coordsArr->useArray(coo_ptr, false, MEDCoupling::DeallocType::CPP_DEALLOC, nbOfNodes, 3);
38 maillage_bulles_mcu->setCoords(coordsArr);
39
40 // Setting connectivity of maillage_bulles_mcu
41 // getting connectivity from facettes
42 const auto nbFacettes = maillage_bulles_ft_ijk.nb_facettes();
43 const auto connectivity = maillage_bulles_ft_ijk.facettes();
44 MCT mcu_connectivity = DataArrayIdType::New();
45 mcu_connectivity->alloc(4 * nbFacettes, 1);
46 auto mcu_connectivity_ptr = mcu_connectivity->getPointer();
47 MCT mc_conn_idx = DataArrayIdType::New();
48 mc_conn_idx->alloc(nbFacettes + 1, 1);
49 auto mc_conn_idx_ptr = mc_conn_idx->getPointer();
50 for (int ifa7 = 0; ifa7 < nbFacettes; ifa7++)
51 {
52 mcu_connectivity_ptr[4 * ifa7] = 3;
53 mcu_connectivity_ptr[4 * ifa7 + 1] = connectivity(ifa7, 0);
54 mcu_connectivity_ptr[4 * ifa7 + 2] = connectivity(ifa7, 1);
55 mcu_connectivity_ptr[4 * ifa7 + 3] = connectivity(ifa7, 2);
56 mc_conn_idx_ptr[ifa7] = 4 * ifa7;
57 }
58 mc_conn_idx_ptr[nbFacettes] = 4 * nbFacettes;
59 maillage_bulles_mcu->setConnectivity(mcu_connectivity, mc_conn_idx, true);
60 /* MCT no_use3 =*/ maillage_bulles_mcu->zipConnectivityTraducer(0);
61 /*MCT do_not_use5 =*/ maillage_bulles_mcu->zipCoordsTraducer();
62}
63
65{
67 // const char fileName[] = "testExample_MEDCouplingFieldDouble_WriteVTK.vtk";
68 // test sur le maillage
69 Cerr << "Le maillage MED est de taille " << maillage_bulles_med_->getNumberOfNodes() << finl;
70 const auto coords = maillage_bulles_med_->getCoords();
71 for (int x = 0; x < 3; x++)
72 {
73 double mini = 100000000;
74 double maxi = -100000000;
75 for (int c = 0; c < coords->getNumberOfTuples(); c++)
76 {
77 const auto val = coords->getIJ(c, x);
78 if (val < mini)
79 mini = val;
80 if (val > maxi)
81 maxi = val;
82 }
83 Cout << "coord min dans la direction " << x << " : " << mini << finl;
84 Cout << "coord max dans la direction " << x << " : " << maxi << finl;
85 }
86 /* MCT do_not_use = */ maillage_bulles_med_->convertDegeneratedCellsAndRemoveFlatOnes();
87 auto connectivity = maillage_bulles_med_->getNodalConnectivity();
88 const int nb_compo = static_cast<int>(connectivity->getNumberOfComponents());
89 Cerr << "Connectivity mesh bulles : " << finl;
90 Cerr << "Nb nodes : " << connectivity->getNumberOfTuples() << finl;
91 Cerr << "Nb compo : " << nb_compo << finl;
92 print_umesh_conn(connectivity);
93 // Cerr << "Connectivity bis" << finl;
94 // for (unsigned int comp = 0; comp < static_cast<int>(connectivity->getNumberOfComponents());
95 // comp++) {
96 // Cerr << " [ ";
97 // for (int c = 0; c < connectivity->getNumberOfTuples(); c++) {
98 // Cerr << connectivity->getIJ(c, comp) << ", ";
99 // }
100 // Cerr << "]" << finl;
101 // }
102 maillage_bulles_med_->checkConsistencyLight();
103 // maillage_bulles_med_->writeVTK(fileName, true);
104 // Cout << "Le maillage a probablement ete ecrit qq part" << finl;
105}
106
108 const double intersect_pt,
109 const int dim,
110 DataArrayIdType *cutcellsid,
111 bool& plan_cut_some_bubble,
112 MCU& mesh1dfil) const
113{
114 double intersect[3] = {0., 0., 0.};
115 double vect_norm[3] = {0., 0., 0.};
116 intersect[dim] = intersect_pt;
117 vect_norm[dim] = 1.;
118 std::vector<int> COO2KEEP(2);
119 get_coo_to_keep(dim, COO2KEEP);
120
121 // Création du maillage filaire coupé
122 //std::vector<int> selected_dims {dim};
123 // MEDCouplingUMesh * mesh1dfil;
124 try
125 {
126 mesh1dfil = maillage_bulles_med_->buildSlice3DSurf(intersect, vect_norm, 10.e-8, cutcellsid);
127 mesh1dfil->checkConsistencyLight();
128 const DataArrayDouble *coords = mesh1dfil->getCoords();
129 for (int x = 0; x < 3; x++)
130 {
131 double mini = 10000;
132 double maxi = -10000;
133 // Cout << "Coords fil compo : " << x << finl;
134 // Cout << "[ ";
135 for (int c = 0; c < coords->getNumberOfTuples(); c++)
136 {
137 const auto val = coords->getIJ(c, x);
138 // Cout << val << ", ";
139 if (val < mini)
140 mini = val;
141 if (val > maxi)
142 maxi = val;
143 }
144 // Cout << "]" << finl;
145 Cout << "coord fil min dans la direction " << x << " : " << mini << finl;
146 Cout << "coord fil max dans la direction " << x << " : " << maxi << finl;
147 }
148 const auto connectivity = mesh1dfil->getNodalConnectivity();
149 const int nb_compo = static_cast<int>(connectivity->getNumberOfComponents());
150 Cout << "Connectivity fil : " << finl;
151 Cout << "Nb nodes : " << connectivity->getNumberOfTuples() << finl;
152 Cout << "Nb compo : " << nb_compo << finl;
153 print_umesh_conn(connectivity);
154 Cout << "Youpi la coupe marche" << finl;
155 }
156 catch (INTERP_KERNEL::Exception&)
157 {
158 mesh1dfil = MEDCouplingUMesh::New();
159 plan_cut_some_bubble = false;
160 }
161 if (plan_cut_some_bubble)
162 {
163 mcIdType nbOfNodes;
164 bool areNodesMerged;
165 /* MCT oldNodes = */ mesh1dfil->mergeNodes(EPS_, areNodesMerged, nbOfNodes);
166 /* MCT do_not_use = */ mesh1dfil->zipCoordsTraducer();
167 /* MCT do_not_use2 = */ mesh1dfil->zipConnectivityTraducer(0);
168 DataArrayDouble *coord = mesh1dfil->getCoords();
169 std::vector<unsigned long> COO2KEEPLONG(begin(COO2KEEP), end(COO2KEEP));
170 DAD coords = coord->keepSelectedComponents(COO2KEEPLONG);
171 mesh1dfil->setCoords(coords);
172 }
173 // return mesh1dfil;
174}
175
177 const DataArrayIdType *new_to_old_id,
178 const mcIdType n_tot_mesh2d,
179 DataArrayIdType *tab_id_subcells,
180 DataArrayIdType *tab_id_cut_cell) const
181{
182 // temp est un tableau temporaire qui fait la taille du nbre de cellules old
183 // et qui est initialement rempli de -1. Il sert à identifier les cellules
184 // diphasiques (une cellule qui a déjà été renseignée dans old et sur laquelle
185 // on retombe en parcourant new_to_old est une cellule diphasique qu'il faut
186 // donc renseigner dans tab_id_cut_cell et tab_id_subcells Son deuxieme indice
187 // permet de savoir en quelle position était le tuple diphasique
188 const auto n_new_to_old = new_to_old_id->getNumberOfTuples();
189 const auto new_to_old_id_ptr = new_to_old_id->getConstPointer();
190
191 MCT temp = DataArrayIdType::New();
192 temp->alloc(n_tot_mesh2d, 2);
193 temp->fillWithValue(-1);
194 mcIdType *temp_ptr = temp->getPointer();
195 // n_cut n'est pas le bon nombre ! Mais comme je n'ai aucune;
196 // idée de sa valeur je prend la différence entre new et old qui me
197 // donne le bon résultat si toutes les surfaces ne sont coupées que par une
198 // bulle; n_cut est censé correspondre au nbre de cellules du maillage IJ;
199 // traversée par l'interface de la bulle. Je reduis la taille du;
200 // tableau ensuite.;
201 auto n_cut = n_new_to_old - n_tot_mesh2d;
202 assert(n_cut > 0);
203 // tab_id_cut_cell est un tableau qui renvoie la correspondance entre l'indice
204 // de la maille diphasique dans tab_id_subcells et son id deja defini DAI
205 // tab_id_cut_cell = DataArrayInt::New();
206 tab_id_cut_cell->alloc(n_cut, 1);
207 tab_id_cut_cell->fillWithValue(-1);
208// mcIdType *tab_id_cut_cell_ptr = tab_id_cut_cell->getPointer();
209 // tab_id_subcells est un tableau de tuple des ids des bouts de cellules qui
210 // sont en fait dans la meme cellule. La taille de ce tuple est celle du nbre
211 // max de compo connexe plus 1 (la phase liquide). Le tuple est rempli au fur
212 // et à mesure et complété par des -1 deja defini mais pas encore alloué
213 tab_id_subcells->alloc(n_cut, max_authorized_nb_of_components_ + 1);
214 tab_id_subcells->fillWithValue(-1);
215 mcIdType *tab_id_subcells_ptr = tab_id_subcells->getPointer();
216 int ind = 0;
217 // ind est l'indice du dernier doublon qui avance au fur et à mesure de la
218 // découverte d'un nouveau doublon
219 for (int i_new = 0; i_new < n_new_to_old; i_new++)
220 {
221 const auto i_old = new_to_old_id_ptr[i_new];
222 assert(i_old < n_tot_mesh2d);
223 if (temp_ptr[2 * i_old] == -1)
224 temp_ptr[2 * i_old] = i_new;
225 else
226 {
227 // TODO: est-ce que c'est ind ou i_old ?
228 if (tab_id_subcells_ptr[(max_authorized_nb_of_components_ + 1) * ind] == -1)
229 {
230 // la cellule n'est pas encore marquee comme diphasique, on ajoute les
231 // deux subcells identifies pour le moment et on augmente le nbre de
232 // cellule diph
233// tab_id_cut_cell_ptr[ind] = i_old;
234 tab_id_subcells_ptr[(max_authorized_nb_of_components_ + 1) * ind] = temp_ptr[2 * i_old];
235 tab_id_subcells_ptr[(max_authorized_nb_of_components_ + 1) * ind + 1] = i_new;
236 // On garde une trace du fait que ce tuple est a la ind eme position
237 // dans tab_id
238 temp_ptr[2 * i_old + 1] = ind;
239 // on a effectivement un doublon de plus, si on vient de remplir le
240 // tuple 0, maintenant ind doit valeur 1, soit le nbre de cellules
241 // diphasiques trouvées
242 ind += 1;
243 }
244 else
245 {
246 // la cellule avait deja été marquee comme diphasique, on va juste
247 // modifier le bon tuple des subcells
248 const mcIdType ind_tuple = temp_ptr[2 * i_old + 1];
249 assert(ind_tuple >= 0);
250 int last_compo_remplie = 1;
251 // ca plante si on a plus de compo dans une cellule que nb_max_compo + 1
252 for (int i_compo = 1; tab_id_subcells_ptr[(max_authorized_nb_of_components_ + 1) * ind_tuple + i_compo] > -1;
253 i_compo++)
254 {
255 last_compo_remplie = i_compo;
256 }
257 assert(last_compo_remplie > 0);
258 tab_id_subcells_ptr[(max_authorized_nb_of_components_ + 1) * ind_tuple + last_compo_remplie + 1] = i_new;
259 }
260 }
261 }
262 // {
263
264 tab_id_cut_cell->reAlloc(ind);
265 tab_id_subcells->reAlloc(ind);
266}
267
268void get_coo_to_keep(int d, std::vector<int>& COO2KEEP)
269{
270 if (d == 0)
271 {
272 COO2KEEP[0] = 1;
273 COO2KEEP[1] = 2;
274 }
275 else if (d == 1)
276 {
277 COO2KEEP[0] = 2;
278 COO2KEEP[1] = 0;
279 }
280 else if (d == 2)
281 {
282 COO2KEEP[0] = 0;
283 COO2KEEP[1] = 1;
284 }
285 else
286 {
287 Cerr << "La dimension renseignée est trop grande" << finl;
288 }
289}
290
291void get_coo_inv_to_keep(int d, std::array<int, 3>& COOINV)
292{
293 assert((d >= 0) && (d < 3));
294 if (d == 0)
295 {
296 COOINV[0] = 2;
297 COOINV[1] = 0;
298 COOINV[2] = 1;
299 }
300 else if (d == 1)
301 {
302 COOINV[0] = 1;
303 COOINV[1] = 2;
304 COOINV[2] = 0;
305 }
306 else
307 {
308 COOINV[0] = 0;
309 COOINV[1] = 1;
310 COOINV[2] = 2;
311 }
312}
313
315 const int i_dim,
316 const int i_plan,
317 const trustIdType i_2d,
318 const int nx,
319 std::array<int, 3>& ijk_coo) const
320{
321 std::vector<int> COO2KEEP(2);
322 std::array<int, 3> COOINV;
323 get_coo_to_keep(i_dim, COO2KEEP);
324 get_coo_inv_to_keep(i_dim, COOINV);
325 // renvoie les coordonnees x et y correspondant au numero de la
326 // cellule du maillage cartesien du plan XY
327 // Pour rappel mon tableau est de taille un peu supérieur car
328 // il représente un chmap aux faces et non au centre des cellules.
329 const int y = Process::check_int_overflow(i_2d / (nx - 1));
330 const int x = Process::check_int_overflow(i_2d - (nx - 1) * y);
331
332 // On remet dans l'ordre ijk les indices selon la direction normale
333 // au plan de coupe.
334 // TODO: vérifier avec std::array<int, 3> coo {x, y, i_plan};
335 std::array<int, 3> coo {x, y, i_plan};
336 for (int c = 0; c < 3; c++)
337 {
338 ijk_coo[c] = coo[COOINV[c]];
339 }
340}
341
343 const IJK_Field_vector3_double& normale_of_interf,
344 const DataArrayDouble *vector,
345 const int dim, const int i_plan,
346 const int nx, const DataArrayIdType *ids_old,
347 DataArrayIdType *ids_new) const
348{
349 const mcIdType *ids_old_ptr = ids_old->getConstPointer();
350 mcIdType *ids_new_ptr = ids_new->getPointer();
351 const double *vector_ptr = vector->getConstPointer();
352 const int n_compo_ids_IJ = static_cast<int>(ids_new->getNumberOfComponents());
353 const int n_compo_v = static_cast<int>(vector->getNumberOfComponents());
354 const mcIdType n_tup_v = vector->getNumberOfTuples();
355 std::vector<int> coo2keep(2);
356 get_coo_to_keep(dim, coo2keep);
357
358 // {
359 // // debug part
360 // Cerr << "vector : " << finl;
361 // print_double_med(vector);
362 // }
363
364 for (int i_diph = 0; i_diph < n_tup_v; i_diph++)
365 {
366 std::array<int, 3> coo_ijk = {0, 0, 0};
367 get_IJK_ind_from_ind2d(dim, i_plan, ids_old_ptr[i_diph], nx, coo_ijk);
368 // debut debug
369 // Cerr << "coo_ijk : { " << static_cast<int>(coo_ijk[0]) << ", " <<
370 // static_cast<int>(coo_ijk[1]) << ", " << static_cast<int>(coo_ijk[2]) << "
371 // }" << finl; fin debug
372 double scal_prod = 0.;
373 for (int c = 0; c < 2; c++)
374 {
375 // Je fais la moyenne de deux vecteurs normaux des cellules droites et
376 // gauches pour avoir le vecteur de la normale a la face. Dans le cas ou
377 // il ya plusieurs compos connexes je ne sais pas trop comment gérer la
378 // situation.
379 // TODO: PB!!! je vais chercher dans le field normale_of_interf l'element
380 // 0,0,0 qui visiblement n'existe pas. bizarrement il y a un talbeau non
381 // initialisé dans les tableaux suivants lors du tt premier passage à
382 // chaque pas de temps. Je vais chercher la valeur pour la premiere compo
383 // connexe dans l'element et j'espere qu'il s'agit bien de la mm dans
384 // l'element d'à coté
385 const double normale_of_interf_cell = normale_of_interf[coo2keep[c]](coo_ijk[0], coo_ijk[1], coo_ijk[2]);
386 double normale_of_interf_next_cell;
387 if (dim == 0)
388 normale_of_interf_next_cell = normale_of_interf[coo2keep[c]](coo_ijk[0] + 1, coo_ijk[1], coo_ijk[2]);
389 else if (dim == 1)
390 normale_of_interf_next_cell = normale_of_interf[coo2keep[c]](coo_ijk[0], coo_ijk[1] + 1, coo_ijk[2]);
391 else
392 normale_of_interf_next_cell = normale_of_interf[coo2keep[c]](coo_ijk[0], coo_ijk[1], coo_ijk[2] + 1);
393
394 const double normale_of_interf_moy = (normale_of_interf_cell + normale_of_interf_next_cell) / 2.;
395 const double scal_prod_compo = vector_ptr[n_compo_v * i_diph + c] * normale_of_interf_moy;
396 scal_prod += scal_prod_compo;
397 }
398 if (scal_prod < 0.)
399 {
400 // En fait on n'a plus besoin de la valeur de la premiere cellule si le
401 // vecteur n'est pas dans le bon sens c'est que c'est la valeur de la
402 // phase liquide ou que plusieurs compos connexes sont dans la cellule,
403 // auquel cas on laisse tomber la rigueur du calcul dans la mesure ou on
404 // ne prendra pas en compte cette complexite dans un operateur. int interm
405 // = ids_IJ_cell_from_diph->getIJ(i_diph, 0);
406 ids_new_ptr[n_compo_ids_IJ * i_diph] = ids_new_ptr[n_compo_ids_IJ * i_diph + 1];
407 }
408 }
409}
410
412 const int dim,
413 const DataArrayDouble *bary0,
414 const DataArrayIdType *cIcellsIdinMesh0,
415 const DataArrayIdType *cellsIdinMesh0,
416 DataArrayDouble *vect) const
417{
418 // vect est de la taille du nombre de cellules diphasiques, on ne regarde vect
419 // que quand la face est coupée.
420 const mcIdType n_vect = cIcellsIdinMesh0->getNumberOfTuples();
421 vect->alloc(n_vect, 2);
422 double *vect_ptr = vect->getPointer();
423 // const int n_diph = bary0->getNumberOfTuples();
424 // const int dim_bary0 = static_cast<int>(bary0->getNumberOfComponents());
425 std::vector<int> coo_to_keep(2);
426 get_coo_to_keep(dim, coo_to_keep);
427 const mcIdType *cellsIdinMesh0_ptr = cellsIdinMesh0->getConstPointer();
428 // const int* cIcellsIdinMesh0_ptr = cIcellsIdinMesh0->getConstPointer();
429 const mcIdType n_cIcellsIdinMesh0 = cIcellsIdinMesh0->getNumberOfTuples();
430
431 // {
432 // // debug part
433 // Cerr << "cellsIdinMesh0 : " << finl;
434 // print_int_med(cellsIdinMesh0);
435 // Cerr << "cIcellsIdinMesh0 : " << finl;
436 // print_int_med(cIcellsIdinMesh0);
437 // // end of the debug
438 // }
439
440 for (int c = 0; c < n_cIcellsIdinMesh0; c++)
441 {
442 // on considere arbitrairement les 2 premiers, je ne vois pas comment on
443 // pourrait faire dans le cas ou il y en a plus.
444 const mcIdType ind_phase0 = cellsIdinMesh0_ptr[(max_authorized_nb_of_components_ + 1) * c];
445 assert(ind_phase0 >= 0);
446 assert(ind_phase0 < bary0->getNumberOfTuples());
447 const mcIdType ind_phase1 = cellsIdinMesh0_ptr[(max_authorized_nb_of_components_ + 1) * c + 1];
448 assert(ind_phase1 >= 0);
449 assert(ind_phase1 < bary0->getNumberOfTuples());
450 // const int ind_maillage_2d_cart = cIcellsIdinMesh0_ptr[c];
451 // Cerr << "Ind old : " << ind_maillage_2d_cart << finl;
452 // Cerr << "Ind phase : " << ind_phase0 << ", " << ind_phase1 << finl;
453 for (int dir = 0; dir < 2; dir++)
454 {
455 // const int coo_kept = coo_to_keep[dir];
456 // assert(coo_kept <= dim_bary0);
457 // Cerr << "Coo to keep : " << coo_kept << finl;
458 // const double compo = bary0->getIJ(ind_phase1, coo_kept) -
459 // bary0->getIJ(ind_phase0, coo_kept);
460 const double compo = bary0->getIJ(ind_phase1, dir) - bary0->getIJ(ind_phase0, dir);
461 // c plutot que ind_maillage_2d_cart
462 vect_ptr[2 * c + dir] = compo;
463 }
464 }
465}
466
468 const Maillage_FT_IJK& maillage_ft_ijk,
469 const IJK_Field_vector3_double& normale_of_interf,
470 IJK_Field_vector3_double& surfaces,
472{
473 // Lors de l'appel de cette méthode (une fois à chaque passage dans la boucle
474 // principale en temps), on convertit le maillage au format MED.
475 set_maillage_MED(maillage_ft_ijk);
476
477 // Pass through 3 dimensions to cut the mesh of the bubble with multiple plans
478 const auto& geom = surfaces[0].get_domaine();
479 const auto& splitting = surfaces[0].get_domaine();
480 std::vector<int> N = {splitting.get_nb_elem_local(0) + 1, splitting.get_nb_elem_local(1) + 1,
481 splitting.get_nb_elem_local(2) + 1
482 };
483 Cerr << "Dimensions du cas : ";
484 for (int c = 0; c < 3; c++)
485 Cerr << ", " << N[c];
486 Cerr << finl;
487
488 // std::vector<int> L_min = {geom.get_origin(0), geom.get_origin(1),
489 // geom.get_origin(2)} std::vector<int> L_max = {geom.get_origin,
490 // geom.get_origin(1), geom.get_origin(2)}
491
492 // Dans chaque direction on va parcourir tous les plans pour découper les
493 // bulles en tranches.
494 std::vector<int> COO2KEEP(2);
495 std::array<int, 3> COOINV;
496
497 for (int d = 0; d < 3; d++)
498 {
499 get_coo_to_keep(d, COO2KEEP);
500 get_coo_inv_to_keep(d, COOINV);
501
502 // debut debug
503 // Cerr << "COOINV : { " << static_cast<int>(COOINV[0]) << ", " <<
504 // static_cast<int>(COOINV[1]) << ", " << static_cast<int>(COOINV[2]) << "
505 // }" << finl; fin debug
506
507 // Building plan mesh
508 const auto X1 = COO2KEEP[0];
509 DAD xarr = DataArrayDouble::New();
510 xarr->alloc(N[X1], 1);
511 xarr->iota();
512 const auto dx = geom.get_constant_delta(X1);
513 const auto xmin = geom.get_origin(X1) + dx * splitting.get_offset_local(X1);
514 // Marche si le forecasting marche
515 // xarr = xarr * dx + xmin;
516 auto xarr_ptr = xarr->getPointer();
517 for (int c = 0; c < xarr->getNumberOfTuples(); c++)
518 {
519 xarr_ptr[c] *= dx;
520 xarr_ptr[c] += xmin;
521 }
522
523 const int X2 = COO2KEEP[1];
524 DAD yarr = DataArrayDouble::New();
525 yarr->alloc(N[X2], 1);
526 yarr->iota();
527 const auto dy = geom.get_constant_delta(X2);
528 const auto ymin = geom.get_origin(X2) + dy * splitting.get_offset_local(X2);
529 // yarr = yarr * dy + ymin;
530 auto yarr_ptr = yarr->getPointer();
531 for (int c = 0; c < yarr->getNumberOfTuples(); c++)
532 {
533 yarr_ptr[c] *= dy;
534 yarr_ptr[c] += ymin;
535 }
536
537 MCC cmesh = MEDCouplingCMesh::New();
538 cmesh->setCoords(xarr, yarr);
539 MCU mesh = cmesh->buildUnstructured();
540 mesh->setName("Plan_IJ_IK_JK");
541
542 // Orient correctly grid
543 mesh->changeSpaceDimension(3);
544 const double vect[3] = {0., 0., -1.};
545 mesh->orientCorrectly2DCells(vect, false);
546 mesh->changeSpaceDimension(2);
547 /* MCT do_not_use3 = */ mesh->zipCoordsTraducer();
548 const mcIdType n_cell_tot = mesh->getNumberOfCells();
550 MEDCoupling::WriteUMesh("mesh.med", mesh, true);
551
552 DAD zarr = DataArrayDouble::New();
553 zarr->alloc(N[d], 1);
554 zarr->iota();
555 const auto dz = geom.get_constant_delta(d);
556 const auto zmin = geom.get_origin(d) + dz * splitting.get_offset_local(d);
557 // Marche si le forecasting marche, sinon il faut parcourir en boucle
558 auto zarr_ptr = zarr->getPointer();
559 const mcIdType n_tup_zarr = zarr->getNumberOfTuples();
560 for (int c = 0; c < n_tup_zarr; c++)
561 {
562 zarr_ptr[c] *= dz;
563 zarr_ptr[c] += zmin;
564 }
565
566 // For each plan cut through the bubble mesh and compute the surfaces
567 // and barycenters of the cut faces
569 MEDCoupling::WriteUMesh("mesh_bulles.med", maillage_bulles_med_, true);
570 for (int i_plan = 0; i_plan < N[d]; i_plan++)
571 {
572 MCT cellId = DataArrayIdType::New();
573 bool plan_cut_some_bubble = true;
574 MCU mesh1D = MEDCouplingUMesh::New();
575 slice_bubble(zarr_ptr[i_plan], d, cellId, plan_cut_some_bubble, mesh1D);
576
577 // Si on ne coupe pas de bulles, pas la peine de faire tout ça, la surface
578 // vapeur reste nulle il n'y a que du liquide sur toutes ces faces. En
579 // fait ça fait gagner en temps de calcul.
580 if (plan_cut_some_bubble)
581 {
582 Cerr << finl;
583 Cerr << "Point d'intersection : " << zarr_ptr[i_plan] << finl;
584 Cerr << "Direction : " << d << finl;
585 Cerr << finl;
586
587 Cerr << "Mesh 1D coordinates : " << finl;
588 print_double_med(mesh1D->getCoords());
589 Cerr << "Mesh 1D connectivity" << finl;
590 print_umesh_conn(mesh1D->getNodalConnectivity());
591 // Cerr << "Mesh 1D connectivity bis" << finl;
592 // for (unsigned int comp = 0; comp <
593 // mesh1D->static_cast<int>(getNodalConnectivity()->getNumberOfComponents());
594 // comp++) {
595 // Cerr << " [ ";
596 // for (int c = 0; c <
597 // mesh1D->getNodalConnectivity()->getNumberOfTuples(); c++) {
598 // Cerr << mesh1D->getNodalConnectivity()->getIJ(c, comp) << ", ";
599 // }
600 // Cerr << "]" << finl;
601 // }
602 /* MCT do_not_use4 =*/ mesh1D->zipCoordsTraducer();
603 /* MCT no_use1 =*/ mesh1D->zipConnectivityTraducer(2);
605 MEDCoupling::WriteUMesh("mesh1d.med", mesh1D, true);
606 // récupérer le bon champ
607 // auto cellId_ptr = cellId->getPointer();
608 // const auto n_cell_diph = cellId->getNumberOfTuples();
609 // MCU orthoProjected =
610 // maillage_bulles_med_->buildPartOfMySelf(cellId_ptr,
611 // cellId_ptr+n_cell_diph, true);
612
613 MCT cellOrder = mesh1D->orderConsecutiveCells1D();
614
615 // debut debug
616 // Cerr << "Reordering mesh1D : " <<finl;
617 // print_int_med(cellOrder);
618 // fin debug
619
620 MCU mesh1D_ordered = mesh1D->buildPartOfMySelf(cellOrder->begin(), cellOrder->end(), false);
621 /* MCT no_use2 =*/ mesh1D_ordered->zipConnectivityTraducer(2);
622 /* MCT do_not_use6 =*/ mesh1D_ordered->zipCoordsTraducer();
623 Cerr << "Mesh 1D connectivity cell ordered" << finl;
624 print_umesh_conn(mesh1D_ordered->getNodalConnectivity());
625 // Cerr << "Mesh 1D connectivity index ordered" << finl;
626 // print_int_med(mesh1D_ordered->getNodalConnectivityIndex());
627 order_elem_mesh_filaire(mesh1D_ordered);
628 Cerr << "Mesh 1D connectivity nodes ordered" << finl;
629 print_umesh_conn(mesh1D_ordered->getNodalConnectivity());
630 mesh1D_ordered->checkConsistencyLight();
631
632 // MCU mesh1D_f = mesh1D_ordered->sortCellsInMEDFileFrmt();
633 // DONE with false as 3rd arg: mesh1D_ordered->zipCoords();
634
635 // debut debug
636 // Cerr << "Coordonnees mesh1D ordered : " <<finl;
637 // const auto coo = mesh1D_ordered->getCoords();
638 // print_double_med(coo);
639 // fin debug
640
642 MEDCoupling::WriteUMesh("mesh1d_ordered.med", mesh1D_ordered, true);
643
644 // {
645 // const auto connectivity = mesh1D_ordered->getNodalConnectivity();
646 // const int nb_compo = static_cast<int>(connectivity->getNumberOfComponents());
647 // Cerr << "Connectivity fil : " << finl;
648 // Cerr << "Nb nodes : " << connectivity->getNumberOfTuples() << finl;
649 // Cerr << "Nb compo : " << nb_compo << finl;
650 // print_umesh_conn(connectivity);
651 // }
652
653 // Compute the merge mesh and stock it
654 MCU merge0, mesh_filaire_decoupe0;
655 MCT cellIdInMesh2d0, mesh1dmergeId0;
656 {
657 MEDCouplingUMesh *merge0Ptr(0), *meshFilDecoupePtr(0);
658 DataArrayIdType *cellIdInMesh2d0Ptr(0), *mesh1dmergeId0Ptr(0);
659
660 MEDCouplingUMesh::Intersect2DMeshWith1DLine(mesh, mesh1D_ordered, EPS_, merge0Ptr, meshFilDecoupePtr,
661 cellIdInMesh2d0Ptr, mesh1dmergeId0Ptr);
662 merge0 = merge0Ptr;
663 mesh_filaire_decoupe0 = meshFilDecoupePtr;
664 cellIdInMesh2d0 = cellIdInMesh2d0Ptr;
665 mesh1dmergeId0 = mesh1dmergeId0Ptr;
666 }
668 {
669 // MCT otn = merge0->sortCellsInMEDFileFrmt();
670 merge0->setName("Merge0");
671 MEDCoupling::WriteUMesh("merge0.med", merge0, true);
672 }
673
674 // Compute surf and bary
675 DAD bary0 = merge0->computeCellCenterOfMass();
676 DAD surf0 = merge0->getMeasureField(false)->getArray(); // ->getValueOnMulti(bary0->getConstPointer(),
677 // bary0->getNumberOfTuples());
678
679 // Compute the table of cut cells in mesh2d
680 MCT cellsIdinMesh0 = DataArrayIdType::New();
681 MCT cIcellsIdinMesh0 = DataArrayIdType::New();
682 findCommonTuples(cellIdInMesh2d0, n_cell_tot, cellsIdinMesh0, cIcellsIdinMesh0);
683 // cellsIdinMesh1, cIcellsIdinMesh1 = findCommonTuples(cellIdInMesh2d1,;
684 // n_cell_tot);
685
686 // Compute the vect from sub_cell0 to sub_cell1 in diph cells and check
687 // if it goes from vapour to liquid-> If not switches sub_cell0 and
688 // sub_cell1 ids->
689 DAD vect0 = DataArrayDouble::New();
690 // TODO la methode rempli le vecteur a partir des barycentres des deux
691 // premieres sous cellules de chaque cellule diphasique.
692 get_vect_from_sub_cells_tuple(d, bary0, cIcellsIdinMesh0, cellsIdinMesh0, vect0);
693
694 // vect1 = get_vect_from_sub_cells_tuple(bary1, cIcellsIdinMesh1,
695 // cellsIdinMesh1, n_cell_tot);
696
697 // Get ortho from 2d mesh of the bubble
698 // get_ortho_per_cell(orthoProjected, N[X1]-1, N[Y1]-1, xmin, ymin,
699 // dx, dy, normale_of_interf_[old()]);
700
701 // Check if orientation is Ok or switches it
702 check_if_vect_is_from_liquid2vapor(normale_of_interf, vect0, d, i_plan, N[X1], cIcellsIdinMesh0, cellsIdinMesh0);
703 // cIcellsIdinMesh1 = check_if_vect_is_from_liquid2vapor(vect1,
704 // orthoPerCell,
705 // cIcellsIdinMesh1,
706 // cellsIdinMesh1);
707
708 // Select values from the barys of the vapor phase and set it in the res
709 // array
710 // auto surf_ptr = surf0->getPointer();
711 // const int len_surf =
712 // surf0->getNumberOfTuples() * static_cast<int>(surf0->getNumberOfComponents());
713 // for (int c = 0; c < len_surf; c++)
714 // surf_ptr[c] /= (dx * dy);
715
716 // // debug surf0
717 // Cerr << "Surf0 : " << finl;
718 // print_double_med(surf0);
719 // //
720 // // debug bary0
721 // Cerr << "bary0 : " << finl;
722 // print_double_med(bary0);
723
724 // Cette boucle est un parcours des cellules diphasiques seulement.
725 // Elle permet de remplir de manière efficace les tableaux surfaces et
726 // barycentres
727 const mcIdType n_diph = cellsIdinMesh0->getNumberOfTuples();
728 const int n_compo_subcell = static_cast<int>(cellsIdinMesh0->getNumberOfComponents());
729 const mcIdType *subcellPtr = cellsIdinMesh0->getConstPointer();
730 const mcIdType *cIPtr = cIcellsIdinMesh0->getConstPointer();
731 const double *surf0Ptr = surf0->getConstPointer();
732 const double *bary0Ptr = bary0->getConstPointer();
733 const int n_compo_bary = static_cast<int>(bary0->getNumberOfComponents());
734
735 for (mcIdType c = 0; c < n_diph; c++)
736 {
737 // TODO renvoie les coordonnees x et y correspondant au numero de la
738 // cellule du maillage cartesien du plan XY
739 const mcIdType i_cell_cart = cIPtr[c];
740 // On prend le premier de la ligne parce que pour rappel on les a
741 // réordonné afin d'avoir le premier qui correspond à la subcell
742 // vapeur
743 const mcIdType i_subcell = subcellPtr[c * n_compo_subcell];
744 std::array<int, 3> coo_inv {0, 0, 0};
745 get_IJK_ind_from_ind2d(d, i_plan, i_cell_cart, N[X1], coo_inv);
746
747 // J'attribue à la face d de la maille i,j,k
748 // la premiere surface de la sous cellule X1 X2
749 const double surf_vap = surf0Ptr[i_subcell];
750 surfaces[d](coo_inv[0], coo_inv[1], coo_inv[2]) = surf_vap;
751 // je dois remettre dans le bon ordre les deux autres composantes
752 const double bary_x1 = bary0Ptr[i_subcell * n_compo_bary];
753 barycentres[X1][d](coo_inv[0], coo_inv[1], coo_inv[2]) = bary_x1;
754 const double bary_x2 = bary0Ptr[i_subcell * n_compo_bary + 1];
755 barycentres[X2][d](coo_inv[0], coo_inv[1], coo_inv[2]) = bary_x2;
756 barycentres[d][d](coo_inv[0], coo_inv[1], coo_inv[2]) = zarr_ptr[i_plan];
757 }
758 }
759 }
760 }
761 for (int c = 0; c < 3; c++)
762 {
763 for (int cc = 0; cc < 3; cc++)
764 barycentres[c][cc].echange_espace_virtuel(barycentres[0][0].ghost());
765 surfaces[c].echange_espace_virtuel(surfaces[0].ghost());
766 }
767}
768
770 const Maillage_FT_IJK& maillage_ft_ijk,
771 const IJK_Field_double& indicatrice_ft,
772 const IJK_Field_vector3_double& normale_of_interf,
773 IJK_Field_vector3_double& surface_vapeur_par_face,
774 FixedVector<IJK_Field_vector3_double, 3>& barycentre_vapeur_par_face)
775{
776 for (int dir = 0; dir < 3; dir++)
777 surface_vapeur_par_face[dir].data() = 0.;
778
780 {
781 Cout << "Calcul surfaces et barys" << finl;
783 maillage_ft_ijk,
784 normale_of_interf,
785 surface_vapeur_par_face,
786 barycentre_vapeur_par_face);
787 Cerr << "Le calcul des surfaces et barys est fini" << finl;
788 }
789 const int nb_surface_mouillees = rempli_surface_vapeur_par_face_interieur_bulles(surface_vapeur_par_face, indicatrice_ft);
790 return nb_surface_mouillees;
791}
792
794 IJK_Field_vector3_double& surface_vapeur_par_face,
795 const IJK_Field_double& indicatrice_ft)
796{
797 const int ni = surface_vapeur_par_face[0].ni();
798 const int nj = surface_vapeur_par_face[0].nj();
799 const int nk = surface_vapeur_par_face[0].nk();
800 const double eps_diph = 10.e-6;
801 int n_faces_mouilles = 0;
802 double surf_cell = 1.;
803 for (int dir = 0; dir < 3; dir++)
804 {
805 surf_cell = 1.;
806 for (int c = 0; c < 3; c++)
807 {
808 if (c != dir)
809 surf_cell *= ref_domaine_->get_constant_delta(c);
810 }
811 for (int i = 0; i < ni; i++)
812 for (int j = 0; j < nj; j++)
813 for (int k = 0; k < nk; k++)
814 {
815 double& surf_vap = surface_vapeur_par_face[dir](i, j, k);
816 if ( (surf_vap / surf_cell > eps_diph)
817 and (surf_vap / surf_cell < 1. - eps_diph))
818 {
819 n_faces_mouilles++;
820 // Cerr << "Cette face est diphasique ; dir " << dir << " i " << i
821 // << ", j " << j << ", k " << k << finl;
822 }
823 else
824 {
825 double mean_indic = 0.;
826 if (dir == 0)
827 mean_indic = (indicatrice_ft(i - 1, j, k) + indicatrice_ft(i, j, k)) / 2.;
828 if (dir == 1)
829 mean_indic = (indicatrice_ft(i, j - 1, k) + indicatrice_ft(i, j, k)) / 2.;
830 if (dir == 2)
831 mean_indic = (indicatrice_ft(i, j, k - 1) + indicatrice_ft(i, j, k)) / 2.;
832 bool test = (mean_indic < 0.5);
833 // Alors on met la surface de la face comme vapeur pure
834 surf_vap = (test ? surf_cell : 0.);
835 }
836 }
837 }
838 return n_faces_mouilles;
839}
840
842{
843 DataArrayIdType *n = mesh1D->getNodalConnectivity();
844 mcIdType *n_ptr = n->getPointer();
845 DataArrayIdType *nI = mesh1D->getNodalConnectivityIndex();
846 const mcIdType *nI_ptr = nI->getConstPointer();
847 mcIdType n_cells = mesh1D->getNumberOfCells();
848 Cerr << "Coordonnees de mesh1D : " << finl;
849 print_double_med(mesh1D->getCoords());
850 if (n_cells > 1)
851 {
852 mcIdType last_node, second_node;
853 last_node = -1;
854 mcIdType node0, node1, node2, node3;
855
856 for (mcIdType i_cell = 0; i_cell < n_cells; i_cell++)
857 {
858 // Dans ce cas là on traite un debut de boucle par exemple.
859 // Pour changer de boucle il faut atteindre à nouveau le
860 // premier noeud (qui est donc le last_node).
861 if (last_node == -1)
862 {
863 assert(i_cell + 1 < n_cells);
864 node0 = n_ptr[nI_ptr[i_cell] + 1];
865 node1 = n_ptr[nI_ptr[i_cell] + 2];
866 node2 = n_ptr[nI_ptr[i_cell + 1] + 1];
867 node3 = n_ptr[nI_ptr[i_cell + 1] + 2];
868 if ((node0 == node2) || (node0 == node3))
869 {
870 last_node = node1;
871 second_node = node0;
872 n_ptr[nI_ptr[i_cell] + 1] = last_node;
873 n_ptr[nI_ptr[i_cell] + 2] = second_node;
874 }
875 else if ((node1 == node2) || (node1 == node3))
876 {
877 last_node = node0;
878 second_node = node1;
879 }
880 else
881 throw "Erreur au debut d'une boucle deux element ne se suivent pas";
882 }
883 // Dans ce cas là on est dans un boucle, et on traite
884 // l'élément suivant qu'on ordonne dans le mm sens que
885 // le précédent.
886 else
887 {
888 node0 = n_ptr[nI_ptr[i_cell] + 1];
889 node1 = n_ptr[nI_ptr[i_cell] + 2];
890 // Si c'est node1 qui est égal au second noeud de l'elem precedent
891 // on inverse les noeuds 0 et 1.
892 if (node1 == second_node)
893 {
894 n_ptr[nI_ptr[i_cell] + 1] = node1;
895 n_ptr[nI_ptr[i_cell] + 2] = node0;
896 second_node = node0;
897 }
898 else if (node0 == second_node)
899 {
900 second_node = node1;
901 }
902 // Si aucun des 2 noeud n'est dans l'element precedent c'est qu on a
903 // fini un arc brise et qu on commence une nouvelle boucle.
904 // On va retraiter cet element comme un debut de boucle.
905 else
906 {
907 // throw "Erreur les cellules ne sont pas faites avec des noeuds "
908 // "consecutifs";
909 i_cell--;
910 last_node = -1;
911 }
912 // On a fini la boucle sur cet element, le prochain est dans une
913 // nouvelle boucle.
914 if (second_node == last_node)
915 last_node = -1;
916 }
917 }
918 }
919
920 // double x1 = coords[n_compo_coo * node1];
921 // double y1 = coords[n_compo_coo * node1 + 1];
922 // double cellNormX = norms2D[n_compo_coo * cellNumber];
923 // double cellNormY = norms2D[n_compo_coo * cellNumber + 1];
924 // if ((cellNormX * (x1 - centerX) + cellNormY * ( y1-centerY ) ) < 0)
925 // {
926 // n[nI[cellNumber] + 1] = node2;
927 // n[nI[cellNumber] + 2] = node1;
928 // }
929}
930
931void print_int_med(const DataArrayIdType *data)
932{
933 const mcIdType n_tup = data->getNumberOfTuples();
934 const int n_compo = static_cast<int>(data->getNumberOfComponents());
935 const mcIdType *dataPtr = data->getConstPointer();
936 if (n_compo == 1)
937 {
938 Cerr << "[ ";
939 for (int i = 0; i < n_tup; i++)
940 Cerr << dataPtr[i] << ", ";
941 Cerr << "]" << finl;
942 }
943 else
944 {
945 for (int i = 0; i < n_tup; i++)
946 {
947 for (int j = 0; j < n_compo; j++)
948 Cerr << dataPtr[i * n_compo + j] << ", ";
949 Cerr << finl;
950 }
951 }
952}
953
954void print_double_med(const DataArrayDouble *data)
955{
956 const mcIdType n_tup = data->getNumberOfTuples();
957 const int n_compo = static_cast<int>(data->getNumberOfComponents());
958 const double *dataPtr = data->getConstPointer();
959 if (n_compo == 1)
960 {
961 Cerr << "[ ";
962 for (mcIdType i = 0; i < n_tup; i++)
963 Cerr << dataPtr[i] << ", ";
964 Cerr << "]" << finl;
965 }
966 else
967 {
968 for (mcIdType i = 0; i < n_tup; i++)
969 {
970 for (int j = 0; j < n_compo; j++)
971 Cerr << dataPtr[i * n_compo + j] << ", ";
972 Cerr << finl;
973 }
974 }
975}
976
977void print_umesh_conn(const DataArrayIdType *data)
978{
979 const mcIdType n_tup = data->getNumberOfTuples();
980 const int n_compo = static_cast<int>(data->getNumberOfComponents());
981 const mcIdType *dataPtr = data->getConstPointer();
982 if (n_compo == 1)
983 {
984 // Cerr << "[ ";
985 mcIdType i = 0;
986 while (i < n_tup)
987 {
988 mcIdType elem_type = dataPtr[i];
989 if (elem_type == 1)
990 elem_type++;
991 for (mcIdType j = 0; j < elem_type; j++)
992 {
993 Cerr << dataPtr[i + 1] << " ";
994 i++;
995 }
996 i++;
997 Cerr << ", ";
998 }
999 Cerr << finl;
1000 // Cerr << "]" << finl;
1001 }
1002 else
1003 {
1004 Cerr << "Attention on ne plot pas le tableau des connectivites" << finl;
1005 }
1006}
1007
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
Definition Domaine_IJK.h:47
const Domaine_IJK & get_domaine() const
int nb_sommets() const
renvoie le nombre de sommets (reels et virtuels) (egal a sommets().
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().
const IntTab & facettes() const
renvoie le tableau des facettes (reelles et virtuelles) dimension(0) = nombre de facettes,
: class Maillage_FT_IJK
static int check_int_overflow(trustIdType)
Definition Process.cpp:428
static int je_suis_maitre()
renvoie 1 si on est sur le processeur maitre du groupe courant (c'est a dire me() == 0),...
Definition Process.cpp:86
static void get_maillage_MED_from_IJK_FT(MEDCouplingUMesh *maillage_bulles_mcu, const Maillage_FT_IJK &maillage_bulles_ft_ijk)
void set_maillage_MED(const Maillage_FT_IJK &maillage_ft_ijk)
void slice_bubble(const double intersect_pt, const int dim, DataArrayIdType *cutcellsid, bool &plan_cut_some_bubble, MCU &mesh1dfil) const
void check_if_vect_is_from_liquid2vapor(const IJK_Field_vector3_double &normale_of_interf, const DataArrayDouble *vector, const int dim, const int i_plan, const int nx, const DataArrayIdType *ids_diph, DataArrayIdType *ids_IJ_cell_from_diph) const
void findCommonTuples(const DataArrayIdType *mesh_merge, const mcIdType n_tot_mesh2d, DataArrayIdType *tab_id_subcells, DataArrayIdType *tab_id_cut_cells) const
int compute_surf_and_barys(const Maillage_FT_IJK &maillage_ft_ijk, const IJK_Field_double &indicatrice_ft, const IJK_Field_vector3_double &normale_of_interf, IJK_Field_vector3_double &surface_vapeur_par_face, FixedVector< IJK_Field_vector3_double, 3 > &barycentre_vapeur_par_face)
void get_IJK_ind_from_ind2d(const int dim, const int i_plan, const trustIdType i_2d, const int nx, std::array< int, 3 > &ijk_coo) const
void get_vect_from_sub_cells_tuple(const int dim, const DataArrayDouble *bary0, const DataArrayIdType *cIcellsIdinMesh0, const DataArrayIdType *cellsIdinMesh0, DataArrayDouble *vect) const
static void order_elem_mesh_filaire(MEDCouplingUMesh *mesh1D)
void initialize(const Domaine_IJK &splitting)
int rempli_surface_vapeur_par_face_interieur_bulles(IJK_Field_vector3_double &surface_vapeur_par_face, const IJK_Field_double &indicatrice_ft)
void calculer_surfaces_et_barys_faces_mouillees_vapeur(const Maillage_FT_IJK &maillage_ft_ijk, const IJK_Field_vector3_double &normale_of_interf, IJK_Field_vector3_double &surfaces, FixedVector< IJK_Field_vector3_double, 3 > &barycentres)
_TYPE_ * addr()