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"
27#include "arcane/IDataWriter.h"
28#include "arcane/Item.h"
29#include "arcane/ItemEnumerator.h"
30#include "arcane/IVariable.h"
31#include "arcane/ISubDomain.h"
32#include "arcane/IMesh.h"
33#include "arcane/IMeshSubMeshTransition.h"
34#include "arcane/StdNum.h"
35#include "arcane/ItemGroup.h"
36#include "arcane/IParallelMng.h"
37#include "arcane/Directory.h"
38#include "arcane/MeshVariable.h"
39#include "arcane/PostProcessorWriterBase.h"
40#include "arcane/Service.h"
41#include "arcane/SimpleProperty.h"
42#include "arcane/IItemFamily.h"
43#include "arcane/VariableCollection.h"
44#include "arcane/SharedVariable.h"
46#include "arcane/FactoryService.h"
47#include "arcane/ServiceFactory.h"
49#include "arcane/std/Ensight7PostProcessor_axl.h"
50#include "arcane/std/DumpW.h"
54#include <unordered_map>
102 static const int int_width = 10;
103 static const int g_line_length = 80;
123 EnsightPart(
const EnsightPart& part)
128 , m_reindex(part.m_reindex)
135 inline int type()
const {
return m_type; }
140 inline bool hasReindex()
const {
return !m_reindex.empty(); }
141 inline void setReindex(
Integer* reindex)
145 m_reindex[i] = reindex[i];
179 _init(use_degenerated_hexa);
185 n += m_parts[i].items().size();
188 const EnsightPart& typeInfo(
Integer i)
const {
return m_parts[i]; }
189 EnsightPart& typeInfo(
Integer i) {
return m_parts[i]; }
190 ItemGroup group()
const {
return m_group; }
192 Int32 generalItemTypeId(
const Item& item)
const
197 EnsightPart* getTypeInfo(
int type) {
198 auto ensight_part_element = m_parts_map.find(type);
199 if (ensight_part_element != m_parts_map.end())
200 return ensight_part_element->second;
210 bool m_is_polygonal_type_registration_done =
false;
211 bool m_is_polyhedral_type_registration_done =
false;
215 std::unordered_map<TypeId, EnsightPart*> m_parts_map;
220 for (
auto& ensight_part : m_parts) {
221 m_parts_map[ensight_part.type()] = &ensight_part;
225 void _init(
bool use_degenerated_hexa)
234 m_parts.add(
EnsightPart(IT_Triangle3, 3,
"tria3"));
236 m_parts.add(
EnsightPart(IT_Pentagon5, 5,
"nsided"));
237 m_parts.add(
EnsightPart(IT_Hexagon6, 6,
"nsided"));
238 m_parts.add(
EnsightPart(IT_Heptagon7, 7,
"nsided"));
239 m_parts.add(
EnsightPart(IT_Octogon8, 8,
"nsided"));
250 if (!m_is_polygonal_type_registration_done) {
252 ItemWithNodes item = iitem->toItemWithNodes();
253 if (item.nbNode() == item.itemBase().nbEdge()) {
255 m_parts.
add(EnsightPart(type_id++, item.nbNode(),
"nsided"));
258 m_is_polygonal_type_registration_done =
true;
261 m_parts.add(EnsightPart(IT_Tetraedron4, 4,
"tetra4"));
262 m_parts.add(EnsightPart(IT_Pyramid5, 5,
"pyramid5"));
263 m_parts.add(EnsightPart(IT_Pentaedron6, 6,
"penta6"));
264 m_parts.add(EnsightPart(IT_Hexaedron8, 8,
"hexa8"));
265 if (use_degenerated_hexa) {
266 m_parts.add(EnsightPart(IT_HemiHexa7, 8,
"hexa8"));
268 Integer reindex[8] = { 1, 6, 5, 0, 2, 3, 4, 0 };
269 m_parts[m_parts.size() - 1].setReindex(reindex);
271 m_parts.add(EnsightPart(IT_HemiHexa6, 8,
"hexa8"));
273 Integer reindex[8] = { 0, 1, 3, 5, 0, 2, 3, 4 };
274 m_parts[m_parts.size() - 1].setReindex(reindex);
276 m_parts.add(EnsightPart(IT_HemiHexa5, 8,
"hexa8"));
278 Integer reindex[8] = { 0, 1, 3, 4, 0, 2, 3, 4 };
279 m_parts[m_parts.size() - 1].setReindex(reindex);
281 m_parts.add(EnsightPart(IT_AntiWedgeLeft6, 8,
"hexa8"));
283 Integer reindex[8] = { 2, 0, 1, 2, 5, 3, 4, 4 };
284 m_parts[m_parts.size() - 1].setReindex(reindex);
286 m_parts.add(EnsightPart(IT_AntiWedgeRight6, 8,
"hexa8"));
288 Integer reindex[8] = { 2, 0, 1, 1, 5, 3, 4, 5 };
289 m_parts[m_parts.size() - 1].setReindex(reindex);
291 m_parts.add(EnsightPart(IT_DiTetra5, 8,
"hexa8"));
293 Integer reindex[8] = { 4, 4, 2, 3, 0, 1, 1, 3 };
294 m_parts[m_parts.size() - 1].setReindex(reindex);
298 m_parts.add(EnsightPart(IT_HemiHexa7, 7,
"nfaced"));
299 m_parts.add(EnsightPart(IT_HemiHexa6, 6,
"nfaced"));
300 m_parts.add(EnsightPart(IT_HemiHexa5, 5,
"nfaced"));
301 m_parts.add(EnsightPart(IT_AntiWedgeLeft6, 6,
"nfaced"));
302 m_parts.add(EnsightPart(IT_AntiWedgeRight6, 6,
"nfaced"));
303 m_parts.add(EnsightPart(IT_DiTetra5, 5,
"nfaced"));
305 m_parts.add(EnsightPart(IT_Heptaedron10, 10,
"nfaced"));
306 m_parts.add(EnsightPart(IT_Octaedron12, 12,
"nfaced"));
307 m_parts.add(EnsightPart(IT_Enneedron14, 14,
"nfaced"));
308 m_parts.add(EnsightPart(IT_Decaedron16, 16,
"nfaced"));
311 ItemTypeInfo* type_info = item_type_mng->
typeFromId(i_type);
312 if (type_info->nbLocalNode() != type_info->nbLocalEdge()) {
313 m_parts.add(EnsightPart(i_type, type_info->nbLocalNode(),
"nfaced"));
318 if (!m_is_polyhedral_type_registration_done) {
320 ItemWithNodes item = iitem->toItemWithNodes();
321 if (item.nbNode() == 1)
323 else if (item.nbNode() == 2)
325 else if (item.nbNode() != item.itemBase().nbEdge()) {
327 m_parts.add(EnsightPart(type_id++, item.nbNode(),
"nfaced"));
330 m_is_polyhedral_type_registration_done =
true;
343 void writeFileString(std::ostream& o,
const String& str);
344 void writeFileInt(std::ostream& o,
int value);
345 void writeFileDouble(std::ostream& o,
double value);
346 Integer writeDoubleSize()
const;
369 explicit WriteBase(DumpWEnsight7& dw)
376 WriteBase(
const WriteBase& wb)
380 virtual ~WriteBase() {}
384 virtual WriteBase* clone() = 0;
385 virtual void begin() { init(); }
386 virtual void end() {}
391 m_ofile.precision(5);
392 m_ofile.flags(std::ios::scientific);
394 virtual void putValue(std::ostream& ofile)
396 ofile << m_ofile.str();
398 std::ostream& stream() {
return m_ofile; }
403 std::ostringstream m_ofile;
410 template <
typename FromType>
420 WriteDouble(
const WriteDouble& wd)
425 WriteBase* clone()
override {
return new WriteDouble(*
this); }
433 inline void write(
Integer index)
436 int reindex = (*m_idx)[index];
447 for (
Item e : items) {
456 template <
typename FromType>
457 class WriteArrayDouble
468 WriteArrayDouble(
const WriteArrayDouble& wd)
471 , m_idim2(wd.m_idim2)
474 WriteBase* clone()
override {
return new WriteArrayDouble(*
this); }
486 int reindex = (*m_idx)[index];
497 for (
Item e : items) {
519 WriteReal3(
const WriteReal3& wd)
524 WriteBase* clone()
override {
return new WriteReal3(*
this); }
532 void begin()
override
536 xostr.flags(std::ios::scientific);
538 yostr.flags(std::ios::scientific);
540 zostr.flags(std::ios::scientific);
546 int reindex = (*m_idx)[index];
562 for (
Item i : items) {
569 m_ofile << xostr.str();
570 m_ofile << yostr.str();
571 m_ofile << zostr.str();
576 std::ostringstream xostr;
577 std::ostringstream yostr;
578 std::ostringstream zostr;
591 class WriteArrayReal3
602 WriteArrayReal3(
const WriteArrayReal3& wd)
605 , m_idim2(wd.m_idim2)
608 WriteBase* clone()
override {
return new WriteArrayReal3(*
this); }
617 void begin()
override
621 xostr.flags(std::ios::scientific);
623 yostr.flags(std::ios::scientific);
625 zostr.flags(std::ios::scientific);
628 inline void write(
Integer index)
631 int reindex = (*m_idx)[index];
645 for (
Item i : items) {
652 m_ofile << xostr.str();
653 m_ofile << yostr.str();
654 m_ofile << zostr.str();
659 std::ostringstream xostr;
660 std::ostringstream yostr;
661 std::ostringstream zostr;
675 bool is_binary,
bool is_parallel,
Integer fileset_size,
676 bool use_degenerated_hexa,
bool force_first_geometry,
bool save_uids);
683 void writeVal(IVariable&, ConstArrayView<Real2>)
override {}
684 void writeVal(IVariable&, ConstArrayView<Real3>)
override;
688 void writeVal(IVariable&, ConstArrayView<Real2x2>)
override {}
689 void writeVal(IVariable&, ConstArrayView<Real3x3>)
override {}
690 void writeVal(IVariable&, ConstArrayView<String>)
override {}
692 void writeVal(IVariable&, ConstArray2View<Byte>)
override {}
694 void writeVal(IVariable&, ConstArray2View<Real2>)
override {}
695 void writeVal(IVariable&, ConstArray2View<Real3>)
override;
699 void writeVal(IVariable&, ConstArray2View<Real2x2>)
override {}
700 void writeVal(IVariable&, ConstArray2View<Real3x3>)
override {}
702 void writeVal(IVariable&, ConstMultiArray2View<Byte>)
override {}
704 void writeVal(IVariable&, ConstMultiArray2View<Real2>)
override {}
705 void writeVal(IVariable&, ConstMultiArray2View<Real3> a)
override;
709 void writeVal(IVariable&, ConstMultiArray2View<Real2x2>)
override {}
710 void writeVal(IVariable&, ConstMultiArray2View<Real3x3>)
override {}
717 bool isMasterProcessor()
const {
return m_is_master; }
718 bool isOneFilePerTime()
const {
return m_fileset_size == 0; }
725 typedef UniqueArray<GroupPartInfo*> GroupPartInfoList;
734 std::ostringstream m_case_file_variables;
738 GroupPartInfoList m_parts;
744 bool m_use_degenerated_hexa;
745 bool m_force_first_geometry;
766 void _createCaseFile();
769 void _writeWildcardFilename(std::ostream& ofile,
const String& filename,
char joker =
'*');
770 int _fileOuttype()
const;
771 void _writeFileHeader(std::ostream& o,
bool write_c_binary);
772 bool _isNewBlocFile()
const;
775 void _saveGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
777 void _saveVariableOnGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
782 template <
typename T>
785 template <
typename T>
788 template <
typename T>
800 bool is_binary,
bool is_parallel_output,
Integer fileset_size,
801 bool use_degenerated_hexa,
bool force_first_geometry,
bool save_uids)
804 is_parallel_output, fileset_size, use_degenerated_hexa,
805 force_first_geometry, save_uids);
809createEnsight7(IMesh* m,
const String& f,
810 ConstArrayView<Real> times,
811 VariableCollection variables,
813 bool is_binary,
bool is_parallel_output,
Integer fileset_size,
814 bool use_degenerated_hexa,
bool force_first_geometry,
bool save_uids)
816 return new DumpWEnsight7(m, f, times, variables, groups, is_binary,
817 is_parallel_output, fileset_size, use_degenerated_hexa,
818 force_first_geometry, save_uids);
827 bool is_binary,
bool is_parallel_output,
Integer fileset_size,
828 bool use_degenerated_hexa,
bool force_first_geometry,
bool save_uids)
831, m_parallel_mng(
mesh->parallelMng())
832, m_base_directory(filename)
834, m_save_variables(variables.clone())
835, m_save_groups(groups.enumerator())
836, m_is_binary(is_binary)
839, m_is_parallel_output(is_parallel_output)
840, m_use_degenerated_hexa(use_degenerated_hexa)
841, m_force_first_geometry(force_first_geometry)
842, m_save_uids(save_uids)
843, m_total_nb_element(0)
845, m_fileset_size(fileset_size)
864 std::for_each(std::begin(m_parts), std::end(m_parts), Deleter());
920 Integer type_to_seek = type_info.type();
921 if (type_to_seek < nb_basic_item_types) {
924 if (e.
type() == type_to_seek)
931 if (current_grp.generalItemTypeId(e) == type_to_seek)
937 << nb_of_type <<
" items of type " << type_info.name();
939 if (type_to_seek < nb_basic_item_types) {
942 if (mi.
type() == type_to_seek) {
952 if (current_grp.generalItemTypeId(mi) == type_to_seek) {
969 auto item_type = item->type();
970 EnsightPart* ensight_part = current_grp.getTypeInfo(item_type);
974 ensight_part->items().add(item_wn);
1005_saveGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
1010 writeFileString(ofile,
"part");
1011 writeFileInt(ofile, ensight_grp.partId());
1012 if (isParallelOutput()) {
1015 std::ostringstream ostr;
1017 writeFileString(ofile, ostr.str().c_str());
1020 writeFileString(ofile, igrp.
name());
1027 const EnsightPart& type_info = ensight_grp.typeInfo(i);
1030 if (nb_sub_part == 0)
1033 String type_name = type_info.name();
1034 writeFileString(ofile, type_name);
1036 writeFileInt(ofile, nb_sub_part);
1042 writeFileInt(ofile,mi.
uniqueId()+1);
1046 if (type_name ==
"nfaced") {
1057 for (
Integer z = 0; z < nb_sub_part; ++z)
1058 writeFileInt(ofile, nb_face);
1062 for (
Item mi : items) {
1063 writeFileInt(ofile, mi.toCell().nbFace());
1070 for (
Item mi : items) {
1073 for (
Integer z = 0; z < nb_face; ++z)
1078 for (
Item mi : items) {
1081 writeFileInt(ofile, face.nbNode());
1088 for (
Item item : items) {
1089 Cell cell(item.toCell());
1093 for (
Integer z = 0; z < nb_face; ++z) {
1096 array_id.
resize(nb_node);
1097 for (
Integer y = 0; y < nb_node; ++y) {
1105 writeFileArray(ofile, array_id);
1110 for (
Item item : items) {
1113 for (
Integer z = 0; z < nb_face; ++z) {
1114 const Face local_face = cell.
face(z);
1116 array_id.
resize(nb_node);
1117 for (
Integer y = 0; y < nb_node; ++y) {
1118 array_id[y] = nodes_index[local_face.
node(y).
localId()];
1120 writeFileArray(ofile, array_id);
1125 else if (type_name ==
"nsided") {
1130 for (
Item mi : items) {
1133 writeFileInt(ofile, nb_node);
1136 for (
Item mi : items) {
1139 array_id.
resize(nb_node);
1140 for (
Integer z = 0; z < nb_node; ++z) {
1143 writeFileArray(ofile, array_id);
1149 Integer nb_node = type_info.nbNode();
1150 array_id.
resize(nb_node);
1155 if (type_info.hasReindex()) {
1157 for (
Item mi : items) {
1159 for (
Integer j = 0; j < nb_node; ++j) {
1160 array_id[j] = nodes_index[e.
node(reindex[j]).
localId()];
1162 writeFileArray(ofile, array_id);
1166 for (
Item mi : items) {
1168 for (
Integer j = 0; j < nb_node; ++j) {
1171 writeFileArray(ofile, array_id);
1206_saveVariableOnGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
1211 writeFileString(ofile,
"part");
1212 writeFileInt(ofile, ensight_grp.partId());
1220 const EnsightPart& type_info = ensight_grp.typeInfo(i);
1223 if (nb_sub_part == 0)
1225 String type_name = type_info.name();
1226 if (type_name != last_type_name) {
1230 func->putValue(ofile);
1232 last_type_name = type_name;
1233 writeFileString(ofile, type_name);
1234 func = from_func.clone();
1245 func->putValue(ofile);
1253writeFileInt(std::ostream& o,
int value)
1256 o.write((
const char*)&value,
sizeof(
int));
1259 o.width(DumpWEnsight7::int_width);
1273 return DumpWEnsight7::int_width + 1;
1280writeFileDouble(std::ostream& o,
double value)
1283 float fvalue = (float)(value);
1284 o.write((
const char*)&fvalue,
sizeof(
float));
1289 o.flags(std::ios::scientific);
1299writeDoubleSize()
const
1312 o.write((
const char*)value.data(),
sizeof(
Integer) * value.size());
1315 for (
Integer i = 0, s = value.size(); i < s; ++i) {
1316 o.width(DumpWEnsight7::int_width);
1327writeFileString(std::ostream& o,
const String& str)
1330 char buf[g_line_length];
1331 for (
int i = 0; i < g_line_length; ++i)
1334 buf[g_line_length - 1] =
'\0';
1335 o.write(buf, g_line_length);
1346_writeFileHeader(std::ostream& o,
bool write_c_binary)
1349 if (_isNewBlocFile() &&
m_is_binary && write_c_binary)
1350 writeFileString(o,
"C Binary");
1351 if (m_fileset_size != 0) {
1352 std::ostringstream ostr;
1353 ostr <<
"BEGIN TIME STEP "
1355 writeFileString(o, ostr.str().c_str());
1369class DumpWEnsight7OutFile
1375 , m_filename(filename)
1376 , m_is_master(dw.isMasterProcessor())
1377 , m_is_parallel_output(dw.isParallelOutput())
1382 m_filestream =
new std::ofstream(filename.
localstr(), (std::ios_base::openmode)outtype);
1383 m_stream = &m_strstream;
1384 if (!(*m_filestream))
1385 m_dw.warning() <<
"Unable to open file " << filename;
1389 m_stream = &m_strstream;
1391 ARCANE_CHECK_PTR(m_stream);
1393 ~DumpWEnsight7OutFile()
1395 delete m_filestream;
1404 ARCANE_CHECK_PTR(m_filestream);
1405 ARCANE_CHECK_PTR(m_strstream);
1407 (*m_filestream) << m_strstream.str();
1409 if (m_is_parallel_output) {
1411 ARCANE_CHECK_PTR(m_filestream);
1419 for (
Integer i = 1; i < nb_proc; ++i) {
1420 m_dw.debug(
Trace::High) <<
"Waiting for length of processor " << i;
1421 parallel_mng->
recv(len_array, i);
1423 m_dw.debug(
Trace::High) <<
"Length of processor " << i <<
" : " << len;
1426 m_dw.debug(
Trace::High) <<
"Waiting for receving geom of processor " << i;
1427 parallel_mng->
recv(str_array, i);
1428 m_dw.debug(
Trace::High) <<
"Receving geom of processor " << i;
1429 m_filestream->write((
const char*)str_array.
data(), str_array.
size());
1434 ARCANE_CHECK_PTR(m_strstream);
1441 std::string str = m_strstream.str();
1450 m_dw.debug(
Trace::High) <<
"Not a master. " << m_filename <<
" size = " << len;
1454 m_dw.debug(
Trace::High) <<
"Sending length for processor 0";
1455 parallel_mng->send(len_array, 0);
1460 m_dw.debug(
Trace::High) <<
"Sending data for processor 0";
1461 parallel_mng->send(bytes, 0);
1467 if (!m_dw.isOneFilePerTime())
1468 m_dw.writeFileString(*m_filestream,
"END TIME STEP");
1473 std::ostream& operator()() {
return *m_stream; }
1480 bool m_is_parallel_output;
1481 std::ostream* m_stream;
1482 std::ostringstream m_strstream;
1483 std::ofstream* m_filestream;
1498 bool is_parallel = parallel_mng->
isParallel();
1529 if (!list_group.contains(var_group))
1530 list_group.add(var_group);
1536 _computeGroupParts(list_group, partid);
1541 for (
auto i : m_parts) {
1542 total_nb_element += i->totalNbElement();
1548 debug() <<
"Add nodes " <<
mesh->nbNode();
1552 if (!(
m_times.size() > 1 && m_force_first_geometry)) {
1558 _writeFileHeader(dw_ofile(),
true);
1561 writeFileString(dw_ofile(),
"Output ensight test");
1562 writeFileString(dw_ofile(),
"File description");
1563 writeFileString(dw_ofile(),
"node id assign");
1564 writeFileString(dw_ofile(),
"element id assign");
1574 all_nodes_index.
fill(0);
1578 if (
mesh->parentMesh()) {
1580 coords_backup.
resize(
mesh->nodeFamily()->maxLocalId());
1582 coords_backup[i_item.localId()] = nodes_coords[i_item];
1584 coords_array = coords_backup.
view();
1594 writeFileString(wf.stream(),
"coordinates");
1595 writeFileInt(wf.stream(), all_nodes.
size());
1602 const Item& item = *i_item;
1603 all_nodes_index[item.
localId()] = ensight_index;
1612 const Item& item = *i_item;
1613 writeFileInt(wf.stream(),item.
uniqueId()+1);
1619 const Item& item = *i_item;
1626 _saveGroup(dw_ofile(), *part, all_nodes_index, wf);
1628 dw_ofile.syncFile();
1642 cell_uids[icell] = (
Real)(icell->uniqueId().asInt64());
1648 write(cell_uid_var, cell_uid_var->
data());
1655 node_uids[inode] = inode->uniqueId().asInt32();
1656 node_uids2[inode.index()] = (
Real)inode->uniqueId().asInt64();
1673 warning() <<
"Unable to write to file: <" << buf <<
"> error: " <<
m_case_file.rdstate();
1680 if (m_fileset_size != 0)
1682 if (m_force_first_geometry)
1683 _writeWildcardFilename(
m_case_file,
"ensight.geo",
'0');
1685 _writeWildcardFilename(
m_case_file,
"ensight.geo",
'*');
1709 if (m_fileset_size != 0) {
1712 if (m_fileset_size != 0) {
1714 for (
Integer i = 0; i < nb_timeset; ++i) {
1716 m_case_file <<
"number of steps: " << m_fileset_size <<
'\n';
1719 m_case_file <<
"filename index: " << nb_timeset <<
"\n";
1720 m_case_file <<
"number of steps: " <<
m_times.size() - (nb_timeset * m_fileset_size) <<
'\n';
1784 if (m_fileset_size == 0) {
1800 ostr() << current_time;
1801 fn_builder += ostr.str();
1813 filename = fn_builder;
1825 return group_kind == item_kind;
1844 bool has_prot =
false;
1845 if (m_fileset_size != 0) {
1848 prot_index = (nb_time - 1) / m_fileset_size;
1860 ostr() << prot_index;
1875_writeWildcardFilename(std::ostream& ofile,
const String& filename,
char joker)
1877 if (m_fileset_size == 0) {
1878 ofile <<
' ' << filename <<
'/' << filename;
1889 if (nb_time <= m_fileset_size)
1893 ofile <<
"/" << filename;
1901_isNewBlocFile()
const
1907 if (m_fileset_size == 0)
1910 Integer modulo = (nb_time - 1) % m_fileset_size;
1923 return ((isBinary()) ? std::ios::binary : 0) | ((_isNewBlocFile()) ? std::ios::trunc : std::ios::app);
1931template <
typename T>
1935 debug() <<
"Saving variable1 " << v.
name() <<
" ptr=" << ptr.
data() <<
" ps=" << ptr.
size();
1943 debug() <<
"Saving variable " << v.
name() <<
" in " << filename;
1947 _writeFileHeader(dw_ofile(),
false);
1950 writeFileString(dw_ofile(), v.
name());
1957 var_type_str =
"scalar per element: ";
1960 var_type_str =
"scalar per node: ";
1966 m_case_file_variables << var_type_str;
1967 m_case_file_variables <<
" 1 ";
1968 if (m_fileset_size != 0)
1969 m_case_file_variables <<
" 1 ";
1970 m_case_file_variables << v.
name();
1971 _writeWildcardFilename(m_case_file_variables, v.
name());
1972 m_case_file_variables <<
'\n';
1987 bool need_save =
false;
1989 need_save = v.
itemGroup() == part->group();
1991 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
1993 _saveVariableOnGroup(dw_ofile(), *part, wf);
2005 writeFileString(dw_ofile(),
"part");
2006 writeFileInt(dw_ofile(), part->partId());
2007 writeFileString(dw_ofile(),
"coordinates");
2008 wf.putValue(dw_ofile());
2015 dw_ofile.syncFile();
2026template <
typename T>
2033 for (
Integer idim2 = 0; idim2 < ptr.dim2Size(); ++idim2) {
2038 debug() <<
"Saving variable " << v.
name() <<
" component " << idim2 <<
" in " << filename;
2042 _writeFileHeader(dw_ofile(),
false);
2045 writeFileString(dw_ofile(), vname);
2052 var_type_str =
"scalar per element: ";
2055 var_type_str =
"scalar per node: ";
2061 m_case_file_variables << var_type_str;
2062 m_case_file_variables <<
" 1 ";
2063 if (m_fileset_size != 0)
2064 m_case_file_variables <<
" 1 ";
2065 m_case_file_variables << vname;
2066 _writeWildcardFilename(m_case_file_variables, vname);
2067 m_case_file_variables <<
'\n';
2082 bool need_save =
false;
2084 need_save = v.
itemGroup() == part->group();
2086 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
2088 _saveVariableOnGroup(dw_ofile(), *part, wf);
2096 for (
Integer i = 0; i < ptr.dim1Size(); ++i)
2100 writeFileString(dw_ofile(),
"part");
2101 writeFileInt(dw_ofile(), part->partId());
2102 writeFileString(dw_ofile(),
"coordinates");
2103 wf.putValue(dw_ofile());
2110 dw_ofile.syncFile();
2122template <
typename T>
2131 warning() <<
"Impossible to write array variable "
2132 << v.
name() <<
" of non-constant size; variable saving skipped";
2149 debug() <<
"Saving variable " << v.
name() <<
" in " << filename;
2153 _writeFileHeader(dw_ofile(),
false);
2155 writeFileString(dw_ofile(), v.
name());
2161 m_case_file_variables <<
"vector per element: ";
2164 m_case_file_variables <<
"vector per node: ";
2170 m_case_file_variables <<
" 1 ";
2171 if (m_fileset_size != 0)
2172 m_case_file_variables <<
" 1 ";
2173 m_case_file_variables << v.
name();
2175 _writeWildcardFilename(m_case_file_variables, v.
name());
2176 m_case_file_variables <<
'\n';
2191 bool need_save =
false;
2193 need_save = v.
itemGroup() == part->group();
2195 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
2197 _saveVariableOnGroup(dw_ofile(), *part, wf);
2209 writeFileString(dw_ofile(),
"part");
2210 writeFileInt(dw_ofile(), part->partId());
2211 writeFileString(dw_ofile(),
"coordinates");
2212 wf.putValue(dw_ofile());
2219 dw_ofile.syncFile();
2233 for (
Integer idim2 = 0; idim2 < ptr.dim2Size(); ++idim2) {
2238 debug() <<
"Saving variable " << v.
name() <<
" component " << idim2 <<
" in " << filename;
2242 _writeFileHeader(dw_ofile(),
false);
2244 writeFileString(dw_ofile(), vname);
2250 m_case_file_variables <<
"vector per element: ";
2253 m_case_file_variables <<
"vector per node: ";
2259 m_case_file_variables <<
" 1 ";
2260 if (m_fileset_size != 0)
2261 m_case_file_variables <<
" 1 ";
2262 m_case_file_variables << vname;
2264 _writeWildcardFilename(m_case_file_variables, vname);
2265 m_case_file_variables <<
'\n';
2280 bool need_save =
false;
2282 need_save = v.
itemGroup() == part->group();
2284 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
2286 _saveVariableOnGroup(dw_ofile(), *part, wf);
2294 for (
Integer i = 0; i < ptr.dim1Size(); ++i)
2298 writeFileString(dw_ofile(),
"part");
2299 writeFileInt(dw_ofile(), part->partId());
2300 writeFileString(dw_ofile(),
"coordinates");
2301 wf.putValue(dw_ofile());
2308 dw_ofile.syncFile();
2328 warning() <<
"Impossible to write array variable " << v.
name()
2329 <<
" of non-constant size; variable saving skipped";
2337class Ensight7PostProcessorService
2338:
public PostProcessorWriterBase
2343 : PostProcessorWriterBase(sbi)
2344 , m_mesh(sbi.
mesh())
2366 bool is_binary =
true;
2368 bool is_parallel = subDomain()->parallelMng()->isParallel();
2369 bool use_degenerated_hexa =
true;
2370 bool force_first_geometry =
false;
2371 bool save_uids =
false;
2374 fileset_size, use_degenerated_hexa,
2375 force_first_geometry, save_uids);
2393class Ensight7PostProcessorServiceV2
2404 , m_mesh(sbi.
mesh())
2457 bool is_binary =
true;
2459 bool is_parallel = m_mesh->parallelMng()->isParallel();
2460 is_binary =
options()->binaryFile();
2461 fileset_size =
options()->filesetSize();
2462 bool use_degenerated_hexa =
options()->useDegeneratedHexa();
2463 bool force_first_geometry =
options()->forceFirstGeometry();
2464 bool save_uids =
options()->saveUids();
2467 use_degenerated_hexa, force_first_geometry, save_uids);
2481 Ensight7PostProcessor);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#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.
ConstIterT< ConstArrayView< T > > const_iter
Type d'un itérateur constant sur tout le tableau.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
interval d'itérateurs constant
Vue constante sur un MultiArray2.
Classe gérant un répertoire.
virtual bool createDirectory() const
Créé le répertoire.
Abstraction d'un fichier de sortie pour ensight.
Functor 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 for writing variable as a real variable.
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 build() override
Construction de niveau build du service.
void notifyBeginWrite() override
Notifie qu'une sortie va être effectuée avec les paramètres courants.
void setBaseDirectoryName(const String &dirname) override
Positionne le nom du répertoire de sortie des fichiers. Ce répertoire doit exister.
void close() override
Ferme l'écrivain. Après fermeture, il ne peut plus être utilisé
void setGroups(ItemGroupCollection groups) override
Positionne la liste des groupes à sortir.
void notifyEndWrite() override
Notifie qu'une sortie vient d'être effectuée.
void setVariables(VariableCollection variables) override
Positionne la liste des variables à sortir.
void setTimes(RealConstArrayView times) override
Positionne la liste des temps.
IDataWriter * dataWriter() override
Retourne l'écrivain associé à ce post-processeur.
const String & baseDirectoryName() override
Nom du répertoire de sortie des fichiers.
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 flottant.
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
Type 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 de 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.
virtual void build()
Construction de niveau build du service.
virtual RealConstArrayView times()
Liste des temps sauvés.
virtual void setGroups(ItemGroupCollection groups)
Positionne la liste des groupes à sortir.
virtual const String & baseDirectoryName()
Nom du répertoire de sortie des fichiers.
virtual void setVariables(VariableCollection variables)
Positionne la liste des variables à sortir.
virtual ItemGroupCollection groups()
Liste des groupes à sauver.
virtual void setTimes(RealConstArrayView times)
Positionne la liste des temps.
virtual void setBaseDirectoryName(const String &dirname)
Positionne le nom du répertoire de sortie des fichiers. Ce répertoire doit exister.
virtual VariableCollection variables()
Liste des variables à sauver.
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)
Converti r en un Real.
double toDouble(Real r)
Converti 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.