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 : : #ifndef WRITENC_HPP_
17 : : #define WRITENC_HPP_
18 : :
19 : : #ifndef IS_BUILDING_MB
20 : : #error "WriteNC.hpp isn't supposed to be included into an application"
21 : : #endif
22 : :
23 : : #include <vector>
24 : : #include <map>
25 : : #include <set>
26 : : #include <string>
27 : :
28 : : #include "moab/WriterIface.hpp"
29 : : #include "moab/ScdInterface.hpp"
30 : : #include "DebugOutput.hpp"
31 : :
32 : : #ifdef MOAB_HAVE_MPI
33 : : #include "moab_mpi.h"
34 : : #include "moab/ParallelComm.hpp"
35 : : #endif
36 : :
37 : : #ifdef MOAB_HAVE_PNETCDF
38 : : #include "pnetcdf.h"
39 : : #define NCFUNC( func ) ncmpi_##func
40 : :
41 : : //! Collective I/O mode put
42 : : #define NCFUNCAP( func ) ncmpi_put##func##_all
43 : :
44 : : //! Independent I/O mode put
45 : : #define NCFUNCP( func ) ncmpi_put##func
46 : :
47 : : //! Nonblocking put (request aggregation)
48 : : #define NCFUNCREQP( func ) ncmpi_iput##func
49 : :
50 : : #define NCDF_SIZE MPI_Offset
51 : : #define NCDF_DIFF MPI_Offset
52 : : #else
53 : : #include "netcdf.h"
54 : : #define NCFUNC( func ) nc_##func
55 : : #define NCFUNCAP( func ) nc_put##func
56 : : #define NCFUNCP( func ) nc_put##func
57 : : #define NCDF_SIZE size_t
58 : : #define NCDF_DIFF ptrdiff_t
59 : : #endif
60 : :
61 : : namespace moab
62 : : {
63 : :
64 : : class WriteUtilIface;
65 : : class NCWriteHelper;
66 : :
67 : : /**
68 : : * \brief Export NC files.
69 : : */
70 : : class WriteNC : public WriterIface
71 : : {
72 : : friend class NCWriteHelper;
73 : : friend class ScdNCWriteHelper;
74 : : friend class UcdNCWriteHelper;
75 : : friend class NCWriteEuler;
76 : : friend class NCWriteFV;
77 : : friend class NCWriteHOMME;
78 : : friend class NCWriteMPAS;
79 : : friend class NCWriteGCRM;
80 : :
81 : : public:
82 : : //! Factory method
83 : : static WriterIface* factory( Interface* );
84 : :
85 : : //! Constructor
86 : : WriteNC( Interface* impl = NULL );
87 : :
88 : : //! Destructor
89 : : virtual ~WriteNC();
90 : :
91 : : //! Writes out a file
92 : : ErrorCode write_file( const char* file_name, const bool overwrite, const FileOptions& opts,
93 : : const EntityHandle* output_list, const int num_sets,
94 : : const std::vector< std::string >& qa_list, const Tag* tag_list = NULL, int num_tags = 0,
95 : : int export_dimension = 3 );
96 : :
97 : : private:
98 : : //! ENTLOCNSEDGE for north/south edge
99 : : //! ENTLOCWEEDGE for west/east edge
100 : : enum EntityLocation
101 : : {
102 : : ENTLOCVERT = 0,
103 : : ENTLOCNSEDGE,
104 : : ENTLOCEWEDGE,
105 : : ENTLOCFACE,
106 : : ENTLOCSET,
107 : : ENTLOCEDGE,
108 : : ENTLOCREGION
109 : : };
110 : :
111 : 0 : class AttData
112 : : {
113 : : public:
114 : 0 : AttData() : attId( -1 ), attLen( 0 ), attVarId( -2 ), attDataType( NC_NAT ) {}
115 : : int attId;
116 : : NCDF_SIZE attLen;
117 : : int attVarId;
118 : : nc_type attDataType;
119 : : std::string attValue;
120 : : };
121 : :
122 [ # # ][ # # ]: 0 : class VarData
[ # # ][ # # ]
[ # # ][ # # ]
123 : : {
124 : : public:
125 [ # # ][ # # ]: 0 : VarData() : varId( -1 ), numAtts( -1 ), entLoc( ENTLOCSET ), numLev( 0 ), sz( 0 ), has_tsteps( false ) {}
[ # # ][ # # ]
[ # # ][ # # ]
126 : : int varId;
127 : : int numAtts;
128 : : nc_type varDataType;
129 : : std::vector< int > varDims; // The dimension indices making up this multi-dimensional variable
130 : : std::map< std::string, AttData > varAtts;
131 : : std::string varName;
132 : : std::vector< Tag > varTags; // Tags created for this variable, e.g. one tag per timestep
133 : : std::vector< void* > memoryHogs; // These will point to the real data; fill before writing the data
134 : : std::vector< NCDF_SIZE > writeStarts; // Starting index for writing data values along each dimension
135 : : std::vector< NCDF_SIZE > writeCounts; // Number of data values to be written along each dimension
136 : : int entLoc;
137 : : int numLev;
138 : : int sz;
139 : : bool has_tsteps; // Indicate whether timestep numbers are appended to tag names
140 : : };
141 : :
142 : : //! This info will be reconstructed from metadata stored on conventional fileSet tags
143 : : //! Dimension names
144 : : std::vector< std::string > dimNames;
145 : :
146 : : //! Dimension lengths
147 : : std::vector< int > dimLens;
148 : :
149 : : //! Will collect used dimensions (coordinate variables)
150 : : std::set< std::string > usedCoordinates;
151 : :
152 : : //! Dummy variables (for dimensions that have no corresponding coordinate variables)
153 : : std::set< std::string > dummyVarNames;
154 : :
155 : : //! Global attribs
156 : : std::map< std::string, AttData > globalAtts;
157 : :
158 : : //! Variable info
159 : : std::map< std::string, VarData > varInfo;
160 : :
161 : : ErrorCode parse_options( const FileOptions& opts, std::vector< std::string >& var_names,
162 : : std::vector< std::string >& desired_names, std::vector< int >& tstep_nums,
163 : : std::vector< double >& tstep_vals );
164 : : /*
165 : : * Map out the header, from tags on file set; it is the inverse process from
166 : : * ErrorCode NCHelper::create_conventional_tags
167 : : */
168 : : ErrorCode process_conventional_tags( EntityHandle fileSet );
169 : :
170 : : ErrorCode process_concatenated_attribute( const void* attPtr, int attSz, std::vector< int >& attLen,
171 : : std::map< std::string, AttData >& attributes );
172 : :
173 : : //! Interface instance
174 : : Interface* mbImpl;
175 : : WriteUtilIface* mWriteIface;
176 : :
177 : : //! File var
178 : : const char* fileName;
179 : :
180 : : //! File numbers assigned by (p)netcdf
181 : : int fileId;
182 : :
183 : : //! Debug stuff
184 : : DebugOutput dbgOut;
185 : :
186 : : #ifdef MOAB_HAVE_MPI
187 : : ParallelComm* myPcomm;
188 : : #endif
189 : :
190 : : //! Write options
191 : : bool noMesh;
192 : : bool noVars;
193 : : bool append;
194 : :
195 : : //! Cached tags for writing. This will be important for ordering the data, in parallel
196 : : Tag mGlobalIdTag;
197 : :
198 : : //! Are we writing in parallel? (probably in the future)
199 : : bool isParallel;
200 : :
201 : : //! CAM Euler, etc,
202 : : std::string grid_type;
203 : :
204 : : //! Helper class instance
205 : : NCWriteHelper* myHelper;
206 : : };
207 : :
208 : : } // namespace moab
209 : :
210 : : #endif
|