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 : : // Filename : ReadNCDF.hpp
18 : : //
19 : : // Purpose : ExodusII reader
20 : : //
21 : : // Special Notes : Lots of code taken from verde implementation
22 : : //
23 : : // Creator : Tim Tautges & Corey Ernst
24 : : //
25 : : // Date : 3/02
26 : : //
27 : : // Owner : Tim Tautges & Corey Ernst
28 : : //-------------------------------------------------------------------------
29 : :
30 : : #ifndef READNCDF_HPP
31 : : #define READNCDF_HPP
32 : :
33 : : #ifndef IS_BUILDING_MB
34 : : //#error "ReadNCDF.hpp isn't supposed to be included into an application"
35 : : #endif
36 : :
37 : : #include <vector>
38 : : #include <string>
39 : :
40 : : #include "moab/Forward.hpp"
41 : : #include "moab/ReaderIface.hpp"
42 : : #include "moab/ExoIIInterface.hpp"
43 : : #include "moab/Range.hpp"
44 : :
45 : : namespace moab
46 : : {
47 : :
48 : : class ReadUtilIface;
49 : :
50 : 3602 : struct ReadBlockData
51 : : {
52 : : int blockId;
53 : : int startExoId;
54 : : EntityHandle startMBId;
55 : : int numElements;
56 : : bool reading_in;
57 : : ExoIIElementType elemType;
58 : : std::vector< EntityHandle > polys; // used only if elem type is polyhedra or polygons
59 : : // because the order has to be maintained
60 : : };
61 : :
62 : : // these are for polyhedra only
63 : : struct ReadFaceBlockData
64 : : {
65 : : int faceBlockId;
66 : : int startExoId;
67 : : int numElements;
68 : : bool reading_in;
69 : : // ExoIIElementType elemType; should be polygons
70 : : };
71 : :
72 : : //! Output Exodus File for VERDE
73 : : class ReadNCDF : public ReaderIface
74 : : {
75 : :
76 : : public:
77 : : static ReaderIface* factory( Interface* );
78 : :
79 : : void tokenize( const std::string& str, std::vector< std::string >& tokens, const char* delimiters );
80 : :
81 : : //! load an ExoII file
82 : : ErrorCode load_file( const char* file_name, const EntityHandle* file_set, const FileOptions& opts,
83 : : const SubsetList* subset_list = 0, const Tag* file_id_tag = 0 );
84 : :
85 : : ErrorCode read_tag_values( const char* file_name, const char* tag_name, const FileOptions& opts,
86 : : std::vector< int >& tag_values_out, const SubsetList* subset_list = 0 );
87 : :
88 : : //! Constructor
89 : : ReadNCDF( Interface* impl = NULL );
90 : :
91 : : //! Destructor
92 : : virtual ~ReadNCDF();
93 : :
94 : : // update the coords for deformed mesh according to FileOptions
95 : : ErrorCode update( const char* exodus_file_name, const FileOptions& opts, const int num_blocks,
96 : : const int* blocks_to_load, const EntityHandle file_set );
97 : :
98 : : private:
99 : : ReadUtilIface* readMeshIface;
100 : :
101 : : bool dimension_exists( const char* attrib_name );
102 : :
103 : : void reset();
104 : :
105 : : //! read the header from the ExoII file
106 : : ErrorCode read_exodus_header();
107 : :
108 : : //! read the nodes
109 : : ErrorCode read_nodes( const Tag* file_id_tag );
110 : :
111 : : // face blocks for polyhedra
112 : : ErrorCode read_face_blocks_headers(); // all of them?
113 : :
114 : : //! read block headers, containing info about element type, number, etc.
115 : : ErrorCode read_block_headers( const int* blocks_to_load, const int num_blocks );
116 : :
117 : : // these are needed only when polyhedra are present
118 : : ErrorCode read_polyhedra_faces();
119 : :
120 : : //! read the element blocks
121 : : ErrorCode read_elements( const Tag* file_id_tag );
122 : :
123 : : //! read in the global element ids
124 : : ErrorCode read_global_ids();
125 : :
126 : : //! read the nodesets into meshsets
127 : : ErrorCode read_nodesets();
128 : :
129 : : //! read the sidesets (does nothing for now)
130 : : ErrorCode read_sidesets();
131 : :
132 : : //! exodus file bound to this object
133 : : int exodus_file();
134 : :
135 : : //! number of dimensions in this exo file
136 : : int number_dimensions();
137 : :
138 : : //! map a character exodusII element type to a TSTT type & topology
139 : : ErrorCode get_type( char* exo_element_type, EntityType& elem_type );
140 : :
141 : : ErrorCode get_type( EntityType& elem_type, std::string& exo_element_type );
142 : :
143 : : /*
144 : : int get_int_tag(const MB_MeshSet *this_ms,
145 : : const TagHandle tag_id);
146 : : */
147 : :
148 : : // qa record stuff
149 : : ErrorCode read_qa_records( EntityHandle file_set );
150 : : ErrorCode read_qa_information( std::vector< std::string >& qa_record_list );
151 : :
152 : : ErrorCode read_qa_string( char* string, int record_number, int record_position );
153 : :
154 : : ErrorCode create_ss_elements( int* element_ids, int* side_list, int num_sides, int num_dist_factors,
155 : : std::vector< EntityHandle >& entities_to_add,
156 : : std::vector< EntityHandle >& reverse_entities,
157 : : std::vector< double >& dist_factor_vector, int ss_seq_id );
158 : :
159 : : ErrorCode find_side_element_type( const int element_id, ExoIIElementType& type, ReadBlockData& block_data,
160 : : int& df_index, int side_id );
161 : :
162 : : /* ErrorCode assign_block_ids_to_ssets(EntityHandle ss_handle,
163 : : MB_MeshSet *ss_mesh_set);
164 : : */
165 : :
166 : : //! creates an element with the given connectivity
167 : : ErrorCode create_sideset_element( const std::vector< EntityHandle >&, EntityType, EntityHandle&, int& );
168 : :
169 : : int get_number_nodes( EntityHandle handle );
170 : :
171 : : //------------member variables ------------//
172 : :
173 : : //! interface instance
174 : : Interface* mdbImpl;
175 : :
176 : : int ncFile; // netcdf/exodus file
177 : :
178 : : int CPU_WORD_SIZE;
179 : : int IO_WORD_SIZE;
180 : :
181 : : //! int to offset vertex ids with
182 : : int vertexOffset;
183 : :
184 : : //! file name
185 : : std::string exodusFile;
186 : :
187 : : //! number of nodes in the current exoII file
188 : : int numberNodes_loading;
189 : :
190 : : //! number of elements in the current exoII file
191 : : int numberElements_loading;
192 : :
193 : : //! number of blocks in the current exoII file
194 : : int numberElementBlocks_loading;
195 : :
196 : : //! number of face blocks in the current exoII file (used for polyhedra)
197 : : int numberFaceBlocks_loading;
198 : :
199 : : //! number of nodesets in the current exoII file
200 : : int numberNodeSets_loading;
201 : :
202 : : //! number of sidesets in the current exoII file
203 : : int numberSideSets_loading;
204 : :
205 : : int numberDimensions_loading;
206 : :
207 : : //! Meshset Handle for the mesh that is currently being read
208 : : EntityHandle mCurrentMeshHandle;
209 : :
210 : : // keeps track of the exodus ids of the elements and nodes just loaded
211 : : std::vector< char > nodesInLoadedBlocks;
212 : : // note- vector<bool> has limited capabilities
213 : :
214 : : // vector of blocks that are loading
215 : : std::vector< ReadBlockData > blocksLoading;
216 : :
217 : : std::vector< EntityHandle > polyfaces; // the order is maintained with this for polyhedra
218 : :
219 : : // vector of face blocks that are loading : these are for polyhedra blocks
220 : : std::vector< ReadFaceBlockData > faceBlocksLoading;
221 : :
222 : : //! Cached tags for reading. Note that all these tags are defined when the
223 : : //! core is initialized.
224 : : Tag mMaterialSetTag;
225 : : Tag mDirichletSetTag;
226 : : Tag mNeumannSetTag;
227 : : Tag mHasMidNodesTag;
228 : : Tag mDistFactorTag;
229 : : Tag mGlobalIdTag;
230 : : Tag mQaRecordTag;
231 : :
232 : : int max_line_length, max_str_length;
233 : :
234 : : //! range of entities in initial mesh, before this read
235 : : Range initRange;
236 : : };
237 : :
238 : : // inline functions
239 : 0 : inline int ReadNCDF::number_dimensions()
240 : : {
241 : 0 : return numberDimensions_loading;
242 : : }
243 : :
244 : : } // namespace moab
245 : :
246 : : #endif
|