#include "utilities.h"
+#include "UNV164_Structure.hxx"
#include "UNV2411_Structure.hxx"
#include "UNV2412_Structure.hxx"
#include "UNV2417_Structure.hxx"
+#include "UNV2420_Structure.hxx"
#include "UNV_Utilities.hxx"
#include <Basics_Utils.hxx>
static int MYDEBUG = 0;
#endif
+namespace
+{
+ /*!
+ * \brief Move node coordinates to the global Cartesian CS
+ */
+ void transformNodes( UNV2411::TDataSet::const_iterator fromNode,
+ UNV2411::TDataSet::const_iterator endNode,
+ const UNV2420::TRecord & csRecord )
+ {
+ const int csLabel = fromNode->exp_coord_sys_num;
+
+ UNV2411::TDataSet::const_iterator nodeIt;
+
+ // apply Transformation Matrix
+ if ( !csRecord.isIdentityMatrix() )
+ {
+ for ( nodeIt = fromNode; nodeIt != endNode; ++nodeIt )
+ {
+ const UNV2411::TRecord& nodeRec = *nodeIt;
+ if ( nodeRec.exp_coord_sys_num == csLabel )
+ csRecord.ApplyMatrix( (double*) nodeRec.coord );
+ }
+ }
+
+ // transform from Cylindrical CS
+ if ( csRecord.coord_sys_type == UNV2420::Cylindrical )
+ {
+ for ( nodeIt = fromNode; nodeIt != endNode; ++nodeIt )
+ {
+ const UNV2411::TRecord& nodeRec = *nodeIt;
+ if ( nodeRec.exp_coord_sys_num == csLabel )
+ csRecord.FromCylindricalCS( (double*) nodeRec.coord );
+ }
+ }
+ // transform from Spherical CS
+ else if ( csRecord.coord_sys_type == UNV2420::Spherical )
+ {
+ for ( nodeIt = fromNode; nodeIt != endNode; ++nodeIt )
+ {
+ const UNV2411::TRecord& nodeRec = *nodeIt;
+ if ( nodeRec.exp_coord_sys_num == csLabel )
+ csRecord.FromSphericalCS( (double*) nodeRec.coord );
+ }
+ }
+ }
+}
DriverUNV_R_SMDS_Mesh::~DriverUNV_R_SMDS_Mesh()
{
Kernel_Utils::Localizer loc;
Status aResult = DRS_OK;
std::ifstream in_stream(myFile.c_str());
- try{
+ try
+ {
{
+ // Read Units
+ UNV164::TRecord aUnitsRecord;
+ UNV164::Read( in_stream, aUnitsRecord );
+
+ // Read Coordinate systems
+ UNV2420::TDataSet aCoordSysDataSet;
+ UNV2420::Read(in_stream, myMeshName, aCoordSysDataSet);
+
+ // Read nodes
using namespace UNV2411;
TDataSet aDataSet2411;
UNV2411::Read(in_stream,aDataSet2411);
if(MYDEBUG) MESSAGE("Perform - aDataSet2411.size() = "<<aDataSet2411.size());
+
+ // Move nodes in a global CS
+ if ( !aCoordSysDataSet.empty() )
+ {
+ UNV2420::TDataSet::const_iterator csIter = aCoordSysDataSet.begin();
+ for ( ; csIter != aCoordSysDataSet.end(); ++csIter )
+ {
+ // find any node in this CS
+ TDataSet::const_iterator nodeIter = aDataSet2411.begin();
+ for (; nodeIter != aDataSet2411.end(); nodeIter++)
+ if ( nodeIter->exp_coord_sys_num == csIter->coord_sys_label )
+ {
+ transformNodes( nodeIter, aDataSet2411.end(), *csIter );
+ break;
+ }
+ }
+ }
+ // Move nodes to SI unit system
+ const double lenFactor = aUnitsRecord.factors[ UNV164::LENGTH_FACTOR ];
+ if ( lenFactor != 1. )
+ {
+ TDataSet::iterator nodeIter = aDataSet2411.begin(), nodeEnd;
+ for ( nodeEnd = aDataSet2411.end(); nodeIter != nodeEnd; nodeIter++)
+ {
+ UNV2411::TRecord& nodeRec = *nodeIter;
+ nodeRec.coord[0] *= lenFactor;
+ nodeRec.coord[1] *= lenFactor;
+ nodeRec.coord[2] *= lenFactor;
+ }
+ }
+
+ // Create nodes in the mesh
TDataSet::const_iterator anIter = aDataSet2411.begin();
- for(; anIter != aDataSet2411.end(); anIter++){
- const TNodeLab& aLabel = anIter->first;
- const TRecord& aRec = anIter->second;
- //MESSAGE("AddNodeWithID " << aLabel << " " << aRec.coord[0] << " " << aRec.coord[1] << " " << aRec.coord[2]);
- myMesh->AddNodeWithID(aRec.coord[0],aRec.coord[1],aRec.coord[2],aLabel);
+ for(; anIter != aDataSet2411.end(); anIter++)
+ {
+ const TRecord& aRec = *anIter;
+ myMesh->AddNodeWithID(aRec.coord[0],aRec.coord[1],aRec.coord[2],aRec.label);
}
}
{
using namespace UNV2412;
- in_stream.seekg(0);
TDataSet aDataSet2412;
UNV2412::Read(in_stream,aDataSet2412);
TDataSet::const_iterator anIter = aDataSet2412.begin();
if(MYDEBUG) MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
- for(; anIter != aDataSet2412.end(); anIter++){
+ for(; anIter != aDataSet2412.end(); anIter++)
+ {
SMDS_MeshElement* anElement = NULL;
- const TElementLab& aLabel = anIter->first;
- const TRecord& aRec = anIter->second;
+ const TRecord& aRec = *anIter;
if(IsBeam(aRec.fe_descriptor_id)) {
switch ( aRec.node_labels.size() ) {
case 2: // edge with two nodes
//MESSAGE("add edge " << aLabel << " " << aRec.node_labels[0] << " " << aRec.node_labels[1]);
anElement = myMesh->AddEdgeWithID(aRec.node_labels[0],
aRec.node_labels[1],
- aLabel);
+ aRec.label);
break;
case 3: // quadratic edge (with 3 nodes)
- //MESSAGE("add edge " << aLabel << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2]);
+ //MESSAGE("add edge " << aRec.label << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2]);
anElement = myMesh->AddEdgeWithID(aRec.node_labels[0],
aRec.node_labels[2],
aRec.node_labels[1],
- aLabel);
+ aRec.label);
}
}
else if(IsFace(aRec.fe_descriptor_id)) {
- //MESSAGE("add face " << aLabel);
+ //MESSAGE("add face " << aRec.label);
switch(aRec.fe_descriptor_id){
case 41: // Plane Stress Linear Triangle
case 51: // Plane Strain Linear Triangle
anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
aRec.node_labels[1],
aRec.node_labels[2],
- aLabel);
+ aRec.label);
break;
case 42: // Plane Stress Parabolic Triangle
case 72: // Membrane Parabolic Triangle
case 82: // Axisymetric Solid Parabolic Triangle
case 92: // Thin Shell Parabolic Triangle
- //MESSAGE("add face " << aLabel << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2] << " " << aRec.node_labels[3] << " " << aRec.node_labels[4] << " " << aRec.node_labels[5]);
+ //MESSAGE("add face " << aRec.label << " " << aRec.node_labels[0] << " " << aRec.node_labels[1] << " " << aRec.node_labels[2] << " " << aRec.node_labels[3] << " " << aRec.node_labels[4] << " " << aRec.node_labels[5]);
anElement = myMesh->AddFaceWithID(aRec.node_labels[0],
aRec.node_labels[2],
aRec.node_labels[4],
aRec.node_labels[1],
aRec.node_labels[3],
aRec.node_labels[5],
- aLabel);
+ aRec.label);
break;
case 44: // Plane Stress Linear Quadrilateral
aRec.node_labels[1],
aRec.node_labels[2],
aRec.node_labels[3],
- aLabel);
+ aRec.label);
break;
case 45: // Plane Stress Parabolic Quadrilateral
aRec.node_labels[3],
aRec.node_labels[5],
aRec.node_labels[7],
- aLabel);
+ aRec.label);
break;
}
}
else if(IsVolume(aRec.fe_descriptor_id)){
- //MESSAGE("add volume " << aLabel);
+ //MESSAGE("add volume " << aRec.label);
switch(aRec.fe_descriptor_id){
case 111: // Solid Linear Tetrahedron - TET4
aRec.node_labels[2],
aRec.node_labels[1],
aRec.node_labels[3],
- aLabel);
+ aRec.label);
break;
case 118: // Solid Quadratic Tetrahedron - TET10
aRec.node_labels[6],
aRec.node_labels[8],
aRec.node_labels[7],
- aLabel);
+ aRec.label);
break;
case 112: // Solid Linear Prism - PRISM6
aRec.node_labels[3],
aRec.node_labels[5],
aRec.node_labels[4],
- aLabel);
+ aRec.label);
break;
case 113: // Solid Quadratic Prism - PRISM15
aRec.node_labels[6],
aRec.node_labels[8],
aRec.node_labels[7],
- aLabel);
+ aRec.label);
break;
case 115: // Solid Linear Brick - HEX8
aRec.node_labels[7],
aRec.node_labels[6],
aRec.node_labels[5],
- aLabel);
+ aRec.label);
break;
case 116: // Solid Quadratic Brick - HEX20
aRec.node_labels[11],
aRec.node_labels[10],
aRec.node_labels[9],
- aLabel);
+ aRec.label);
break;
case 114: // pyramid of 13 nodes (quadratic) - PIRA13
aRec.node_labels[10],
aRec.node_labels[9],
aRec.node_labels[12],
- aLabel);
+ aRec.label);
break;
}
}
if(!anElement)
- MESSAGE("DriverUNV_R_SMDS_Mesh::Perform - can not add element with ID = "<<aLabel<<" and type = "<<aRec.fe_descriptor_id);
+ MESSAGE("DriverUNV_R_SMDS_Mesh::Perform - can not add element with ID = "<<aRec.label<<" and type = "<<aRec.fe_descriptor_id);
}
}
{
using namespace UNV2417;
- in_stream.seekg(0);
TDataSet aDataSet2417;
UNV2417::Read(in_stream,aDataSet2417);
if(MYDEBUG) MESSAGE("Perform - aDataSet2417.size() = "<<aDataSet2417.size());
#include "utilities.h"
+#include "UNV164_Structure.hxx"
#include "UNV2411_Structure.hxx"
#include "UNV2412_Structure.hxx"
#include "UNV2417_Structure.hxx"
+#include "UNV2420_Structure.hxx"
#include "UNV_Utilities.hxx"
#include <Basics_Utils.hxx>
Status aResult = DRS_OK;
std::ofstream out_stream(myFile.c_str());
try{
+
+ UNV164::Write( out_stream ); // unit system
+ UNV2420::Write( out_stream, myMeshName ); // Coordinate system
+
{
using namespace UNV2411;
TDataSet aDataSet2411;
//-----------------------------------
MESSAGE("Perform - myMesh->NbNodes() = "<<myMesh->NbNodes());
SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator();
- for(; aNodesIter->more();){
+ TRecord aRec;
+ while ( aNodesIter->more() )
+ {
const SMDS_MeshNode* aNode = aNodesIter->next();
- TRecord aRec;
+ aRec.label = aNode->GetID();
aRec.coord[0] = aNode->X();
aRec.coord[1] = aNode->Y();
aRec.coord[2] = aNode->Z();
- const TNodeLab& aLabel = aNode->GetID();
- aDataSet2411.insert(TDataSet::value_type(aLabel,aRec));
+ aDataSet2411.push_back( aRec );
}
MESSAGE("Perform - aDataSet2411.size() = "<<aDataSet2411.size());
UNV2411::Write(out_stream,aDataSet2411);
MESSAGE("Perform - myMesh->NbEdges() = "<<myMesh->NbEdges());
if(myMesh->NbEdges()){
SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator();
- for(; anIter->more();){
+ while( anIter->more() )
+ {
const SMDS_MeshEdge* anElem = anIter->next();
- TElementLab aLabel = anElem->GetID();
int aNbNodes = anElem->NbNodes();
TRecord aRec;
+ aRec.label = anElem->GetID();
aRec.node_labels.reserve(aNbNodes);
SMDS_ElemIteratorPtr aNodesIter;
aNodesIter = anElem->nodesIteratorToUNV();
} else {
aRec.fe_descriptor_id = 11;
}
- for(; aNodesIter->more();){
+ while( aNodesIter->more())
+ {
const SMDS_MeshElement* aNode = aNodesIter->next();
aRec.node_labels.push_back(aNode->GetID());
}
- aDataSet2412.insert(TDataSet::value_type(aLabel,aRec));
+ aDataSet2412.push_back(aRec);
}
MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
}
MESSAGE("Perform - myMesh->NbFaces() = "<<myMesh->NbFaces());
- if(myMesh->NbFaces()){
+ if ( myMesh->NbFaces() )
+ {
SMDS_FaceIteratorPtr anIter = myMesh->facesIterator();
- for(; anIter->more();){
+ while ( anIter->more())
+ {
const SMDS_MeshFace* anElem = anIter->next();
if ( anElem->IsPoly() ) continue;
- TElementLab aLabel = anElem->GetID();
int aNbNodes = anElem->NbNodes();
TRecord aRec;
+ aRec.label = anElem->GetID();
aRec.node_labels.reserve(aNbNodes);
SMDS_ElemIteratorPtr aNodesIter;
aNodesIter = anElem->nodesIteratorToUNV();
default:
continue;
}
- aDataSet2412.insert(TDataSet::value_type(aLabel,aRec));
+ aDataSet2412.push_back(aRec);
}
MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
}
MESSAGE("Perform - myMesh->NbVolumes() = "<<myMesh->NbVolumes());
- if(myMesh->NbVolumes()){
+ if ( myMesh->NbVolumes() )
+ {
SMDS_VolumeIteratorPtr anIter = myMesh->volumesIterator();
- for(; anIter->more();){
+ while ( anIter->more())
+ {
const SMDS_MeshVolume* anElem = anIter->next();
- TElementLab aLabel = anElem->GetID();
-
int aNbNodes = anElem->NbNodes();
//MESSAGE("aNbNodes="<<aNbNodes);
SMDS_ElemIteratorPtr aNodesIter;
}
if(anId>0){
TRecord aRec;
+ aRec.label = anElem->GetID();
aRec.fe_descriptor_id = anId;
aRec.node_labels.reserve(aNbNodes);
- for(; aNodesIter->more() && aRec.node_labels.size() < aNbNodes; ) {
+ while ( aNodesIter->more() && aRec.node_labels.size() < aNbNodes )
+ {
const SMDS_MeshElement* aNode = aNodesIter->next();
aRec.node_labels.push_back(aNode->GetID());
}
- aDataSet2412.insert(TDataSet::value_type(aLabel,aRec));
+ aDataSet2412.push_back(aRec);
}
}
MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
static string _label_dataset = "2411";
UNV2411::TRecord::TRecord():
- exp_coord_sys_num(0),
- disp_coord_sys_num(0),
+ exp_coord_sys_num(1),
+ disp_coord_sys_num(1),
color(11)//(0) - 0019936: EDF 794 SMESH : Export UNV : Node color and group id
{}
* always 3 coordinates in the UNV file, no matter
* which dimensionality libMesh is in
*/
- TNodeLab aLabel;
std::string num_buf;
- for(; !in_stream.eof();){
- in_stream >> aLabel ;
- if(aLabel == -1){
+ while ( !in_stream.eof() )
+ {
+ TRecord aRec;
+ in_stream >> aRec.label ;
+ if ( aRec.label == -1 ) {
// end of dataset is reached
break;
}
- TRecord aRec;
in_stream>>aRec.exp_coord_sys_num;
in_stream>>aRec.disp_coord_sys_num;
in_stream>>aRec.color;
aRec.coord[d] = D_to_e(num_buf);
}
- theDataSet.insert(TDataSet::value_type(aLabel,aRec));
+ theDataSet.push_back(aRec);
}
}
out_stream<<" "<<_label_dataset<<"\n";
TDataSet::const_iterator anIter = theDataSet.begin();
- for(; anIter != theDataSet.end(); anIter++){
- const TNodeLab& aLabel = anIter->first;
- const TRecord& aRec = anIter->second;
+ for(; anIter != theDataSet.end(); anIter++)
+ {
+ const TRecord& aRec = *anIter;
char buf[78];
sprintf(buf, "%10d%10d%10d%10d\n",
- aLabel,
+ aRec.label,
aRec.exp_coord_sys_num,
aRec.disp_coord_sys_num,
aRec.color);
#include "SMESH_DriverUNV.hxx"
-#include <map>
+#include <vector>
#include <fstream>
namespace UNV2411{
+ typedef int TNodeLab; // type of node label
+
struct MESHDRIVERUNV_EXPORT TRecord{
TRecord();
+ TNodeLab label;
int exp_coord_sys_num; // export coordinate system number
int disp_coord_sys_num; // displacement coordinate system number
int color; // color
double coord[3]; // node coordinates in the part coordinate system
};
- typedef int TNodeLab; // type of node label
- typedef std::map<TNodeLab,TRecord> TDataSet;
+ typedef std::vector<TRecord> TDataSet;
MESHDRIVERUNV_EXPORT void
Read(std::ifstream& in_stream, TDataSet& theDataSet);
static string _label_dataset = "2412";
UNV2412::TRecord::TRecord():
+ label(-1),
+ fe_descriptor_id(-1),
phys_prop_tab_num(2),
mat_prop_tab_num(1),
color(7),
beam_orientation(0),
- beam_fore_end(0),
- beam_aft_end(0)
+ beam_fore_end(1), // default values
+ beam_aft_end(1) // default values
{}
void UNV2412::Read(std::ifstream& in_stream, TDataSet& theDataSet)
if(!beginning_of_dataset(in_stream,_label_dataset))
EXCEPTION(runtime_error,"ERROR: Could not find "<<_label_dataset<<" dataset!");
- TElementLab aLabel;
- for(; !in_stream.eof();){
- in_stream >> aLabel ;
- if(aLabel == -1){
+ TRecord aRec;
+ while( !in_stream.eof())
+ {
+ in_stream >> aRec.label ;
+ if (aRec.label == -1)
// end of dataset is reached
break;
- }
int n_nodes;
- TRecord aRec;
in_stream>>aRec.fe_descriptor_id;
in_stream>>aRec.phys_prop_tab_num;
in_stream>>aRec.mat_prop_tab_num;
}
aRec.node_labels.resize(n_nodes);
- for(int j=0; j < n_nodes; j++){
+ for(int j=0; j < n_nodes; j++)
// read node labels
in_stream>>aRec.node_labels[j];
- }
- theDataSet.insert(TDataSet::value_type(aLabel,aRec));
+ theDataSet.push_back(aRec);
}
}
out_stream<<" "<<_label_dataset<<"\n";
TDataSet::const_iterator anIter = theDataSet.begin();
- for(; anIter != theDataSet.end(); anIter++){
- const TElementLab& aLabel = anIter->first;
- const TRecord& aRec = anIter->second;
- out_stream<<std::setw(10)<<aLabel; /* element ID */
+ for(; anIter != theDataSet.end(); anIter++)
+ {
+ const TRecord& aRec = *anIter;
+ out_stream<<std::setw(10)<<aRec.label; /* element ID */
out_stream<<std::setw(10)<<aRec.fe_descriptor_id; /* type of element */
out_stream<<std::setw(10)<<aRec.phys_prop_tab_num;
out_stream<<std::setw(10)<<aRec.mat_prop_tab_num;
out_stream<<std::setw(10)<<aRec.color;
out_stream<<std::setw(10)<<aRec.node_labels.size()<<std::endl; /* No. of nodes per element */
- if(IsBeam(aRec.fe_descriptor_id)){
+ if(IsBeam(aRec.fe_descriptor_id))
+ {
out_stream<<std::setw(10)<<aRec.beam_orientation;
out_stream<<std::setw(10)<<aRec.beam_fore_end;
out_stream<<std::setw(10)<<aRec.beam_aft_end<<std::endl;
#include "SMESH_DriverUNV.hxx"
-#include <map>
#include <vector>
-#include <fstream>
-
+#include <fstream>
namespace UNV2412{
typedef std::vector<int> TNodeLabels; // Nodal connectivities
+ typedef int TElementLab; // type of element label
- struct MESHDRIVERUNV_EXPORT TRecord{
+ struct MESHDRIVERUNV_EXPORT TRecord
+ {
TRecord();
+ TElementLab label;
int fe_descriptor_id; // FE descriptor id
int phys_prop_tab_num; // physical property table number
int mat_prop_tab_num; // material property table number
int beam_aft_end; // beam aft-end cross section number
};
- typedef int TElementLab; // type of element label
- typedef std::map<TElementLab,TRecord> TDataSet;
+ typedef std::vector<TRecord> TDataSet;
MESHDRIVERUNV_EXPORT void
Read(std::ifstream& in_stream, TDataSet& theDataSet);