14#include "arcane/utils/CheckedConvert.h"
15#include "arcane/utils/PlatformUtils.h"
16#include "arcane/utils/Real2.h"
17#include "arcane/utils/MD5HashAlgorithm.h"
20#include "arcane/core/MeshKind.h"
21#include "arcane/core/Directory.h"
23#include "arcane/core/ITimeLoopMng.h"
24#include "arcane/core/ITimeLoopService.h"
25#include "arcane/core/ITimeLoop.h"
26#include "arcane/core/TimeLoopEntryPointInfo.h"
27#include "arcane/core/IMesh.h"
28#include "arcane/core/IItemFamily.h"
29#include "arcane/core/ItemPrinter.h"
30#include "arcane/core/IParallelMng.h"
32#include "arcane/core/IMesh.h"
33#include "arcane/core/IItemFamily.h"
34#include "arcane/core/IMeshModifier.h"
35#include "arcane/core/IMeshUtilities.h"
36#include "arcane/core/ServiceBuilder.h"
38#include "arcane/core/MeshStats.h"
39#include "arcane/core/IPostProcessorWriter.h"
40#include "arcane/core/IVariableMng.h"
41#include "arcane/core/SimpleSVGMeshExporter.h"
42#include "arcane/core/IGhostLayerMng.h"
44#include "arcane/cartesianmesh/ICartesianMesh.h"
45#include "arcane/cartesianmesh/CellDirectionMng.h"
46#include "arcane/cartesianmesh/FaceDirectionMng.h"
47#include "arcane/cartesianmesh/NodeDirectionMng.h"
48#include "arcane/cartesianmesh/CartesianConnectivity.h"
49#include "arcane/cartesianmesh/CartesianMeshRenumberingInfo.h"
50#include "arcane/cartesianmesh/ICartesianMeshPatch.h"
51#include "arcane/cartesianmesh/CartesianMeshUtils.h"
52#include "arcane/cartesianmesh/CartesianMeshCoarsening2.h"
53#include "arcane/cartesianmesh/CartesianMeshPatchListView.h"
55#include "arcane/tests/ArcaneTestGlobal.h"
56#include "arcane/tests/AMRCartesianMeshTester_axl.h"
57#include "arcane/tests/CartesianMeshTestUtils.h"
73:
public ArcaneAMRCartesianMeshTesterObject
86 void buildInit()
override;
87 void compute()
override;
100 Int32 m_nb_expected_patch = 0;
108 void _reduceNbGhostLayers();
110 void _computeCenters();
111 void _processPatches();
112 void _writePostProcessing();
113 void _checkUniqueIds();
114 void _testDirections();
115 void _checkDirections();
127AMRCartesianMeshTesterModule::
129: ArcaneAMRCartesianMeshTesterObject(
mbi)
142AMRCartesianMeshTesterModule::
143~AMRCartesianMeshTesterModule()
152void AMRCartesianMeshTesterModule::
180 clist.add(
"AMRCartesianMeshTester");
183 clist.add(
"ArcanePostProcessing");
184 clist.add(
"ArcaneCheckpoint");
185 clist.add(
"ArcaneLoadBalance");
195void AMRCartesianMeshTesterModule::
198 if (subDomain()->isContinue())
201 m_global_deltat.assign(1.0);
229void AMRCartesianMeshTesterModule::
232 info() <<
"AMR Init";
234 IMesh* mesh = defaultMesh();
259 m_utils =
makeRef(
new CartesianMeshTestUtils(m_cartesian_mesh,acceleratorMng()));
261 if (!subDomain()->isContinue()) {
264 _reduceNbGhostLayers();
272 const Integer dimension = defaultMesh()->dimension();
274 m_nb_expected_patch = 1 + options()->refinement2d().size();
275 else if (dimension==3)
276 m_nb_expected_patch = 1 + options()->refinement3d().size();
280 ++m_nb_expected_patch;
282 if (subDomain()->isContinue())
294 info() <<
"MaxUid for mesh=" << MeshUtils::getMaxItemUniqueIdCollective(m_cartesian_mesh->
mesh());
309 Cell prev =
cc.previous();
314 m_density[
icell] += 5.0;
326 m_density[
icell] += 5.0;
331 bool is_amr = m_nb_expected_patch!=1;
332 if (options()->verbosityLevel()==0)
333 m_utils->setNbPrint(5);
335 _writePostProcessing();
344void AMRCartesianMeshTesterModule::
362void AMRCartesianMeshTesterModule::
366 const bool is_verbose = options()->verbosityLevel()>=1;
368 const Int32 dimension = defaultMesh()->dimension();
373 else if (dimension == 3)
394 ARCANE_FATAL(
"Bad size ({0}, expected={1}) for option '{2}'",
404 ARCANE_FATAL(
"Bad size ({0}, expected={1}) for option '{2}'",
407 for( Integer i=0; i<
nb_patch; ++i ){
412 m_cell_patch_variables.add(
cellv);
415 (*cellv)[
icell] = 2.0;
432 info() <<
"GlobalUids Patch=" << i <<
" NB=" <<
nb_global_uid
436 ARCANE_FATAL(
"Bad number of cells for patch I={0} N={1} expected={2}",
440 info() <<
"GlobalUid Patch=" << i <<
" I=" <<
c <<
" cell_uid=" <<
global_cells_uid[
c];
446 pinfo() <<
"NbGhostCells my_rank=" << comm_rank <<
" local=" <<
local_nb_ghost_cell <<
" total=" << total;
448 ARCANE_FATAL(
"Bad number of ghost cells for patch I={0} N={1} expected={2}",
453 if (dimension==2 && options()->
dumpSvg()){
454 String filename = String::format(
"Patch{0}-{1}-{2}.svg",i,comm_rank,
comm_size);
455 Directory directory = subDomain()->exportDirectory();
456 String full_filename = directory.
file(filename);
467void AMRCartesianMeshTesterModule::
470 IMesh* mesh = defaultMesh();
481 m_cell_center[
icell] = center;
494 m_face_center[
iface] = center;
502void AMRCartesianMeshTesterModule::
510 info() <<
"Doint initial coarsening";
512 if (m_cartesian_mesh->
mesh()->meshKind().meshAMRKind() == eMeshAMRKind::PatchCartesianMeshOnly) {
513 debug() <<
"Coarse with specific coarser (for cartesian mesh only)";
528 info() <<
"Patch i=" << index <<
" nb_cell=" <<
p.cells().size();
536 Int32
dim = defaultMesh()->dimension();
554void AMRCartesianMeshTesterModule::
557 Int32
dim = defaultMesh()->dimension();
566 m_cartesian_mesh->
coarseZone2D(x->position(), x->length());
577 m_cartesian_mesh->
coarseZone3D(x->position(), x->length());
586void AMRCartesianMeshTesterModule::
587_reduceNbGhostLayers()
589 for (
auto& x : options()->reduceNbGhostLayers()) {
602void AMRCartesianMeshTesterModule::
635void AMRCartesianMeshTesterModule::
646 IMesh* mesh = defaultMesh();
649 m_old_density.copy(m_density);
652 info() <<
"Direction=" <<
idir <<
" cells=" <<
cdm.innerCells().name()
653 <<
" n=" <<
cdm.innerCells().size();
658 Cell prev =
cc.previous();
659 Real d = m_old_density[
icell] + m_old_density[next] + m_old_density[prev];
660 m_density[
icell] = d / 3.0;
669 Cell prev =
cc.previous();
670 Real d = m_old_density[
icell];
673 d += m_old_density[next];
677 d += m_old_density[prev];
680 m_density[
icell] = d / n;
690 for( Integer i=0; i<
nb_cell; ++i )
700void AMRCartesianMeshTesterModule::
717 Cell prev =
cc.previous();
718 Real d = m_density[
icell];
721 d += m_density[next];
725 d += m_density[prev];
728 m_density[
icell] = d / n;
736void AMRCartesianMeshTesterModule::
737_writePostProcessing()
739 info() <<
"Post-process AMR";
743 info() <<
"Creating output dir '" <<
output_directory.path() <<
"' for export";
745 times.
add(m_global_time());
754 variables.
add(v->variable());
757 groups.add(allCells());
759 groups.
add(
p.cells());
768void AMRCartesianMeshTesterModule::
794void AMRCartesianMeshTesterModule::
805 info() <<
"HASH_RESULT direction items of family=" <<
item_family->name()
806 <<
" v= " <<
cell_hash <<
" expected= " << expected_hash;
809 if (!expected_hash.empty() &&
cell_hash != expected_hash)
810 ARCANE_FATAL(
"Bad hash for uniqueId() for direction items of family '{0}' v= {1} expected='{2}'",
815 debug() <<
"Check cells direction hash";
821 debug() <<
"Check faces direction hash";
827 debug() <<
"Check nodes direction hash";
860 ARCANE_ASSERT((uid != -1), (
"Un uid dans le tableau est = -1"));
866 [](
const Int64* a,
const Int64*
b) {
915 Integer nb_items = mesh->
cellFamily()->allItems().own().size();
919 constexpr Integer
ipred = 0;
920 constexpr Integer
isucc = 1;
939 ARCANE_ASSERT((uid != -1), (
"Uid ne peut pas être égal à -1"));
964 Cell prev =
cc.previous();
976 Cell prev =
cc.previous();
1006 Integer nb_items = mesh->
faceFamily()->allItems().own().size();
1010 constexpr Integer
ipred = 0;
1011 constexpr Integer
isucc = 1;
1029 ARCANE_ASSERT((uid != -1), (
"Uid ne peut pas être égal à -1"));
1066 Cell next =
cc.nextCell();
1067 Cell prev =
cc.previousCell();
1102 Integer nb_items = mesh->
nodeFamily()->allItems().own().size();
1106 constexpr Integer
ipred = 0;
1107 constexpr Integer
isucc = 1;
1127 ARCANE_ASSERT((uid != -1), (
"Uid ne peut pas être égal à -1"));
1165 Node prev =
cc.previous();
1177void AMRCartesianMeshTesterModule::
1202void AMRCartesianMeshTesterModule::
1211 if ((
icell->level() == level) || (level == -1 &&
icell->nbHChildren() == 0)) {
1226ARCANE_REGISTER_MODULE_AMRCARTESIANMESHTESTER(AMRCartesianMeshTesterModule);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions utilitaires sur le maillage.
Ce fichier contient les différentes fabriques de services et macro pour enregistrer les services.
Module de test pour les infos sur les maillages cartésiens.
Integer _cellsUidAroundFaces(UniqueArray< Int64 > &own_cells_uid_around_faces)
Méthode permettant de récupérer un tableau contenant les mailles autour des faces.
Integer _cellsUidAroundCells(UniqueArray< Int64 > &own_cells_uid_around_cells)
Méthode permettant de récupérer un tableau contenant les mailles autour des mailles.
Integer _nodesUidAroundNodes(UniqueArray< Int64 > &own_nodes_uid_around_nodes)
Méthode permettant de récupérer un tableau contenant les noeuds autour des noeuds.
void _computeSubCellDensity(Cell cell)
Calcule la densité d'une maille AMR.
String _checkDirectionUniqueIdsHashCollective(ArrayView< Int64 > own_items_uid_around, Integer nb_items_around)
Méthode permettant de calculer un hash à partir d'un tableau d'items "autour".
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é.
Int32 nbHChildren() const
Nombre d'enfants pour l'AMR.
Cell hChild(Int32 i) const
i-ème enfant AMR
Maille avant et après une maille suivant une direction.
Infos sur maille avant et après une face suivant une direction.
Noeud avant et après un noeud suivant une direction.
Classe gérant un répertoire.
virtual String file(const String &file_name) const
Retourne le chemin complet du fichier file_name dans le répertoire.
Infos sur les face d'une direction spécifique X,Y ou Z d'un maillage structuré.
DirFace face(Face f) const
Face direction correspondant à la face f.
FaceGroup allFaces() const
Groupe de toutes les faces dans la direction.
Interface d'un patch AMR d'un maillage cartésien.
Interface d'un maillage cartésien.
static ICartesianMesh * getReference(const MeshHandleOrMesh &mesh, bool create=true)
Récupère ou créé la référence associée à mesh.
virtual CellDirectionMng cellDirection(eMeshDirection dir)=0
Liste des mailles dans la direction dir.
virtual void recreateFromDump()=0
Recalcule les informations de cartésiennes après une reprise.
virtual void renumberItemsUniqueId(const CartesianMeshRenumberingInfo &v)=0
Renumérote les uniqueId() des entités.
virtual IMesh * mesh() const =0
Maillage associé à ce maillage cartésien.
virtual ICartesianMeshPatch * patch(Int32 index) const =0
Retourne le index-ième patch du maillage.
virtual void refinePatch2D(Real2 position, Real2 length)=0
Raffine en 2D un bloc du maillage cartésien.
virtual void refinePatch3D(Real3 position, Real3 length)=0
Raffine en 3D un bloc du maillage cartésien.
virtual CartesianMeshPatchListView patches() const =0
Vue sur la liste des patchs.
virtual CartesianPatch amrPatch(Int32 index) const =0
Retourne le index-ième patch du maillage.
virtual void coarseZone3D(Real3 position, Real3 length)=0
Dé-raffine en 3D un bloc du maillage cartésien.
virtual void coarseZone2D(Real2 position, Real2 length)=0
Dé-raffine en 2D un bloc du maillage cartésien.
virtual void computeDirections()=0
Calcule les infos pour les accès par direction.
virtual Int32 nbPatch() const =0
Nombre de patchs du maillage.
virtual Integer reduceNbGhostLayers(Integer level, Integer target_nb_ghost_layers)=0
Méthode permettant de supprimer une ou plusieurs couches de mailles fantômes sur un niveau de raffine...
Interface d'une famille d'entités.
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual CellGroup ownCells()=0
Groupe de toutes les mailles propres au domaine.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
virtual NodeGroup allNodes()=0
Groupe de tous les noeuds.
virtual CellGroup allCells()=0
Groupe de toutes les mailles.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
virtual VariableNodeReal3 & nodesCoordinates()=0
Coordonnées des noeuds.
virtual IGhostLayerMng * ghostLayerMng() const =0
Gestionnare de couche fantômes associé
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.
Interface d'un écrivain pour les informations de post-traitement.
Interface du gestionnaire d'un sous-domaine.
Interface du gestionnaire de la boucle en temps.
Interface d'une boucle en temps.
static const char * WBuild
appelé lors de la lecture du jeu de données
static const char * WComputeLoop
appelé pendant la boucle de calcul
static const char * WInit
appelé pendant l'initialisation, l'initialisation d'une reprise ou d'un nouveau cas
Interface du gestionnaire de variables.
Classe utilitaire pour imprimer les infos sur une entité.
Int32 nbNode() const
Nombre de noeuds de l'entité
Classe de base d'un élément de maillage.
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
constexpr bool null() const
true si l'entité est nul (i.e. non connecté au maillage)
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Calcule la fonction de hashage MD5 d'un tableau.
Informations pour construire un module.
Infos sur les noeuds d'une direction spécifique X,Y ou Z d'un maillage structuré.
Cell cell(Int32 i) const
i-ème maille du noeud
Int32 nbCell() const
Nombre de mailles connectées au noeud.
Classe gérant un vecteur de réel de dimension 3.
Exportation d'un maillage au format SVG.
Infos d'un point d'entrée d'une boucle en temps.
Paramètres nécessaires à la construction d'une variable.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Chaîne de caractères unicode.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Vecteur 1D de données avec sémantique par valeur (style STL).
MeshVariableScalarRefT< Cell, Real > VariableCellReal
Grandeur au centre des mailles de type réel.
ARCANE_CARTESIANMESH_EXPORT Ref< CartesianMeshCoarsening2 > createCartesianMeshCoarsening2(ICartesianMesh *cm)
Créé une instance pour gérer le déraffinement du maillage (V2).
ARCANE_CARTESIANMESH_EXPORT Ref< ICartesianMeshAMRPatchMng > cartesianMeshAMRPatchMng(ICartesianMesh *cm)
Créé une instance pour gérer le déraffinement du maillage (V3?).
String toHexaString(ByteConstArrayView input)
Converti un tableau d'octet en sa représentation hexadécimale.
void add(ArrayView< T > lhs, ConstArrayView< T > copy_array)
Ajoute le tableau copy_array dans l'instance.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
Real y
deuxième composante du triplet
Real z
troisième composante du triplet
Real x
première composante du triplet