[cig-commits] r8304 - in cs/spatialdata-0.1/trunk: . libsrc/spatialdb tests/libtests/spatialdb

brad at geodynamics.org brad at geodynamics.org
Mon Nov 19 17:26:23 PST 2007


Author: brad
Date: 2007-11-19 17:26:22 -0800 (Mon, 19 Nov 2007)
New Revision: 8304

Modified:
   cs/spatialdata-0.1/trunk/configure.ac
   cs/spatialdata-0.1/trunk/libsrc/spatialdb/SCECCVMH.cc
   cs/spatialdata-0.1/trunk/libsrc/spatialdb/SCECCVMH.hh
   cs/spatialdata-0.1/trunk/tests/libtests/spatialdb/Makefile.am
Log:
Fixed bugs in querying SCEC CVM-H. Implemented C++ unit tests. Setup configure to only run query test if data dir for SCEC CVM-H is provided.

Modified: cs/spatialdata-0.1/trunk/configure.ac
===================================================================
--- cs/spatialdata-0.1/trunk/configure.ac	2007-11-19 22:29:10 UTC (rev 8303)
+++ cs/spatialdata-0.1/trunk/configure.ac	2007-11-20 01:26:22 UTC (rev 8304)
@@ -35,9 +35,16 @@
 
 # DOCUMENTATION w/doxygen
 AC_ARG_ENABLE([documentation],
-	[  --enable-documentation  Enable buuilding html documentation (requires doxygen) [[default=no]]],
+	[  --enable-documentation  Enable building html documentation (requires doxygen) [[default=no]]],
 	[enable_documentation=yes],
 	[enable_documentation=no])
+
+# TESTING w/SCEC CVM-H
+AC_ARG_ENABLE([scec-cvm-h],
+	[  --enable-scec-cvm-h=DIR    Enable unit testing with SCEC CVM-H (requires cppunit and SCEC CVM-H data files) [[default=no]]],
+	[],
+	[enable_scec_cvm_h=no])
+
 # ----------------------------------------------------------------------
 
 AC_PROG_CXX
@@ -82,6 +89,23 @@
     [AC_MSG_RESULT(no)
      AC_MSG_ERROR([CppUnit library not found; try LDFLAGS="-L<CppUnit lib dir>"])
   ])
+  AM_CONDITIONAL([ENABLE_SCEC_CVM_H], [test "$enable_scec_cvm_h" != no])
+  if test "x$enable_scec_cvm_h" != "xno" ; then
+    AC_CHECK_FILE([$enable_scec_cvm_h/topo.vo] [], [
+      AC_MSG_ERROR([SCEC CVM-H data file topo.vo not found])])
+    AC_CHECK_FILE([$enable_scec_cvm_h/moho.vo], [], [
+      AC_MSG_ERROR([SCEC CVM-H data file moho.vo not found])])
+    AC_CHECK_FILE([$enable_scec_cvm_h/base.vo], [], [
+      AC_MSG_ERROR([SCEC CVM-H data file base.vo not found])])
+    AC_CHECK_FILE([$enable_scec_cvm_h/LA_HR.vo], [], [
+      AC_MSG_ERROR([SCEC CVM-H data file LA_HR.vo not found])])
+    AC_CHECK_FILE([$enable_scec_cvm_h/LA_LR.vo], [], [
+      AC_MSG_ERROR([SCEC CVM-H data file LA_LR.vo not found])])
+    AC_CHECK_FILE([$enable_scec_cvm_h/CM.vo], [], [
+      AC_MSG_ERROR([SCEC CVM-H data file CM.vo not found])])
+    AC_DEFINE_UNQUOTED([SCECCVMH_DATADIR], ["$enable_scec_cvm_h"],
+               [Define to test SCEC CVM-H.])
+  fi
 fi
 
 # PYTHIA

