File size: 8,378 Bytes
985c397 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 | /***************************************************************************
* Copyright (c) 2009 Jürgen Riegel <juergen.riegel@web.de> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* 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 Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#ifndef FEM_FEMMESH_H
#define FEM_FEMMESH_H
#include <list>
#include <memory>
#include <vector>
#include <SMDSAbs_ElementType.hxx>
#include <SMESH_Version.h>
#include <App/ComplexGeoData.h>
#include <Base/Quantity.h>
#include <Mod/Fem/FemGlobal.h>
class SMESH_Gen;
class SMESH_Mesh;
class SMESH_Hypothesis;
class TopoDS_Shape;
class TopoDS_Face;
class TopoDS_Edge;
class TopoDS_Vertex;
class TopoDS_Solid;
namespace Fem
{
enum class ABAQUS_VolumeVariant
{
Standard,
Reduced,
Incompatible,
Modified,
Fluid
};
enum class ABAQUS_FaceVariant
{
Shell,
Shell_Reduced,
Membrane,
Membrane_Reduced,
Stress,
Stress_Reduced,
Strain,
Strain_Reduced,
Axisymmetric,
Axisymmetric_Reduced
};
enum class ABAQUS_EdgeVariant
{
Beam,
Beam_Reduced,
Truss,
Network
};
using SMESH_HypothesisPtr = std::shared_ptr<SMESH_Hypothesis>;
/** The representation of a FemMesh
*/
class FemExport FemMesh: public Data::ComplexGeoData
{
TYPESYSTEM_HEADER_WITH_OVERRIDE();
public:
FemMesh();
FemMesh(const FemMesh&);
~FemMesh() override;
FemMesh& operator=(const FemMesh&);
const SMESH_Mesh* getSMesh() const;
SMESH_Mesh* getSMesh();
static SMESH_Gen* getGenerator();
void addHypothesis(const TopoDS_Shape& aSubShape, SMESH_HypothesisPtr hyp);
void setStandardHypotheses();
template<typename T>
SMESH_HypothesisPtr createHypothesis(int hypId);
void compute();
// from base class
unsigned int getMemSize() const override;
void Save(Base::Writer& /*writer*/) const override;
void Restore(Base::XMLReader& /*reader*/) override;
void SaveDocFile(Base::Writer& writer) const override;
void RestoreDocFile(Base::Reader& reader) override;
/** @name Subelement management */
//@{
/** Sub type list
* List of different subelement types
* it is NOT a list of the subelements itself
*/
std::vector<const char*> getElementTypes() const override;
unsigned long countSubElements(const char* Type) const override;
/// get the subelement by type and number
Data::Segment* getSubElement(const char* Type, unsigned long) const override;
/** Get points from object with given accuracy */
void getPoints(
std::vector<Base::Vector3d>& Points,
std::vector<Base::Vector3d>& Normals,
double Accuracy,
uint16_t flags = 0
) const override;
//@}
/** @name search and retrieval */
//@{
/// retrieving by region growing
std::set<long> getSurfaceNodes(long ElemId, short FaceId, float Angle = 360) const;
/// retrieving by solid
std::set<int> getNodesBySolid(const TopoDS_Solid& solid) const;
/// retrieving by face
std::set<int> getNodesByFace(const TopoDS_Face& face) const;
/// retrieving by edge
std::set<int> getNodesByEdge(const TopoDS_Edge& edge) const;
/// retrieving by vertex
std::set<int> getNodesByVertex(const TopoDS_Vertex& vertex) const;
/// retrieving node IDs by element ID
std::list<int> getElementNodes(int id) const;
/// retrieving elements IDs by node ID
std::list<int> getNodeElements(int id, SMDSAbs_ElementType type = SMDSAbs_All) const;
/// retrieving face IDs number by face
std::list<int> getFacesByFace(const TopoDS_Face& face) const;
/// retrieving edge IDs number by edge
std::list<int> getEdgesByEdge(const TopoDS_Edge& edge) const;
/// retrieving volume IDs and face IDs number by face
std::list<std::pair<int, int>> getVolumesByFace(const TopoDS_Face& face) const;
/// retrieving volume IDs and CalculiX face number by face
std::map<int, int> getccxVolumesByFace(const TopoDS_Face& face) const;
/// retrieving IDs of edges not belonging to any face (and thus not belonging to any volume too)
std::set<int> getEdgesOnly() const;
/// retrieving IDs of faces not belonging to any volume
std::set<int> getFacesOnly() const;
//@}
/** @name Placement control */
//@{
/// set the transformation
void setTransform(const Base::Matrix4D& rclTrf) override;
/// get the transformation
Base::Matrix4D getTransform() const override;
/// Bound box from the shape
Base::BoundBox3d getBoundBox() const override;
/// get the volume (when there are volume elements)
Base::Quantity getVolume() const;
//@}
/** @name Modification */
//@{
/// Applies a transformation on the real geometric data type
void transformGeometry(const Base::Matrix4D& rclMat) override;
//@}
/** @name Group management */
//@{
/// Adds group to mesh
int addGroup(const std::string, const std::string, const int = -1);
/// Adds elements to group (int due to int used by raw SMESH functions)
void addGroupElements(int, const std::set<int>&);
/// Remove group (Name due to similarity to SMESH basis functions)
bool removeGroup(int);
/// Rename group
void renameGroup(int id, const std::string& name);
//@}
struct FemMeshInfo
{
int numFaces;
int numNode;
int numTria;
int numQuad;
int numPoly;
int numVolu;
int numTetr;
int numHexa;
int numPyrd;
int numPris;
int numHedr;
};
///
struct FemMeshInfo getInfo() const;
/// import from files
void read(const char* FileName);
void write(const char* FileName) const;
void writeABAQUS(
const std::string& Filename,
int elemParam,
bool groupParam,
ABAQUS_VolumeVariant volVariant = ABAQUS_VolumeVariant::Standard,
ABAQUS_FaceVariant faceVariant = ABAQUS_FaceVariant::Shell,
ABAQUS_EdgeVariant edgeVariant = ABAQUS_EdgeVariant::Beam
) const;
void writeVTK(const std::string& FileName, bool highest = true) const;
void writeZ88(const std::string& FileName) const;
private:
void copyMeshData(const FemMesh&);
void readNastran(const std::string& Filename);
void readNastran95(const std::string& Filename);
void readZ88(const std::string& Filename);
void readAbaqus(const std::string& Filename);
private:
/// positioning matrix
Base::Matrix4D _Mtrx;
SMESH_Mesh* myMesh;
#if SMESH_VERSION_MAJOR < 9
const int myStudyId;
#endif
std::list<SMESH_HypothesisPtr> hypoth;
static SMESH_Gen* _mesh_gen;
};
template<typename T>
inline SMESH_HypothesisPtr FemMesh::createHypothesis(int hypId)
{
SMESH_Gen* myGen = getGenerator();
#if SMESH_VERSION_MAJOR >= 9
SMESH_HypothesisPtr hypo(new T(hypId, myGen));
#else
// use own StudyContextStruct
SMESH_HypothesisPtr hypo(new T(hypId, myStudyId, myGen));
#endif
return hypo;
}
} // namespace Fem
#endif // FEM_FEMMESH_H
|