35 #define GET_DIM( ncdim, name, val ) \
37 int gdfail = nc_inq_dimid( ncFile, name, &( ncdim ) ); \
38 if( NC_NOERR == gdfail ) \
41 gdfail = nc_inq_dimlen( ncFile, ncdim, &tmp_val ); \
42 if( NC_NOERR != gdfail ) \
44 MB_SET_ERR( MB_FAILURE, "addncdata:: Couldn't get dimension length" ); \
53 #define GET_VAR( name, id, dims ) \
56 int gvfail = nc_inq_varid( ncFile, name, &( id ) ); \
57 if( NC_NOERR == gvfail ) \
60 gvfail = nc_inq_varndims( ncFile, id, &ndims ); \
61 if( NC_NOERR == gvfail ) \
63 ( dims ).resize( ndims ); \
64 gvfail = nc_inq_vardimid( ncFile, id, &( dims )[0] ); \
65 if( NC_NOERR != gvfail ) \
67 MB_SET_ERR( MB_FAILURE, "addncdata:: Couldn't get variable dimension IDs" ); \
73 #define GET_1D_INT_VAR( name, id, vals ) \
75 GET_VAR( name, id, vals ); \
79 int ivfail = nc_inq_dimlen( ncFile, ( vals )[0], &ntmp ); \
80 if( NC_NOERR != ivfail ) \
82 MB_SET_ERR( MB_FAILURE, "addncdata:: Couldn't get dimension length" ); \
84 ( vals ).resize( ntmp ); \
86 ivfail = nc_get_vara_int( ncFile, id, &ntmp1, &ntmp, &( vals )[0] ); \
87 if( NC_NOERR != ivfail ) \
89 MB_SET_ERR( MB_FAILURE, "addncdata:: Problem getting variable " << ( name ) ); \
94 #define GET_1D_DBL_VAR( name, id, vals ) \
96 std::vector< int > dum_dims; \
97 GET_VAR( name, id, dum_dims ); \
101 int dvfail = nc_inq_dimlen( ncFile, dum_dims[0], &ntmp ); \
102 if( NC_NOERR != dvfail ) \
104 MB_SET_ERR( MB_FAILURE, "addncdata:: Couldn't get dimension length" ); \
106 ( vals ).resize( ntmp ); \
108 dvfail = nc_get_vara_double( ncFile, id, &ntmp1, &ntmp, &( vals )[0] ); \
109 if( NC_NOERR != dvfail ) \
111 MB_SET_ERR( MB_FAILURE, "addncdata:: Problem getting variable " << ( name ) ); \
116 #define GET_1D_FLT_VAR( name, id, vals ) \
118 std::vector< int > dum_dims; \
119 GET_VAR( name, id, dum_dims ); \
123 int dvfail = nc_inq_dimlen( ncFile, dum_dims[0], &ntmp ); \
124 if( NC_NOERR != dvfail ) \
126 MB_SET_ERR( MB_FAILURE, "addncdata:: Couldn't get dimension length" ); \
128 ( vals ).resize( ntmp ); \
130 dvfail = nc_get_vara_float( ncFile, id, &ntmp1, &ntmp, &( vals )[0] ); \
131 if( NC_NOERR != dvfail ) \
133 MB_SET_ERR( MB_FAILURE, "addncdata:: Problem getting variable " << ( name ) ); \
138 int main(
int argc,
char* argv[] )
143 std::string inputfile, outfile(
"out.h5m" ), netcdfFile, variable_name, sefile_name;
145 opts.
addOpt< std::string >(
"input,i",
"input mesh filename", &inputfile );
146 opts.
addOpt< std::string >(
"netcdfFile,n",
"netcdf file aligned with the mesh input file", &netcdfFile );
147 opts.
addOpt< std::string >(
"output,o",
"output mesh filename", &outfile );
149 opts.
addOpt< std::string >(
"var,v",
"variable to extract and add to output file", &variable_name );
151 opts.
addOpt< std::string >(
"sefile,s",
"spectral elements file (coarse SE mesh)", &sefile_name );
158 std::cout <<
" opened " << inputfile <<
" with initial h5m data.\n";
170 std::cout <<
" it has " << nodes.
size() <<
" vertices " << edges.
size() <<
" edges " << cells.
size() <<
" cells\n";
173 std::map< int, EntityHandle > vGidHandle;
174 std::map< int, EntityHandle > eGidHandle;
175 std::map< int, EntityHandle > cGidHandle;
176 std::vector< int > gids;
179 gids.resize( nodes.
size() );
184 vGidHandle[gids[i++]] = *vit;
187 gids.resize( edges.
size() );
192 eGidHandle[gids[i++]] = *vit;
195 gids.resize( cells.
size() );
200 cGidHandle[gids[i++]] = *vit;
204 int fail = nc_open( netcdfFile.c_str(), 0, &
ncFile );
205 if( NC_NOWRITE !=
fail )
210 std::cout <<
" opened " << netcdfFile <<
" with new data \n";
211 std::vector< int > dims;
215 char recname[NC_MAX_NAME + 1];
217 std::cout <<
" looking for variable " << variable_name <<
"\n";
218 GET_VAR( variable_name.c_str(), nc_var, dims );
219 std::cout <<
" it has " << dims.size() <<
" dimensions\n";
222 bool vertex_data =
false;
223 bool edge_data =
false;
224 bool cell_data =
false;
225 for(
size_t j = 0; j < dims.size(); j++ )
227 fail = nc_inq_dim(
ncFile, dims[j], recname, &recs );
228 if( NC_NOERR !=
fail )
MB_SET_ERR( MB_FAILURE,
"addncdata:: Couldn't get dimension" );
229 std::string name_dim( recname );
230 std::cout <<
" dimension index " << j <<
" in file: " << dims[j] <<
" name: " << name_dim <<
" recs:" << recs
232 if( recs == nodes.
size() )
237 if( recs == edges.
size() )
242 if( recs == cells.
size() )
249 int otherDim = 1 - dimIndex;
251 std::vector< int > evals;
252 std::vector< double > dvals;
256 fail = nc_inq_vartype(
ncFile, nc_var, &dataType );
257 if( NC_NOERR !=
fail )
MB_SET_ERR( MB_FAILURE,
"addncdata:: Couldn't get variable type" );
259 bool float_var =
false;
260 if( NC_INT == dataType )
262 else if( NC_DOUBLE != dataType && NC_FLOAT != dataType )
265 if( NC_FLOAT == dataType ) float_var =
true;
267 bool use_time =
false;
269 std::vector< float > times;
270 fail = nc_inq_varid(
ncFile,
"time", &time_id );
271 if( NC_NOERR ==
fail )
279 if( ( dims.size() >= 1 && dims.size() <= 2 ) && ( vertex_data || cell_data || edge_data ) )
282 if( dims.size() == 2 )
284 fail = nc_inq_dim(
ncFile, dims[otherDim], recname, &size_tag );
285 if( NC_NOERR !=
fail )
MB_SET_ERR( MB_FAILURE,
"addncdata:: Couldn't get dimension" );
291 "can't define new tag" );
293 if( NC_INT == dataType )
295 std::vector< int > vals;
296 if( 1 == dims.size() )
301 for(
size_t k = 0; k < vals.size(); k++ )
309 for(
size_t k = 0; k < vals.size(); k++ )
317 for(
size_t k = 0; k < vals.size(); k++ )
327 size_t start[2] = { 0, 0 }, count[2] = { 1, 1 };
328 count[dimIndex] = recs;
329 count[otherDim] = size_tag;
330 vals.resize( recs * size_tag );
331 fail = nc_get_vara_int(
ncFile, nc_var, start, count, &vals[0] );
332 evals.resize( size_tag );
336 for(
size_t k = 0; k < recs; k++ )
339 size_t start_in_vals = k * size_tag, stride = 1;
340 for(
size_t j = 0; j < size_tag; j++ )
341 evals[j] = vals[start_in_vals + j * stride];
347 for(
size_t k = 0; k < recs; k++ )
350 size_t start_in_vals = k * size_tag, stride = 1;
351 for(
size_t j = 0; j < size_tag; j++ )
352 evals[j] = vals[start_in_vals + j * stride];
360 std::vector< double > vals;
361 if( 1 == dims.size() )
366 for(
size_t k = 0; k < vals.size(); k++ )
374 for(
size_t k = 0; k < vals.size(); k++ )
382 for(
size_t k = 0; k < vals.size(); k++ )
392 size_t start[2] = { 0, 0 }, count[2] = { 1, 1 };
393 count[dimIndex] = recs;
394 count[otherDim] = size_tag;
395 vals.resize( recs * size_tag );
396 fail = nc_get_vara_double(
ncFile, nc_var, start, count, &vals[0] );
397 dvals.resize( size_tag );
401 for(
size_t k = 0; k < recs; k++ )
404 size_t start_in_vals = k * size_tag, stride = 1;
405 for(
size_t j = 0; j < size_tag; j++ )
406 dvals[j] = vals[start_in_vals + j * stride];
412 for(
size_t k = 0; k < recs; k++ )
415 size_t start_in_vals = k * size_tag, stride = 1;
416 for(
size_t j = 0; j < size_tag; j++ )
417 dvals[j] = vals[start_in_vals + j * stride];
424 else if( ( dims.size() == 3 ) && vertex_data && dimIndex == 2 && mbtype ==
MB_TYPE_DOUBLE &&
429 char recname0[NC_MAX_NAME + 1], recname1[NC_MAX_NAME + 1];
430 fail = nc_inq_dim(
ncFile, dims[0], recname0, &dim0 );
431 if( NC_NOERR !=
fail )
MB_SET_ERR( MB_FAILURE,
"addncdata:: Couldn't get dimension" );
432 fail = nc_inq_dim(
ncFile, dims[1], recname1, &dim1 );
433 if( NC_NOERR !=
fail )
MB_SET_ERR( MB_FAILURE,
"addncdata:: Couldn't get dimension" );
434 std::string name0( recname0 );
435 std::string name1( recname1 );
436 std::string timestr(
"time" );
437 size_t start[3] = { 0, 0, 0 };
438 size_t count[3] = { 1, 0, 0 };
440 count[2] = nodes.
size();
442 if( name0.compare(
"time" ) == 0 )
445 std::vector< double > dvalues( dim1 * count[2] );
446 std::vector< float > fvalues( dim1 * count[2] );
447 std::vector< double > transp( dim1 * count[2] );
449 for(
size_t k = 0; k < dim0; k++ )
452 std::stringstream tag_name;
453 tag_name << variable_name <<
"_t" << times[k];
454 std::vector< double > defvals( dim1, 0. );
457 "can't define new tag" );
462 fail = nc_get_vara_float(
ncFile, nc_var, start, count, &fvalues[0] );
464 for(
size_t ii = 0; ii < dim1; ii++ )
465 for(
size_t j = 0; j < count[2]; j++ )
467 transp[j * dim1 + ii] = fvalues[ii * count[2] + j];
472 fail = nc_get_vara_double(
ncFile, nc_var, start, count, &dvalues[0] );
474 for(
size_t ii = 0; ii < dim1; ii++ )
475 for(
size_t j = 0; j < count[2]; j++ )
477 transp[j * dim1 + ii] = dvalues[ii * count[2] + j];
480 for(
size_t ii = 0; ii < nodes.
size(); ii++ )
489 std::cout <<
" wrote file " << outfile <<
"\n";
492 if( !sefile_name.empty() )
497 std::cout <<
" loaded spectral file " << sefile_name <<
"\n";
503 int np = (int)sqrt( 1.0 * sizeTag );
504 std::cout <<
" size of tag: " << sizeTag <<
" np = " << np <<
"\n";
505 std::vector< int > gdofs;
508 gdofs.resize( cells2.
size() * sizeTag );
512 std::vector< double > dfield;
513 dfield.resize( sizeTag, 0.0 );
517 "can't define new tag" );
525 std::vector< double > oldData;
526 oldData.resize( dataTagLen * nodes.
size() );
534 for(
int k = 0; k < sizeTag; k++ )
536 int gdof = gdofs[i1 + k];
540 double val = oldData[
index * dataTagLen + dataTagLen - 1];
549 std::cout <<
" wrote file atm2.h5m \n";