Modified: cs/spatialdata-0.1/trunk/libsrc/spatialdb/SCECCVMH.cc
===================================================================
--- cs/spatialdata-0.1/trunk/libsrc/spatialdb/SCECCVMH.cc	2007-11-19 22:29:10 UTC (rev 8303)
+++ cs/spatialdata-0.1/trunk/libsrc/spatialdb/SCECCVMH.cc	2007-11-20 01:26:22 UTC (rev 8304)
@@ -42,7 +42,9 @@
   _topoElev(0),
   _baseDepth(0),
   _mohoDepth(0),
-  _csUTM(new geocoords::CSGeoProj)
+  _csUTM(new geocoords::CSGeoProj),
+  _queryVals(0),
+  _querySize(0)
 { // constructor
   geocoords::Projector proj;
   proj.projection("utm");
@@ -71,6 +73,9 @@
   delete _baseDepth; _baseDepth = 0;
   delete _mohoDepth; _mohoDepth = 0;
   delete _csUTM; _csUTM = 0;
+
+  delete[] _queryVals; _queryVals = 0;
+  _querySize = 0;
 } // destructor
 
 // ----------------------------------------------------------------------
@@ -147,6 +152,41 @@
 spatialdata::spatialdb::SCECCVMH::queryVals(const char** names,
 					    const int numVals)
 { // queryVals
+  if (0 == numVals) {
+    std::ostringstream msg;
+    msg
+      << "Number of values for query in spatial database " << label()
+      << "\n must be positive.\n";
+    throw std::runtime_error(msg.str());
+  } // if
+  assert(0 != names && 0 < numVals);
+  
+  _querySize = numVals;
+  delete[] _queryVals; _queryVals = new int[numVals];
+  for (int iVal=0; iVal < numVals; ++iVal) {
+    if (0 == strcasecmp(names[iVal], "vp"))
+      _queryVals[iVal] = QUERY_VP;
+    else if (0 == strcasecmp(names[iVal], "vs"))
+      _queryVals[iVal] = QUERY_VS;
+    else if (0 == strcasecmp(names[iVal], "density"))
+      _queryVals[iVal] = QUERY_DENSITY;
+    else if (0 == strcasecmp(names[iVal], "topo-elev"))
+      _queryVals[iVal] = QUERY_TOPOELEV;
+    else if (0 == strcasecmp(names[iVal], "basement-depth"))
+      _queryVals[iVal] = QUERY_BASEDEPTH;
+    else if (0 == strcasecmp(names[iVal], "moho-depth"))
+      _queryVals[iVal] = QUERY_MOHODEPTH;
+    else if (0 == strcasecmp(names[iVal], "vp-tag"))
+      _queryVals[iVal] = QUERY_VPTAG;
+    else {
+      std::ostringstream msg;
+      msg
+	<< "Could not find value " << names[iVal] << " in spatial database\n"
+	<< label() << ". Available values are:\n"
+	<< "vp, vs, density, topo-elev, basement-depth, moho-depth, vp-tag.";
+      throw std::runtime_error(msg.str());
+    } // else
+  } // for
 } // queryVals
 
 // ----------------------------------------------------------------------
