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.nbNode() != item.itemBase().nbEdge()) {
331 m_parts.add(EnsightPart(type_id++, item.nbNode(),
"nfaced"));
334 m_is_polyhedral_type_registration_done =
true;
347 void writeFileString(std::ostream& o,
const String& str);
348 void writeFileInt(std::ostream& o,
int value);
349 void writeFileDouble(std::ostream& o,
double value);
350 Integer writeDoubleSize()
const;
373 explicit WriteBase(DumpWEnsight7& dw)
380 WriteBase(
const WriteBase& wb)
384 virtual ~WriteBase() {}
388 virtual WriteBase* clone() = 0;
389 virtual void begin() { init(); }
390 virtual void end() {}
395 m_ofile.precision(5);
396 m_ofile.flags(std::ios::scientific);
398 virtual void putValue(std::ostream& ofile)
400 ofile << m_ofile.str();
402 std::ostream& stream() {
return m_ofile; }
407 std::ostringstream m_ofile;
414 template <
typename FromType>
424 WriteDouble(
const WriteDouble& wd)
429 WriteBase* clone()
override {
return new WriteDouble(*
this); }
437 inline void write(
Integer index)
440 int reindex = (*m_idx)[index];
451 for (
Item e : items) {
460 template <
typename FromType>
461 class WriteArrayDouble
472 WriteArrayDouble(
const WriteArrayDouble& wd)
475 , m_idim2(wd.m_idim2)
478 WriteBase* clone()
override {
return new WriteArrayDouble(*
this); }
490 int reindex = (*m_idx)[index];
501 for (
Item e : items) {
523 WriteReal3(
const WriteReal3& wd)
528 WriteBase* clone()
override {
return new WriteReal3(*
this); }
536 void begin()
override
540 xostr.flags(std::ios::scientific);
542 yostr.flags(std::ios::scientific);
544 zostr.flags(std::ios::scientific);
550 int reindex = (*m_idx)[index];
566 for (
Item i : items) {
573 m_ofile << xostr.str();
574 m_ofile << yostr.str();
575 m_ofile << zostr.str();
580 std::ostringstream xostr;
581 std::ostringstream yostr;
582 std::ostringstream zostr;
595 class WriteArrayReal3
606 WriteArrayReal3(
const WriteArrayReal3& wd)
609 , m_idim2(wd.m_idim2)
612 WriteBase* clone()
override {
return new WriteArrayReal3(*
this); }
620 void begin()
override
624 xostr.flags(std::ios::scientific);
626 yostr.flags(std::ios::scientific);
628 zostr.flags(std::ios::scientific);
631 inline void write(
Integer index)
634 int reindex = (*m_idx)[index];
648 for (
Item i : items) {
655 m_ofile << xostr.str();
656 m_ofile << yostr.str();
657 m_ofile << zostr.str();
662 std::ostringstream xostr;
663 std::ostringstream yostr;
664 std::ostringstream zostr;
678 bool is_binary,
bool is_parallel,
Integer fileset_size,
679 bool use_degenerated_hexa,
bool force_first_geometry,
bool save_uids);
686 void writeVal(IVariable&, ConstArrayView<Real2>)
override {}
687 void writeVal(IVariable&, ConstArrayView<Real3>)
override;
691 void writeVal(IVariable&, ConstArrayView<Real2x2>)
override {}
692 void writeVal(IVariable&, ConstArrayView<Real3x3>)
override {}
693 void writeVal(IVariable&, ConstArrayView<String>)
override {}
695 void writeVal(IVariable&, ConstArray2View<Byte>)
override {}
697 void writeVal(IVariable&, ConstArray2View<Real2>)
override {}
698 void writeVal(IVariable&, ConstArray2View<Real3>)
override;
702 void writeVal(IVariable&, ConstArray2View<Real2x2>)
override {}
703 void writeVal(IVariable&, ConstArray2View<Real3x3>)
override {}
705 void writeVal(IVariable&, ConstMultiArray2View<Byte>)
override {}
707 void writeVal(IVariable&, ConstMultiArray2View<Real2>)
override {}
708 void writeVal(IVariable&, ConstMultiArray2View<Real3> a)
override;
712 void writeVal(IVariable&, ConstMultiArray2View<Real2x2>)
override {}
713 void writeVal(IVariable&, ConstMultiArray2View<Real3x3>)
override {}
720 bool isMasterProcessor()
const {
return m_is_master; }
721 bool isOneFilePerTime()
const {
return m_fileset_size == 0; }
728 typedef UniqueArray<GroupPartInfo*> GroupPartInfoList;
737 std::ostringstream m_case_file_variables;
741 GroupPartInfoList m_parts;
747 bool m_use_degenerated_hexa;
748 bool m_force_first_geometry;
769 void _createCaseFile();
772 void _writeWildcardFilename(std::ostream& ofile,
const String& filename,
char joker =
'*');
773 int _fileOuttype()
const;
774 void _writeFileHeader(std::ostream& o,
bool write_c_binary);
775 bool _isNewBlocFile()
const;
778 void _saveGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
780 void _saveVariableOnGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
785 template <
typename T>
788 template <
typename T>
791 template <
typename T>
803 bool is_binary,
bool is_parallel_output,
Integer fileset_size,
804 bool use_degenerated_hexa,
bool force_first_geometry,
bool save_uids)
807 is_parallel_output, fileset_size, use_degenerated_hexa,
808 force_first_geometry, save_uids);
812createEnsight7(IMesh* m,
const String& f,
813 ConstArrayView<Real> times,
814 VariableCollection variables,
816 bool is_binary,
bool is_parallel_output,
Integer fileset_size,
817 bool use_degenerated_hexa,
bool force_first_geometry,
bool save_uids)
819 return new DumpWEnsight7(m, f, times, variables, groups, is_binary,
820 is_parallel_output, fileset_size, use_degenerated_hexa,
821 force_first_geometry, save_uids);
830 bool is_binary,
bool is_parallel_output,
Integer fileset_size,
831 bool use_degenerated_hexa,
bool force_first_geometry,
bool save_uids)
834, m_parallel_mng(
mesh->parallelMng())
835, m_base_directory(filename)
837, m_save_variables(variables.clone())
838, m_save_groups(groups.enumerator())
839, m_is_binary(is_binary)
842, m_is_parallel_output(is_parallel_output)
843, m_use_degenerated_hexa(use_degenerated_hexa)
844, m_force_first_geometry(force_first_geometry)
845, m_save_uids(save_uids)
846, m_total_nb_element(0)
848, m_fileset_size(fileset_size)
867 std::for_each(std::begin(m_parts), std::end(m_parts), Deleter());
918 debug(
Trace::High) <<
"Utilisation de l'algorithme standard de construction de groupe de parties";
924 Integer type_to_seek = type_info.type();
927 if (e.
type() == type_to_seek)
932 << nb_of_type <<
" éléments de type " << type_info.name();
936 if (mi.
type() == type_to_seek) {
946 const Item& item = *i2;
947 auto item_type = current_grp.generalItemTypeId(item);
948 EnsightPart* ensight_part = current_grp.getTypeInfo(item_type);
952 ensight_part->items().add(item_wn);
959 debug(
Trace::High) <<
"Utilisation de l'algorithme de construction de groupe de parties avec types supplémentaires";
964 auto item_type = item->type();
965 EnsightPart* ensight_part = current_grp.getTypeInfo(item_type);
969 ensight_part->items().add(item_wn);
1000_saveGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
1005 writeFileString(ofile,
"part");
1006 writeFileInt(ofile, ensight_grp.partId());
1007 if (isParallelOutput()) {
1010 std::ostringstream ostr;
1012 writeFileString(ofile, ostr.str().c_str());
1015 writeFileString(ofile, igrp.
name());
1022 const EnsightPart& type_info = ensight_grp.typeInfo(i);
1025 if (nb_sub_part == 0)
1028 String type_name = type_info.name();
1029 writeFileString(ofile, type_name);
1031 writeFileInt(ofile, nb_sub_part);
1037 writeFileInt(ofile,mi.
uniqueId()+1);
1041 if (type_name ==
"nfaced") {
1052 for (
Integer z = 0; z < nb_sub_part; ++z)
1053 writeFileInt(ofile, nb_face);
1057 for (
Item mi : items) {
1058 writeFileInt(ofile, mi.toCell().nbFace());
1065 for (
Item mi : items) {
1068 for (
Integer z = 0; z < nb_face; ++z)
1073 for (
Item mi : items) {
1076 writeFileInt(ofile, face.nbNode());
1083 for (
Item item : items) {
1084 Cell cell(item.toCell());
1088 for (
Integer z = 0; z < nb_face; ++z) {
1091 array_id.
resize(nb_node);
1092 for (
Integer y = 0; y < nb_node; ++y) {
1100 writeFileArray(ofile, array_id);
1105 for (
Item item : items) {
1108 for (
Integer z = 0; z < nb_face; ++z) {
1109 const Face local_face = cell.
face(z);
1111 array_id.
resize(nb_node);
1112 for (
Integer y = 0; y < nb_node; ++y) {
1113 array_id[y] = nodes_index[local_face.
node(y).
localId()];
1115 writeFileArray(ofile, array_id);
1120 else if (type_name ==
"nsided") {
1125 for (
Item mi : items) {
1128 writeFileInt(ofile, nb_node);
1131 for (
Item mi : items) {
1134 array_id.
resize(nb_node);
1135 for (
Integer z = 0; z < nb_node; ++z) {
1138 writeFileArray(ofile, array_id);
1144 Integer nb_node = type_info.nbNode();
1145 array_id.
resize(nb_node);
1150 if (type_info.hasReindex()) {
1152 for (
Item mi : items) {
1154 for (
Integer j = 0; j < nb_node; ++j) {
1155 array_id[j] = nodes_index[e.
node(reindex[j]).
localId()];
1157 writeFileArray(ofile, array_id);
1161 for (
Item mi : items) {
1163 for (
Integer j = 0; j < nb_node; ++j) {
1166 writeFileArray(ofile, array_id);
1201_saveVariableOnGroup(std::ostream& ofile,
const GroupPartInfo& ensight_grp,
1206 writeFileString(ofile,
"part");
1207 writeFileInt(ofile, ensight_grp.partId());
1215 const EnsightPart& type_info = ensight_grp.typeInfo(i);
1218 if (nb_sub_part == 0)
1220 String type_name = type_info.name();
1221 if (type_name != last_type_name) {
1225 func->putValue(ofile);
1227 last_type_name = type_name;
1228 writeFileString(ofile, type_name);
1229 func = from_func.clone();
1240 func->putValue(ofile);
1248writeFileInt(std::ostream& o,
int value)
1251 o.write((
const char*)&value,
sizeof(
int));
1254 o.width(DumpWEnsight7::int_width);
1268 return DumpWEnsight7::int_width + 1;
1275writeFileDouble(std::ostream& o,
double value)
1278 float fvalue = (float)(value);
1279 o.write((
const char*)&fvalue,
sizeof(
float));
1284 o.flags(std::ios::scientific);
1294writeDoubleSize()
const
1307 o.write((
const char*)value.data(),
sizeof(
Integer) * value.size());
1310 for (
Integer i = 0, s = value.size(); i < s; ++i) {
1311 o.width(DumpWEnsight7::int_width);
1322writeFileString(std::ostream& o,
const String& str)
1325 char buf[g_line_length];
1326 for (
int i = 0; i < g_line_length; ++i)
1329 buf[g_line_length - 1] =
'\0';
1330 o.write(buf, g_line_length);
1341_writeFileHeader(std::ostream& o,
bool write_c_binary)
1344 if (_isNewBlocFile() &&
m_is_binary && write_c_binary)
1345 writeFileString(o,
"C Binary");
1346 if (m_fileset_size != 0) {
1347 std::ostringstream ostr;
1348 ostr <<
"BEGIN TIME STEP "
1350 writeFileString(o, ostr.str().c_str());
1364class DumpWEnsight7OutFile
1370 , m_filename(filename)
1371 , m_is_master(dw.isMasterProcessor())
1372 , m_is_parallel_output(dw.isParallelOutput())
1377 m_filestream =
new std::ofstream(filename.
localstr(), (std::ios_base::openmode)outtype);
1378 m_stream = &m_strstream;
1379 if (!(*m_filestream))
1380 m_dw.warning() <<
"Unable to open file " << filename;
1384 m_stream = &m_strstream;
1386 ARCANE_CHECK_PTR(m_stream);
1388 ~DumpWEnsight7OutFile()
1390 delete m_filestream;
1399 ARCANE_CHECK_PTR(m_filestream);
1400 ARCANE_CHECK_PTR(m_strstream);
1402 (*m_filestream) << m_strstream.str();
1404 if (m_is_parallel_output) {
1406 ARCANE_CHECK_PTR(m_filestream);
1414 for (
Integer i = 1; i < nb_proc; ++i) {
1415 m_dw.debug(
Trace::High) <<
"En attente de la longueur du processeur " << i;
1416 parallel_mng->
recv(len_array, i);
1418 m_dw.debug(
Trace::High) <<
"Longueur du processeur " << i <<
" : " << len;
1421 m_dw.debug(
Trace::High) <<
"En attente de la réception de la géométrie du processeur " << i;
1422 parallel_mng->
recv(str_array, i);
1423 m_dw.debug(
Trace::High) <<
"Réception de la géométrie du processeur " << i;
1424 m_filestream->write((
const char*)str_array.
data(), str_array.
size());
1429 ARCANE_CHECK_PTR(m_strstream);
1436 std::string str = m_strstream.str();
1445 m_dw.debug(
Trace::High) <<
"Pas un maître. Taille de " << m_filename <<
" = " << len;
1449 m_dw.debug(
Trace::High) <<
"Envoi de la longueur pour le processeur 0";
1450 parallel_mng->send(len_array, 0);
1455 m_dw.debug(
Trace::High) <<
"Envoi des données pour le processeur 0";
1456 parallel_mng->send(bytes, 0);
1462 if (!m_dw.isOneFilePerTime())
1463 m_dw.writeFileString(*m_filestream,
"END TIME STEP");
1468 std::ostream& operator()() {
return *m_stream; }
1475 bool m_is_parallel_output;
1476 std::ostream* m_stream;
1477 std::ostringstream m_strstream;
1478 std::ofstream* m_filestream;
1493 bool is_parallel = parallel_mng->
isParallel();
1524 if (!list_group.contains(var_group))
1525 list_group.add(var_group);
1531 _computeGroupParts(list_group, partid);
1536 for (
auto i : m_parts) {
1537 total_nb_element += i->totalNbElement();
1543 debug() <<
"Ajout de nœuds " <<
mesh->nbNode();
1547 if (!(
m_times.size() > 1 && m_force_first_geometry)) {
1553 _writeFileHeader(dw_ofile(),
true);
1556 writeFileString(dw_ofile(),
"Output ensight test");
1557 writeFileString(dw_ofile(),
"File description");
1558 writeFileString(dw_ofile(),
"node id assign");
1559 writeFileString(dw_ofile(),
"element id assign");
1569 all_nodes_index.
fill(0);
1573 if (
mesh->parentMesh()) {
1575 coords_backup.
resize(
mesh->nodeFamily()->maxLocalId());
1577 coords_backup[i_item.localId()] = nodes_coords[i_item];
1579 coords_array = coords_backup.
view();
1589 writeFileString(wf.stream(),
"coordinates");
1590 writeFileInt(wf.stream(), all_nodes.
size());
1597 const Item& item = *i_item;
1598 all_nodes_index[item.
localId()] = ensight_index;
1607 const Item& item = *i_item;
1608 writeFileInt(wf.stream(),item.
uniqueId()+1);
1614 const Item& item = *i_item;
1621 _saveGroup(dw_ofile(), *part, all_nodes_index, wf);
1623 dw_ofile.syncFile();
1637 cell_uids[icell] = (
Real)(icell->uniqueId().asInt64());
1643 write(cell_uid_var, cell_uid_var->
data());
1650 node_uids[inode] = inode->uniqueId().asInt32();
1651 node_uids2[inode.index()] = (
Real)inode->uniqueId().asInt64();
1668 warning() <<
"Unable to write to file: <" << buf <<
"> error: " <<
m_case_file.rdstate();
1675 if (m_fileset_size != 0)
1677 if (m_force_first_geometry)
1678 _writeWildcardFilename(
m_case_file,
"ensight.geo",
'0');
1680 _writeWildcardFilename(
m_case_file,
"ensight.geo",
'*');
1704 if (m_fileset_size != 0) {
1707 if (m_fileset_size != 0) {
1709 for (
Integer i = 0; i < nb_timeset; ++i) {
1711 m_case_file <<
"number of steps: " << m_fileset_size <<
'\n';
1714 m_case_file <<
"filename index: " << nb_timeset <<
"\n";
1715 m_case_file <<
"number of steps: " <<
m_times.size() - (nb_timeset * m_fileset_size) <<
'\n';
1781 if (m_fileset_size == 0) {
1797 ostr() << current_time;
1798 fn_builder += ostr.str();
1810 filename = fn_builder;
1822 return group_kind == item_kind;
1841 bool has_prot =
false;
1842 if (m_fileset_size != 0) {
1845 prot_index = (nb_time - 1) / m_fileset_size;
1857 ostr() << prot_index;
1872_writeWildcardFilename(std::ostream& ofile,
const String& filename,
char joker)
1874 if (m_fileset_size == 0) {
1875 ofile <<
' ' << filename <<
'/' << filename;
1886 if (nb_time <= m_fileset_size)
1890 ofile <<
"/" << filename;
1898_isNewBlocFile()
const
1904 if (m_fileset_size == 0)
1907 Integer modulo = (nb_time - 1) % m_fileset_size;
1920 return ((isBinary()) ? std::ios::binary : 0) | ((_isNewBlocFile()) ? std::ios::trunc : std::ios::app);
1929template <
typename T>
1933 debug() <<
"Saving variable1 " << v.
name() <<
" ptr=" << ptr.
data() <<
" ps=" << ptr.
size();
1941 debug() <<
"Saving variable " << v.
name() <<
" in " << filename;
1945 _writeFileHeader(dw_ofile(),
false);
1948 writeFileString(dw_ofile(), v.
name());
1955 var_type_str =
"scalar per element: ";
1958 var_type_str =
"scalar per node: ";
1964 m_case_file_variables << var_type_str;
1965 m_case_file_variables <<
" 1 ";
1966 if (m_fileset_size != 0)
1967 m_case_file_variables <<
" 1 ";
1968 m_case_file_variables << v.
name();
1969 _writeWildcardFilename(m_case_file_variables, v.
name());
1970 m_case_file_variables <<
'\n';
1985 bool need_save =
false;
1987 need_save = v.
itemGroup() == part->group();
1989 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
1991 _saveVariableOnGroup(dw_ofile(), *part, wf);
2003 writeFileString(dw_ofile(),
"part");
2004 writeFileInt(dw_ofile(), part->partId());
2005 writeFileString(dw_ofile(),
"coordinates");
2006 wf.putValue(dw_ofile());
2013 dw_ofile.syncFile();
2025template <
typename T>
2032 for (
Integer idim2 = 0; idim2 < ptr.dim2Size(); ++idim2) {
2037 debug() <<
"Saving variable " << v.
name() <<
" component " << idim2 <<
" in " << filename;
2041 _writeFileHeader(dw_ofile(),
false);
2044 writeFileString(dw_ofile(), vname);
2051 var_type_str =
"scalar per element: ";
2054 var_type_str =
"scalar per node: ";
2060 m_case_file_variables << var_type_str;
2061 m_case_file_variables <<
" 1 ";
2062 if (m_fileset_size != 0)
2063 m_case_file_variables <<
" 1 ";
2064 m_case_file_variables << vname;
2065 _writeWildcardFilename(m_case_file_variables, vname);
2066 m_case_file_variables <<
'\n';
2081 bool need_save =
false;
2083 need_save = v.
itemGroup() == part->group();
2085 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
2087 _saveVariableOnGroup(dw_ofile(), *part, wf);
2095 for (
Integer i = 0; i < ptr.dim1Size(); ++i)
2099 writeFileString(dw_ofile(),
"part");
2100 writeFileInt(dw_ofile(), part->partId());
2101 writeFileString(dw_ofile(),
"coordinates");
2102 wf.putValue(dw_ofile());
2109 dw_ofile.syncFile();
2122template <
typename T>
2131 warning() <<
"Impossible to write array variable "
2132 << v.
name() <<
" of non-constant size; variable saving skipped";
2150 debug() <<
"Saving variable " << v.
name() <<
" in " << filename;
2154 _writeFileHeader(dw_ofile(),
false);
2156 writeFileString(dw_ofile(), v.
name());
2162 m_case_file_variables <<
"vector per element: ";
2165 m_case_file_variables <<
"vector per node: ";
2171 m_case_file_variables <<
" 1 ";
2172 if (m_fileset_size != 0)
2173 m_case_file_variables <<
" 1 ";
2174 m_case_file_variables << v.
name();
2176 _writeWildcardFilename(m_case_file_variables, v.
name());
2177 m_case_file_variables <<
'\n';
2192 bool need_save =
false;
2194 need_save = v.
itemGroup() == part->group();
2196 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
2198 _saveVariableOnGroup(dw_ofile(), *part, wf);
2210 writeFileString(dw_ofile(),
"part");
2211 writeFileInt(dw_ofile(), part->partId());
2212 writeFileString(dw_ofile(),
"coordinates");
2213 wf.putValue(dw_ofile());
2220 dw_ofile.syncFile();
2235 for (
Integer idim2 = 0; idim2 < ptr.dim2Size(); ++idim2) {
2240 debug() <<
"Saving variable " << v.
name() <<
" component " << idim2 <<
" in " << filename;
2244 _writeFileHeader(dw_ofile(),
false);
2246 writeFileString(dw_ofile(), vname);
2252 m_case_file_variables <<
"vector per element: ";
2255 m_case_file_variables <<
"vector per node: ";
2261 m_case_file_variables <<
" 1 ";
2262 if (m_fileset_size != 0)
2263 m_case_file_variables <<
" 1 ";
2264 m_case_file_variables << vname;
2266 _writeWildcardFilename(m_case_file_variables, vname);
2267 m_case_file_variables <<
'\n';
2282 bool need_save =
false;
2284 need_save = v.
itemGroup() == part->group();
2286 need_save = _isSameKindOfGroup(part->group(), v.
itemKind());
2288 _saveVariableOnGroup(dw_ofile(), *part, wf);
2296 for (
Integer i = 0; i < ptr.dim1Size(); ++i)
2300 writeFileString(dw_ofile(),
"part");
2301 writeFileInt(dw_ofile(), part->partId());
2302 writeFileString(dw_ofile(),
"coordinates");
2303 wf.putValue(dw_ofile());
2310 dw_ofile.syncFile();
2331 warning() <<
"Impossible to write array variable " << v.
name()
2332 <<
" of non-constant size; variable saving skipped";
2341class Ensight7PostProcessorService
2342:
public PostProcessorWriterBase
2347 : PostProcessorWriterBase(sbi)
2348 , m_mesh(sbi.
mesh())
2370 bool is_binary =
true;
2372 bool is_parallel = subDomain()->parallelMng()->isParallel();
2373 bool use_degenerated_hexa =
true;
2374 bool force_first_geometry =
false;
2375 bool save_uids =
false;
2378 fileset_size, use_degenerated_hexa,
2379 force_first_geometry, save_uids);
2398class Ensight7PostProcessorServiceV2
2409 , m_mesh(sbi.
mesh())
2427 IMesh* m_mesh =
nullptr;
2428 DumpW* m_writer =
nullptr;
2439 bool is_binary =
true;
2441 bool is_parallel = m_mesh->parallelMng()->isParallel();
2442 is_binary =
options()->binaryFile();
2443 fileset_size =
options()->filesetSize();
2444 bool use_degenerated_hexa =
options()->useDegeneratedHexa();
2445 bool force_first_geometry =
options()->forceFirstGeometry();
2446 bool save_uids =
options()->saveUids();
2449 use_degenerated_hexa, force_first_geometry, save_uids);
2463 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.