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();
923 if (e.
type() == type_to_seek)
928 << nb_of_type <<
" items of type " << type_info.name();
933 if (mi.
type() == type_to_seek) {
943 const Item& item = *i2;
944 auto item_type = current_grp.generalItemTypeId(item);
945 EnsightPart* ensight_part = current_grp.getTypeInfo(item_type);
949 ensight_part->items().add(item_wn);
961 auto item_type = item->type();
962 EnsightPart* ensight_part = current_grp.getTypeInfo(item_type);
966 ensight_part->items().add(item_wn);
997_saveGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
1002 writeFileString(ofile,
"part");
1003 writeFileInt(ofile, ensight_grp.partId());
1004 if (isParallelOutput()) {
1007 std::ostringstream ostr;
1009 writeFileString(ofile, ostr.str().c_str());
1012 writeFileString(ofile, igrp.
name());
1019 const EnsightPart& type_info = ensight_grp.typeInfo(i);
1022 if (nb_sub_part == 0)
1025 String type_name = type_info.name();
1026 writeFileString(ofile, type_name);
1028 writeFileInt(ofile, nb_sub_part);
1034 writeFileInt(ofile,mi.
uniqueId()+1);
1038 if (type_name ==
"nfaced") {
1049 for (
Integer z = 0; z < nb_sub_part; ++z)
1050 writeFileInt(ofile, nb_face);
1054 for (
Item mi : items) {
1055 writeFileInt(ofile, mi.toCell().nbFace());
1062 for (
Item mi : items) {
1065 for (
Integer z = 0; z < nb_face; ++z)
1070 for (
Item mi : items) {
1073 writeFileInt(ofile, face.nbNode());
1080 for (
Item item : items) {
1081 Cell cell(item.toCell());
1085 for (
Integer z = 0; z < nb_face; ++z) {
1088 array_id.
resize(nb_node);
1089 for (
Integer y = 0; y < nb_node; ++y) {
1097 writeFileArray(ofile, array_id);
1102 for (
Item item : items) {
1105 for (
Integer z = 0; z < nb_face; ++z) {
1106 const Face local_face = cell.
face(z);
1108 array_id.
resize(nb_node);
1109 for (
Integer y = 0; y < nb_node; ++y) {
1110 array_id[y] = nodes_index[local_face.
node(y).
localId()];
1112 writeFileArray(ofile, array_id);
1117 else if (type_name ==
"nsided") {
1122 for (
Item mi : items) {
1125 writeFileInt(ofile, nb_node);
1128 for (
Item mi : items) {
1131 array_id.
resize(nb_node);
1132 for (
Integer z = 0; z < nb_node; ++z) {
1135 writeFileArray(ofile, array_id);
1141 Integer nb_node = type_info.nbNode();
1142 array_id.
resize(nb_node);
1147 if (type_info.hasReindex()) {
1149 for (
Item mi : items) {
1151 for (
Integer j = 0; j < nb_node; ++j) {
1152 array_id[j] = nodes_index[e.
node(reindex[j]).
localId()];
1154 writeFileArray(ofile, array_id);
1158 for (
Item mi : items) {
1160 for (
Integer j = 0; j < nb_node; ++j) {
1163 writeFileArray(ofile, array_id);
1198_saveVariableOnGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
1203 writeFileString(ofile,
"part");
1204 writeFileInt(ofile, ensight_grp.partId());
1212 const EnsightPart& type_info = ensight_grp.typeInfo(i);
1215 if (nb_sub_part == 0)
1217 String type_name = type_info.name();
1218 if (type_name != last_type_name) {
1222 func->putValue(ofile);
1224 last_type_name = type_name;
1225 writeFileString(ofile, type_name);
1226 func = from_func.clone();
1237 func->putValue(ofile);
1245writeFileInt(std::ostream& o,
int value)
1248 o.write((
const char*)&value,
sizeof(
int));
1251 o.width(DumpWEnsight7::int_width);
1265 return DumpWEnsight7::int_width + 1;
1272writeFileDouble(std::ostream& o,
double value)
1275 float fvalue = (float)(value);
1276 o.write((
const char*)&fvalue,
sizeof(
float));
1281 o.flags(std::ios::scientific);
1291writeDoubleSize()
const
1304 o.write((
const char*)value.data(),
sizeof(
Integer) * value.size());
1307 for (
Integer i = 0, s = value.size(); i < s; ++i) {
1308 o.width(DumpWEnsight7::int_width);
1319writeFileString(std::ostream& o,
const String& str)
1322 char buf[g_line_length];
1323 for (
int i = 0; i < g_line_length; ++i)
1326 buf[g_line_length - 1] =
'\0';
1327 o.write(buf, g_line_length);
1338_writeFileHeader(std::ostream& o,
bool write_c_binary)
1341 if (_isNewBlocFile() &&
m_is_binary && write_c_binary)
1342 writeFileString(o,
"C Binary");
1343 if (m_fileset_size != 0) {
1344 std::ostringstream ostr;
1345 ostr <<
"BEGIN TIME STEP "
1347 writeFileString(o, ostr.str().c_str());
1361class DumpWEnsight7OutFile
1367 , m_filename(filename)
1368 , m_is_master(dw.isMasterProcessor())
1369 , m_is_parallel_output(dw.isParallelOutput())
1374 m_filestream =
new std::ofstream(filename.
localstr(), (std::ios_base::openmode)outtype);
1375 m_stream = &m_strstream;
1376 if (!(*m_filestream))
1377 m_dw.warning() <<
"Unable to open file " << filename;
1381 m_stream = &m_strstream;
1383 ARCANE_CHECK_PTR(m_stream);
1385 ~DumpWEnsight7OutFile()
1387 delete m_filestream;
1396 ARCANE_CHECK_PTR(m_filestream);
1397 ARCANE_CHECK_PTR(m_strstream);
1399 (*m_filestream) << m_strstream.str();
1401 if (m_is_parallel_output) {
1403 ARCANE_CHECK_PTR(m_filestream);
1411 for (
Integer i = 1; i < nb_proc; ++i) {
1412 m_dw.debug(
Trace::High) <<
"Waiting for length of processor " << i;
1413 parallel_mng->
recv(len_array, i);
1415 m_dw.debug(
Trace::High) <<
"Length of processor " << i <<
" : " << len;
1418 m_dw.debug(
Trace::High) <<
"Waiting for receving geom of processor " << i;
1419 parallel_mng->
recv(str_array, i);
1420 m_dw.debug(
Trace::High) <<
"Receving geom of processor " << i;
1421 m_filestream->write((
const char*)str_array.
data(), str_array.
size());
1426 ARCANE_CHECK_PTR(m_strstream);
1433 std::string str = m_strstream.str();
1442 m_dw.debug(
Trace::High) <<
"Not a master. " << m_filename <<
" size = " << len;
1446 m_dw.debug(
Trace::High) <<
"Sending length for processor 0";
1447 parallel_mng->send(len_array, 0);
1452 m_dw.debug(
Trace::High) <<
"Sending data for processor 0";
1453 parallel_mng->send(bytes, 0);
1459 if (!m_dw.isOneFilePerTime())
1460 m_dw.writeFileString(*m_filestream,
"END TIME STEP");
1465 std::ostream& operator()() {
return *m_stream; }
1472 bool m_is_parallel_output;
1473 std::ostream* m_stream;
1474 std::ostringstream m_strstream;
1475 std::ofstream* m_filestream;
1490 bool is_parallel = parallel_mng->
isParallel();
1521 if (!list_group.contains(var_group))
1522 list_group.add(var_group);
1528 _computeGroupParts(list_group, partid);
1533 for (
auto i : m_parts) {
1534 total_nb_element += i->totalNbElement();
1540 debug() <<
"Add nodes " <<
mesh->nbNode();
1544 if (!(
m_times.size() > 1 && m_force_first_geometry)) {
1550 _writeFileHeader(dw_ofile(),
true);
1553 writeFileString(dw_ofile(),
"Output ensight test");
1554 writeFileString(dw_ofile(),
"File description");
1555 writeFileString(dw_ofile(),
"node id assign");
1556 writeFileString(dw_ofile(),
"element id assign");
1566 all_nodes_index.
fill(0);
1570 if (
mesh->parentMesh()) {
1572 coords_backup.
resize(
mesh->nodeFamily()->maxLocalId());
1574 coords_backup[i_item.localId()] = nodes_coords[i_item];
1576 coords_array = coords_backup.
view();
1586 writeFileString(wf.stream(),
"coordinates");
1587 writeFileInt(wf.stream(), all_nodes.
size());
1594 const Item& item = *i_item;
1595 all_nodes_index[item.
localId()] = ensight_index;
1604 const Item& item = *i_item;
1605 writeFileInt(wf.stream(),item.
uniqueId()+1);
1611 const Item& item = *i_item;
1618 _saveGroup(dw_ofile(), *part, all_nodes_index, wf);
1620 dw_ofile.syncFile();
1634 cell_uids[icell] = (
Real)(icell->uniqueId().asInt64());
1640 write(cell_uid_var, cell_uid_var->
data());
1647 node_uids[inode] = inode->uniqueId().asInt32();
1648 node_uids2[inode.index()] = (
Real)inode->uniqueId().asInt64();
1665 warning() <<
"Unable to write to file: <" << buf <<
"> error: " <<
m_case_file.rdstate();
1672 if (m_fileset_size != 0)
1674 if (m_force_first_geometry)
1675 _writeWildcardFilename(
m_case_file,
"ensight.geo",
'0');
1677 _writeWildcardFilename(
m_case_file,
"ensight.geo",
'*');
1701 if (m_fileset_size != 0) {
1704 if (m_fileset_size != 0) {
1706 for (
Integer i = 0; i < nb_timeset; ++i) {
1708 m_case_file <<
"number of steps: " << m_fileset_size <<
'\n';
1711 m_case_file <<
"filename index: " << nb_timeset <<
"\n";
1712 m_case_file <<
"number of steps: " <<
m_times.size() - (nb_timeset * m_fileset_size) <<
'\n';
1776 if (m_fileset_size == 0) {
1792 ostr() << current_time;
1793 fn_builder += ostr.str();
1805 filename = fn_builder;
1817 return group_kind == item_kind;
1836 bool has_prot =
false;
1837 if (m_fileset_size != 0) {
1840 prot_index = (nb_time - 1) / m_fileset_size;
1852 ostr() << prot_index;
1867_writeWildcardFilename(std::ostream& ofile,
const String& filename,
char joker)
1869 if (m_fileset_size == 0) {
1870 ofile <<
' ' << filename <<
'/' << filename;
1881 if (nb_time <= m_fileset_size)
1885 ofile <<
"/" << filename;
1893_isNewBlocFile()
const
1899 if (m_fileset_size == 0)
1902 Integer modulo = (nb_time - 1) % m_fileset_size;
1915 return ((isBinary()) ? std::ios::binary : 0) | ((_isNewBlocFile()) ? std::ios::trunc : std::ios::app);
1923template <
typename T>
1927 debug() <<
"Saving variable1 " << v.
name() <<
" ptr=" << ptr.
data() <<
" ps=" << ptr.
size();
1935 debug() <<
"Saving variable " << v.
name() <<
" in " << filename;
1939 _writeFileHeader(dw_ofile(),
false);
1942 writeFileString(dw_ofile(), v.
name());
1949 var_type_str =
"scalar per element: ";
1952 var_type_str =
"scalar per node: ";
1958 m_case_file_variables << var_type_str;
1959 m_case_file_variables <<
" 1 ";
1960 if (m_fileset_size != 0)
1961 m_case_file_variables <<
" 1 ";
1962 m_case_file_variables << v.
name();
1963 _writeWildcardFilename(m_case_file_variables, v.
name());
1964 m_case_file_variables <<
'\n';
1979 bool need_save =
false;
1981 need_save = v.
itemGroup() == part->group();
1983 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
1985 _saveVariableOnGroup(dw_ofile(), *part, wf);
1997 writeFileString(dw_ofile(),
"part");
1998 writeFileInt(dw_ofile(), part->partId());
1999 writeFileString(dw_ofile(),
"coordinates");
2000 wf.putValue(dw_ofile());
2007 dw_ofile.syncFile();
2018template <
typename T>
2025 for (
Integer idim2 = 0; idim2 < ptr.dim2Size(); ++idim2) {
2030 debug() <<
"Saving variable " << v.
name() <<
" component " << idim2 <<
" in " << filename;
2034 _writeFileHeader(dw_ofile(),
false);
2037 writeFileString(dw_ofile(), vname);
2044 var_type_str =
"scalar per element: ";
2047 var_type_str =
"scalar per node: ";
2053 m_case_file_variables << var_type_str;
2054 m_case_file_variables <<
" 1 ";
2055 if (m_fileset_size != 0)
2056 m_case_file_variables <<
" 1 ";
2057 m_case_file_variables << vname;
2058 _writeWildcardFilename(m_case_file_variables, vname);
2059 m_case_file_variables <<
'\n';
2074 bool need_save =
false;
2076 need_save = v.
itemGroup() == part->group();
2078 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
2080 _saveVariableOnGroup(dw_ofile(), *part, wf);
2088 for (
Integer i = 0; i < ptr.dim1Size(); ++i)
2092 writeFileString(dw_ofile(),
"part");
2093 writeFileInt(dw_ofile(), part->partId());
2094 writeFileString(dw_ofile(),
"coordinates");
2095 wf.putValue(dw_ofile());
2102 dw_ofile.syncFile();
2114template <
typename T>
2123 warning() <<
"Impossible to write array variable "
2124 << v.
name() <<
" of non-constant size; variable saving skipped";
2141 debug() <<
"Saving variable " << v.
name() <<
" in " << filename;
2145 _writeFileHeader(dw_ofile(),
false);
2147 writeFileString(dw_ofile(), v.
name());
2153 m_case_file_variables <<
"vector per element: ";
2156 m_case_file_variables <<
"vector per node: ";
2162 m_case_file_variables <<
" 1 ";
2163 if (m_fileset_size != 0)
2164 m_case_file_variables <<
" 1 ";
2165 m_case_file_variables << v.
name();
2167 _writeWildcardFilename(m_case_file_variables, v.
name());
2168 m_case_file_variables <<
'\n';
2183 bool need_save =
false;
2185 need_save = v.
itemGroup() == part->group();
2187 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
2189 _saveVariableOnGroup(dw_ofile(), *part, wf);
2201 writeFileString(dw_ofile(),
"part");
2202 writeFileInt(dw_ofile(), part->partId());
2203 writeFileString(dw_ofile(),
"coordinates");
2204 wf.putValue(dw_ofile());
2211 dw_ofile.syncFile();
2225 for (
Integer idim2 = 0; idim2 < ptr.dim2Size(); ++idim2) {
2230 debug() <<
"Saving variable " << v.
name() <<
" component " << idim2 <<
" in " << filename;
2234 _writeFileHeader(dw_ofile(),
false);
2236 writeFileString(dw_ofile(), vname);
2242 m_case_file_variables <<
"vector per element: ";
2245 m_case_file_variables <<
"vector per node: ";
2251 m_case_file_variables <<
" 1 ";
2252 if (m_fileset_size != 0)
2253 m_case_file_variables <<
" 1 ";
2254 m_case_file_variables << vname;
2256 _writeWildcardFilename(m_case_file_variables, vname);
2257 m_case_file_variables <<
'\n';
2272 bool need_save =
false;
2274 need_save = v.
itemGroup() == part->group();
2276 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
2278 _saveVariableOnGroup(dw_ofile(), *part, wf);
2286 for (
Integer i = 0; i < ptr.dim1Size(); ++i)
2290 writeFileString(dw_ofile(),
"part");
2291 writeFileInt(dw_ofile(), part->partId());
2292 writeFileString(dw_ofile(),
"coordinates");
2293 wf.putValue(dw_ofile());
2300 dw_ofile.syncFile();
2320 warning() <<
"Impossible to write array variable " << v.
name()
2321 <<
" of non-constant size; variable saving skipped";
2329class Ensight7PostProcessorService
2330:
public PostProcessorWriterBase
2335 : PostProcessorWriterBase(sbi)
2336 , m_mesh(sbi.
mesh())
2358 bool is_binary =
true;
2360 bool is_parallel = subDomain()->parallelMng()->isParallel();
2361 bool use_degenerated_hexa =
true;
2362 bool force_first_geometry =
false;
2363 bool save_uids =
false;
2366 fileset_size, use_degenerated_hexa,
2367 force_first_geometry, save_uids);
2385class Ensight7PostProcessorServiceV2
2396 , m_mesh(sbi.
mesh())
2449 bool is_binary =
true;
2451 bool is_parallel = m_mesh->parallelMng()->isParallel();
2452 is_binary =
options()->binaryFile();
2453 fileset_size =
options()->filesetSize();
2454 bool use_degenerated_hexa =
options()->useDegeneratedHexa();
2455 bool force_first_geometry =
options()->forceFirstGeometry();
2456 bool save_uids =
options()->saveUids();
2459 use_degenerated_hexa, force_first_geometry, save_uids);
2473 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.
bool createDirectory() const override
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
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.
void setTimes(RealConstArrayView times) override
Positionne la liste des temps.
void setBaseDirectoryName(const String &dirname) override
Positionne le nom du répertoire de sortie des fichiers. Ce répertoire doit exister.
VariableCollection variables() override
Liste des variables à sauver.
void build() override
Construction de niveau build du service.
RealConstArrayView times() override
Liste des temps sauvés.
void setVariables(VariableCollection variables) override
Positionne la liste des variables à sortir.
const String & baseDirectoryName() override
Nom du répertoire de sortie des fichiers.
ItemGroupCollection groups() override
Liste des groupes à sauver.
void setGroups(ItemGroupCollection groups) override
Positionne la liste des groupes à sortir.
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.