[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