Skip to content

Commit

Permalink
Merge branch 'master' into fix/clean-unit-parser-context
Browse files Browse the repository at this point in the history
* master:
  BUG: Fix the definition for PPG.
  turn off the deprecated API
  provide (PyArrayObject*) casting for arrays passed to PyArray_DATA
  pyArray_DOUBLE -> NPY_DOUBLE
  NPY_IN_ARRAY -> NPY_ARRAY_IN_ARRAY; NPY_INOUT_ARRAY -> NPY_ARRAY_INOUT_ARRAY

Conflicts:
	scimath/units/tests/units_test_case.py
  • Loading branch information
rkern committed May 16, 2014
2 parents 20c865c + a28328e commit 9fabdd9
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 49 deletions.
12 changes: 12 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SciMath CHANGELOG
=================

Change summary since 4.1.2
~~~~~~~~~~~~~~~~~~~~~~~~~~

* Correct the definition of PPG to be a density unit instead of a pressure
gradient unit. Calculations using PPG as a pressure gradient unit can be
recovered simply by multiplying the PPG quantity by g, the acceleration due
to gravity. To precisely recover the exact values from the previous
definition, use ``0.0519 * psi_per_f / ppg`` for this value, which is not
necessarily the best estimate for g.
80 changes: 45 additions & 35 deletions scimath/interpolate/_interpolate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <stdlib.h>

#include "interpolate.h"
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include "numpy/arrayobject.h"

