14#ifndef AMRMAXCONSISTENCYITER
15#define AMRMAXCONSISTENCYITER 10
23#include "arcane/utils/Real3.h"
24#include "arcane/utils/ArgumentException.h"
26#include "arcane/core/IParallelMng.h"
27#include "arcane/core/IMesh.h"
28#include "arcane/core/IItemFamily.h"
29#include "arcane/core/Item.h"
31#include "arcane/core/VariableTypes.h"
32#include "arcane/core/ItemPrinter.h"
33#include "arcane/core/SharedVariable.h"
34#include "arcane/core/ItemRefinementPattern.h"
35#include "arcane/core/Properties.h"
36#include "arcane/core/IGhostLayerMng.h"
37#include "arcane/core/ItemVector.h"
39#include "arcane/mesh/DynamicMesh.h"
40#include "arcane/mesh/ItemRefinement.h"
41#include "arcane/mesh/MeshRefinement.h"
42#include "arcane/mesh/ParallelAMRConsistency.h"
43#include "arcane/mesh/FaceReorienter.h"
44#include "arcane/mesh/NodeFamily.h"
45#include "arcane/mesh/EdgeFamily.h"
47#include "arcane/core/materials/IMeshMaterialMng.h"
59void _setRefineFlags(Item v)
61 Integer f = v.itemBase().flags();
62 f &= ~ItemFlags::II_Coarsen;
64 v.mutableItemBase().setFlags(f);
66void _setCoarseFlags(Item v)
68 Integer f = v.itemBase().flags();
69 f &= ~ItemFlags::II_Refine;
71 v.mutableItemBase().setFlags(f);
79#ifdef ACTIVATE_PERF_COUNTER
80const std::string MeshRefinement::PerfCounter::m_names[MeshRefinement::PerfCounter::NbCounters] =
105, m_face_family(&(mesh->trueFaceFamily()))
108, m_coarsen_by_parents(
false)
111, m_face_level_mismatch_limit(1)
112, m_max_node_uid(NULL_ITEM_UNIQUE_ID)
113, m_next_node_uid(NULL_ITEM_UNIQUE_ID)
114, m_max_cell_uid(NULL_ITEM_UNIQUE_ID)
115, m_next_cell_uid(NULL_ITEM_UNIQUE_ID)
116, m_max_face_uid(NULL_ITEM_UNIQUE_ID)
117, m_next_face_uid(NULL_ITEM_UNIQUE_ID)
118, m_max_nb_hChildren(0)
125 m_need_update =
true ;
129#ifdef ACTIVATE_PERF_COUNTER
130 m_perf_counter.init() ;
153 CHECKPERF( m_perf_counter.start(PerfCounter::CLEAR) )
154 m_node_finder._clear();
155 m_face_finder._clear();
156 CHECKPERF( m_perf_counter.stop(PerfCounter::CLEAR) )
166 CHECKPERF( m_perf_counter.start(PerfCounter::INIT) )
169 Int64 max_node_uid = 0;
174 if (uid>max_node_uid)
179 m_max_node_uid = pm->
reduce(Parallel::ReduceMax, max_node_uid);
181 m_max_node_uid = max_node_uid;
182 info() <<
"NODE_UID_INFO: MY_MAX_UID=" << max_node_uid <<
" GLOBAL=" << m_max_node_uid;
188 Int64 max_cell_uid = 0;
195 if (uid>max_cell_uid)
203 m_max_cell_uid = pm->
reduce(Parallel::ReduceMax, max_cell_uid);
208 m_max_cell_uid = max_cell_uid;
211 info() <<
"CELL_UID_INFO: MY_MAX_UID=" << max_cell_uid <<
" GLOBAL=" << m_max_cell_uid;
212 m_next_cell_uid = m_max_cell_uid + 1 + pm->
commRank() * m_max_nb_hChildren;
216 Int64 max_face_uid = 0;
221 if (uid>max_face_uid)
226 m_max_face_uid = pm->
reduce(Parallel::ReduceMax, max_face_uid);
228 m_max_face_uid = max_face_uid;
229 info() <<
"FACE_UID_INFO: MY_MAX_UID=" << max_face_uid <<
" GLOBAL=" << m_max_face_uid;
230 m_next_face_uid = m_max_face_uid + 1 + pm->
commRank();
235 CHECKPERF( m_perf_counter.stop(PerfCounter::INIT) )
243 CHECKPERF( m_perf_counter.start(PerfCounter::INIT) )
248 Int64 max_node_uid = m_max_node_uid;
249 Int64 max_cell_uid = m_max_cell_uid;
251 Int64 max_face_uid = m_max_face_uid;
253 typedef std::set<Int64> set_type ;
263 const Int64 cell_uid = child.
uniqueId();
265 if (cell_uid>max_cell_uid)
266 max_cell_uid = cell_uid;
272 const Int64 uid =
inode.uniqueId();
275 if (uid>max_node_uid)
282 for( Face iface : child.faces() ){
283 const Int64 uid = iface.uniqueId();
284 insert_return_type value = face_list.insert(uid) ;
286 if (uid>max_face_uid)
296 m_max_node_uid = pm->
reduce(Parallel::ReduceMax, max_node_uid);
297 m_max_cell_uid = pm->
reduce(Parallel::ReduceMax, max_cell_uid);
298 m_max_nb_hChildren = pm->
reduce(Parallel::ReduceMax, max_nb_hChildren);
299 m_max_face_uid = pm->
reduce(Parallel::ReduceMax, max_face_uid);
303 m_max_node_uid = max_node_uid;
304 m_max_cell_uid = max_cell_uid;
305 m_max_nb_hChildren = max_nb_hChildren;
306 m_max_face_uid = max_face_uid;
309 m_next_cell_uid = m_max_cell_uid + 1 + pm->
commRank() * m_max_nb_hChildren;
310 m_next_face_uid = m_max_face_uid + 1 + pm->
commRank();
313 CHECKPERF( m_perf_counter.stop(PerfCounter::INIT) )
318MeshRefinement::initMeshContainingBox()
327MeshRefinement::update()
330 initMeshContainingBox() ;
332 m_node_finder.init() ;
334 m_face_finder.initFaceCenter() ;
335 m_face_finder.init() ;
338 m_need_update = false ;
347 for (Integer i = 0, is =
lids.size(); i < is; i++) {
361 for (Integer i = 0, is =
lids.size(); i < is; i++) {
374 CHECKPERF( m_perf_counter.start(PerfCounter::INIT) )
381 warning() <<
"Warning, level one rule is the only condition accepted for AMR!";
393 CHECKPERF( m_perf_counter.stop(PerfCounter::INIT) )
401 CHECKPERF( m_perf_counter.start(PerfCounter::CONSIST) )
423 if(iter==AMRMAXCONSISTENCYITER)
fatal()<<
" MAX CONSISTENCY ITER REACHED";
424 CHECKPERF( m_perf_counter.stop(PerfCounter::CONSIST) )
427 CHECKPERF( m_perf_counter.start(PerfCounter::COARSEN) )
429 CHECKPERF( m_perf_counter.stop(PerfCounter::COARSEN) )
442 CHECKPERF( m_perf_counter.start(PerfCounter::ENDUPDATE) )
445 CHECKPERF( m_perf_counter.stop(PerfCounter::ENDUPDATE) )
453 CHECKPERF( m_perf_counter.start(PerfCounter::CONTRACT) )
455 CHECKPERF( m_perf_counter.stop(PerfCounter::CONTRACT) )
457 CHECKPERF( m_perf_counter.start(PerfCounter::ENDUPDATE) )
461 CHECKPERF( m_perf_counter.stop(PerfCounter::ENDUPDATE) )
466 CHECKPERF( m_perf_counter.start(PerfCounter::INTERP) )
468 CHECKPERF( m_perf_counter.stop(PerfCounter::INTERP) )
472 this->_makeFlagParallelConsistent2();
476 CHECKPERF( m_perf_counter.start(PerfCounter::PGHOST) )
484 CHECKPERF( m_perf_counter.stop(PerfCounter::PGHOST) )
485 _checkOwner(
"refineAndCoarsenItems after ghost update");
499#ifdef ACTIVATE_PERF_COUNTER
500 info()<<
"MESH REFINEMENT PERF INFO" ;
501 m_perf_counter.printInfo(
info().file()) ;
502 info()<<
"NODE FINDER PERF INFO" ;
503 m_node_finder.getPerfCounter().printInfo(
info().file()) ;
504 info()<<
"FACE FINDER PERF INFO" ;
505 m_face_finder.getPerfCounter().printInfo(
info().file()) ;
506 info()<<
"PARALLEL AMR CONSISTENCY PERF INFO" ;
527 warning() <<
"Warning, level one rule is the only condition accepted for AMR!";
534 ARCANE_ASSERT((
_checkLevelOne(
true)), (
"check_level_one failed"));
576 _checkOwner(
"coarsenItems");
601 if (cell.
level() == 0) {
616 for (Integer i = 0; i < parent.
nbHChildren(); ++i) {
619 ARCANE_FATAL(
"Parent cannot have children with coarse flag and children without coarse flag -- Parent uid: {0} -- Child uid: {1}", parent.
uniqueId(), child.
uniqueId());
627 ARCANE_FATAL(
"Cannot coarse parent and child in same time");
630 ARCANE_FATAL(
"For now, cannot coarse cell with children");
667 ARCANE_FATAL(
"Max one level diff between two cells is allowed -- Uid of Cell to be coarseing: {0} -- Uid of Opposite cell with children: {1}", cell.
uniqueId(),
other_cell.uniqueId());
724 ARCANE_NOT_YET_IMPLEMENTED(
"Support des maillages sans mailles fantômes à faire");
747 mm->forceRecompute();
768 warning() <<
"Warning, level one rule is the only condition accepted for AMR!";
774 ARCANE_ASSERT((
_checkLevelOne(
true)), (
"check_level_one failed"));
857 warning() <<
"ATTENTION: No Data Projection with this method!";
889 warning() <<
"ATTENTION: No Data Restriction with this method!";
909 Int64 uid = m_node_finder.find(
p,
tol);
910 if (uid != NULL_ITEM_ID)
916 Int64
new_uid = m_next_node_uid;
932 Int64 uid = m_face_finder.find(
p,
tol);
933 if (uid != NULL_ITEM_ID)
941 Int64
new_uid = m_next_face_uid;
955 Int64
new_uid = m_next_cell_uid;
957 m_next_cell_uid +=
comm_size * m_max_nb_hChildren;
973 m_node_finder.check() ;
975 m_face_finder.check() ;
976 debug() <<
"[MeshRefinement::updateLocalityMap] done";
998 bool failure =
false;
1006 if (face.nbCell()!=2)
1076 CHECKPERF( m_perf_counter.start(PerfCounter::PCONSIST) )
1077 debug() <<
"makeFlagsParallelConsistent() begin";
1095 Integer f =
iitem.itemBase().flags();
1106 iitem.mutableItemBase().setFlags(f);
1112 iitem.mutableItemBase().setFlags(f);
1118 iitem.mutableItemBase().setFlags(f);
1124 iitem.mutableItemBase().setFlags(f);
1154 CHECKPERF( m_perf_counter.stop(PerfCounter::PCONSIST) )
1161_makeFlagParallelConsistent2()
1166 CHECKPERF( m_perf_counter.start(PerfCounter::PCONSIST2) )
1167 debug() <<
"makeFlagsParallelConsistent2() begin";
1182 flag_cells_consistent.synchronize();
1184 for(Integer icell=0, nb_cell=ghost_cells.size();icell<nb_cell;++icell) {
1188 Item iitem = ghost_cells[icell];
1189 Integer f = iitem.itemBase().flags();
1193 Integer g = flag_cells_consistent[Cell(iitem)];
1197 iitem.mutableItemBase().setFlags(f);
1198 parallel_consistent =
false;
1203 iitem.mutableItemBase().setFlags(f);
1204 parallel_consistent =
false;
1209 iitem.mutableItemBase().setFlags(f);
1210 parallel_consistent =
false;
1222 debug() <<
"makeFlagsParallelConsistent2() end";
1224 CHECKPERF( m_perf_counter.stop(PerfCounter::PCONSIST2) )
1225 return parallel_consistent;
1235 debug() <<
"makeCoarseningCompatible() begin";
1241 warning() <<
"Warning, level one rule is the only condition accepted for AMR!";
1275 debug() <<
"makeCoarseningCompatible() done";
1307 if (face.nbCell()!=2)
1355 if (face.nbCell()!=2)
1370 for (Integer
c=0;
c !=
neighbor.nbHChildren(); ++
c)
1389 for (
int level=(
max_level); level >= 0; level--){
1461 debug() <<
"makeCoarseningCompatible() done";
1477 debug() <<
"makeRefinementCompatible() begin";
1483 warning() <<
"Warning, level one rule is the only condition accepted now for AMR!";
1512 if (face.nbCell()!=2)
1528 Integer f =
neighbor.itemBase().flags();
1541 if (face.nbCell()!=2)
1556 Integer f =
neighbor.itemBase().flags();
1560 neighbor.mutableItemBase().setFlags(f);
1577 Integer f =
neighbor.itemBase().flags();
1581 neighbor.mutableItemBase().setFlags(f);
1595 fatal() <<
"a neighbor is more than one level away";
1604 fatal() <<
"serious problem: we should never get here";
1618 debug() <<
"makeRefinementCompatible() done";
1645 ARCANE_ASSERT ( (cell.
level() != 0), (
"no level-0 element should be active and flagged for coarsening"));
1666 switch (cell.
type())
1671 case IT_Tetraedron4:
1677 case IT_Pentaedron6:
1692 case IT_AntiWedgeLeft6:
1695 case IT_AntiWedgeRight6:
1704 ARCANE_ASSERT(cell.
isActive(), (
"cell_active failed"));
1738 m_node_finder.check() ;
1739 m_face_finder.check() ;
1741 CHECKPERF( m_perf_counter.start(PerfCounter::REFINE) )
1742 m_face_finder.clearNewUids() ;
1770 for (Integer e = 0; e !=
i_size; ++e) {
1773 switch (
iitem.type())
1778 case IT_Tetraedron4:
1784 case IT_Pentaedron6:
1799 case IT_AntiWedgeLeft6:
1802 case IT_AntiWedgeRight6:
1821 for (Integer e = 0; e !=
i_size; ++e){
1826 CHECKPERF( m_perf_counter.stop(PerfCounter::REFINE) )
1829 CHECKPERF( m_perf_counter.start(PerfCounter::PGCONSIST) )
1831 m_node_finder.check2() ;
1832 m_face_finder.check2() ;
1837 CHECKPERF( m_perf_counter.stop(PerfCounter::PGCONSIST) )
1917 if (
iitem.isSubactive()) {
1919 ARCANE_ASSERT((
iitem.nbHParent() != 0), (
""));
1926 if (
iitem.isActive()) {
1928 for (Integer
c = 0;
c <
iitem.nbHChildren();
c++) {
1930 if (!
ichild.isSuppressed()) {
1946 ARCANE_ASSERT((
iitem.isAncestor()), (
""));
1955 this->_makeFlagParallelConsistent2();
1956 this->_removeGhostChildren();
1966 for (Integer i = 0; i <
ps; i++)
1978void MeshRefinement::
1987void MeshRefinement::
2005 for (Integer i = 0; i <
nb_cells; i++) {
2012void MeshRefinement::
2015 CHECKPERF( m_perf_counter.start(PerfCounter::UPDATEMAP) )
2021 for (Integer i = 0; i <
nb_cells; i++) {
2029 CHECKPERF( m_perf_counter.stop(PerfCounter::UPDATEMAP) )
2032void MeshRefinement::
2033_update(ArrayView<ItemInternal*> cells_to_refine)
2035 CHECKPERF( m_perf_counter.start(PerfCounter::UPDATEMAP) )
2036 m_node_finder.updateData(cells_to_refine) ;
2037 m_face_finder.updateData(cells_to_refine) ;
2038 _updateMaxUid(cells_to_refine) ;
2041 CHECKPERF( m_perf_counter.stop(PerfCounter::UPDATEMAP) )
2044void MeshRefinement::
2045_invalidate(ArrayView<ItemInternal*> coarsen_cells)
2047 CHECKPERF( m_perf_counter.start(PerfCounter::CLEAR) )
2048 m_node_finder.clearData(coarsen_cells) ;
2049 m_face_finder.clearData(coarsen_cells) ;
2050 CHECKPERF( m_perf_counter.stop(PerfCounter::CLEAR) )
2065void MeshRefinement::
2079 std::map<Int32, bool>
marker;
2083 for (
Node node : item.nodes()){
2088 marker[node.localId()] =
true;
2094 const Integer
node_cs = node.cells().size();
2095 for (
Cell cell : node.cells() ){
2111 for ( Cell cell2 : node.cells() ){
2112 if (cell_to_remove_lids.contains(cell2.localId()))
2114 if (cell.null() || cell2.uniqueId() < cell.uniqueId())
2118 ARCANE_FATAL(
"Inconsistent null cell owner reference");
2119 const Int32 new_owner = cell.owner();
2120 nodes_owner[node] = new_owner;
2121 node.mutableItemBase().setOwner(new_owner, sid);
2123 node_owner_changed =
true;
2126 for ( Face face : item.faces() ){
2127 if (face.nbCell() != 2)
2129 const Int32 owner = face.owner();
2131 for (Cell cell : face.cells() ){
2132 if ((item.
uniqueId() == cell.uniqueId()) || !(item.
level() == cell.level()))
2134 if (cell.owner() == owner){
2140 for (Cell cell2 : face.cells()){
2141 if (item.
uniqueId() == cell2.uniqueId())
2143 faces_owner[face] = cell2.owner();
2144 face.mutableItemBase().setOwner(cell2.owner(), sid);
2146 face_owner_changed =
true;
2153 if (node_owner_changed){
2159 if (face_owner_changed){
2160 faces_owner.synchronize();
2169void MeshRefinement::
2176 bool owner_changed =
false;
2178 Node node = (*inode);
2179 Int32 owner = node.owner();
2181 for( Cell cell : node.cells() ){
2182 if (cell.owner()==owner){
2189 for( Cell cell2 : node.cells() ){
2190 if (cell.null() || cell2.uniqueId() < cell.uniqueId())
2193 ARCANE_ASSERT((!cell.null()),(
"Inconsistent null cell owner reference"));
2194 nodes_owner[node] = cell.owner();
2195 owner_changed =
true;
2200 nodes_owner.synchronize();
2209 owner_changed =
false;
2211 Face face = (*iface);
2212 Int32 owner = face.owner();
2214 for( Cell cell : face.cells() ){
2215 if (cell.owner()==owner){
2221 if(face.nbCell() ==2)
2222 fatal() <<
"Face" << ItemPrinter(face) <<
" has a different owner with respect to Back/Front Cells";
2224 faces_owner[face] = face.boundaryCell().owner();
2230 faces_owner.synchronize();
2238bool MeshRefinement::
2239_removeGhostChildren()
2242 DynamicMesh* mesh =
m_mesh;
2243 ItemInternalMap& cells_map = mesh->cellsMap();
2247 cells_to_remove.
reserve(1000);
2248 UniqueArray<ItemInternal*> parent_cells;
2249 parent_cells.reserve(1000);
2251 cells_map.eachItem([&](impl::ItemBase cell) {
2252 if (cell.owner() == sid)
2256 for (Integer c = 0, cs = cell.nbHChildren(); c < cs; c++) {
2257 cells_to_remove.add(cell.hChildBase(c).localId());
2259 parent_cells.add(cell._itemInternal());
2263 _invalidate(parent_cells) ;
2266 _updateItemOwner(cells_to_remove);
2269 for (Integer i = 0, ps = parent_cells.size(); i < ps; i++)
2272 return cells_to_remove.size() > 0 ;
2278void MeshRefinement::
2279populateBackFrontCellsFromParentFaces(Cell parent_cell)
2281 switch (parent_cell.type())
2284 _populateBackFrontCellsFromParentFaces<IT_Quad4>(parent_cell);
2286 case IT_Tetraedron4:
2287 _populateBackFrontCellsFromParentFaces<IT_Tetraedron4>(parent_cell);
2290 _populateBackFrontCellsFromParentFaces<IT_Pyramid5>(parent_cell);
2292 case IT_Pentaedron6:
2293 _populateBackFrontCellsFromParentFaces<IT_Pentaedron6>(parent_cell);
2296 _populateBackFrontCellsFromParentFaces<IT_Hexaedron8>(parent_cell);
2299 _populateBackFrontCellsFromParentFaces<IT_HemiHexa7>(parent_cell);
2302 _populateBackFrontCellsFromParentFaces<IT_HemiHexa6>(parent_cell);
2305 _populateBackFrontCellsFromParentFaces<IT_HemiHexa5>(parent_cell);
2307 case IT_AntiWedgeLeft6:
2308 _populateBackFrontCellsFromParentFaces<IT_AntiWedgeLeft6>(parent_cell);
2310 case IT_AntiWedgeRight6:
2311 _populateBackFrontCellsFromParentFaces<IT_AntiWedgeRight6>(parent_cell);
2314 _populateBackFrontCellsFromParentFaces<IT_DiTetra5>(parent_cell);
2317 ARCANE_FATAL(
"Not supported refinement Item Type type={0}",parent_cell.type());
2332 if (
rp.face_mapping_topo(
c,
fc) == 0)
2334 const Integer f =
rp.face_mapping(
c,
fc);
2342 m_face_family->addBackFrontCellsFromParentFace(
subface, face);
2346 m_face_family->replaceBackFrontCellsFromParentFace(child,
subface,
parent_cell, face);
2350 m_face_family->replaceBackFrontCellsFromParentFace(child,
subface,
parent_cell, face);
2355 (
"back front cells error"));
2368 for (Integer f = 0; f <
nb_faces; f++){
2380 case IT_Tetraedron4:
2386 case IT_Pentaedron6:
2401 case IT_AntiWedgeLeft6:
2404 case IT_AntiWedgeRight6:
2419template <
int typeID>
void MeshRefinement::
2431 if (f ==
rp.face_mapping(
c,
fc) && (
rp.face_mapping_topo(
c,
fc))){
2439 ARCANE_ASSERT((subface.
backCell() != subface.
frontCell()), (
"back front cells error"));
2451void MeshRefinement::
2452_checkOwner(
const String& msg)
2455 info() <<
"----CheckOwner in " << msg;
2457 syncvariable.fill(-1);
2458 bool has_owner_changed =
false;
2461 syncvariable_copy.copy(syncvariable);
2462 syncvariable.synchronize();
2463 ItemVector desync_nodes(
m_mesh->nodeFamily());
2466 if (syncvariable[inode] == -1) {
2467 debug(
Trace::Highest) <<
"----- Inconsistent owner (ghost everywhere) for node with uid : "
2468 << inode->uniqueId().asInt64();
2469 desync_nodes.addItem(*inode);
2470 has_owner_changed =
true;
2472 if (inode->isOwn() && (syncvariable_copy[inode] != syncvariable[inode])) {
2474 << inode->uniqueId().asInt64();
2475 desync_nodes.addItem(*inode);
2476 has_owner_changed =
true;
2486 desync_node_uids[inode.index()] = inode->uniqueId().asInt64();
2492 for (
auto lid : desync_node_lids_gather) {
2493 if (lid == NULL_ITEM_LOCAL_ID)
2495 if (std::find(desync_nodes.viewAsArray().begin(), desync_nodes.viewAsArray().end(),lid) == desync_nodes.viewAsArray().end()){
2496 desync_nodes.add(lid);
2503 desync_node_owners[2*inode.index() ] = inode->uniqueId().asInt64();
2504 desync_node_owners[2*inode.index()+1] = inode->owner();
2510 std::map<Int64,Int32SharedArray> uid_owners_map;
2511 for (Integer node_index = 0; node_index+1 < desync_node_owners_gather.size();) {
2512 uid_owners_map[desync_node_owners_gather[node_index]].add((
Int32)desync_node_owners_gather[node_index+1]);
2513 desync_node_uids_gather.add(desync_node_owners_gather[node_index]);
2520 for (
auto owner : uid_owners_map[inode->uniqueId().asInt64()]) {
2521 if (owner < new_owner && owner != m_node_owner_memory[inode]) new_owner = owner;
2523 debug(
Trace::Highest) <<
"------ Change owner for node " << inode->uniqueId() <<
" from " << inode->owner() <<
" to " << new_owner;
2529 if (p_has_owner_changed) {
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Déclarations des types utilisés dans Arcane.
Tableau d'items de types quelconques.
Vue sur les informations des mailles.
FaceConnectedListViewType faces() const
Liste des faces de la maille.
Int32 nbHChildren() const
Nombre d'enfants pour l'AMR.
Face face(Int32 i) const
i-ème face de la maille
Int32 nbFace() const
Nombre de faces de la maille.
Cell hChild(Int32 i) const
i-ème enfant AMR
Int32 nbHParent() const
Nombre de parent pour l'AMR.
Cell frontCell() const
Maille devant la face (maille nulle si aucune)
Cell cell(Int32 i) const
i-ème maille de la face
Int32 nbCell() const
Nombre de mailles de la face (1 ou 2)
Cell backCell() const
Maille derrière la face (maille nulle si aucune)
Interface d'un fonctor avec argument.
virtual Integer nbGhostLayer() const =0
Nombre de couches fantômes.
Interface d'une famille d'entités.
virtual void computeSynchronizeInfos()=0
Construit les structures nécessaires à la synchronisation.
virtual void notifyItemsOwnerChanged()=0
Notifie que les entités propres au sous-domaine de la famille ont été modifiées.
virtual void itemsUniqueIdToLocalId(Int32ArrayView local_ids, Int64ConstArrayView unique_ids, bool do_fatal=true) const =0
Converti un tableau de numéros uniques en numéros locaux.
virtual VariableItemInt32 & itemsNewOwner()=0
Variable contenant le numéro du nouveau sous-domaine propriétaire de l'entité.
virtual void endUpdate()=0
Notifie la fin de modification de la liste des entités.
virtual void setDynamic(bool v)=0
Positionne la propriété indiquant si le maillage peut évoluer.
virtual void removeCells(Int32ConstArrayView cells_local_id)=0
Supprime des mailles.
virtual void endUpdate()=0
Notifie l'instance de la fin de la modification du maillage.
virtual void updateGhostLayerFromParent(Array< Int64 > &ghost_cell_to_refine, Array< Int64 > &ghost_cell_to_coarsen, bool remove_old_ghost)=0
AMR.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual void allGatherVariable(ConstArrayView< char > send_buf, Array< char > &recv_buf)=0
Effectue un regroupement sur tous les processeurs.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
virtual void barrier()=0
Effectue une barière.
Classe de base pour les entités du maillage.
Int32 flags() const
Flags de l'entité
bool isOwn() const
Vrai si l'entité appartient au sous-domaine.
Flags pour les caractéristiques des entités.
@ II_Inactive
L'entité est inactive //COARSEN_INACTIVE,.
@ II_Refine
L'entité est marquée pour raffinement.
@ II_JustAdded
L'entité vient d'être ajoutée.
@ II_HasBackCell
L'entité a une maille derrière.
@ II_JustRefined
L'entité vient d'être raffinée.
@ II_CoarsenInactive
L'entité est inactive et a des enfants tagués pour déraffinement.
@ II_HasFrontCell
L'entité a une maille devant.
@ II_DoNothing
L'entité est bloquée.
@ II_Coarsen
L'entité est marquée pour déraffinement.
@ II_JustCoarsened
L'entité vient d'être déraffiné
@ II_UserMark1
Marque utilisateur old_value 1<<24.
Integer size() const
Nombre d'éléments du groupe.
Vue sur une liste pour obtenir des informations sur les entités.
Gestionnaire des types d'entités de maillage.
NodeConnectedListViewType nodes() const
Liste des noeuds de l'entité
Classe de base d'un élément de maillage.
impl::MutableItemBase mutableItemBase() const
Partie interne modifiable de l'entité.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
bool isOwn() const
true si l'entité est appartient au sous-domaine
Int32 owner() const
Numéro du sous-domaine propriétaire de l'entité
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
impl::ItemBase itemBase() const
Partie interne de l'entité.
Int16 type() const
Type de l'entité
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
static IMeshMaterialMng * getReference(const MeshHandleOrMesh &mesh_handle, bool create=true)
Récupère ou créé la référence associée à mesh.
void setFlags(Int32 f)
Positionne les flags de l'entité
void addFlags(Int32 added_flags)
Ajoute les flags \added_flags à ceux de l'entité
void removeFlags(Int32 removed_flags)
Supprime les flags \added_flags de ceux de l'entité
bool getBool(const String &name) const
Valeur de la propriété de nom name.
void setBool(const String &name, bool value)
Positionne une propriété de type bool de nom name et de valeur value.
Classe gérant un vecteur de réel de dimension 3.
Paramètres nécessaires à la construction d'une variable.
Implémentation d'un maillage.
IItemFamily * nodeFamily() override
Retourne la famille des noeuds.
IItemFamily * cellFamily() override
Retourne la famille des mailles.
FaceGroup allFaces() override
Groupe de toutes les faces.
CellGroup allActiveCells() override
AMR.
IParallelMng * parallelMng() override
Gestionnaire de parallèlisme.
NodeGroup ownNodes() override
Groupe de tous les noeuds propres au domaine.
IMeshModifier * modifier() override
Interface de modification associée.
ItemTypeMng * itemTypeMng() const override
Gestionnaire de types d'entités associé
CellGroup allCells() override
Groupe de toutes les mailles.
IGhostLayerMng * ghostLayerMng() const override
Gestionnare de couche fantômes associé
FaceGroup ownFaces() override
Groupe de toutes les faces propres au domaine.
IItemFamily * faceFamily() override
Retourne la famille des faces.
Properties * properties() override
Propriétés associées à ce maillage.
CellGroup ownCells() override
Groupe de toutes les mailles propres au domaine.
CellGroup ownActiveCells() override
Groupe de toutes les mailles actives et propres au domaine.
NodeGroup allNodes() override
Groupe de tous les noeuds.
CellGroup ownLevelCells(const Integer &level) override
Groupe de toutes les mailles propres de niveau level.
void addFrontCellToFace(Face face, Cell new_cell)
Ajoute une maille devant la face.
void addBackCellToFace(Face face, Cell new_cell)
Ajoute une maille derrière la face.
Tableau associatif de ItemInternal.
void refineOneCell(Cell item, MeshRefinement &mesh_refinement)
void coarsenOneCell(Cell item, const ItemRefinementPatternT< typeID > &rp)
Implémentation des algorithmes d'adaptation par raffinement de maillages non-structuré.
bool _checkUnflagged(bool arcane_assert_yes=false)
MeshRefinement(DynamicMesh *mesh)
AMRCallBackMng * m_call_back_mng
void populateBackFrontCellsFromChildrenFaces(Cell parent_cell)
bool coarsenItemsV2(bool update_parent_flag)
Méthode permettant de retirer les mailles marquées avec le flag "II_Coarsen".
bool refineAndCoarsenItems(const bool maintain_level_one=true)
bool refineItems(const bool maintain_level_one=true)
const IMesh * getMesh() const
Référence constante au maillage.
void uniformlyCoarsen(Integer n=1)
Int64 findOrAddFaceUid(const Real3 &face_center, const Real &tol, bool &is_added)
MapCoordToUid::Box m_mesh_containing_box
ParallelAMRConsistency * m_parallel_amr_consistency
bool _makeCoarseningCompatible(const bool)
void _updateLocalityMap()
Int64 getFirstChildNewUid()
bool _makeRefinementCompatible(const bool)
void _upscaleData(Array< ItemInternal * > &parent_cells)
restriction des données sur les mailles parents
ItemRefinement * m_item_refinement
bool _makeFlagParallelConsistent()
Int64 findOrAddNodeUid(const Real3 &p, const Real &tol)
bool _checkLevelOne(bool arcane_assert_yes=false)
void uniformlyRefine(Integer n=1)
void _cleanRefinementFlags()
bool coarsenItems(const bool maintain_level_one=true)
void _populateBackFrontCellsFromParentFaces(Cell parent_cell)
void _interpolateData(const Int64Array &cells_to_refine)
interpolation des données sur les mailles enfants
virtual void flagCellToRefine(Int32ConstArrayView cells_lids)
Passage de l'erreur commise par maille au flag de raffinement.
bool _refineItems(Int64Array &cells_to_refine)
void makeNewItemsConsistent(NodeMapCoordToUid &node_finder, FaceMapCoordToUid &face_finder)
Détermine les faces à envoyer aux voisins.
Vue modifiable d'un tableau d'un type T.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
Vue constante d'un tableau de type T.
Exception lorsqu'une erreur fatale est survenue.
Classe d'accès aux traces.
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.
TraceMessage fatal() const
Flot pour un message d'erreur fatale.
Vecteur 1D de données avec sémantique par valeur (style STL).
ItemGroupT< Face > FaceGroup
Groupe de faces.
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
MeshVariableScalarRefT< Node, Int32 > VariableNodeInt32
Grandeur au noeud de type entier 32 bits.
ItemVariableScalarRefT< Int32 > VariableItemInt32
Grandeur de type entier 32 bits.
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
bool arcaneIsDebug()
Vrai si la macro ARCANE_DEBUG est définie.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
@ Highest
Niveau le plus élevé
Int32 Integer
Type représentant un entier.