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"
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"
36#include "arcane/cartesianmesh/CartesianPatchGroup.h"
37#include "arcane/cartesianmesh/ICartesianMesh.h"
38#include "arcane/cartesianmesh/CartesianConnectivity.h"
39#include "arcane/cartesianmesh/CartesianMeshRenumberingInfo.h"
40#include "arcane/cartesianmesh/CartesianMeshCoarsening.h"
41#include "arcane/cartesianmesh/CartesianMeshCoarsening2.h"
42#include "arcane/cartesianmesh/CartesianMeshPatchListView.h"
43#include "arcane/cartesianmesh/internal/CartesianMeshPatch.h"
44#include "arcane/cartesianmesh/internal/ICartesianMeshInternal.h"
46#include "arcane/cartesianmesh/internal/CartesianMeshUniqueIdRenumbering.h"
47#include "arcane/cartesianmesh/v2/CartesianMeshUniqueIdRenumberingV2.h"
48#include "arcane/cartesianmesh/CartesianMeshNumberingMng.h"
50#include "arcane/cartesianmesh/CartesianMeshAMRPatchMng.h"
51#include "arcane/core/IGhostLayerMng.h"
75class CartesianMeshImpl
80 :
public ICartesianMeshInternal
84 explicit InternalApi(CartesianMeshImpl* cartesian_mesh)
85 : m_cartesian_mesh(cartesian_mesh)
93 return m_cartesian_mesh->_createCartesianMeshCoarsening2();
97 m_cartesian_mesh->_addPatchFromExistingChildren(parent_cells_local_id);
99 void initCartesianMeshAMRPatchMng()
override
101 if (m_numbering_mng.isNull()) {
102 initCartesianMeshNumberingMng();
104 if (m_amr_mng.isNull()) {
112 void initCartesianMeshNumberingMng()
override
114 if (m_numbering_mng.isNull()) {
120 return m_numbering_mng;
125 CartesianMeshImpl* m_cartesian_mesh =
nullptr;
136 void build()
override;
146 return m_all_items_direction_info->cellDirection(dir);
151 return m_all_items_direction_info->cellDirection(idir);
156 return m_all_items_direction_info->faceDirection(dir);
161 return m_all_items_direction_info->faceDirection(idir);
166 return m_all_items_direction_info->nodeDirection(dir);
171 return m_all_items_direction_info->nodeDirection(idir);
180 return m_connectivity;
205 ICartesianMeshInternal*
_internalApi()
override {
return &m_internal_api; }
215 InternalApi m_internal_api;
218 Int32 m_local_face_direction[3] = { -1, -1, -1 };
219 IMesh* m_mesh =
nullptr;
220 Ref<CartesianMeshPatch> m_all_items_direction_info;
221 CartesianConnectivity m_connectivity;
222 UniqueArray<CartesianConnectivity::Index> m_nodes_to_cell_storage;
223 UniqueArray<CartesianConnectivity::Index> m_cells_to_node_storage;
224 UniqueArray<CartesianConnectivity::Permutation> m_permutation_storage;
225 bool m_is_amr =
false;
227 CartesianPatchGroup m_patch_group;
228 ScopedPtrT<Properties> m_properties;
230 EventObserverPool m_event_pool;
231 bool m_is_mesh_event_added =
false;
232 Int64 m_mesh_timestamp = 0;
237 void _computeMeshDirection(CartesianMeshPatch& cdi,
eMeshDirection dir,
241 void _applyRefine(
const AMRZonePosition &position);
242 void _removeCellsInPatches(ConstArrayView<Int32> const_array_view);
243 void _applyCoarse(
const AMRZonePosition &position);
244 void _addPatch(
const CellGroup& parent_cells);
245 void _saveInfosInProperties();
247 std::tuple<CellGroup, NodeGroup>
249 void _checkNeedComputeDirections();
250 void _checkAddObservableMeshChanged();
257arcaneCreateCartesianMesh(
IMesh* mesh)
268CartesianMeshImpl(
IMesh* mesh)
270, m_internal_api(this)
276, m_amr_type(mesh->meshKind().meshAMRKind())
278 if (m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly) {
279 m_internal_api.initCartesianMeshNumberingMng();
280 m_internal_api.initCartesianMeshAMRPatchMng();
282 m_all_items_direction_info = m_patch_group.groundPatch();
288void CartesianMeshImpl::
291 m_properties =
new Properties(*(
mesh()->properties()),
"CartesianMesh");
296const Int32 SERIALIZE_VERSION = 1;
302void CartesianMeshImpl::
303_checkNeedComputeDirections()
306 if (m_mesh_timestamp!=new_timestamp){
307 info() <<
"Mesh timestamp has changed (old=" << m_mesh_timestamp <<
" new=" << new_timestamp <<
")";
315void CartesianMeshImpl::
316_saveInfosInProperties()
319 m_properties->set(
"Version",SERIALIZE_VERSION);
322 UniqueArray<String> patch_group_names;
323 for (
Integer i = 1; i < m_patch_group.nbPatch(); ++i) {
324 patch_group_names.add(m_patch_group.cells(i).name());
326 m_properties->set(
"PatchGroupNames",patch_group_names);
335 info() <<
"Creating 'CartesianMesh' infos from dump";
338 Int32 v = m_properties->getInt32(
"Version");
339 if (v!=SERIALIZE_VERSION)
340 ARCANE_FATAL(
"Bad serializer version: trying to read from incompatible checkpoint v={0} expected={1}",
341 v,SERIALIZE_VERSION);
345 m_properties->get(
"PatchGroupNames",patch_group_names);
346 info(4) <<
"Found n=" << patch_group_names.
size() <<
" patchs";
347 m_patch_group.clear();
348 m_all_items_direction_info = m_patch_group.groundPatch();
350 for(
const String& x : patch_group_names ){
354 m_patch_group.addPatch(group);
363void CartesianMeshImpl::
364_checkAddObservableMeshChanged()
366 if (m_is_mesh_event_added)
368 m_is_mesh_event_added =
true;
371 auto f1 = [&](
const MeshEventArgs&){ this->_checkNeedComputeDirections(); };
381 info() <<
"CartesianMesh: computeDirections()";
384 _checkAddObservableMeshChanged();
386 m_is_amr = m_mesh->isAmrActivated();
396 for( NodeLocalId inode : cell.
nodeIds() )
397 center += nodes_coord[inode];
399 cells_center[icell] = center;
404 for( NodeLocalId inode : face.
nodeIds() )
405 center += nodes_coord[inode];
407 faces_center[iface] = center;
412 Int32 next_face_x = -1;
413 Int32 next_face_y = -1;
414 Int32 next_face_z = -1;
417 Cell cell0 = cell_view[0];
420 Real3 cell_center = cells_center[cell0];
427 info(4) <<
"Cartesian mesh compute directions is_amr=" << m_is_amr;
429 for(
Integer i=0; i<nb_node; ++i ){
431 info(4) <<
"Node I=" << i <<
" node=" <<
ItemPrinter(node) <<
" pos=" << nodes_coord[node];
434 bool is_3d = m_mesh->dimension() == 3;
444 for (
Integer i = 0; i < nb_face; ++i) {
447 Real3 next_center = faces_center[f];
449 Real diff_x = next_center.
x - cell_center.
x;
450 Real diff_y = next_center.
y - cell_center.
y;
451 Real diff_z = next_center.
z - cell_center.
z;
453 info(4) <<
"NEXT_FACE=" <<
ItemPrinter(f) <<
" center=" << next_center <<
" diff=" <<
Real3(diff_x, diff_y, diff_z);
455 if (diff_x > max_x) {
460 if (diff_y > max_y) {
465 if (diff_z > max_z) {
470 info(4) <<
"Advance in direction X -> " << next_face_x;
471 info(4) <<
"Advance in direction Y -> " << next_face_y;
472 info(4) <<
"Advance in direction Z -> " << next_face_z;
478 for (
Integer i = 0; i < nb_face; ++i) {
481 Real3 next_center = faces_center[f];
483 Real diff_x = next_center.
x - cell_center.
x;
484 Real diff_y = next_center.
y - cell_center.
y;
486 info(4) <<
"NEXT_FACE=" <<
ItemPrinter(f) <<
" center=" << next_center <<
" diff=" <<
Real2(diff_x, diff_y);
488 if (diff_x > max_x) {
493 if (diff_y > max_y) {
498 info(4) <<
"Advance in direction X -> " << next_face_x;
499 info(4) <<
"Advance in direction Y -> " << next_face_y;
501 m_all_items_direction_info->_internalComputeNodeCellInformations(cell0,cells_center[cell0],nodes_coord);
503 info() <<
"Informations from IMesh properties:";
505 auto* cmgi = ICartesianMeshGenerationInfo::getReference(m_mesh,
true);
507 info() <<
"GlobalNbCell = " << cmgi->globalNbCells();
508 info() <<
"OwnNbCell: " << cmgi->ownNbCells();
509 info() <<
"SubDomainOffset: " << cmgi->subDomainOffsets();
510 info() <<
"OwnCellOffset: " << cmgi->ownCellOffsets();
515 auto x = _buildPatchGroups(
mesh()->allLevelCells(0),0);
516 all_cells = std::get<0>(x);
517 all_nodes = std::get<1>(x);
520 if (next_face_x!=(-1)){
521 m_local_face_direction[
MD_DirX] = next_face_x;
522 _computeMeshDirection(*m_all_items_direction_info.get(),
MD_DirX,cells_center,faces_center,all_cells,all_nodes);
524 if (next_face_y!=(-1)){
525 m_local_face_direction[
MD_DirY] = next_face_y;
526 _computeMeshDirection(*m_all_items_direction_info.get(),
MD_DirY,cells_center,faces_center,all_cells,all_nodes);
528 if (next_face_z != (-1)) {
529 m_local_face_direction[
MD_DirZ] = next_face_z;
530 _computeMeshDirection(*m_all_items_direction_info.get(),
MD_DirZ,cells_center,faces_center,all_cells,all_nodes);
534 for(
Integer idir=0, nb_dir=
mesh()->dimension(); idir<nb_dir; ++idir ){
536 cdm._internalSetOffsetAndNbCellInfos(cmgi->globalNbCells()[idir], cmgi->ownNbCells()[idir],
537 cmgi->subDomainOffsets()[idir], cmgi->ownCellOffsets()[idir]);
540 info() <<
"Compute cartesian connectivity";
542 m_permutation_storage.resize(1);
543 m_permutation_storage[0].compute();
544 m_nodes_to_cell_storage.resize(
mesh()->nodeFamily()->maxLocalId());
545 m_cells_to_node_storage.resize(
mesh()->cellFamily()->maxLocalId());
546 m_connectivity._setStorage(m_nodes_to_cell_storage,m_cells_to_node_storage,&m_permutation_storage[0]);
547 m_connectivity._computeInfos(
mesh(),nodes_coord,cells_center);
551 for (
Integer patch_index = 1; patch_index < m_patch_group.nbPatch(); ++patch_index) {
552 CellGroup cells = m_patch_group.cells(patch_index);
554 info() <<
"AMR Patch name=" << cells.
name() <<
" size=" << cells.
size() <<
" index=" << patch_index <<
" nbPatch=" << m_patch_group.nbPatch();
555 patch->_internalComputeNodeCellInformations(cell0, cells_center[cell0], nodes_coord);
556 auto [patch_cells, patch_nodes] = _buildPatchGroups(cells, patch_index);
557 _computeMeshDirection(*
patch.get(),
MD_DirX, cells_center, faces_center, patch_cells, patch_nodes);
558 _computeMeshDirection(*
patch.get(),
MD_DirY, cells_center, faces_center, patch_cells, patch_nodes);
560 _computeMeshDirection(*
patch.get(),
MD_DirZ, cells_center, faces_center, patch_cells, patch_nodes);
566 _saveInfosInProperties();
572std::tuple<CellGroup,NodeGroup> CartesianMeshImpl::
585 String cell_group_name =
String(
"AMRPatchCells") + patch_level;
590 String node_group_name =
String(
"AMRPatchNodes") + patch_level;
594 info(4) <<
"PATCH_CELLS name=" << patch_cells.
name() <<
" size=" << patch_cells.
size();
595 info(4) <<
"PATCH_NODES name=" << patch_nodes.
name() <<
" size=" << patch_nodes.
size();
596 return { patch_cells, patch_nodes };
602void CartesianMeshImpl::
606 IItemFamily* cell_family = m_mesh->cellFamily();
607 IItemFamily* face_family = m_mesh->faceFamily();
608 IItemFamily* node_family = m_mesh->nodeFamily();
611 Int32 max_face_id = face_family->maxLocalId();
612 Int32 max_node_id = node_family->maxLocalId();
614 CellDirectionMng& cell_dm = cdi.cellDirection(dir);
615 cell_dm._internalResizeInfos(max_cell_id);
617 FaceDirectionMng& face_dm = cdi.faceDirection(dir);
618 face_dm._internalResizeInfos(max_face_id);
620 NodeDirectionMng& node_dm = cdi.nodeDirection(dir);
621 node_dm._internalResizeInfos(max_node_id);
624 info(4) <<
"COMPUTE DIRECTION dir=" << dir;
626 Int32 prev_local_face = -1;
627 Int32 next_local_face = m_local_face_direction[dir];
628 Integer mesh_dim = m_mesh->dimension();
631 prev_local_face = (next_local_face + 2) % 4;
632 else if (mesh_dim==3)
633 prev_local_face = (next_local_face + 3) % 6;
635 cell_dm._internalSetLocalFaceIndex(next_local_face,prev_local_face);
639 std::set<Int32> cells_set;
641 cells_set.insert(icell.itemLocalId());
648 Int32 my_level = cell.level();
649 Face next_face = cell.face(next_local_face);
650 Cell next_cell = next_face.backCell()==cell ? next_face.frontCell() : next_face.backCell();
651 if (cells_set.find(next_cell.localId())==cells_set.end())
653 else if (next_cell.level()!=my_level)
656 Face prev_face = cell.face(prev_local_face);
657 Cell prev_cell = prev_face.backCell()==cell ? prev_face.frontCell() : prev_face.backCell();
658 if (cells_set.find(prev_cell.localId())==cells_set.end())
660 else if (prev_cell.level()!=my_level)
662 cell_dm.m_infos_view[icell.itemLocalId()] = CellDirectionMng::ItemDirectionInfo(next_cell,prev_cell);
664 cell_dm._internalComputeInnerAndOuterItems(all_cells);
665 face_dm._internalComputeInfos(cell_dm,cells_center,faces_center);
666 node_dm._internalComputeInfos(cell_dm,all_nodes,cells_center);
675 info() <<
"REFINEMENT 2D position=" << position <<
" length=" << length;
685 info() <<
"REFINEMENT 3D position=" << position <<
" length=" << length;
695 _applyRefine(position);
696 _saveInfosInProperties();
705 info() <<
"COARSEN 2D position=" << position <<
" length=" << length;
715 info() <<
"COARSEN 3D position=" << position <<
" length=" << length;
725 _applyCoarse(position);
726 _saveInfosInProperties();
736 ARCANE_FATAL(
"You cannot reduce number of ghost layer of level 0 with this method");
740 const Int32 max_nb_layer = 128;
744 level_max = std::max(level_max, icell->level());
752 Integer level_0_nb_ghost_layer = m_mesh->ghostLayerMng()->nbGhostLayer();
755 if (level_0_nb_ghost_layer == 0) {
764 if (target_nb_ghost_layers % 2 != 0) {
765 target_nb_ghost_layers++;
768 if (target_nb_ghost_layers == nb_ghost_layer) {
769 return nb_ghost_layer;
774 Integer parent_level = level - 1;
775 Integer parent_target_nb_ghost_layer = target_nb_ghost_layers / 2;
781 std::function<void(
Cell)> children_list;
783 children_list = [&cell_lid2, &children_list](
Cell cell) ->
void {
784 for (
Integer i = 0; i < cell.nbHChildren(); ++i) {
786 cell_lid2[cell.level()].
add(cell.hChild(i).localId());
787 children_list(cell.hChild(i));
800 Cell front_cell = iface->frontCell();
801 Cell back_cell = iface->backCell();
803 ((front_cell.
null() || (!front_cell.
isOwn() && front_cell.
level() == parent_level)) && ((!back_cell.
null()) && (back_cell.
isOwn() && back_cell.
level() == parent_level))) ||
804 ((back_cell.
null() || (!back_cell.
isOwn() && back_cell.
level() == parent_level)) && ((!front_cell.
null()) && (front_cell.
isOwn() && front_cell.
level() == parent_level)))) {
805 for (
Node node : iface->nodes()) {
806 level_node[node] = 0;
812 bool is_modif =
true;
813 Int32 current_layer = 0;
818 if (icell->isOwn() || icell->level() != parent_level || level_cell[icell] != -1) {
822 Int32 min = max_nb_layer;
825 for (
Node node : icell->nodes()) {
826 Int32 nlevel = level_node[node];
828 min = std::min(min, nlevel);
829 max = std::max(max, nlevel);
834 if (min != current_layer) {
839 if (min == max_nb_layer && max == -1) {
843 Integer new_level = ((min == max) ? min + 1 : max);
845 for (
Node node : icell->nodes()) {
846 Int32 nlevel = level_node[node];
848 level_node[node] = new_level;
854 level_cell[icell] = min;
859 if (min >= parent_target_nb_ghost_layer) {
860 children_list(*icell);
864 if (current_layer >= max_nb_layer) {
865 ARCANE_FATAL(
"Error in ghost layer counter algo. Report it plz.");
870 for (
Integer i = level_max - 1; i >= 0; --i) {
877 m_mesh->modifier()->flagCellToCoarsen(cell_lid2[i]);
878 m_mesh->modifier()->coarsenItemsV2(
false);
881 info() <<
"Nb ghost layer for level " << level <<
" : " << target_nb_ghost_layers;
883 return target_nb_ghost_layers;
889void CartesianMeshImpl::
893 Integer index = m_patch_group.nextIndexForNewPatch();
894 String parent_group_name =
String(
"CartesianMeshPatchParentCells")+index;
895 CellGroup parent_cells = cell_family->
createGroup(parent_group_name,parent_cells_local_id,
true);
896 _addPatch(parent_cells);
904void CartesianMeshImpl::
907 Integer index = m_patch_group.nextIndexForNewPatch();
908 info() <<
"Add patch index : " << index;
911 String children_group_name = String(
"CartesianMeshPatchCells")+index;
912 UniqueArray<Int32> children_local_id;
915 for(
Integer k=0; k<c.nbHChildren(); ++k ){
916 Cell child = c.hChild(k);
917 children_local_id.add(child.localId());
920 IItemFamily* cell_family = m_mesh->cellFamily();
921 CellGroup children_cells = cell_family->createGroup(children_group_name, children_local_id,
true);
922 m_patch_group.addPatch(children_cells);
928void CartesianMeshImpl::
931 if (m_amr_type == eMeshAMRKind::Cell) {
932 m_patch_group.removeCellsInAllPatches(const_array_view);
933 m_patch_group.applyPatchEdit(
true);
935 else if (m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly) {
936 m_patch_group.removeCellsInAllPatches(const_array_view);
943 m_patch_group.applyPatchEdit(
true);
945 else if (m_amr_type == eMeshAMRKind::Patch) {
946 ARCANE_FATAL(
"General patch AMR is not implemented. Please use PatchCartesianMeshOnly (3)");
956void CartesianMeshImpl::
959 SharedArray<Int32> cells_local_id;
960 position.cellsInPatch(
mesh(), cells_local_id);
962 IItemFamily* cell_family = m_mesh->cellFamily();
964 info(4) <<
"Local_NbCellToRefine = " << nb_cell;
965 Integer index = m_patch_group.nextIndexForNewPatch();
966 String parent_group_name = String(
"CartesianMeshPatchParentCells")+index;
967 CellGroup parent_cells = cell_family->createGroup(parent_group_name,cells_local_id,
true);
969 IParallelMng* pm = m_mesh->parallelMng();
971 info(4) <<
"Global_NbCellToRefine = " << total_nb_cell;
972 if (total_nb_cell==0)
975 if(m_amr_type == eMeshAMRKind::Cell) {
976 debug() <<
"Refine with modifier() (for all mesh types)";
977 m_mesh->modifier()->flagCellToRefine(cells_local_id);
978 m_mesh->modifier()->adapt();
980 else if(m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly) {
981 debug() <<
"Refine with specific refiner (for cartesian mesh only)";
983 m_internal_api.cartesianMeshAMRPatchMng()->flagCellToRefine(cells_local_id,
true);
984 m_internal_api.cartesianMeshAMRPatchMng()->refine();
986 else if(m_amr_type == eMeshAMRKind::Patch) {
987 ARCANE_FATAL(
"General patch AMR is not implemented. Please use PatchCartesianMeshOnly (3)");
994 MeshStats ms(
traceMng(),m_mesh,m_mesh->parallelMng());
997 _addPatch(parent_cells);
1003void CartesianMeshImpl::
1006 SharedArray<Int32> cells_local_id;
1007 position.cellsInPatch(
mesh(), cells_local_id);
1009 Integer nb_cell = cells_local_id.size();
1010 info(4) <<
"Local_NbCellToCoarsen = " << nb_cell;
1012 IParallelMng* pm = m_mesh->parallelMng();
1014 info(4) <<
"Global_NbCellToCoarsen = " << total_nb_cell;
1015 if (total_nb_cell == 0)
1018 _removeCellsInPatches(cells_local_id);
1020 if (m_amr_type == eMeshAMRKind::Cell) {
1021 debug() <<
"Coarse with modifier() (for all mesh types)";
1022 m_mesh->modifier()->flagCellToCoarsen(cells_local_id);
1023 m_mesh->modifier()->coarsenItemsV2(
true);
1025 else if (m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly) {
1026 debug() <<
"Coarsen with specific coarser (for cartesian mesh only)";
1028 m_internal_api.cartesianMeshAMRPatchMng()->flagCellToCoarsen(cells_local_id,
true);
1029 m_internal_api.cartesianMeshAMRPatchMng()->coarsen(
true);
1031 else if (m_amr_type == eMeshAMRKind::Patch) {
1032 ARCANE_FATAL(
"General patch AMR is not implemented. Please use PatchCartesianMeshOnly (3)");
1039 MeshStats ms(
traceMng(), m_mesh, m_mesh->parallelMng());
1050 info(4) <<
"Check valid CartesianMesh";
1052 for(
Integer i=0; i<nb_patch; ++i ){
1064 auto* cmgi = ICartesianMeshGenerationInfo::getReference(m_mesh,
true);
1067 Int32 face_method = v.renumberFaceMethod();
1068 if (face_method!=0 && face_method!=1)
1069 ARCANE_FATAL(
"Invalid value '{0}' for renumberFaceMethod(). Valid values are 0 or 1",
1075 Int32 patch_method = v.renumberPatchMethod();
1076 if (patch_method < 0 || patch_method > 4)
1077 ARCANE_FATAL(
"Invalid value '{0}' for renumberPatchMethod(). Valid values are 0, 1, 2, 3 or 4",
1080 else if (patch_method == 1 || patch_method == 3 || patch_method == 4){
1081 CartesianMeshUniqueIdRenumbering renumberer(
this,cmgi,v.parentPatch(),patch_method);
1082 renumberer.renumber();
1084 else if (patch_method == 2){
1085 warning() <<
"The patch method 2 is experimental!";
1086 CartesianMeshUniqueIdRenumberingV2 renumberer(
this,cmgi);
1087 renumberer.renumber();
1091 if (v.isSortAfterRenumbering()){
1092 info() <<
"Compacting and Sorting after renumbering";
1093 m_mesh->nodeFamily()->compactItems(
true);
1094 m_mesh->faceFamily()->compactItems(
true);
1095 m_mesh->cellFamily()->compactItems(
true);
1113_createCartesianMeshCoarsening2()
1129 const char* name =
"CartesianMesh";
1138 ARCANE_FATAL(
"The mesh {0} is not yet created",h.meshName());
1144 mk.setMeshStructure(eMeshStructure::Cartesian);
1145 mesh->_internalApi()->setMeshKind(mk);
1152 return adud->data();
#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.
Classe permettant de définir une zone d'un maillage.
Integer size() const
Nombre d'éléments du vecteur.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
UserData s'auto-détruisant une fois détaché.
Informations de connectivité d'un maillage cartésien.
Déraffine un maillage cartésien par 2.
Déraffine un maillage cartésien par 2.
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...
void refinePatch(const AMRZonePosition &position) override
Raffine un bloc du maillage cartésien.
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 coarseZone(const AMRZonePosition &position) override
Dé-raffine un bloc du maillage cartésien.
NodeDirectionMng nodeDirection(Integer idir) override
Liste des noeuds dans la direction dir (0, 1 ou 2)
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.
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é
Vue sur une liste de patchs.
Informations pour la renumérotation.
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.
Face face(Int32 i) const
i-ème face de la maille
Int32 nbFace() const
Nombre de faces de la maille.
Vue constante d'un tableau de type T.
Infos sur les face d'une direction spécifique X,Y ou Z d'un maillage structuré.
Interface d'un patch AMR d'un maillage cartésien.
virtual void checkValid() const =0
Effectue des vérifications sur la validité de l'instance.
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 ItemGroup findGroup(const String &name) const =0
Recherche un groupe.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
virtual ItemGroup createGroup(const String &name, Int32ConstArrayView local_ids, bool do_override=false)=0
Créé un groupe d'entités de nom name contenant les entités local_ids.
virtual Int32 maxLocalId() const =0
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
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.
Interface du gestionnaire de traces.
Interface d'une liste qui gère des données utilisateurs.
virtual void setData(const String &name, IUserData *ud)=0
Positionne le user-data associé au nom name.
virtual IUserData * data(const String &name, bool allow_null=false) const =0
Donnée associée à name.
Interface pour une donnée utilisateur attachée à un autre objet.
Classe de base d'une vue sur une connectivité non structurée.
NodeGroup nodeGroup() const
Groupe des noeuds des éléments de ce groupe.
const String & name() const
Nom du groupe.
ItemVectorView view() const
Vue sur les entités du groupe.
Integer size() const
Nombre d'éléments du groupe.
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
void setItems(Int32ConstArrayView items_local_id)
Positionne les entités du groupe.
bool null() const
true is le groupe est le groupe nul
Classe utilitaire pour imprimer les infos sur une entité.
Int32ConstArrayView localIds() const
Tableau des numéros locaux des entités.
Node node(Int32 i) const
i-ème noeud de l'entité
Int32 nbNode() const
Nombre de noeuds de l'entité
NodeLocalIdView nodeIds() const
Liste des noeuds de l'entité
bool isOwn() const
true si l'entité est appartient au sous-domaine
constexpr bool null() const
true si l'entité est nul (i.e. non connecté au maillage)
Arguments des évènements sur le maillage.
Classe de compatibilité pour contenir un MeshHandle ou un IMesh*.
const MeshHandle & handle() const
handle associé.
IMesh * meshOrNull() const
Retourne le maillage associé à cette instance.
IUserDataList * meshUserDataList() const
Données utilisateurs associées.
Caractéristiques d'un maillage.
Infos sur les noeuds d'une direction spécifique X,Y ou Z d'un maillage structuré.
Classe gérant un vecteur de réel de dimension 2.
Classe gérant un vecteur de réel de dimension 3.
Référence à une instance.
Chaîne de caractères unicode.
Classe d'accès aux traces.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage warning() const
Flot pour un message d'avertissement.
ITraceMng * traceMng() const
Gestionnaire de trace.
Vecteur 1D de données avec sémantique par valeur (style STL).
Paramètres nécessaires à la construction d'une variable.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
ItemVectorViewT< Cell > CellVectorView
Vue sur un vecteur de mailles.
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
MeshVariableScalarRefT< Cell, Real3 > VariableCellReal3
Grandeur au centre des mailles de type coordonnées.
MeshVariableScalarRefT< Node, Int32 > VariableNodeInt32
Grandeur au noeud de type entier 32 bits.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
MeshVariableScalarRefT< Cell, Int32 > VariableCellInt32
Grandeur au centre des mailles de type entier 32 bits.
MeshVariableScalarRefT< Face, Real3 > VariableFaceReal3
Grandeur aux faces de type coordonnées.
Int32 toInt32(Real r)
Converti un Real en Int32.
IMemoryAllocator * getDefaultDataAllocator()
Allocateur par défaut pour les données.
@ ReduceSum
Somme des valeurs.
@ ReduceMax
Maximum des valeurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool arcaneIsCheck()
Vrai si on est en mode vérification.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
eMeshDirection
Type de la direction pour un maillage structuré
@ EndPrepareDump
Evènement envoyé à la fin de prepareForDump()
double Real
Type représentant un réel.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
eMeshAMRKind
Type de maillage AMR.
std::int32_t Int32
Type entier signé sur 32 bits.
Real y
deuxième composante du triplet
Real z
troisième composante du triplet
Real x
première composante du triplet