14#include "arcane/tests/CartesianMeshTestUtils.h"
16#include "arcane/utils/CheckedConvert.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/Real2.h"
19#include "arcane/utils/ValueChecker.h"
23#include "arcane/core/IMesh.h"
24#include "arcane/core/IItemFamily.h"
25#include "arcane/core/ItemPrinter.h"
26#include "arcane/core/IParallelMng.h"
27#include "arcane/core/IMeshModifier.h"
28#include "arcane/core/IMeshUtilities.h"
29#include "arcane/core/SimpleSVGMeshExporter.h"
30#include "arcane/core/UnstructuredMeshConnectivity.h"
32#if defined(ARCANE_HAS_ACCELERATOR_API)
33#include "arcane/accelerator/Runner.h"
37#include "arcane/accelerator/core/IAcceleratorMng.h"
39#include "arcane/cartesianmesh/ICartesianMesh.h"
40#include "arcane/cartesianmesh/CellDirectionMng.h"
41#include "arcane/cartesianmesh/FaceDirectionMng.h"
42#include "arcane/cartesianmesh/NodeDirectionMng.h"
43#include "arcane/cartesianmesh/CartesianConnectivity.h"
57CartesianMeshTestUtils::
62, m_accelerator_mng(
am)
72CartesianMeshTestUtils::
73~CartesianMeshTestUtils()
80void CartesianMeshTestUtils::
85 _testDirCellAccelerator();
87 _testDirFaceAccelerator();
89 _testDirNodeAccelerator();
91 _testDirCellNodeAccelerator();
93 _testDirCellFaceAccelerator();
94 if (m_mesh->dimension() == 3) {
95 _testNodeToCellConnectivity3D();
96 _testNodeToCellConnectivity3DAccelerator();
97 _testCellToNodeConnectivity3D();
98 _testCellToNodeConnectivity3DAccelerator();
101 _testNodeToCellConnectivity2D();
102 _testCellToNodeConnectivity2D();
105 _testConnectivityByDirection();
111void CartesianMeshTestUtils::
114 IMesh* mesh = m_mesh;
125 m_cell_center[
icell] = center;
138 m_face_center[
iface] = center;
146void CartesianMeshTestUtils::
149 if (item != local_id)
150 ARCANE_FATAL(
"Bad FaceLocalId item={0} local_id={1}", item, local_id);
153void CartesianMeshTestUtils::
156 if (item != local_id)
157 ARCANE_FATAL(
"Bad CellLocalId item={0} local_id={1}", item, local_id);
160void CartesianMeshTestUtils::
163 if (item.localId() != local_id)
164 ARCANE_FATAL(
"Bad NodeLocalId item={0} local_id={1}", item, local_id);
170void CartesianMeshTestUtils::
171_checkItemGroupIsSorted(
const ItemGroup& group)
180void CartesianMeshTestUtils::
183 info() <<
"TEST_DIR_CELL";
185 IMesh* mesh = m_mesh;
192 cdm2 = m_cartesian_mesh->cellDirection(
idir);
196 info() <<
"DIRECTION=" <<
idir <<
" Cells=" <<
cdm.allCells().name();
197 _checkItemGroupIsSorted(
cdm.allCells());
237void CartesianMeshTestUtils::
238_testDirCellAccelerator()
240#if defined(ARCANE_HAS_ACCELERATOR_API)
241 info() <<
"TEST_DIR_CELL_ACCELERATOR";
243 IMesh* mesh = m_mesh;
248 auto queue = m_accelerator_mng->defaultQueue();
257 cdm2 = m_cartesian_mesh->cellDirection(
idir);
259 info() <<
"ACCELERATOR_DIRECTION=" <<
idir <<
" Cells=" <<
cdm.allCells().name();
260 _checkItemGroupIsSorted(
cdm.allCells());
307void CartesianMeshTestUtils::
310 IMesh* mesh = m_mesh;
319void CartesianMeshTestUtils::
320_testDirFaceAccelerator()
322 IMesh* mesh = m_mesh;
325 _testDirFaceAccelerator(
idir);
331void CartesianMeshTestUtils::
332_testDirFace(
int idir)
349 _checkItemGroupIsSorted(fdm.allFaces());
370 info() <<
"Bad ordering for face";
375 info() <<
"Face uid=" <<
ItemPrinter(face) <<
" dir=" <<
md <<
" xyz=" << m_face_center[
iface]
383 info() <<
"Bad ordering for face";
388 info() <<
"Face uid=" <<
ItemPrinter(face) <<
" dir=" <<
md <<
" xyz=" << m_face_center[
iface]
394 info() <<
"Bad ordering for face";
399 info() <<
"Face uid=" <<
ItemPrinter(face) <<
" dir=" <<
md <<
" xyz=" << m_face_center[
iface]
411void CartesianMeshTestUtils::
412_testDirFaceAccelerator(
int idir)
414#if defined(ARCANE_HAS_ACCELERATOR_API)
427 auto queue = m_accelerator_mng->defaultQueue();
493void CartesianMeshTestUtils::
496 info() <<
"TEST_DIR_NODE";
497 m_node_density.fill(0.0);
499 IMesh* mesh = m_mesh;
513 info() <<
"DIRECTION=" <<
idir;
518 m_node_density[
inode] += 1.0;
544 for (Integer
k = 0;
k < 8; ++
k) {
556 info() <<
"DirNode direct "
558 <<
" " <<
dir_node.nextRightCellId()
559 <<
" " <<
dir_node.previousRightCellId()
560 <<
" " <<
dir_node.previousLeftCellId()
561 <<
" " <<
dir_node.topNextLeftCellId()
562 <<
" " <<
dir_node.topNextRightCellId()
563 <<
" " <<
dir_node.topPreviousRightCellId()
564 <<
" " <<
dir_node.topPreviousLeftCellId();
565 info() <<
"DirNode direct "
582 info() <<
"Bad ordering for node";
595 info() <<
"Bad ordering for node";
606 info() <<
"Bad ordering for node";
626 if (m_node_density[
inode] == 0.0) {
628 info() <<
"Bad value for node " <<
ItemPrinter(node);
638void CartesianMeshTestUtils::
639_testDirNodeAccelerator()
641#if defined(ARCANE_HAS_ACCELERATOR_API)
642 info() <<
"TEST_DIR_NODE Accelerator";
643 m_node_density.fill(0.0);
645 IMesh* mesh = m_mesh;
665 info() <<
"DIRECTION=" <<
idir;
669 auto queue = m_accelerator_mng->defaultQueue();
706 for (Integer
k = 0;
k < 8; ++
k) {
767void CartesianMeshTestUtils::
770 IMesh* mesh = m_mesh;
778 info() <<
"DIRECTION=" <<
idir;
785 if (
cn.cellId() !=
cn2.cellId())
809void CartesianMeshTestUtils::
810_testDirCellNodeAccelerator()
812#if defined(ARCANE_HAS_ACCELERATOR_API)
813 IMesh* mesh = m_mesh;
822 info() <<
"TEST_DIR_CELL_NODE_ACCELERATOR_DIRECTION=" <<
idir;
824 auto queue = m_accelerator_mng->defaultQueue();
835 if (
cn.cellId() !=
cn2.cellId()) {
865 ARCANE_FATAL(
"Bad value for computed center id={0} center={1} computed={2}",
875void CartesianMeshTestUtils::
878 IMesh* mesh = m_mesh;
885 info() <<
"DIRECTION=" <<
idir;
892 if (
cf.cellId() !=
cf2.cellId())
897 info() <<
"CellFace uid=" <<
ItemPrinter(cell) <<
" dir=" <<
md;
898 info() <<
"CellFace nextFace =" <<
ItemPrinter(
cf.next()) <<
" xyz=" << m_face_center[
cf.next()];
899 info() <<
"CellFace prevFace=" <<
ItemPrinter(
cf.previous()) <<
" xyz=" << m_face_center[
cf.previous()];
908void CartesianMeshTestUtils::
909_testDirCellFaceAccelerator()
911#if defined(ARCANE_HAS_ACCELERATOR_API)
912 IMesh* mesh = m_mesh;
925 auto queue = m_accelerator_mng->defaultQueue();
930 info() <<
"DIRECTION=" <<
idir;
939 if (
cf.cellId() !=
cf2.cellId()) {
944 Int32 next_index =
cf.nextLocalIndex();
969void CartesianMeshTestUtils::
970_testNodeToCellConnectivity3D()
972 info() <<
"Test NodeToCell Connectivity3D";
973 IMesh* mesh = m_mesh;
979 info(4) <<
"node_uid=" << node.
uniqueId()
980 <<
" UL=" <<
cc.upperLeftId(
inode)
981 <<
" UR=" <<
cc.upperRightId(
inode)
982 <<
" LR=" <<
cc.lowerRightId(
inode)
983 <<
" LL=" <<
cc.lowerLeftId(
inode)
984 <<
" TUL=" <<
cc.topZUpperLeftId(
inode)
985 <<
" TUR=" <<
cc.topZUpperRightId(
inode)
986 <<
" TLR=" <<
cc.topZLowerRightId(
inode)
987 <<
" TLL=" <<
cc.topZLowerLeftId(
inode);
1058void CartesianMeshTestUtils::
1059_testNodeToCellConnectivity3DAccelerator()
1061#if defined(ARCANE_HAS_ACCELERATOR_API)
1062 info() <<
"Test NodeToCell Connectivity3D";
1063 IMesh* mesh = m_mesh;
1068 auto queue = m_accelerator_mng->defaultQueue();
1153void CartesianMeshTestUtils::
1154_testNodeToCellConnectivity2D()
1156 info() <<
"Test NodeToCell Connectivity 2D";
1157 IMesh* mesh = m_mesh;
1163 info(4) <<
"node_uid=" << node.
uniqueId()
1164 <<
" UL=" <<
cc.upperLeftId(
inode)
1165 <<
" UR=" <<
cc.upperRightId(
inode)
1166 <<
" LR=" <<
cc.lowerRightId(
inode)
1167 <<
" LL=" <<
cc.lowerLeftId(
inode);
1206void CartesianMeshTestUtils::
1207_testCellToNodeConnectivity3D()
1209 info() <<
"Test CellToNode Connectivity3D";
1210 IMesh* mesh = m_mesh;
1217 info(4) <<
"cell_uid=" << cell.
uniqueId()
1218 <<
" UL=" <<
cc.upperLeftId(
icell)
1219 <<
" UR=" <<
cc.upperRightId(
icell)
1220 <<
" LR=" <<
cc.lowerRightId(
icell)
1221 <<
" LL=" <<
cc.lowerLeftId(
icell)
1222 <<
" TUL=" <<
cc.topZUpperLeftId(
icell)
1223 <<
" TUR=" <<
cc.topZUpperRightId(
icell)
1224 <<
" TLR=" <<
cc.topZLowerRightId(
icell)
1225 <<
" TLL=" <<
cc.topZLowerLeftId(
icell);
1304void CartesianMeshTestUtils::
1305_testCellToNodeConnectivity3DAccelerator()
1307#if defined(ARCANE_HAS_ACCELERATOR_API)
1308 info() <<
"Test CellToNode Connectivity3D Accelerator";
1309 IMesh* mesh = m_mesh;
1315 auto queue = m_accelerator_mng->defaultQueue();
1410void CartesianMeshTestUtils::
1411_testCellToNodeConnectivity2D()
1413 info() <<
"Test CellToNode Connectivity 2D";
1414 IMesh* mesh = m_mesh;
1421 info(4) <<
"cell_uid=" << cell.
uniqueId()
1422 <<
" UL=" <<
cc.upperLeftId(
icell)
1423 <<
" UR=" <<
cc.upperRightId(
icell)
1424 <<
" LR=" <<
cc.lowerRightId(
icell)
1425 <<
" LL=" <<
cc.lowerLeftId(
icell);
1468template<
typename ItemType>
void CartesianMeshTestUtils::
1469_testConnectivityByDirectionHelper(
const ItemGroup& group)
1472 Int32
nb_dim = m_mesh->dimension();
1474 info() <<
"Test ConnectivityByDirection 2D";
1491 vc.areEqual(
cc.topZUpperRightId(
iitem),
cc.upperRightId(
iitem,2),
"Item1 dir2");
1492 vc.areEqual(
cc.topZLowerRightId(
iitem),
cc.lowerRightId(
iitem,2),
"Item2 dir2");
1495 vc.areEqual(
cc.upperLeftId(
iitem),
cc.topZUpperLeftId(
iitem,2),
"Item4 dir2");
1496 vc.areEqual(
cc.topZUpperLeftId(
iitem),
cc.topZUpperRightId(
iitem,2),
"Item5 dir2");
1497 vc.areEqual(
cc.topZLowerLeftId(
iitem),
cc.topZLowerRightId(
iitem,2),
"Item6 dir2");
1498 vc.areEqual(
cc.lowerLeftId(
iitem),
cc.topZLowerLeftId(
iitem,2),
"Item7 dir2");
1506void CartesianMeshTestUtils::
1507_testConnectivityByDirection()
1509 info() <<
"Test Node ConnectivityByDirection";
1511 info() <<
"Test Cell ConnectivityByDirection";
1518void CartesianMeshTestUtils::
1538void CartesianMeshTestUtils::
1543 info() <<
"Saving mesh to SVG format";
1544 std::ofstream
ofile(
"toto.svg");
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions utilitaires sur le maillage.
Types et macros pour gérer les énumérations des entités sur les accélérateurs.
#define RUNCOMMAND_ENUMERATE(ItemTypeName, iter_name, item_group,...)
Macro pour itérer sur accélérateur sur un groupe d'entités.
Interface du gestionnaire des accélérateurs.
Classe d'accès aux connectivités cartésiennes.
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é.
Maille avec info directionnelle des faces.
Maille avec info directionnelle des faces.
Maille avant et après une maille suivant une direction.
Maille avec info directionnelle des noeuds.
Maille avec info directionnelle des noeuds.
Maille avant et après une maille suivant une direction.
Infos sur maille avant et après une face 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.
Noeud avant et après un noeud suivant une direction.
Infos sur les face d'une direction spécifique X,Y ou Z d'un maillage structuré.
Interface d'un maillage cartésien.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
virtual NodeGroup allNodes()=0
Groupe de tous les noeuds.
virtual CellGroup allCells()=0
Groupe de toutes les mailles.
virtual VariableNodeReal3 & nodesCoordinates()=0
Coordonnées des noeuds.
Groupe d'entités de maillage.
bool checkIsSorted() const
Vérifie et retourne si le groupe est trié par uniqueId() croissants.
const String & name() const
Nom du groupe.
Classe utilitaire pour imprimer les infos sur une entité.
Int32 nbNode() const
Nombre de noeuds de l'entité
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
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.
Vue sur les connectivités standards d'un maillage non structuré.
Vérification de la validité de certaines valeurs.
Paramètres nécessaires à la construction d'une variable.
Classe d'accès aux traces.
Espace de nom pour l'utilisation des accélérateurs.
auto viewInOut(RunCommand &cmd, CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture/écriture pour les variables materiaux scalaire.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
auto viewIn(RunCommand &cmd, const CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture pour les variables materiaux scalaire.
auto viewOut(RunCommand &cmd, CellMaterialVariableScalarRef< DataType > &var)
Vue en écriture pour les variables materiaux scalaire.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eMeshDirection
Type de la direction pour un maillage structuré
Int32 Integer
Type représentant un entier.
Real y
deuxième composante du triplet
Real z
troisième composante du triplet
Real x
première composante du triplet