[cig-commits] r13080 - cs/cigma/trunk/src

luis at geodynamics.org luis at geodynamics.org
Wed Oct 15 10:13:05 PDT 2008


Author: luis
Date: 2008-10-15 10:13:05 -0700 (Wed, 15 Oct 2008)
New Revision: 13080

Added:
   cs/cigma/trunk/src/py_NodeCoordinates.h
Modified:
   cs/cigma/trunk/src/py_NodeCoordinates.cpp
Log:
Header file for pyNodeCoordinates bindings

Modified: cs/cigma/trunk/src/py_NodeCoordinates.cpp
===================================================================
--- cs/cigma/trunk/src/py_NodeCoordinates.cpp	2008-10-15 17:13:03 UTC (rev 13079)
+++ cs/cigma/trunk/src/py_NodeCoordinates.cpp	2008-10-15 17:13:05 UTC (rev 13080)
@@ -1,41 +1,133 @@
-#include "NodeCoordinates.h"
-#include <boost/python.hpp>
-#include <boost/python/numeric.hpp>
-#include <boost/python/tuple.hpp>
+#include "py_NodeCoordinates.h"
 
 using namespace cigma;
 using namespace boost::python;
 
 
+// ----------------------------------------------------------------------------
+
+int pyNodeCoordinates::n_points() const
+{
+    return this->get_override("n_points")();
+}
+
+int pyNodeCoordinates::n_dim() const
+{
+    return this->get_override("n_dim")();
+}
+
+double pyNodeCoordinates::getPoint(int i, int j) const
+{
+    return this->get_override("getPoint")(i, j);
+}
+
+double* pyNodeCoordinates::getPointOffset(int i)
+{
+    return 0;
+}
+
+void pyNodeCoordinates::setCoordinates(double *coords, int nno, int nsd)
+{
+}
+
+void pyNodeCoordinates::setCoordinates(float *coords, int nno, int nsd)
+{
+}
+
+
+// ----------------------------------------------------------------------------
+
+py_nc_array::py_nc_array() : data(0)
+{
+    PyErr_SetString(PyExc_RuntimeError, "Constructor called without arguments");
+    throw_error_already_set();
+}
+
+py_nc_array::py_nc_array(int npts, int nsd) : nc_array(), data(0)
+{
+    std::vector<int> dims;
+    dims.push_back(npts);
+    dims.push_back(nsd);
+    this->data = numpy_util::makeArray(dims, PyArray_DOUBLE);
+
+    this->nno = npts;
+    this->nsd = nsd;
+    this->coords = (double *)numpy_util::data(this->data);
+}
+
+
+py_nc_array::~py_nc_array()
+{
+    //std::cout << "Calling ~py_nc_array()" << std::endl;
+    nno = 0;
+    nsd = 0;
+    coords = 0;
+}
+
+double py_nc_array::getPoint(int i, int j) const
+{
+    if ((i >= n_points()) || (i < 0))
+    {
+        PyErr_SetString(PyExc_IndexError, "First index is out of bounds");
+        throw_error_already_set();
+    }
+    if ((j >= n_dim()) || (j < 0))
+    {
+        PyErr_SetString(PyExc_IndexError, "Second index is out of bounds");
+        throw_error_already_set();
+    }
+    return nc_array::getPoint(i,j);
+}
+
 /*
-class NodeCoordinatesWrapper : public NodeCoordinates
+void py_nc_array::setPoint(int i, int j, double val)
 {
-public:
-    NodeCoordinatesWrapper(numeric::array &x)
+    if ((i >= n_points()) || (i < 0))
     {
-        tuple t = x.factory.getshape();
-        int rank = len(t);
-        if (rank == 2)
-        {
-            std::cout << "rank two!\n";
-        }
+        PyErr_SetString(PyExc_IndexError, "First index is out of bounds");
+        throw_error_already_set();
     }
-    ~NodeCoordinatesWrapper()
+    if ((j >= n_dim()) || (j < 0))
     {
+        PyErr_SetString(PyExc_IndexError, "Second index is out of bounds");
+        throw_error_already_set();
     }
-private:
-    numeric::array _data;
-}; */
+    nc_array::setPoint(i, j, val);
+} // */
 
+numeric::array py_nc_array::getData()
+{
+    return data;
+}
 
+void py_nc_array::setData(numeric::array x)
+{
+    numpy_util::check_type(x, PyArray_DOUBLE);
+    numpy_util::check_rank(x, 2);
+    numpy_util::check_size(x, n_points() * n_dim());
+    this->data = numpy_util::makeArray(x);
+}
+
+
+// ----------------------------------------------------------------------------
+
 void export_NodeCoordinates()
 {
-    //typedef NodeCoordinatesWrapper X;
-    typedef NodeCoordinates X;
+    using namespace cigma;
+    using namespace boost::python;
 
-    class_<X,boost::noncopyable>("NodeCoordinates", no_init)
-        .def_readonly("npts", &X::n_points)
-        .def_readonly("ndim", &X::n_dim)
-        .def("getPoint", &X::getPoint)
+    class_<pyNodeCoordinates, boost::noncopyable>("NodeCoordinates")
+        .def("n_points", pure_virtual(&NodeCoordinates::n_points))
+        .def("n_dim", pure_virtual(&NodeCoordinates::n_dim))
+        .def("getPoint", pure_virtual(&NodeCoordinates::getPoint))
         ;
+
+    typedef py_nc_array nc;
+    class_<py_nc_array, boost::noncopyable>("nc_array", init<int,int>())
+        .def("n_points", &nc::n_points)
+        .def("n_dim", &nc::n_dim)
+        .def("getPoint", &nc::getPoint)
+        .add_property("data", &nc::getData, &nc::setData)
+        ;
 }
+

Added: cs/cigma/trunk/src/py_NodeCoordinates.h
===================================================================
--- cs/cigma/trunk/src/py_NodeCoordinates.h	                        (rev 0)
+++ cs/cigma/trunk/src/py_NodeCoordinates.h	2008-10-15 17:13:05 UTC (rev 13080)
@@ -0,0 +1,37 @@
+#ifndef __PY_NODE_COORDINATES_H__
+#define __PY_NODE_COORDINATES_H__
+
+#include "numpy_util.h"
+#include "Common.h"
+#include "Locator.h"
+#include "NodeCoordinates.h"
+#include "nc_array.h"
+
+struct pyNodeCoordinates : cigma::NodeCoordinates, boost::python::wrapper<cigma::NodeCoordinates>
+{
+    int n_points() const;
+    int n_dim() const;
+    double getPoint(int i, int j) const;
+
+    double* getPointOffset(int i);
+    void setCoordinates(double *coords, int nno, int nsd);
+    void setCoordinates(float *coords, int nno, int nsd);
+};
+
+struct py_nc_array : nc_array
+{
+    py_nc_array();
+    py_nc_array(int npts, int ndim);
+    ~py_nc_array();
+
+    double getPoint(int i, int j) const;
+    //void setPoint(int i, int j, double val);
+
+    boost::python::numeric::array getData();
+    void setData(boost::python::numeric::array data);
+
+private:
+    boost::python::numeric::array data;
+};
+
+#endif



More information about the cig-commits mailing list