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"
38#include "arcane/mesh/DynamicMesh.h"
39#include "arcane/mesh/ItemRefinement.h"
40#include "arcane/mesh/MeshRefinement.h"
42#include "arcane/mesh/ParallelAMRConsistency.h"
43#include "arcane/mesh/FaceReorienter.h"
45#include "arcane/mesh/NodeFamily.h"
46#include "arcane/mesh/EdgeFamily.h"
47#include "arcane/core/ItemVector.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");
724 ARCANE_NOT_YET_IMPLEMENTED(
"Support des maillages sans mailles fantômes à faire");
760 warning() <<
"Warning, level one rule is the only condition accepted for AMR!";
766 ARCANE_ASSERT((
_checkLevelOne(
true)), (
"check_level_one failed"));
849 warning() <<
"ATTENTION: No Data Projection with this method!";
881 warning() <<
"ATTENTION: No Data Restriction with this method!";
901 Int64 uid = m_node_finder.find(
p,
tol);
902 if (uid != NULL_ITEM_ID)
908 Int64
new_uid = m_next_node_uid;
924 Int64 uid = m_face_finder.find(
p,
tol);
925 if (uid != NULL_ITEM_ID)
933 Int64
new_uid = m_next_face_uid;
947 Int64
new_uid = m_next_cell_uid;
949 m_next_cell_uid +=
comm_size * m_max_nb_hChildren;
965 m_node_finder.check() ;
967 m_face_finder.check() ;
968 debug() <<
"[MeshRefinement::updateLocalityMap] done";
990 bool failure =
false;
998 if (face.nbCell()!=2)
1068 CHECKPERF( m_perf_counter.start(PerfCounter::PCONSIST) )
1069 debug() <<
"makeFlagsParallelConsistent() begin";
1087 Integer f =
iitem.itemBase().flags();
1098 iitem.mutableItemBase().setFlags(f);
1104 iitem.mutableItemBase().setFlags(f);
1110 iitem.mutableItemBase().setFlags(f);
1116 iitem.mutableItemBase().setFlags(f);
1146 CHECKPERF( m_perf_counter.stop(PerfCounter::PCONSIST) )
1153_makeFlagParallelConsistent2()
1158 CHECKPERF( m_perf_counter.start(PerfCounter::PCONSIST2) )
1159 debug() <<
"makeFlagsParallelConsistent2() begin";
1174 flag_cells_consistent.synchronize();
1176 for(Integer icell=0, nb_cell=ghost_cells.size();icell<nb_cell;++icell) {
1180 Item iitem = ghost_cells[icell];
1181 Integer f = iitem.itemBase().flags();
1185 Integer g = flag_cells_consistent[Cell(iitem)];
1189 iitem.mutableItemBase().setFlags(f);
1190 parallel_consistent =
false;
1195 iitem.mutableItemBase().setFlags(f);
1196 parallel_consistent =
false;
1201 iitem.mutableItemBase().setFlags(f);
1202 parallel_consistent =
false;
1214 debug() <<
"makeFlagsParallelConsistent2() end";
1216 CHECKPERF( m_perf_counter.stop(PerfCounter::PCONSIST2) )
1217 return parallel_consistent;
1227 debug() <<
"makeCoarseningCompatible() begin";
1233 warning() <<
"Warning, level one rule is the only condition accepted for AMR!";
1267 debug() <<
"makeCoarseningCompatible() done";
1299 if (face.nbCell()!=2)
1347 if (face.nbCell()!=2)
1362 for (Integer
c=0;
c !=
neighbor.nbHChildren(); ++
c)
1381 for (
int level=(
max_level); level >= 0; level--){
1453 debug() <<
"makeCoarseningCompatible() done";
1469 debug() <<
"makeRefinementCompatible() begin";
1475 warning() <<
"Warning, level one rule is the only condition accepted now for AMR!";
1504 if (face.nbCell()!=2)
1520 Integer f =
neighbor.itemBase().flags();
1533 if (face.nbCell()!=2)
1548 Integer f =
neighbor.itemBase().flags();
1552 neighbor.mutableItemBase().setFlags(f);
1569 Integer f =
neighbor.itemBase().flags();
1573 neighbor.mutableItemBase().setFlags(f);
1587 fatal() <<
"a neighbor is more than one level away";
1596 fatal() <<
"serious problem: we should never get here";
1610 debug() <<
"makeRefinementCompatible() done";
1637 ARCANE_ASSERT ( (cell.
level() != 0), (
"no level-0 element should be active and flagged for coarsening"));
1658 switch (cell.
type())
1663 case IT_Tetraedron4:
1669 case IT_Pentaedron6:
1684 case IT_AntiWedgeLeft6:
1687 case IT_AntiWedgeRight6:
1696 ARCANE_ASSERT(cell.
isActive(), (
"cell_active failed"));
1730 m_node_finder.check() ;
1731 m_face_finder.check() ;
1733 CHECKPERF( m_perf_counter.start(PerfCounter::REFINE) )
1734 m_face_finder.clearNewUids() ;
1762 for (Integer e = 0; e !=
i_size; ++e) {
1765 switch (
iitem.type())
1770 case IT_Tetraedron4:
1776 case IT_Pentaedron6:
1791 case IT_AntiWedgeLeft6:
1794 case IT_AntiWedgeRight6:
1813 for (Integer e = 0; e !=
i_size; ++e){
1818 CHECKPERF( m_perf_counter.stop(PerfCounter::REFINE) )
1821 CHECKPERF( m_perf_counter.start(PerfCounter::PGCONSIST) )
1823 m_node_finder.check2() ;
1824 m_face_finder.check2() ;
1829 CHECKPERF( m_perf_counter.stop(PerfCounter::PGCONSIST) )
1909 if (
iitem.isSubactive()) {
1911 ARCANE_ASSERT((
iitem.nbHParent() != 0), (
""));
1918 if (
iitem.isActive()) {
1920 for (Integer
c = 0;
c <
iitem.nbHChildren();
c++) {
1922 if (!
ichild.isSuppressed()) {
1938 ARCANE_ASSERT((
iitem.isAncestor()), (
""));
1947 this->_makeFlagParallelConsistent2();
1948 this->_removeGhostChildren();
1958 for (Integer i = 0; i <
ps; i++)
1970void MeshRefinement::
1979void MeshRefinement::
1997 for (Integer i = 0; i <
nb_cells; i++) {
2004void MeshRefinement::
2007 CHECKPERF( m_perf_counter.start(PerfCounter::UPDATEMAP) )
2013 for (Integer i = 0; i <
nb_cells; i++) {
2021 CHECKPERF( m_perf_counter.stop(PerfCounter::UPDATEMAP) )
2024void MeshRefinement::
2025_update(ArrayView<ItemInternal*> cells_to_refine)
2027 CHECKPERF( m_perf_counter.start(PerfCounter::UPDATEMAP) )
2028 m_node_finder.updateData(cells_to_refine) ;
2029 m_face_finder.updateData(cells_to_refine) ;
2030 _updateMaxUid(cells_to_refine) ;
2033 CHECKPERF( m_perf_counter.stop(PerfCounter::UPDATEMAP) )
2036void MeshRefinement::
2037_invalidate(ArrayView<ItemInternal*> coarsen_cells)
2039 CHECKPERF( m_perf_counter.start(PerfCounter::CLEAR) )
2040 m_node_finder.clearData(coarsen_cells) ;
2041 m_face_finder.clearData(coarsen_cells) ;
2042 CHECKPERF( m_perf_counter.stop(PerfCounter::CLEAR) )
2057void MeshRefinement::
2071 std::map<Int32, bool>
marker;
2075 for (
Node node : item.nodes()){
2080 marker[node.localId()] =
true;
2086 const Integer
node_cs = node.cells().size();
2087 for (
Cell cell : node.cells() ){
2103 for ( Cell cell2 : node.cells() ){
2104 if (cell_to_remove_lids.contains(cell2.localId()))
2106 if (cell.null() || cell2.uniqueId() < cell.uniqueId())
2110 ARCANE_FATAL(
"Inconsistent null cell owner reference");
2111 const Int32 new_owner = cell.owner();
2112 nodes_owner[node] = new_owner;
2113 node.mutableItemBase().setOwner(new_owner, sid);
2115 node_owner_changed =
true;
2118 for ( Face face : item.faces() ){
2119 if (face.nbCell() != 2)
2121 const Int32 owner = face.owner();
2123 for (Cell cell : face.cells() ){
2124 if ((item.
uniqueId() == cell.uniqueId()) || !(item.
level() == cell.level()))
2126 if (cell.owner() == owner){
2132 for (Cell cell2 : face.cells()){
2133 if (item.
uniqueId() == cell2.uniqueId())
2135 faces_owner[face] = cell2.owner();
2136 face.mutableItemBase().setOwner(cell2.owner(), sid);
2138 face_owner_changed =
true;
2145 if (node_owner_changed){
2151 if (face_owner_changed){
2152 faces_owner.synchronize();
2161void MeshRefinement::
2168 bool owner_changed =
false;
2170 Node node = (*inode);
2171 Int32 owner = node.owner();
2173 for( Cell cell : node.cells() ){
2174 if (cell.owner()==owner){
2181 for( Cell cell2 : node.cells() ){
2182 if (cell.null() || cell2.uniqueId() < cell.uniqueId())
2185 ARCANE_ASSERT((!cell.null()),(
"Inconsistent null cell owner reference"));
2186 nodes_owner[node] = cell.owner();
2187 owner_changed =
true;
2192 nodes_owner.synchronize();
2201 owner_changed =
false;
2203 Face face = (*iface);
2204 Int32 owner = face.owner();
2206 for( Cell cell : face.cells() ){
2207 if (cell.owner()==owner){
2213 if(face.nbCell() ==2)
2214 fatal() <<
"Face" << ItemPrinter(face) <<
" has a different owner with respect to Back/Front Cells";
2216 faces_owner[face] = face.boundaryCell().owner();
2222 faces_owner.synchronize();
2230bool MeshRefinement::
2231_removeGhostChildren()
2234 DynamicMesh* mesh =
m_mesh;
2235 ItemInternalMap& cells_map = mesh->cellsMap();
2239 cells_to_remove.
reserve(1000);
2240 UniqueArray<ItemInternal*> parent_cells;
2241 parent_cells.reserve(1000);
2243 cells_map.eachItem([&](impl::ItemBase cell) {
2244 if (cell.owner() == sid)
2248 for (Integer c = 0, cs = cell.nbHChildren(); c < cs; c++) {
2249 cells_to_remove.add(cell.hChildBase(c).localId());
2251 parent_cells.add(cell._itemInternal());
2255 _invalidate(parent_cells) ;
2258 _updateItemOwner(cells_to_remove);
2261 for (Integer i = 0, ps = parent_cells.size(); i < ps; i++)
2264 return cells_to_remove.size() > 0 ;
2270void MeshRefinement::
2271populateBackFrontCellsFromParentFaces(Cell parent_cell)
2273 switch (parent_cell.type())
2276 _populateBackFrontCellsFromParentFaces<IT_Quad4>(parent_cell);
2278 case IT_Tetraedron4:
2279 _populateBackFrontCellsFromParentFaces<IT_Tetraedron4>(parent_cell);
2282 _populateBackFrontCellsFromParentFaces<IT_Pyramid5>(parent_cell);
2284 case IT_Pentaedron6:
2285 _populateBackFrontCellsFromParentFaces<IT_Pentaedron6>(parent_cell);
2288 _populateBackFrontCellsFromParentFaces<IT_Hexaedron8>(parent_cell);
2291 _populateBackFrontCellsFromParentFaces<IT_HemiHexa7>(parent_cell);
2294 _populateBackFrontCellsFromParentFaces<IT_HemiHexa6>(parent_cell);
2297 _populateBackFrontCellsFromParentFaces<IT_HemiHexa5>(parent_cell);
2299 case IT_AntiWedgeLeft6:
2300 _populateBackFrontCellsFromParentFaces<IT_AntiWedgeLeft6>(parent_cell);
2302 case IT_AntiWedgeRight6:
2303 _populateBackFrontCellsFromParentFaces<IT_AntiWedgeRight6>(parent_cell);
2306 _populateBackFrontCellsFromParentFaces<IT_DiTetra5>(parent_cell);
2309 ARCANE_FATAL(
"Not supported refinement Item Type type={0}",parent_cell.type());
2324 if (
rp.face_mapping_topo(
c,
fc) == 0)
2326 const Integer f =
rp.face_mapping(
c,
fc);
2334 m_face_family->addBackFrontCellsFromParentFace(
subface, face);
2338 m_face_family->replaceBackFrontCellsFromParentFace(child,
subface,
parent_cell, face);
2342 m_face_family->replaceBackFrontCellsFromParentFace(child,
subface,
parent_cell, face);
2347 (
"back front cells error"));
2360 for (Integer f = 0; f <
nb_faces; f++){
2372 case IT_Tetraedron4:
2378 case IT_Pentaedron6:
2393 case IT_AntiWedgeLeft6:
2396 case IT_AntiWedgeRight6:
2411template <
int typeID>
void MeshRefinement::
2423 if (f ==
rp.face_mapping(
c,
fc) && (
rp.face_mapping_topo(
c,
fc))){
2431 ARCANE_ASSERT((subface.
backCell() != subface.
frontCell()), (
"back front cells error"));
2443void MeshRefinement::
2444_checkOwner(
const String& msg)
2447 info() <<
"----CheckOwner in " << msg;
2449 syncvariable.fill(-1);
2450 bool has_owner_changed =
false;
2453 syncvariable_copy.copy(syncvariable);
2454 syncvariable.synchronize();
2455 ItemVector desync_nodes(
m_mesh->nodeFamily());
2458 if (syncvariable[inode] == -1) {
2459 debug(
Trace::Highest) <<
"----- Inconsistent owner (ghost everywhere) for node with uid : "
2460 << inode->uniqueId().asInt64();
2461 desync_nodes.addItem(*inode);
2462 has_owner_changed =
true;
2464 if (inode->isOwn() && (syncvariable_copy[inode] != syncvariable[inode])) {
2466 << inode->uniqueId().asInt64();
2467 desync_nodes.addItem(*inode);
2468 has_owner_changed =
true;
2478 desync_node_uids[inode.index()] = inode->uniqueId().asInt64();
2484 for (
auto lid : desync_node_lids_gather) {
2485 if (lid == NULL_ITEM_LOCAL_ID)
2487 if (std::find(desync_nodes.viewAsArray().begin(), desync_nodes.viewAsArray().end(),lid) == desync_nodes.viewAsArray().end()){
2488 desync_nodes.add(lid);
2495 desync_node_owners[2*inode.index() ] = inode->uniqueId().asInt64();
2496 desync_node_owners[2*inode.index()+1] = inode->owner();
2502 std::map<Int64,Int32SharedArray> uid_owners_map;
2503 for (Integer node_index = 0; node_index+1 < desync_node_owners_gather.size();) {
2504 uid_owners_map[desync_node_owners_gather[node_index]].add((
Int32)desync_node_owners_gather[node_index+1]);
2505 desync_node_uids_gather.add(desync_node_owners_gather[node_index]);
2512 for (
auto owner : uid_owners_map[inode->uniqueId().asInt64()]) {
2513 if (owner < new_owner && owner != m_node_owner_memory[inode]) new_owner = owner;
2515 debug(
Trace::Highest) <<
"------ Change owner for node " << inode->uniqueId() <<
" from " << inode->owner() <<
" to " << new_owner;
2521 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.
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.