Branch data Line data Source code
1 : : /**
2 : : * MOAB, a Mesh-Oriented datABase, is a software component for creating,
3 : : * storing and accessing finite element mesh data.
4 : : *
5 : : * Copyright 2004 Sandia Corporation. Under the terms of Contract
6 : : * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
7 : : * retains certain rights in this software.
8 : : *
9 : : * This library is free software; you can redistribute it and/or
10 : : * modify it under the terms of the GNU Lesser General Public
11 : : * License as published by the Free Software Foundation; either
12 : : * version 2.1 of the License, or (at your option) any later version.
13 : : *
14 : : */
15 : :
16 : : /*
17 : : * Tim's Quick 'N Dirty Cub File Reader (Tqdcfr)
18 : : *
19 : : */
20 : :
21 : : #ifndef TQDCFR
22 : : #define TQDCFR
23 : :
24 : : #include "moab/Forward.hpp"
25 : : #include "moab/ReaderIface.hpp"
26 : : #include "MBTagConventions.hpp"
27 : : #include "moab/Range.hpp"
28 : :
29 : : #include <stdio.h>
30 : : #include <string>
31 : : #include <vector>
32 : : #include <map>
33 : :
34 : : namespace moab
35 : : {
36 : :
37 : : class ReadUtilIface;
38 : : class FEModelHeader;
39 : : class GeomHeader;
40 : : class GroupHeader;
41 : : class BlockHeader;
42 : : class NodesetHeader;
43 : : class SidesetHeader;
44 : :
45 : : class Tqdcfr : public ReaderIface
46 : : {
47 : : public:
48 : : void FSEEK( unsigned offset ); // set cubFile offset to specified value
49 : : void FREADI( unsigned num_ents ); // read integers into uint_buf
50 : : void FREADD( unsigned num_ents ); // read doubles into dbl_buf
51 : : void FREADC( unsigned num_ents ); // read characters into char_buf
52 : : void FREADIA( unsigned num_ents, unsigned int* array ); // read integers
53 : : void FREADDA( unsigned num_ents, double* array ); // read doubles
54 : : void FREADCA( unsigned num_ents, char* arrat ); // read bytes
55 : : void CONVERT_TO_INTS( unsigned int num_ents ); // convert uint_buf to int_buf in-place
56 : :
57 : : // class for holding the file table of contents
58 : : class FileTOC
59 : : {
60 : : public:
61 : : unsigned int fileEndian, fileSchema, numModels, modelTableOffset, modelMetaDataOffset, activeFEModel;
62 : :
63 : : FileTOC();
64 : : void print();
65 : : };
66 : :
67 : : //
68 : 0 : class FEModelHeader
69 : : {
70 : : public:
71 : : unsigned int feEndian, feSchema, feCompressFlag, feLength;
72 : :
73 : : class ArrayInfo
74 : : {
75 : : public:
76 : : unsigned numEntities, tableOffset, metaDataOffset;
77 : :
78 : : ArrayInfo();
79 : :
80 : : void print();
81 : : void init( const std::vector< unsigned int >& uint_buf_in );
82 : : };
83 : :
84 : : ArrayInfo geomArray, nodeArray, elementArray, groupArray, blockArray, nodesetArray, sidesetArray;
85 : :
86 : : void init( const unsigned int offset, Tqdcfr* instance );
87 : :
88 : : void print();
89 : : };
90 : :
91 : 2 : class MetaDataContainer
92 : : {
93 : : public:
94 : : unsigned int mdSchema, compressFlag;
95 : :
96 [ # # ][ # # ]: 0 : class MetaDataEntry
[ # # ]
97 : : {
98 : : public:
99 : : unsigned int mdOwner, mdDataType, mdIntValue;
100 : : std::string mdName, mdStringValue;
101 : : std::vector< unsigned int > mdIntArrayValue;
102 : : double mdDblValue;
103 : : std::vector< double > mdDblArrayValue;
104 : :
105 : : MetaDataEntry();
106 : :
107 : : void print();
108 : : };
109 : :
110 : : void print();
111 : :
112 : : int get_md_entry( const unsigned int owner, const std::string& name );
113 : :
114 : : std::vector< MetaDataEntry > metadataEntries;
115 : : MetaDataContainer();
116 : : };
117 : :
118 : : class GeomHeader
119 : : {
120 : : public:
121 : : unsigned int geomID, nodeCt, nodeOffset, elemCt, elemOffset, elemTypeCt, elemLength;
122 : :
123 : : int maxDim;
124 : :
125 : : EntityHandle setHandle;
126 : :
127 : : void print();
128 : :
129 : : static ErrorCode read_info_header( const unsigned int model_offset, const FEModelHeader::ArrayInfo& info,
130 : : Tqdcfr* instance, GeomHeader*& entity_headers );
131 : :
132 : : GeomHeader();
133 : : };
134 : :
135 : : class GroupHeader
136 : : {
137 : : public:
138 : : unsigned int grpID, grpType, memCt, memOffset, memTypeCt, grpLength;
139 : :
140 : : EntityHandle setHandle;
141 : :
142 : : void print();
143 : :
144 : : static ErrorCode read_info_header( const unsigned int model_offset, const FEModelHeader::ArrayInfo& info,
145 : : Tqdcfr* instance, GroupHeader*& entity_headers );
146 : :
147 : : GroupHeader();
148 : : };
149 : :
150 : : class BlockHeader
151 : : {
152 : : public:
153 : : unsigned int blockID, blockElemType, memCt, memOffset, memTypeCt, attribOrder, blockCol, blockMixElemType,
154 : : blockPyrType, blockMat, blockLength, blockDim;
155 : :
156 : : EntityHandle setHandle;
157 : :
158 : : EntityType blockEntityType;
159 : :
160 : : int hasMidNodes[4];
161 : :
162 : : void print();
163 : :
164 : : static ErrorCode read_info_header( const double data_version, const unsigned int model_offset,
165 : : const FEModelHeader::ArrayInfo& info, Tqdcfr* instance,
166 : : BlockHeader*& block_headers );
167 : :
168 : : BlockHeader();
169 : : };
170 : :
171 : : class NodesetHeader
172 : : {
173 : : public:
174 : : unsigned int nsID, memCt, memOffset, memTypeCt, pointSym, nsCol, nsLength;
175 : :
176 : : EntityHandle setHandle;
177 : :
178 : : void print();
179 : :
180 : : static ErrorCode read_info_header( const unsigned int model_offset, const FEModelHeader::ArrayInfo& info,
181 : : Tqdcfr* instance, NodesetHeader*& entity_headers );
182 : :
183 : : NodesetHeader();
184 : : };
185 : :
186 : : class SidesetHeader
187 : : {
188 : : public:
189 : : unsigned int ssID, memCt, memOffset, memTypeCt, numDF, ssCol, useShell, ssLength;
190 : :
191 : : EntityHandle setHandle;
192 : :
193 : : void print();
194 : :
195 : : static ErrorCode read_info_header( const unsigned int model_offset, const FEModelHeader::ArrayInfo& info,
196 : : Tqdcfr* instance, SidesetHeader*& entity_headers );
197 : :
198 : : SidesetHeader();
199 : : };
200 : :
201 : : // class to hold model entry data for various kinds of models
202 : : // (acis, free mesh, etc.)
203 [ # # ][ # # ]: 0 : class ModelEntry
[ # # ][ # # ]
[ # # ][ # # ]
204 : : {
205 : : public:
206 : : ModelEntry();
207 : :
208 : : ~ModelEntry();
209 : :
210 : : unsigned int modelHandle, modelOffset, modelLength, modelType, modelOwner, modelPad;
211 : :
212 : : FEModelHeader feModelHeader;
213 : : GeomHeader* feGeomH;
214 : : GroupHeader* feGroupH;
215 : : BlockHeader* feBlockH;
216 : : NodesetHeader* feNodeSetH;
217 : : SidesetHeader* feSideSetH;
218 : :
219 : : MetaDataContainer geomMD, nodeMD, elementMD, groupMD, blockMD, nodesetMD, sidesetMD;
220 : :
221 : : void print();
222 : :
223 : : void print_geom_headers( const char* prefix, GeomHeader* header, unsigned int num_headers );
224 : :
225 : : void print_group_headers( const char* prefix, GroupHeader* header, const unsigned int num_headers );
226 : :
227 : : void print_block_headers( const char* prefix, BlockHeader* header, const unsigned int num_headers );
228 : :
229 : : void print_nodeset_headers( const char* prefix, NodesetHeader* header, const unsigned int num_headers );
230 : :
231 : : void print_sideset_headers( const char* prefix, SidesetHeader* header, const unsigned int num_headers );
232 : :
233 : : ErrorCode read_header_info( Tqdcfr* instance, const double data_version );
234 : : ErrorCode read_metadata_info( Tqdcfr* tqd );
235 : : };
236 : :
237 : : enum
238 : : {
239 : : aBODY,
240 : : LUMP,
241 : : SHELL,
242 : : FACE,
243 : : LOOP,
244 : : COEDGE,
245 : : aEDGE,
246 : : aVERTEX,
247 : : ATTRIB,
248 : : UNKNOWN
249 : : };
250 : :
251 : 0 : struct AcisRecord
252 : : {
253 : : unsigned int rec_type;
254 : : std::string att_string;
255 : : bool processed;
256 : : int first_attrib;
257 : : int att_prev, att_next, att_ent_num;
258 : : EntityHandle entity;
259 : : };
260 : :
261 : : ~Tqdcfr();
262 : :
263 : : ReadUtilIface* readUtilIface;
264 : : Interface* mdbImpl;
265 : : FILE* cubFile;
266 : : FileTOC fileTOC;
267 : : std::vector< ModelEntry > modelEntries;
268 : : MetaDataContainer modelMetaData;
269 : : long currVHandleOffset;
270 : : Range beforeEnts;
271 : : long currElementIdOffset[MBMAXTYPE];
272 : : Tag globalIdTag, cubIdTag, geomTag, uniqueIdTag, blockTag, nsTag, ssTag, attribVectorTag, entityNameTag,
273 : : categoryTag, hasMidNodesTag;
274 : : std::map< int, EntityHandle > uidSetMap;
275 : : std::map< int, EntityHandle > gidSetMap[6];
276 : : bool swapForEndianness;
277 : :
278 : : std::vector< unsigned int > uint_buf;
279 : : int* int_buf;
280 : : std::vector< double > dbl_buf;
281 : : std::vector< char > char_buf;
282 : :
283 : : static ReaderIface* factory( Interface* );
284 : :
285 : : // read cub file
286 : : ErrorCode load_file( const char* file_name, const EntityHandle* file_set, const FileOptions& opts,
287 : : const SubsetList* subset_list = 0, const Tag* file_id_tag = 0 );
288 : :
289 : : ErrorCode read_tag_values( const char* file_name, const char* tag_name, const FileOptions& opts,
290 : : std::vector< int >& tag_values_out, const SubsetList* subset_list = 0 );
291 : :
292 : : ErrorCode read_nodeset( const unsigned int nsindex, ModelEntry* model, NodesetHeader* nodeseth );
293 : : ErrorCode read_sideset( const unsigned int ssindex, const double data_version, ModelEntry* model,
294 : : SidesetHeader* sideseth );
295 : : ErrorCode read_block( const unsigned int blindex, const double data_version, ModelEntry* model,
296 : : BlockHeader* blockh );
297 : : ErrorCode read_group( const unsigned int gr_index, ModelEntry* model, GroupHeader* grouph );
298 : : ErrorCode read_nodes( const unsigned int gindex, ModelEntry* model, GeomHeader* entity );
299 : : ErrorCode read_elements( ModelEntry* model, GeomHeader* entity );
300 : : ErrorCode read_file_header();
301 : : ErrorCode read_model_entries();
302 : : int find_model( const unsigned int model_type );
303 : : ErrorCode read_meta_data( const unsigned int metadata_offset, MetaDataContainer& mc );
304 : : ErrorCode read_md_string( std::string& name );
305 : :
306 : : enum
307 : : {
308 : : mesh,
309 : : acist,
310 : : acisb,
311 : : facet,
312 : : exodusmesh
313 : : };
314 : : EntityType type_from_cub_type( const unsigned int cub_type, const unsigned int nodes_per_elem );
315 : : void check_contiguous( const unsigned int num_ents, int& contig, unsigned int& min_id, unsigned int& max_id );
316 : :
317 : : Tqdcfr( Interface* impl );
318 : :
319 : : ErrorCode create_set( EntityHandle& h, unsigned int flags = MESHSET_SET );
320 : :
321 : : private:
322 : : EntityHandle mFileSet; // set containing read entities.
323 : :
324 : : bool printedSeqWarning; // only print acis sequence #'s warning once
325 : :
326 : : bool printedElemWarning; // only print element #'s warning once
327 : :
328 : : ErrorCode convert_nodesets_sidesets();
329 : :
330 : : ErrorCode read_acis_records( const char* sat_file_name = 0 );
331 : :
332 : : ErrorCode parse_acis_attribs( const unsigned int entity_rec_num, std::vector< AcisRecord >& records );
333 : : ErrorCode interpret_acis_records( std::vector< AcisRecord >& records );
334 : :
335 : : ErrorCode reset_record( AcisRecord& this_record );
336 : :
337 : : ErrorCode process_record( AcisRecord& this_record );
338 : :
339 : : static const char geom_categories[][CATEGORY_TAG_SIZE];
340 : :
341 : : FILE* acisDumpFile;
342 : :
343 : : // map between cub ids and MOAB handles
344 : : std::vector< EntityHandle >* cubMOABVertexMap;
345 : :
346 : : // enum used to identify element/entity type in groups
347 : : enum
348 : : {
349 : : GROUP = 0,
350 : : BODY,
351 : : VOLUME,
352 : : SURFACE,
353 : : CURVE,
354 : : VERTEX,
355 : : HEX,
356 : : TET,
357 : : PYRAMID,
358 : : QUAD,
359 : : TRI,
360 : : EDGE,
361 : : NODE
362 : : };
363 : : static const EntityType group_type_to_mb_type[];
364 : :
365 : : enum
366 : : {
367 : : SPHERE_EXO = 0,
368 : : BAR,
369 : : BAR2,
370 : : BAR3,
371 : : BEAM,
372 : : BEAM2,
373 : : BEAM3,
374 : : TRUSS,
375 : : TRUSS2,
376 : : TRUSS3,
377 : : SPRING,
378 : : TRIthree,
379 : : TRI3,
380 : : TRI6,
381 : : TRI7,
382 : : TRISHELL,
383 : : TRISHELL3,
384 : : TRISHELL6,
385 : : TRISHELL7,
386 : : SHEL,
387 : : SHELL4,
388 : : SHELL8,
389 : : SHELL9,
390 : : QUADfour,
391 : : QUAD4,
392 : : QUAD5,
393 : : QUAD8,
394 : : QUAD9,
395 : : TETRAfour,
396 : : TETRA4,
397 : : TETRA8,
398 : : TETRA10,
399 : : TETRA14,
400 : : PYRAMIDfive,
401 : : PYRAMID5,
402 : : PYRAMID8,
403 : : PYRAMID13,
404 : : PYRAMID18,
405 : : HEXeight,
406 : : HEX8,
407 : : HEX9,
408 : : HEX20,
409 : : HEX27,
410 : : HEXSHELL,
411 : : INVALID_ELEMENT_TYPE
412 : : };
413 : : static const EntityType block_type_to_mb_type[];
414 : : static const int cub_elem_num_verts[];
415 : : static const int cub_elem_num_verts_len;
416 : :
417 : : //! mapping from mesh packet type to moab type
418 : : static const EntityType mp_type_to_mb_type[];
419 : :
420 : : //! get entities with individually-specified types; if is_group is false,
421 : : //! increment each mem_type by 2 since they're CSOEntityType's and not group types
422 : : ErrorCode get_entities( const unsigned int* mem_types, int* id_buf, const unsigned int id_buf_size,
423 : : const bool is_group, std::vector< EntityHandle >& entities );
424 : :
425 : : //! get entities specified by type and ids, append to entities
426 : : ErrorCode get_entities( const unsigned int this_type, int* id_buf, const unsigned int id_buf_size,
427 : : std::vector< EntityHandle >& entities, std::vector< EntityHandle >& excl_entities );
428 : :
429 : : //! get ref entity sets with specified type and ids
430 : : ErrorCode get_ref_entities( const unsigned int this_type, int* id_buf, const unsigned id_buf_size,
431 : : std::vector< EntityHandle >& entities );
432 : :
433 : : //! get mesh entities with specified type and ids
434 : : ErrorCode get_mesh_entities( const unsigned int this_type, int* id_buf, const unsigned id_buf_size,
435 : : std::vector< EntityHandle >& entities, std::vector< EntityHandle >& excl_entities );
436 : :
437 : : //! process entities in a sideset according to sense flags stored in uint_buf
438 : : //! or char_buf (depending on sense_size)
439 : : ErrorCode process_sideset_10( const int this_type, const int num_ents, const int sense_size,
440 : : std::vector< EntityHandle >& ss_entities, Tqdcfr::SidesetHeader* sideseth );
441 : :
442 : : ErrorCode process_sideset_11( std::vector< EntityHandle >& ss_entities, int num_wrts,
443 : : Tqdcfr::SidesetHeader* sideseth );
444 : :
445 : : // put entities into the specfied set, and excluded entities into a
446 : : // std::vector pointed to by the "Exclude_Entities" tag on that set
447 : : ErrorCode put_into_set( EntityHandle set_handle, std::vector< EntityHandle >& entities,
448 : : std::vector< EntityHandle >& excl_entities );
449 : :
450 : : // look in metadatacontainer[set_index] for name data; if found, set name (and extra names,
451 : : // if multiple found) on set handle
452 : : ErrorCode get_names( MetaDataContainer& md, unsigned int set_index, EntityHandle seth );
453 : : };
454 : :
455 : : } // namespace moab
456 : :
457 : : #endif
|