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"
43#include "arcane/cartesianmesh/ICartesianMesh.h"
44#include "arcane/cartesianmesh/CellDirectionMng.h"
45#include "arcane/cartesianmesh/FaceDirectionMng.h"
46#include "arcane/cartesianmesh/NodeDirectionMng.h"
47#include "arcane/cartesianmesh/CartesianConnectivity.h"
48#include "arcane/cartesianmesh/CartesianMeshRenumberingInfo.h"
49#include "arcane/cartesianmesh/ICartesianMeshPatch.h"
50#include "arcane/cartesianmesh/CartesianMeshUtils.h"
51#include "arcane/cartesianmesh/CartesianMeshCoarsening2.h"
52#include "arcane/cartesianmesh/CartesianMeshPatchListView.h"
54#include "arcane/tests/ArcaneTestGlobal.h"
55#include "arcane/tests/AMRCartesianMeshTester_axl.h"
56#include "arcane/tests/CartesianMeshTestUtils.h"
72:
public ArcaneAMRCartesianMeshTesterObject
85 void buildInit()
override;
86 void compute()
override;
99 Int32 m_nb_expected_patch = 0;
107 void _reduceNbGhostLayers();
109 void _computeCenters();
110 void _processPatches();
111 void _writePostProcessing();
112 void _checkUniqueIds();
113 void _testDirections();
120AMRCartesianMeshTesterModule::
122: ArcaneAMRCartesianMeshTesterObject(
mbi)
135AMRCartesianMeshTesterModule::
136~AMRCartesianMeshTesterModule()
145void AMRCartesianMeshTesterModule::
173 clist.add(
"AMRCartesianMeshTester");
176 clist.add(
"ArcanePostProcessing");
177 clist.add(
"ArcaneCheckpoint");
178 clist.add(
"ArcaneLoadBalance");
188void AMRCartesianMeshTesterModule::
191 if (subDomain()->isContinue())
194 m_global_deltat.assign(1.0);
222void AMRCartesianMeshTesterModule::
225 info() <<
"AMR Init";
227 IMesh* mesh = defaultMesh();
252 m_utils =
makeRef(
new CartesianMeshTestUtils(m_cartesian_mesh,acceleratorMng()));
254 if (!subDomain()->isContinue()) {
257 _reduceNbGhostLayers();
265 const Integer dimension = defaultMesh()->dimension();
267 m_nb_expected_patch = 1 + options()->refinement2d().size();
268 else if (dimension==3)
269 m_nb_expected_patch = 1 + options()->refinement3d().size();
273 ++m_nb_expected_patch;
275 if (subDomain()->isContinue())
287 info() <<
"MaxUid for mesh=" << MeshUtils::getMaxItemUniqueIdCollective(m_cartesian_mesh->
mesh());
302 Cell prev =
cc.previous();
307 m_density[
icell] += 5.0;
319 m_density[
icell] += 5.0;
324 bool is_amr = m_nb_expected_patch!=1;
325 if (options()->verbosityLevel()==0)
326 m_utils->setNbPrint(5);
328 _writePostProcessing();
335void AMRCartesianMeshTesterModule::
353void AMRCartesianMeshTesterModule::
357 const bool is_verbose = options()->verbosityLevel()>=1;
359 const Int32 dimension = defaultMesh()->dimension();
364 else if (dimension == 3)
385 ARCANE_FATAL(
"Bad size ({0}, expected={1}) for option '{2}'",
395 ARCANE_FATAL(
"Bad size ({0}, expected={1}) for option '{2}'",
398 for( Integer i=0; i<
nb_patch; ++i ){
403 m_cell_patch_variables.add(
cellv);
406 (*cellv)[
icell] = 2.0;
423 info() <<
"GlobalUids Patch=" << i <<
" NB=" <<
nb_global_uid
427 ARCANE_FATAL(
"Bad number of cells for patch I={0} N={1} expected={2}",
431 info() <<
"GlobalUid Patch=" << i <<
" I=" <<
c <<
" cell_uid=" <<
global_cells_uid[
c];
437 pinfo() <<
"NbGhostCells my_rank=" << comm_rank <<
" local=" <<
local_nb_ghost_cell <<
" total=" << total;
439 ARCANE_FATAL(
"Bad number of ghost cells for patch I={0} N={1} expected={2}",
444 if (dimension==2 && options()->
dumpSvg()){
445 String filename = String::format(
"Patch{0}-{1}-{2}.svg",i,comm_rank,
comm_size);
446 Directory directory = subDomain()->exportDirectory();
447 String full_filename = directory.
file(filename);
458void AMRCartesianMeshTesterModule::
461 IMesh* mesh = defaultMesh();
472 m_cell_center[
icell] = center;
485 m_face_center[
iface] = center;
493void AMRCartesianMeshTesterModule::
501 info() <<
"Doint initial coarsening";
503 if (m_cartesian_mesh->
mesh()->meshKind().meshAMRKind() == eMeshAMRKind::PatchCartesianMeshOnly) {
504 debug() <<
"Coarse with specific coarser (for cartesian mesh only)";
519 info() <<
"Patch i=" << index <<
" nb_cell=" <<
p.cells().size();
527 Int32
dim = defaultMesh()->dimension();
545void AMRCartesianMeshTesterModule::
548 Int32
dim = defaultMesh()->dimension();
557 m_cartesian_mesh->
coarseZone2D(x->position(), x->length());
568 m_cartesian_mesh->
coarseZone3D(x->position(), x->length());
577void AMRCartesianMeshTesterModule::
578_reduceNbGhostLayers()
580 for (
auto& x : options()->reduceNbGhostLayers()) {
593void AMRCartesianMeshTesterModule::
626void AMRCartesianMeshTesterModule::
637 IMesh* mesh = defaultMesh();
640 m_old_density.copy(m_density);
643 info() <<
"Direction=" <<
idir <<
" cells=" <<
cdm.innerCells().name()
644 <<
" n=" <<
cdm.innerCells().size();
649 Cell prev =
cc.previous();
650 Real d = m_old_density[
icell] + m_old_density[next] + m_old_density[prev];
651 m_density[
icell] = d / 3.0;
660 Cell prev =
cc.previous();
661 Real d = m_old_density[
icell];
664 d += m_old_density[next];
668 d += m_old_density[prev];
671 m_density[
icell] = d / n;
681 for( Integer i=0; i<
nb_cell; ++i )
691void AMRCartesianMeshTesterModule::
708 Cell prev =
cc.previous();
709 Real d = m_density[
icell];
712 d += m_density[next];
716 d += m_density[prev];
719 m_density[
icell] = d / n;
727void AMRCartesianMeshTesterModule::
728_writePostProcessing()
730 info() <<
"Post-process AMR";
734 info() <<
"Creating output dir '" <<
output_directory.path() <<
"' for export";
736 times.
add(m_global_time());
745 variables.
add(v->variable());
748 groups.add(allCells());
750 groups.
add(
p.cells());
759void AMRCartesianMeshTesterModule::
788void AMRCartesianMeshTesterModule::
797 if ((
icell->level() == level) || (level == -1 &&
icell->nbHChildren() == 0)) {
812ARCANE_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.
void _computeSubCellDensity(Cell cell)
Calcule la densité d'une maille AMR.
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.
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.
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.
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é
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?).
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