void FileNetcdf::writeTimes() { std::vector<double> times = getTimes(); if(times.size() != getNumTime()) { std::stringstream ss; ss << "The times specified for NetCDF file '" << getFilename() << "' has " << times.size() << " elements, but the time dimension is " << getNumTime() << ". Putting missing values."; Util::warning(ss.str()); times = std::vector<double>(getNumTime(), Util::MV); } // Convert missing for(int i = 0; i < times.size(); i++) { if(!Util::isValid(times[i])) times[i] = NC_FILL_FLOAT; } if(!hasVar("time")) { int dTime = getDim("time"); int id; int status = ncredef(mFile); handleNetcdfError(status, "could not put into define mode"); status = nc_def_var(mFile, "time", NC_DOUBLE, 1, &dTime, &id); handleNetcdfError(status, "creating time variable"); status = ncendef(mFile); handleNetcdfError(status, "could not put into data mode"); } int vTime = getVar("time"); double timesArr[getNumTime()]; for(int t = 0; t < getNumTime(); t++) { timesArr[t] = times[t]; } int status = nc_put_var_double(mFile, vTime, timesArr); handleNetcdfError(status, "could not write times"); setAttribute(vTime, "long_name", "time"); setAttribute(vTime, "standard_name", "time"); setAttribute(vTime, "units", "seconds since 1970-01-01 00:00:00 +00:00"); }
FileArome::FileArome(std::string iFilename, bool iReadOnly) : FileNetcdf(iFilename, iReadOnly) { // Set dimensions NcDim* dTime = getDim("time"); NcDim* dLon = getDim("x"); NcDim* dLat = getDim("y"); mNTime = dTime->size(); mNLat = dLat->size(); mNLon = dLon->size(); mNEns = 1; mLats = getLatLonVariable("latitude"); mLons = getLatLonVariable("longitude"); if(hasVariableCore("surface_geopotential")) { FieldPtr elevField = getFieldCore("surface_geopotential", 0); mElevs.resize(getNumLat()); for(int i = 0; i < getNumLat(); i++) { mElevs[i].resize(getNumLon()); for(int j = 0; j < getNumLon(); j++) { float value = (*elevField)(i,j,0) / 9.81; mElevs[i][j] = value; } } std::cout << "Deriving altitude from geopotential height in " << getFilename() << std::endl; } else { mElevs = getLatLonVariable("altitude"); } if(hasVar("time")) { NcVar* vTime = getVar("time"); double* times = new double[mNTime]; vTime->get(times , mNTime); setTimes(std::vector<double>(times, times+mNTime)); delete[] times; } else { std::vector<double> times; times.resize(getNumTime(), Util::MV); setTimes(times); } if(hasVar("forecast_reference_time")) { NcVar* vReferenceTime = getVar("forecast_reference_time"); double referenceTime = getReferenceTime(); vReferenceTime->get(&referenceTime, 1); setReferenceTime(referenceTime); } Util::status( "File '" + iFilename + " 'has dimensions " + getDimenionString()); }