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()); }
void FileNetcdf::writeReferenceTime() { if(!hasVar("forecast_reference_time")) { int id; int status = ncredef(mFile); handleNetcdfError(status, "could not put into define mode"); status = nc_def_var(mFile, "forecast_reference_time", NC_DOUBLE, 0, NULL, &id); handleNetcdfError(status, "writing reference time"); status = ncendef(mFile); handleNetcdfError(status, "could not put into data mode"); } int vTime = getVar("forecast_reference_time"); double referenceTime = getReferenceTime(); if(!Util::isValid(referenceTime)) referenceTime = NC_FILL_DOUBLE; int status = nc_put_var_double(mFile, vTime, &referenceTime); handleNetcdfError(status, "could not write reference time"); setAttribute(vTime, "standard_name", "forecast_reference_time"); setAttribute(vTime, "units", "seconds since 1970-01-01 00:00:00 +00:00"); }
Time Time::getCurrentTime() { return Time((pt::microsec_clock::universal_time() - getReferenceTime()).total_microseconds()); }
void Time::from_posix_time(pt::ptime time) { if (time != pt::not_a_date_time) t = (time - getReferenceTime()).total_microseconds(); }
pt::ptime Time::to_posix_time() const { return getReferenceTime() + pt::microseconds(t); }