[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