Arcane  v3.15.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
CartesianMesh.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/* CartesianMesh.cc (C) 2000-2024 */
9/* */
10/* Maillage cartésien. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/TraceAccessor.h"
15#include "arcane/utils/NotImplementedException.h"
16#include "arcane/utils/AutoDestroyUserData.h"
17#include "arcane/utils/IUserDataList.h"
18#include "arcane/utils/Ref.h"
19#include "arcane/utils/ScopedPtr.h"
20#include "arcane/utils/PlatformUtils.h"
21#include "arcane/utils/Event.h"
22
23#include "arcane/core/IMesh.h"
24#include "arcane/core/ItemPrinter.h"
25#include "arcane/core/IItemFamily.h"
26#include "arcane/core/IParallelMng.h"
27#include "arcane/core/VariableTypes.h"
28#include "arcane/core/Properties.h"
29#include "arcane/core/IMeshModifier.h"
30#include "arcane/core/MeshStats.h"
31#include "arcane/core/ICartesianMeshGenerationInfo.h"
32#include "arcane/core/MeshEvents.h"
33#include "arcane/core/MeshKind.h"
34#include "arcane/core/internal/IMeshInternal.h"
35
36#include "arcane/cartesianmesh/ICartesianMesh.h"
37#include "arcane/cartesianmesh/CartesianConnectivity.h"
38#include "arcane/cartesianmesh/CartesianMeshRenumberingInfo.h"
39#include "arcane/cartesianmesh/CartesianMeshCoarsening.h"
40#include "arcane/cartesianmesh/CartesianMeshCoarsening2.h"
41#include "arcane/cartesianmesh/CartesianMeshPatchListView.h"
42#include "arcane/cartesianmesh/internal/CartesianMeshPatch.h"
43#include "arcane/cartesianmesh/internal/ICartesianMeshInternal.h"
44
45#include "arcane/cartesianmesh/internal/CartesianMeshUniqueIdRenumbering.h"
46#include "arcane/cartesianmesh/v2/CartesianMeshUniqueIdRenumberingV2.h"
47
48#include "arcane/cartesianmesh/CartesianMeshAMRPatchMng.h"
49#include "arcane/core/IGhostLayerMng.h"
50
51#include <set>
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
62/*---------------------------------------------------------------------------*/
63/*---------------------------------------------------------------------------*/
64
65namespace Arcane
66{
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
74: public TraceAccessor
75, public ICartesianMesh
76{
79 {
80 public:
81
83 : m_cartesian_mesh(cartesian_mesh)
84 {
85 }
86
87 public:
88
90 {
91 return m_cartesian_mesh->_createCartesianMeshCoarsening2();
92 }
94 {
95 m_cartesian_mesh->_addPatchFromExistingChildren(parent_cells_local_id);
96 }
98 {
99 m_amr_mng = makeRef(new CartesianMeshAMRPatchMng(m_cartesian_mesh));
100 }
101
103 {
104 return m_amr_mng;
105 }
106
107 private:
108
109 CartesianMeshImpl* m_cartesian_mesh = nullptr;
111 };
112
113 public:
114
115 explicit CartesianMeshImpl(IMesh* mesh);
116
117 public:
118
119 void build() override;
120
122 IMesh* mesh() const override { return m_mesh; }
123
125 ITraceMng* traceMng() const override { return TraceAccessor::traceMng(); }
126
128 {
129 return m_all_items_direction_info->cellDirection(dir);
130 }
131
133 {
134 return m_all_items_direction_info->cellDirection(idir);
135 }
136
138 {
139 return m_all_items_direction_info->faceDirection(dir);
140 }
141
143 {
144 return m_all_items_direction_info->faceDirection(idir);
145 }
146
148 {
149 return m_all_items_direction_info->nodeDirection(dir);
150 }
151
153 {
154 return m_all_items_direction_info->nodeDirection(idir);
155 }
156
157 void computeDirections() override;
158
159 void recreateFromDump() override;
160
162 {
163 return m_connectivity;
164 }
165
166 Int32 nbPatch() const override { return m_amr_patches.size(); }
167 ICartesianMeshPatch* patch(Int32 index) const override { return m_amr_patches[index].get(); }
168 CartesianPatch amrPatch(Int32 index) const override { return CartesianPatch(m_amr_patches[index].get()); }
169 CartesianMeshPatchListView patches() const override { return CartesianMeshPatchListView(m_amr_patches_pointer); }
170
171 void refinePatch2D(Real2 position,Real2 length) override;
172 void refinePatch3D(Real3 position,Real3 length) override;
173
174 void coarseZone2D(Real2 position, Real2 length) override;
175 void coarseZone3D(Real3 position, Real3 length) override;
176
177 Integer reduceNbGhostLayers(Integer level, Integer target_nb_ghost_layers) override;
178
180
181 void checkValid() const override;
182
184
186 ICartesianMeshInternal* _internalApi() override { return &m_internal_api; }
187
188 private:
189
190 // Implémentation de 'ICartesianMeshInternal'
191 Ref<CartesianMeshCoarsening2> _createCartesianMeshCoarsening2();
192 void _addPatchFromExistingChildren(ConstArrayView<Int32> parent_cells_local_id);
193
194 private:
195
196 InternalApi m_internal_api;
198 // la direction X, Y ou Z
199 Int32 m_local_face_direction[3] = { -1, -1, -1 };
200 IMesh* m_mesh = nullptr;
201 Ref<CartesianMeshPatch> m_all_items_direction_info;
202 CartesianConnectivity m_connectivity;
203 UniqueArray<CartesianConnectivity::Index> m_nodes_to_cell_storage;
204 UniqueArray<CartesianConnectivity::Index> m_cells_to_node_storage;
206 bool m_is_amr = false;
210 UniqueArray<ICartesianMeshPatch*> m_amr_patches_pointer;
211 ScopedPtrT<Properties> m_properties;
212
213 EventObserverPool m_event_pool;
214 bool m_is_mesh_event_added = false;
215 Int64 m_mesh_timestamp = 0;
216 eMeshAMRKind m_amr_type;
217
218 private:
219
220 void _computeMeshDirection(CartesianMeshPatch& cdi,eMeshDirection dir,
224 void _applyRefine(ConstArrayView<Int32> cells_local_id);
225 void _removeCellsInPatches(ConstArrayView<Int32> const_array_view);
226 void _applyCoarse(ConstArrayView<Int32> cells_local_id);
227 void _addPatch(const CellGroup& parent_group);
228 void _saveInfosInProperties();
229
230 std::tuple<CellGroup, NodeGroup>
231 _buildPatchGroups(const CellGroup& cells, Integer patch_level);
232 void _refinePatch(Real3 position, Real3 length, bool is_3d);
233 void _coarseZone(Real3 position, Real3 length, bool is_3d);
234 void _cellsInZone(Real3 position, Real3 length, bool is_3d, UniqueArray<Int32>& cells_local_id);
235 void _checkNeedComputeDirections();
236 void _checkAddObservableMeshChanged();
237 void _addPatchInstance(const Ref<CartesianMeshPatch>& v)
238 {
239 m_amr_patches.add(v);
240 m_amr_patches_pointer.add(v.get());
241 }
242};
243
244/*---------------------------------------------------------------------------*/
245/*---------------------------------------------------------------------------*/
246
247extern "C++" ICartesianMesh*
248arcaneCreateCartesianMesh(IMesh* mesh)
249{
250 auto* cm = new CartesianMeshImpl(mesh);
251 cm->build();
252 return cm;
253}
254
255/*---------------------------------------------------------------------------*/
256/*---------------------------------------------------------------------------*/
257
258CartesianMeshImpl::
259CartesianMeshImpl(IMesh* mesh)
260: TraceAccessor(mesh->traceMng())
261, m_internal_api(this)
262, m_mesh(mesh)
263, m_nodes_to_cell_storage(platform::getDefaultDataAllocator())
264, m_cells_to_node_storage(platform::getDefaultDataAllocator())
265, m_permutation_storage(platform::getDefaultDataAllocator())
266, m_amr_type(mesh->meshKind().meshAMRKind())
267{
268 if (m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly)
269 m_internal_api.initCartesianMeshAMRPatchMng();
270
271 m_all_items_direction_info = makeRef(new CartesianMeshPatch(this,-1));
272 _addPatchInstance(m_all_items_direction_info);
273}
274
275/*---------------------------------------------------------------------------*/
276/*---------------------------------------------------------------------------*/
277
278void CartesianMeshImpl::
279build()
280{
281 m_properties = new Properties(*(mesh()->properties()),"CartesianMesh");
282}
283
284namespace
285{
286const Int32 SERIALIZE_VERSION = 1;
287}
288
289/*---------------------------------------------------------------------------*/
290/*---------------------------------------------------------------------------*/
291
292void CartesianMeshImpl::
293_checkNeedComputeDirections()
294{
295 Int64 new_timestamp = mesh()->timestamp();
296 if (m_mesh_timestamp!=new_timestamp){
297 info() << "Mesh timestamp has changed (old=" << m_mesh_timestamp << " new=" << new_timestamp << ")";
299 }
300}
301
302/*---------------------------------------------------------------------------*/
303/*---------------------------------------------------------------------------*/
304
305void CartesianMeshImpl::
306_saveInfosInProperties()
307{
308 // Sauve le numéro de version pour être sur que c'est OK en reprise
309 m_properties->set("Version",SERIALIZE_VERSION);
310
311 // Sauve les informations des patches
312 UniqueArray<String> patch_group_names;
313 for( const CellGroup& x : m_amr_patch_cell_groups ){
314 patch_group_names.add(x.name());
315 }
316 m_properties->set("PatchGroupNames",patch_group_names);
317}
318
319/*---------------------------------------------------------------------------*/
320/*---------------------------------------------------------------------------*/
321
324{
325 info() << "Creating 'CartesianMesh' infos from dump";
326
327 // Sauve le numéro de version pour être sur que c'est OK en reprise
328 Int32 v = m_properties->getInt32("Version");
329 if (v!=SERIALIZE_VERSION)
330 ARCANE_FATAL("Bad serializer version: trying to read from incompatible checkpoint v={0} expected={1}",
331 v,SERIALIZE_VERSION);
332
333 // Récupère les noms des groupes des patchs
335 m_properties->get("PatchGroupNames",patch_group_names);
336 info(4) << "Found n=" << patch_group_names.size() << " patchs";
338 IItemFamily* cell_family = m_mesh->cellFamily();
339 for( const String& x : patch_group_names ){
340 CellGroup group = cell_family->findGroup(x);
341 if (group.null())
342 ARCANE_FATAL("Can not find cell group '{0}'",x);
343 m_amr_patch_cell_groups.add(group);
344 }
345
347}
348
349/*---------------------------------------------------------------------------*/
350/*---------------------------------------------------------------------------*/
351
352void CartesianMeshImpl::
353_checkAddObservableMeshChanged()
354{
355 if (m_is_mesh_event_added)
356 return;
357 m_is_mesh_event_added = true;
358 // Pour appeler automatiquement 'computeDirections()' après un appel à
359 // IMesh::prepareForDump().
360 auto f1 = [&](const MeshEventArgs&){ this->_checkNeedComputeDirections(); };
361 mesh()->eventObservable(eMeshEventType::EndPrepareDump).attach(m_event_pool,f1);
362}
363
364/*---------------------------------------------------------------------------*/
365/*---------------------------------------------------------------------------*/
366
369{
370 info() << "CartesianMesh: computeDirections()";
371
372 m_mesh_timestamp = mesh()->timestamp();
373 _checkAddObservableMeshChanged();
374
375 m_amr_patches.clear();
376 m_amr_patches_pointer.clear();
377 _addPatchInstance(m_all_items_direction_info);
378
379 m_is_amr = m_mesh->isAmrActivated();
380
381 VariableCellReal3 cells_center(VariableBuildInfo(m_mesh,"TemporaryCartesianMeshCellCenter"));
382 VariableFaceReal3 faces_center(VariableBuildInfo(m_mesh,"TemporaryCartesianMeshFaceCenter"));
383
384 // Calcule les coordonnées du centre des mailles.
385 VariableNodeReal3& nodes_coord = m_mesh->nodesCoordinates();
386 ENUMERATE_CELL(icell,m_mesh->allCells()){
387 Cell cell = *icell;
388 Real3 center;
389 for( NodeLocalId inode : cell.nodeIds() )
390 center += nodes_coord[inode];
391 center /= cell.nbNode();
392 cells_center[icell] = center;
393 }
394 ENUMERATE_FACE(iface,m_mesh->allFaces()){
395 Face face = *iface;
396 Real3 center;
397 for( NodeLocalId inode : face.nodeIds() )
398 center += nodes_coord[inode];
399 center /= face.nbNode();
400 faces_center[iface] = center;
401 }
402
403 IItemFamily* cell_family = m_mesh->cellFamily();
404 IItemFamily* node_family = m_mesh->nodeFamily();
405 Int32 next_face_x = -1;
406 Int32 next_face_y = -1;
407 Int32 next_face_z = -1;
408
409 CellVectorView cell_view = cell_family->allItems().view();
410 Cell cell0 = cell_view[0];
411 Integer nb_face = cell0.nbFace();
412 Integer nb_node = cell0.nbNode();
414
415 info(4) << "sizeof(CellDirectionMng)=" << sizeof(CellDirectionMng)
416 << " sizeof(FaceDirectionMng)=" << sizeof(FaceDirectionMng)
417 << " sizeof(NodelDirectionMng)=" << sizeof(NodeDirectionMng);
418 info(4) << "sizeof(IndexedItemConnectivityViewBase)=" << sizeof(IndexedItemConnectivityViewBase)
419 << " sizeof(CellInfoListView)=" << sizeof(CellInfoListView);
420 info(4) << "Cartesian mesh compute directions is_amr=" << m_is_amr;
421
422 for( Integer i=0; i<nb_node; ++i ){
423 Node node = cell0.node(i);
424 info(4) << "Node I=" << i << " node=" << ItemPrinter(node) << " pos=" << nodes_coord[node];
425 }
426
427 bool is_3d = m_mesh->dimension() == 3;
428
429 // On suppose que toutes les mailles ont le même sens de numérotation dans le maillage.
430 // Par exemple, pour toutes les mailles, la face d'indice 0 est celle du haut, celle
431 // d'indice 1 celle de droite.
432 if (is_3d) {
433 Real max_x = -1;
434 Real max_y = -1;
435 Real max_z = -1;
436
437 for (Integer i = 0; i < nb_face; ++i) {
438 Face f = cell0.face(i);
439
441
442 Real diff_x = next_center.x - cell_center.x;
443 Real diff_y = next_center.y - cell_center.y;
444 Real diff_z = next_center.z - cell_center.z;
445
446 info(4) << "NEXT_FACE=" << ItemPrinter(f) << " center=" << next_center << " diff=" << Real3(diff_x, diff_y, diff_z);
447
448 if (diff_x > max_x) {
449 max_x = diff_x;
450 next_face_x = i;
451 }
452
453 if (diff_y > max_y) {
454 max_y = diff_y;
455 next_face_y = i;
456 }
457
458 if (diff_z > max_z) {
459 max_z = diff_z;
460 next_face_z = i;
461 }
462 }
463 info(4) << "Advance in direction X -> " << next_face_x;
464 info(4) << "Advance in direction Y -> " << next_face_y;
465 info(4) << "Advance in direction Z -> " << next_face_z;
466 }
467 else {
468 Real max_x = -1;
469 Real max_y = -1;
470
471 for (Integer i = 0; i < nb_face; ++i) {
472 Face f = cell0.face(i);
473
475
476 Real diff_x = next_center.x - cell_center.x;
477 Real diff_y = next_center.y - cell_center.y;
478
479 info(4) << "NEXT_FACE=" << ItemPrinter(f) << " center=" << next_center << " diff=" << Real2(diff_x, diff_y);
480
481 if (diff_x > max_x) {
482 max_x = diff_x;
483 next_face_x = i;
484 }
485
486 if (diff_y > max_y) {
487 max_y = diff_y;
488 next_face_y = i;
489 }
490 }
491 info(4) << "Advance in direction X -> " << next_face_x;
492 info(4) << "Advance in direction Y -> " << next_face_y;
493 }
494 m_all_items_direction_info->_internalComputeNodeCellInformations(cell0,cells_center[cell0],nodes_coord);
495
496 info() << "Informations from IMesh properties:";
497
498 auto* cmgi = ICartesianMeshGenerationInfo::getReference(m_mesh,true);
499
500 info() << "GlobalNbCell = " << cmgi->globalNbCells();
501 info() << "OwnNbCell: " << cmgi->ownNbCells();
502 info() << "SubDomainOffset: " << cmgi->subDomainOffsets();
503 info() << "OwnCellOffset: " << cmgi->ownCellOffsets();
504
505 CellGroup all_cells = cell_family->allItems();
506 NodeGroup all_nodes = node_family->allItems();
507 if (m_is_amr){
508 auto x = _buildPatchGroups(mesh()->allLevelCells(0),0);
509 all_cells = std::get<0>(x);
510 all_nodes = std::get<1>(x);
511 }
512
513 if (next_face_x!=(-1)){
515 _computeMeshDirection(*m_all_items_direction_info.get(),MD_DirX,cells_center,faces_center,all_cells,all_nodes);
516 }
517 if (next_face_y!=(-1)){
519 _computeMeshDirection(*m_all_items_direction_info.get(),MD_DirY,cells_center,faces_center,all_cells,all_nodes);
520 }
521 if (next_face_z != (-1)) {
523 _computeMeshDirection(*m_all_items_direction_info.get(),MD_DirZ,cells_center,faces_center,all_cells,all_nodes);
524 }
525
526 // Positionne les informations par direction
527 for( Integer idir=0, nb_dir=mesh()->dimension(); idir<nb_dir; ++idir ){
528 CellDirectionMng& cdm = m_all_items_direction_info->cellDirection(idir);
529 cdm._internalSetOffsetAndNbCellInfos(cmgi->globalNbCells()[idir], cmgi->ownNbCells()[idir],
530 cmgi->subDomainOffsets()[idir], cmgi->ownCellOffsets()[idir]);
531 }
532
533 info() << "Compute cartesian connectivity";
534
535 m_permutation_storage.resize(1);
536 m_permutation_storage[0].compute();
537 m_nodes_to_cell_storage.resize(mesh()->nodeFamily()->maxLocalId());
538 m_cells_to_node_storage.resize(mesh()->cellFamily()->maxLocalId());
539 m_connectivity._setStorage(m_nodes_to_cell_storage,m_cells_to_node_storage,&m_permutation_storage[0]);
540 m_connectivity._computeInfos(mesh(),nodes_coord,cells_center);
541
542 // Ajoute informations de connectivités pour les patchs AMR
543 // TODO: supporter plusieurs appels à cette méthode
544 for( const CellGroup& cells : m_amr_patch_cell_groups ){
545 Integer patch_index = m_amr_patches.size();
546 info() << "AMR Patch name=" << cells.name() << " size=" << cells.size() << " index=" << patch_index;
547 auto* cdi = new CartesianMeshPatch(this,patch_index);
548 _addPatchInstance(makeRef(cdi));
549 cdi->_internalComputeNodeCellInformations(cell0,cells_center[cell0],nodes_coord);
550 auto [ patch_cells, patch_nodes ] = _buildPatchGroups(cells,patch_index);
553 if (is_3d)
555 }
556
557 if (arcaneIsCheck())
558 checkValid();
559
560 _saveInfosInProperties();
561}
562
563/*---------------------------------------------------------------------------*/
564/*---------------------------------------------------------------------------*/
565
566std::tuple<CellGroup,NodeGroup> CartesianMeshImpl::
567_buildPatchGroups(const CellGroup& cells,Integer patch_level)
568{
569 // On créé un groupe pour chaque patch en garantissant que l'ordre de parcours
570 // est celui des uniqueId() des entités
571 // TODO: à terme, il faudrait que l'ordre de parcours soit le même que
572 // celui du maillage cartésien. Pour cela, il faut soit que les uniqueId()
573 // des mailles/noeuds créés soient dans le même ordre que le maillage cartésien,
574 // soit que la fonction de tri soit spécifique à ce type de maillage.
575 NodeGroup nodes = cells.nodeGroup();
578
579 String cell_group_name = String("AMRPatchCells") + patch_level;
581 // Met les mêmes mailles que \a cells mais force le tri
582 patch_cells.setItems(cells.view().localIds(),true);
583
584 String node_group_name = String("AMRPatchNodes") + patch_level;
586 // Met les mêmes noeuds que \a nodes mais force le tri
587 patch_nodes.setItems(nodes.view().localIds(),true);
588 info(4) << "PATCH_CELLS name=" << patch_cells.name() << " size=" << patch_cells.size();
589 info(4) << "PATCH_NODES name=" << patch_nodes.name() << " size=" << patch_nodes.size();
590 return { patch_cells, patch_nodes };
591}
592
593/*---------------------------------------------------------------------------*/
594/*---------------------------------------------------------------------------*/
595
596void CartesianMeshImpl::
597_computeMeshDirection(CartesianMeshPatch& cdi,eMeshDirection dir,VariableCellReal3& cells_center,
598 VariableFaceReal3& faces_center,CellGroup all_cells,NodeGroup all_nodes)
599{
600 IItemFamily* cell_family = m_mesh->cellFamily();
601 IItemFamily* face_family = m_mesh->faceFamily();
602 IItemFamily* node_family = m_mesh->nodeFamily();
603
604 Int32 max_cell_id = cell_family->maxLocalId();
605 Int32 max_face_id = face_family->maxLocalId();
606 Int32 max_node_id = node_family->maxLocalId();
607
608 CellDirectionMng& cell_dm = cdi.cellDirection(dir);
609 cell_dm._internalResizeInfos(max_cell_id);
610
611 FaceDirectionMng& face_dm = cdi.faceDirection(dir);
612 face_dm._internalResizeInfos(max_face_id);
613
614 NodeDirectionMng& node_dm = cdi.nodeDirection(dir);
615 node_dm._internalResizeInfos(max_node_id);
616
617 //TODO: attention à remettre à jour après changement de maillage.
618 info(4) << "COMPUTE DIRECTION dir=" << dir;
619
620 Int32 prev_local_face = -1;
621 Int32 next_local_face = m_local_face_direction[dir];
622 Integer mesh_dim = m_mesh->dimension();
623 // Calcul le numero local de face oppose à la face suivante.
624 if (mesh_dim==2)
625 prev_local_face = (next_local_face + 2) % 4;
626 else if (mesh_dim==3)
627 prev_local_face = (next_local_face + 3) % 6;
628
629 cell_dm._internalSetLocalFaceIndex(next_local_face,prev_local_face);
630
631 // Positionne pour chaque maille les faces avant et après dans la direction.
632 // On s'assure que ces entités sont dans le groupe des entités de la direction correspondante
633 std::set<Int32> cells_set;
634 ENUMERATE_CELL(icell,all_cells){
635 cells_set.insert(icell.itemLocalId());
636 }
637
638 // Calcule les mailles devant/derrière. En cas de patch AMR, il faut que ces deux mailles
639 // soient de même niveau
640 ENUMERATE_CELL(icell,all_cells){
641 Cell cell = *icell;
642 Int32 my_level = cell.level();
643 Face next_face = cell.face(next_local_face);
644 Cell next_cell = next_face.backCell()==cell ? next_face.frontCell() : next_face.backCell();
645 if (cells_set.find(next_cell.localId())==cells_set.end())
646 next_cell = Cell();
647 else if (next_cell.level()!=my_level)
648 next_cell = Cell();
649
650 Face prev_face = cell.face(prev_local_face);
651 Cell prev_cell = prev_face.backCell()==cell ? prev_face.frontCell() : prev_face.backCell();
652 if (cells_set.find(prev_cell.localId())==cells_set.end())
653 prev_cell = Cell();
654 else if (prev_cell.level()!=my_level)
655 prev_cell = Cell();
656 cell_dm.m_infos_view[icell.itemLocalId()] = CellDirectionMng::ItemDirectionInfo(next_cell,prev_cell);
657 }
658 cell_dm._internalComputeInnerAndOuterItems(all_cells);
659 face_dm._internalComputeInfos(cell_dm,cells_center,faces_center);
660 node_dm._internalComputeInfos(cell_dm,all_nodes,cells_center);
661}
662
663/*---------------------------------------------------------------------------*/
664/*---------------------------------------------------------------------------*/
665
666void CartesianMeshImpl::
667_refinePatch(Real3 position,Real3 length, bool is_3d)
668{
669 UniqueArray<Int32> cells_local_id;
670 _cellsInZone(position, length, is_3d, cells_local_id);
671
672 _applyRefine(cells_local_id);
673 _saveInfosInProperties();
674}
675
676/*---------------------------------------------------------------------------*/
677/*---------------------------------------------------------------------------*/
678
679void CartesianMeshImpl::
680_coarseZone(Real3 position, Real3 length, bool is_3d)
681{
682 UniqueArray<Int32> cells_local_id;
683 _cellsInZone(position, length, is_3d, cells_local_id);
684
685 _applyCoarse(cells_local_id);
686 _saveInfosInProperties();
687}
688
689/*---------------------------------------------------------------------------*/
690/*---------------------------------------------------------------------------*/
691
692void CartesianMeshImpl::
693_cellsInZone(Real3 position, Real3 length, bool is_3d, UniqueArray<Int32>& cells_local_id)
694{
695 VariableNodeReal3& nodes_coord = m_mesh->nodesCoordinates();
696 // Parcours les mailles actives et ajoute dans la liste des mailles
697 // à raffiner celles qui sont contenues dans la boîte englobante
698 // spécifiée dans le jeu de données.
699 Real3 min_pos = position;
700 Real3 max_pos = min_pos + length;
701 cells_local_id.clear();
702 ENUMERATE_CELL (icell, m_mesh->allActiveCells()) {
703 Cell cell = *icell;
704 Real3 center;
705 for (NodeLocalId inode : cell.nodeIds())
706 center += nodes_coord[inode];
707 center /= cell.nbNode();
708 bool is_inside_x = center.x > min_pos.x && center.x < max_pos.x;
709 bool is_inside_y = center.y > min_pos.y && center.y < max_pos.y;
710 bool is_inside_z = (center.z > min_pos.z && center.z < max_pos.z) || !is_3d;
711 if (is_inside_x && is_inside_y && is_inside_z) {
712 cells_local_id.add(icell.itemLocalId());
713 }
714 }
715}
716
717/*---------------------------------------------------------------------------*/
718/*---------------------------------------------------------------------------*/
719
721refinePatch2D(Real2 position,Real2 length)
722{
723 info() << "REFINEMENT 2D position=" << position << " length=" << length;
724 Real3 position_3d(position.x,position.y,0.0);
725 Real3 length_3d(length.x,length.y,0.0);
726 _refinePatch(position_3d,length_3d,false);
727}
728
729/*---------------------------------------------------------------------------*/
730/*---------------------------------------------------------------------------*/
731
733refinePatch3D(Real3 position,Real3 length)
734{
735 info() << "REFINEMENT 3D position=" << position << " length=" << length;
736 _refinePatch(position,length,true);
737}
738
739/*---------------------------------------------------------------------------*/
740/*---------------------------------------------------------------------------*/
741
743coarseZone2D(Real2 position, Real2 length)
744{
745 info() << "COARSEN 2D position=" << position << " length=" << length;
746 Real3 position_3d(position.x, position.y, 0.0);
747 Real3 length_3d(length.x, length.y, 0.0);
748 _coarseZone(position_3d, length_3d, false);
749}
750
751/*---------------------------------------------------------------------------*/
752/*---------------------------------------------------------------------------*/
753
755coarseZone3D(Real3 position, Real3 length)
756{
757 info() << "COARSEN 3D position=" << position << " length=" << length;
758 _coarseZone(position, length, true);
759}
760
761/*---------------------------------------------------------------------------*/
762/*---------------------------------------------------------------------------*/
763
765reduceNbGhostLayers(Integer level, Integer target_nb_ghost_layers)
766{
767 if (level < 1) {
768 ARCANE_FATAL("You cannot reduce number of ghost layer of level 0 with this method");
769 }
770
771 // Nombre de couche de maille fantôme max. Bof; à modifier.
772 const Int32 max_nb_layer = 128;
773 Int32 level_max = 0;
774
775 ENUMERATE_ (Cell, icell, m_mesh->allCells()) {
776 level_max = std::max(level_max, icell->level());
777 }
778
779 level_max = m_mesh->parallelMng()->reduce(Parallel::ReduceMax, level_max);
780 //debug() << "Level max : " << level_max;
781
783
784 Integer level_0_nb_ghost_layer = m_mesh->ghostLayerMng()->nbGhostLayer();
785 //debug() << "NbGhostLayers level 0 : " << level_0_nb_ghost_layer;
786
787 if (level_0_nb_ghost_layer == 0) {
788 return 0;
789 }
790
791 Integer nb_ghost_layer = Convert::toInt32(level_0_nb_ghost_layer * pow(2, level));
792
793 //debug() << "NbGhostLayers level " << level << " : " << nb_ghost_layer;
794
795 // On considère qu'on a toujours 2*2 mailles filles (2*2*2 en 3D).
796 if (target_nb_ghost_layers % 2 != 0) {
798 }
799
801 return nb_ghost_layer;
802 }
803
804 //debug() << "TargetNbGhostLayers level " << level << " : " << target_nb_ghost_layers;
805
806 Integer parent_level = level - 1;
808
809 // TODO AH : On est forcé de dé-raffiner niveau par niveau. À changer.
811
812 //UniqueArray<Int32> cell_lid;
813 std::function<void(Cell)> children_list;
814
815 children_list = [&cell_lid2, &children_list](Cell cell) -> void {
816 for (Integer i = 0; i < cell.nbHChildren(); ++i) {
817 //debug() << "child of lid=" << cell.localId() << " : lid=" << cell.hChild(i).localId() << " -- level : " << cell.level();
818 cell_lid2[cell.level()].add(cell.hChild(i).localId());
819 children_list(cell.hChild(i));
820 }
821 };
822
823 // Algorithme de numérotation des couches de mailles fantômes.
824 {
825 VariableNodeInt32 level_node{ VariableBuildInfo{ m_mesh, "LevelNode" } };
826 level_node.fill(-1);
827
828 VariableCellInt32 level_cell{ VariableBuildInfo{ m_mesh, "LevelCell" } };
829 level_cell.fill(-1);
830
831 ENUMERATE_ (Face, iface, m_mesh->allFaces()) {
832 Cell front_cell = iface->frontCell();
833 Cell back_cell = iface->backCell();
834 if (
835 ((front_cell.null() || (!front_cell.isOwn() && front_cell.level() == parent_level)) && ((!back_cell.null()) && (back_cell.isOwn() && back_cell.level() == parent_level))) ||
836 ((back_cell.null() || (!back_cell.isOwn() && back_cell.level() == parent_level)) && ((!front_cell.null()) && (front_cell.isOwn() && front_cell.level() == parent_level)))) {
837 for (Node node : iface->nodes()) {
838 level_node[node] = 0;
839 //debug() << "Node layer 0 : " << node.uniqueId();
840 }
841 }
842 }
843
844 bool is_modif = true;
845 Int32 current_layer = 0;
846 while (is_modif) {
847 is_modif = false;
848
849 ENUMERATE_ (Cell, icell, m_mesh->allCells()) {
850 if (icell->isOwn() || icell->level() != parent_level || level_cell[icell] != -1) {
851 continue;
852 }
853
854 Int32 min = max_nb_layer;
855 Int32 max = -1;
856
857 for (Node node : icell->nodes()) {
858 Int32 nlevel = level_node[node];
859 if (nlevel != -1) {
860 min = std::min(min, nlevel);
861 max = std::max(max, nlevel);
862 }
863 }
864
865 // On fait couche par couche (voir pour enlever cette limitation).
866 if (min != current_layer) {
867 continue;
868 }
869
870 // Maille n'ayant pas de nodes déjà traités.
871 if (min == max_nb_layer && max == -1) {
872 continue;
873 }
874
875 Integer new_level = ((min == max) ? min + 1 : max);
876
877 for (Node node : icell->nodes()) {
878 Int32 nlevel = level_node[node];
879 if (nlevel == -1) {
880 level_node[node] = new_level;
881 //debug() << "Node layer " << new_level << " : " << node.uniqueId();
882 is_modif = true;
883 }
884 }
885
886 level_cell[icell] = min;
887
888 //debug() << "Cell uid : " << icell->uniqueId()
889 // << " -- Layer : " << min;
890
891 if (min >= parent_target_nb_ghost_layer) {
893 }
894 }
897 ARCANE_FATAL("Error in ghost layer counter algo. Report it plz.");
898 }
899 }
900 }
901
902 for (Integer i = level_max - 1; i >= 0; --i) {
903 // Une comm pour en éviter plein d'autres.
904 if (m_mesh->parallelMng()->reduce(Parallel::ReduceMax, cell_lid2[i].size()) == 0) {
905 continue;
906 }
907 //debug() << "Removing children of ghost cell (parent level=" << i << ") (children localIds) : " << cell_lid2[i];
908
909 m_mesh->modifier()->flagCellToCoarsen(cell_lid2[i]);
910 m_mesh->modifier()->coarsenItemsV2(false);
911 }
912
913 info() << "Nb ghost layer for level " << level << " : " << target_nb_ghost_layers;
914
916}
917
918/*---------------------------------------------------------------------------*/
919/*---------------------------------------------------------------------------*/
920
921void CartesianMeshImpl::
922_addPatchFromExistingChildren(ConstArrayView<Int32> parent_cells_local_id)
923{
924 IItemFamily* cell_family = m_mesh->cellFamily();
925 Integer index = m_amr_patch_cell_groups.size();
926 String parent_group_name = String("CartesianMeshPatchParentCells")+index;
929}
930
931/*---------------------------------------------------------------------------*/
932/*---------------------------------------------------------------------------*/
938{
939 Integer index = m_amr_patch_cell_groups.size();
940 // Créé le groupe contenant les mailles AMR
941 // Il s'agit des mailles filles de \a parent_cells
942 String children_group_name = String("CartesianMeshPatchCells")+index;
945 Cell c = *icell;
946 for(Integer k=0; k<c.nbHChildren(); ++k ){
947 Cell child = c.hChild(k);
948 children_local_id.add(child.localId());
949 }
950 }
951 IItemFamily* cell_family = m_mesh->cellFamily();
954}
955
956/*---------------------------------------------------------------------------*/
957/*---------------------------------------------------------------------------*/
958
959void CartesianMeshImpl::
960_removeCellsInPatches(ConstArrayView<Int32> const_array_view)
961{
962 for (CellGroup cells : m_amr_patch_cell_groups) {
964 }
965
966 IParallelMng* pm = m_mesh->parallelMng();
967
968 auto new_end = std::remove_if(m_amr_patch_cell_groups.begin(), m_amr_patch_cell_groups.end(),
969 [&pm](const CellGroup& cells) { return pm->reduce(Parallel::ReduceMax, cells.size()) == 0; });
970
971 m_amr_patch_cell_groups.resize(new_end - m_amr_patch_cell_groups.begin());
972}
973
974/*---------------------------------------------------------------------------*/
975/*---------------------------------------------------------------------------*/
976
977void CartesianMeshImpl::
978_applyRefine(ConstArrayView<Int32> cells_local_id)
979{
980 IItemFamily* cell_family = m_mesh->cellFamily();
981 Integer nb_cell = cells_local_id.size();
982 info(4) << "Local_NbCellToRefine = " << nb_cell;
983 Integer index = m_amr_patch_cell_groups.size();
984 String parent_group_name = String("CartesianMeshPatchParentCells")+index;
985 CellGroup parent_cells = cell_family->createGroup(parent_group_name,cells_local_id,true);
986
987 IParallelMng* pm = m_mesh->parallelMng();
988 Int64 total_nb_cell = pm->reduce(Parallel::ReduceSum,nb_cell);
989 info(4) << "Global_NbCellToRefine = " << total_nb_cell;
990 if (total_nb_cell==0)
991 return;
992
993 if(m_amr_type == eMeshAMRKind::Cell) {
994 debug() << "Refine with modifier() (for all mesh types)";
995 m_mesh->modifier()->flagCellToRefine(cells_local_id);
996 m_mesh->modifier()->adapt();
997 }
998 else if(m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly) {
999 debug() << "Refine with specific refiner (for cartesian mesh only)";
1001 m_internal_api.cartesianMeshAMRPatchMng()->flagCellToRefine(cells_local_id);
1002 m_internal_api.cartesianMeshAMRPatchMng()->refine();
1003 }
1004 else if(m_amr_type == eMeshAMRKind::Patch) {
1005 ARCANE_FATAL("General patch AMR is not implemented. Please use PatchCartesianMeshOnly (3)");
1006 }
1007 else{
1008 ARCANE_FATAL("AMR is not enabled");
1009 }
1010
1011 {
1012 MeshStats ms(traceMng(),m_mesh,m_mesh->parallelMng());
1013 ms.dumpStats();
1014 }
1015 _addPatch(parent_cells);
1016}
1017
1018/*---------------------------------------------------------------------------*/
1019/*---------------------------------------------------------------------------*/
1020
1021void CartesianMeshImpl::
1022_applyCoarse(ConstArrayView<Int32> cells_local_id)
1023{
1024 Integer nb_cell = cells_local_id.size();
1025 info(4) << "Local_NbCellToCoarsen = " << nb_cell;
1026
1027 IParallelMng* pm = m_mesh->parallelMng();
1028 Int64 total_nb_cell = pm->reduce(Parallel::ReduceSum, nb_cell);
1029 info(4) << "Global_NbCellToCoarsen = " << total_nb_cell;
1030 if (total_nb_cell == 0)
1031 return;
1032
1033 _removeCellsInPatches(cells_local_id);
1034
1035 if (m_amr_type == eMeshAMRKind::Cell) {
1036 debug() << "Coarse with modifier() (for all mesh types)";
1037 m_mesh->modifier()->flagCellToCoarsen(cells_local_id);
1038 m_mesh->modifier()->coarsenItemsV2(true);
1039 }
1040 else if (m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly) {
1041 ARCANE_NOT_YET_IMPLEMENTED("Patch AMR for Cartesian only is not implemented yet");
1042 }
1043 else if (m_amr_type == eMeshAMRKind::Patch) {
1044 ARCANE_FATAL("General patch AMR is not implemented. Please use PatchCartesianMeshOnly (3)");
1045 }
1046 else {
1047 ARCANE_FATAL("AMR is not enabled");
1048 }
1049
1050 {
1051 MeshStats ms(traceMng(), m_mesh, m_mesh->parallelMng());
1052 ms.dumpStats();
1053 }
1054}
1055
1056/*---------------------------------------------------------------------------*/
1057/*---------------------------------------------------------------------------*/
1058
1060checkValid() const
1061{
1062 info(4) << "Check valid CartesianMesh";
1063 Integer nb_patch = nbPatch();
1064 for( Integer i=0; i<nb_patch; ++i ){
1066 p->checkValid();
1067 }
1068}
1069
1070/*---------------------------------------------------------------------------*/
1071/*---------------------------------------------------------------------------*/
1072
1075{
1076 auto* cmgi = ICartesianMeshGenerationInfo::getReference(m_mesh,true);
1077
1078 // Regarde d'abord si on renumérote les faces
1079 Int32 face_method = v.renumberFaceMethod();
1080 if (face_method!=0 && face_method!=1)
1081 ARCANE_FATAL("Invalid value '{0}' for renumberFaceMethod(). Valid values are 0 or 1",
1082 face_method);
1083 if (face_method==1)
1084 ARCANE_THROW(NotImplementedException,"Method 1 for face renumbering");
1085
1086 // Regarde ensuite les patchs si demandé.
1087 Int32 patch_method = v.renumberPatchMethod();
1089 ARCANE_FATAL("Invalid value '{0}' for renumberPatchMethod(). Valid values are 0, 1, 2, 3 or 4",
1090 patch_method);
1091
1092 else if (patch_method == 1 || patch_method == 3 || patch_method == 4){
1094 renumberer.renumber();
1095 }
1096 else if (patch_method == 2){
1097 warning() << "The patch method 2 is experimental!";
1099 renumberer.renumber();
1100 }
1101
1102 // Termine par un tri éventuel.
1103 if (v.isSortAfterRenumbering()){
1104 info() << "Compacting and Sorting after renumbering";
1105 m_mesh->nodeFamily()->compactItems(true);
1106 m_mesh->faceFamily()->compactItems(true);
1107 m_mesh->cellFamily()->compactItems(true);
1109 }
1110}
1111
1112/*---------------------------------------------------------------------------*/
1113/*---------------------------------------------------------------------------*/
1114
1120
1121/*---------------------------------------------------------------------------*/
1122/*---------------------------------------------------------------------------*/
1123
1124Ref<CartesianMeshCoarsening2> CartesianMeshImpl::
1125_createCartesianMeshCoarsening2()
1126{
1127 return makeRef(new CartesianMeshCoarsening2(this));
1128}
1129
1130/*---------------------------------------------------------------------------*/
1131/*---------------------------------------------------------------------------*/
1132
1133/*---------------------------------------------------------------------------*/
1134/*---------------------------------------------------------------------------*/
1135
1138{
1139 MeshHandle h = mesh_handle_or_mesh.handle();
1140 //TODO: faire lock pour multi-thread
1141 const char* name = "CartesianMesh";
1142 IUserDataList* udlist = h.meshUserDataList();
1143
1144 IUserData* ud = udlist->data(name,true);
1145 if (!ud){
1146 if (!create)
1147 return nullptr;
1148 IMesh* mesh = h.meshOrNull();
1149 if (!mesh)
1150 ARCANE_FATAL("The mesh {0} is not yet created",h.meshName());
1151 ICartesianMesh* cm = arcaneCreateCartesianMesh(mesh);
1152 udlist->setData(name,new AutoDestroyUserData<ICartesianMesh>(cm));
1153
1154 // Indique que le maillage est cartésien
1155 MeshKind mk = mesh->meshKind();
1156 mk.setMeshStructure(eMeshStructure::Cartesian);
1157 mesh->_internalApi()->setMeshKind(mk);
1158
1159 return cm;
1160 }
1162 if (!adud)
1163 ARCANE_FATAL("Can not cast to ICartesianMesh*");
1164 return adud->data();
1165}
1166
1167/*---------------------------------------------------------------------------*/
1168/*---------------------------------------------------------------------------*/
1169
1170} // End namespace Arcane
1171
1172/*---------------------------------------------------------------------------*/
1173/*---------------------------------------------------------------------------*/
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fichier contenant les mécanismes de gestion des évènements.
#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.
Informations de connectivité d'un maillage cartésien.
void _computeInfos(IMesh *mesh, VariableNodeReal3 &nodes_coord, VariableCellReal3 &cells_coord)
Calcule les infos de connectivité.
void _setStorage(ArrayView< Index > nodes_to_cell, ArrayView< Index > cells_to_node, const Permutation *permutation)
Positionne les tableaux contenant les infos de connectivité
Déraffine un maillage cartésien par 2.
Déraffine un maillage cartésien par 2.
void addPatchFromExistingChildren(ConstArrayView< Int32 > parent_cells_local_id) override
Créé un patch avec tous les enfants des mailles parent_cells_local_id.
Ref< ICartesianMeshAMRPatchMng > cartesianMeshAMRPatchMng() override
Méthode permettant de récupérer l'instance de CartesianMeshAMRPatchMng.
Ref< CartesianMeshCoarsening2 > createCartesianMeshCoarsening2() override
Créé une instance pour gérer le déraffinement du maillage (V2).
void initCartesianMeshAMRPatchMng() override
Méthode permettant de créer une instance de CartesianMeshAMRPatchMng.
Infos spécifiques à un maillage cartésien.
void refinePatch3D(Real3 position, Real3 length) override
Raffine en 3D un bloc du maillage cartésien.
Int32 nbPatch() const override
Nombre de patchs du maillage.
Integer reduceNbGhostLayers(Integer level, Integer target_nb_ghost_layers) override
Méthode permettant de supprimer une ou plusieurs couches de mailles fantômes sur un niveau de raffine...
ITraceMng * traceMng() const override
Gestionnaire de trace associé.
CellDirectionMng cellDirection(Integer idir) override
Liste des mailles dans la direction dir (0, 1 ou 2)
void recreateFromDump() override
Recalcule les informations de cartésiennes après une reprise.
void computeDirections() override
Calcule les infos pour les accès par direction.
FaceDirectionMng faceDirection(Integer idir) override
Liste des faces dans la direction dir (0, 1 ou 2)
void _addPatch(const CellGroup &parent_group)
Créé un patch avec tous les enfants du groupe parent_cells.
NodeDirectionMng nodeDirection(Integer idir) override
Liste des noeuds dans la direction dir (0, 1 ou 2)
Int32 m_local_face_direction[3]
Indice dans la numérotation locale de la maille, de la face dans.
void checkValid() const override
Effectue des vérifications sur la validité de l'instance.
IMesh * mesh() const override
Maillage associé à ce maillage cartésien.
FaceDirectionMng faceDirection(eMeshDirection dir) override
Liste des faces dans la direction dir.
NodeDirectionMng nodeDirection(eMeshDirection dir) override
Liste des noeuds dans la direction dir.
void refinePatch2D(Real2 position, Real2 length) override
Raffine en 2D un bloc du maillage cartésien.
ICartesianMeshPatch * patch(Int32 index) const override
Retourne le index-ième patch du maillage.
void coarseZone2D(Real2 position, Real2 length) override
Dé-raffine en 2D un bloc du maillage cartésien.
void renumberItemsUniqueId(const CartesianMeshRenumberingInfo &v) override
Renumérote les uniqueId() des entités.
UniqueArray< CellGroup > m_amr_patch_cell_groups
Groupe de mailles pour chaque patch AMR.
ICartesianMeshInternal * _internalApi() override
API interne à Arcane.
void coarseZone3D(Real3 position, Real3 length) override
Dé-raffine en 3D un bloc du maillage cartésien.
Ref< CartesianMeshCoarsening > createCartesianMeshCoarsening() override
Créé une instance pour gérer le déraffinement du maillage.
CartesianPatch amrPatch(Int32 index) const override
Retourne le index-ième patch du maillage.
CellDirectionMng cellDirection(eMeshDirection dir) override
Liste des mailles dans la direction dir.
CartesianMeshPatchListView patches() const override
Vue sur la liste des patchs.
CartesianConnectivity connectivity() override
Informations sur la connectivité
Informations par direction pour chaque genre d'entité du maillage.
Renumérotation des uniqueId() pour les maillages cartésiens.
Renumérotation des uniqueId() pour les maillages cartésiens.
Patch AMR d'un maillage cartésien.
Infos sur les mailles d'une direction spécifique X,Y ou Z d'un maillage structuré.
Vue sur les informations des mailles.
Maille d'un maillage.
Definition Item.h:1178
Conserve des références d'observateurs.
Definition Event.h:112
Infos sur les face d'une direction spécifique X,Y ou Z d'un maillage structuré.
Face d'une maille.
Definition Item.h:932
Partie interne de ICartesianMesh.
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 IMesh * mesh() const =0
Maillage associé à ce maillage cartésien.
Interface d'une famille d'entités.
virtual Int64 timestamp()=0
Compteur indiquant le temps de dernière modification du maillage.
virtual EventObservable< const MeshEventArgs & > & eventObservable(eMeshEventType type)=0
Observable pour un évènement.
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'une liste qui gère des données utilisateurs.
Interface pour une donnée utilisateur attachée à un autre objet.
Definition IUserData.h:31
Classe de base d'une vue sur une connectivité non structurée.
NodeGroup nodeGroup() const
Groupe des noeuds des éléments de ce groupe.
Definition ItemGroup.cc:229
void removeItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Supprime des entités.
Definition ItemGroup.cc:467
ItemVectorView view() const
Vue sur les entités du groupe.
Definition ItemGroup.cc:582
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:123
bool null() const
true is le groupe est le groupe nul
Definition ItemGroup.h:70
Classe utilitaire pour imprimer les infos sur une entité.
Definition ItemPrinter.h:35
Vue sur un tableau typé d'entités.
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
Int32 nbNode() const
Nombre de noeuds de l'entité
Definition Item.h:765
NodeLocalIdView nodeIds() const
Liste des noeuds de l'entité
Definition Item.h:774
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
Definition Item.h:210
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:149
Arguments des évènements sur le maillage.
Definition MeshEvents.h:43
Classe de compatibilité pour contenir un MeshHandle ou un IMesh*.
Definition MeshHandle.h:194
Handle sur un maillage.
Definition MeshHandle.h:47
Caractéristiques d'un maillage.
Definition MeshKind.h:59
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
Classe gérant un vecteur de réel de dimension 2.
Definition Real2.h:121
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Paramètres nécessaires à la construction d'une variable.
Interface du gestionnaire de traces.
Exception lorsqu'une fonction n'est pas implémentée.
Chaîne de caractères unicode.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage warning() const
Flot pour un message d'avertissement.
TraceMessage info() const
Flot pour un message d'information.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
Definition ItemTypes.h:183
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
Definition ItemTypes.h:167
MeshVariableScalarRefT< Cell, Real3 > VariableCellReal3
Grandeur au centre des mailles de type coordonnées.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
MeshVariableScalarRefT< Face, Real3 > VariableFaceReal3
Grandeur aux faces de type coordonnées.
Int32 toInt32(Real r)
Converti un Real en Int32.
Definition Convert.h:63
IMemoryAllocator * getDefaultDataAllocator()
Allocateur par défaut pour les données.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Definition Misc.cc:68
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:693
eMeshDirection
Type de la direction pour un maillage structuré
@ MD_DirZ
Direction Z.
@ MD_DirY
Direction Y.
@ MD_DirX
Direction X.
@ EndPrepareDump
Evènement envoyé à la fin de prepareForDump()
eMeshAMRKind
Type de maillage AMR.
Definition MeshKind.h:40
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 couple
Definition Real2.h:35
Real x
première composante du couple
Definition Real2.h:34