plotlayer.cpp
Go to the documentation of this file.00001 #include <iostream>
00002 #include <string>
00003 #include "ThreeDMTModel.h"
00004 #include <fstream>
00005 #include "types.h"
00006 #include <boost/filesystem/operations.hpp>
00007 #include <boost/shared_ptr.hpp>
00008 #include <boost/multi_array.hpp>
00009 #include "netcdfcpp.h"
00010 #include "Util.h"
00011
00012 using namespace std;
00013 using namespace boost::filesystem;
00014 using namespace gplib;
00015
00016 int main(void)
00017 {
00018 string version = "$Id: plotlayer.cpp 1816 2009-09-07 11:28:35Z mmoorkamp $";
00019 cout << endl << endl;
00020 cout << "Program " << version << endl;
00021 cout << "Reads in WinGLink or old Mackie format 3D Model grids " << endl;
00022 cout
00023 << "and outputs the resistivity of a single layer for plotting with GMT "
00024 << endl;
00025 cout << "No input parameters supported " << endl;
00026
00027 string infilename, outfilename;
00028 double maxdepth;
00029
00030 double latmin, lonmin;
00031 int mode;
00032 infilename = AskFilename("Modelfile name: ");
00033 if (!exists(infilename))
00034 {
00035 cout << "File does not exist ! " << endl;
00036 return 100;
00037 }
00038 cout << "Type 1 for old Mackie, 2 for Winglink format: ";
00039 cin >> mode;
00040 cout << "Depth of layer to plot: ";
00041 cin >> maxdepth;
00042 cout << "Latitude of lower border: ";
00043 cin >> latmin;
00044 cout << "Longitude of left border: ";
00045 cin >> lonmin;
00046 outfilename = AskFilename("Outfile name: ");
00047 ThreeDMTModel Model;
00048 const double kmlatitude = 111194;
00049 const double kmlongitude = cos(latmin / 180. * PI) * kmlatitude;
00050 if (mode == 1)
00051 Model.ReadMackie(infilename);
00052 else
00053 Model.ReadWinGLink(infilename);
00054
00055 const int xsize = Model.GetXSizes().size();
00056 const int ysize = Model.GetYSizes().size();
00057 typedef boost::multi_array<double, 1> tscalearray;
00058 tscalearray lonscale(boost::extents[xsize]),
00059 latscale(boost::extents[ysize]);
00060 double currentdepth = 0;
00061 int layerindex = 0;
00062 while (currentdepth < maxdepth)
00063 {
00064 currentdepth += Model.GetZSizes()[layerindex] / 1000;
00065 cout << currentdepth << endl;
00066 ++layerindex;
00067 }
00068 lonscale[0] = 0.0;
00069 latscale[0] = 0.0;
00070
00071 for (int i = 1; i < ysize; ++i)
00072 latscale[i] = latscale[i - 1] + Model.GetYSizes()[i - 1];
00073 for (int i = 1; i < xsize; ++i)
00074 lonscale[i] = lonscale[i - 1] + Model.GetXSizes()[i - 1];
00075 ofstream outfile(outfilename.c_str());
00076 for (int i = 0; i < xsize; ++i)
00077 for (int j = 0; j < ysize; ++j)
00078 {
00079 outfile << lonmin + lonscale[i] / kmlongitude << " " << latmin
00080 + latscale[ysize - 1 - j] / kmlatitude << " "
00081 << Model.GetResistivities()[Model.GetModel()[i][j][layerindex]]
00082 << endl;
00083 }
00084
00085 NcFile cdf((outfilename + ".nc").c_str(), NcFile::Replace);
00086 NcDim* latd = cdf.add_dim("lat", ysize);
00087 NcDim* lond = cdf.add_dim("lon", xsize);
00088
00089 NcVar* lat = cdf.add_var("lat", ncFloat, latd);
00090 lat->add_att("units", "degrees_north");
00091 lat->add_att("long_name", "longitude");
00092
00093 NcVar* lon = cdf.add_var("lon", ncFloat, lond);
00094 lon->add_att("units", "degrees_east");
00095 lon->add_att("long_name", "latitude");
00096 NcVar* res = cdf.add_var("res", ncFloat, latd, lond);
00097 res->add_att("units", "ohm meters");
00098 res->add_att("long_name", "Resistivity");
00099 res->add_att("coordinates", "lon lat");
00100 float *lonvals = new float[lond->size()];
00101 float *latvals = new float[latd->size()];
00102
00103 float *resvals = new float[latd->size() * lond->size()];
00104
00105 for (int i = 0; i < xsize; ++i)
00106 {
00107 lonvals[i] = lonmin + lonscale[i] / kmlongitude;
00108 }
00109 for (int i = 0; i < ysize; ++i)
00110 {
00111 latvals[i] = latmin + latscale[i] / kmlatitude;
00112 }
00113 for (int i = 0; i < xsize; ++i)
00114 {
00115 for (int j = 0; j < ysize; ++j)
00116 {
00117 resvals[(ysize - j - 1) * xsize + i]
00118 = Model.GetResistivities()[Model.GetModel()[i][j][layerindex]];
00119
00120 }
00121 }
00122 lon->put(lonvals, lond->size());
00123 lat->put(latvals, latd->size());
00124 res->put(resvals, res->edges());
00125 }