14#include "arcane/utils/Iostream.h"
15#include "arcane/utils/StdHeader.h"
16#include "arcane/utils/HashTableMap.h"
17#include "arcane/utils/ValueConvert.h"
18#include "arcane/utils/ScopedPtr.h"
19#include "arcane/utils/ArcanePrecomp.h"
20#include "arcane/utils/ITraceMng.h"
21#include "arcane/utils/Real3.h"
22#include "arcane/utils/PlatformUtils.h"
23#include "arcane/utils/FatalErrorException.h"
24#include "arcane/utils/NotSupportedException.h"
25#include "arcane/utils/CheckedConvert.h"
27#include "arcane/IMeshReader.h"
28#include "arcane/ISubDomain.h"
29#include "arcane/IIOMng.h"
30#include "arcane/IParallelMng.h"
31#include "arcane/IPrimaryMesh.h"
32#include "arcane/Item.h"
33#include "arcane/ItemTypeMng.h"
34#include "arcane/ItemGroup.h"
35#include "arcane/ArcaneException.h"
36#include "arcane/Service.h"
37#include "arcane/Timer.h"
38#include "arcane/ServiceFactory.h"
39#include "arcane/ServiceInfo.h"
40#include "arcane/CaseOptionsMain.h"
41#include "arcane/MeshUtils.h"
42#include "arcane/ItemEnumerator.h"
43#include "arcane/VariableTypes.h"
44#include "arcane/ServiceBuildInfo.h"
45#include "arcane/XmlNodeList.h"
46#include "arcane/IXmlDocumentHolder.h"
47#include "arcane/IItemFamily.h"
48#include "arcane/FactoryService.h"
49#include "arcane/AbstractService.h"
50#include "arcane/MathUtils.h"
52#include "arcane/cea/LimaCutInfosReader.h"
67template<
typename LimaMaliReader>
72void createGroup(IItemFamily* family,
const String& name,
Int32ArrayView local_ids);
82 static Real Hexaedron8Volume(
Real3 n[8])
84 Real v1 =
math::matDet((n[6] - n[1]) + (n[7] - n[0]), n[6] - n[3], n[2] - n[0]);
85 Real v2 =
math::matDet(n[7] - n[0], (n[6] - n[3]) + (n[5] - n[0]), n[6] - n[4]);
86 Real v3 =
math::matDet(n[6] - n[1], n[5] - n[0], (n[6] - n[4]) + (n[2] - n[0]));
88 Real
res = (v1 + v2 + v3) / 12.0;
93 static Real Pyramid5Volume(
Real3 n[5])
95 return math::matDet(n[1] - n[0], n[3] - n[0], n[4] - n[0]) +
99 static Real Quad4Surface(
Real3 n[4])
101 Real
x1 = n[1].
x - n[0].
x;
102 Real
y1 = n[1].
y - n[0].
y;
103 Real
x2 = n[2].
x - n[1].
x;
104 Real
y2 = n[2].
y - n[1].
y;
107 x1 = n[2].
x - n[0].
x;
108 y1 = n[2].
y - n[0].
y;
109 x2 = n[3].
x - n[2].
x;
110 y2 = n[3].
y - n[2].
y;
117 static Real Triangle3Surface(
Real3 n[3])
119 Real
x1 = n[1].
x - n[0].
x;
120 Real
y1 = n[1].
y - n[0].
y;
121 Real
x2 = n[2].
x - n[1].
x;
122 Real
y2 = n[2].
y - n[1].
y;
137template<
typename LimaMaliReader>
172template <
typename ReaderWrapper>
180 typedef typename ReaderWrapper::LimaMaliReaderType LimaMaliReader;
189 delete m_cut_infos_reader;
194 bool readMeshPart(
ITimerMng* timer_mng,LimaMaliReader* reader,
209template<
typename LimaMaliReader>
213 typedef LimaMaliReader LimaMaliReaderType;
214 typedef typename LimaMaliReader::NuageReader LimaNodeGroup;
220 void setReader(LimaMaliReader* reader)
222 m_mali_reader = reader;
224 LimaMaliReader* reader()
226 return m_mali_reader;
231 _readGroup(
typename LimaMaliReader::SurfaceReader reader,
232 Lima::size_type begin, Lima::size_type n, Lima::size_type* buffer)
234 return reader.lire_mailles_ids(begin, n, buffer);
237 _readGroup(
typename LimaMaliReader::VolumeReader reader,
238 Lima::size_type begin, Lima::size_type n, Lima::size_type* buffer)
240 return reader.lire_mailles_ids(begin, n, buffer);
243 _readGroup(
typename LimaMaliReader::LigneReader reader,
244 Lima::size_type begin, Lima::size_type n, Lima::size_type* buffer)
246 return reader.lire_bras_ids(begin, n, buffer);
250 _readGroup(
typename LimaMaliReader::NuageReader reader,
251 Lima::size_type begin, Lima::size_type n, Lima::size_type* buffer)
253 return reader.lire_noeuds_ids(begin, n, buffer);
256 double* allocateNodesCoordsBuffer(Lima::size_type
buf_size)
258 return m_mali_reader->allouer_tampon_coords(
buf_size);
260 Lima::size_type* allocateNodesIdBuffer(Lima::size_type
buf_size)
262 return m_mali_reader->allouer_tampon_ids(
buf_size);
264 Lima::size_type readNodes(Lima::size_type begin, Lima::size_type count,
265 Lima::size_type* ids,
double* coords)
267 return m_mali_reader->lire_noeuds(begin, count, ids, coords);
270 template <
typename LimaGroupReader>
273 using namespace Lima;
276 size_type* buffer = 0;
280 buffer = reader.allouer_tampon_ids(
step_size);
284 size_type*
ptr = buffer;
285 for (Integer n = 0; n < count; ++n) {
297 LimaMaliReader* m_mali_reader;
306template<
typename LimaMaliReader>
319 std::vector<std::string> groups;
320 _getGroupsName(groups);
321 m_groups_name.
clear();
322 for (
size_t i = 0, is = groups.size(); i < is; ++i)
324 return m_groups_name;
328 virtual void _getGroupsName(std::vector<std::string>& groups) = 0;
337template<
typename LimaMaliReader>
347 typename LimaMaliReader::NuageReader
r = this->m_wrapper->reader()->nuage(name.localstr());
350 virtual void _getGroupsName(std::vector<std::string>& groups)
352 this->m_wrapper->reader()->liste_nuages(groups);
358template<
typename LimaMaliReader>
368 typename LimaMaliReader::LigneReader
r = this->m_wrapper->reader()->ligne(name.localstr());
371 virtual void _getGroupsName(std::vector<std::string>& groups)
373 this->m_wrapper->reader()->liste_lignes(groups);
379template<
typename LimaMaliReader>
390 typename LimaMaliReader::SurfaceReader
r = this->m_wrapper->reader()->surface(name.localstr());
393 virtual void _getGroupsName(std::vector<std::string>& groups)
395 this->m_wrapper->reader()->liste_surfaces(groups);
399template<
typename LimaMaliReader>
410 typename LimaMaliReader::VolumeReader
r = this->m_wrapper->reader()->volume(name.localstr());
413 virtual void _getGroupsName(std::vector<std::string>& groups)
415 this->m_wrapper->reader()->liste_volumes(groups);
424template<
typename LimaMaliReader>
429 using BaseClass::m_mali_reader;
430 using BaseClass::m_cell_group_reader;
431 using BaseClass::m_node_group_reader;
432 using BaseClass::m_face_group_reader;
434 typedef Lima::Composition LimaComposition;
435 typedef typename LimaMaliReader::SurfaceReader LimaCellGroup;
436 typedef typename LimaMaliReader::LigneReader LimaFaceGroup;
437 typedef typename LimaMaliReader::NuageReader LimaNodeGroup;
439 LimaComposition cells()
441 return m_mali_reader->composition_polygones();
444 LimaComposition faces()
446 return m_mali_reader->composition_bras();
449 LimaComposition nodes()
451 return m_mali_reader->composition_noeuds();
454 std::vector<std::string> cellGroups()
456 std::vector<std::string> groups;
457 m_mali_reader->liste_surfaces(groups);
463 if (!m_cell_group_reader.get())
465 return m_cell_group_reader.get();
470 if (!m_node_group_reader.get())
472 return m_node_group_reader.get();
477 if (!m_face_group_reader.get())
479 return m_face_group_reader.get();
482 std::vector<std::string> faceGroups()
484 std::vector<std::string> groups;
485 m_mali_reader->liste_lignes(groups);
489 std::vector<std::string> nodeGroups()
491 std::vector<std::string> groups;
492 m_mali_reader->liste_nuages(groups);
496 LimaCellGroup cellGroup(
const string& name)
498 return m_mali_reader->surface(name);
501 LimaFaceGroup faceGroup(
const string& name)
503 return m_mali_reader->ligne(name);
506 LimaNodeGroup nodeGroup(
const string& name)
508 return m_mali_reader->nuage(name);
511 Lima::size_type* allocateCellsBuffer(Lima::size_type
buf_size)
513 return m_mali_reader->allouer_tampon_polygones(
buf_size);
515 Lima::size_type readCells(Lima::size_type begin, Lima::size_type count, Lima::size_type* buffer)
517 return m_mali_reader->lire_polygones(begin, count, buffer);
519 Integer facesBufferSize(Lima::size_type
buf_size)
527 Lima::size_type readFaces(Lima::size_type begin, Lima::size_type count, Lima::size_type* buffer)
529 return m_mali_reader->lire_bras(begin, count, buffer);
540 const char* strDimension()
544 Real3 readNodeCoords(
const double*
ptr)
548 static Integer cellToType(Integer
nb_node)
569template<
typename LimaMaliReader>
574 using BaseClass::m_mali_reader;
575 using BaseClass::m_cell_group_reader;
576 using BaseClass::m_node_group_reader;
577 using BaseClass::m_face_group_reader;
579 typedef typename LimaMaliReader::VolumeReader LimaCellGroup;
580 typedef typename LimaMaliReader::SurfaceReader LimaFaceGroup;
581 typedef typename LimaMaliReader::NuageReader LimaNodeGroup;
582 typedef Lima::Composition LimaComposition;
585 LimaComposition cells()
587 return m_mali_reader->composition_polyedres();
589 LimaComposition faces()
591 return m_mali_reader->composition_polygones();
593 LimaComposition nodes()
595 return m_mali_reader->composition_noeuds();
601 typedef Lima::Polyedre LimaCell;
603 typedef Lima::Polygone LimaFace;
607 if (!m_cell_group_reader.get())
609 return m_cell_group_reader.get();
614 if (!m_face_group_reader.get())
616 return m_face_group_reader.get();
621 if (!m_node_group_reader.get())
623 return m_node_group_reader.get();
626 std::vector<std::string> cellGroups()
628 std::vector<std::string> groups;
629 m_mali_reader->liste_volumes(groups);
633 std::vector<std::string> faceGroups()
635 std::vector<std::string> groups;
636 m_mali_reader->liste_surfaces(groups);
640 std::vector<std::string> nodeGroups()
642 std::vector<std::string> groups;
643 m_mali_reader->liste_nuages(groups);
647 LimaCellGroup cellGroup(
const string& name)
649 return m_mali_reader->volume(name);
651 LimaFaceGroup faceGroup(
const string& name)
653 return m_mali_reader->surface(name);
655 LimaNodeGroup nodeGroup(
const string& name)
657 return m_mali_reader->nuage(name);
659 Lima::size_type* allocateCellsBuffer(Lima::size_type
buf_size)
661 return m_mali_reader->allouer_tampon_polyedres(
buf_size);
663 Lima::size_type readCells(Lima::size_type begin, Lima::size_type count, Lima::size_type* buffer)
665 return m_mali_reader->lire_polyedres(begin, count, buffer);
667 Integer facesBufferSize(Lima::size_type
buf_size)
675 Lima::size_type readFaces(Lima::size_type begin, Lima::size_type count, Lima::size_type* buffer)
677 return m_mali_reader->lire_polygones(begin, count, buffer);
688 const char* strDimension()
692 Real3 readNodeCoords(
const double*
ptr)
696 static Integer cellToType(Integer
nb_node)
700 return IT_Tetraedron4;
704 return IT_Pentaedron6;
706 return IT_Hexaedron8;
708 return IT_Heptaedron10;
710 return IT_Octaedron12;
723template<
typename LimaMaliReader>
741template<
typename LimaMaliReader>
753 Integer dimension = 0;
756 reader =
new LimaMaliReader(filename.
localstr(), 1);
758 catch (
const Lima::erreur& ex) {
759 ARCANE_FATAL(
"Impossible de lire le fichier MLI Lima <{0}> :",filename,ex.what());
762 ARCANE_FATAL(
"Impossible de lire le fichier MLI Lima <{0}>",filename);
764 dimension = reader->dimension();
769 ScopedPtrT<LimaMalippMeshBase<LimaMaliReader>> lm;
770 if (dimension == Lima::D3) {
771 info() <<
"Maillage 3D";
773 lm =
new LimaMalippReaderT<LimaMalipp3DReaderWrapper<LimaMaliReader>>(pm);
775 else if (dimension == Lima::D2) {
776 info() <<
"Maillage 2D";
778 lm =
new LimaMalippReaderT<LimaMalipp2DReaderWrapper<LimaMaliReader>>(pm);
781 throw NotSupportedException(A_FUNCINFO,
"Can not read Lima 1D mesh");
784 log() <<
"Dimension du maillage non reconnue par lima";
787 bool ret = lm->readMeshPart(timer_mng,reader.get(), mesh, filename, length_multiplier);
796template <
typename ReaderWrapper>
797bool LimaMalippReaderT<ReaderWrapper>::
798readMeshPart(ITimerMng* timer_mng,LimaMaliReader* reader, IPrimaryMesh* mesh,
799 const String& filename, Real length_multiplier)
801 return _readMeshPart(timer_mng, reader, mesh, filename, length_multiplier);
811template <
typename ReaderWrapper>
816 typedef Lima::size_type size_type;
826 this->
pwarning() <<
"Chargement Lima du fichier USING MALIPP avec partitionnement '" << file_name <<
'"';
828 this->
pwarning() <<
"Small basic_step value=" << basic_step;
830 const char* version = Lima::lima_version();
831 info() <<
"Utilisation de la version " << version <<
" de Lima";
835 this->
log() <<
"Début lecture fichier " << file_name;
840 if (reader && reader->dimension() !=
wrapper.limaDimension())
864 info() <<
"Unité de longueur du fichier: " << reader->unite_longueur();
883 info() <<
"-- Informations sur le maillage (Lima):";
889 ARCANE_FATAL(
"Pas de noeuds dans le fichier de maillage.");
895 if (!platform::getEnvironmentVariable(
"ARCANE_LIMA_UNIQUE_ID").null()) {
897 info() <<
"WARNING: UniqueId begin at 1";
913 ARCANE_FATAL(
"Number of cells is less than number of sub domains");
923 ARCANE_FATAL(
"Too many count reading cells i={0} nrank=",i,nb_rank);
926 if ((i + 1) == nb_rank)
930 Integer
p = (i * 20) / nb_rank;
933 info() <<
"Reading cells rank=" << i <<
" n=" <<
wanted_count <<
" count=" << count
934 <<
" (" << (
p * 5) <<
"%)";
938 size_type*
ptr = buffer;
940 for (Integer
p = 0;
p < count; ++
p) {
944 Integer
ct = ReaderWrapper::cellToType(n);
945 if (
ct == IT_NullType)
952 for (Lima::size_type z = 0; z <
nodeCount; ++z) {
980 info() <<
" READ COORDINATES 1";
1001 info() <<
" READ COORDINATES 2";
1009 Integer
dim_step = reader->dimension();
1014 for (Integer n = 0; n < count; ++n, ++
nodeCount) {
1061 info() <<
" READ CELLS";
1082 if (
type_id == IT_Hexaedron8) {
1089 info() <<
"Volume negatif Hexaedron8 uid=" << cell_uid <<
" v=" <<
volume;
1093 else if (
type_id == IT_Pyramid5) {
1098 info() <<
"Volume negatif Pyramid5 uid=" << cell_uid <<
" v=" <<
volume;
1102 else if (
type_id == IT_Quad4) {
1103 Real surface = LimaVolume::Quad4Surface(
local_coords.data());
1104 if (surface < 0.0) {
1107 info() <<
"Surface negative Quad4 uid=" << cell_uid <<
" v=" << surface;
1111 else if (
type_id == IT_Triangle3) {
1112 Real surface = LimaVolume::Triangle3Surface(
local_coords.data());
1113 if (surface < 0.0) {
1115 info() <<
"Surface negative Triangle3 uid=" << cell_uid <<
" v=" << surface;
1125 logdate() <<
"Début allocation du maillage";
1127 logdate() <<
"Fin allocation du maillage";
1131 for (Integer i = 0, is = cells.
size(); i < is; ++i)
1132 cells[i]->setOwner(
sid,
sid);
1141 this->_createGroups(mesh,
IK_Cell,
wrapper.cellGroupReader(), 0);
1142 this->_createGroups(mesh,
IK_Node,
wrapper.nodeGroupReader(), 0);
1179 size_type*
ptr = buffer.data();
1180 info() <<
" Read Face2 N=" << i <<
" count=" << count <<
" step_size=" <<
step_size;
1186 for (Integer
p = 0;
p < count; ++
p) {
1197 for (Integer z = 0; z <
nodeCount; ++z) {
1204 for (Integer z = 0; z < n; ++z)
1241 const Node& node = *i;
1248 logdate() <<
"Fin de lecture du fichier";
1255template <
typename LimaMaliReader>
1260 for (Integer i = 0, is = coords.
size(); i < is; ++i) {
1264 d->value() = coords[i];
1271template <
typename LimaMaliReader>
1272void LimaMalippMeshBase<LimaMaliReader>::
1273_createGroups(IMesh* mesh,
eItemKind item_kind, LimaGroupReader<LimaMaliReader>* lima_group_reader,
1274 HashTableMapT<Int64, Int32>* converter)
1276 IParallelMng* pm = mesh->parallelMng();
1288 Integer nb_group = groups_name.size();
1290 sizes_infos[0] = nb_group;
1292 for (Integer i = 0; i < nb_group; ++i) {
1294 String group_name = groups_name[i];
1295 pm->broadcastString(group_name, master_rank);
1298 lima_group_reader->read(group_name, unique_ids);
1299 Integer nb_item_in_group = unique_ids.size();
1300 sizes_infos[0] = nb_item_in_group;
1302 pm->broadcast(unique_ids, master_rank);
1304 _createGroupFromHashTable(mesh, group_name, item_kind, unique_ids, *converter);
1306 _createGroupFromUniqueIds(mesh, group_name, item_kind, unique_ids);
1312 Integer nb_group = sizes_infos[0];
1313 for (Integer i = 0; i < nb_group; ++i) {
1315 pm->broadcastString(group_name, master_rank);
1318 Integer nb_item_in_group = sizes_infos[0];
1319 unique_ids.resize(nb_item_in_group);
1320 pm->broadcast(unique_ids, master_rank);
1322 _createGroupFromHashTable(mesh, group_name, item_kind, unique_ids, *converter);
1324 _createGroupFromUniqueIds(mesh, group_name, item_kind, unique_ids);
1332template <
typename LimaMaliReader>
1333void LimaMalippMeshBase<LimaMaliReader>::
1334_createGroupFromUniqueIds(IMesh* mesh,
const String& name,
eItemKind ik,
1337 Integer nb_item_in_group = unique_ids.size();
1339 IItemFamily* family = mesh->itemFamily(ik);
1340 family->itemsUniqueIdToLocalId(local_ids, unique_ids,
false);
1342 for (Integer i = 0; i < nb_item_in_group; ++i) {
1343 if (local_ids[i] != NULL_ITEM_ID)
1344 group_ids.
add(local_ids[i]);
1346 info() <<
"Group Name <" << name <<
"> (" << nb_item_in_group <<
" elements)";
1347 LimaUtils::createGroup(family, name, group_ids);
1353template <
typename LimaMaliReader>
1354void LimaMalippMeshBase<LimaMaliReader>::
1355_createGroupFromHashTable(IMesh* mesh,
const String& name,
eItemKind ik,
1357 const HashTableMapT<Int64, Int32>& converter)
1359 Integer nb_item_in_group = unique_ids.size();
1361 IItemFamily* family = mesh->itemFamily(ik);
1363 for (Integer i = 0; i < nb_item_in_group; ++i) {
1364 const HashTableMapT<Int64, Int32>::Data* data = converter.lookup(unique_ids[i]);
1366 group_ids.
add(data->value());
1368 info() <<
"Group Name <" << name <<
"> (" << nb_item_in_group <<
" elements)";
1369 LimaUtils::createGroup(family, name, group_ids);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Tableau d'items de types quelconques.
virtual NodeGroup ownNodes()=0
Groupe de tous les noeuds propres au domaine.
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual Integer dimension()=0
Dimension du maillage (1D, 2D ou 3D).
eReturnType
Types des codes de retour d'une lecture ou écriture.
@ RTIrrelevant
Non concerné par l'opération. Cela signifie que le format de fichier ne correspond pas à ce lecteur o...
@ RTError
Erreur lors de l'opération.
@ RTOk
Opération effectuée avec succès.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
virtual ItemInternalList itemsInternal(eItemKind)=0
Tableau interne des éléments du maillage de type type.
virtual ItemTypeMng * itemTypeMng() const =0
Gestionnaire de types d'entités associé
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual void recv(ArrayView< char > values, Int32 rank)=0
virtual bool isMasterIO() const =0
true si l'instance est un gestionnaire maître des entrées/sorties.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual Integer masterIORank() const =0
Rang de l'instance gérant les entrées/sorties (pour laquelle isMasterIO() est vrai)
virtual VariableNodeReal3 & nodesCoordinates()=0
Coordonnées des noeuds.
virtual void allocateCells(Integer nb_cell, Int64ConstArrayView cells_infos, bool one_alloc=true)=0
Allocation d'un maillage.
virtual void setOwnersFromCells()=0
Positionne les propriétaires des entités à partir du propriétaire des mailles.
virtual void endAllocate()=0
Indique une fin d'allocation de mailles.
virtual void setDimension(Integer dim)=0
Positionne la dimension du maillage (1D, 2D ou 3D).
Interface d'un gestionnaire de timer.
Infos sur un type d'entité du maillage.
Gestionnaire des types d'entités de maillage.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
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)
Construction d'un maillage 3D.
Lecteur des fichiers de maillage via la bibliothèque LIMA pour fichier '.mli' ou 'mli2'.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
bool _readMeshPart(ITimerMng *timer_mng, LimaMaliReader *reader, IPrimaryMesh *mesh, const String &filename, Real length_multiplier)
Lecture du maillage. Seul le proc maitre a une instance de reader non nulle. Les autres ne doivent pa...
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Classe gérant un vecteur de réel de dimension 3.
@ TimerReal
Timer utilisant le temps réel.
Exception lorsqu'une entité du maillage n'est pas d'un type connu.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
void clear()
Supprime les éléments du tableau.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
bool null() const
Retourne true si la chaîne est nulle.
Classe d'accès aux traces.
TraceMessage pwarning() const
TraceMessage log() const
Flot pour un message de log.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage logdate() const
Flot pour un message de log précédé de la date.
Vecteur 1D de données avec sémantique par valeur (style STL).
Integer toInteger(Real r)
Converti un Int64 en un Integer.
ARCCORE_HOST_DEVICE Real matDet(Real3 u, Real3 v, Real3 w)
Déterminant de la matrice u,v,w.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
ArrayView< Integer > IntegerArrayView
Equivalent C d'un tableau à une dimension d'entiers.
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
eItemKind
Genre d'entité de maillage.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Face
Entité de maillage de genre face.
UniqueArray< String > StringUniqueArray
Tableau dynamique à une dimension de chaînes de caractères.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
ConstArrayView< Integer > IntegerConstArrayView
Equivalent C d'un tableau à une dimension d'entiers.
ArrayView< Real > RealArrayView
Equivalent C d'un tableau à une dimension de réels.
ArrayView< Int32 > Int32ArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Int32 Integer
Type représentant un entier.
Real y
deuxième composante du triplet
Real x
première composante du triplet