GeoTessCPP  2.2
Software to facilitate storage and retrieval of 3D information about the Earth.
GeoTessProfileConstant.h
Go to the documentation of this file.
1 //- ****************************************************************************
2 //-
3 //- Copyright 2009 Sandia Corporation. Under the terms of Contract
4 //- DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
5 //- retains certain rights in this software.
6 //-
7 //- BSD Open Source License.
8 //- All rights reserved.
9 //-
10 //- Redistribution and use in source and binary forms, with or without
11 //- modification, are permitted provided that the following conditions are met:
12 //-
13 //- * Redistributions of source code must retain the above copyright notice,
14 //- this list of conditions and the following disclaimer.
15 //- * Redistributions in binary form must reproduce the above copyright
16 //- notice, this list of conditions and the following disclaimer in the
17 //- documentation and/or other materials provided with the distribution.
18 //- * Neither the name of Sandia National Laboratories nor the names of its
19 //- contributors may be used to endorse or promote products derived from
20 //- this software without specific prior written permission.
21 //-
22 //- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 //- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 //- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 //- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
26 //- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 //- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 //- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 //- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 //- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 //- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 //- POSSIBILITY OF SUCH DAMAGE.
33 //-
34 //- ****************************************************************************
35 
36 #ifndef PROFILECONSTANT_OBJECT_H
37 #define PROFILECONSTANT_OBJECT_H
38 
39 // **** _SYSTEM INCLUDES_ ******************************************************
40 
41 #include <iostream>
42 #include <string>
43 #include <fstream>
44 
45 // use standard library objects
46 using namespace std;
47 
48 // **** _LOCAL INCLUDES_ *******************************************************
49 
50 #include "GeoTessData.h"
51 #include "GeoTessProfile.h"
52 #include "GeoTessProfileType.h"
53 #include "IFStreamAscii.h"
54 #include "IFStreamBinary.h"
55 
56 // **** _BEGIN GEOTESS NAMESPACE_ **********************************************
57 
58 namespace geotess {
59 
60 // **** _FORWARD REFERENCES_ ***************************************************
61 
62 class GeoTessMetaData;
63 
64 // **** _CLASS DEFINITION_ *****************************************************
65 
77 {
78  private:
79 
83  float radiusBottom;
84 
88  float radiusTop;
89 
93  GeoTessData* data;
94 
98  int pointIndex;
99 
103  GeoTessProfileConstant() : GeoTessProfile(), radiusBottom(0.0), radiusTop(0.0),
104  data(NULL), pointIndex(-1) {};
105 
106  public:
107 
111  GeoTessProfileConstant(float radBot, float radTop, GeoTessData* dat) :
112  GeoTessProfile(), radiusBottom(radBot), radiusTop(radTop),
113  data(dat), pointIndex(-1) {};
114 
118  static string class_name() { return "ProfileConstant"; };
119 
123  virtual int class_size() const
124  { return (int) sizeof(GeoTessProfileConstant); };
125 
126  virtual LONG_INT getMemory() { return (LONG_INT)(sizeof(GeoTessProfileConstant) + data->getMemory()); };
127 
133  virtual const GeoTessProfileType& getType() const
134  { return GeoTessProfileType::CONSTANT; };
135 
139  virtual bool operator == (const GeoTessProfile& p) const
140  { return (GeoTessProfile::operator==(p) &&
141  (radiusBottom == p.getRadiusBottom()) &&
142  (radiusTop == p.getRadiusTop()) &&
143  (*data == p.getData(0)));
144  }
145 
150  virtual float getRadius(int i) const
151  { return i == 0 ? radiusBottom : radiusTop; };
152 
156  virtual int getNRadii() const { return 2; };
157 
161  virtual int getNData() const { return 1; };
162 
166  virtual float* getRadii()
167  { float* fa = new float [2]; fa[0] = radiusBottom; fa[1] = radiusTop; return fa; };
168 
172  virtual GeoTessData** getData()
173  { GeoTessData** da = new GeoTessData* [1]; da[0] = data; return da; };
174 
178  virtual GeoTessData* getData(int i) { return data; };
179 
183  virtual const GeoTessData& getData(int i) const { return *data; };
184 
188  virtual void setData(const vector<GeoTessData*>& inData)
189  { delete data; data = inData[0]; }
190 
194  virtual void setData(int index, GeoTessData* inData)
195  { delete data; data = inData; }
196 
205  virtual double getValue(int attributeIndex, int nodeIndex) const
206  { return nodeIndex <= 1 ? data->getDouble(attributeIndex) : NaN_DOUBLE; }
207 
217  virtual double getValue(const GeoTessInterpolatorType& rInterpType,
218  int attributeIndex, double radius, bool allowRadiusOutOfRange) const
219  {
220  if (!allowRadiusOutOfRange &&
221  ((radius < getRadiusBottom()) || (radius > getRadiusTop())))
222  return NaN_DOUBLE;
223 
224  // default behavior is to simply return the data value for the first
225  // data object. This works for all the Profile classes that only support
226  // a single Data object like ProfileConstant, ProfileSurface, and
227  // ProfileThin. Profile classes for which the number of supported
228  // Data objects is not equal to 1 must override this method.
229 
230  return getValue(attributeIndex, 0);
231  };
232 
239  virtual double getValueTop(int attributeIndex) const
240  { return data->getDouble(attributeIndex); }
241 
252  virtual bool isNaN(int nodeIndex, int attributeIndex)
253  {
254  return nodeIndex != 0 || data->isNaN(attributeIndex);
255  }
256 
260  virtual void setRadii(const vector<float>& newRadii)
261  { radiusBottom = newRadii[0]; radiusTop = newRadii[1]; }
262 
263  virtual void setRadius(int index, float radius)
264  {
265  switch (index)
266  {
267  case 0:
268  radiusBottom = radius;
269  break;
270  case 1:
271  radiusTop = radius;
272  break;
273  }
274  }
275 
279  virtual float getRadiusTop() const { return radiusTop; };
280 
284  virtual const GeoTessData& getDataTop() const { return *data; };
285 
289  virtual GeoTessData* getDataTop() { return data; };
290 
294  virtual float getRadiusBottom() const { return radiusBottom; };
295 
299  virtual const GeoTessData& getDataBottom() const { return *data; };
300 
304  virtual GeoTessData* getDataBottom() { return data; };
305 
307 
312  { radiusBottom = ifs.readFloat(); radiusTop = ifs.readFloat();
313  data = GeoTessData::getData(ifs, gtmd); };
314 
318  GeoTessProfileConstant(IFStreamAscii& ifs, GeoTessMetaData& gtmd) : GeoTessProfile()
319  { radiusBottom = ifs.readFloat();
320  radiusTop = ifs.readFloat();
321  data = GeoTessData::getData(ifs, gtmd); };
322 
327  virtual ~GeoTessProfileConstant() { if (data != NULL) delete data; };
328 
332  virtual void write(IFStreamBinary& ofs)
333  {
334  ofs.writeByte((byte) GeoTessProfileType::CONSTANT.ordinal());
335  ofs.writeFloat(radiusBottom);
336  ofs.writeFloat(radiusTop);
337  data->write(ofs);
338  };
339 
343  virtual void write(IFStreamAscii& ofs)
344  { ofs.writeInt(GeoTessProfileType::CONSTANT.ordinal());
345  ofs.writeString(" ");
346  ofs.writeFloat(radiusBottom);
347  ofs.writeString(" ");
348  ofs.writeFloat(radiusTop);
349  data->write(ofs);
350  ofs.writeNL();
351  };
352 
361  virtual int findClosestRadiusIndex(double radius) const
362  { return abs(radiusTop - radius) < abs(radiusBottom - radius) ? 1 : 0; }
363 
371  virtual void setPointIndex(int nodeIndex, int pntIndex)
372  { pointIndex = pntIndex; }
373 
381  virtual void resetPointIndices() { pointIndex = -1; }
382 
390  virtual int getPointIndex(int nodeIndex) const
391  { return pointIndex; }
392 
396  virtual GeoTessProfile* copy()
397  {
398  return new GeoTessProfileConstant(radiusBottom, radiusTop, data->copy());
399  }
400 
402 
403 }; // end class ProfileConstant
404 
405 } // end namespace geotess
406 
407 #endif // PROFILECONSTANT_OBJECT_H
virtual float getRadiusBottom() const
Get the radius at the bottom of the profile, in km.
Definition: GeoTessProfileConstant.h:294
virtual double getDouble(int attributeIndex) const
Retrieve the value of the attribute at the specified attribute index as a double value.
virtual LONG_INT getMemory()
virtual double getValue(const GeoTessInterpolatorType &rInterpType, int attributeIndex, double radius, bool allowRadiusOutOfRange) const
Retrieve the value of the specified attribute interpolated at the specified radius.
Definition: GeoTessProfileConstant.h:217
Definition: ArrayReuse.h:55
Opens a file for binary read and write access.
Definition: IFStreamBinary.h:79
Enumeration of the interpolation algorithms supported by GeoTess including LINEAR, NATURAL_NEIGHBOR and CUBIC_SPLINE.
Definition: GeoTessInterpolatorType.h:71
Enumeration of the valid Profile types, including EMPTY, THIN, CONSTANT, NPOINT and SURFACE...
Definition: GeoTessProfileType.h:69
virtual GeoTessData * getData(int i)
Retrieve a reference the i'th Data object.
Definition: GeoTessProfileConstant.h:178
virtual GeoTessData * getDataBottom()
Get the Data object at the bottom of the profile.
Definition: GeoTessProfileConstant.h:304
virtual GeoTessData ** getData()
Retrieve a shallow copy of the array of Data objects associated with this Profile.
virtual int getNData() const
Get the number of Data objects that comprise this profile.
Definition: GeoTessProfileConstant.h:161
static string class_name()
Returns the class name.
Definition: GeoTessProfileConstant.h:118
virtual const GeoTessProfileType & getType() const
Returns ProfileType (CONSTANT).
Definition: GeoTessProfileConstant.h:133
virtual int class_size() const
Returns the class size.
Definition: GeoTessProfileConstant.h:123
virtual bool isNaN(int nodeIndex, int attributeIndex)
Return true if the specified Data value is NaN.
Definition: GeoTessProfileConstant.h:252
virtual void setData(const vector< GeoTessData * > &inData)
Resets the data object to the new input data.
Definition: GeoTessProfileConstant.h:188
A Profile object that defines two radii at the bottom and top of the associated layer, and a single Data object that represents the model values throughout the layer.
Definition: GeoTessProfileConstant.h:76
virtual bool isNaN(int attributeIndex) const
Returns true if the specified attribute is NaN.
virtual float getRadiusTop() const
Get the radius at the top of the profile, in km.
virtual GeoTessData ** getData()
Retrieve a shallow copy of all of the Data objects associated with this Profile.
Definition: GeoTessProfileConstant.h:172
virtual GeoTessData * getDataTop()
Get the Data object at the top of the profile.
Definition: GeoTessProfileConstant.h:289
#define byte
signed-byte typedef
Definition: CPPGlobals.h:94
virtual double getValueTop(int attributeIndex) const
Retrieve the value of the specified attribute at the top of the layer.
Definition: GeoTessProfileConstant.h:239
float readFloat()
Read float data.
Definition: IFStreamBinary.h:1117
virtual float * getRadii()
Retrieve a deep copy of the radii values in km.
Definition: GeoTessProfileConstant.h:166
#define LONG_INT
Definition: CPPGlobals.h:111
virtual float getRadius(int i) const
Get the i'th radius value in this profile in km.
Definition: GeoTessProfileConstant.h:150
Abstract class that manages the radii and data values that span a single layer associated with a sing...
Definition: GeoTessProfile.h:96
Abstract base class that manages the data values attached to a single grid point. ...
Definition: GeoTessData.h:75
GeoTessProfileConstant(float radBot, float radTop, GeoTessData *dat)
Default constructor.
Definition: GeoTessProfileConstant.h:111
virtual void setRadii(const vector< float > &newRadii)
Replace the radii currently associated with this Profile with new values.
Definition: GeoTessProfileConstant.h:260
virtual void setData(int index, GeoTessData *inData)
Resets the data object at index to the new input data.
Definition: GeoTessProfileConstant.h:194
virtual float getRadiusTop() const
Get the radius at the top of the profile, in km.
Definition: GeoTessProfileConstant.h:279
Basic metadata information about a GeoTessModel.
Definition: GeoTessMetaData.h:95
virtual const GeoTessData & getDataBottom() const
Get the Data object at the bottom of the profile.
Definition: GeoTessProfileConstant.h:299
#define GEOTESS_EXP_IMP
Definition: CPPGlobals.h:71
virtual int getNRadii() const
Get the number of radii that comprise this profile.
Definition: GeoTessProfileConstant.h:156
virtual double getValue(int attributeIndex, int nodeIndex) const
Retrieve the value of the specified attribute interpolated from this profile at the specified radius ...
Definition: GeoTessProfileConstant.h:205
virtual const GeoTessData & getData(int i) const
Retrieve a reference the i'th Data object.
Definition: GeoTessProfileConstant.h:183
virtual const GeoTessData & getDataTop() const
Get the Data object at the top of the profile.
Definition: GeoTessProfileConstant.h:284
virtual void setRadius(int index, float radius)
Replace the radius at the specified nodeIndex.
Definition: GeoTessProfileConstant.h:263
virtual LONG_INT getMemory()
Definition: GeoTessProfileConstant.h:126
virtual float getRadiusBottom() const
Get the radius at the bottom of the profile, in km.