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());
238void CartesianMeshTestUtils::
239_testDirCellAccelerator()
241#if defined(ARCANE_HAS_ACCELERATOR_API)
242 info() <<
"TEST_DIR_CELL_ACCELERATOR";
244 IMesh* mesh = m_mesh;
249 auto queue = m_accelerator_mng->queue();
256 cdm2 = m_cartesian_mesh->cellDirection(
idir);
258 info() <<
"ACCELERATOR_DIRECTION=" <<
idir <<
" Cells=" <<
cdm.allCells().name();
259 _checkItemGroupIsSorted(
cdm.allCells());
309void CartesianMeshTestUtils::
312 IMesh* mesh = m_mesh;
321void CartesianMeshTestUtils::
322_testDirFaceAccelerator()
324 IMesh* mesh = m_mesh;
327 _testDirFaceAccelerator(
idir);
333void CartesianMeshTestUtils::
334_testDirFace(
int idir)
351 _checkItemGroupIsSorted(fdm.allFaces());
372 info() <<
"Bad ordering for face";
377 info() <<
"Face uid=" <<
ItemPrinter(face) <<
" dir=" <<
md <<
" xyz=" << m_face_center[
iface]
385 info() <<
"Bad ordering for face";
390 info() <<
"Face uid=" <<
ItemPrinter(face) <<
" dir=" <<
md <<
" xyz=" << m_face_center[
iface]
396 info() <<
"Bad ordering for face";
401 info() <<
"Face uid=" <<
ItemPrinter(face) <<
" dir=" <<
md <<
" xyz=" << m_face_center[
iface]
413void CartesianMeshTestUtils::
414_testDirFaceAccelerator(
int idir)
416#if defined(ARCANE_HAS_ACCELERATOR_API)
429 auto queue = m_accelerator_mng->defaultQueue();
495void CartesianMeshTestUtils::
498 info() <<
"TEST_DIR_NODE";
499 m_node_density.fill(0.0);
501 IMesh* mesh = m_mesh;
515 info() <<
"DIRECTION=" <<
idir;
520 m_node_density[
inode] += 1.0;
546 for (Integer
k = 0;
k < 8; ++
k) {
558 info() <<
"DirNode direct "
560 <<
" " <<
dir_node.nextRightCellId()
561 <<
" " <<
dir_node.previousRightCellId()
562 <<
" " <<
dir_node.previousLeftCellId()
563 <<
" " <<
dir_node.topNextLeftCellId()
564 <<
" " <<
dir_node.topNextRightCellId()
565 <<
" " <<
dir_node.topPreviousRightCellId()
566 <<
" " <<
dir_node.topPreviousLeftCellId();
567 info() <<
"DirNode direct "
584 info() <<
"Bad ordering for node";
597 info() <<
"Bad ordering for node";
608 info() <<
"Bad ordering for node";
628 if (m_node_density[
inode] == 0.0) {
630 info() <<
"Bad value for node " <<
ItemPrinter(node);
640void CartesianMeshTestUtils::
641_testDirNodeAccelerator()
643#if defined(ARCANE_HAS_ACCELERATOR_API)
644 info() <<
"TEST_DIR_NODE Accelerator";
645 m_node_density.fill(0.0);
647 IMesh* mesh = m_mesh;
667 info() <<
"DIRECTION=" <<
idir;
671 auto queue = m_accelerator_mng->defaultQueue();
708 for (Integer
k = 0;
k < 8; ++
k) {
769void CartesianMeshTestUtils::
772 IMesh* mesh = m_mesh;
780 info() <<
"DIRECTION=" <<
idir;
787 if (
cn.cellId() !=
cn2.cellId())
811void CartesianMeshTestUtils::
812_testDirCellNodeAccelerator()
814#if defined(ARCANE_HAS_ACCELERATOR_API)
815 IMesh* mesh = m_mesh;
824 info() <<
"TEST_DIR_CELL_NODE_ACCELERATOR_DIRECTION=" <<
idir;
826 auto queue = m_accelerator_mng->defaultQueue();
837 if (
cn.cellId() !=
cn2.cellId()) {
867 ARCANE_FATAL(
"Bad value for computed center id={0} center={1} computed={2}",
877void CartesianMeshTestUtils::
880 IMesh* mesh = m_mesh;
887 info() <<
"DIRECTION=" <<
idir;
894 if (
cf.cellId() !=
cf2.cellId())
899 info() <<
"CellFace uid=" <<
ItemPrinter(cell) <<
" dir=" <<
md;
900 info() <<
"CellFace nextFace =" <<
ItemPrinter(
cf.next()) <<
" xyz=" << m_face_center[
cf.next()];
901 info() <<
"CellFace prevFace=" <<
ItemPrinter(
cf.previous()) <<
" xyz=" << m_face_center[
cf.previous()];
910void CartesianMeshTestUtils::
911_testDirCellFaceAccelerator()
913#if defined(ARCANE_HAS_ACCELERATOR_API)
914 IMesh* mesh = m_mesh;
927 auto queue = m_accelerator_mng->defaultQueue();
932 info() <<
"DIRECTION=" <<
idir;
941 if (
cf.cellId() !=
cf2.cellId()) {
946 Int32 next_index =
cf.nextLocalIndex();
971void CartesianMeshTestUtils::
972_testNodeToCellConnectivity3D()
974 info() <<
"Test NodeToCell Connectivity3D";
975 IMesh* mesh = m_mesh;
981 info(4) <<
"node_uid=" << node.
uniqueId()
982 <<
" UL=" <<
cc.upperLeftId(
inode)
983 <<
" UR=" <<
cc.upperRightId(
inode)
984 <<
" LR=" <<
cc.lowerRightId(
inode)
985 <<
" LL=" <<
cc.lowerLeftId(
inode)
986 <<
" TUL=" <<
cc.topZUpperLeftId(
inode)
987 <<
" TUR=" <<
cc.topZUpperRightId(
inode)
988 <<
" TLR=" <<
cc.topZLowerRightId(
inode)
989 <<
" TLL=" <<
cc.topZLowerLeftId(
inode);
1060void CartesianMeshTestUtils::
1061_testNodeToCellConnectivity3DAccelerator()
1063#if defined(ARCANE_HAS_ACCELERATOR_API)
1064 info() <<
"Test NodeToCell Connectivity3D";
1065 IMesh* mesh = m_mesh;
1070 auto queue = m_accelerator_mng->defaultQueue();
1155void CartesianMeshTestUtils::
1156_testNodeToCellConnectivity2D()
1158 info() <<
"Test NodeToCell Connectivity 2D";
1159 IMesh* mesh = m_mesh;
1165 info(4) <<
"node_uid=" << node.
uniqueId()
1166 <<
" UL=" <<
cc.upperLeftId(
inode)
1167 <<
" UR=" <<
cc.upperRightId(
inode)
1168 <<
" LR=" <<
cc.lowerRightId(
inode)
1169 <<
" LL=" <<
cc.lowerLeftId(
inode);
1208void CartesianMeshTestUtils::
1209_testCellToNodeConnectivity3D()
1211 info() <<
"Test CellToNode Connectivity3D";
1212 IMesh* mesh = m_mesh;
1219 info(4) <<
"cell_uid=" << cell.
uniqueId()
1220 <<
" UL=" <<
cc.upperLeftId(
icell)
1221 <<
" UR=" <<
cc.upperRightId(
icell)
1222 <<
" LR=" <<
cc.lowerRightId(
icell)
1223 <<
" LL=" <<
cc.lowerLeftId(
icell)
1224 <<
" TUL=" <<
cc.topZUpperLeftId(
icell)
1225 <<
" TUR=" <<
cc.topZUpperRightId(
icell)
1226 <<
" TLR=" <<
cc.topZLowerRightId(
icell)
1227 <<
" TLL=" <<
cc.topZLowerLeftId(
icell);
1306void CartesianMeshTestUtils::
1307_testCellToNodeConnectivity3DAccelerator()
1309#if defined(ARCANE_HAS_ACCELERATOR_API)
1310 info() <<
"Test CellToNode Connectivity3D Accelerator";
1311 IMesh* mesh = m_mesh;
1317 auto queue = m_accelerator_mng->defaultQueue();
1412void CartesianMeshTestUtils::
1413_testCellToNodeConnectivity2D()
1415 info() <<
"Test CellToNode Connectivity 2D";
1416 IMesh* mesh = m_mesh;
1423 info(4) <<
"cell_uid=" << cell.
uniqueId()
1424 <<
" UL=" <<
cc.upperLeftId(
icell)
1425 <<
" UR=" <<
cc.upperRightId(
icell)
1426 <<
" LR=" <<
cc.lowerRightId(
icell)
1427 <<
" LL=" <<
cc.lowerLeftId(
icell);
1470template<
typename ItemType>
void CartesianMeshTestUtils::
1471_testConnectivityByDirectionHelper(
const ItemGroup& group)
1474 Int32
nb_dim = m_mesh->dimension();
1476 info() <<
"Test ConnectivityByDirection 2D";
1493 vc.areEqual(
cc.topZUpperRightId(
iitem),
cc.upperRightId(
iitem,2),
"Item1 dir2");
1494 vc.areEqual(
cc.topZLowerRightId(
iitem),
cc.lowerRightId(
iitem,2),
"Item2 dir2");
1497 vc.areEqual(
cc.upperLeftId(
iitem),
cc.topZUpperLeftId(
iitem,2),
"Item4 dir2");
1498 vc.areEqual(
cc.topZUpperLeftId(
iitem),
cc.topZUpperRightId(
iitem,2),
"Item5 dir2");
1499 vc.areEqual(
cc.topZLowerLeftId(
iitem),
cc.topZLowerRightId(
iitem,2),
"Item6 dir2");
1500 vc.areEqual(
cc.lowerLeftId(
iitem),
cc.topZLowerLeftId(
iitem,2),
"Item7 dir2");
1508void CartesianMeshTestUtils::
1509_testConnectivityByDirection()
1511 info() <<
"Test Node ConnectivityByDirection";
1513 info() <<
"Test Cell ConnectivityByDirection";
1520void CartesianMeshTestUtils::
1540void CartesianMeshTestUtils::
1545 info() <<
"Saving mesh to SVG format";
1546 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.
RunCommand makeCommand(const RunQueue &run_queue)
Créé une commande associée à la file run_queue.
auto viewInOut(const ViewBuildInfo &vbi, CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture/écriture pour les variables materiaux scalaire.
auto viewOut(const ViewBuildInfo &vbi, CellMaterialVariableScalarRef< DataType > &var)
Vue en écriture pour les variables materiaux scalaire.
auto viewIn(const ViewBuildInfo &vbi, const CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture 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