35 #define INS_ID( stringvar, prefix, id ) sprintf( stringvar, prefix, id )
37 #define GET_DIM( ncdim, name, val ) \
39 int gdfail = nc_inq_dimid( ncFile, name, &( ncdim ) ); \
40 if( NC_NOERR == gdfail ) \
43 gdfail = nc_inq_dimlen( ncFile, ncdim, &tmp_val ); \
44 if( NC_NOERR != gdfail ) \
46 MB_SET_ERR( MB_FAILURE, "addncdata:: Couldn't get dimension length" ); \
55 #define GET_DIMB( ncdim, name, varname, id, val ) \
56 INS_ID( name, varname, id ); \
57 GET_DIM( ncdim, name, val );
59 #define GET_VAR( name, id, dims ) \
62 int gvfail = nc_inq_varid( ncFile, name, &( id ) ); \
63 if( NC_NOERR == gvfail ) \
66 gvfail = nc_inq_varndims( ncFile, id, &ndims ); \
67 if( NC_NOERR == gvfail ) \
69 ( dims ).resize( ndims ); \
70 gvfail = nc_inq_vardimid( ncFile, id, &( dims )[0] ); \
71 if( NC_NOERR != gvfail ) \
73 MB_SET_ERR( MB_FAILURE, "addncdata:: Couldn't get variable dimension IDs" ); \
79 #define GET_1D_INT_VAR( name, id, vals ) \
81 GET_VAR( name, id, vals ); \
85 int ivfail = nc_inq_dimlen( ncFile, ( vals )[0], &ntmp ); \
86 if( NC_NOERR != ivfail ) \
88 MB_SET_ERR( MB_FAILURE, "addncdata:: Couldn't get dimension length" ); \
90 ( vals ).resize( ntmp ); \
92 ivfail = nc_get_vara_int( ncFile, id, &ntmp1, &ntmp, &( vals )[0] ); \
93 if( NC_NOERR != ivfail ) \
95 MB_SET_ERR( MB_FAILURE, "addncdata:: Problem getting variable " << ( name ) ); \
100 #define GET_1D_DBL_VAR( name, id, vals ) \
102 std::vector< int > dum_dims; \
103 GET_VAR( name, id, dum_dims ); \
107 int dvfail = nc_inq_dimlen( ncFile, dum_dims[0], &ntmp ); \
108 if( NC_NOERR != dvfail ) \
110 MB_SET_ERR( MB_FAILURE, "addncdata:: Couldn't get dimension length" ); \
112 ( vals ).resize( ntmp ); \
114 dvfail = nc_get_vara_double( ncFile, id, &ntmp1, &ntmp, &( vals )[0] ); \
115 if( NC_NOERR != dvfail ) \
117 MB_SET_ERR( MB_FAILURE, "addncdata:: Problem getting variable " << ( name ) ); \
122 #define GET_1D_FLT_VAR( name, id, vals ) \
124 std::vector< int > dum_dims; \
125 GET_VAR( name, id, dum_dims ); \
129 int dvfail = nc_inq_dimlen( ncFile, dum_dims[0], &ntmp ); \
130 if( NC_NOERR != dvfail ) \
132 MB_SET_ERR( MB_FAILURE, "addncdata:: Couldn't get dimension length" ); \
134 ( vals ).resize( ntmp ); \
136 dvfail = nc_get_vara_float( ncFile, id, &ntmp1, &ntmp, &( vals )[0] ); \
137 if( NC_NOERR != dvfail ) \
139 MB_SET_ERR( MB_FAILURE, "addncdata:: Problem getting variable " << ( name ) ); \
144 int main(
int argc,
char* argv[] )
149 std::string inputfile, outfile(
"out.h5m" ), netcdfFile, variable_name, sefile_name;
151 opts.
addOpt< std::string >(
"input,i",
"input mesh filename", &inputfile );
152 opts.
addOpt< std::string >(
"netcdfFile,n",
"netcdf file aligned with the mesh input file", &netcdfFile );
153 opts.
addOpt< std::string >(
"output,o",
"output mesh filename", &outfile );
155 opts.
addOpt< std::string >(
"var,v",
"variable to extract and add to output file", &variable_name );
157 opts.
addOpt< std::string >(
"sefile,s",
"spectral elements file (coarse SE mesh)", &sefile_name );
164 std::cout <<
" opened " << inputfile <<
" with initial h5m data.\n";
176 std::cout <<
" it has " << nodes.
size() <<
" vertices " << edges.
size() <<
" edges " << cells.
size() <<
" cells\n";
179 std::map< int, EntityHandle > vGidHandle;
180 std::map< int, EntityHandle > eGidHandle;
181 std::map< int, EntityHandle > cGidHandle;
182 std::vector< int > gids;
185 gids.resize( nodes.
size() );
190 vGidHandle[gids[i++]] = *vit;
193 gids.resize( edges.
size() );
198 eGidHandle[gids[i++]] = *vit;
201 gids.resize( cells.
size() );
206 cGidHandle[gids[i++]] = *vit;
210 int fail = nc_open( netcdfFile.c_str(), 0, &
ncFile );
211 if( NC_NOWRITE !=
fail )
216 std::cout <<
" opened " << netcdfFile <<
" with new data \n";
217 std::vector< int > dims;
221 char recname[NC_MAX_NAME + 1];
223 std::cout <<
" looking for variable " << variable_name <<
"\n";
224 GET_VAR( variable_name.c_str(), nc_var, dims );
225 std::cout <<
" it has " << dims.size() <<
" dimensions\n";
228 bool vertex_data =
false;
229 bool cell_data =
false;
230 for(
size_t j = 0; j < dims.size(); j++ )
232 fail = nc_inq_dim(
ncFile, dims[j], recname, &recs );
233 if( NC_NOERR !=
fail )
MB_SET_ERR( MB_FAILURE,
"addncdata:: Couldn't get dimension" );
234 std::string name_dim( recname );
235 std::cout <<
" dimension index " << j <<
" in file: " << dims[j] <<
" name: " << name_dim <<
" recs:" << recs
237 if( recs == nodes.
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 ) )
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" );
292 if( NC_INT == dataType )
294 std::vector< int > vals;
295 if( 1 == dims.size() )
300 for(
size_t k = 0; k < vals.size(); k++ )
308 for(
size_t k = 0; k < vals.size(); k++ )
318 size_t start[2] = { 0, 0 }, count[2] = { 1, 1 };
319 count[dimIndex] = recs;
320 count[otherDim] = size_tag;
321 vals.resize( recs * size_tag );
322 fail = nc_get_vara_int(
ncFile, nc_var, start, count, &vals[0] );
323 evals.resize( size_tag );
327 for(
size_t k = 0; k < recs; k++ )
330 size_t start_in_vals = k * size_tag, stride = 1;
331 for(
size_t j = 0; j < size_tag; j++ )
332 evals[j] = vals[start_in_vals + j * stride];
338 for(
size_t k = 0; k < recs; k++ )
341 size_t start_in_vals = k * size_tag, stride = 1;
342 for(
size_t j = 0; j < size_tag; j++ )
343 evals[j] = vals[start_in_vals + j * stride];
351 std::vector< double > vals;
352 if( 1 == dims.size() )
357 for(
size_t k = 0; k < vals.size(); k++ )
365 for(
size_t k = 0; k < vals.size(); k++ )
375 size_t start[2] = { 0, 0 }, count[2] = { 1, 1 };
376 count[dimIndex] = recs;
377 count[otherDim] = size_tag;
378 vals.resize( recs * size_tag );
379 fail = nc_get_vara_double(
ncFile, nc_var, start, count, &vals[0] );
380 dvals.resize( size_tag );
384 for(
size_t k = 0; k < recs; k++ )
387 size_t start_in_vals = k * size_tag, stride = 1;
388 for(
size_t j = 0; j < size_tag; j++ )
389 dvals[j] = vals[start_in_vals + j * stride];
395 for(
size_t k = 0; k < recs; k++ )
398 size_t start_in_vals = k * size_tag, stride = 1;
399 for(
size_t j = 0; j < size_tag; j++ )
400 dvals[j] = vals[start_in_vals + j * stride];
407 else if( ( dims.size() == 3 ) && vertex_data && dimIndex == 2 && mbtype ==
MB_TYPE_DOUBLE &&
412 char recname0[NC_MAX_NAME + 1], recname1[NC_MAX_NAME + 1];
413 fail = nc_inq_dim(
ncFile, dims[0], recname0, &dim0 );
414 if( NC_NOERR !=
fail )
MB_SET_ERR( MB_FAILURE,
"addncdata:: Couldn't get dimension" );
415 fail = nc_inq_dim(
ncFile, dims[1], recname1, &dim1 );
416 if( NC_NOERR !=
fail )
MB_SET_ERR( MB_FAILURE,
"addncdata:: Couldn't get dimension" );
417 std::string name0( recname0 );
418 std::string name1( recname1 );
419 std::string timestr(
"time" );
420 size_t start[3] = { 0, 0, 0 };
421 size_t count[3] = { 1, 0, 0 };
423 count[2] = nodes.
size();
425 if( name0.compare(
"time" ) == 0 )
428 std::vector< double > dvalues( dim1 * count[2] );
429 std::vector< float > fvalues( dim1 * count[2] );
430 std::vector< double > transp( dim1 * count[2] );
432 for(
size_t k = 0; k < dim0; k++ )
435 std::stringstream tag_name;
436 tag_name << variable_name <<
"_t" << times[k];
437 std::vector< double > defvals( dim1, 0. );
438 rval =
mb->
tag_get_handle( tag_name.str().c_str(), (
int)dim1, mbtype, newTag,
444 fail = nc_get_vara_float(
ncFile, nc_var, start, count, &fvalues[0] );
446 for(
size_t ii = 0; ii < dim1; ii++ )
447 for(
size_t j = 0; j < count[2]; j++ )
449 transp[j * dim1 + ii] = fvalues[ii * count[2] + j];
454 fail = nc_get_vara_double(
ncFile, nc_var, start, count, &dvalues[0] );
456 for(
size_t ii = 0; ii < dim1; ii++ )
457 for(
size_t j = 0; j < count[2]; j++ )
459 transp[j * dim1 + ii] = dvalues[ii * count[2] + j];
462 for(
size_t ii = 0; ii < nodes.
size(); ii++ )
471 std::cout <<
" wrote file " << outfile <<
"\n";
474 if( !sefile_name.empty() )
479 std::cout <<
" loaded spectral file " << sefile_name <<
"\n";
485 int np = (int)sqrt( 1.0 * sizeTag );
486 std::cout <<
" size of tag: " << sizeTag <<
" np = " << np <<
"\n";
487 std::vector< int > gdofs;
490 gdofs.resize( cells2.
size() * sizeTag );
494 std::vector< double > dfield;
495 dfield.resize( sizeTag, 0.0 );
506 std::vector< double > oldData;
507 oldData.resize( dataTagLen * nodes.
size() );
515 for(
int k = 0; k < sizeTag; k++ )
517 int gdof = gdofs[i1 + k];
519 int index = nodes.
index( node );
521 double val = oldData[index * dataTagLen + dataTagLen - 1];
530 std::cout <<
" wrote file atm2.h5m \n";