static NFvarHandle _NCgridVariableHandle(NFio_p io, const char *standardName) { int varid, ncid, status; size_t i; NCgrid_p ncGrid = (NCgrid_p) io->PluginData; if ((varid = NCfindVariableByAttribute(ncGrid->NCid, 0, NCstandardNameStr, standardName)) == CMfailed) { return ((NFvarHandle) NULL); } for (i = 0; i < ncGrid->VarNum; ++i) if (ncGrid->Variables[i]->VarIDs[0] == varid) { CMmsgPrint(CMmsgUsrError, "Multiple request to the same variable!\n"); return ((NFvarHandle) (ncGrid->Variables[i])); } if ((ncGrid->Variables = (NCgridVariable_p *) realloc(ncGrid->Variables, (ncGrid->VarNum + 1) * sizeof(NCgridVariable_p))) == (NCgridVariable_p *) NULL) { CMmsgPrint(CMmsgSysError, "Memory allocation error in %s:%d:\n", __FILE__, __LINE__); return ((NFvarHandle) NULL); } if ((ncGrid->Variables[ncGrid->VarNum] = _NCgridVariableCreate(ncGrid->FileNum)) == (NCgridVariable_p) NULL) { CMmsgPrint(CMmsgSysError, "Memory allocation error in %s:%d:\n", __FILE__, __LINE__); return ((NFvarHandle) NULL); } ncGrid->Variables[ncGrid->VarNum]->VarIDs[0] = varid; for (i = 1; i < ncGrid->FileNum; ++i) { if ((status = nc_open(ncGrid->FileNames[i], NC_NOWRITE, &ncid)) != NC_NOERR) { CMmsgPrint(CMmsgAppError, "NetCDF (%s) Openining error \"%s\"!\n", ncGrid->FileNames[i], nc_strerror(status)); goto Abort; } if ((varid = NCfindVariableByAttribute(ncid, 0, NCstandardNameStr, standardName)) == CMfailed) { return ((NFvarHandle) NULL); } ncGrid->Variables[ncGrid->VarNum]->VarIDs[i] = varid; nc_close(ncid); } ncGrid->VarNum++; return ((NFvarHandle) (ncGrid->Variables[ncGrid->VarNum - 1])); Abort: _NCgridVariableFree(ncGrid->Variables[ncGrid->VarNum], ncGrid->FileNum); return ((NFvarHandle) NULL); }
bool NCaxisInitialize (int ncid, NCaxis_p axis, NCaxisType axisType, ut_system *utSystem) { int status; int varid; int ndims; size_t attlen, i; char text [NC_MAX_NAME + 1]; double interval; bool doUnits = true; switch (axis->AxisType = axisType) { case NCaxisX: if (((varid = NCfindVariableByAttribute (ncid,1,NCaxisStr,"x")) == CMfailed) && ((varid = NCfindVariableByAttribute (ncid,1,NCaxisStr,"X")) == CMfailed)) { CMmsgPrint (CMmsgAppError, "Missing x axis variable in NetCDF file!\n"); return (false); } break; case NCaxisY: if (((varid = NCfindVariableByAttribute (ncid,1,NCaxisStr,"y")) == CMfailed) && ((varid = NCfindVariableByAttribute (ncid,1,NCaxisStr,"Y")) == CMfailed)) { CMmsgPrint (CMmsgAppError, "Missing y axis variable in NetCDF file!\n"); return (false); } break; case NCaxisZ: if (((varid = NCfindVariableByAttribute (ncid,1,NCaxisStr,"z")) == CMfailed) && ((varid = NCfindVariableByAttribute (ncid,1,NCaxisStr,"Z")) == CMfailed)) { axis->Dimid = 0; if (((axis->Data = (double *) malloc (sizeof (double))) == (double *) NULL) || ((axis->Bounds = (double *) malloc (sizeof (double) * 2)) == (double *) NULL)) { CMmsgPrint (CMmsgSysError, "Memory allocation error in %s:%d!\n",__FILE__,__LINE__); return (false); } axis->N = 1; axis->Dimid = CMfailed; axis->Data [0] = axis->Bounds [0] = axis->Bounds [1] = 0.0; return (true); } break; case NCaxisTime: if (((varid = NCfindVariableByAttribute (ncid,1,NCaxisStr,"t")) == CMfailed) && ((varid = NCfindVariableByAttribute (ncid,1,NCaxisStr,"time")) == CMfailed)) { CMmsgPrint (CMmsgAppError, "Missing time axis variable in NetCDF file!\n"); return (false); } break; } if (((status = nc_inq_varndims (ncid,varid,&ndims)) != NC_NOERR) || (ndims != 1) || ((status = nc_inq_vardimid (ncid,varid,&(axis->Dimid))) != NC_NOERR) || ((status = nc_inq_dimlen (ncid,axis->Dimid,&(axis->N))) != NC_NOERR)) { CMmsgPrint (CMmsgAppError,"NetCDF variable dimension inquiring error \"%s\" in %s:%d!\n",nc_strerror (status),__FILE__,__LINE__); return (false); } if ((status = nc_inq_attlen (ncid,varid,NCaxisStr,&attlen)) == NC_NOERR) { if ((axis->Axis = (char *) malloc (attlen + 1)) == (char *) NULL) { CMmsgPrint (CMmsgSysError,"Memory allocation error in: %s:%d!\n",__FILE__,__LINE__); return (false); } if ((status = nc_get_att_text (ncid,varid,NCaxisStr,axis->Axis)) != NC_NOERR) { CMmsgPrint (CMmsgAppError,"NetCDF attribute inquiring error \"%s\" in %s:%d!\n",nc_strerror (status),__FILE__,__LINE__); return (false); } else axis->Axis [attlen] = '\0'; } if ((status = nc_inq_attlen (ncid,varid,NClongNameStr,&attlen)) == NC_NOERR) { if ((axis->LongName = (char *) malloc (attlen + 1)) == (char *) NULL) { CMmsgPrint (CMmsgSysError,"Memory allocation error in: %s:%d!\n",__FILE__,__LINE__); return (false); } if ((status = nc_get_att_text (ncid,varid,NClongNameStr,axis->LongName)) != NC_NOERR) { CMmsgPrint (CMmsgAppError,"NetCDF attribute inquiring error \"%s\" in %s:%d!\n",nc_strerror (status),__FILE__,__LINE__); return (false); } else axis->LongName [attlen] = '\0'; } if ((status = nc_inq_attlen (ncid,varid,NCstandardNameStr,&attlen)) == NC_NOERR) { if ((axis->StandardName = (char *) malloc (attlen + 1)) == (char *) NULL) { CMmsgPrint (CMmsgSysError,"Memory allocation error in: %s:%d!\n",__FILE__,__LINE__); return (false); } if ((status = nc_get_att_text (ncid,varid,NCstandardNameStr,axis->StandardName)) != NC_NOERR) { CMmsgPrint (CMmsgAppError,"NetCDF attribute inquiring error \"%s\" in %s:%d!\n",nc_strerror (status),__FILE__,__LINE__); return (false); } else axis->StandardName [attlen] = '\0'; } if (doUnits) { if ((status = nc_inq_attlen (ncid,varid,NCunitsStr,&attlen)) == NC_NOERR) { if (attlen > 0) { if ((status = nc_get_att_text (ncid,varid,NCunitsStr,text)) != NC_NOERR) { CMmsgPrint (CMmsgAppError,"NetCDF attribute inquiring error \"%s\" in %s:%d!\n",nc_strerror (status),__FILE__,__LINE__); return (false); } else text [attlen] = '\0'; if ((axis->Unit = ut_parse (utSystem, ut_trim (text, UT_ASCII), UT_ASCII)) == (ut_unit *) NULL) { switch (ut_get_status ()) { case UT_BAD_ARG: CMmsgPrint (CMmsgAppError, "System or string is NULL!\n"); break; case UT_SYNTAX: CMmsgPrint (CMmsgAppError, "String contained a syntax error!n"); break; case UT_UNKNOWN: CMmsgPrint (CMmsgAppError, "String contained an unknown identifier!\n"); break; default: CMmsgPrint (CMmsgSysError, "System error in %s:%d!n",__FILE__,__LINE__); } } } } } if (((status = nc_inq_attlen (ncid,varid,NCpositiveStr,&attlen)) == NC_NOERR) && (attlen < NC_MAX_NAME)) { if ((status = nc_get_att_text (ncid,varid,NCpositiveStr,text)) != NC_NOERR) { CMmsgPrint (CMmsgAppError,"NetCDF attribute inquiring error \"%s\" in %s:%d!\n",nc_strerror (status),__FILE__,__LINE__); return (false); } else text [attlen] = '\0'; axis->Direction = strcmp (text,NCpositiveUpStr) == 0 ? NCdirUp : NCdirDown; } else axis->Direction = NCdirUp; if (((axis->Data = (double *) malloc (axis->N * sizeof (double))) == (double *) NULL) || ((axis->Bounds = (double *) malloc (axis->N * sizeof (double) * 2)) == (double *) NULL)) { CMmsgPrint (CMmsgSysError,"Memory allocation error in: %s:%d!\n",__FILE__,__LINE__); return (false); } if ((status = nc_get_var_double (ncid,varid,axis->Data)) != NC_NOERR) { CMmsgPrint (CMmsgAppError,"NetCDF %s axis data loading error \"%s\" in %s:%d!\n",_NCaxisGetTypeString (axis->AxisType),nc_strerror (status),__FILE__,__LINE__); return (false); } if (((status = nc_inq_attlen (ncid,varid,NCboundsStr, &attlen)) == NC_NOERR) && (attlen < NC_MAX_NAME)) { if ((status = nc_get_att_text (ncid,varid,NCboundsStr,text)) != NC_NOERR) { CMmsgPrint (CMmsgAppError,"NetCDF bounds attribute inquiring error \"%s\" in %s:%d!\n",nc_strerror (status),__FILE__,__LINE__); return (false); } else text [attlen] = '\0'; if ((status = nc_inq_varid (ncid,text,&varid)) != NC_NOERR) { CMmsgPrint (CMmsgAppError,"NetCDF bounds variable inquery error \"%s\" in %s:%d!\n", nc_strerror (status),__FILE__,__LINE__); return (false); } if ((status = nc_get_var_double (ncid,varid,axis->Bounds)) != NC_NOERR) { CMmsgPrint (CMmsgAppError,"NetCDF %s axis bounds loading error \"%s\" in %s:%d!\n",_NCaxisGetTypeString (axis->AxisType),nc_strerror (status),__FILE__,__LINE__); return (false); } } else { for (i = 1;i < axis->N - 1; ++i) { axis->Bounds [i * 2] = (axis->Data [i] + axis->Data [i - 1]) / 2.0; axis->Bounds [i * 2 + 1] = (axis->Data [i + 1] + axis->Data [i]) / 2.0; } axis->Bounds [1] = axis->Bounds [2]; axis->Bounds [0] = axis->Data [0] - (axis->Bounds [1] - axis->Data [0]); axis->Bounds [i * 2] = axis->Bounds [(i - 1) * 2 + 1]; axis->Bounds [i * 2 + 1] = axis->Data [i] + (axis->Data [i] - axis->Bounds [i * 2]); } axis->IntervalMin = axis->Bounds [i * 2 + 1] - axis->Bounds [0]; axis->IntervalMax = 0.0; for (i = 0;i < axis->N; ++i) { interval = axis->Bounds [i * 2 + 1] - axis->Bounds [i * 2]; axis->IntervalMin = CMmathMinimum (axis->IntervalMin,interval); axis->IntervalMax = CMmathMaximum (axis->IntervalMax,interval); } axis->Regular = axis->N > 1 ? CMmathEqualValues (axis->IntervalMin,axis->IntervalMax) : true; return (true); }