![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /**
00002 * MOAB, a Mesh-Oriented datABase, is a software component for creating,
00003 * storing and accessing finite element mesh data.
00004 *
00005 * Copyright 2004 Sandia Corporation. Under the terms of Contract
00006 * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
00007 * retains certain rights in this software.
00008 *
00009 * This library is free software; you can redistribute it and/or
00010 * modify it under the terms of the GNU Lesser General Public
00011 * License as published by the Free Software Foundation; either
00012 * version 2.1 of the License, or (at your option) any later version.
00013 *
00014 */
00015
00016 //-------------------------------------------------------------------------
00017 // Filename : WriteNCDF.hpp
00018 //
00019 // Purpose : ExodusII writer
00020 //
00021 // Special Notes : Lots of code taken from verde implementation
00022 //
00023 // Creator : Corey Ernst
00024 //
00025 // Date : 8/02
00026 //
00027 // Owner : Corey Ernst
00028 //-------------------------------------------------------------------------
00029
00030 #ifndef WRITENCDF_HPP
00031 #define WRITENCDF_HPP
00032
00033 #ifndef IS_BUILDING_MB
00034 #error "WriteNCDF.hpp isn't supposed to be included into an application"
00035 #endif
00036
00037 #include
00038 #include
00039
00040 #include "moab/Forward.hpp"
00041 #include "moab/Range.hpp"
00042 #include "moab/ExoIIInterface.hpp"
00043 #include "moab/WriterIface.hpp"
00044
00045 namespace moab
00046 {
00047
00048 class WriteUtilIface;
00049
00050 //! struct used to hold data for each block to be output in Exodus; used by
00051 //! initialize_exodus_file to initialize the file header for increased speed
00052 struct MaterialSetData
00053 {
00054 int id;
00055 int number_elements;
00056 int number_nodes_per_element;
00057 int number_attributes;
00058 ExoIIElementType element_type;
00059 Range elements;
00060 };
00061
00062 //! struct used to hold data for each nodeset to be output in Exodus; used by
00063 //! initialize_exodus_file to initialize the file header for increased speed
00064 struct DirichletSetData
00065 {
00066 int id;
00067 int number_nodes;
00068 std::vector< EntityHandle > nodes;
00069 std::vector< double > node_dist_factors;
00070 };
00071
00072 //! struct used to hold data for each sideset to be output in Exodus; used by
00073 //! initialize_exodus_file to initialize the file header for increased speed
00074 struct NeumannSetData
00075 {
00076 int id;
00077 int number_elements;
00078 std::vector< EntityHandle > elements;
00079 std::vector< int > side_numbers;
00080 EntityHandle mesh_set_handle;
00081 std::vector< double > ss_dist_factors;
00082 };
00083
00084 //! Output Exodus File for VERDE
00085 class WriteNCDF : public WriterIface
00086 {
00087
00088 public:
00089 static WriterIface* factory( Interface* );
00090
00091 //! Constructor
00092 WriteNCDF( Interface* impl );
00093
00094 //! Destructor
00095 virtual ~WriteNCDF();
00096
00097 //! writes out an ExoII file
00098 ErrorCode write_file( const char* exodus_file_name,
00099 const bool overwrite,
00100 const FileOptions& opts,
00101 const EntityHandle* output_list,
00102 const int num_sets,
00103 const std::vector< std::string >& qa_records,
00104 const Tag* = NULL,
00105 int = 0,
00106 int user_dimension = 3 );
00107
00108 protected:
00109 //! number of dimensions in this exo file
00110 // int number_dimensions();
00111
00112 //! open an ExoII file for writing
00113 ErrorCode open_file( const char* file_name );
00114
00115 //! contains the general information about a mesh
00116 struct ExodusMeshInfo
00117 {
00118 unsigned int num_dim;
00119 unsigned int num_nodes;
00120 unsigned int num_elements;
00121 unsigned int num_elementblocks;
00122 unsigned int num_polyhedra_blocks;
00123 std::vector< std::string > qaRecords;
00124 Range nodes;
00125 Range polyhedronFaces; // they will accumulate, like nodes
00126 // they will be written before any other face blocks, and before polyhedra blocks
00127 };
00128
00129 private:
00130 //! interface instance
00131 Interface* mdbImpl;
00132 WriteUtilIface* mWriteIface;
00133
00134 //! file name
00135 std::string exodusFile;
00136 int ncFile;
00137
00138 //! Meshset Handle for the mesh that is currently being read
00139 EntityHandle mCurrentMeshHandle;
00140
00141 //! Cached tags for reading. Note that all these tags are defined when the
00142 //! core is initialized.
00143 Tag mMaterialSetTag;
00144 Tag mDirichletSetTag;
00145 Tag mNeumannSetTag;
00146 Tag mHasMidNodesTag;
00147 Tag mGeomDimensionTag;
00148 Tag mDistFactorTag;
00149 Tag mGlobalIdTag;
00150 Tag mQaRecordTag;
00151
00152 Tag mEntityMark; // used to say whether an entity will be exported
00153
00154 int repeat_face_blocks; // only to make paraview and visit happy
00155
00156 ErrorCode gather_mesh_information( ExodusMeshInfo& mesh_info,
00157 std::vector< MaterialSetData >& block_info,
00158 std::vector< NeumannSetData >& sideset_info,
00159 std::vector< DirichletSetData >& nodeset_info,
00160 std::vector< EntityHandle >& blocks,
00161 std::vector< EntityHandle >& sidesets,
00162 std::vector< EntityHandle >& nodesets );
00163
00164 ErrorCode write_header( ExodusMeshInfo& mesh_info,
00165 std::vector< MaterialSetData >& block_info,
00166 std::vector< NeumannSetData >& sideset_info,
00167 std::vector< DirichletSetData >& nodeset_info,
00168 const char* filename );
00169
00170 ErrorCode initialize_exodus_file( ExodusMeshInfo& mesh_info,
00171 std::vector< MaterialSetData >& block_data,
00172 std::vector< NeumannSetData >& sideset_data,
00173 std::vector< DirichletSetData >& nodeset_data,
00174 const char* title_string,
00175 bool write_maps = true,
00176 bool write_sideset_distribution_factors = true );
00177
00178 ErrorCode write_qa_string( const char* string, int record_number, int record_position );
00179
00180 ErrorCode write_qa_records( std::vector< std::string >& qa_record_list );
00181
00182 ErrorCode write_nodes( int num_nodes, Range& nodes, int dimension );
00183
00184 ErrorCode write_poly_faces( ExodusMeshInfo& mesh_info );
00185 ErrorCode write_elementblocks( ExodusMeshInfo& mesh_info, std::vector< MaterialSetData >& block_data );
00186
00187 ErrorCode write_exodus_integer_variable( const char* variable_name,
00188 int* variable_array,
00189 int start_position,
00190 int number_values );
00191
00192 ErrorCode write_global_node_order_map( int num_nodes, Range& nodes );
00193 ErrorCode write_global_element_order_map( int num_elements );
00194 ErrorCode write_element_order_map( int num_elements );
00195
00196 ErrorCode write_BCs( std::vector< NeumannSetData >& sidesets, std::vector< DirichletSetData >& nodesets );
00197
00198 ErrorCode find_side_element_type( const int element_id, ExoIIElementType& type );
00199
00200 /* ErrorCode assign_block_ids_to_ssets(EntityHandle ss_handle,
00201 MB_MeshSet *ss_mesh_set);
00202 */
00203 //! free up allocated Ranges
00204 void reset_block( std::vector< MaterialSetData >& block_info );
00205
00206 //! recursive function; given a meshset handle, get the entities and put them
00207 //! on the right list, then call recursively for any contained meshsets, first
00208 //! checking for sense reversals
00209 ErrorCode get_sideset_elems( EntityHandle sideset, int current_sense, Range& forward_elems, Range& reverse_elems );
00210
00211 ErrorCode get_valid_sides( Range& elems, ExodusMeshInfo& mesh_info, const int sense, NeumannSetData& sideset_data );
00212
00213 //! get the time and date in strings
00214 static void time_and_date( char* time_string, char* date_string );
00215 };
00216
00217 } // namespace moab
00218
00219 #endif