[cig-commits] r19100 - short/3D/PyLith/trunk/modulesrc/include
brad at geodynamics.org
brad at geodynamics.org
Wed Oct 19 19:23:07 PDT 2011
Author: brad
Date: 2011-10-19 19:23:07 -0700 (Wed, 19 Oct 2011)
New Revision: 19100
Added:
short/3D/PyLith/trunk/modulesrc/include/scalartypemaps.i
Log:
Added missing file.
Added: short/3D/PyLith/trunk/modulesrc/include/scalartypemaps.i
===================================================================
--- short/3D/PyLith/trunk/modulesrc/include/scalartypemaps.i (rev 0)
+++ short/3D/PyLith/trunk/modulesrc/include/scalartypemaps.i 2011-10-20 02:23:07 UTC (rev 19100)
@@ -0,0 +1,169 @@
+// -*- C++ -*-
+//
+// ======================================================================
+//
+// Brad T. Aagaard, U.S. Geological Survey
+// Charles A. Williams, GNS Science
+// Matthew G. Knepley, University of Chicago
+//
+// This code was developed as part of the Computational Infrastructure
+// for Geodynamics (http://geodynamics.org).
+//
+// Copyright (c) 2010-2011 University of California, Davis
+//
+// See COPYING for license information.
+//
+// ======================================================================
+//
+
+// Map a Python float scalar to PylistScalar.
+%typemap(in) PylithScalar {
+ $1 = PyFloat_AsDouble($input);
+ } // typemap
+
+// Map a PylithScalar to a Python float
+%typemap(out) PylithScalar {
+ $result = PyFloat_FromDouble($1);
+ } // typemap
+
+
+%typemap(typecheck,precedence=SWIG_TYPECHECK_FLOAT) PylithScalar {
+ $1 = PyFloat_Check($input) ? 1 : 0;
+}
+
+
+
+%{
+static
+int
+convert_scalararray(PyObject* input,
+ PylithScalar* const values,
+ const int size) {
+ if (!PySequence_Check(input)) {
+ PyErr_SetString(PyExc_TypeError, "Expecting a sequence of floats.");
+ return 0;
+ } // if
+ if (PyObject_Length(input) != size) {
+ PyErr_SetString(PyExc_ValueError, "Sequence size mismatch.");
+ return 0;
+ } // if
+ for (int i=0; i < size; i++) {
+ PyObject *o = PySequence_GetItem(input,i);
+ if (!PyFloat_Check(o)) {
+ Py_XDECREF(o);
+ PyErr_SetString(PyExc_ValueError,"Expecting a sequence of floats.");
+ return 0;
+ } // if
+ values[i] = PyFloat_AsDouble(o);
+ Py_DECREF(o);
+ } // for
+ return 1;
+} // convert_scalararray
+%}
+
+// Map a Python sequence of floats into a C PylithScalar array.
+%typemap(in) PylithScalar [ANY] (PylithScalar values[$1_dim0]) {
+ if (!convert_scalararray($input, values, $1_dim0))
+ return NULL;
+ $1 = &values[0];
+ } // typemap
+
+
+// Typemap suite for (PylithScalar* IN_ARRAY1, int DIM1)
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY)
+ (PylithScalar* IN_ARRAY1, int DIM1)
+{
+ $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in)
+ (PylithScalar* IN_ARRAY1, int DIM1)
+ (PyArrayObject* array=NULL, int is_new_object=0)
+{
+ if (sizeof(float) == sizeof(PylithScalar)) {
+ array = obj_to_array_contiguous_allow_conversion($input, NPY_FLOAT, &is_new_object);
+ } else if (sizeof(double) == sizeof(PylithScalar)) {
+ array = obj_to_array_contiguous_allow_conversion($input, NPY_DOUBLE, &is_new_object);
+ } else {
+ PyErr_Format(PyExc_TypeError,
+ "Unknown size for PyLithscalar. '%ld' given.",
+ sizeof(PylithScalar));
+ } // if/else
+ npy_intp size[1] = { -1 };
+ if (!array || !require_dimensions(array, 1) || !require_size(array, size, 1)) SWIG_fail;
+ $1 = (PylithScalar*) array_data(array);
+ $2 = (int) array_size(array,0);
+
+}
+%typemap(freearg)
+(PylithScalar* IN_ARRAY1, int DIM1)
+{
+ if (is_new_object$argnum && array$argnum)
+ { Py_DECREF(array$argnum); }
+}
+
+
+/* Typemap suite for (DATA_TYPE* IN_ARRAY2, int DIM1, int DIM2)
+ */
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY)
+ (PylithScalar* IN_ARRAY2, int DIM1, int DIM2)
+{
+ $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in)
+ (PylithScalar* IN_ARRAY2, int DIM1, int DIM2)
+ (PyArrayObject* array=NULL, int is_new_object=0)
+{
+ if (sizeof(float) == sizeof(PylithScalar)) {
+ array = obj_to_array_contiguous_allow_conversion($input, NPY_FLOAT, &is_new_object);
+ } else if (sizeof(double) == sizeof(PylithScalar)) {
+ array = obj_to_array_contiguous_allow_conversion($input, NPY_DOUBLE, &is_new_object);
+ } else {
+ } // if/else
+ npy_intp size[2] = { -1, -1 };
+ if (!array || !require_dimensions(array, 2) || !require_size(array, size, 2)) SWIG_fail;
+ $1 = (PylithScalar*) array_data(array);
+ $2 = (int) array_size(array,0);
+ $3 = (int) array_size(array,1);
+}
+%typemap(freearg)
+ (PylithScalar* IN_ARRAY2, int DIM1, int DIM2)
+{
+ if (is_new_object$argnum && array$argnum)
+ { Py_DECREF(array$argnum); }
+}
+
+
+// Typemap suite for (PylithScalar* IN_ARRAY3, int DIM1, int DIM2, int DIM3)
+%typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY)
+ (PylithScalar* IN_ARRAY3, int DIM1, int DIM2, int DIM3)
+{
+ $1 = is_array($input) || PySequence_Check($input);
+}
+%typemap(in)
+ (PylithScalar* IN_ARRAY3, int DIM1, int DIM2, int DIM3)
+ (PyArrayObject* array=NULL, int is_new_object=0)
+{
+ if (sizeof(float) == sizeof(PylithScalar)) {
+ array = obj_to_array_contiguous_allow_conversion($input, NPY_FLOAT, &is_new_object);
+ } else if (sizeof(double) == sizeof(PylithScalar)) {
+ array = obj_to_array_contiguous_allow_conversion($input, NPY_DOUBLE, &is_new_object);
+ } else {
+
+ } // if/else
+ npy_intp size[3] = { -1, -1, -1 };
+ if (!array || !require_dimensions(array, 3) || !require_size(array, size, 3)) SWIG_fail;
+ $1 = (PylithScalar*) array_data(array);
+ $2 = (int) array_size(array,0);
+ $3 = (int) array_size(array,1);
+ $4 = (int) array_size(array,2);
+}
+%typemap(freearg)
+ (PylithScalar* IN_ARRAY3, int DIM1, int DIM2, int DIM3)
+{
+ if (is_new_object$argnum && array$argnum)
+ { Py_DECREF(array$argnum); }
+}
+
+
+
+// End of file
More information about the CIG-COMMITS
mailing list