FEBio  1.5.0
FEBio/FEBioPlotFile.h
00001 #pragma once
00002 #include "FEElasticShellDomain.h"
00003 #include "FEElasticSolidDomain.h"
00004 #include "FEElasticTrussDomain.h"
00005 #include "FEDiscreteDomain.h"
00006 #include "PlotFile.h"
00007 #include "Archive.h"
00008 #include <list>
00009 using namespace std;
00010 
00011 //-----------------------------------------------------------------------------
00015 class FEBioPlotFile : public PlotFile
00016 {
00017 protected:
00018         // file version
00019         enum { PLT_VERSION = 0x0001 };
00020 
00021         // file tags
00022         enum { 
00023                 PLT_ROOT                                                = 0x01000000,
00024                 PLT_HEADER                                              = 0x01010000,
00025                         PLT_HDR_VERSION                         = 0x01010001,
00026                         PLT_HDR_NODES                           = 0x01010002,
00027                 PLT_DICTIONARY                                  = 0x01020000,
00028                         PLT_DIC_ITEM                            = 0x01020001,
00029                         PLT_DIC_ITEM_TYPE                       = 0x01020002,
00030                         PLT_DIC_ITEM_FMT                        = 0x01020003,
00031                         PLT_DIC_ITEM_NAME                       = 0x01020004,
00032                         PLT_DIC_GLOBAL                          = 0x01021000,
00033                         PLT_DIC_MATERIAL                        = 0x01022000,
00034                         PLT_DIC_NODAL                           = 0x01023000,
00035                         PLT_DIC_DOMAIN                          = 0x01024000,
00036                         PLT_DIC_SURFACE                         = 0x01025000,
00037                 PLT_MATERIALS                                   = 0x01030000,
00038                         PLT_MATERIAL                            = 0x01030001,
00039                         PLT_MAT_ID                                      = 0x01030002,
00040                         PLT_MAT_NAME                            = 0x01030003,
00041                 PLT_GEOMETRY                                    = 0x01040000,
00042                         PLT_NODE_SECTION                        = 0x01041000,
00043                                 PLT_NODE_COORDS                 = 0x01041001,
00044                         PLT_DOMAIN_SECTION                      = 0x01042000,
00045                                 PLT_DOMAIN                              = 0x01042100,
00046                                 PLT_DOMAIN_HDR                  = 0x01042101,
00047                                         PLT_DOM_ELEM_TYPE       = 0x01042102,
00048                                         PLT_DOM_MAT_ID          = 0x01042103,
00049                                         PLT_DOM_ELEMS           = 0x01032104,
00050                                 PLT_DOM_ELEM_LIST               = 0x01042200,
00051                                         PLT_ELEMENT                     = 0x01042201,
00052                         PLT_SURFACE_SECTION                     = 0x01043000,
00053                                 PLT_SURFACE                             = 0x01043100,
00054                                 PLT_SURFACE_HDR                 = 0x01043101,
00055                                         PLT_SURFACE_ID          = 0x01043102,
00056                                         PLT_SURFACE_FACES       = 0x01043103,
00057                                 PLT_FACE_LIST                   = 0x01043200,
00058                                         PLT_FACE                        = 0x01043201,
00059                 PLT_STATE                                               = 0x02000000,
00060                         PLT_STATE_HEADER                        = 0x02010000,
00061                                 PLT_STATE_HDR_ID                = 0x02010001,
00062                                 PLT_STATE_HDR_TIME              = 0x02010002,
00063                         PLT_STATE_DATA                          = 0x02020000,
00064                                 PLT_STATE_VARIABLE              = 0x02020001,
00065                                 PLT_STATE_VAR_ID                = 0x02020002,
00066                                 PLT_STATE_VAR_DATA              = 0x02020003,
00067                                 PLT_GLOBAL_DATA                 = 0x02020100,
00068                                 PLT_MATERIAL_DATA               = 0x02020200,
00069                                 PLT_NODE_DATA                   = 0x02020300,
00070                                 PLT_ELEMENT_DATA                = 0x02020400,
00071                                 PLT_FACE_DATA                   = 0x02020500
00072         };
00073 
00074         // --- element types ---
00075         enum Elem_Type { PLT_ELEM_HEX, PLT_ELEM_PENTA, PLT_ELEM_TET, PLT_ELEM_QUAD, PLT_ELEM_TRI, PLT_ELEM_TRUSS };
00076 
00077         // size of name variables
00078         enum { STR_SIZE = 64 };
00079 
00080 public:
00081         // Dictionary entry
00082         struct DICTIONARY_ITEM
00083         {
00084                 FEPlotData*             m_psave;
00085                 unsigned int    m_ntype;        // data type
00086                 unsigned int    m_nfmt;         // storage format
00087                 char                    m_szname[STR_SIZE];
00088         };
00089 
00090         class Dictionary
00091         {
00092         public:
00093                 bool AddVariable(const char* szname);
00094 
00095                 int NodalVariables  () { return m_Node.size(); }
00096                 int DomainVarialbes () { return m_Elem.size(); }
00097                 int SurfaceVariables() { return m_Face.size(); }
00098 
00099                 void Defaults(FEM& fem);
00100 
00101                 void Clear();
00102 
00103         public:
00104                 const list<DICTIONARY_ITEM>& GlobalVariableList  () const { return m_Glob; }
00105                 const list<DICTIONARY_ITEM>& MaterialVariableList() const { return m_Mat;  }
00106                 const list<DICTIONARY_ITEM>& NodalVariableList   () const { return m_Node; }
00107                 const list<DICTIONARY_ITEM>& DomainVariableList  () const { return m_Elem; }
00108                 const list<DICTIONARY_ITEM>& SurfaceVariableList () const { return m_Face; }
00109 
00110         protected:
00111                 bool AddGlobalVariable  (FEPlotData* ps, const char* szname);
00112                 bool AddMaterialVariable(FEPlotData* ps, const char* szname);
00113                 bool AddNodalVariable   (FEPlotData* ps, const char* szname);
00114                 bool AddDomainVariable  (FEPlotData* ps, const char* szname);
00115                 bool AddSurfaceVariable (FEPlotData* ps, const char* szname);
00116 
00117         protected:
00118                 list<DICTIONARY_ITEM>   m_Glob;         // Global variables
00119                 list<DICTIONARY_ITEM>   m_Mat;          // Material variables
00120                 list<DICTIONARY_ITEM>   m_Node;         // Node variables
00121                 list<DICTIONARY_ITEM>   m_Elem;         // Domain variables
00122                 list<DICTIONARY_ITEM>   m_Face;         // Surface variables
00123 
00124                 friend class FEBioPlotFile;
00125         };
00126 
00127 public:
00128         FEBioPlotFile(void);
00129         ~FEBioPlotFile(void);
00130 
00132         bool Open(FEM& fem, const char* szfile);
00133 
00135         bool Append(FEM& fem, const char* szfile);
00136 
00138         bool Write(FEM& fem);
00139 
00141         bool AddVariable(const char* sz) { return m_dic.AddVariable(sz); }
00142 
00143 public:
00144         const Dictionary& GetDictionary() const { return m_dic; }
00145 
00146 protected:
00147         bool WriteHeader    (FEM& fem);
00148         bool WriteDictionary(FEM& fem);
00149         bool WriteMaterials (FEM& fem);
00150         bool WriteGeometry  (FEM& fem);
00151 
00152         void WriteDicList(list<DICTIONARY_ITEM>& dic);
00153 
00154         void WriteNodeSection   (FEMesh& m);
00155         void WriteDomainSection (FEMesh& m);
00156         void WriteSurfaceSection(FEMesh& m);
00157 
00158         void WriteSolidDomain   (FESolidDomain&    dom);
00159         void WriteShellDomain   (FEShellDomain&    dom);
00160         void WriteTrussDomain   (FETrussDomain&    dom);
00161         void WriteDiscreteDomain(FEDiscreteDomain& dom);
00162 
00163         void WriteGlobalData  (FEM& fem);
00164         void WriteMaterialData(FEM& fem);
00165         void WriteNodeData    (FEM& fem);
00166         void WriteDomainData  (FEM& fem);
00167         void WriteSurfaceData (FEM& fem);
00168 
00169 protected:
00170         bool ReadDictionary();
00171         bool ReadDicList();
00172 
00173 protected:
00174         Dictionary      m_dic;  // dictionary
00175         Archive         m_ar;   // the data archive
00176 };