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/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"
45#include "arcane/cartesianmesh/internal/CartesianMeshUniqueIdRenumbering.h"
46#include "arcane/cartesianmesh/v2/CartesianMeshUniqueIdRenumberingV2.h"
48#include "arcane/cartesianmesh/CartesianMeshAMRPatchMng.h"
49#include "arcane/core/IGhostLayerMng.h"
78 :
public ICartesianMeshInternal
83 : m_cartesian_mesh(cartesian_mesh)
89 Ref<CartesianMeshCoarsening2> createCartesianMeshCoarsening2()
override
91 return m_cartesian_mesh->_createCartesianMeshCoarsening2();
95 m_cartesian_mesh->_addPatchFromExistingChildren(parent_cells_local_id);
97 void initCartesianMeshAMRPatchMng()
override
102 Ref<ICartesianMeshAMRPatchMng> cartesianMeshAMRPatchMng()
override
110 Ref<ICartesianMeshAMRPatchMng> m_amr_mng;
119 void build()
override;
129 return m_all_items_direction_info->cellDirection(dir);
134 return m_all_items_direction_info->cellDirection(idir);
139 return m_all_items_direction_info->faceDirection(dir);
144 return m_all_items_direction_info->faceDirection(idir);
149 return m_all_items_direction_info->nodeDirection(dir);
154 return m_all_items_direction_info->nodeDirection(idir);
163 return m_connectivity;
186 ICartesianMeshInternal*
_internalApi()
override {
return &m_internal_api; }
191 Ref<CartesianMeshCoarsening2> _createCartesianMeshCoarsening2();
196 InternalApi m_internal_api;
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;
205 UniqueArray<CartesianConnectivity::Permutation> m_permutation_storage;
206 bool m_is_amr =
false;
208 UniqueArray<CellGroup> m_amr_patch_cell_groups;
209 UniqueArray<Ref<CartesianMeshPatch>> m_amr_patches;
210 UniqueArray<ICartesianMeshPatch*> m_amr_patches_pointer;
211 ScopedPtrT<Properties> m_properties;
213 EventObserverPool m_event_pool;
214 bool m_is_mesh_event_added =
false;
215 Int64 m_mesh_timestamp = 0;
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();
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)
239 m_amr_patches.add(v);
240 m_amr_patches_pointer.add(v.get());
247extern "C++" ICartesianMesh*
248arcaneCreateCartesianMesh(IMesh* mesh)
250 auto* cm =
new CartesianMeshImpl(mesh);
259CartesianMeshImpl(IMesh* mesh)
260: TraceAccessor(mesh->traceMng())
261, m_internal_api(this)
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())
268 if (m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly)
269 m_internal_api.initCartesianMeshAMRPatchMng();
271 m_all_items_direction_info = makeRef(
new CartesianMeshPatch(
this,-1));
272 _addPatchInstance(m_all_items_direction_info);
278void CartesianMeshImpl::
281 m_properties =
new Properties(*(
mesh()->properties()),
"CartesianMesh");
286const Int32 SERIALIZE_VERSION = 1;
292void CartesianMeshImpl::
293_checkNeedComputeDirections()
296 if (m_mesh_timestamp!=new_timestamp){
297 info() <<
"Mesh timestamp has changed (old=" << m_mesh_timestamp <<
" new=" << new_timestamp <<
")";
305void CartesianMeshImpl::
306_saveInfosInProperties()
309 m_properties->set(
"Version",SERIALIZE_VERSION);
312 UniqueArray<String> patch_group_names;
313 for(
const CellGroup& x : m_amr_patch_cell_groups ){
314 patch_group_names.add(x.name());
316 m_properties->set(
"PatchGroupNames",patch_group_names);
325 info() <<
"Creating 'CartesianMesh' infos from dump";
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);
335 m_properties->get(
"PatchGroupNames",patch_group_names);
336 info(4) <<
"Found n=" << patch_group_names.
size() <<
" patchs";
337 m_amr_patch_cell_groups.clear();
339 for(
const String& x : patch_group_names ){
343 m_amr_patch_cell_groups.add(group);
352void CartesianMeshImpl::
353_checkAddObservableMeshChanged()
355 if (m_is_mesh_event_added)
357 m_is_mesh_event_added =
true;
360 auto f1 = [&](
const MeshEventArgs&){ this->_checkNeedComputeDirections(); };
370 info() <<
"CartesianMesh: computeDirections()";
373 _checkAddObservableMeshChanged();
375 m_amr_patches.clear();
376 m_amr_patches_pointer.clear();
377 _addPatchInstance(m_all_items_direction_info);
379 m_is_amr = m_mesh->isAmrActivated();
390 center += nodes_coord[inode];
392 cells_center[icell] = center;
398 center += nodes_coord[inode];
400 faces_center[iface] = center;
405 Int32 next_face_x = -1;
406 Int32 next_face_y = -1;
407 Int32 next_face_z = -1;
410 Cell cell0 = cell_view[0];
411 Integer nb_face = cell0.
nbFace();
412 Integer nb_node = cell0.
nbNode();
413 Real3 cell_center = cells_center[cell0];
420 info(4) <<
"Cartesian mesh compute directions is_amr=" << m_is_amr;
422 for( Integer i=0; i<nb_node; ++i ){
424 info(4) <<
"Node I=" << i <<
" node=" <<
ItemPrinter(node) <<
" pos=" << nodes_coord[node];
427 bool is_3d = m_mesh->dimension() == 3;
433 for (Integer i = 0; i < nb_face; ++i) {
436 Real3 next_center = faces_center[f];
438 info(4) <<
"NEXT_FACE=" <<
ItemPrinter(f) <<
" center=" << next_center;
440 Real diff_x = next_center.
x - cell_center.
x;
441 Real diff_y = next_center.
y - cell_center.
y;
442 Real diff_z = next_center.
z - cell_center.
z;
453 if (diff_x > diff_y && diff_x > diff_z) {
456 info(4) <<
"Advance in direction X -> " << next_face_x;
458 else if (diff_y > diff_x && diff_y > diff_z) {
461 info(4) <<
"Advance in direction Y -> " << next_face_y;
463 else if (diff_z > diff_x && diff_z > diff_y) {
466 info(4) <<
"Advance in direction Z -> " << next_face_z;
471 for (Integer i = 0; i < nb_face; ++i) {
474 Real3 next_center = faces_center[f];
476 info(4) <<
"NEXT_FACE=" <<
ItemPrinter(f) <<
" center=" << next_center;
478 Real diff_x = next_center.
x - cell_center.
x;
479 Real diff_y = next_center.
y - cell_center.
y;
488 if (diff_x > diff_y) {
491 info(4) <<
"Advance in direction X -> " << next_face_x;
493 else if (diff_y > diff_x) {
496 info(4) <<
"Advance in direction Y -> " << next_face_y;
500 m_all_items_direction_info->_internalComputeNodeCellInformations(cell0,cells_center[cell0],nodes_coord);
502 info() <<
"Informations from IMesh properties:";
504 auto* cmgi = ICartesianMeshGenerationInfo::getReference(m_mesh,
true);
506 info() <<
"GlobalNbCell = " << cmgi->globalNbCells();
507 info() <<
"OwnNbCell: " << cmgi->ownNbCells();
508 info() <<
"SubDomainOffset: " << cmgi->subDomainOffsets();
509 info() <<
"OwnCellOffset: " << cmgi->ownCellOffsets();
514 auto x = _buildPatchGroups(
mesh()->allLevelCells(0),0);
515 all_cells = std::get<0>(x);
516 all_nodes = std::get<1>(x);
519 if (next_face_x!=(-1)){
520 m_local_face_direction[
MD_DirX] = next_face_x;
521 _computeMeshDirection(*m_all_items_direction_info.get(),
MD_DirX,cells_center,faces_center,all_cells,all_nodes);
523 if (next_face_y!=(-1)){
524 m_local_face_direction[
MD_DirY] = next_face_y;
525 _computeMeshDirection(*m_all_items_direction_info.get(),
MD_DirY,cells_center,faces_center,all_cells,all_nodes);
527 if (next_face_z != (-1)) {
528 m_local_face_direction[
MD_DirZ] = next_face_z;
529 _computeMeshDirection(*m_all_items_direction_info.get(),
MD_DirZ,cells_center,faces_center,all_cells,all_nodes);
533 for( Integer idir=0, nb_dir=
mesh()->dimension(); idir<nb_dir; ++idir ){
535 cdm._internalSetOffsetAndNbCellInfos(cmgi->globalNbCells()[idir], cmgi->ownNbCells()[idir],
536 cmgi->subDomainOffsets()[idir], cmgi->ownCellOffsets()[idir]);
539 info() <<
"Compute cartesian connectivity";
541 m_permutation_storage.resize(1);
542 m_permutation_storage[0].compute();
543 m_nodes_to_cell_storage.resize(
mesh()->nodeFamily()->maxLocalId());
544 m_cells_to_node_storage.resize(
mesh()->cellFamily()->maxLocalId());
545 m_connectivity._setStorage(m_nodes_to_cell_storage,m_cells_to_node_storage,&m_permutation_storage[0]);
546 m_connectivity._computeInfos(
mesh(),nodes_coord,cells_center);
550 for(
const CellGroup& cells : m_amr_patch_cell_groups ){
551 Integer patch_index = m_amr_patches.size();
552 info() <<
"AMR Patch name=" << cells.name() <<
" size=" << cells.size() <<
" index=" << patch_index;
553 auto* cdi =
new CartesianMeshPatch(
this,patch_index);
554 _addPatchInstance(makeRef(cdi));
555 cdi->_internalComputeNodeCellInformations(cell0,cells_center[cell0],nodes_coord);
556 auto [ patch_cells, patch_nodes ] = _buildPatchGroups(cells,patch_index);
557 _computeMeshDirection(*cdi,
MD_DirX,cells_center,faces_center,patch_cells,patch_nodes);
558 _computeMeshDirection(*cdi,
MD_DirY,cells_center,faces_center,patch_cells,patch_nodes);
560 _computeMeshDirection(*cdi,
MD_DirZ,cells_center,faces_center,patch_cells,patch_nodes);
566 _saveInfosInProperties();
572std::tuple<CellGroup,NodeGroup> CartesianMeshImpl::
573_buildPatchGroups(
const CellGroup& cells,Integer patch_level)
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();
610 Int32 max_cell_id = cell_family->
maxLocalId();
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);
672void CartesianMeshImpl::
673_refinePatch(Real3 position,Real3 length,
bool is_3d)
675 UniqueArray<Int32> cells_local_id;
676 _cellsInZone(position, length, is_3d, cells_local_id);
678 _applyRefine(cells_local_id);
679 _saveInfosInProperties();
685void CartesianMeshImpl::
686_coarseZone(Real3 position, Real3 length,
bool is_3d)
688 UniqueArray<Int32> cells_local_id;
689 _cellsInZone(position, length, is_3d, cells_local_id);
691 _applyCoarse(cells_local_id);
692 _saveInfosInProperties();
698void CartesianMeshImpl::
699_cellsInZone(Real3 position, Real3 length,
bool is_3d, UniqueArray<Int32>& cells_local_id)
705 Real3 min_pos = position;
706 Real3 max_pos = min_pos + length;
707 cells_local_id.clear();
711 for (NodeLocalId inode : cell.nodeIds())
712 center += nodes_coord[inode];
713 center /= cell.nbNode();
714 bool is_inside_x = center.x > min_pos.x && center.x < max_pos.x;
715 bool is_inside_y = center.y > min_pos.y && center.y < max_pos.y;
716 bool is_inside_z = (center.z > min_pos.z && center.z < max_pos.z) || !is_3d;
717 if (is_inside_x && is_inside_y && is_inside_z) {
718 cells_local_id.add(icell.itemLocalId());
729 info() <<
"REFINEMENT 2D position=" << position <<
" length=" << length;
730 Real3 position_3d(position.
x,position.
y,0.0);
731 Real3 length_3d(length.
x,length.
y,0.0);
732 _refinePatch(position_3d,length_3d,
false);
741 info() <<
"REFINEMENT 3D position=" << position <<
" length=" << length;
742 _refinePatch(position,length,
true);
751 info() <<
"COARSEN 2D position=" << position <<
" length=" << length;
752 Real3 position_3d(position.
x, position.
y, 0.0);
753 Real3 length_3d(length.
x, length.
y, 0.0);
754 _coarseZone(position_3d, length_3d,
false);
763 info() <<
"COARSEN 3D position=" << position <<
" length=" << length;
764 _coarseZone(position, length,
true);
774 ARCANE_FATAL(
"You cannot reduce number of ghost layer of level 0 with this method");
778 const Int32 max_nb_layer = 128;
782 level_max = std::max(level_max, icell->level());
785 level_max = m_mesh->parallelMng()->reduce(Parallel::ReduceMax, level_max);
789 Integer level_0_nb_ghost_layer = m_mesh->ghostLayerMng()->nbGhostLayer();
792 if (level_0_nb_ghost_layer == 0) {
796 Integer nb_ghost_layer =
Convert::toInt32(level_0_nb_ghost_layer * pow(2, level));
799 if (target_nb_ghost_layers % 2 != 0) {
800 target_nb_ghost_layers++;
803 if (target_nb_ghost_layers == nb_ghost_layer) {
804 return nb_ghost_layer;
807 Integer parent_level = level - 1;
808 Integer parent_target_nb_ghost_layer = target_nb_ghost_layers / 2;
814 std::function<void(
Cell)> children_list;
816 children_list = [&cell_lid2, &children_list](
Cell cell) ->
void {
817 for (Integer i = 0; i < cell.nbHChildren(); ++i) {
818 cell_lid2[cell.level()].
add(cell.hChild(i).localId());
819 children_list(cell.hChild(i));
832 Cell front_cell = iface->frontCell();
833 Cell back_cell = iface->backCell();
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;
844 bool is_modif =
true;
845 Int32 current_layer = 0;
850 if (icell->isOwn() || icell->level() != parent_level || level_cell[icell] != -1) {
854 Int32 min = max_nb_layer;
857 for (
Node node : icell->nodes()) {
858 Int32 nlevel = level_node[node];
860 min = std::min(min, nlevel);
861 max = std::max(max, nlevel);
866 if (min != current_layer) {
871 if (min == 10 && max == -1) {
875 Integer new_level = ((min == max) ? min + 1 : max);
877 for (
Node node : icell->nodes()) {
878 Int32 nlevel = level_node[node];
880 level_node[node] = new_level;
886 level_cell[icell] = min;
891 if (min >= parent_target_nb_ghost_layer) {
892 children_list(*icell);
896 if (current_layer >= max_nb_layer) {
897 ARCANE_FATAL(
"Error in ghost layer counter algo. Report it plz.");
902 for (Integer i = level_max - 1; i >= 0; --i) {
904 if (m_mesh->parallelMng()->reduce(Parallel::ReduceMax, cell_lid2[i].
size()) == 0) {
909 m_mesh->modifier()->flagCellToCoarsen(cell_lid2[i]);
910 m_mesh->modifier()->coarsenItemsV2(
false);
913 info() <<
"Nb ghost layer for level " << level <<
" : " << target_nb_ghost_layers;
915 return target_nb_ghost_layers;
921void CartesianMeshImpl::
925 Integer index = m_amr_patch_cell_groups.size();
926 String parent_group_name =
String(
"CartesianMeshPatchParentCells")+index;
927 CellGroup parent_cells = cell_family->
createGroup(parent_group_name,parent_cells_local_id,
true);
928 _addPatch(parent_cells);
936void CartesianMeshImpl::
939 Integer index = m_amr_patch_cell_groups.size();
942 String children_group_name = String(
"CartesianMeshPatchCells")+index;
943 UniqueArray<Int32> children_local_id;
946 for(Integer k=0; k<c.nbHChildren(); ++k ){
947 Cell child = c.hChild(k);
948 children_local_id.add(child.localId());
951 IItemFamily* cell_family = m_mesh->cellFamily();
952 CellGroup children_cells = cell_family->createGroup(children_group_name,children_local_id,
true);
953 m_amr_patch_cell_groups.add(children_cells);
959void CartesianMeshImpl::
960_removeCellsInPatches(ConstArrayView<Int32> const_array_view)
962 for (
CellGroup cells : m_amr_patch_cell_groups) {
966 IParallelMng* pm = m_mesh->parallelMng();
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; });
971 m_amr_patch_cell_groups.resize(new_end - m_amr_patch_cell_groups.begin());
977void CartesianMeshImpl::
978_applyRefine(ConstArrayView<Int32> cells_local_id)
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);
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)
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();
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();
1004 else if(m_amr_type == eMeshAMRKind::Patch) {
1005 ARCANE_FATAL(
"General patch AMR is not implemented. Please use PatchCartesianMeshOnly (3)");
1012 MeshStats ms(
traceMng(),m_mesh,m_mesh->parallelMng());
1015 _addPatch(parent_cells);
1021void CartesianMeshImpl::
1022_applyCoarse(ConstArrayView<Int32> cells_local_id)
1024 Integer nb_cell = cells_local_id.size();
1025 info(4) <<
"Local_NbCellToCoarsen = " << nb_cell;
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)
1033 _removeCellsInPatches(cells_local_id);
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);
1040 else if (m_amr_type == eMeshAMRKind::PatchCartesianMeshOnly) {
1041 ARCANE_NOT_YET_IMPLEMENTED(
"Patch AMR for Cartesian only is not implemented yet");
1043 else if (m_amr_type == eMeshAMRKind::Patch) {
1044 ARCANE_FATAL(
"General patch AMR is not implemented. Please use PatchCartesianMeshOnly (3)");
1051 MeshStats ms(
traceMng(), m_mesh, m_mesh->parallelMng());
1062 info(4) <<
"Check valid CartesianMesh";
1064 for( Integer i=0; i<nb_patch; ++i ){
1076 auto* cmgi = ICartesianMeshGenerationInfo::getReference(m_mesh,
true);
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",
1087 Int32 patch_method = v.renumberPatchMethod();
1088 if (patch_method < 0 || patch_method > 4)
1089 ARCANE_FATAL(
"Invalid value '{0}' for renumberPatchMethod(). Valid values are 0, 1, 2, 3 or 4",
1092 else if (patch_method == 1 || patch_method == 3 || patch_method == 4){
1093 CartesianMeshUniqueIdRenumbering renumberer(
this,cmgi,v.parentPatch(),patch_method);
1094 renumberer.renumber();
1096 else if (patch_method == 2){
1097 warning() <<
"The patch method 2 is experimental!";
1098 CartesianMeshUniqueIdRenumberingV2 renumberer(
this,cmgi);
1099 renumberer.renumber();
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);
1124Ref<CartesianMeshCoarsening2> CartesianMeshImpl::
1125_createCartesianMeshCoarsening2()
1141 const char* name =
"CartesianMesh";
1150 ARCANE_FATAL(
"The mesh {0} is not yet created",h.meshName());
1156 mk.setMeshStructure(eMeshStructure::Cartesian);
1164 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.
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...
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)
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.
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 IMeshInternal * _internalApi()=0
API interne à Arcane.
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 const MeshKind meshKind() const =0
Caractéristiques du maillage.
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.
void removeItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Supprime des entités.
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é.
Vue sur un tableau typé d'entités.
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.
Paramètres nécessaires à la construction d'une variable.
Integer size() const
Nombre d'éléments du vecteur.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
Classe d'accès aux traces.
TraceMessage warning() const
Flot pour un message d'avertissement.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage info() const
Flot pour un message d'information.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
Vecteur 1D de données avec sémantique par valeur (style STL).
ItemGroupT< Cell > CellGroup
Groupe 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< Face, Real3 > VariableFaceReal3
Grandeur aux faces de type coordonnées.
Int32 toInt32(Real r)
Converti un Real en Int32.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool arcaneIsCheck()
Vrai si on est en mode vérification.
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()
eMeshAMRKind
Type de maillage AMR.
Int32 Integer
Type représentant un entier.
Real y
deuxième composante du couple
Real x
première composante du couple
Real y
deuxième composante du triplet
Real z
troisième composante du triplet
Real x
première composante du triplet