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             //resvals[(ysize-j-1)*ysize+i] = Model.GetResistivities()[Model.GetModel()[i][j][layerindex]];
00120           }
00121       }
00122     lon->put(lonvals, lond->size());
00123     lat->put(latvals, latd->size());
00124     res->put(resvals, res->edges());
00125   }

Generated on Tue May 4 16:52:14 2010 for GPLIB++ by  doxygen 1.5.8