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