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();
126AMRCartesianMeshTesterModule::
128: ArcaneAMRCartesianMeshTesterObject(
mbi)
141AMRCartesianMeshTesterModule::
142~AMRCartesianMeshTesterModule()
151void AMRCartesianMeshTesterModule::
179 clist.add(
"AMRCartesianMeshTester");
182 clist.add(
"ArcanePostProcessing");
183 clist.add(
"ArcaneCheckpoint");
184 clist.add(
"ArcaneLoadBalance");
194void AMRCartesianMeshTesterModule::
197 if (subDomain()->isContinue())
200 m_global_deltat.assign(1.0);
228void AMRCartesianMeshTesterModule::
231 info() <<
"AMR Init";
233 IMesh* mesh = defaultMesh();
258 m_utils =
makeRef(
new CartesianMeshTestUtils(m_cartesian_mesh,acceleratorMng()));
260 if (!subDomain()->isContinue()) {
263 _reduceNbGhostLayers();
271 const Integer dimension = defaultMesh()->dimension();
273 m_nb_expected_patch = 1 + options()->refinement2d().size();
274 else if (dimension==3)
275 m_nb_expected_patch = 1 + options()->refinement3d().size();
279 ++m_nb_expected_patch;
281 if (subDomain()->isContinue())
293 info() <<
"MaxUid for mesh=" << MeshUtils::getMaxItemUniqueIdCollective(m_cartesian_mesh->
mesh());
308 Cell prev =
cc.previous();
313 m_density[
icell] += 5.0;
325 m_density[
icell] += 5.0;
330 bool is_amr = m_nb_expected_patch!=1;
331 if (options()->verbosityLevel()==0)
332 m_utils->setNbPrint(5);
334 _writePostProcessing();
342void AMRCartesianMeshTesterModule::
360void AMRCartesianMeshTesterModule::
364 const bool is_verbose = options()->verbosityLevel()>=1;
366 const Int32 dimension = defaultMesh()->dimension();
371 else if (dimension == 3)
392 ARCANE_FATAL(
"Bad size ({0}, expected={1}) for option '{2}'",
402 ARCANE_FATAL(
"Bad size ({0}, expected={1}) for option '{2}'",
405 for( Integer i=0; i<
nb_patch; ++i ){
410 m_cell_patch_variables.add(
cellv);
413 (*cellv)[
icell] = 2.0;
430 info() <<
"GlobalUids Patch=" << i <<
" NB=" <<
nb_global_uid
434 ARCANE_FATAL(
"Bad number of cells for patch I={0} N={1} expected={2}",
438 info() <<
"GlobalUid Patch=" << i <<
" I=" <<
c <<
" cell_uid=" <<
global_cells_uid[
c];
444 pinfo() <<
"NbGhostCells my_rank=" << comm_rank <<
" local=" <<
local_nb_ghost_cell <<
" total=" << total;
446 ARCANE_FATAL(
"Bad number of ghost cells for patch I={0} N={1} expected={2}",
451 if (dimension==2 && options()->
dumpSvg()){
452 String filename = String::format(
"Patch{0}-{1}-{2}.svg",i,comm_rank,
comm_size);
453 Directory directory = subDomain()->exportDirectory();
454 String full_filename = directory.
file(filename);
465void AMRCartesianMeshTesterModule::
468 IMesh* mesh = defaultMesh();
479 m_cell_center[
icell] = center;
492 m_face_center[
iface] = center;
500void AMRCartesianMeshTesterModule::
508 info() <<
"Doint initial coarsening";
510 if (m_cartesian_mesh->
mesh()->meshKind().meshAMRKind() == eMeshAMRKind::PatchCartesianMeshOnly) {
511 debug() <<
"Coarse with specific coarser (for cartesian mesh only)";
526 info() <<
"Patch i=" << index <<
" nb_cell=" <<
p.cells().size();
534 Int32
dim = defaultMesh()->dimension();
552void AMRCartesianMeshTesterModule::
555 Int32
dim = defaultMesh()->dimension();
564 m_cartesian_mesh->
coarseZone2D(x->position(), x->length());
575 m_cartesian_mesh->
coarseZone3D(x->position(), x->length());
584void AMRCartesianMeshTesterModule::
585_reduceNbGhostLayers()
587 for (
auto& x : options()->reduceNbGhostLayers()) {
600void AMRCartesianMeshTesterModule::
633void AMRCartesianMeshTesterModule::
644 IMesh* mesh = defaultMesh();
647 m_old_density.copy(m_density);
650 info() <<
"Direction=" <<
idir <<
" cells=" <<
cdm.innerCells().name()
651 <<
" n=" <<
cdm.innerCells().size();
656 Cell prev =
cc.previous();
657 Real d = m_old_density[
icell] + m_old_density[next] + m_old_density[prev];
658 m_density[
icell] = d / 3.0;
667 Cell prev =
cc.previous();
668 Real d = m_old_density[
icell];
671 d += m_old_density[next];
675 d += m_old_density[prev];
678 m_density[
icell] = d / n;
688 for( Integer i=0; i<
nb_cell; ++i )
698void AMRCartesianMeshTesterModule::
715 Cell prev =
cc.previous();
716 Real d = m_density[
icell];
719 d += m_density[next];
723 d += m_density[prev];
726 m_density[
icell] = d / n;
734void AMRCartesianMeshTesterModule::
735_writePostProcessing()
737 info() <<
"Post-process AMR";
741 info() <<
"Creating output dir '" <<
output_directory.path() <<
"' for export";
743 times.
add(m_global_time());
752 variables.
add(v->variable());
755 groups.add(allCells());
757 groups.
add(
p.cells());
766void AMRCartesianMeshTesterModule::
792void AMRCartesianMeshTesterModule::
803 info() <<
"HASH_RESULT direction items of family=" <<
item_family->name()
804 <<
" v= " <<
cell_hash <<
" expected= " << expected_hash;
807 if (!expected_hash.empty() &&
cell_hash != expected_hash)
808 ARCANE_FATAL(
"Bad hash for uniqueId() for direction items of family '{0}' v= {1} expected='{2}'",
813 debug() <<
"Check cells direction hash";
819 debug() <<
"Check faces direction hash";
825 debug() <<
"Check nodes direction hash";
858 ARCANE_ASSERT((uid != -1), (
"Un uid dans le tableau est = -1"));
864 [](
const Int64* a,
const Int64*
b) {
913 Integer nb_items = mesh->
cellFamily()->allItems().own().size();
917 constexpr Integer
ipred = 0;
918 constexpr Integer
isucc = 1;
937 ARCANE_ASSERT((uid != -1), (
"Uid ne peut pas être égal à -1"));
962 Cell prev =
cc.previous();
974 Cell prev =
cc.previous();
1004 Integer nb_items = mesh->
faceFamily()->allItems().own().size();
1008 constexpr Integer
ipred = 0;
1009 constexpr Integer
isucc = 1;
1027 ARCANE_ASSERT((uid != -1), (
"Uid ne peut pas être égal à -1"));
1064 Cell next =
cc.nextCell();
1065 Cell prev =
cc.previousCell();
1100 Integer nb_items = mesh->
nodeFamily()->allItems().own().size();
1104 constexpr Integer
ipred = 0;
1105 constexpr Integer
isucc = 1;
1125 ARCANE_ASSERT((uid != -1), (
"Uid ne peut pas être égal à -1"));
1163 Node prev =
cc.previous();
1175void AMRCartesianMeshTesterModule::
1184 if ((
icell->level() == level) || (level == -1 &&
icell->nbHChildren() == 0)) {
1199ARCANE_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 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 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