14#include "arcane/utils/String.h"
15#include "arcane/utils/Enumerator.h"
16#include "arcane/utils/Iterator.h"
17#include "arcane/utils/List.h"
18#include "arcane/utils/PlatformUtils.h"
19#include "arcane/utils/Iostream.h"
20#include "arcane/utils/OStringStream.h"
21#include "arcane/utils/ArcanePrecomp.h"
23#include "arcane/Item.h"
24#include "arcane/ItemEnumerator.h"
25#include "arcane/IVariable.h"
26#include "arcane/ISubDomain.h"
27#include "arcane/IMesh.h"
28#include "arcane/IMeshSubMeshTransition.h"
29#include "arcane/StdNum.h"
30#include "arcane/ItemGroup.h"
31#include "arcane/IParallelMng.h"
32#include "arcane/Directory.h"
33#include "arcane/PostProcessorWriterBase.h"
34#include "arcane/Service.h"
35#include "arcane/SimpleProperty.h"
36#include "arcane/FactoryService.h"
37#include "arcane/VariableCollection.h"
39#include "arcane/std/DumpW.h"
55Integer code_hex[8] = { 0, 3, 2, 1, 4, 7, 6, 5 };
56Integer code_prism[6] = { 2, 1, 0, 5, 4, 3 };
57Integer code_pyr[5] = { 4, 1, 2, 3, 0 };
58Integer code_tet[4] = { 0, 1, 3, 2 };
78 ARCANE_UNUSED(meta_data);
85 void writeVal(IVariable&,ConstArrayView<Real3>)
override;
86 void writeVal(IVariable&,ConstArrayView<Int64>)
override {}
87 void writeVal(IVariable&,ConstArrayView<Int32>)
override {}
88 void writeVal(IVariable&,ConstArrayView<Real2x2>)
override {}
89 void writeVal(IVariable&,ConstArrayView<Real3x3>)
override {}
90 void writeVal(IVariable&,ConstArrayView<String>)
override {}
92 void writeVal(IVariable&,ConstArray2View<Byte>)
override {}
93 void writeVal(IVariable&,ConstArray2View<Real>)
override {}
94 void writeVal(IVariable&,ConstArray2View<Int64>)
override {}
95 void writeVal(IVariable&,ConstArray2View<Int32>)
override {}
96 void writeVal(IVariable&,ConstArray2View<Real2>)
override {}
97 void writeVal(IVariable&,ConstArray2View<Real3>)
override {}
98 void writeVal(IVariable&,ConstArray2View<Real2x2>)
override {}
99 void writeVal(IVariable&,ConstArray2View<Real3x3>)
override {}
101 void writeVal(IVariable&,ConstMultiArray2View<Byte>)
override {}
102 void writeVal(IVariable&,ConstMultiArray2View<Real>)
override {}
103 void writeVal(IVariable&,ConstMultiArray2View<Int64>)
override {}
104 void writeVal(IVariable&,ConstMultiArray2View<Int32>)
override {}
105 void writeVal(IVariable&,ConstMultiArray2View<Real2>)
override {}
106 void writeVal(IVariable&,ConstMultiArray2View<Real3>)
override {}
107 void writeVal(IVariable&,ConstMultiArray2View<Real2x2>)
override {}
108 void writeVal(IVariable&,ConstMultiArray2View<Real3x3>)
override {}
115 static constexpr Integer m_max_digit = 5;
117 static constexpr Integer MAX_FLOAT_DIGIT = FloatInfo<Real>::maxDigit()+1;
119 ISubDomain* m_sub_domain;
139, m_base_directory(filename)
141, m_save_variables(variables.clone())
149 const int type = cell.
type();
150 if (type==IT_Vertex || type==IT_Line2 || type==IT_Triangle3
151 || type== IT_Quad4 || type==IT_Hexaedron8 || type==IT_Pyramid5
152 || type==IT_Pentagon5 || type==IT_Tetraedron4)
156 <<
" is unknown in UCD format. Cell will be ignored.";
163 for(
Integer i=0; i<nb_cell_var; ++i ){
168 for(
Integer i=0; i<nb_node_var; ++i ){
174 debug() <<
"DumpWUCD::DumpWUCD - "
175 <<
m_mesh->nbCell() <<
" cells among which "
197 info() <<
"** HERE dump Real variable " << v.
name();
204 for(
Integer i=0 ; i<size ; i++)
209 for(
Integer i=0 ; i<size ; i++){
215 info() <<
"Variable not managed by UCD writer: " << v.
name();
229 info() <<
"** HERE dump Real3 variable " << v.
name();
236 for(
Integer i=0 ; i<size ; i++) {
244 for(
Integer i=0 ; i<size ; i++){
253 info() <<
"Variable not managed by UCD writer: " << v.
name();
272 info() <<
"** Entering method DumpWUCD::writeBegin";
284 info() <<
"** Entering method DumpWUCD::writeEnd";
290 ostr().width(m_max_digit);
294 std::ofstream ucd_file(buf.
localstr());
306 Integer comp_node_data_size = 0;
307 Integer comp_cell_data_size = 0;
310 ndata_size_stream().precision(MAX_FLOAT_DIGIT);
311 ndata_name_stream().precision(MAX_FLOAT_DIGIT);
312 cdata_size_stream().precision(MAX_FLOAT_DIGIT);
313 cdata_name_stream().precision(MAX_FLOAT_DIGIT);
315 ndata_size_stream().flags(std::ios::scientific);
316 ndata_name_stream().flags(std::ios::scientific);
317 cdata_size_stream().flags(std::ios::scientific);
318 cdata_name_stream().flags(std::ios::scientific);
329 debug() <<
" Variable " << name
330 <<
" kind = IK_Node, type = DT_Real";
332 comp_node_data_size++;
333 ndata_size_stream() <<
" 1";
334 ndata_name_stream() << name <<
", Unknown" <<
'\n';
337 debug() <<
" Variable " << name
338 <<
" kind = IK_Cell, type = DT_Real";
340 comp_cell_data_size++;
341 cdata_size_stream() <<
" 1";
342 cdata_name_stream() << name <<
", Unknown" <<
'\n';
347 debug() <<
" Variable " << name
348 <<
" kind = IK_Node, type = DT_Real3";
350 comp_node_data_size+=3;
351 ndata_size_stream() <<
" 3";
352 ndata_name_stream() << name <<
", Unknown" <<
'\n';
355 debug() <<
" Variable " << name
356 <<
" kind = IK_Cell, type = DT_Real3";
358 comp_cell_data_size+=3;
359 cdata_size_stream() <<
" 3";
360 cdata_name_stream() << name <<
", Unknown" <<
'\n';
368 ucd_file << nb_node <<
" "
369 << nb_managed_cell <<
" "
370 << comp_node_data_size <<
" "
371 << comp_cell_data_size <<
" 0" <<
'\n';
375 for(
Integer i=0 ; i<nb_node ; i++){
376 const Real3 node_coord = node_coords[i];
377 ucd_file << i+1 <<
" "
378 << node_coord.
x <<
" "
379 << node_coord.
y <<
" "
380 << node_coord.
z <<
'\n';
384 for(
Integer iz=0 ; iz<nb_managed_cell ; ++iz ){
387 ucd_file <<
id+1 <<
" 1 ";
396 for(
Integer i=0 ; i<nb_cell_node ; i++)
401 for(
Integer i=0 ; i<nb_cell_node ; i++)
406 for(
Integer i=0 ; i<nb_cell_node ; i++)
411 for(
Integer i=0 ; i<nb_cell_node ; i++)
412 ucd_file <<
" " << cell.
node(code_hex[i]).
localId()+1;
416 for(
Integer i=0 ; i<nb_cell_node ; i++)
417 ucd_file <<
" " << cell.
node(code_pyr[i]).
localId()+1;
421 for(
Integer i=0 ; i<nb_cell_node ; i++)
422 ucd_file <<
" " << cell.
node(code_prism[i]).
localId()+1;
424 case(IT_Tetraedron4):
426 for(
Integer i=0 ; i<nb_cell_node ; i++)
427 ucd_file <<
" " << cell.
node(code_tet[i]).
localId()+1;
439 if (nb_comp_node_data){
440 ucd_file << nb_comp_node_data
441 << ndata_size_stream.str()
443 << ndata_name_stream.str();
444 for(
Integer i=0 ; i<nb_node ; i++)
449 if (nb_comp_cell_data){
450 ucd_file << nb_comp_cell_data
451 << cdata_size_stream.str()
453 << cdata_name_stream.str();
454 for(
Integer i=0 ; i<nb_managed_cell ; i++){
462 code_ostr().fill(
'0');
463 code_ostr().width(m_max_digit);
464 code_ostr() <<
m_times.size()-1;
467 std::ofstream code_file(buf.
localstr());
468 code_file << m_sub_domain->commonVariables().globalIteration() <<
'\n'
470 <<
"3" <<
'\n' <<
"1" <<
'\n'
471 <<
"7" <<
'\n' <<
"Unknown" <<
'\n'
472 << comp_node_data_size <<
'\n' << comp_cell_data_size <<
'\n';
473 for(
Integer i=0 ; i<comp_node_data_size ; i++)
474 code_file <<
"1"<<
'\n';
475 for(
Integer i=0 ; i<comp_cell_data_size ; i++)
476 code_file <<
"1"<<
'\n';
487class UCDPostProcessorService
488:
public PostProcessorWriterBase
492 : PostProcessorWriterBase(sbi), m_writer(
nullptr) {}
507 m_writer =
new DumpWUCD(subDomain(),subDomain()->defaultMesh(),
#define ARCANE_REGISTER_SUB_DOMAIN_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
#define ARCANE_REGISTER_CASE_OPTIONS_NOAXL_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Classe gérant un répertoire.
virtual bool createDirectory() const
Créé le répertoire.
VariableList m_save_variables
Liste des variables a exporter.
UniqueArray< Ref< OStringStream > > m_cell_streams
Valeur des var. aux mailles.
UniqueArray< Ref< OStringStream > > m_node_streams
Valeur des var. aux noeuds.
void writeVal(IVariable &, ConstArrayView< Byte >) override
Ecriture pour la variable v du tableau a.
RealUniqueArray m_times
Liste des instants de temps.
Directory m_base_directory
Nom du répertoire de stockage.
UniqueArray< Cell > m_managed_cells
Liste des mailles gerees.
void beginWrite() override
Creation du fichier UCD (nomme UCD_<no_iteration>) et de son entete. Cette entete contient :
void endWrite() override
Concatenation du flux contenant les donnees des mailles au fichier principal.
void setMetaData(const String &meta_data) override
Positionne les infos des méta-données.
wrapper transformant des appels à l'interface IDataWriter en ex IDumpW
Interface d'écriture des données d'une variable.
virtual Integer nbNode()=0
Nombre de noeuds du maillage.
virtual CellGroup allCells()=0
Groupe de toutes les mailles.
Interface d'un écrivain pour les informations de post-traitement.
Interface du gestionnaire d'un sous-domaine.
Interface d'une variable.
virtual eDataType dataType() const =0
Type de la donnée gérée par la variable (Real, Integer, ...)
virtual eItemKind itemKind() const =0
Type des entités du maillage sur lequel repose la variable.
virtual Integer dimension() const =0
Dimension de la variable.
virtual String name() const =0
Nom de la variable.
Node node(Int32 i) const
i-ème noeud de l'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.
Int16 type() const
Type de l'entité
Flot de sortie lié à une String.
virtual RealConstArrayView times()
Liste des temps sauvés.
virtual const String & baseDirectoryName()
Nom du répertoire de sortie des fichiers.
virtual VariableCollection variables()
Liste des variables à sauver.
Classe gérant un vecteur de réel de dimension 3.
Structure contenant les informations pour créer un service.
Chaîne de caractères unicode.
const char * localstr() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Classe d'accès aux traces.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
Post-traitement au format UCD.
void notifyBeginWrite() override
Notifie qu'une sortie va être effectuée avec les paramètres courants.
IDataWriter * dataWriter() override
Retourne l'écrivain associé à ce post-processeur.
void close() override
Ferme l'écrivain. Après fermeture, il ne peut plus être utilisé
void notifyEndWrite() override
Notifie qu'une sortie vient d'être effectuée.
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
UniqueArray< Real > RealUniqueArray
Tableau dynamique à une dimension de réels.
eItemKind
Genre d'entité de maillage.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
eDataType
Type d'une donnée.
@ DT_Real3
Donnée de type vecteur 3.
@ DT_Real
Donnée de type réel.
ConstArrayView< Real > RealConstArrayView
Equivalent C d'un tableau à une dimension de réels.
Real y
deuxième composante du triplet
Real z
troisième composante du triplet
Real x
première composante du triplet