Arcane  v3.15.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
AMRCartesianMeshTesterModule.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* AMRCartesianMeshTesterModule.cc (C) 2000-2024 */
9/* */
10/* Module de test du gestionnaire de maillages cartésiens AMR. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/CheckedConvert.h"
15#include "arcane/utils/PlatformUtils.h"
16#include "arcane/utils/Real2.h"
17#include "arcane/utils/MD5HashAlgorithm.h"
18
20#include "arcane/core/MeshKind.h"
21#include "arcane/core/Directory.h"
22
23#include "arcane/core/ITimeLoopMng.h"
24#include "arcane/core/ITimeLoopService.h"
25#include "arcane/core/ITimeLoop.h"
26#include "arcane/core/TimeLoopEntryPointInfo.h"
27#include "arcane/core/IMesh.h"
28#include "arcane/core/IItemFamily.h"
29#include "arcane/core/ItemPrinter.h"
30#include "arcane/core/IParallelMng.h"
31
32#include "arcane/core/IMesh.h"
33#include "arcane/core/IItemFamily.h"
34#include "arcane/core/IMeshModifier.h"
35#include "arcane/core/IMeshUtilities.h"
36#include "arcane/core/ServiceBuilder.h"
38#include "arcane/core/MeshStats.h"
39#include "arcane/core/IPostProcessorWriter.h"
40#include "arcane/core/IVariableMng.h"
41#include "arcane/core/SimpleSVGMeshExporter.h"
42#include "arcane/core/IGhostLayerMng.h"
43
44#include "arcane/cartesianmesh/ICartesianMesh.h"
45#include "arcane/cartesianmesh/CellDirectionMng.h"
46#include "arcane/cartesianmesh/FaceDirectionMng.h"
47#include "arcane/cartesianmesh/NodeDirectionMng.h"
48#include "arcane/cartesianmesh/CartesianConnectivity.h"
49#include "arcane/cartesianmesh/CartesianMeshRenumberingInfo.h"
50#include "arcane/cartesianmesh/ICartesianMeshPatch.h"
51#include "arcane/cartesianmesh/CartesianMeshUtils.h"
52#include "arcane/cartesianmesh/CartesianMeshCoarsening2.h"
53#include "arcane/cartesianmesh/CartesianMeshPatchListView.h"
54
55#include "arcane/tests/ArcaneTestGlobal.h"
56#include "arcane/tests/AMRCartesianMeshTester_axl.h"
57#include "arcane/tests/CartesianMeshTestUtils.h"
58
59/*---------------------------------------------------------------------------*/
60/*---------------------------------------------------------------------------*/
61
62namespace ArcaneTest
63{
64
65using namespace Arcane;
66
67/*---------------------------------------------------------------------------*/
68/*---------------------------------------------------------------------------*/
73: public ArcaneAMRCartesianMeshTesterObject
74{
75 public:
76
79
80 public:
81
82 static void staticInitialize(ISubDomain* sd);
83
84 public:
85
86 void buildInit() override;
87 void compute() override;
88 void init() override;
89
90 private:
91
92 VariableCellReal m_density;
93 VariableCellReal m_old_density;
94 VariableCellReal3 m_cell_center;
95 VariableFaceReal3 m_face_center;
96 VariableNodeReal m_node_density;
97 ICartesianMesh* m_cartesian_mesh;
99 UniqueArray<VariableCellReal*> m_cell_patch_variables;
100 Int32 m_nb_expected_patch = 0;
101
102 private:
103
104 void _compute1();
105 void _compute2();
106 void _initAMR();
107 void _coarseZone();
108 void _reduceNbGhostLayers();
109 void _computeSubCellDensity(Cell cell);
110 void _computeCenters();
111 void _processPatches();
112 void _writePostProcessing();
113 void _checkUniqueIds();
114 void _testDirections();
115 void _checkDirections();
120 void _cellsInPatch(Real3 position, Real3 length, bool is_3d, Int32 level, UniqueArray<Int32>& cells_in_patch);
121};
122
123/*---------------------------------------------------------------------------*/
124/*---------------------------------------------------------------------------*/
125
126AMRCartesianMeshTesterModule::
127AMRCartesianMeshTesterModule(const ModuleBuildInfo& mbi)
128: ArcaneAMRCartesianMeshTesterObject(mbi)
129, m_density(VariableBuildInfo(this,"Density"))
130, m_old_density(VariableBuildInfo(this,"OldDensity"))
131, m_cell_center(VariableBuildInfo(this,"CellCenter"))
132, m_face_center(VariableBuildInfo(this,"FaceCenter"))
133, m_node_density(VariableBuildInfo(this,"NodeDensity"))
134, m_cartesian_mesh(nullptr)
135{
136}
137
138/*---------------------------------------------------------------------------*/
139/*---------------------------------------------------------------------------*/
140
141AMRCartesianMeshTesterModule::
142~AMRCartesianMeshTesterModule()
143{
144 for (VariableCellReal* v : m_cell_patch_variables)
145 delete v;
146}
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
150
151void AMRCartesianMeshTesterModule::
152staticInitialize(ISubDomain* sd)
153{
154 String time_loop_name("AMRCartesianMeshTestLoop");
155
156 ITimeLoopMng* tlm = sd->timeLoopMng();
157 ITimeLoop* time_loop = tlm->createTimeLoop(time_loop_name);
158
159 {
161 clist.add(TimeLoopEntryPointInfo("AMRCartesianMeshTester.buildInit"));
162 time_loop->setEntryPoints(ITimeLoop::WBuild,clist);
163 }
164
165 {
167 clist.add(TimeLoopEntryPointInfo("AMRCartesianMeshTester.init"));
168 time_loop->setEntryPoints(ITimeLoop::WInit,clist);
169 }
170
171 {
173 clist.add(TimeLoopEntryPointInfo("AMRCartesianMeshTester.compute"));
174 time_loop->setEntryPoints(ITimeLoop::WComputeLoop,clist);
175 }
176
177 {
179 clist.add("AMRCartesianMeshTester");
180 time_loop->setRequiredModulesName(clist);
181 clist.clear();
182 clist.add("ArcanePostProcessing");
183 clist.add("ArcaneCheckpoint");
184 clist.add("ArcaneLoadBalance");
185 time_loop->setOptionalModulesName(clist);
186 }
187
188 tlm->registerTimeLoop(time_loop);
189}
190
191/*---------------------------------------------------------------------------*/
192/*---------------------------------------------------------------------------*/
193
194void AMRCartesianMeshTesterModule::
195buildInit()
196{
197 if (subDomain()->isContinue())
198 return;
199
200 m_global_deltat.assign(1.0);
201
202 IItemFamily* cell_family = defaultMesh()->cellFamily();
203 cell_family->createGroup("CELL0");
204 cell_family->createGroup("CELL1");
205 cell_family->createGroup("CELL2");
206 cell_family->createGroup("AMRPatchCells0");
207 cell_family->createGroup("AMRPatchCells1");
208 cell_family->createGroup("AMRPatchCells2");
209 cell_family->createGroup("AMRPatchCells3");
210 cell_family->createGroup("AMRPatchCells4");
211 cell_family->createGroup("AMRPatchCells5");
212
213 IItemFamily* face_family = defaultMesh()->faceFamily();
214 face_family->createGroup("FACE0");
215 face_family->createGroup("FACE1");
216 face_family->createGroup("FACE2");
217 face_family->createGroup("FACE3");
218 face_family->createGroup("FACE4");
219 face_family->createGroup("FACE5");
220
221 face_family->createGroup("AllFacesDirection0");
222 face_family->createGroup("AllFacesDirection1");
223}
224
225/*---------------------------------------------------------------------------*/
226/*---------------------------------------------------------------------------*/
227
228void AMRCartesianMeshTesterModule::
229init()
230{
231 info() << "AMR Init";
232
233 IMesh* mesh = defaultMesh();
234
236 Int32UniqueArray ids(1);
237 ids[0] = 0;
238 cell_family->createGroup("CELL0",ids,true);
239 ids[0] = 1;
240 cell_family->createGroup("CELL1",ids,true);
241 ids[0] = 2;
242 cell_family->createGroup("CELL2",ids,true);
243 IItemFamily* face_family = defaultMesh()->faceFamily();
244 ids[0] = 0;
245 face_family->createGroup("FACE0",ids,true);
246 ids[0] = 1;
247 face_family->createGroup("FACE1",ids,true);
248 ids[0] = 2;
249 face_family->createGroup("FACE2",ids,true);
250 ids[0] = 3;
251 face_family->createGroup("FACE3",ids,true);
252 ids[0] = 4;
253 face_family->createGroup("FACE4",ids,true);
254 ids[0] = 5;
255 face_family->createGroup("FACE5",ids,true);
256
257 m_cartesian_mesh = ICartesianMesh::getReference(mesh);
258 m_utils = makeRef(new CartesianMeshTestUtils(m_cartesian_mesh,acceleratorMng()));
259
260 if (!subDomain()->isContinue()) {
261 _initAMR();
262 _coarseZone();
263 _reduceNbGhostLayers();
264 }
265
266 _computeCenters();
267
268
269 const bool do_coarse_at_init = options()->coarseAtInit();
270
271 const Integer dimension = defaultMesh()->dimension();
272 if (dimension==2)
273 m_nb_expected_patch = 1 + options()->refinement2d().size();
274 else if (dimension==3)
275 m_nb_expected_patch = 1 + options()->refinement3d().size();
276
277 // Si on dé-raffine à l'init, on aura un patch de plus
279 ++m_nb_expected_patch;
280
281 if (subDomain()->isContinue())
282 m_cartesian_mesh->recreateFromDump();
283 else{
284 m_cartesian_mesh->computeDirections();
286 renumbering_info.setRenumberPatchMethod(options()->renumberPatchMethod());
287 renumbering_info.setSortAfterRenumbering(true);
288 if (options()->coarseAtInit())
289 renumbering_info.setParentPatch(m_cartesian_mesh->amrPatch(1));
290 m_cartesian_mesh->renumberItemsUniqueId(renumbering_info);
291 _checkUniqueIds();
292 _processPatches();
293 info() << "MaxUid for mesh=" << MeshUtils::getMaxItemUniqueIdCollective(m_cartesian_mesh->mesh());
294 }
295
296 // Initialise la densité.
297 // On met une densité de 1.0 à l'intérieur
298 // et on ajoute une densité de 5.0 pour chaque direction dans les
299 // mailles de bord.
300 m_density.fill(1.0);
301 for( Integer idir=0, nb_dir=dimension; idir<nb_dir; ++idir){
302 CellDirectionMng cdm(m_cartesian_mesh->cellDirection(idir));
305 ENUMERATE_CELL(icell,cdm.innerCells()){
306 DirCell cc(cdm.cell(*icell));
307 Cell next = cc.next();
308 Cell prev = cc.previous();
309 if (next.null() || prev.null()){
310 // Maille au bord. J'ajoute de la densité.
311 // Ne devrait pas arriver car on est sur les innerCells()
312 ++nb_boundary1;
313 m_density[icell] += 5.0;
314 }
315 }
316 // Parcours les mailles frontières pour la direction
317 ENUMERATE_CELL(icell,cdm.outerCells()){
319 if (icell.index()<5)
320 info() << "CELL: cell=" << ItemPrinter(*icell)
321 << " next=" << ItemPrinter(cc.next())
322 << " previous=" << ItemPrinter(cc.previous());
323 // Maille au bord. J'ajoute de la densité.
324 ++nb_boundary2;
325 m_density[icell] += 5.0;
326 }
327
328 info() << "NB_BOUNDARY1=" << nb_boundary1 << " NB_BOUNDARY2=" << nb_boundary2;
329 }
330 bool is_amr = m_nb_expected_patch!=1;
331 if (options()->verbosityLevel()==0)
332 m_utils->setNbPrint(5);
333 m_utils->testAll(is_amr);
334 _writePostProcessing();
335 _testDirections();
336 _checkDirections();
337}
338
339/*---------------------------------------------------------------------------*/
340/*---------------------------------------------------------------------------*/
341
342void AMRCartesianMeshTesterModule::
343_checkUniqueIds()
344{
345 IMesh* mesh = m_cartesian_mesh->mesh();
346 bool print_hash = true;
347 bool with_ghost = options()->hashWithGhost();
349 MeshUtils::checkUniqueIdsHashCollective(mesh->nodeFamily(), &hash_algo, options()->nodesUidHash(),
351 MeshUtils::checkUniqueIdsHashCollective(mesh->faceFamily(), &hash_algo, options()->facesUidHash(),
353 MeshUtils::checkUniqueIdsHashCollective(mesh->cellFamily(), &hash_algo, options()->cellsUidHash(),
355}
356
357/*---------------------------------------------------------------------------*/
358/*---------------------------------------------------------------------------*/
359
360void AMRCartesianMeshTesterModule::
361_processPatches()
362{
363 const bool do_check = true;
364 const bool is_verbose = options()->verbosityLevel()>=1;
365
366 const Int32 dimension = defaultMesh()->dimension();
367
368 bool without_coarse_zone = true;
369 if (dimension == 2)
370 without_coarse_zone = options()->coarseZone2d().empty();
371 else if (dimension == 3)
372 without_coarse_zone = options()->coarseZone3d().empty();
373
374 // Vérifie qu'il y a autant de patchs que d'options raffinement dans
375 // le jeu de données (en comptant le patch 0 qui est le maillage cartésien).
376 // Cela permet de vérifier que les appels successifs
377 // à computeDirections() n'ajoutent pas de patchs.
378 // Cette vérification ne s'applique que s'il n'y a pas de zone de dé-raffinement.
379 // En effet, dé-raffiner un patch complet le supprime de la liste des patchs.
380 Integer nb_expected_patch = m_nb_expected_patch;
381
382 Integer nb_patch = m_cartesian_mesh->nbPatch();
384 ARCANE_FATAL("Bad number of patchs expected={0} value={1}",nb_expected_patch,nb_patch);
385
386 IParallelMng* pm = parallelMng();
387 Int32 comm_rank = pm->commRank();
388 Int32 comm_size = pm->commSize();
389
391 if (nb_cells_expected.size()!=nb_patch)
392 ARCANE_FATAL("Bad size ({0}, expected={1}) for option '{2}'",
394
395 // Nombre de mailles fantômes attendu. Utilisé uniquement en parallèle
396 bool has_expected_ghost_cells = options()->expectedNumberOfGhostCellsInPatchs.isPresent();
397 if (!pm->isParallel())
399
402 ARCANE_FATAL("Bad size ({0}, expected={1}) for option '{2}'",
404 // Affiche les informations sur les patchs
405 for( Integer i=0; i<nb_patch; ++i ){
406 ICartesianMeshPatch* p = m_cartesian_mesh->patch(i);
407 CellGroup patch_cells(p->cells());
408 info() << "Patch cell_group=" << patch_cells.name() << " nb_cell=" << patch_cells.size();
409 VariableCellReal* cellv = new VariableCellReal(VariableBuildInfo(defaultMesh(),String("CellPatch")+i));
410 m_cell_patch_variables.add(cellv);
411 cellv->fill(0.0);
413 (*cellv)[icell] = 2.0;
414 }
415
419 Cell cell{*icell};
420 if (is_verbose)
421 info() << "Patch i=" << i << " cell=" << ItemPrinter(*icell);
422 own_cells_uid.add(cell.uniqueId());
423 }
424 // Affiche la liste globales des uniqueId() des mailles.
425 {
428 std::sort(global_cells_uid.begin(),global_cells_uid.end());
430 info() << "GlobalUids Patch=" << i << " NB=" << nb_global_uid
431 << " expected=" << nb_cells_expected[i];
432 // Vérifie que le nombre de mailles par patch est le bon.
434 ARCANE_FATAL("Bad number of cells for patch I={0} N={1} expected={2}",
436 if (is_verbose)
437 for( Integer c=0; c<nb_global_uid; ++c )
438 info() << "GlobalUid Patch=" << i << " I=" << c << " cell_uid=" << global_cells_uid[c];
439 }
440 // Teste le nombre de mailles fantômes
442 Int32 local_nb_ghost_cell = patch_cells.size() - patch_own_cell.size();
443 Int32 total = pm->reduce(Parallel::ReduceSum,local_nb_ghost_cell);
444 pinfo() << "NbGhostCells my_rank=" << comm_rank << " local=" << local_nb_ghost_cell << " total=" << total;
445 if (total!=nb_ghost_cells_expected[i])
446 ARCANE_FATAL("Bad number of ghost cells for patch I={0} N={1} expected={2}",
447 i,total,nb_ghost_cells_expected[i]);
448 }
449
450 // Exporte le patch au format SVG
451 if (dimension==2 && options()->dumpSvg()){
452 String filename = String::format("Patch{0}-{1}-{2}.svg",i,comm_rank,comm_size);
453 Directory directory = subDomain()->exportDirectory();
454 String full_filename = directory.file(filename);
455 std::ofstream ofile(full_filename.localstr());
457 exporter.write(patch_cells);
458 }
459 }
460}
461
462/*---------------------------------------------------------------------------*/
463/*---------------------------------------------------------------------------*/
464
465void AMRCartesianMeshTesterModule::
466_computeCenters()
467{
468 IMesh* mesh = defaultMesh();
469
470 // Calcule le centre des mailles
471 {
473 ENUMERATE_CELL(icell,allCells()){
474 Cell cell = *icell;
475 Real3 center;
476 for( NodeLocalId inode : cell.nodes() )
477 center += nodes_coord[inode];
478 center /= cell.nbNode();
479 m_cell_center[icell] = center;
480 }
481 }
482
483 // Calcule le centre des faces
484 {
486 ENUMERATE_FACE(iface,allFaces()){
487 Face face = *iface;
488 Real3 center;
489 for( NodeLocalId inode : face.nodes() )
490 center += nodes_coord[inode];
491 center /= face.nbNode();
492 m_face_center[iface] = center;
493 }
494 }
495}
496
497/*---------------------------------------------------------------------------*/
498/*---------------------------------------------------------------------------*/
499
500void AMRCartesianMeshTesterModule::
501_initAMR()
502{
503 // Regarde si on dé-raffine le maillage initial
504 if (options()->coarseAtInit()){
505 // Il faut que les directions aient été calculées avant d'appeler le dé-raffinement
506 m_cartesian_mesh->computeDirections();
507
508 info() << "Doint initial coarsening";
509
510 if (m_cartesian_mesh->mesh()->meshKind().meshAMRKind() == eMeshAMRKind::PatchCartesianMeshOnly) {
511 debug() << "Coarse with specific coarser (for cartesian mesh only)";
513 coarser->coarse();
514 }
515 else {
517 coarser->createCoarseCells();
518 }
519
520 CartesianMeshPatchListView patches = m_cartesian_mesh->patches();
521 Int32 nb_patch = patches.size();
522 {
523 Int32 index = 0;
524 info() << "NB_PATCH=" << nb_patch;
525 for( CartesianPatch p : patches){
526 info() << "Patch i=" << index << " nb_cell=" << p.cells().size();
527 ++index;
528 }
529 }
530 }
531 // Parcours les mailles actives et ajoute dans la liste des mailles
532 // à raffiner celles qui sont contenues dans le boîte englobante
533 // spécifiée dans le jeu de données.
534 Int32 dim = defaultMesh()->dimension();
535 if (dim==2){
536 for( auto& x : options()->refinement2d() ){
537 m_cartesian_mesh->refinePatch2D(x->position(),x->length());
538 m_cartesian_mesh->computeDirections();
539 }
540 }
541 if (dim==3){
542 for( auto& x : options()->refinement3d() ){
543 m_cartesian_mesh->refinePatch3D(x->position(),x->length());
544 m_cartesian_mesh->computeDirections();
545 }
546 }
547}
548
549/*---------------------------------------------------------------------------*/
550/*---------------------------------------------------------------------------*/
551
552void AMRCartesianMeshTesterModule::
553_coarseZone()
554{
555 Int32 dim = defaultMesh()->dimension();
556
557 if (dim == 2) {
558 //UniqueArray<Int32> cells_in_patchs;
559 for (auto& x : options()->coarseZone2d()) {
560 // _cellsInPatch(Real3(x->position()), Real3(x->length()), false, x->level(), cells_in_patchs);
561 // defaultMesh()->modifier()->flagCellToCoarsen(cells_in_patchs);
562 // defaultMesh()->modifier()->coarsenItemsV2(true);
563 // cells_in_patchs.clear();
564 m_cartesian_mesh->coarseZone2D(x->position(), x->length());
565 m_cartesian_mesh->computeDirections();
566 }
567 }
568 if (dim == 3) {
569 // UniqueArray<Int32> cells_in_patchs;
570 for (auto& x : options()->coarseZone3d()) {
571 // _cellsInPatch(x->position(), x->length(), true, x->level(), cells_in_patchs);
572 // defaultMesh()->modifier()->flagCellToCoarsen(cells_in_patchs);
573 // defaultMesh()->modifier()->coarsenItemsV2(true);
574 // cells_in_patchs.clear();
575 m_cartesian_mesh->coarseZone3D(x->position(), x->length());
576 m_cartesian_mesh->computeDirections();
577 }
578 }
579}
580
581/*---------------------------------------------------------------------------*/
582/*---------------------------------------------------------------------------*/
583
584void AMRCartesianMeshTesterModule::
585_reduceNbGhostLayers()
586{
587 for (auto& x : options()->reduceNbGhostLayers()) {
588 Integer final_nb_ghost_layer{ m_cartesian_mesh->reduceNbGhostLayers(x->level(), x->nbGhostLayers()) };
589
590 if (parallelMng()->commSize() != 1 && final_nb_ghost_layer != x->nbGhostLayers()) {
591 ARCANE_FATAL("Bad nb ghost layers");
592 }
593 //info() << "Final nb ghost layer : " << final_nb_ghost_layer;
594 }
595}
596
597/*---------------------------------------------------------------------------*/
598/*---------------------------------------------------------------------------*/
599
600void AMRCartesianMeshTesterModule::
601compute()
602{
603 _compute1();
604}
605
606/*---------------------------------------------------------------------------*/
607/*---------------------------------------------------------------------------*/
613{
614 Int32 nb_children = cell.nbHChildren();
615 if (nb_children==0)
616 return;
617 // Pour les mailles AMR, la densité est la moyenne des noeuds qui la compose.
618 for( Int32 j=0; j<nb_children; ++j ) {
619 Real sub_density = 0.0;
620 Cell sub_cell = cell.hChild(j);
621 Integer sub_cell_nb_node = sub_cell.nbNode();
622 for( Integer k=0; k<sub_cell_nb_node; ++k )
623 sub_density += m_node_density[sub_cell.node(k)];
625 m_density[sub_cell] =sub_density;
627 }
628}
629
630/*---------------------------------------------------------------------------*/
631/*---------------------------------------------------------------------------*/
632
633void AMRCartesianMeshTesterModule::
634_compute1()
635{
636 // Pour test, on parcours les N directions
637 // et pour chaque maille, on modifie sa densité
638 // par la formule new_density = (density+density_next+density_prev) / 3.0.
639
640 // Effectue l'operation en deux fois. Une premiere sur les
641 // mailles internes, et une deuxieme sur les mailles externes.
642 // Du coup, il faut passer par une variable intermediaire (m_old_density)
643 // mais on evite un test dans la boucle principale
644 IMesh* mesh = defaultMesh();
645 Integer nb_dir = mesh->dimension();
646 for( Integer idir=0; idir<nb_dir; ++idir){
647 m_old_density.copy(m_density);
648 CellDirectionMng cdm(m_cartesian_mesh->cellDirection(idir));
649 // Travail sur les mailles internes
650 info() << "Direction=" << idir << " cells=" << cdm.innerCells().name()
651 << " n=" << cdm.innerCells().size();
652 ENUMERATE_CELL(icell,cdm.innerCells()){
653 Cell cell = *icell;
654 DirCell cc(cdm.cell(cell));
655 Cell next = cc.next();
656 Cell prev = cc.previous();
657 Real d = m_old_density[icell] + m_old_density[next] + m_old_density[prev];
658 m_density[icell] = d / 3.0;
660 }
661 // Travail sur les mailles externes
662 // Test si la maille avant ou apres est nulle.
663 ENUMERATE_CELL(icell,cdm.outerCells()){
664 Cell cell = *icell;
666 Cell next = cc.next();
667 Cell prev = cc.previous();
668 Real d = m_old_density[icell];
669 Integer n = 1;
670 if (!next.null()){
671 d += m_old_density[next];
672 ++n;
673 }
674 if (!prev.null()){
675 d += m_old_density[prev];
676 ++n;
677 }
678 m_density[icell] = d / n;
680 }
681 }
682 // Modifie la densité aux noeuds.
683 // Elle sera égale à la moyenne des densités des mailles entourant ce noeud
685 Node node = *inode;
686 Integer nb_cell = node.nbCell();
687 Real density = 0.0;
688 for( Integer i=0; i<nb_cell; ++i )
689 density += m_density[node.cell(i)];
690 density /= (Real)nb_cell;
691 m_node_density[inode] = density;
692 }
693}
694
695/*---------------------------------------------------------------------------*/
696/*---------------------------------------------------------------------------*/
697
698void AMRCartesianMeshTesterModule::
699_compute2()
700{
701 // Pour test, on parcours les N directions
702 // et pour chaque maille, on modifie sa densité
703 // par la formule new_density = (density+density_next+density_prev) / 3.0.
704
705 // A noter que cette methode ne donne pas le meme comportement que
706 // _compute1() car les mailles de bord et internes sont mises à jour
707 // dans un ordre différent.
708 Integer nb_dir = defaultMesh()->dimension();
709 for( Integer idir=0; idir<nb_dir; ++idir){
710 CellDirectionMng cdm(m_cartesian_mesh->cellDirection(idir));
711 // Travail sur toutes les mailles
712 ENUMERATE_CELL(icell,cdm.allCells()){
714 Cell next = cc.next();
715 Cell prev = cc.previous();
716 Real d = m_density[icell];
717 Integer n = 1;
718 if (!next.null()){
719 d += m_density[next];
720 ++n;
721 }
722 if (!prev.null()){
723 d += m_density[prev];
724 ++n;
725 }
726 m_density[icell] = d / n;
727 }
728 }
729}
730
731/*---------------------------------------------------------------------------*/
732/*---------------------------------------------------------------------------*/
733
734void AMRCartesianMeshTesterModule::
735_writePostProcessing()
736{
737 info() << "Post-process AMR";
738 IPostProcessorWriter* post_processor = options()->postProcessor();
739 Directory output_directory = Directory(subDomain()->exportDirectory(),"amrtestpost1");
740 output_directory.createDirectory();
741 info() << "Creating output dir '" << output_directory.path() << "' for export";
742 UniqueArray<Real> times;
743 times.add(m_global_time());
744 post_processor->setTimes(times);
745 post_processor->setMesh(defaultMesh());
746 post_processor->setBaseDirectoryName(output_directory.path());
747
748 VariableList variables;
749 //variables.add(m_density.variable());
750 //variables.add(m_node_density.variable());
751 for( VariableCellReal* v : m_cell_patch_variables )
752 variables.add(v->variable());
753 post_processor->setVariables(variables);
754 ItemGroupList groups;
755 groups.add(allCells());
756 for( CartesianPatch p : m_cartesian_mesh->patches() )
757 groups.add(p.cells());
758 post_processor->setGroups(groups);
759 IVariableMng* vm = subDomain()->variableMng();
760 vm->writePostProcessing(post_processor);
761}
762
763/*---------------------------------------------------------------------------*/
764/*---------------------------------------------------------------------------*/
765
766void AMRCartesianMeshTesterModule::
767_testDirections()
768{
769 Integer nb_patch = m_cartesian_mesh->nbPatch();
770 Integer nb_dir = m_cartesian_mesh->mesh()->dimension();
772 for( Integer ipatch=0; ipatch<nb_patch; ++ipatch ){
773 ICartesianMeshPatch* p = m_cartesian_mesh->patch(ipatch);
774 for( Integer idir=0; idir<nb_dir; ++idir ){
775 NodeDirectionMng node_dm(p->nodeDirection(idir));
776 node_dm2 = p->nodeDirection(idir);
777 NodeGroup dm_all_nodes = node_dm.allNodes();
781 Node prev_node = dir_node.previous();
782 Node next_node = dir_node.next();
783 Node prev_node2 = dir_node2.previous();
784 Node next_node2 = dir_node2.next();
785 m_utils->checkSameId(prev_node, prev_node2);
786 m_utils->checkSameId(next_node, next_node2);
787 }
788 }
789 }
790}
791
792void AMRCartesianMeshTesterModule::
793_checkDirections()
794{
795 m_cartesian_mesh->computeDirections();
796 IMesh* mesh = m_cartesian_mesh->mesh();
797 bool print_hash = true;
798
801
802 if (print_hash) {
803 info() << "HASH_RESULT direction items of family=" << item_family->name()
804 << " v= " << cell_hash << " expected= " << expected_hash;
805 }
806
807 if (!expected_hash.empty() && cell_hash != expected_hash)
808 ARCANE_FATAL("Bad hash for uniqueId() for direction items of family '{0}' v= {1} expected='{2}'",
809 item_family->fullName(), cell_hash, expected_hash);
810 };
811
812 {
813 debug() << "Check cells direction hash";
817 }
818 {
819 debug() << "Check faces direction hash";
823 }
824 {
825 debug() << "Check nodes direction hash";
829 }
830}
831
844{
845 // +1 car on a le uid dedans.
847
849 {
851 parallelMng()->allGatherVariable(own_items_uid_around, global_items_uid_around);
852
854 {
855 Int64 index = 0;
856 for (Int64 i = 0; i < global_items_uid_around.size(); i += size_of_once_case_around) {
857 Int64 uid = global_items_uid_around[i];
858 ARCANE_ASSERT((uid != -1), ("Un uid dans le tableau est = -1"));
860 }
861 }
862
863 std::sort(global_items_uid.begin(), global_items_uid.end(),
864 [](const Int64* a, const Int64* b) {
865 return *a < *b;
866 });
867
869
870 Int64 index = 0;
871 Int64 previous_uid = -1;
872
873 for (Int64* ptr_uid : global_items_uid) {
874 if (*ptr_uid == previous_uid) {
875 ARCANE_FATAL("Le uid {0} est dupliqué", *ptr_uid);
876 }
878 for (Integer iaround = 0; iaround < size_of_once_case_around; ++iaround) {
880 }
881 }
882 }
883
884 // info() << "final_all_items_uid : " << final_all_items_uid;
885
888 hash_algo.computeHash64(asBytes(final_all_items_uid.constSpan()), hash_result);
890}
891
903{
904 IParallelMng* pm = parallelMng();
905 IMesh* mesh = m_cartesian_mesh->mesh();
906
907 if (pm->commSize() != 1 && mesh->ghostLayerMng()->nbGhostLayer() == 0) {
908 ARCANE_FATAL("Pas compatible sans ghost");
909 }
910
911 Integer nb_patch = m_cartesian_mesh->nbPatch();
912 Integer nb_dir = mesh->dimension();
913 Integer nb_items = mesh->cellFamily()->allItems().own().size();
914
915 // On a que pred et succ.
916 constexpr Integer nb_items_per_dir = 2;
917 constexpr Integer ipred = 0;
918 constexpr Integer isucc = 1;
919
920 // +1 car on a le uid dedans.
922
924
925 Integer index = 0;
926 ENUMERATE_ (Cell, icell, mesh->cellFamily()->allItems().own()) {
927 own_cells_uid_around_cells[index] = icell->uniqueId();
929 }
930
931 auto set_value = [&](Integer dir, Int64 uid, Int64 uid_pred, Int64 uid_succ) -> void {
932 // debug() << " -- dir : " << dir
933 // << " -- uid : " << uid
934 // << " -- uid_pred : " << uid_pred
935 // << " -- uid_succ : " << uid_succ;
936
937 ARCANE_ASSERT((uid != -1), ("Uid ne peut pas être égal à -1"));
938
939 for (Integer i = 0; i < own_cells_uid_around_cells.size(); i += size_of_once_case_around) {
940 if (own_cells_uid_around_cells[i] == uid) {
941 Integer pos_final = i + 1 + (dir * nb_items_per_dir);
942 Integer pos_pred = pos_final + ipred;
943 Integer pos_succ = pos_final + isucc;
945 ARCANE_FATAL("Problème de cohérence entre les patchs (uid={0} -- old_uid_pred={1} -- new_uid_pred={2})", uid, own_cells_uid_around_cells[pos_pred], uid_pred);
946 }
948 ARCANE_FATAL("Problème de cohérence entre les patchs (uid={0} -- old_uid_succ={1} -- new_uid_succ={2})", uid, own_cells_uid_around_cells[pos_succ], uid_succ);
949 }
952 return;
953 }
954 }
955 };
956
957 for (Integer idir = 0; idir < nb_dir; ++idir) {
958 CellDirectionMng cdm(m_cartesian_mesh->cellDirection(idir));
959 ENUMERATE_ (Cell, icell, cdm.allCells().own()) {
960 DirCell cc(cdm.cell(*icell));
961 Cell next = cc.next();
962 Cell prev = cc.previous();
963 set_value(idir, icell->uniqueId(), prev.uniqueId(), next.uniqueId());
964 }
965 }
966
967 for (Integer ipatch = 0; ipatch < nb_patch; ++ipatch) {
968 ICartesianMeshPatch* p = m_cartesian_mesh->patch(ipatch);
969 for (Integer idir = 0; idir < nb_dir; ++idir) {
970 CellDirectionMng cdm(p->cellDirection(idir));
971 ENUMERATE_ (Cell, icell, cdm.allCells().own()) {
972 DirCell cc(cdm.cell(*icell));
973 Cell next = cc.next();
974 Cell prev = cc.previous();
975 set_value(idir, icell->uniqueId(), prev.uniqueId(), next.uniqueId());
976 }
977 }
978 }
979
981}
982
994{
995 IParallelMng* pm = parallelMng();
996 IMesh* mesh = m_cartesian_mesh->mesh();
997
998 if (pm->commSize() != 1 && mesh->ghostLayerMng()->nbGhostLayer() == 0) {
999 ARCANE_FATAL("Pas compatible sans ghost");
1000 }
1001
1002 Integer nb_patch = m_cartesian_mesh->nbPatch();
1003 Integer nb_dir = mesh->dimension();
1004 Integer nb_items = mesh->faceFamily()->allItems().own().size();
1005
1006 // On a que pred et succ.
1007 constexpr Integer nb_items_per_dir = 2;
1008 constexpr Integer ipred = 0;
1009 constexpr Integer isucc = 1;
1010
1011 // +1 car on a le uid dedans.
1013
1015
1016 Integer index = 0;
1017 ENUMERATE_ (Item, iitem, mesh->faceFamily()->allItems().own()) {
1018 own_cells_uid_around_faces[index] = iitem->uniqueId();
1019 index += size_of_once_case_around;
1020 }
1021
1022 auto set_value = [&](Integer ipatch, Int64 uid, Int64 uid_pred, Int64 uid_succ) -> void {
1023 // debug() << " -- uid : " << uid
1024 // << " -- uid_pred : " << uid_pred
1025 // << " -- uid_succ : " << uid_succ;
1026
1027 ARCANE_ASSERT((uid != -1), ("Uid ne peut pas être égal à -1"));
1028
1029 for (Integer i = 0; i < own_cells_uid_around_faces.size(); i += size_of_once_case_around) {
1030 if (own_cells_uid_around_faces[i] == uid) {
1031 Integer pos_final = i + 1 + ipatch * nb_items_per_dir;
1032 Integer pos_pred = pos_final + ipred;
1033 Integer pos_succ = pos_final + isucc;
1035 ARCANE_FATAL("Problème de cohérence entre les patchs (uid={0} -- old_uid_pred={1} -- new_uid_pred={2})", uid, own_cells_uid_around_faces[pos_pred], uid_pred);
1036 }
1038 ARCANE_FATAL("Problème de cohérence entre les patchs (uid={0} -- old_uid_succ={1} -- new_uid_succ={2})", uid, own_cells_uid_around_faces[pos_succ], uid_succ);
1039 }
1042 return;
1043 }
1044 }
1045 };
1046
1047 // // TODO : Il faut pouvoir récupérer le patch correspondant.
1048 // for (Integer idir = 0; idir < nb_dir; ++idir) {
1049 // FaceDirectionMng fdm(m_cartesian_mesh->faceDirection(idir));
1050 // ENUMERATE_ (Face, iface, fdm.allFaces().own()) {
1051 // DirFace cc(fdm.face(*iface));
1052 // Cell next = cc.nextCell();
1053 // Cell prev = cc.previousCell();
1054 // set_value(iface->uniqueId(), prev.uniqueId(), next.uniqueId());
1055 // }
1056 // }
1057
1058 for (Integer ipatch = 0; ipatch < nb_patch; ++ipatch) {
1059 ICartesianMeshPatch* p = m_cartesian_mesh->patch(ipatch);
1060 for (Integer idir = 0; idir < nb_dir; ++idir) {
1061 FaceDirectionMng fdm(p->faceDirection(idir));
1062 ENUMERATE_ (Face, iface, fdm.allFaces().own()) {
1063 DirFace cc(fdm.face(*iface));
1064 Cell next = cc.nextCell();
1065 Cell prev = cc.previousCell();
1066 set_value(ipatch, iface->uniqueId(), prev.uniqueId(), next.uniqueId());
1067 }
1068 }
1069 }
1070
1071 return size_of_once_case_around-1;
1072}
1073
1090{
1091 IParallelMng* pm = parallelMng();
1092 IMesh* mesh = m_cartesian_mesh->mesh();
1093
1094 if (pm->commSize() != 1 && mesh->ghostLayerMng()->nbGhostLayer() == 0) {
1095 ARCANE_FATAL("Pas compatible sans ghost");
1096 }
1097
1098 Integer nb_patch = m_cartesian_mesh->nbPatch();
1099 Integer nb_dir = mesh->dimension();
1100 Integer nb_items = mesh->nodeFamily()->allItems().own().size();
1101
1102 // On a que pred et succ.
1103 constexpr Integer nb_items_per_dir = 2;
1104 constexpr Integer ipred = 0;
1105 constexpr Integer isucc = 1;
1106
1107 // +1 car on a le uid dedans.
1109
1111
1112 Integer index = 0;
1113 ENUMERATE_ (Item, iitem, mesh->nodeFamily()->allItems().own()) {
1114 own_nodes_uid_around_nodes[index] = iitem->uniqueId();
1115 index += size_of_once_case_around;
1116 }
1117
1118 auto set_value = [&](Integer dir, Integer ipatch, Int64 uid, Int64 uid_pred, Int64 uid_succ) {
1119 // debug() << " -- dir : " << dir
1120 // << " -- ipatch : " << ipatch
1121 // << " -- uid : " << uid
1122 // << " -- uid_pred : " << uid_pred
1123 // << " -- uid_succ : " << uid_succ;
1124
1125 ARCANE_ASSERT((uid != -1), ("Uid ne peut pas être égal à -1"));
1126
1127 for (Integer i = 0; i < own_nodes_uid_around_nodes.size(); i += size_of_once_case_around) {
1128 if (own_nodes_uid_around_nodes[i] == uid) {
1129 Integer pos_final = i + 1 + ipatch * (nb_items_per_dir * nb_dir) + dir * nb_items_per_dir;
1130 Integer pos_pred = pos_final + ipred;
1131 Integer pos_succ = pos_final + isucc;
1133 ARCANE_FATAL("Problème de cohérence entre les patchs (uid={0} -- old_uid_pred={1} -- new_uid_pred={2})", uid, own_nodes_uid_around_nodes[pos_pred], uid_pred);
1134 }
1136 ARCANE_FATAL("Problème de cohérence entre les patchs (uid={0} -- old_uid_succ={1} -- new_uid_succ={2})", uid, own_nodes_uid_around_nodes[pos_succ], uid_succ);
1137 }
1140 return;
1141 }
1142 }
1143 };
1144
1145 // // TODO : Il faut pouvoir récupérer le patch correspondant.
1146 // for (Integer idir = 0; idir < nb_dir; ++idir) {
1147 // NodeDirectionMng ndm(m_cartesian_mesh->nodeDirection(idir));
1148 // ENUMERATE_ (Node, inode, ndm.allNodes().own()) {
1149 // DirNode cc(ndm.node(*inode));
1150 // Node next = cc.next();
1151 // Node prev = cc.previous();
1152 // set_value(idir, 0, inode->uniqueId(), prev.uniqueId(), next.uniqueId());
1153 // }
1154 // }
1155
1156 for (Integer ipatch = 0; ipatch < nb_patch; ++ipatch) {
1157 ICartesianMeshPatch* p = m_cartesian_mesh->patch(ipatch);
1158 for (Integer idir = 0; idir < nb_dir; ++idir) {
1159 NodeDirectionMng ndm(p->nodeDirection(idir));
1160 ENUMERATE_ (Node, inode, ndm.allNodes().own()) {
1161 DirNode cc(ndm.node(*inode));
1162 Node next = cc.next();
1163 Node prev = cc.previous();
1164 set_value(idir, ipatch, inode->uniqueId(), prev.uniqueId(), next.uniqueId());
1165 }
1166 }
1167 }
1168
1169 return size_of_once_case_around-1;
1170}
1171
1172/*---------------------------------------------------------------------------*/
1173/*---------------------------------------------------------------------------*/
1174
1175void AMRCartesianMeshTesterModule::
1176_cellsInPatch(Real3 position, Real3 length, bool is_3d, Int32 level, UniqueArray<Int32>& cells_in_patch)
1177{
1178 // Parcours les mailles actives et ajoute dans la liste des mailles
1179 // à raffiner celles qui sont contenues dans le boîte englobante
1180 // spécifiée dans le jeu de données.
1181 Real3 min_pos = position;
1182 Real3 max_pos = min_pos + length;
1183 ENUMERATE_ (Cell, icell, mesh()->allCells()) {
1184 if ((icell->level() == level) || (level == -1 && icell->nbHChildren() == 0)) {
1185 Real3 center = m_cell_center[icell];
1186 bool is_inside_x = center.x > min_pos.x && center.x < max_pos.x;
1187 bool is_inside_y = center.y > min_pos.y && center.y < max_pos.y;
1188 bool is_inside_z = (center.z > min_pos.z && center.z < max_pos.z) || !is_3d;
1190 cells_in_patch.add(icell.itemLocalId());
1191 }
1192 }
1193 }
1194}
1195
1196/*---------------------------------------------------------------------------*/
1197/*---------------------------------------------------------------------------*/
1198
1199ARCANE_REGISTER_MODULE_AMRCARTESIANMESHTESTER(AMRCartesianMeshTesterModule);
1200
1201/*---------------------------------------------------------------------------*/
1202/*---------------------------------------------------------------------------*/
1203
1204} // End namespace ArcaneTest
1205
1206/*---------------------------------------------------------------------------*/
1207/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_FACE(name, group)
Enumérateur générique d'un groupe de faces.
#define ENUMERATE_(type, name, group)
Enumérateur générique d'un groupe d'entité
#define ENUMERATE_CELL(name, group)
Enumérateur générique d'un groupe de mailles.
#define ENUMERATE_NODE(name, group)
Enumérateur générique d'un groupe de noeuds.
Fonctions utilitaires sur le maillage.
Ce fichier contient les différentes fabriques de services et macro pour enregistrer les services.
Module de test pour les infos sur les maillages cartésiens.
Integer _cellsUidAroundFaces(UniqueArray< Int64 > &own_cells_uid_around_faces)
Méthode permettant de récupérer un tableau contenant les mailles autour des faces.
Integer _cellsUidAroundCells(UniqueArray< Int64 > &own_cells_uid_around_cells)
Méthode permettant de récupérer un tableau contenant les mailles autour des mailles.
Integer _nodesUidAroundNodes(UniqueArray< Int64 > &own_nodes_uid_around_nodes)
Méthode permettant de récupérer un tableau contenant les noeuds autour des noeuds.
void _computeSubCellDensity(Cell cell)
Calcule la densité d'une maille AMR.
String _checkDirectionUniqueIdsHashCollective(ArrayView< Int64 > own_items_uid_around, Integer nb_items_around)
Méthode permettant de calculer un hash à partir d'un tableau d'items "autour".
Patch AMR d'un maillage cartésien.
Infos sur les mailles d'une direction spécifique X,Y ou Z d'un maillage structuré.
Maille d'un maillage.
Definition Item.h:1178
Int32 nbHChildren() const
Nombre d'enfants pour l'AMR.
Definition Item.h:1293
Cell hChild(Int32 i) const
i-ème enfant AMR
Definition Item.h:1296
Maille avant et après une maille suivant une direction.
Infos sur maille avant et après une face suivant une direction.
Noeud avant et après un noeud suivant une direction.
Classe gérant un répertoire.
Definition Directory.h:33
virtual String file(const String &file_name) const
Retourne le chemin complet du fichier file_name dans le répertoire.
Definition Directory.cc:138
Infos sur les face d'une direction spécifique X,Y ou Z d'un maillage structuré.
DirFace face(Face f) const
Face direction correspondant à la face f.
FaceGroup allFaces() const
Groupe de toutes les faces dans la direction.
Face d'une maille.
Definition Item.h:932
Interface d'un patch AMR d'un maillage cartésien.
Interface d'un maillage cartésien.
static ICartesianMesh * getReference(const MeshHandleOrMesh &mesh, bool create=true)
Récupère ou créé la référence associée à mesh.
virtual CellDirectionMng cellDirection(eMeshDirection dir)=0
Liste des mailles dans la direction dir.
virtual void recreateFromDump()=0
Recalcule les informations de cartésiennes après une reprise.
virtual void renumberItemsUniqueId(const CartesianMeshRenumberingInfo &v)=0
Renumérote les uniqueId() des entités.
virtual IMesh * mesh() const =0
Maillage associé à ce maillage cartésien.
virtual ICartesianMeshPatch * patch(Int32 index) const =0
Retourne le index-ième patch du maillage.
virtual void refinePatch2D(Real2 position, Real2 length)=0
Raffine en 2D un bloc du maillage cartésien.
virtual void refinePatch3D(Real3 position, Real3 length)=0
Raffine en 3D un bloc du maillage cartésien.
virtual CartesianMeshPatchListView patches() const =0
Vue sur la liste des patchs.
virtual CartesianPatch amrPatch(Int32 index) const =0
Retourne le index-ième patch du maillage.
virtual void coarseZone3D(Real3 position, Real3 length)=0
Dé-raffine en 3D un bloc du maillage cartésien.
virtual void coarseZone2D(Real2 position, Real2 length)=0
Dé-raffine en 2D un bloc du maillage cartésien.
virtual void computeDirections()=0
Calcule les infos pour les accès par direction.
virtual Int32 nbPatch() const =0
Nombre de patchs du maillage.
virtual Integer reduceNbGhostLayers(Integer level, Integer target_nb_ghost_layers)=0
Méthode permettant de supprimer une ou plusieurs couches de mailles fantômes sur un niveau de raffine...
Interface d'une famille d'entités.
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
virtual NodeGroup allNodes()=0
Groupe de tous les noeuds.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
virtual VariableNodeReal3 & nodesCoordinates()=0
Coordonnées des noeuds.
virtual IGhostLayerMng * ghostLayerMng() const =0
Gestionnare de couche fantômes associé
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual void allGatherVariable(ConstArrayView< char > send_buf, Array< char > &recv_buf)=0
Effectue un regroupement sur tous les processeurs.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface d'un écrivain pour les informations de post-traitement.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Interface du gestionnaire de la boucle en temps.
Interface d'une boucle en temps.
Definition ITimeLoop.h:41
static const char * WBuild
appelé lors de la lecture du jeu de données
Definition ITimeLoop.h:50
static const char * WComputeLoop
appelé pendant la boucle de calcul
Definition ITimeLoop.h:48
static const char * WInit
appelé pendant l'initialisation, l'initialisation d'une reprise ou d'un nouveau cas
Definition ITimeLoop.h:52
Interface du gestionnaire de variables.
Classe utilitaire pour imprimer les infos sur une entité.
Definition ItemPrinter.h:35
Int32 nbNode() const
Nombre de noeuds de l'entité
Definition Item.h:765
Classe de base d'un élément de maillage.
Definition Item.h:83
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Definition Item.h:216
constexpr bool null() const
true si l'entité est nul (i.e. non connecté au maillage)
Definition Item.h:207
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Calcule la fonction de hashage MD5 d'un tableau.
Informations pour construire un module.
Infos sur les noeuds d'une direction spécifique X,Y ou Z d'un maillage structuré.
Noeud d'un maillage.
Definition Item.h:564
Cell cell(Int32 i) const
i-ème maille du noeud
Definition Item.h:1568
Int32 nbCell() const
Nombre de mailles connectées au noeud.
Definition Item.h:643
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Exportation d'un maillage au format SVG.
Infos d'un point d'entrée d'une boucle en temps.
Paramètres nécessaires à la construction d'une variable.
Collection de variables.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Chaîne de caractères unicode.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Definition String.cc:227
Vecteur 1D de données avec sémantique par valeur (style STL).
MeshVariableScalarRefT< Cell, Real > VariableCellReal
Grandeur au centre des mailles de type réel.
ARCANE_CARTESIANMESH_EXPORT Ref< CartesianMeshCoarsening2 > createCartesianMeshCoarsening2(ICartesianMesh *cm)
Créé une instance pour gérer le déraffinement du maillage (V2).
ARCANE_CARTESIANMESH_EXPORT Ref< ICartesianMeshAMRPatchMng > cartesianMeshAMRPatchMng(ICartesianMesh *cm)
Créé une instance pour gérer le déraffinement du maillage (V3?).
String toHexaString(ByteConstArrayView input)
Converti un tableau d'octet en sa représentation hexadécimale.
Definition Convert.cc:75
void add(ArrayView< T > lhs, ConstArrayView< T > copy_array)
Ajoute le tableau copy_array dans l'instance.
Definition MathUtils.h:885
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
Real y
deuxième composante du triplet
Definition Real3.h:36
Real z
troisième composante du triplet
Definition Real3.h:37
Real x
première composante du triplet
Definition Real3.h:35