@@ -158,61 +198,167 @@
 					const int numDims,
 					const spatialdata::geocoords::CoordSys* csQuery)
 { // query
+  if (0 == _querySize) {
+    std::ostringstream msg;
+    msg
+      << "Values to be returned by spatial database " << label() << "\n"
+      << "have not been set. Please call queryVals() before query().\n";
+    throw std::runtime_error(msg.str());
+  } // if
+  else if (numVals != _querySize) {
+    std::ostringstream msg;
+    msg
+      << "Number of values to be returned by spatial database "
+      << label() << "\n"
+      << "(" << _querySize << ") does not match size of array provided ("
+      << numVals << ").\n";
+    throw std::runtime_error(msg.str());
+  } // if
+
   // Convert coordinates to UTM
-  for (int i=0; i < numDims; ++i)
-    _xyzUTM[i] = coords[i];
+  memcpy(_xyzUTM, coords, numDims*sizeof(double));
   spatialdata::geocoords::Converter::convert(_xyzUTM, 1, numDims, 
 					     _csUTM, csQuery);
 
-  assert(0 != _topoElev);
-  double elev = 0.0;
-  double baseDepth = 0.0;
-  double mohoDepth = 0.0;
+  int outsideVoxet = 0;
+  int queryFlag = 0;
+  bool haveVp = false;
   double vp = 0.0;
-  double vs = 0.0;
-  double density = 0.0;
+  for (int iVal=0; iVal < numVals; ++iVal)
+    switch (_queryVals[iVal])
+      { // switch
+      case QUERY_VP :
+	outsideVoxet = _queryVp(&vals[iVal]);
+	if (outsideVoxet)
+	  queryFlag = outsideVoxet;
+	haveVp = true;
+	vp = vals[iVal];
+	break;
+      case QUERY_VPTAG :
+	outsideVoxet = _queryTag(&vals[iVal]);
+	if (outsideVoxet)
+	  queryFlag = outsideVoxet;
+	break;
+      case QUERY_DENSITY :
+	if (!haveVp) {
+	  outsideVoxet = _queryVp(&vp);
+	  haveVp = true;
+	  if (outsideVoxet)
+	    queryFlag = outsideVoxet;
+	} // if
+	vals[iVal] = _calcDensity(vp);
+	break;
+      case QUERY_VS :
+	if (!haveVp) {
+	  outsideVoxet = _queryVp(&vp);
+	  haveVp = true;
+	  if (outsideVoxet)
+	    queryFlag = outsideVoxet;
+	} // if
+	vals[iVal] = _calcVs(vp);
+	break;
+      case QUERY_TOPOELEV :
+	assert(0 != _topoElev);
+	outsideVoxet = _topoElev->query(&vals[iVal], _xyzUTM);
+	if (outsideVoxet)
+	  queryFlag = outsideVoxet;
+	break;
+      case QUERY_BASEDEPTH :
+	assert(0 != _baseDepth);
+	outsideVoxet = _baseDepth->query(&vals[iVal], _xyzUTM);
+	if (outsideVoxet)
+	  queryFlag = outsideVoxet;
+	break;
+      case QUERY_MOHODEPTH :
+	assert(0 != _mohoDepth);
+	outsideVoxet = _mohoDepth->query(&vals[iVal], _xyzUTM);
+	if (outsideVoxet)
+	  queryFlag = outsideVoxet;
+	break;
+      default:
+	assert(0);
+      } // switch
+} // query
 
-  int outsideVoxet =_topoElev->query(&elev, _xyzUTM);
-  outsideVoxet = _baseDepth->query(&baseDepth, _xyzUTM);
-  outsideVoxet = _mohoDepth->query(&mohoDepth, _xyzUTM);
+// ----------------------------------------------------------------------
+// Perform query for Vp.
+int
+spatialdata::spatialdb::SCECCVMH::_queryVp(double* vp)
+{ // _queryVp
+  int outsideVoxet = 0;
+  double vpHR = 0.0;
 
-  outsideVoxet = _laLowResVp->query(&vp, _xyzUTM);
+  outsideVoxet = _laLowResVp->query(vp, _xyzUTM);
   if (!outsideVoxet) {
-    double vpHR = 0.0;
     outsideVoxet = _laHighResVp->query(&vpHR, _xyzUTM);
-    if (!outsideVoxet) {
-      vp = vpHR;
-    } // if
-    if (vp != 1480.0) {
-      if (vp < 4250.0)
-	vs = (vp > 1500.0) ? (vp-1360.0/1.16) : (1500.0-1360.0)/1.16;
-      else 
-        vs = 785.8 - 1.2344*vp + 794.9 * pow(vp/1000.0,2) 
-	  -123.8 * pow(vp/1000.0,3) + 6.4 * pow(vp/1000.0,4);
-      if (vp > 2160.0)
-        density = vp / 3.0 + 1280.0;
-      else
-        density = 2000.0;
-    } else
+    if (!outsideVoxet)
+      *vp = vpHR;
+    else
+      outsideVoxet = 0; // reset outsideVoxet flag to low-res value
+  } else
+    outsideVoxet = _crustMantleVp->query(vp, _xyzUTM);
+
+  return outsideVoxet;
+} // _queryVp
+
+// ----------------------------------------------------------------------
+// Perform query for tag.
+int
+spatialdata::spatialdb::SCECCVMH::_queryTag(double* tag)
+{ // _queryTag
+  int outsideVoxet = 0;
+  double tagHR = 0.0;
+
+  outsideVoxet = _laLowResTag->query(tag, _xyzUTM);
+  if (!outsideVoxet) {
+    outsideVoxet = _laHighResTag->query(&tagHR, _xyzUTM);
+    if (!outsideVoxet)
+      *tag = tagHR;
+    else
+      outsideVoxet = 0; // reset outsideVoxet flag to low-res value
+  } else
+    outsideVoxet = _crustMantleTag->query(tag, _xyzUTM);
+
+  return outsideVoxet;
+} // _queryTag
+
+// ----------------------------------------------------------------------
+// Compute density from Vp.
+double
+spatialdata::spatialdb::SCECCVMH::_calcDensity(const double vp)
+{ // _calcDensity
+  double density = vp / 3.0 + 1280.0;
+  if (vp < 2160.0) {
+    if (vp > 1480.0)
+      density = 2000.0;
+    else if (1480.0 == vp)
       density = 1000.0;
-  } else {
-    outsideVoxet = _crustMantleVp->query(&vp, _xyzUTM);
-    if (!outsideVoxet) {
-      outsideVoxet = _crustMantleVs->query(&vs, _xyzUTM);
-      density = vp / 3.0 + 1280.0;
-    } else {
-      vs = vp; // No data value
-      density = vp; // No data value
-    } // else
-  } // if/else
+    else
+      density = -99999.0;
+  } // if
 
