[cig-commits] r18917 - in cs/spatialdata/trunk/libsrc: spatialdb units
brad at geodynamics.org
brad at geodynamics.org
Thu Sep 15 19:03:31 PDT 2011
Author: brad
Date: 2011-09-15 19:03:30 -0700 (Thu, 15 Sep 2011)
New Revision: 18917
Modified:
cs/spatialdata/trunk/libsrc/spatialdb/SimpleIOAscii.cc
cs/spatialdata/trunk/libsrc/spatialdb/SpatialDB.cc
cs/spatialdata/trunk/libsrc/spatialdb/SpatialDB.hh
cs/spatialdata/trunk/libsrc/units/Nondimensional.hh
cs/spatialdata/trunk/libsrc/units/Nondimensional.icc
Log:
Added float routines.
Modified: cs/spatialdata/trunk/libsrc/spatialdb/SimpleIOAscii.cc
===================================================================
--- cs/spatialdata/trunk/libsrc/spatialdb/SimpleIOAscii.cc 2011-09-16 00:02:40 UTC (rev 18916)
+++ cs/spatialdata/trunk/libsrc/spatialdb/SimpleIOAscii.cc 2011-09-16 02:03:30 UTC (rev 18917)
@@ -37,6 +37,7 @@
#include <string.h> // USES strlen()
#include <assert.h> // USES assert()
+#include <iostream>
// ----------------------------------------------------------------------
const char* spatialdata::spatialdb::SimpleIOAscii::HEADER =
"#SPATIAL.ascii";
@@ -250,6 +251,9 @@
double* data = pData->data(iLoc);
for (int iVal=0; iVal < numValues; ++iVal)
buffer >> data[iVal];
+ if (buffer.bad()) {
+ throw std::runtime_error("Error reading points.");
+ } // if
} // for
if (!filein.good())
throw std::runtime_error("I/O error while reading SimpleDB data.");
Modified: cs/spatialdata/trunk/libsrc/spatialdb/SpatialDB.cc
===================================================================
--- cs/spatialdata/trunk/libsrc/spatialdb/SpatialDB.cc 2011-09-16 00:02:40 UTC (rev 18916)
+++ cs/spatialdata/trunk/libsrc/spatialdb/SpatialDB.cc 2011-09-16 02:03:30 UTC (rev 18917)
@@ -41,6 +41,30 @@
} // destructor
// ----------------------------------------------------------------------
+// Query the database.
+int
+spatialdata::spatialdb::SpatialDB::query(float* vals,
+ const int numVals,
+ const float* coords,
+ const int numDims,
+ const spatialdata::geocoords::CoordSys* csQuery)
+{ // query
+ double* coordsD = (numDims > 0) ? new double[numDims] : 0;
+ for (int i=0; i < numDims; ++i)
+ coordsD[i] = coords[i];
+
+ double* valsD = (numVals > 0) ? new double[numVals] : 0;
+
+ query(valsD, numVals, coordsD, numDims, csQuery);
+
+ for (int i=0; i < numVals; ++i)
+ vals[i] = valsD[i];
+
+ delete[] valsD; valsD = 0;
+ delete[] coordsD; coordsD = 0;
+} // query
+
+// ----------------------------------------------------------------------
// Perform multiple queries of the database.
void
spatialdata::spatialdb::SpatialDB::multiquery(double* vals,
@@ -70,4 +94,34 @@
} // multiquery
+// ----------------------------------------------------------------------
+// Perform multiple queries of the database.
+void
+spatialdata::spatialdb::SpatialDB::multiquery(float* vals,
+ const int numLocsV,
+ const int numValsV,
+ int* err,
+ const int numLocsE,
+ const float* coords,
+ const int numLocsC,
+ const int numDimsC,
+ const spatialdata::geocoords::CoordSys* csQuery)
+{ // multiquery
+ assert(numLocsV == numLocsE);
+ assert(numLocsC == numLocsE);
+ assert( (0 == vals && 0 == numLocsV && 0 == numValsV) ||
+ (0 != vals && numLocsV > 0 && numValsV > 0) );
+ assert( (0 == err && 0 == numLocsE) ||
+ (0 != err && numLocsE > 0) );
+ assert( (0 == coords && 0 == numLocsC && 0 == numDimsC) ||
+ (0 != coords && numLocsC > 0 && numDimsC > 0) );
+
+ for (int i=0, indexV=0, indexC=0;
+ i < numLocsV;
+ ++i, indexV+=numValsV, indexC+=numDimsC)
+ err[i] = query(&vals[indexV], numValsV, &coords[indexC], numDimsC,
+ csQuery);
+} // multiquery
+
+
// End of file
Modified: cs/spatialdata/trunk/libsrc/spatialdb/SpatialDB.hh
===================================================================
--- cs/spatialdata/trunk/libsrc/spatialdb/SpatialDB.hh 2011-09-16 00:02:40 UTC (rev 18916)
+++ cs/spatialdata/trunk/libsrc/spatialdb/SpatialDB.hh 2011-09-16 02:03:30 UTC (rev 18917)
@@ -100,6 +100,27 @@
const int numDims,
const spatialdata::geocoords::CoordSys* csQuery) = 0;
+ /** Query the database.
+ *
+ * @note vals should be preallocated to accommodate numVals values.
+ *
+ * @pre Must call open() before query().
+ *
+ * @param vals Array for computed values (output from query), must be
+ * allocated BEFORE calling query().
+ * @param numVals Number of values expected (size of pVals array)
+ * @param coords Coordinates of point for query [numDims].
+ * @param numDims Number of dimensions for coordinates.
+ * @param csQuery Coordinate system of coordinates.
+ *
+ * @returns 0 on success, 1 on failure (i.e., could not interpolate)
+ */
+ int query(float* vals,
+ const int numVals,
+ const float* coords,
+ const int numDims,
+ const spatialdata::geocoords::CoordSys* csQuery);
+
/** Perform multiple queries of the database.
*
* @note vals should be preallocated to accommodate numVals values
@@ -131,6 +152,37 @@
const int numDimsC,
const spatialdata::geocoords::CoordSys* csQuery);
+ /** Perform multiple queries of the database.
+ *
+ * @note vals should be preallocated to accommodate numVals values
+ * at numLocs locations.
+ *
+ * @note err should be preallocated to accommodate numLocs values.
+ *
+ * @pre Must call open() before query().
+ *
+ * @param vals Array for computed values (output from query), must be
+ * allocated BEFORE calling query() [numLocs*numVals].
+ * @param numLocsV Number of locations.
+ * @param numValsV Number of values expected.
+ * @param err Array for error flag values (output from query), must be
+ * allocated BEFORE calling query() [numLocs].
+ * @param numLocsE Number of locations.
+ * @param coords Coordinates of point for query [numLocs*numDims].
+ * @param numLocsC Number of locations.
+ * @param numDimsC Number of dimensions for coordinates.
+ * @param csQuery Coordinate system of coordinates.
+ */
+ void multiquery(float* vals,
+ const int numLocsV,
+ const int numValsV,
+ int* err,
+ const int numLocsE,
+ const float* coords,
+ const int numLocsC,
+ const int numDimsC,
+ const spatialdata::geocoords::CoordSys* csQuery);
+
private :
// PRIVATE METHODS ////////////////////////////////////////////////////
Modified: cs/spatialdata/trunk/libsrc/units/Nondimensional.hh
===================================================================
--- cs/spatialdata/trunk/libsrc/units/Nondimensional.hh 2011-09-16 00:02:40 UTC (rev 18916)
+++ cs/spatialdata/trunk/libsrc/units/Nondimensional.hh 2011-09-16 02:03:30 UTC (rev 18917)
@@ -129,6 +129,16 @@
const int nvalues,
const double scale) const;
+ /** Make values dimensionless.
+ *
+ * @param values Array of values with dimensions in SI units.
+ * @param nvalues Number of values.
+ * @param scale Scale used to nondimensionalize value.
+ */
+ void nondimensionalize(float* const values,
+ const int nvalues,
+ const double scale) const;
+
/** Make value dimensionless.
*
* @param values Array of dimensionless values.
@@ -139,6 +149,16 @@
const int nvalues,
const double scale) const;
+ /** Make value dimensionless.
+ *
+ * @param values Array of dimensionless values.
+ * @param nvalues Number of values.
+ * @param scale Scale used to nondimensionalize value.
+ */
+ void dimensionalize(float* const values,
+ const int nvalues,
+ const double scale) const;
+
private :
// PRIVATE MEMBERS ////////////////////////////////////////////////////
Modified: cs/spatialdata/trunk/libsrc/units/Nondimensional.icc
===================================================================
--- cs/spatialdata/trunk/libsrc/units/Nondimensional.icc 2011-09-16 00:02:40 UTC (rev 18916)
+++ cs/spatialdata/trunk/libsrc/units/Nondimensional.icc 2011-09-16 02:03:30 UTC (rev 18917)
@@ -70,6 +70,20 @@
values[i] /= scale;
} // nondimensionalize
+// Make values dimensionless.
+inline
+void
+spatialdata::units::Nondimensional::nondimensionalize(float* const values,
+ const int nvalues,
+ const double scale) const
+{ // nondimensionalize
+ assert( (0 < nvalues && 0 != values) ||
+ (0 == nvalues && 0 == values) );
+
+ for (int i=0; i < nvalues; ++i)
+ values[i] /= scale;
+} // nondimensionalize
+
// Make value dimensionless.
inline
double
@@ -93,4 +107,19 @@
} // dimensionalize
+// Make value dimensionless.
+inline
+void
+spatialdata::units::Nondimensional::dimensionalize(float* const values,
+ const int nvalues,
+ const double scale) const
+{ // dimensionalize
+ assert( (0 < nvalues && 0 != values) ||
+ (0 == nvalues && 0 == values) );
+
+ for (int i=0; i < nvalues; ++i)
+ values[i] *= scale;
+} // dimensionalize
+
+
// End of file
More information about the CIG-COMMITS
mailing list