14#include "arcane/utils/StringBuilder.h"
15#include "arcane/utils/Enumerator.h"
16#include "arcane/utils/Iterator.h"
17#include "arcane/utils/List.h"
18#include "arcane/utils/ScopedPtr.h"
19#include "arcane/utils/PlatformUtils.h"
20#include "arcane/utils/Iostream.h"
21#include "arcane/utils/Deleter.h"
22#include "arcane/utils/ITraceMng.h"
23#include "arcane/utils/OStringStream.h"
24#include "arcane/utils/NotImplementedException.h"
25#include "arcane/utils/CStringUtils.h"
26#include "arcane/utils/Convert.h"
28#include "arcane/core/IDataWriter.h"
29#include "arcane/core/Item.h"
31#include "arcane/core/IVariable.h"
32#include "arcane/core/ISubDomain.h"
33#include "arcane/core/IMesh.h"
34#include "arcane/core/IMeshSubMeshTransition.h"
35#include "arcane/core/StdNum.h"
36#include "arcane/core/ItemGroup.h"
37#include "arcane/core/IParallelMng.h"
38#include "arcane/core/Directory.h"
39#include "arcane/core/MeshVariable.h"
40#include "arcane/core/PostProcessorWriterBase.h"
41#include "arcane/core/Service.h"
42#include "arcane/core/SimpleProperty.h"
43#include "arcane/core/IItemFamily.h"
44#include "arcane/core/VariableCollection.h"
45#include "arcane/core/SharedVariable.h"
47#include "arcane/core/FactoryService.h"
50#include "arcane/std/Ensight7PostProcessor_axl.h"
51#include "arcane/std/DumpW.h"
55#include <unordered_map>
104 static const int int_width = 10;
105 static const int g_line_length = 80;
125 EnsightPart(
const EnsightPart& part)
130 , m_reindex(part.m_reindex)
137 inline int type()
const {
return m_type; }
142 inline bool hasReindex()
const {
return !m_reindex.empty(); }
143 inline void setReindex(
Integer* reindex)
147 m_reindex[i] = reindex[i];
181 _init(use_degenerated_hexa);
187 n += m_parts[i].items().size();
190 const EnsightPart& typeInfo(
Integer i)
const {
return m_parts[i]; }
191 EnsightPart& typeInfo(
Integer i) {
return m_parts[i]; }
192 ItemGroup group()
const {
return m_group; }
194 Int32 generalItemTypeId(
const Item& item)
const
199 EnsightPart* getTypeInfo(
int type)
201 auto ensight_part_element = m_parts_map.find(type);
202 if (ensight_part_element != m_parts_map.end())
203 return ensight_part_element->second;
213 bool m_is_polygonal_type_registration_done =
false;
214 bool m_is_polyhedral_type_registration_done =
false;
218 std::unordered_map<TypeId, EnsightPart*> m_parts_map;
224 for (
auto& ensight_part : m_parts) {
225 m_parts_map[ensight_part.type()] = &ensight_part;
229 void _init(
bool use_degenerated_hexa)
238 m_parts.add(
EnsightPart(IT_Triangle3, 3,
"tria3"));
240 m_parts.add(
EnsightPart(IT_Pentagon5, 5,
"nsided"));
241 m_parts.add(
EnsightPart(IT_Hexagon6, 6,
"nsided"));
242 m_parts.add(
EnsightPart(IT_Heptagon7, 7,
"nsided"));
243 m_parts.add(
EnsightPart(IT_Octogon8, 8,
"nsided"));
254 if (!m_is_polygonal_type_registration_done) {
256 ItemWithNodes item = iitem->toItemWithNodes();
257 if (item.nbNode() == item.itemBase().nbEdge()) {
259 m_parts.
add(EnsightPart(type_id++, item.nbNode(),
"nsided"));
262 m_is_polygonal_type_registration_done =
true;
265 m_parts.add(EnsightPart(IT_Tetraedron4, 4,
"tetra4"));
266 m_parts.add(EnsightPart(IT_Pyramid5, 5,
"pyramid5"));
267 m_parts.add(EnsightPart(IT_Pentaedron6, 6,
"penta6"));
268 m_parts.add(EnsightPart(IT_Hexaedron8, 8,
"hexa8"));
269 if (use_degenerated_hexa) {
270 m_parts.add(EnsightPart(IT_HemiHexa7, 8,
"hexa8"));
272 Integer reindex[8] = { 1, 6, 5, 0, 2, 3, 4, 0 };
273 m_parts[m_parts.size() - 1].setReindex(reindex);
275 m_parts.add(EnsightPart(IT_HemiHexa6, 8,
"hexa8"));
277 Integer reindex[8] = { 0, 1, 3, 5, 0, 2, 3, 4 };
278 m_parts[m_parts.size() - 1].setReindex(reindex);
280 m_parts.add(EnsightPart(IT_HemiHexa5, 8,
"hexa8"));
282 Integer reindex[8] = { 0, 1, 3, 4, 0, 2, 3, 4 };
283 m_parts[m_parts.size() - 1].setReindex(reindex);
285 m_parts.add(EnsightPart(IT_AntiWedgeLeft6, 8,
"hexa8"));
287 Integer reindex[8] = { 2, 0, 1, 2, 5, 3, 4, 4 };
288 m_parts[m_parts.size() - 1].setReindex(reindex);
290 m_parts.add(EnsightPart(IT_AntiWedgeRight6, 8,
"hexa8"));
292 Integer reindex[8] = { 2, 0, 1, 1, 5, 3, 4, 5 };
293 m_parts[m_parts.size() - 1].setReindex(reindex);
295 m_parts.add(EnsightPart(IT_DiTetra5, 8,
"hexa8"));
297 Integer reindex[8] = { 4, 4, 2, 3, 0, 1, 1, 3 };
298 m_parts[m_parts.size() - 1].setReindex(reindex);
302 m_parts.add(EnsightPart(IT_HemiHexa7, 7,
"nfaced"));
303 m_parts.add(EnsightPart(IT_HemiHexa6, 6,
"nfaced"));
304 m_parts.add(EnsightPart(IT_HemiHexa5, 5,
"nfaced"));
305 m_parts.add(EnsightPart(IT_AntiWedgeLeft6, 6,
"nfaced"));
306 m_parts.add(EnsightPart(IT_AntiWedgeRight6, 6,
"nfaced"));
307 m_parts.add(EnsightPart(IT_DiTetra5, 5,
"nfaced"));
309 m_parts.add(EnsightPart(IT_Heptaedron10, 10,
"nfaced"));
310 m_parts.add(EnsightPart(IT_Octaedron12, 12,
"nfaced"));
311 m_parts.add(EnsightPart(IT_Enneedron14, 14,
"nfaced"));
312 m_parts.add(EnsightPart(IT_Decaedron16, 16,
"nfaced"));
315 ItemTypeInfo* type_info = item_type_mng->
typeFromId(i_type);
316 if (type_info->nbLocalNode() != type_info->nbLocalEdge()) {
317 m_parts.add(EnsightPart(i_type, type_info->nbLocalNode(),
"nfaced"));
322 if (!m_is_polyhedral_type_registration_done) {
324 ItemWithNodes item = iitem->toItemWithNodes();
325 if (item.nbNode() == 1)
327 else if (item.nbNode() == 2)
329 else if (item.typeInfo()->isPolyhedron()) {
331 m_parts.add(EnsightPart(type_id++, item.nbNode(),
"nfaced"));
333 else if (item.nbNode() != item.itemBase().nbEdge()) {
335 m_parts.add(EnsightPart(type_id++, item.nbNode(),
"nfaced"));
338 m_is_polyhedral_type_registration_done =
true;
351 void writeFileString(std::ostream& o,
const String& str);
352 void writeFileInt(std::ostream& o,
int value);
353 void writeFileDouble(std::ostream& o,
double value);
354 Integer writeDoubleSize()
const;
377 explicit WriteBase(DumpWEnsight7& dw)
384 WriteBase(
const WriteBase& wb)
388 virtual ~WriteBase() {}
392 virtual WriteBase* clone() = 0;
393 virtual void begin() { init(); }
394 virtual void end() {}
399 m_ofile.precision(5);
400 m_ofile.flags(std::ios::scientific);
402 virtual void putValue(std::ostream& ofile)
404 ofile << m_ofile.str();
406 std::ostream& stream() {
return m_ofile; }
411 std::ostringstream m_ofile;
418 template <
typename FromType>
428 WriteDouble(
const WriteDouble& wd)
433 WriteBase* clone()
override {
return new WriteDouble(*
this); }
441 inline void write(
Integer index)
444 int reindex = (*m_idx)[index];
455 for (
Item e : items) {
464 template <
typename FromType>
465 class WriteArrayDouble
476 WriteArrayDouble(
const WriteArrayDouble& wd)
479 , m_idim2(wd.m_idim2)
482 WriteBase* clone()
override {
return new WriteArrayDouble(*
this); }
494 int reindex = (*m_idx)[index];
505 for (
Item e : items) {
527 WriteReal3(
const WriteReal3& wd)
532 WriteBase* clone()
override {
return new WriteReal3(*
this); }
540 void begin()
override
544 xostr.flags(std::ios::scientific);
546 yostr.flags(std::ios::scientific);
548 zostr.flags(std::ios::scientific);
554 int reindex = (*m_idx)[index];
570 for (
Item i : items) {
577 m_ofile << xostr.str();
578 m_ofile << yostr.str();
579 m_ofile << zostr.str();
584 std::ostringstream xostr;
585 std::ostringstream yostr;
586 std::ostringstream zostr;
599 class WriteArrayReal3
610 WriteArrayReal3(
const WriteArrayReal3& wd)
613 , m_idim2(wd.m_idim2)
616 WriteBase* clone()
override {
return new WriteArrayReal3(*
this); }
624 void begin()
override
628 xostr.flags(std::ios::scientific);
630 yostr.flags(std::ios::scientific);
632 zostr.flags(std::ios::scientific);
635 inline void write(
Integer index)
638 int reindex = (*m_idx)[index];
652 for (
Item i : items) {
659 m_ofile << xostr.str();
660 m_ofile << yostr.str();
661 m_ofile << zostr.str();
666 std::ostringstream xostr;
667 std::ostringstream yostr;
668 std::ostringstream zostr;
682 bool is_binary,
bool is_parallel,
Integer fileset_size,
683 bool use_degenerated_hexa,
bool force_first_geometry,
bool save_uids);
690 void writeVal(IVariable&, ConstArrayView<Real2>)
override {}
691 void writeVal(IVariable&, ConstArrayView<Real3>)
override;
695 void writeVal(IVariable&, ConstArrayView<Real2x2>)
override {}
696 void writeVal(IVariable&, ConstArrayView<Real3x3>)
override {}
697 void writeVal(IVariable&, ConstArrayView<String>)
override {}
699 void writeVal(IVariable&, ConstArray2View<Byte>)
override {}
701 void writeVal(IVariable&, ConstArray2View<Real2>)
override {}
702 void writeVal(IVariable&, ConstArray2View<Real3>)
override;
706 void writeVal(IVariable&, ConstArray2View<Real2x2>)
override {}
707 void writeVal(IVariable&, ConstArray2View<Real3x3>)
override {}
709 void writeVal(IVariable&, ConstMultiArray2View<Byte>)
override {}
711 void writeVal(IVariable&, ConstMultiArray2View<Real2>)
override {}
712 void writeVal(IVariable&, ConstMultiArray2View<Real3> a)
override;
716 void writeVal(IVariable&, ConstMultiArray2View<Real2x2>)
override {}
717 void writeVal(IVariable&, ConstMultiArray2View<Real3x3>)
override {}
724 bool isMasterProcessor()
const {
return m_is_master; }
725 bool isOneFilePerTime()
const {
return m_fileset_size == 0; }
732 typedef UniqueArray<GroupPartInfo*> GroupPartInfoList;
741 std::ostringstream m_case_file_variables;
745 GroupPartInfoList m_parts;
751 bool m_use_degenerated_hexa;
752 bool m_force_first_geometry;
773 void _createCaseFile();
776 void _writeWildcardFilename(std::ostream& ofile,
const String& filename,
char joker =
'*');
777 int _fileOuttype()
const;
778 void _writeFileHeader(std::ostream& o,
bool write_c_binary);
779 bool _isNewBlocFile()
const;
782 void _saveGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
784 void _saveVariableOnGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
789 template <
typename T>
792 template <
typename T>
795 template <
typename T>
807 bool is_binary,
bool is_parallel_output,
Integer fileset_size,
808 bool use_degenerated_hexa,
bool force_first_geometry,
bool save_uids)
811 is_parallel_output, fileset_size, use_degenerated_hexa,
812 force_first_geometry, save_uids);
816createEnsight7(IMesh* m,
const String& f,
817 ConstArrayView<Real> times,
818 VariableCollection variables,
820 bool is_binary,
bool is_parallel_output,
Integer fileset_size,
821 bool use_degenerated_hexa,
bool force_first_geometry,
bool save_uids)
823 return new DumpWEnsight7(m, f, times, variables, groups, is_binary,
824 is_parallel_output, fileset_size, use_degenerated_hexa,
825 force_first_geometry, save_uids);
834 bool is_binary,
bool is_parallel_output,
Integer fileset_size,
835 bool use_degenerated_hexa,
bool force_first_geometry,
bool save_uids)
838, m_parallel_mng(
mesh->parallelMng())
839, m_base_directory(filename)
841, m_save_variables(variables.clone())
842, m_save_groups(groups.enumerator())
843, m_is_binary(is_binary)
846, m_is_parallel_output(is_parallel_output)
847, m_use_degenerated_hexa(use_degenerated_hexa)
848, m_force_first_geometry(force_first_geometry)
849, m_save_uids(save_uids)
850, m_total_nb_element(0)
852, m_fileset_size(fileset_size)
871 std::for_each(std::begin(m_parts), std::end(m_parts), Deleter());
922 debug(
Trace::High) <<
"Utilisation de l'algorithme standard de construction de groupe de parties";
928 Integer type_to_seek = type_info.type();
931 if (e.
type() == type_to_seek)
936 << nb_of_type <<
" éléments de type " << type_info.name();
940 if (mi.
type() == type_to_seek) {
950 const Item& item = *i2;
951 auto item_type = current_grp.generalItemTypeId(item);
952 EnsightPart* ensight_part = current_grp.getTypeInfo(item_type);
956 ensight_part->items().add(item_wn);
963 debug(
Trace::High) <<
"Utilisation de l'algorithme de construction de groupe de parties avec types supplémentaires";
968 auto item_type = item->type();
969 EnsightPart* ensight_part = current_grp.getTypeInfo(item_type);
973 ensight_part->items().add(item_wn);
1004_saveGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
1009 writeFileString(ofile,
"part");
1010 writeFileInt(ofile, ensight_grp.partId());
1011 if (isParallelOutput()) {
1014 std::ostringstream ostr;
1016 writeFileString(ofile, ostr.str().c_str());
1019 writeFileString(ofile, igrp.
name());
1026 const EnsightPart& type_info = ensight_grp.typeInfo(i);
1029 if (nb_sub_part == 0)
1032 String type_name = type_info.name();
1033 writeFileString(ofile, type_name);
1035 writeFileInt(ofile, nb_sub_part);
1041 writeFileInt(ofile,mi.
uniqueId()+1);
1045 if (type_name ==
"nfaced") {
1056 for (
Integer z = 0; z < nb_sub_part; ++z)
1057 writeFileInt(ofile, nb_face);
1061 for (
Item mi : items) {
1062 writeFileInt(ofile, mi.toCell().nbFace());
1069 for (
Item mi : items) {
1072 for (
Integer z = 0; z < nb_face; ++z)
1077 for (
Item mi : items) {
1080 writeFileInt(ofile, face.nbNode());
1087 for (
Item item : items) {
1088 Cell cell(item.toCell());
1092 for (
Integer z = 0; z < nb_face; ++z) {
1095 array_id.
resize(nb_node);
1096 for (
Integer y = 0; y < nb_node; ++y) {
1104 writeFileArray(ofile, array_id);
1109 for (
Item item : items) {
1112 for (
Integer z = 0; z < nb_face; ++z) {
1113 const Face local_face = cell.
face(z);
1115 array_id.
resize(nb_node);
1116 for (
Integer y = 0; y < nb_node; ++y) {
1117 array_id[y] = nodes_index[local_face.
node(y).
localId()];
1119 writeFileArray(ofile, array_id);
1124 else if (type_name ==
"nsided") {
1129 for (
Item mi : items) {
1132 writeFileInt(ofile, nb_node);
1135 for (
Item mi : items) {
1138 array_id.
resize(nb_node);
1139 for (
Integer z = 0; z < nb_node; ++z) {
1142 writeFileArray(ofile, array_id);
1148 Integer nb_node = type_info.nbNode();
1149 array_id.
resize(nb_node);
1154 if (type_info.hasReindex()) {
1156 for (
Item mi : items) {
1158 for (
Integer j = 0; j < nb_node; ++j) {
1159 array_id[j] = nodes_index[e.
node(reindex[j]).
localId()];
1161 writeFileArray(ofile, array_id);
1165 for (
Item mi : items) {
1167 for (
Integer j = 0; j < nb_node; ++j) {
1170 writeFileArray(ofile, array_id);
1205_saveVariableOnGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
1210 writeFileString(ofile,
"part");
1211 writeFileInt(ofile, ensight_grp.partId());
1219 const EnsightPart& type_info = ensight_grp.typeInfo(i);
1222 if (nb_sub_part == 0)
1224 String type_name = type_info.name();
1225 if (type_name != last_type_name) {
1229 func->putValue(ofile);
1231 last_type_name = type_name;
1232 writeFileString(ofile, type_name);
1233 func = from_func.clone();
1244 func->putValue(ofile);
1252writeFileInt(std::ostream& o,
int value)
1255 o.write((
const char*)&value,
sizeof(
int));
1258 o.width(DumpWEnsight7::int_width);
1272 return DumpWEnsight7::int_width + 1;
1279writeFileDouble(std::ostream& o,
double value)
1282 float fvalue = (float)(value);
1283 o.write((
const char*)&fvalue,
sizeof(
float));
1288 o.flags(std::ios::scientific);
1298writeDoubleSize()
const
1311 o.write((
const char*)value.data(),
sizeof(
Integer) * value.size());
1314 for (
Integer i = 0, s = value.size(); i < s; ++i) {
1315 o.width(DumpWEnsight7::int_width);
1326writeFileString(std::ostream& o,
const String& str)
1329 char buf[g_line_length];
1330 for (
int i = 0; i < g_line_length; ++i)
1333 buf[g_line_length - 1] =
'\0';
1334 o.write(buf, g_line_length);
1345_writeFileHeader(std::ostream& o,
bool write_c_binary)
1348 if (_isNewBlocFile() &&
m_is_binary && write_c_binary)
1349 writeFileString(o,
"C Binary");
1350 if (m_fileset_size != 0) {
1351 std::ostringstream ostr;
1352 ostr <<
"BEGIN TIME STEP "
1354 writeFileString(o, ostr.str().c_str());
1368class DumpWEnsight7OutFile
1374 , m_filename(filename)
1375 , m_is_master(dw.isMasterProcessor())
1376 , m_is_parallel_output(dw.isParallelOutput())
1381 m_filestream =
new std::ofstream(filename.
localstr(), (std::ios_base::openmode)outtype);
1382 m_stream = &m_strstream;
1383 if (!(*m_filestream))
1384 m_dw.warning() <<
"Unable to open file " << filename;
1388 m_stream = &m_strstream;
1390 ARCANE_CHECK_PTR(m_stream);
1392 ~DumpWEnsight7OutFile()
1394 delete m_filestream;
1403 ARCANE_CHECK_PTR(m_filestream);
1404 ARCANE_CHECK_PTR(m_strstream);
1406 (*m_filestream) << m_strstream.str();
1408 if (m_is_parallel_output) {
1410 ARCANE_CHECK_PTR(m_filestream);
1418 for (
Integer i = 1; i < nb_proc; ++i) {
1419 m_dw.debug(
Trace::High) <<
"En attente de la longueur du processeur " << i;
1420 parallel_mng->
recv(len_array, i);
1422 m_dw.debug(
Trace::High) <<
"Longueur du processeur " << i <<
" : " << len;
1425 m_dw.debug(
Trace::High) <<
"En attente de la réception de la géométrie du processeur " << i;
1426 parallel_mng->
recv(str_array, i);
1427 m_dw.debug(
Trace::High) <<
"Réception de la géométrie du processeur " << i;
1428 m_filestream->write((
const char*)str_array.
data(), str_array.
size());
1433 ARCANE_CHECK_PTR(m_strstream);
1440 std::string str = m_strstream.str();
1449 m_dw.debug(
Trace::High) <<
"Pas un maître. Taille de " << m_filename <<
" = " << len;
1453 m_dw.debug(
Trace::High) <<
"Envoi de la longueur pour le processeur 0";
1454 parallel_mng->send(len_array, 0);
1459 m_dw.debug(
Trace::High) <<
"Envoi des données pour le processeur 0";
1460 parallel_mng->send(bytes, 0);
1466 if (!m_dw.isOneFilePerTime())
1467 m_dw.writeFileString(*m_filestream,
"END TIME STEP");
1472 std::ostream& operator()() {
return *m_stream; }
1479 bool m_is_parallel_output;
1480 std::ostream* m_stream;
1481 std::ostringstream m_strstream;
1482 std::ofstream* m_filestream;
1497 bool is_parallel = parallel_mng->
isParallel();
1528 if (!list_group.contains(var_group))
1529 list_group.add(var_group);
1535 _computeGroupParts(list_group, partid);
1540 for (
auto i : m_parts) {
1541 total_nb_element += i->totalNbElement();
1547 debug() <<
"Ajout de nœuds " <<
mesh->nbNode();
1551 if (!(
m_times.size() > 1 && m_force_first_geometry)) {
1557 _writeFileHeader(dw_ofile(),
true);
1560 writeFileString(dw_ofile(),
"Output ensight test");
1561 writeFileString(dw_ofile(),
"File description");
1562 writeFileString(dw_ofile(),
"node id assign");
1563 writeFileString(dw_ofile(),
"element id assign");
1573 all_nodes_index.
fill(0);
1577 if (
mesh->parentMesh()) {
1579 coords_backup.
resize(
mesh->nodeFamily()->maxLocalId());
1581 coords_backup[i_item.localId()] = nodes_coords[i_item];
1583 coords_array = coords_backup.
view();
1593 writeFileString(wf.stream(),
"coordinates");
1594 writeFileInt(wf.stream(), all_nodes.
size());
1601 const Item& item = *i_item;
1602 all_nodes_index[item.
localId()] = ensight_index;
1611 const Item& item = *i_item;
1612 writeFileInt(wf.stream(),item.
uniqueId()+1);
1618 const Item& item = *i_item;
1625 _saveGroup(dw_ofile(), *part, all_nodes_index, wf);
1627 dw_ofile.syncFile();
1641 cell_uids[icell] = (
Real)(icell->uniqueId().asInt64());
1647 write(cell_uid_var, cell_uid_var->
data());
1654 node_uids[inode] = inode->uniqueId().asInt32();
1655 node_uids2[inode.index()] = (
Real)inode->uniqueId().asInt64();
1672 warning() <<
"Unable to write to file: <" << buf <<
"> error: " <<
m_case_file.rdstate();
1679 if (m_fileset_size != 0)
1681 if (m_force_first_geometry)
1682 _writeWildcardFilename(
m_case_file,
"ensight.geo",
'0');
1684 _writeWildcardFilename(
m_case_file,
"ensight.geo",
'*');
1708 if (m_fileset_size != 0) {
1711 if (m_fileset_size != 0) {
1713 for (
Integer i = 0; i < nb_timeset; ++i) {
1715 m_case_file <<
"number of steps: " << m_fileset_size <<
'\n';
1718 m_case_file <<
"filename index: " << nb_timeset <<
"\n";
1719 m_case_file <<
"number of steps: " <<
m_times.size() - (nb_timeset * m_fileset_size) <<
'\n';
1785 if (m_fileset_size == 0) {
1801 ostr() << current_time;
1802 fn_builder += ostr.str();
1814 filename = fn_builder;
1826 return group_kind == item_kind;
1845 bool has_prot =
false;
1846 if (m_fileset_size != 0) {
1849 prot_index = (nb_time - 1) / m_fileset_size;
1861 ostr() << prot_index;
1876_writeWildcardFilename(std::ostream& ofile,
const String& filename,
char joker)
1878 if (m_fileset_size == 0) {
1879 ofile <<
' ' << filename <<
'/' << filename;
1890 if (nb_time <= m_fileset_size)
1894 ofile <<
"/" << filename;
1902_isNewBlocFile()
const
1908 if (m_fileset_size == 0)
1911 Integer modulo = (nb_time - 1) % m_fileset_size;
1924 return ((isBinary()) ? std::ios::binary : 0) | ((_isNewBlocFile()) ? std::ios::trunc : std::ios::app);
1933template <
typename T>
1937 debug() <<
"Saving variable1 " << v.
name() <<
" ptr=" << ptr.
data() <<
" ps=" << ptr.
size();
1945 debug() <<
"Saving variable " << v.
name() <<
" in " << filename;
1949 _writeFileHeader(dw_ofile(),
false);
1952 writeFileString(dw_ofile(), v.
name());
1959 var_type_str =
"scalar per element: ";
1962 var_type_str =
"scalar per node: ";
1968 m_case_file_variables << var_type_str;
1969 m_case_file_variables <<
" 1 ";
1970 if (m_fileset_size != 0)
1971 m_case_file_variables <<
" 1 ";
1972 m_case_file_variables << v.
name();
1973 _writeWildcardFilename(m_case_file_variables, v.
name());
1974 m_case_file_variables <<
'\n';
1989 bool need_save =
false;
1991 need_save = v.
itemGroup() == part->group();
1993 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
1995 _saveVariableOnGroup(dw_ofile(), *part, wf);
2007 writeFileString(dw_ofile(),
"part");
2008 writeFileInt(dw_ofile(), part->partId());
2009 writeFileString(dw_ofile(),
"coordinates");
2010 wf.putValue(dw_ofile());
2017 dw_ofile.syncFile();
2029template <
typename T>
2036 for (
Integer idim2 = 0; idim2 < ptr.dim2Size(); ++idim2) {
2041 debug() <<
"Saving variable " << v.
name() <<
" component " << idim2 <<
" in " << filename;
2045 _writeFileHeader(dw_ofile(),
false);
2048 writeFileString(dw_ofile(), vname);
2055 var_type_str =
"scalar per element: ";
2058 var_type_str =
"scalar per node: ";
2064 m_case_file_variables << var_type_str;
2065 m_case_file_variables <<
" 1 ";
2066 if (m_fileset_size != 0)
2067 m_case_file_variables <<
" 1 ";
2068 m_case_file_variables << vname;
2069 _writeWildcardFilename(m_case_file_variables, vname);
2070 m_case_file_variables <<
'\n';
2085 bool need_save =
false;
2087 need_save = v.
itemGroup() == part->group();
2089 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
2091 _saveVariableOnGroup(dw_ofile(), *part, wf);
2099 for (
Integer i = 0; i < ptr.dim1Size(); ++i)
2103 writeFileString(dw_ofile(),
"part");
2104 writeFileInt(dw_ofile(), part->partId());
2105 writeFileString(dw_ofile(),
"coordinates");
2106 wf.putValue(dw_ofile());
2113 dw_ofile.syncFile();
2126template <
typename T>
2135 warning() <<
"Impossible to write array variable "
2136 << v.
name() <<
" of non-constant size; variable saving skipped";
2154 debug() <<
"Saving variable " << v.
name() <<
" in " << filename;
2158 _writeFileHeader(dw_ofile(),
false);
2160 writeFileString(dw_ofile(), v.
name());
2166 m_case_file_variables <<
"vector per element: ";
2169 m_case_file_variables <<
"vector per node: ";
2175 m_case_file_variables <<
" 1 ";
2176 if (m_fileset_size != 0)
2177 m_case_file_variables <<
" 1 ";
2178 m_case_file_variables << v.
name();
2180 _writeWildcardFilename(m_case_file_variables, v.
name());
2181 m_case_file_variables <<
'\n';
2196 bool need_save =
false;
2198 need_save = v.
itemGroup() == part->group();
2200 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
2202 _saveVariableOnGroup(dw_ofile(), *part, wf);
2214 writeFileString(dw_ofile(),
"part");
2215 writeFileInt(dw_ofile(), part->partId());
2216 writeFileString(dw_ofile(),
"coordinates");
2217 wf.putValue(dw_ofile());
2224 dw_ofile.syncFile();
2239 for (
Integer idim2 = 0; idim2 < ptr.dim2Size(); ++idim2) {
2244 debug() <<
"Saving variable " << v.
name() <<
" component " << idim2 <<
" in " << filename;
2248 _writeFileHeader(dw_ofile(),
false);
2250 writeFileString(dw_ofile(), vname);
2256 m_case_file_variables <<
"vector per element: ";
2259 m_case_file_variables <<
"vector per node: ";
2265 m_case_file_variables <<
" 1 ";
2266 if (m_fileset_size != 0)
2267 m_case_file_variables <<
" 1 ";
2268 m_case_file_variables << vname;
2270 _writeWildcardFilename(m_case_file_variables, vname);
2271 m_case_file_variables <<
'\n';
2286 bool need_save =
false;
2288 need_save = v.
itemGroup() == part->group();
2290 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
2292 _saveVariableOnGroup(dw_ofile(), *part, wf);
2300 for (
Integer i = 0; i < ptr.dim1Size(); ++i)
2304 writeFileString(dw_ofile(),
"part");
2305 writeFileInt(dw_ofile(), part->partId());
2306 writeFileString(dw_ofile(),
"coordinates");
2307 wf.putValue(dw_ofile());
2314 dw_ofile.syncFile();
2335 warning() <<
"Impossible to write array variable " << v.
name()
2336 <<
" of non-constant size; variable saving skipped";
2345class Ensight7PostProcessorService
2346:
public PostProcessorWriterBase
2351 : PostProcessorWriterBase(sbi)
2352 , m_mesh(sbi.
mesh())
2374 bool is_binary =
true;
2376 bool is_parallel = subDomain()->parallelMng()->isParallel();
2377 bool use_degenerated_hexa =
true;
2378 bool force_first_geometry =
false;
2379 bool save_uids =
false;
2382 fileset_size, use_degenerated_hexa,
2383 force_first_geometry, save_uids);
2402class Ensight7PostProcessorServiceV2
2413 , m_mesh(sbi.
mesh())
2431 IMesh* m_mesh =
nullptr;
2432 DumpW* m_writer =
nullptr;
2443 bool is_binary =
true;
2445 bool is_parallel = m_mesh->parallelMng()->isParallel();
2446 is_binary =
options()->binaryFile();
2447 fileset_size =
options()->filesetSize();
2448 bool use_degenerated_hexa =
options()->useDegeneratedHexa();
2449 bool force_first_geometry =
options()->forceFirstGeometry();
2450 bool save_uids =
options()->saveUids();
2453 use_degenerated_hexa, force_first_geometry, save_uids);
2467 Ensight7PostProcessor);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Ce fichier contient les différentes fabriques de services et macro pour enregistrer les services.
#define ARCANE_REGISTER_SUB_DOMAIN_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
Integer size() const
Nombre d'éléments du vecteur.
CaseOptionsEnsight7PostProcessor * options() const
Options du jeu de données du service.
ArcaneEnsight7PostProcessorObject(const Arcane::ServiceBuildInfo &sbi)
Constructeur.
Tableau d'items de types quelconques.
void fill(const DataType &data)
Remplissage du tableau.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
const T * data() const
Accès à la racine du tableau hors toute protection.
ArrayView< T > view() const
Vue mutable sur ce tableau.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
FaceConnectedListViewType faces() const
Liste des faces de la maille.
Face face(Int32 i) const
i-ème face de la maille
Int32 nbFace() const
Nombre de faces de la maille.
Integer count() const
Nombre d'éléments de la collection.
Vue pour un tableau 2D constant.
Vue constante d'un tableau de type T.
constexpr const_pointer data() const noexcept
Pointeur sur la mémoire allouée.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
ConstIterT< ConstArrayView< T > > const_iter
Type d'un itérateur constant sur tout le tableau.
interval d'itérateurs constant
Vue constante sur un MultiArray2.
Classe gérant un répertoire.
bool createDirectory() const override
Créé le répertoire.
Abstraction d'un fichier de sortie pour ensight.
Functeur pour écrire une variable de type Real.
Functor pour écrire une variable de type Real3.
Fonctor pour écrire une variable.
Functor pour écrire une variable de type Real.
Functor pour écrire une variable de type Real2.
Ecriture au format Ensight7.
void _writeRealValT(IVariable &v, ConstArrayView< T > a)
Template pour écrire une variable comme variable réelle.
std::ofstream m_case_file
Fichier décrivant le cas.
bool m_is_binary
Liste des parties.
void writeVal(IVariable &, ConstArrayView< Byte >) override
Ecriture pour la variable v du tableau a.
void beginWrite() override
Notifie le début d'écriture.
Directory m_part_directory
Répertoire de stockage de l'itération courante.
void _buildFileName(const String &varname, String &filename)
Construit le nom de fichier pour un nom de variable ou de maillage.
bool m_is_parallel_output
bool _isValidVariable(IVariable &) const
Vérifie la validité de la variable à sauvegarder.
ItemGroupList m_save_groups
Liste des groupes a exporter.
void _buildPartDirectory()
Construit le répertoire où seront sauvées les variables.
IParallelMng * m_parallel_mng
Gestionnaire du parallélisme.
void endWrite() override
Notifie la fin d'écriture.
RealUniqueArray m_times
description des variables sauvées
void setMetaData(const String &) override
Positionne les infos des méta-données.
VariableList m_save_variables
Liste des variables a exporter.
static const Integer m_max_prots_digit
Nombre maximum de chiffres pour indiquer le numéro de protection.
Directory m_base_directory
Nom du répertoire de stockage.
bool m_is_master
true si le processeur dirige la sortie
Integer m_total_nb_element
Nombre total d'éléments de maillage de tous les groupes à sauver.
Integer m_total_nb_group
Nombre de groupes à sauver (== nombre de part).
wrapper transformant des appels à l'interface IDataWriter en ex IDumpW
void write(IVariable *var, IData *data)
Ecrit les données data de la variable var.
Post-traitement au format Ensight7.
void notifyBeginWrite() override
Notifie qu'une sortie va être effectuée avec les paramètres courants.
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.
IDataWriter * dataWriter() override
Retourne l'écrivain associé à ce post-processeur.
void setMesh(IMesh *mesh) override
Positionne le maillage.
Post-traitement au format Ensight7.
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.
void notifyBeginWrite() override
Notifie qu'une sortie va être effectuée avec les paramètres courants.
Informations sur le type à virgule flottante.
Classe de base d'une table de hachage entre les items d'un groupe et leurs positions dans la table.
Interface d'écriture des données d'une variable.
virtual String name() const =0
Nom de la famille.
virtual ItemTypeMng * itemTypeMng() const =0
Gestionnaire de types d'entités associé
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual void recv(ArrayView< char > values, Int32 rank)=0
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.
Interface d'un écrivain pour les informations de post-traitement.
Interface du gestionnaire d'un sous-domaine.
virtual IMesh * defaultMesh()=0
Maillage par défaut.
Interface d'une variable.
virtual void setUsed(bool v)=0
Positionne l'état d'utilisation de la variable.
@ PTemporary
Indique que la variable est temporaire.
@ PPrivate
Indique que la variable est privée.
virtual eItemKind itemKind() const =0
Genre des entités du maillage sur lequel repose la variable.
virtual bool isPartial() const =0
Indique si la variable est partielle.
virtual IData * data()=0
Données associées à la variable.
virtual bool isUsed() const =0
Etat d'utilisation de la variable.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
virtual void notifyBeginWrite()=0
Notifie du début d'écriture de data().
virtual String name() const =0
Nom de la variable.
Groupe d'entités de maillage.
const String & name() const
Nom du groupe.
bool isOwn() const
Retourne si le groupe contient uniquement des éléments propres au sous-domaine.
SharedPtrT< GroupIndexTable > localIdToIndex() const
Table des local ids vers une position pour toutes les entités du groupe.
Integer size() const
Nombre d'éléments du groupe.
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul).
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
bool null() const
true is le groupe est le groupe nul
IMesh * mesh() const
Maillage auquel appartient ce groupe (0 pour le group nul).
ItemGroup own() const
Groupe équivalent à celui-ci mais contenant uniquement les éléments propres au sous-domaine.
Informations locales sur une face d'une maille.
Integer node(Integer i) const
Indice locale dans la maille du i-ème noeud de la face.
Integer nbNode() const
Nombre de noeuds de la face.
Infos sur un type d'entité du maillage.
LocalFace localFace(Integer id) const
Connectivité locale de la i-ème face de la maille.
Integer nbLocalEdge() const
Nombre d'arêtes de l'entité
Integer nbLocalNode() const
Nombre de noeuds de l'entité
Integer nbLocalFace() const
Nombre de faces de l'entité
Gestionnaire des types d'entités d'un maillage.
bool hasGeneralCells(IMesh *mesh) const
Indique si le maillage mesh contient des mailles génériques (en dehors des types intégrés ou addition...
static Integer nbBasicItemType()
nombre de types disponibles
ItemTypeInfo * typeFromId(Integer id) const
Type correspondant au numéro id.
static Integer nbBuiltInItemType()
nombre de types intégrés (hors types additionnels)
Elément de maillage s'appuyant sur des noeuds (Edge,Face,Cell).
Node node(Int32 i) const
i-ème noeud de l'entité
Int32 nbNode() const
Nombre de noeuds de l'entité
Classe de base d'un élément de maillage.
const ItemTypeInfo * typeInfo() const
Infos sur le type de l'entité.
constexpr Int32 localId() const
Identifiant local de l'entité dans le sous-domaine du processeur.
ItemWithNodes toItemWithNodes() const
Converti l'entité en le genre ItemWithNodes.
Cell toCell() const
Converti l'entité en le genre Cell.
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Int16 type() const
Type de l'entité
void clone(const Collection< T > &base)
Clone la collection base.
ListEnumeratorT< ItemGroup > Enumerator
Exception lorsqu'une fonction n'est pas implémentée.
Flot de sortie lié à une String.
ItemGroupCollection groups() override
Liste des groupes à sauver.
VariableCollection variables() override
Liste des variables à sauver.
ConstArrayView< Real > times() override
Liste des temps sauvés.
const String & baseDirectoryName() override
Nom du répertoire de sortie des fichiers.
T * get() const
Retourne l'objet référé par l'instance.
Encapsulation d'un pointeur qui se détruit automatiquement.
IMesh * mesh() const
Accès au IMesh associé.
Structure contenant les informations pour créer un service.
Constructeur de chaîne de caractère unicode.
String toString() const
Retourne la chaîne de caractères construite.
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 warning() const
Flot pour un message d'avertissement.
Vecteur 1D de données avec sémantique par valeur (style STL).
Paramètres nécessaires à la construction d'une variable.
IVariable * variable() const
Variable associée.
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
MeshVariableScalarRefT< Cell, Real > VariableCellReal
Grandeur au centre des mailles de type réel.
MeshVariableScalarRefT< Node, Integer > VariableNodeInteger
Grandeur au noeud de type entier.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
char * copyn(char *to, const char *from, Integer n)
Copie les n premiers caractères de from dans to.
Real toReal(Real r)
Convertit r en Real.
double toDouble(Real r)
Convertit un Real en double.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
Collection< ItemGroup > ItemGroupCollection
Collection de groupes d'éléments du maillage.
Int32 Integer
Type représentant un entier.
List< ItemGroup > ItemGroupList
Tableau de groupes d'éléments du maillage.
SharedMeshVariableScalarRefT< Node, Real3 > SharedVariableNodeReal3
Grandeur au noeud de type coordonnées.
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.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé
@ IK_Face
Entité de maillage de genre face.
@ IK_Edge
Entité de maillage de genre arête.
double Real
Type représentant un réel.
UniqueArray< Integer > IntegerUniqueArray
Tableau dynamique à une dimension d'entiers.
ConstArrayView< Integer > IntegerConstArrayView
Equivalent C d'un tableau à une dimension d'entiers.
std::int32_t Int32
Type entier signé sur 32 bits.
ConstArrayView< Real > RealConstArrayView
Equivalent C d'un tableau à une dimension de réels.
Correspondance entre le type des éléments ensight et Arcane.
int m_type
Type Arcane de l'élément.
UniqueArray< Item > m_items
Entités des éléments de ce type.
Integer m_nb_node
Nombre de noeud.
String m_name
Nom Ensight de cet élément.
Information pour partagé un groupe en éléments de même sous-type.
ItemGroup m_group
Groupe associé
Integer m_part_id
Numéro de la partie.
std::unique_ptr< VariableItemInt32 > m_general_item_types
Variable pour stocker les types des items généraux (non typés).
Integer nbType() const
Nombre de sous-types.