-  std::cout << "elev: " << elev
-	    << ", basement depth: " << baseDepth
-	    << ", moho depth: " << mohoDepth
-	    << ", vp: " << vp
-	    << ", vs: " << vs
-	    << ", density: " << density << std::endl;
-} // query
+  return density;
+} // _calcDensity
 
+// ----------------------------------------------------------------------
+// Compute density from Vp.
+double
+spatialdata::spatialdb::SCECCVMH::_calcVs(const double vp)
+{ // _calcVs
+  double vs = (vp < 4250.0) ?
+    (vp - 1360.0) / 1.16 :
+    785.8 - 1.2344*vp + 794.9 * pow(vp/1000.0,2) 
+    - 123.8 * pow(vp/1000.0,3) + 6.4 * pow(vp/1000.0,4);
+  if (vp < 1500.0)
+    if (vp > 1480.0) 
+      vs = (1500.0-1360.0)/1.16;
+    else if (1480.0 == vp)
+      vs = 0.0;
+    else
+      vs = -99999.0;
 
+  return vs;
+} // _calcVs
+
+
 // End of file

Modified: cs/spatialdata-0.1/trunk/libsrc/spatialdb/SCECCVMH.hh
===================================================================
--- cs/spatialdata-0.1/trunk/libsrc/spatialdb/SCECCVMH.hh	2007-11-19 22:29:10 UTC (rev 8303)
+++ cs/spatialdata-0.1/trunk/libsrc/spatialdb/SCECCVMH.hh	2007-11-20 01:26:22 UTC (rev 8304)
@@ -15,7 +15,7 @@
 
 #include "spatialdata/spatialdb/SpatialDB.hh" // ISA SpatialDB
 
