Salome HOME
DCQ : Merge with Ecole_Ete_a6.
[modules/smesh.git] / src / DriverUNV / UNV2412_Structure.cxx
diff --git a/src/DriverUNV/UNV2412_Structure.cxx b/src/DriverUNV/UNV2412_Structure.cxx
new file mode 100644 (file)
index 0000000..43699fc
--- /dev/null
@@ -0,0 +1,202 @@
+//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
+// 
+//  This library is free software; you can redistribute it and/or 
+//  modify it under the terms of the GNU Lesser General Public 
+//  License as published by the Free Software Foundation; either 
+//  version 2.1 of the License. 
+// 
+//  This library is distributed in the hope that it will be useful, 
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+//  Lesser General Public License for more details. 
+// 
+//  You should have received a copy of the GNU Lesser General Public 
+//  License along with this library; if not, write to the Free Software 
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
+// 
+//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+
+#include <fstream>     
+#include <iomanip>
+
+#include "UNV2412_Structure.hxx"
+#include "UNV_Utilities.hxx"
+
+using namespace std;
+using namespace UNV;
+using namespace UNV2412;
+
+#ifdef _DEBUG_
+static int MYDEBUG = 1;
+#else
+static int MYDEBUG = 0;
+#endif
+
+static string _label_dataset = "2412";
+
+UNV2412::TRecord::TRecord():
+  phys_prop_tab_num(2),
+  mat_prop_tab_num(1),
+  color(7),
+  beam_orientation(0),
+  beam_fore_end(0),
+  beam_aft_end(0)
+{}
+
+void UNV2412::Read(std::ifstream& in_stream, TDataSet& theDataSet)
+{
+  if(!in_stream.good())
+    EXCEPTION(runtime_error,"ERROR: Input file not good.");
+
+  /*
+   * adjust the \p istream to our
+   * position
+   */
+  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){
+      // 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;
+    in_stream>>aRec.color;
+    in_stream>>n_nodes;
+
+    if(IsBeam(aRec.fe_descriptor_id)){
+      in_stream>>aRec.beam_orientation;
+      in_stream>>aRec.beam_fore_end;
+      in_stream>>aRec.beam_aft_end;
+    }
+
+    aRec.node_labels.resize(n_nodes);
+    for(int j=0; j < n_nodes; j++){
+      // read node labels
+      in_stream>>aRec.node_labels[j];             
+    }
+
+    theDataSet.insert(TDataSet::value_type(aLabel,aRec));
+  }
+
+}
+
+
+void UNV2412::Write(std::ofstream& out_stream, const TDataSet& theDataSet)
+{
+  if(!out_stream.good())
+    EXCEPTION(runtime_error,"ERROR: Output file not good.");
+  
+  /*
+   * Write beginning of dataset
+   */
+  out_stream<<"    -1\n";
+  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 */
+    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)){
+      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;
+    }
+
+    int n_nodes = aRec.node_labels.size();
+    int iEnd = (n_nodes-1)/8 + 1;
+    for(int i = 0, k = 0; i < iEnd; i++){
+      int jEnd = n_nodes - 8*(i+1);
+      if(jEnd < 0) 
+       jEnd = 8 + jEnd;
+      else
+       jEnd = 8;
+      for(int j = 0; j < jEnd ; k++, j++){
+       out_stream<<std::setw(10)<<aRec.node_labels[k];
+      }
+      out_stream<<std::endl;
+    }
+  }
+
+  /*
+   * Write end of dataset
+   */
+  out_stream<<"    -1\n";
+}
+
+
+bool UNV2412::IsBeam(int theFeDescriptorId){
+  switch (theFeDescriptorId){
+  case 11:
+  case 21:
+  case 22:
+  case 24:
+  case 25:
+    return true;
+  }
+  return false;
+}
+
+
+bool UNV2412::IsFace(int theFeDescriptorId){
+  switch (theFeDescriptorId){
+    
+  case 71: // TRI3
+  case 72:
+  case 74:
+
+  case 41: // Plane Stress Linear Triangle - TRI3
+  case 91: // Thin Shell Linear Triangle - TRI3
+
+  case 42: // Plane Stress Quadratic Triangle - TRI6
+  case 92: // Thin Shell Quadratic Triangle - TRI6
+
+  case 43: // Plane Stress Cubic Triangle
+
+  case 44: // Plane Stress Linear Quadrilateral - QUAD4
+  case 94: // Thin Shell   Linear Quadrilateral -  QUAD4
+
+  case 45: // Plane Stress Quadratic Quadrilateral - QUAD8
+  case 95: // Thin Shell   Quadratic Quadrilateral - QUAD8
+
+  case 46: // Plane Stress Cubic Quadrilateral
+
+    return true;
+  }
+  return false;
+}
+
+
+bool UNV2412::IsVolume(int theFeDescriptorId){
+  //if(!IsBeam(theFeDescriptorId) && !IsFace(theFeDescriptorId))
+  //  return true;
+  switch (theFeDescriptorId){
+
+  case 111: // Solid Linear Tetrahedron - TET4
+  case 118: // Solid Quadratic Tetrahedron - TET10
+
+  case 112: // Solid Linear Prism - PRISM6
+
+  case 115: // Solid Linear Brick - HEX8
+  case 116: // Solid Quadratic Brick - HEX20
+
+  case 117: // Solid Cubic Brick
+    return true;
+  }
+  return false;
+}