Branch data Line data Source code
1 : : #ifndef MESHKIT_ASSYMESHER_HPP
2 : : #define MESHKIT_ASSYMESHER_HPP
3 : :
4 : : #include <cassert>
5 : : #include <string>
6 : : #include <vector>
7 : : #include <set>
8 : : #include <iomanip>
9 : :
10 : : #include "meshkit/Types.hpp"
11 : : #include "meshkit/Error.hpp"
12 : : #include "meshkit/MeshScheme.hpp"
13 : : #include "meshkit/ModelEnt.hpp"
14 : :
15 : : #include "meshkit/LocalTag.hpp"
16 : : #include "meshkit/Matrix.hpp"
17 : :
18 : : #include "meshkit/iMesh.hpp"
19 : : #include "meshkit/iGeom.hpp"
20 : : #include "meshkit/mstream.hpp"
21 : :
22 : : #include "meshkit/SimpleArray.hpp"
23 : :
24 : : #include "meshkit/vectortemplate.hpp"
25 : : #include "meshkit/matrixtemplate.hpp"
26 : : #include "meshkit/pincell.hpp"
27 : : #include "meshkit/parser.hpp"
28 : : #include "meshkit/clock.hpp"
29 : :
30 : : namespace MeshKit {
31 : : #define DEFAULT_TEST_AM "assygen_default"
32 : :
33 : :
34 : : class MKCore;
35 : :
36 : : class AssyMesher : public MeshScheme
37 : : {
38 : : public:
39 : : /* \brief Constructor
40 : : *
41 : : * Create a new AssyMesher instance
42 : : * \param impl the iGeom instance handle for the Geom
43 : : */
44 : : AssyMesher(MKCore *mkcore, const MEntVector &me_vec);
45 : :
46 : : /* \brief Destructor
47 : : */
48 : : virtual ~AssyMesher();
49 : :
50 : : /**\brief Get class name */
51 : : static const char* name();
52 : :
53 : : /**\brief Function returning whether this scheme can mesh entities of t
54 : : * the specified dimension.
55 : : *\param dim entity dimension
56 : : */
57 : : static bool can_mesh(iBase_EntityType dim);
58 : :
59 : : /** \brief Function returning whether this scheme can mesh the specified entity
60 : : *
61 : : * Used by MeshOpFactory to find scheme for an entity.
62 : : * \param me ModelEnt being queried
63 : : * \return If true, this scheme can mesh the specified ModelEnt
64 : : */
65 : : static bool can_mesh(ModelEnt *me);
66 : :
67 : : /**\brief Get list of mesh entity types that can be generated.
68 : : *\return array terminated with \c moab::MBMAXTYPE
69 : : */
70 : : static const moab::EntityType* output_types();
71 : :
72 : : /** \brief Return the mesh entity types operated on by this scheme
73 : : * \return array terminated with \c moab::MBMAXTYPE
74 : : */
75 : : virtual const moab::EntityType* mesh_types_arr() const;
76 : :
77 : : /** \brief Re-implemented here so we can check topological dimension of model_ent
78 : : * \param model_ent ModelEnt being added
79 : : */
80 : : virtual bool add_modelent(ModelEnt *model_ent);
81 : :
82 : : //! Setup is a no-op, but must be provided since it's pure virtual
83 : : virtual void setup_this();
84 : :
85 : : //! The only setup/execute function we need, since meshing vertices is trivial
86 : : virtual void execute_this();
87 : :
88 : : /** \brief Prepare input/output files for reading/writing
89 : : * command line args and testdir for default test case
90 : : */
91 : : void PrepareIO (int argc, char *argv[], std::string TestDir);
92 : :
93 : : /** \brief Read pincell data
94 : : * input file
95 : : */
96 : : void ReadPinCellData( int i);
97 : :
98 : :
99 : : private:
100 : : //! iGeom Impl for calling geometry creation/manipulation operations
101 : : iGeom *igeom;
102 : :
103 : : //! iMesh Impl for calling mesh creation/manipulation operations
104 : : iMesh *imesh;
105 : :
106 : : //! MOAB Impl for calling mesh creation/manipulation operations
107 : : moab::Interface *mb;
108 : :
109 : : // igeom related
110 : : std::vector<iBase_EntityHandle> assms, in_pins;
111 : :
112 : : // number of sides in the geometry
113 : : int m_nSides;
114 : :
115 : : // !! file Input
116 : : std::ifstream m_FileInput, m_FileCommon;
117 : : mstream m_LogFile;
118 : : std::string szInputString;
119 : : std::string szComment;
120 : : int MAXCHARS;
121 : : bool have_common;
122 : :
123 : : // ! variables to parse
124 : : std::string m_InputFile, m_szCommonFile, m_GeomFile, m_MeshFile, m_OutFile, m_LogName, m_MeshType;
125 : : std::string m_Card;
126 : :
127 : : // ! error handlers
128 : : enum ErrorStates {PINCELLS, INVALIDINPUT, EMAT, EGEOMTYPE, EGEOMENGINE, ENEGATIVE, EALIAS, EPIN};
129 : : void IOErrorHandler (ErrorStates) const;
130 : :
131 : :
132 : : //// from assygen
133 : : // matrix for holding pincell arrangement
134 : : CMatrix<std::string> m_Assembly;
135 : :
136 : : // matrix for holding verts coordinates used in tet-meshing
137 : : CMatrix<double> m_dMTopSurfCoords;
138 : :
139 : : // vector for duct specification
140 : : CMatrix<double> m_dMAssmPitch, m_dMAssmPitchX, m_dMAssmPitchY, m_dMXYAssm, m_dMZAssm;
141 : :
142 : : // vector for material names
143 : : CVector<std::string> m_szAssmMat, m_szAssmMatAlias;
144 : : CMatrix<std::string> m_szMMAlias;
145 : :
146 : : // vector holding a pincell
147 : : CVector<CPincell> m_Pincell;
148 : :
149 : : // string for geomtype, engine, meshtype
150 : : std::string m_szEngine;
151 : : std::string m_szGeomType;
152 : : std::string m_szMeshType;
153 : : std::string m_szSideset;
154 : :
155 : : // integers for vectors sizes, err etc
156 : : int m_nAssemblyMat, m_nDimensions, m_nPincells, m_nLineNumber, m_nPlanar,
157 : : m_nNeumannSetId, m_nMaterialSetId, m_nDuct, m_nDuctNum, m_nJouFlag;
158 : :
159 : : // doubles for pincell pitch, pi and mesh sizes resp.
160 : : double m_dPitch, pi, m_dRadialSize, m_dAxialSize, m_dTetMeshSize, m_dMergeTol;
161 : :
162 : : // variable for storing material names
163 : : std::set<std::string> allMtrlsSet;
164 : :
165 : :
166 : : std::vector<iGeom::EntityHandle>* selectByMaterialsAndNameSuffix(
167 : : std::vector<iGeom::EntityHandle> const &geoEntVec,
168 : : std::set<std::string> const &matFilter, const char* suffix) const;
169 : :
170 : : void createMaterialNeumannSets(std::set <std::string> const &matFilter);
171 : : void createMaterialNeumannSets();
172 : :
173 : :
174 : : };
175 : :
176 : 581 : inline const char* AssyMesher::name()
177 : : {
178 : 581 : return "AssyMesher";
179 : : }
180 : :
181 : 160 : inline bool AssyMesher::can_mesh(iBase_EntityType)
182 : : {
183 : : // Given just a dimension, AssyMesher can't do anything since it doesn't know
184 : : // what to copy.
185 : 160 : return false;
186 : : }
187 : :
188 : 0 : inline bool AssyMesher::can_mesh(ModelEnt *)
189 : : {
190 : 0 : return true;
191 : : }
192 : :
193 : 0 : inline const moab::EntityType* AssyMesher::mesh_types_arr() const
194 : : {
195 : 0 : return output_types();
196 : : }
197 : :
198 : : } // namespace MeshKit
199 : : #endif
|