14#include "arcane/utils/CheckedConvert.h"
15#include "arcane/utils/PlatformUtils.h"
16#include "arcane/utils/StringBuilder.h"
21#include "arcane/core/ITimeLoopMng.h"
22#include "arcane/core/ITimeLoopService.h"
23#include "arcane/core/ITimeLoop.h"
24#include "arcane/core/TimeLoopEntryPointInfo.h"
25#include "arcane/core/IMesh.h"
26#include "arcane/core/IItemFamily.h"
27#include "arcane/core/ItemPrinter.h"
28#include "arcane/core/IParallelMng.h"
29#include "arcane/core/IMeshWriter.h"
30#include "arcane/core/MeshKind.h"
32#include "arcane/core/ICaseDocument.h"
33#include "arcane/core/IInitialPartitioner.h"
34#include "arcane/core/IMesh.h"
35#include "arcane/core/IItemFamily.h"
36#include "arcane/core/IMeshModifier.h"
37#include "arcane/core/IMeshUtilities.h"
38#include "arcane/core/ServiceBuilder.h"
40#include "arcane/core/IMeshPartitionerBase.h"
41#include "arcane/core/BasicService.h"
42#include "arcane/core/MeshReaderMng.h"
43#include "arcane/core/IGridMeshPartitioner.h"
44#include "arcane/core/ICartesianMeshGenerationInfo.h"
45#include "arcane/core/AbstractItemOperationByBasicType.h"
47#include "arcane/core/Connectivity.h"
49#include "arcane/cartesianmesh/CartesianMeshCoarsening.h"
50#include "arcane/cartesianmesh/CartesianMeshCoarsening2.h"
52#include "arcane/cartesianmesh/CartesianMeshUtils.h"
53#include "arcane/cartesianmesh/ICartesianMesh.h"
54#include "arcane/cartesianmesh/CellDirectionMng.h"
55#include "arcane/cartesianmesh/NodeDirectionMng.h"
56#include "arcane/cartesianmesh/CartesianConnectivity.h"
58#include "arcane/cartesianmesh/ICartesianMeshPatch.h"
60#include "arcane/tests/ArcaneTestGlobal.h"
61#include "arcane/tests/CartesianMeshTester_axl.h"
62#include "arcane/tests/CartesianMeshTestUtils.h"
63#include "arcane/tests/CartesianMeshV2TestUtils.h"
79:
public ArcaneCartesianMeshTesterObject
106 void buildInit()
override;
107 void compute()
override;
108 void init()
override;
128 void _testXmlInfos();
130 void _printCartesianMeshInfos();
131 void _checkFaceUniqueIdsAreContiguous();
133 void _testCoarsening();
134 void _checkSpecificApplyOperator();
155 IMesh* mesh = this->mesh();
164 info() <<
"Partitioning with 'CartesianMeshPartitionerService' nb_rank=" << nb_rank;
173 mesh->
utilities()->changeOwnersFromCells();
197 void build()
override {}
200 for(
IMesh* mesh : meshes ){
201 info() <<
"Partitioning mesh name=" << mesh->name();
206 void _doPartition(
IMesh* mesh)
214 mesh->
utilities()->partitionAndExchangeMeshWithReplication(mesh_partitioner.get(),
true);
227CartesianMeshTesterModule::
229: ArcaneCartesianMeshTesterObject(
mbi)
237, m_initial_partitioner(
nullptr)
240 if (!platform::getEnvironmentVariable(
"TEST_PARTITIONING").null()){
243 info() <<
"SETTING INITIAL PARTITIONER";
246 sd->setInitialPartitioner(m_initial_partitioner);
253CartesianMeshTesterModule::
254~CartesianMeshTesterModule()
261void CartesianMeshTesterModule::
289 clist.add(
"CartesianMeshTester");
292 clist.add(
"ArcanePostProcessing");
293 clist.add(
"ArcaneCheckpoint");
303void CartesianMeshTesterModule::
306 bool has_edge = options()->hasEdges();
307 info() <<
"Adding edge connectivity?=" <<
has_edge;
310 c.enableConnectivity(Connectivity::CT_HasEdge);
313 m_global_deltat.assign(1.0);
334void CartesianMeshTesterModule::
337 IMesh* mesh = defaultMesh();
370 m_cell_center[
icell] = center;
383 m_face_center[
iface] = center;
390 m_utils =
makeRef(
new CartesianMeshTestUtils(m_cartesian_mesh,acceleratorMng()));
391 m_utils_v2 =
makeRef(
new CartesianMeshV2TestUtils(m_cartesian_mesh));
406 Cell prev =
cc.previous();
411 m_density[
icell] += 5.0;
423 m_density[
icell] += 5.0;
429 m_utils->testAll(
false);
430 m_utils_v2->testAll();
431 _checkFaceUniqueIdsAreContiguous();
434 _printCartesianMeshInfos();
435 _checkSpecificApplyOperator();
441void CartesianMeshTesterModule::
449 info() <<
"Test CartesianCoarsening V1";
457 info() <<
"Test1: CoarseCell= " <<
ItemPrinter(cell);
467 info() <<
"Test CartesianCoarsening V2";
475 info() <<
"Test2: CoarseCell= " <<
ItemPrinter(cell);
484 info() <<
"Patch i=" << i <<
" nb_cell=" <<
p->cells().size();
501void CartesianMeshTesterModule::
504 if (m_global_iteration()==1)
513void CartesianMeshTesterModule::
526 m_old_density.copy(m_density);
532 Cell prev =
cc.previous();
533 Real d = m_old_density[
icell] + m_old_density[next] + m_old_density[prev];
534 m_density[
icell] = d / 3.0;
541 Cell prev =
cc.previous();
542 Real d = m_old_density[
icell];
545 d += m_old_density[next];
549 d += m_old_density[prev];
552 m_density[
icell] = d / n;
557 Int64
to_add = m_global_iteration();
559 Int64 uid =
iface->uniqueId();
562 m_faces_uid.synchronize();
576void CartesianMeshTesterModule::
593 Cell prev =
cc.previous();
594 Real d = m_density[
icell];
597 d += m_density[next];
601 d += m_density[prev];
604 m_density[
icell] = d / n;
632void CartesianMeshTesterModule::
633_checkFaceUniqueIdsAreContiguous()
637 info() <<
"Test " << A_FUNCINFO;
646 ARCANE_FATAL(
"FaceUniqueId is too big: uid={0} total_nb_face={1}",
654void CartesianMeshTesterModule::
657 info() <<
"PRINT Xml infos for <cartesian> mesh generator";
665 info() <<
"No element <meshgenerator> found";
670 info() <<
"No element <cartesian> found";
703 info() <<
"UnstructuredMeshFileName=" <<
file_name;
728 Real min_value = -max_value;
770void CartesianMeshTesterModule::
776 ARCANE_FATAL(
"Bad value X expected={0} value={1} message={2}",a.x,
b.x,message);
778 ARCANE_FATAL(
"Bad value Y expected={0} value={1} message={2}",a.y,
b.y,message);
780 ARCANE_FATAL(
"Bad value Z expected={0} value={1} message={2}",a.z,
b.z,message);
786void CartesianMeshTesterModule::
787_printCartesianMeshInfos()
789 auto*
cartesian_info = ICartesianMeshGenerationInfo::getReference(defaultMesh(),
false);
793 info() <<
"Test: _printCartesianMeshInfos()";
806void CartesianMeshTesterModule::
807_checkSpecificApplyOperator()
815 info() <<
"MeshStructure=" <<
mk;
816 if (
mk != eMeshStructure::Cartesian)
817 ARCANE_FATAL(
"Invalid mesh structure v={0} (expected 'Cartesian')",
mk);
831ARCANE_REGISTER_MODULE_CARTESIANMESHTESTER(CartesianMeshTesterModule);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions mathématiques diverses.
Fonctions utilitaires sur le maillage.
Ce fichier contient les différentes fabriques de services et macro pour enregistrer les services.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
void notifyEndPartition() override
Notification lors de la fin d'un repartionnement (après échange des entités)
void build() override
Construction de niveau build du service.
void partitionMesh(bool initial_partition) override
IPrimaryMesh * primaryMesh() override
Maillage associé
Module de test pour les infos sur les maillages cartésiens.
void _testGridPartitioning()
void _sample(ICartesianMesh *cartesian_mesh)
Opérateur abstrait sur des entités rangées par type.
Classe de base de service lié à un sous-domaine.
Informations de connectivité 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.
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.
Informations sur le type flottant.
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 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 Ref< CartesianMeshCoarsening > createCartesianMeshCoarsening()=0
Créé une instance pour gérer le déraffinement du maillage.
virtual void computeDirections()=0
Calcule les infos pour les accès par direction.
virtual Int32 nbPatch() const =0
Nombre de patchs du maillage.
Interface d'une classe gérant un document XML du jeu de données.
Interface d'un partitionneur de maillage sur une grille.
virtual void setBoundingBox(Real3 min_val, Real3 max_val)=0
Positionne la bounding box de notre sous-domaine.
virtual void applyMeshPartitioning(IMesh *mesh)=0
Applique le repartitionnement sur le maillage mesh.
virtual void setPartIndex(Int32 i, Int32 j, Int32 k)=0
Indice (i,j,k) de la partie.
Interface d'un partitionneur initial.
Interface d'une famille d'entités.
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 * cellFamily()=0
Retourne la famille des mailles.
Interface d'un partitionneur de maillage.
virtual VariableNodeReal3 & nodesCoordinates()=0
Coordonnées des noeuds.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
virtual IMeshModifier * modifier()=0
Interface de modification associée.
virtual IMeshUtilities * utilities()=0
Interface des fonctions utilitaires associée.
virtual const MeshKind meshKind() const =0
Caractéristiques du maillage.
virtual IPrimaryMesh * toPrimaryMesh()=0
Retourne l'instance sous la forme d'un IPrimaryMesh.
virtual bool isDynamic() const =0
Indique si le maillage est dynamique (peut évoluer)
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
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
Groupe d'entités de maillage.
Classe utilitaire pour imprimer les infos sur une entité.
Vue sur un vecteur d'entités.
Int32 size() const
Nombre d'éléments du vecteur.
NodeConnectedListViewType nodes() const
Liste des noeuds de l'entité
Int32 nbNode() const
Nombre de noeuds de l'entité
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.
Gestionnaire de lecteurs de maillage.
Informations pour construire un module.
Classe gérant un vecteur de réel de dimension 3.
Structure contenant les informations pour créer un service.
Propriétés de création d'un service.
Infos d'un point d'entrée d'une boucle en temps.
Paramètres nécessaires à la construction d'une variable.
Liste de noeuds d'un arbre DOM.
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
Classe d'accès aux traces.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
T max(const T &a, const T &b, const T &c)
Retourne le maximum de trois éléments.
ARCCORE_HOST_DEVICE Real2 min(Real2 a, Real2 b)
Retourne le minimum de deux Real2.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
ARCANE_CARTESIANMESH_EXPORT Ref< CartesianMeshCoarsening2 > createCartesianMeshCoarsening2(ICartesianMesh *cm)
Créé une instance pour gérer le déraffinement du maillage (V2).
Int32 toInt32(Int64 v)
Converti un Int64 en un Int32.
constexpr ARCCORE_HOST_DEVICE bool isNearlyEqual(const _Type &a, const _Type &b)
Teste si deux valeurs sont à un peu près égales. Pour les types entiers, cette fonction est équivalen...
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ SB_Collective
Indique que tous les processus font la même opération.
eMeshStructure
Structure du maillage.
@ ST_SubDomain
Le service s'utilise au niveau du sous-domaine.
Int32 Integer
Type représentant un entier.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.