using namespace std;
Expand All @@ -20,33 +21,36 @@ static PyObject* linear_method(PyObject*self, PyObject* args, PyObject* kywds)
const_cast<char**>(kwlist), &py_x, &py_y,
&py_new_x, &py_new_y))
return NULL;
arr_x = PyArray_FROMANY(py_x, PyArray_DOUBLE, 1, 1, NPY_IN_ARRAY);
arr_x = PyArray_FROMANY(py_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
if (!arr_x) {
PyErr_SetString(PyExc_ValueError, "x must be a 1-D array of floats");
goto fail;
}
arr_y = PyArray_FROMANY(py_y, PyArray_DOUBLE, 1, 1, NPY_IN_ARRAY);
arr_y = PyArray_FROMANY(py_y, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
if (!arr_y) {
PyErr_SetString(PyExc_ValueError, "y must be a 1-D array of floats");
goto fail;
}
arr_new_x = PyArray_FROMANY(py_new_x, PyArray_DOUBLE, 1, 1, NPY_IN_ARRAY);
arr_new_x = PyArray_FROMANY(py_new_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
if (!arr_new_x) {
PyErr_SetString(PyExc_ValueError,
"new_x must be a 1-D array of floats");
goto fail;
}
arr_new_y = PyArray_FROMANY(py_new_y, PyArray_DOUBLE, 1, 1,
NPY_INOUT_ARRAY);
arr_new_y = PyArray_FROMANY(py_new_y, NPY_DOUBLE, 1, 1,
NPY_ARRAY_INOUT_ARRAY);
if (!arr_new_y) {
PyErr_SetString(PyExc_ValueError,
"new_y must be a 1-D array of floats");
goto fail;
}

linear((double*)PyArray_DATA(arr_x), (double*)PyArray_DATA(arr_y),
PyArray_DIM(arr_x, 0), (double*)PyArray_DATA(arr_new_x),
(double*)PyArray_DATA(arr_new_y), PyArray_DIM(arr_new_x, 0));
linear((double*)PyArray_DATA((PyArrayObject*)arr_x),
(double*)PyArray_DATA((PyArrayObject*)arr_y),
PyArray_DIM((PyArrayObject*)arr_x, 0),
(double*)PyArray_DATA((PyArrayObject*)arr_new_x),
(double*)PyArray_DATA((PyArrayObject*)arr_new_y),
PyArray_DIM((PyArrayObject*)arr_new_x, 0));

Py_DECREF(arr_x);
Py_DECREF(arr_y);
Expand Down Expand Up @@ -76,33 +80,36 @@ static PyObject* loginterp_method(PyObject*self, PyObject* args,
const_cast<char **>(kwlist), &py_x, &py_y,
&py_new_x, &py_new_y))
return NULL;
arr_x = PyArray_FROMANY(py_x, PyArray_DOUBLE, 1, 1, NPY_IN_ARRAY);
arr_x = PyArray_FROMANY(py_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
if (!arr_x) {
PyErr_SetString(PyExc_ValueError, "x must be a 1-D array of floats");
goto fail;
}
arr_y = PyArray_FROMANY(py_y, PyArray_DOUBLE, 1, 1, NPY_IN_ARRAY);
arr_y = PyArray_FROMANY(py_y, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
if (!arr_y) {
PyErr_SetString(PyExc_ValueError, "y must be a 1-D array of floats");
goto fail;
}
arr_new_x = PyArray_FROMANY(py_new_x, PyArray_DOUBLE, 1, 1, NPY_IN_ARRAY);
arr_new_x = PyArray_FROMANY(py_new_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
if (!arr_new_x) {
PyErr_SetString(PyExc_ValueError,
"new_x must be a 1-D array of floats");
goto fail;
}
arr_new_y = PyArray_FROMANY(py_new_y, PyArray_DOUBLE, 1, 1,
NPY_INOUT_ARRAY);
arr_new_y = PyArray_FROMANY(py_new_y, NPY_DOUBLE, 1, 1,
NPY_ARRAY_INOUT_ARRAY);
if (!arr_new_y) {
PyErr_SetString(PyExc_ValueError,
"new_y must be a 1-D array of floats");
goto fail;
}

loginterp((double*)PyArray_DATA(arr_x), (double*)PyArray_DATA(arr_y),
PyArray_DIM(arr_x,0), (double*)PyArray_DATA(arr_new_x),
(double*)PyArray_DATA(arr_new_y), PyArray_DIM(arr_new_x,0));
loginterp((double*)PyArray_DATA((PyArrayObject*)arr_x),
(double*)PyArray_DATA((PyArrayObject*)arr_y),
PyArray_DIM((PyArrayObject*)arr_x,0),
(double*)PyArray_DATA((PyArrayObject*)arr_new_x),
(double*)PyArray_DATA((PyArrayObject*)arr_new_y),
PyArray_DIM((PyArrayObject*)arr_new_x,0));

Py_DECREF(arr_x);
Py_DECREF(arr_y);
Expand Down Expand Up @@ -133,33 +140,36 @@ static PyObject* window_average_method(PyObject*self, PyObject* args,
const_cast<char **>(kwlist), &py_x, &py_y,
&py_new_x, &py_new_y, &width))
return NULL;
arr_x = PyArray_FROMANY(py_x, PyArray_DOUBLE, 1, 1, NPY_IN_ARRAY);
arr_x = PyArray_FROMANY(py_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
if (!arr_x) {
PyErr_SetString(PyExc_ValueError, "x must be a 1-D array of floats");
goto fail;
}
arr_y = PyArray_FROMANY(py_y, PyArray_DOUBLE, 1, 1, NPY_IN_ARRAY);
arr_y = PyArray_FROMANY(py_y, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
if (!arr_y) {
PyErr_SetString(PyExc_ValueError, "y must be a 1-D array of floats");
goto fail;
}
arr_new_x = PyArray_FROMANY(py_new_x, PyArray_DOUBLE, 1, 1, NPY_IN_ARRAY);
arr_new_x = PyArray_FROMANY(py_new_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
if (!arr_new_x) {
PyErr_SetString(PyExc_ValueError,
"new_x must be a 1-D array of floats");
goto fail;
}
arr_new_y = PyArray_FROMANY(py_new_y, PyArray_DOUBLE, 1, 1,
NPY_INOUT_ARRAY);
arr_new_y = PyArray_FROMANY(py_new_y, NPY_DOUBLE, 1, 1,
NPY_ARRAY_INOUT_ARRAY);
if (!arr_new_y) {
PyErr_SetString(PyExc_ValueError,
"new_y must be a 1-D array of floats");
goto fail;
}

window_average((double*)PyArray_DATA(arr_x), (double*)PyArray_DATA(arr_y),
PyArray_DIM(arr_x,0), (double*)PyArray_DATA(arr_new_x),
(double*)PyArray_DATA(arr_new_y), PyArray_DIM(arr_new_x,0), width);
window_average((double*)PyArray_DATA((PyArrayObject*)arr_x),
(double*)PyArray_DATA((PyArrayObject*)arr_y),
PyArray_DIM((PyArrayObject*)arr_x,0),
(double*)PyArray_DATA((PyArrayObject*)arr_new_x),
(double*)PyArray_DATA((PyArrayObject*)arr_new_y),
PyArray_DIM((PyArrayObject*)arr_new_x,0), width);

Py_DECREF(arr_x);
Py_DECREF(arr_y);
Expand Down Expand Up @@ -189,36 +199,36 @@ static PyObject* block_average_above_method(PyObject*self, PyObject* args,
const_cast<char **>(kwlist), &py_x, &py_y,
&py_new_x, &py_new_y))
return NULL;
arr_x = PyArray_FROMANY(py_x, PyArray_DOUBLE, 1, 1, NPY_IN_ARRAY);
arr_x = PyArray_FROMANY(py_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
if (!arr_x) {
PyErr_SetString(PyExc_ValueError, "x must be a 1-D array of floats");
goto fail;
}
arr_y = PyArray_FROMANY(py_y, PyArray_DOUBLE, 1, 1, NPY_IN_ARRAY);
arr_y = PyArray_FROMANY(py_y, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
if (!arr_y) {
PyErr_SetString(PyExc_ValueError, "y must be a 1-D array of floats");
goto fail;
}
arr_new_x = PyArray_FROMANY(py_new_x, PyArray_DOUBLE, 1, 1, NPY_IN_ARRAY);
arr_new_x = PyArray_FROMANY(py_new_x, NPY_DOUBLE, 1, 1, NPY_ARRAY_IN_ARRAY);
if (!arr_new_x) {
PyErr_SetString(PyExc_ValueError,
"new_x must be a 1-D array of floats");
goto fail;
}
arr_new_y = PyArray_FROMANY(py_new_y, PyArray_DOUBLE, 1, 1,
NPY_INOUT_ARRAY);
arr_new_y = PyArray_FROMANY(py_new_y, NPY_DOUBLE, 1, 1,
NPY_ARRAY_INOUT_ARRAY);
if (!arr_new_y) {
PyErr_SetString(PyExc_ValueError,
"new_y must be a 1-D array of floats");
goto fail;
}

block_average_above((double*)PyArray_DATA(arr_x),
(double*)PyArray_DATA(arr_y),
PyArray_DIM(arr_x,0),
(double*)PyArray_DATA(arr_new_x),
(double*)PyArray_DATA(arr_new_y),
PyArray_DIM(arr_new_x,0));
block_average_above((double*)PyArray_DATA((PyArrayObject*)arr_x),
(double*)PyArray_DATA((PyArrayObject*)arr_y),
PyArray_DIM((PyArrayObject*)arr_x,0),
(double*)PyArray_DATA((PyArrayObject*)arr_new_x),
(double*)PyArray_DATA((PyArrayObject*)arr_new_y),
PyArray_DIM((PyArrayObject*)arr_new_x,0));

Py_DECREF(arr_x);
Py_DECREF(arr_y);
Expand Down
25 changes: 11 additions & 14 deletions scimath/units/geo_units.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@


###############################################################################
# pressure_gradient_units psi/f, MPa/m, lb/gal, MPa/100f
# pressure_gradient_units psi/f, MPa/m, MPa/100f
###############################################################################

psi_per_f = psi/foot
Expand All @@ -43,19 +43,7 @@
MPa_per_m = MPa/meter
MPa_per_m.label = 'MPa/m'

lb_per_gal = lb/us_fluid_gallon
lb_per_gallon = lb_per_gal

###############################################################################
# PPG seems to have units of mass/volume and not weight/volume so we cannot
# use the unit system to automatically convert for us unless we lie about
# the dimensionality of ppg and pretend it is the same as psi/ft.
###############################################################################
# This is dimensionally inconsistant which may bite us later.
###############################################################################

psi_per_ft = pounds_per_square_inch /foot
ppg = psi_per_ft / 0.0519

MPa_per_f = MPa/foot
MPa_per_f.label = 'MPa/ft'
Expand All @@ -64,6 +52,15 @@
MPa_per_100f.label = 'MPa/100ft'
MPa_per_100ft = MPa_per_100f

###############################################################################
# Density units used in pressure gradient calculations
###############################################################################

lb_per_gal = lb/us_fluid_gallon
lb_per_gallon = lb_per_gal

ppg = copy(lb_per_gal)
ppg.label = 'ppg'

###############################################################################
# Gamma Ray
Expand All @@ -75,4 +72,4 @@
# psonic
###############################################################################
us_per_ft = microsecond/foot
us_per_ft = 'us/ft'
us_per_ft.label = 'us/ft'
5 changes: 5 additions & 0 deletions scimath/units/tests/units_test_case.py
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,11 @@ def test_unit_system_units_call(self):
self.assertEqual(kgs.units('rhog').derivation, unit_parser.parse_unit('1000*kg/m**3').derivation)
self.assertEqual(kgs.units('pvelocity').derivation, unit_parser.parse_unit('1000*m/s').derivation)

def test_ppg(self):
# PPG is a density measurement. It is not a pressure gradient unit. The
# pressure gradient can be found by multiplying the density by the
# acceleration due to gravity.
self.assertEqual(geo_units.ppg.derivation, density.gcc.derivation)

#########################################################################
# Private Methods:
Expand Down

0 comments on commit 9fabdd9

Please sign in to comment.