Program Listing for File outputs.cpp#
↰ Return to documentation for file (outputs.cpp)
#include "outputs.hpp"
using std::fstream;
using std::ios;
using std::string;
using std::vector;
using namespace netCDF;
void Outputs::create_directory(string directory_name) {
string str = "mkdir -p " + directory_name;
const char *command = str.c_str();
const int dir_err = system(command);
if (-1 == dir_err) {
std::cout << "Error on creating directory!\n" << std::endl;
return;
}
return;
}
void Outputs::grid(CSSWM &model) {
fstream fout[4];
string dir = OUTPUTPATH + (string) "grids/";
string grid[4] = {"lon.txt", "lat.txt", "x.txt", "y.txt"};
for (int i = 0; i < 4; i++) {
fout[i].open(dir + grid[i], ios::out);
}
for (int p = 0; p < 6; p++) {
for (int j = 1; j < NY-1; j++) {
for (int i = 1; i < NX-1; i++) {
fout[0] << model.csswm[p].lon[i][j] << " ";
fout[1] << model.csswm[p].lat[i][j] << " ";
fout[2] << model.csswm[p].x[i][j] << " ";
fout[3] << model.csswm[p].y[i][j] << " ";
}
}
}
}
void Outputs::h(int n, CSSWM &model) {
fstream fouth;
string hname = OUTPUTPATH + (string) "h/h_" + std::to_string(n) + ".txt";
fouth.open(hname, std::ios::out);
for (int p = 0; p < 6; p++) {
for (int j = 1; j < NY-1; j++) {
for (int i = 1; i < NX-1; i++) {
fouth << model.csswm[p].h[i][j] << " ";
}
}
}
return;
}
void Outputs::u(int n, CSSWM &model) {
fstream foutu;
string uname = OUTPUTPATH + (string) "u/u_" + std::to_string(n) + ".txt";
foutu.open(uname, std::ios::out);
fstream foutu_lon_lat;
string u_lon_latname = "../outputs/u_lon_lat/u_lon_lat_" + std::to_string(n) + ".txt";
foutu_lon_lat.open(u_lon_latname, std::ios::out);
for (int p = 0; p < 6; p++) {
for (int j = 1; j < NY-1; j++) {
for (int i = 1; i < NX-1; i++) {
foutu << model.csswm[p].u[i][j] << " ";
foutu_lon_lat << model.Cube2Sphere_U(model, p, i, j) << " ";
}
}
}
return;
}
void Outputs::v(int n, CSSWM &model) {
fstream foutv;
string vname = OUTPUTPATH + (string) "v/v_" + std::to_string(n) + ".txt";
foutv.open(vname, std::ios::out);
fstream foutv_lon_lat;
string v_lon_latname = "../outputs/v_lon_lat/v_lon_lat_" + std::to_string(n) + ".txt";
foutv_lon_lat.open(v_lon_latname, std::ios::out);
for (int p = 0; p < 6; p++) {
for (int j = 1; j < NY-1; j++) {
for (int i = 1; i < NX-1; i++) {
foutv << model.csswm[p].v[i][j] << " ";
foutv_lon_lat << model.Cube2Sphere_V(model, p, i, j) << " ";
}
}
}
return;
}
void Outputs::grid_nc(CSSWM &model) {
string dir = OUTPUTPATH + (string) "nc/";
NcFile dataFile(dir + "grid.nc", NcFile::replace);
// Create netCDF dimensions
NcDim p = dataFile.addDim("p", 6);
NcDim xDim = dataFile.addDim("x", NX);
NcDim yDim = dataFile.addDim("y", NY);
NcDim lonDim = dataFile.addDim("lon", NX);
NcDim latDim = dataFile.addDim("lat", NY);
vector<NcDim> xyDim, lonlatDim;
xyDim.push_back(p);
xyDim.push_back(xDim);
xyDim.push_back(yDim);
lonlatDim.push_back(p);
lonlatDim.push_back(lonDim);
lonlatDim.push_back(latDim);
NcVar x = dataFile.addVar("x_local", ncDouble, xyDim);
NcVar y = dataFile.addVar("y_local", ncDouble, xyDim);
NcVar lon = dataFile.addVar("lon_sphere", ncDouble, lonlatDim);
NcVar lat = dataFile.addVar("lat_sphere", ncDouble, lonlatDim);
#if defined(Mountain)
NcVar hs = dataFile.addVar("hs", ncDouble, xyDim);
#endif
vector<size_t> startp, countp;
startp.push_back(0);
startp.push_back(0);
startp.push_back(0);
countp.push_back(1);
countp.push_back(NX);
countp.push_back(NY);
for (int p = 0; p < 6; p++) {
startp[0] = p;
x.putVar(startp, countp, model.csswm[p].x);
y.putVar(startp, countp, model.csswm[p].y);
lon.putVar(startp, countp, model.csswm[p].lon);
lat.putVar(startp, countp, model.csswm[p].lat);
#if defined(Mountain)
hs.putVar(startp, countp, model.csswm[p].hs);
#endif
}
}
void Outputs::huv_nc(int n, CSSWM &model) {
string dir = OUTPUTPATH + (string) "nc/";
NcFile dataFile(dir + std::to_string(n) + ".nc", NcFile::replace);
// Create netCDF dimensions
NcDim p = dataFile.addDim("p", 6);
NcDim xDim = dataFile.addDim("x", NX);
NcDim yDim = dataFile.addDim("y", NY);
NcDim lonDim = dataFile.addDim("lon", NX);
NcDim latDim = dataFile.addDim("lat", NY);
vector<NcDim> xyDim, lonlatDim;
xyDim.push_back(p);
xyDim.push_back(xDim);
xyDim.push_back(yDim);
lonlatDim.push_back(p);
lonlatDim.push_back(lonDim);
lonlatDim.push_back(latDim);
NcVar h = dataFile.addVar("h", ncDouble, xyDim);
NcVar u = dataFile.addVar("u", ncDouble, xyDim);
NcVar v = dataFile.addVar("v", ncDouble, xyDim);
NcVar ulonlat = dataFile.addVar("u_lonlat", ncDouble, lonlatDim);
NcVar vlonlat = dataFile.addVar("v_lonlat", ncDouble, lonlatDim);
double u_lon_lat[6][NX][NY], v_lon_lat[6][NX][NY];
for (int p = 0; p < 6; p++) {
for (int j = 0; j < NY; j++) {
for (int i = 0; i < NX; i++) {
u_lon_lat[p][i][j] = model.Cube2Sphere_U(model, p, i, j);
v_lon_lat[p][i][j] = model.Cube2Sphere_V(model, p, i, j);
}
}
}
vector<size_t> startp, countp;
startp.push_back(0);
startp.push_back(0);
startp.push_back(0);
countp.push_back(1);
countp.push_back(NX);
countp.push_back(NY);
for (int p = 0; p < 6; p++) {
startp[0] = p;
h.putVar(startp, countp, model.csswm[p].h);
u.putVar(startp, countp, model.csswm[p].u);
v.putVar(startp, countp, model.csswm[p].v);
ulonlat.putVar(startp, countp, u_lon_lat[p]);
vlonlat.putVar(startp, countp, v_lon_lat[p]);
}
}
void Outputs::create_all_directory() {
// data directory
#ifdef TXTOUTPUT
create_directory(OUTPUTPATH + (string) "grids");
create_directory(OUTPUTPATH + (string) "h");
create_directory(OUTPUTPATH + (string) "u");
create_directory(OUTPUTPATH + (string) "u_lon_lat");
create_directory(OUTPUTPATH + (string) "v");
create_directory(OUTPUTPATH + (string) "v_lon_lat");
#endif
#ifdef NCOUTPUT
create_directory(OUTPUTPATH + (string) "nc");
#endif
}