-#include <string>> // HASA std::string
+#include <string> // HASA std::string
 
 namespace spatialdata {
   namespace spatialdb {
@@ -33,28 +33,28 @@
 class spatialdata::spatialdb::SCECCVMH : SpatialDB
 { // SCECCVMH
   friend class TestSCECCVMH; // unit testing
-
+ 
 // PUBLIC MEMBERS ///////////////////////////////////////////////////////
 public :
-
+ 
   /// Constructor
   SCECCVMH(void);
-
+ 
   /// Destructor
   ~SCECCVMH(void);
-
+ 
   /** Set directory containing SCEC CVM-H data files.
    *
    * @param dir Directory containing data files.
    */
   void dataDir(const char* dir);
-
+ 
   /// Open the database and prepare for querying.
   void open(void);
-
+ 
   /// Close the database.
   void close(void);
-
+ 
   /** Set values to be returned by queries.
    *
    * @pre Must call open() before queryVals()
@@ -64,7 +64,7 @@
    */
   void queryVals(const char** names,
 		 const int numVals);
-
+ 
   /** Query the database.
    *
    * @note pVals should be preallocated to accommodate numVals values.
@@ -85,14 +85,60 @@
 	    const double* coords,
 	    const int numDims,
 	    const spatialdata::geocoords::CoordSys* pCSQuery);
-
-
+ 
+ 
 // NOT IMPLEMENTED //////////////////////////////////////////////////////
 private :
-
+ 
   SCECCVMH(const SCECCVMH&); ///< Not implemented
   const SCECCVMH& operator=(const SCECCVMH&); ///< Not implemented
+ 
+// PRIVATE ENUMS ////////////////////////////////////////////////////////
+private :
+ 
+  enum QueryValsEnum {
+    QUERY_VP=0, // vp
+    QUERY_VS=1, // vs
+    QUERY_DENSITY=2, // density
+    QUERY_TOPOELEV=3, // Elevation of topography
+    QUERY_BASEDEPTH=4, // Depth of basement
+    QUERY_MOHODEPTH=5, // Depth of Moho
+    QUERY_VPTAG=6 // Tag for Vp
+  }; // ValsEnum
 
+// PRIVATE METHODS //////////////////////////////////////////////////////
+private :
+
+  /** Perform query for Vp.
+   *
+   * @param vp Result of query
+   * @returns 0 if found location, 1 otherwise.
+   */
+  int _queryVp(double* vp);
+
+  /** Perform query for tag.
+   *
+   * @param tag Result of query
+   * @returns 0 if found location, 1 otherwise.
+   */
+  int _queryTag(double* tag);
+
+  /** Compute density from Vp.
+   *
+   * @param vp Vp in m/s.
+   * @returns density in kg/m^3.
+   */
+  static
+  double _calcDensity(const double vp);
+
+  /** Compute density from Vp.
+   *
+   * @param vp Vp in m/s.
+   * @returns Vs in m/s.
+   */
+  static
+  double _calcVs(const double vp);
+
 // PRIVATE MEMBERS //////////////////////////////////////////////////////
 private :
 
@@ -110,6 +156,9 @@
   GocadVoxet* _mohoDepth;  
   geocoords::CSGeoProj* _csUTM;
 
+  int* _queryVals; ///< Indices of values to be returned in queries.
+  int _querySize; ///< Number of values requested to be returned in queries.
+
 }; // SCECCVMH
 
 #endif // spatialdata_spatialdb_sceccvmh_hh

Modified: cs/spatialdata-0.1/trunk/tests/libtests/spatialdb/Makefile.am
===================================================================
--- cs/spatialdata-0.1/trunk/tests/libtests/spatialdb/Makefile.am	2007-11-19 22:29:10 UTC (rev 8303)
+++ cs/spatialdata-0.1/trunk/tests/libtests/spatialdb/Makefile.am	2007-11-20 01:26:22 UTC (rev 8304)
@@ -21,6 +21,7 @@
 
 testspatial_SOURCES = \
 	TestGravityField.cc \
+	TestSCECCVMH.cc \
 	TestSimpleDBQuery.cc \
 	TestSimpleDBQuery3D.cc \
 	TestSimpleDB.cc \
@@ -35,9 +36,10 @@
 	testspatial.cc
 
 noinst_HEADERS = \
-	TestGravityField.cc \
+	TestGravityField.hh \
+	TestSCECCVMH.hh \
 	TestSimpleDBQuery.hh \
-	TestSimpleDBQuery3D.cc \
+	TestSimpleDBQuery3D.hh \
 	TestSimpleDB.hh \
 	TestSimpleDBPoint3D.hh \
 	TestSimpleDBLine3D.hh \



More information about the cig-commits mailing list