Branch data Line data Source code
1 : : //-----------------------------------C++-------------------------------------//
2 : : // File: src/algs/meshkit/CoreGen.hpp
3 : : //
4 : : // Brief: CoreGen class definition:
5 : : // Creates reactor core model from input mesh files
6 : : // class, CoreGen
7 : : //---------------------------------------------------------------------------//
8 : :
9 : : #ifndef MESHKIT_COREGEN_HPP
10 : : #define MESHKIT_COREGEN_HPP
11 : :
12 : :
13 : : #define STRINGIFY_(X) #X
14 : : #define STRINGIFY(X) STRINGIFY_(X)
15 : : #define COREGEN_DEFAULT_TEST_FILE "coregen_default"
16 : : #define CTEST_FILE_NAME "coregen_default"
17 : :
18 : : #include <cassert>
19 : : #include <string>
20 : : #include <vector>
21 : : #include <set>
22 : :
23 : : #include "meshkit/Types.hpp"
24 : : #include "meshkit/Error.hpp"
25 : : #include "meshkit/MeshScheme.hpp"
26 : : #include "meshkit/ModelEnt.hpp"
27 : : #include "meshkit/MKCore.hpp"
28 : : #include "meshkit/SizingFunction.hpp"
29 : : #include "meshkit/RegisterMeshOp.hpp"
30 : :
31 : : #include "meshkit/LocalSet.hpp"
32 : : #include "meshkit/LocalTag.hpp"
33 : : #include "meshkit/Matrix.hpp"
34 : :
35 : : #include "meshkit/iMesh.hpp"
36 : : #include "meshkit/iGeom.hpp"
37 : : #include "MBCN.h"
38 : :
39 : : #include "meshkit/vectortemplate.hpp"
40 : : #include "meshkit/matrixtemplate.hpp"
41 : : #include "meshkit/parser.hpp"
42 : : #include "meshkit/SimpleArray.hpp"
43 : : #include "meshkit/clock.hpp"
44 : : #include "meshkit/mstream.hpp"
45 : :
46 : : #include "iMesh_extensions.h"
47 : : #include "MBiMesh.hpp"
48 : : #include "moab/Interface.hpp"
49 : : #include "moab/Range.hpp"
50 : : #include "moab/Skinner.hpp"
51 : : #include "MBTagConventions.hpp"
52 : : #include "moab/MergeMesh.hpp"
53 : :
54 : :
55 : : #ifdef USE_MPI
56 : : #include "mpi.h"
57 : : #include "iMeshP.h"
58 : : #include "moab_mpi.h"
59 : : #include "moab/ParallelMergeMesh.hpp"
60 : : #include "moab/ParallelComm.hpp"
61 : : #include "MBParallelConventions.h"
62 : : #endif
63 : :
64 : : #include "meshkit/CopyGeom.hpp"
65 : : #include "meshkit/CopyMesh.hpp"
66 : : #include "meshkit/ExtrudeMesh.hpp"
67 : : #include "meshkit/CESets.hpp"
68 : :
69 : : namespace MeshKit {
70 : :
71 : : class MKCore;
72 : :
73 : : class CoreGen : public MeshScheme
74 : : {
75 : : public:
76 : : /* \brief Constructor
77 : : *
78 : : * Create a new CoreGen instance
79 : : * \param impl the iGeom instance handle for the Geom
80 : : */
81 : : CoreGen(MKCore *mk, const MEntVector &me_vec);
82 : :
83 : : /* \brief Destructor
84 : : */
85 : : virtual ~CoreGen();
86 : :
87 : : /**\brief Get class name */
88 : : static const char* name();
89 : :
90 : : /**\brief Function returning whether this scheme can mesh entities of t
91 : : * the specified dimension.
92 : : *\param dim entity dimension
93 : : */
94 : : static bool can_mesh(iBase_EntityType dim);
95 : :
96 : : /** \brief Function returning whether this scheme can mesh the specified entity
97 : : *
98 : : * Used by MeshOpFactory to find scheme for an entity.
99 : : * \param me ModelEnt being queried
100 : : * \return If true, this scheme can mesh the specified ModelEnt
101 : : */
102 : : static bool can_mesh(ModelEnt *me);
103 : :
104 : : /**\brief Get list of mesh entity types that can be generated.
105 : : *\return array terminated with \c moab::MBMAXTYPE
106 : : */
107 : : static const moab::EntityType* output_types();
108 : :
109 : : /** \brief Return the mesh entity types operated on by this scheme
110 : : * \return array terminated with \c moab::MBMAXTYPE
111 : : */
112 : : virtual const moab::EntityType* mesh_types_arr() const;
113 : :
114 : : /** \brief Re-implemented here so we can check topological dimension of model_ent
115 : : * \param model_ent ModelEnt being added
116 : : */
117 : : virtual bool add_modelent(ModelEnt *model_ent);
118 : :
119 : : //! Setup is a no-op, but must be provided since it's pure virtual
120 : : virtual void setup_this();
121 : :
122 : : //! The only setup/execute function we need, since meshing vertices is trivial
123 : : virtual void execute_this();
124 : :
125 : : enum ErrorStates {INVALIDINPUT, ENEGATIVE};
126 : : int prepareIO (int argc, char *argv[], int nrank, int numprocs, std::string TestDir);
127 : : int parse_assembly_names(CParser parse, int argc, char *argv[]);
128 : : int load_meshes();
129 : : int load_meshes_more_procs(const int, int);
130 : : int load_meshes_parallel(const int, int);
131 : : int distribute_mesh(const int, int);
132 : : int load_geometries();
133 : : int read_inputs_phase1 (int argc, char *argv[]);
134 : : int read_inputs_phase2 (int argc, char *argv[]);
135 : : int write_makefile ();
136 : : int write_minfofile ();
137 : : int find_assm(const int i, int &assm_index);
138 : : void banner();
139 : : int copymove(const int nrank, const int numprocs);
140 : : int copymove_all(const int nrank, const int numprocs);
141 : : int set_copymove_coords();
142 : : int save_mesh();
143 : : int save_mesh(int rank);
144 : : #ifdef USE_MPI
145 : : int save_mesh_parallel(const int nrank, const int numprocs);
146 : : #endif
147 : : int save_geometry();
148 : : int shift_mn_ids(iBase_EntitySetHandle orig_set, int index);
149 : : int extrude();
150 : : int move_verts(iBase_EntitySetHandle set, const double *dx);
151 : : int move_geoms(iBase_EntitySetHandle set, const double *dx);
152 : : int create_neumannset();
153 : : int refine_coremodel();
154 : : int load_and_compute_meshtogeom(iBase_EntitySetHandle set, std::string filenam);
155 : :
156 : : bool extrude_flag, umr_flag;
157 : : bool compute_meshtogeom;
158 : : std::vector <int> bsameas, deg;
159 : : bool mem_tflag;
160 : : std::string prob_type, savefiles, info, minfo, same_as, reloading_mf;
161 : : std::vector<std::string> files, all_meshfiles, mk_files;
162 : : std::vector<int> assm_meshfiles, size_mf, times_loaded;
163 : : std::vector<int> rank_load;
164 : : std::vector<double> load_per_assm;
165 : : std::vector< std::vector<int> > assm_location;
166 : : std::vector<std::vector<int> > position_core;
167 : : std::vector<int> meshfile_proc;
168 : : std::vector<double> x_coord;
169 : : std::vector<double> y_coord;
170 : : bool nst_flag, nsb_flag, nss_flag, nssall_flag;
171 : : std::vector<std::string> core_alias;
172 : : std::vector<double> nsx, nsy, nsc;
173 : : int num_nsside, ms_startid, ns_startid, nDegree;
174 : :
175 : : private:
176 : : //! iGeom Impl for calling geometry creation/manipulation operations
177 : : iGeom *igeom;
178 : :
179 : : //! iMesh Impl for calling mesh creation/manipulation operations
180 : : iMesh *imesh;
181 : :
182 : : //! MOAB Impl for calling mesh creation/manipulation operations
183 : : moab::Interface *mb;
184 : :
185 : : std::vector <CopyMesh*> cm;
186 : : std::vector <CopyGeom*> cg;
187 : : ExtrudeMesh *em;
188 : :
189 : : iBase_EntitySetHandle root_set;
190 : : std::vector<iBase_EntitySetHandle> assys;
191 : : std::vector<int> assys_index;
192 : : // declare variables read in the inputs
193 : : int rank, procs, err;
194 : : int UNITCELL_DUCT, ASSY_TYPES ;
195 : : int nrings, nringsx, nringsy, pack_type, symm;
196 : : double pitch, pitchx, pitchy;
197 : : bool global_ids, back_mesh, have_hex27;
198 : : std::string outfile, mesh_info;
199 : : int nassys; // the number of mesh files
200 : : int tot_assys; // total no. of assms forming core
201 : : int set_DIM; // default is 3D
202 : : double PII;
203 : : double z_height; // z_height for extruding surfaces mesh
204 : : int z_divisions; // z_divisions for extruding surface mesh
205 : : int nst_Id, nsb_Id, nssall_Id;
206 : : std::vector<int> nss_Id;
207 : : std::string testdir;
208 : :
209 : : // file related
210 : : std::ifstream file_input; // File Input
211 : : std::ofstream make_file, info_file, minfo_file; // File Output
212 : : std::string iname, ifile, mfile, geometry, back_meshfile, geom_engine, nsLoc, meshtogeomfile, infofile, minfofile, logfilename;
213 : : int linenumber;
214 : : std::string card,geom_type, meshfile, mf_alias, temp_alias, etype;
215 : : std::vector<std::string> assm_alias;
216 : : std::vector<int> all_ms_starts, all_ns_starts;
217 : :
218 : : mstream logfile, meshtogeom_file;
219 : :
220 : : // parsing related
221 : : std::string input_string;
222 : : std::string comment;
223 : : int MAXCHARS ;
224 : :
225 : : // merge related
226 : : double merge_tol;
227 : : int do_merge;
228 : : int update_sets;
229 : : iBase_TagHandle merge_tag;
230 : :
231 : : // MKUtils obj, assigning gid's etc.
232 : : // MKUtils *mu;
233 : : // error handler
234 : : void IOErrorHandler (ErrorStates) const;
235 : : CClock Timer;
236 : : std::string szDateTime;
237 : : int run_flag;
238 : : clock_t sTime;
239 : : #ifdef USE_MPI
240 : : moab::ParallelComm *pc;
241 : : #endif
242 : :
243 : : // timing related variables
244 : : double ctload, ctcopymove, ctmerge, ctextrude, ctns, ctgid, ctsave;
245 : : clock_t tload, tcopymove, tmerge, textrude, tns, tgid, tsave;
246 : :
247 : : // more memory/time related variables
248 : : int ld_t, ld_tload, ld_tcopymove, ld_tsave, ld_tgid, ld_tmerge, ld_tns;
249 : : unsigned long long mem1, mem2, mem3, mem4, mem5, mem6, mem7;
250 : : };
251 : :
252 : 540 : inline const char* CoreGen::name()
253 : : {
254 : 540 : return "CoreGen";
255 : : }
256 : :
257 : 160 : inline bool CoreGen::can_mesh(iBase_EntityType)
258 : : {
259 : 160 : return false;
260 : : }
261 : :
262 : 0 : inline bool CoreGen::can_mesh(ModelEnt *)
263 : : {
264 : 0 : return true;
265 : : }
266 : :
267 : 0 : inline const moab::EntityType* CoreGen::mesh_types_arr() const
268 : : {
269 : 0 : return output_types();
270 : : }
271 : :
272 : : } // namespace MeshKit
273 : : #endif
|