Branch data Line data Source code
1 : : //-----------------------------------C++-------------------------------------//
2 : : // File: src/algs/meshkit/AssyGen.hpp
3 : : //
4 : : // Brief: AssyGen class definition:
5 : : // Creates reactor assembly geometry (ACIS or OCC format) and cubit mesh script as specified in a user defined input
6 : : // class, AssyGen
7 : : //---------------------------------------------------------------------------//
8 : :
9 : : #ifndef MESHKIT_ASSYGEN_HPP
10 : : #define MESHKIT_ASSYGEN_HPP
11 : :
12 : : #include <cassert>
13 : : #include <string>
14 : : #include <vector>
15 : : #include <set>
16 : :
17 : : #include "meshkit/Types.hpp"
18 : : #include "meshkit/Error.hpp"
19 : : #include "meshkit/MeshScheme.hpp"
20 : : #include "meshkit/ModelEnt.hpp"
21 : : #include "meshkit/MKCore.hpp"
22 : : #include "meshkit/SizingFunction.hpp"
23 : : #include "meshkit/RegisterMeshOp.hpp"
24 : :
25 : : #include "meshkit/LocalSet.hpp"
26 : : #include "meshkit/LocalTag.hpp"
27 : : #include "meshkit/Matrix.hpp"
28 : :
29 : : #include "meshkit/iMesh.hpp"
30 : : //#include "meshkit/iGeom.hpp"
31 : : #include "iGeom.h"
32 : : #include "MBCN.h"
33 : :
34 : : #include "meshkit/SimpleArray.hpp"
35 : :
36 : : #include "meshkit/vectortemplate.hpp"
37 : : #include "meshkit/matrixtemplate.hpp"
38 : : #include "meshkit/pincell.hpp"
39 : : #include "meshkit/parser.hpp"
40 : : #include "meshkit/clock.hpp"
41 : :
42 : : namespace MeshKit {
43 : :
44 : : #define DEFAULT_TEST_FILE "assygen_default"
45 : : #define TEST_FILE_NAME "assygen_default"
46 : :
47 : : //#define CHECK( STR ) if (err != iBase_SUCCESS) return Print_Error( STR, err, geom, __FILE__, __LINE__ )
48 : :
49 : : enum ErrorStates {PINCELLS, INVALIDINPUT, EMAT, EGEOMTYPE, EGEOMENGINE, ENEGATIVE, EALIAS, EPIN, EUNEQUAL};
50 : :
51 : : class MKCore;
52 : :
53 : : class AssyGen : public MeshScheme
54 : : {
55 : : public:
56 : : /* \brief Constructor
57 : : *
58 : : * Create a new AssyGen instance
59 : : * \param impl the iGeom instance handle for the Geom
60 : : */
61 : : AssyGen(MKCore *mk, const MEntVector &me_vec);
62 : :
63 : : /* \brief Destructor
64 : : */
65 : : virtual ~AssyGen();
66 : :
67 : : enum ErrorStates {PINCELLS, INVALIDINPUT, EMAT, EGEOMTYPE, EGEOMENGINE, ENEGATIVE, EALIAS, EPIN, EUNEQUAL};
68 : :
69 : : /**\brief Get class name */
70 : : static const char* name();
71 : :
72 : : /**\brief Function returning whether this scheme can mesh entities of t
73 : : * the specified dimension.
74 : : *\param dim entity dimension
75 : : */
76 : : static bool can_mesh(iBase_EntityType dim);
77 : :
78 : : /** \brief Function returning whether this scheme can mesh the specified entity
79 : : *
80 : : * Used by MeshOpFactory to find scheme for an entity.
81 : : * \param me ModelEnt being queried
82 : : * \return If true, this scheme can mesh the specified ModelEnt
83 : : */
84 : : static bool can_mesh(ModelEnt *me);
85 : :
86 : : /**\brief Get list of mesh entity types that can be generated.
87 : : *\return array terminated with \c moab::MBMAXTYPE
88 : : */
89 : : static const moab::EntityType* output_types();
90 : :
91 : : /** \brief Return the mesh entity types operated on by this scheme
92 : : * \return array terminated with \c moab::MBMAXTYPE
93 : : */
94 : : virtual const moab::EntityType* mesh_types_arr() const;
95 : :
96 : : /** \brief Re-implemented here so we can check topological dimension of model_ent
97 : : * \param model_ent ModelEnt being added
98 : : */
99 : : virtual bool add_modelent(ModelEnt *model_ent);
100 : :
101 : : //! Setup is a no-op, but must be provided since it's pure virtual
102 : : virtual void setup_this();
103 : :
104 : : //! The only setup/execute function we need, since meshing vertices is trivial
105 : : virtual void execute_this();
106 : :
107 : : /** \brief Prepare input/output files for reading/writing
108 : : * command line args and testdir for default test case
109 : : */
110 : : void PrepareIO (int argc, char *argv[], std::string TestDir);
111 : :
112 : : /** \brief Read the common.inp file
113 : : * common.inp is hardcoded name
114 : : */
115 : : void ReadCommonInp ();
116 : :
117 : : /** \brief Read the command based text input file
118 : : * input file
119 : : */
120 : : void ReadInputPhase1 ();
121 : :
122 : : /** \brief Keep reading input file and create
123 : : * input file
124 : : */
125 : : void ReadAndCreate ();
126 : :
127 : : /** \brief Create assygen input files
128 : : * based on material sets specified in master assygen input file
129 : : */
130 : : void CreateAssyGenInputFiles();
131 : :
132 : : /** \brief Name the surface created
133 : : * material name from input file, surface entity, name tag
134 : : */
135 : : void Name_Faces( const std::string sMatName, const iBase_EntityHandle body,
136 : : iBase_TagHandle this_tag);
137 : :
138 : : /** \brief Move the assembly to the center
139 : : * direction
140 : : */
141 : : void Center_Assm( char&);
142 : :
143 : : /** \brief Section assembly
144 : : * direction, offset, reverse/forward
145 : : */
146 : : void Section_Assm ( char&, double&, const std::string);
147 : :
148 : : /** \brief Rotate assembly
149 : : * direction, angle
150 : : */
151 : : void Rotate_Assm ( char&, double&);
152 : :
153 : : /** \brief Move assembly
154 : : * X, Y, Z distance
155 : : */
156 : : void Move_Assm ( double&, double&, double&);
157 : :
158 : : /** \brief Create hexagonal assembly
159 : : * data from input file
160 : : */
161 : : void Create_HexAssm( std::string &);
162 : :
163 : : /** \brief Create cartesian or rectangular assembly
164 : : * data from input file
165 : : */
166 : : void Create_CartAssm( std::string &);
167 : :
168 : : /** \brief Create outermost ducts
169 : : * data from input file
170 : : */
171 : : void CreateOuterCovering();
172 : :
173 : : /** \brief Merge and impring the geometry creaed
174 : : * geometry created
175 : : */
176 : : void Imprint_Merge (bool, bool);
177 : :
178 : : /** \brief Subtract the pins from innermost duct
179 : : * geometry entities
180 : : */
181 : : void Subtract_Pins ();
182 : :
183 : : /** \brief Get the top surface from 3D assembly geometry
184 : : * pins, ducts
185 : : */
186 : : void Create2DSurf();
187 : :
188 : : /** \brief Read pincell data
189 : : * input file
190 : : */
191 : : void ReadPinCellData( int i);
192 : :
193 : : /** \brief Create pincell i, pincell intersects the assembly
194 : : * i and location
195 : : */
196 : : void CreatePinCell_Intersect( int i, double dX,
197 : : double dY, double dZ);
198 : :
199 : : /** \brief Create pincell i
200 : : * i and location
201 : : */
202 : : void CreatePinCell( int i, double dX,
203 : : double dY, double dZ);
204 : :
205 : : /** \brief Write cubit journal file
206 : : * information read from text based input file
207 : : */
208 : : void CreateCubitJournal();
209 : :
210 : : /** \brief Computes the location of the pincells in the assembly
211 : : * pin-number and location of the pincell
212 : : */
213 : : void ComputePinCentroid( int, CMatrix<std::string>, int, int,
214 : : double&, double&, double&);
215 : :
216 : : private:
217 : : // iGeom Impl for calling geometry creation/manipulation operations
218 : : iGeom *igeomImpl;
219 : :
220 : : // number of sides in the geometry
221 : : int m_nSides;
222 : :
223 : : // file Input
224 : : std::ifstream m_FileInput, m_FileCommon;
225 : :
226 : : // journal file Output
227 : : std::ofstream m_FileOutput, m_SchemesFile, m_AssmInfo, m_PyCubGeomFile;
228 : :
229 : : // string for file names
230 : : std::string m_szSmooth, m_szAssmInfo, m_szLogFile, m_szCommonFile, m_szFile, m_szInFile,
231 : : m_szGeomFile, m_szGeomFile1, m_szJouFile, m_szSchFile, m_szPyCubGeom;
232 : :
233 : : // matrix for holding pincell arrangement
234 : : CMatrix<std::string> m_Assembly;
235 : :
236 : : // matrix for holding verts coordinates used in tet-meshing
237 : : CMatrix<double> m_dMTopSurfCoords;
238 : :
239 : : // vector for duct specification
240 : : CMatrix<double> m_dMAssmPitch, m_dMAssmPitchX, m_dMAssmPitchY, m_dMXYAssm, m_dMZAssm;
241 : :
242 : : // vector for material names
243 : : CVector<std::string> m_szAssmMat, m_szAssmMatAlias;
244 : : CMatrix<std::string> m_szMMAlias;
245 : :
246 : : // vector holding a pincell
247 : : CVector<CPincell> m_Pincell;
248 : :
249 : : CVector<double> m_dAxialSize, m_dBLMatBias;
250 : :
251 : : // string for geomtype, engine, meshtype
252 : : std::string m_szEngine;
253 : : std::string m_szGeomType;
254 : : std::string m_szMeshType;
255 : : std::string m_szSideset;
256 : : std::vector<std::string> m_szDuctMats;
257 : : // integers for vectors sizes, err etc
258 : : int m_nAssemblyMat, m_nDimensions, m_nPincells , m_nAssmVol, m_nPin, m_nPinX, m_nPinY, err, m_nLineNumber, m_nPlanar,
259 : : m_nNeumannSetId, m_nMaterialSetId, m_nDuct, m_nDuctNum, m_nJouFlag, m_nAssyGenInputFiles, m_nTotalPincells;
260 : :
261 : : // doubles for pincell pitch, pi and mesh sizes resp.
262 : : double m_dPitch, pi, m_dRadialSize, m_dTetMeshSize, m_dMergeTol, m_dZstart, m_dZend;
263 : :
264 : : // igeom related
265 : : SimpleArray<iBase_EntityHandle> assms, in_pins;
266 : : //iGeom_Instance geom;
267 : : iBase_EntitySetHandle root_set;
268 : :
269 : :
270 : : // error handlers
271 : : void IOErrorHandler (ErrorStates) const;
272 : : friend class CPincell;
273 : :
274 [ # # ]: 0 : struct superblocks{
275 : : int m_nSuperBlockId;
276 : : std::string m_szSuperBlockAlias;
277 : : int m_nNumSBContents;
278 : : CVector<int> m_nSBContents;
279 : : };
280 : :
281 : : int m_nSuperBlocks;
282 : : CVector<superblocks> sb;
283 : : int tmpSB;
284 : :
285 : : // parsing related
286 : : std::string szInputString;
287 : : std::string szComment;
288 : : int MAXCHARS, MAXLINES;
289 : :
290 : : std::vector< std::vector<iBase_EntityHandle> > cp_inpins;
291 : :
292 : : CVector<std::string> m_szBLAssmMat;
293 : : CVector<int> m_nListMatSet, m_nListNeuSet, m_nBLMatIntervals;
294 : :
295 : : int m_edgeInterval;
296 : : int m_nStartpinid;
297 : : std::string m_szInfo;
298 : : std::string m_szMeshScheme;
299 : : std::string pin_name;
300 : : int m_nHblock;
301 : : bool m_bCreateMatFiles;
302 : : bool save_exodus, m_bmerge, m_bimprint;
303 : : bool have_common;
304 : : int com_run_count;
305 : : int m_nBLAssemblyMat;
306 : : std::string m_szInnerDuct;
307 : : };
308 : :
309 : 621 : inline const char* AssyGen::name()
310 : : {
311 : 621 : return "AssyGen";
312 : : }
313 : :
314 : 160 : inline bool AssyGen::can_mesh(iBase_EntityType)
315 : : {
316 : 160 : return false;
317 : : }
318 : :
319 : 0 : inline bool AssyGen::can_mesh(ModelEnt *)
320 : : {
321 : 0 : return true;
322 : : }
323 : :
324 : 0 : inline const moab::EntityType* AssyGen::mesh_types_arr() const
325 : : {
326 : 0 : return output_types();
327 : : }
328 : :
329 : : } // namespace MeshKit
330 : : #endif
|