aboutsummaryrefslogtreecommitdiff
path: root/Python/classwrapper.i
diff options
context:
space:
mode:
Diffstat (limited to 'Python/classwrapper.i')
-rw-r--r--Python/classwrapper.i230
1 files changed, 230 insertions, 0 deletions
diff --git a/Python/classwrapper.i b/Python/classwrapper.i
new file mode 100644
index 000000000..7cbf2246a
--- /dev/null
+++ b/Python/classwrapper.i
@@ -0,0 +1,230 @@
+%{
+
+#include <iostream>
+#include <ostream>
+#include <fstream>
+#include <sstream>
+#include <stdio.h>
+
+#include <Array.H>
+#include <IntVect.H>
+
+#include <Particles.H>
+
+#include <Box.H>
+#include <FArrayBox.H>
+#include <BoxArray.H>
+#include <MultiFab.H>
+#include <Geometry.H>
+
+#include <WarpX.H>
+
+%}
+
+%inline %{
+ std::ifstream & open_ifstream(const char *filename) {
+ std::ifstream *infile = new std::ifstream(filename);
+ return *infile;
+ }
+%}
+
+%inline %{
+ std::ofstream & open_ofstream(const char *filename) {
+ std::ofstream *outfile = new std::ofstream(filename);
+ return *outfile;
+ }
+%}
+
+%inline %{
+ void close_ofstream(std::ofstream& str) {
+ str.close();
+ }
+%}
+
+%inline %{
+ void close_ifstream(std::ifstream & str) {
+ str.close();
+ }
+%}
+
+%include <std_string.i>
+%rename(__str__) display;
+
+typedef double Real;
+
+%include "../../BoxLib/Src/C_BaseLib/Array.H"
+
+%extend Array {
+ T& __getitem__ (size_t i)
+ {
+ BL_ASSERT(i >= 0);
+ BL_ASSERT(i < self->size());
+ return self->std::vector<T>::operator[](i);
+ }
+
+ //
+ // Same as above, except acts on const Array's.
+ //
+ const T& __getitem__ (size_t i) const
+ {
+ BL_ASSERT(i >= 0);
+ BL_ASSERT(i < self->size());
+ return self->std::vector<T>::operator[](i);
+ }
+}
+
+%template(arrayReal) Array<Real>;
+%template(arrayInt) Array<int>;
+%template(arrayGeometry) Array<Geometry>;
+
+%extend Array<Real> {
+ PyObject *get_real() {
+ PyObject *arr = 0;
+ npy_intp dims[1];
+ dims[0] = self->std::vector<Real>::size();
+ arr = PyArray_NewFromDescr(&PyArray_Type,
+ PyArray_DescrFromType(NPY_DOUBLE), 1, dims, NULL,
+ self->dataPtr(), NPY_FORTRANORDER|NPY_ARRAY_WRITEABLE, NULL);
+ Py_INCREF(arr);
+ return arr;
+ }
+}
+%extend Array<int> {
+ PyObject *get_int() {
+ PyObject *arr = 0;
+ npy_intp dims[1];
+ dims[0] = self->std::vector<int>::size();
+ arr = PyArray_NewFromDescr(&PyArray_Type,
+ PyArray_DescrFromType(NPY_INT), 1, dims, NULL,
+ self->dataPtr(), NPY_FORTRANORDER|NPY_ARRAY_WRITEABLE, NULL);
+ Py_INCREF(arr);
+ return arr;
+ }
+}
+
+// Note that IntVect.H cannot be directly included since swig cannot parse the line setting up "const int* getVect".
+//%include "../../BoxLib/Src/C_BaseLib/IntVect.H"
+class IntVect {
+public:
+
+ IntVect(int i, int j, int k);
+ IntVect(const IntVect& rhs);
+
+ IntVect& shift(int coord, int s);
+
+ // static functions
+ static const IntVect& TheZeroVector();
+ static const IntVect& TheUnitVector();
+ static const IntVect& TheNodeVector();
+ static const IntVect& TheCellVector();
+};
+
+%extend IntVect {
+ //void writeOn(std::ofstream *os){
+ // *os << *self;
+ //}
+ //void read(std::ifstream* ifs){
+ // *ifs >> *self;
+ //}
+ int __getitem__(int index){
+ if (index < 0 || index >= BL_SPACEDIM) {
+ // SWIG_SetErrorMsg(PyExc_IndexError,"Index out of bounds\n");
+ return 0;
+ }
+ return (*self)[index];
+ }
+ int __len__() volatile { return BL_SPACEDIM; }
+ void __setitem__(int index,int val){
+ if (index < 0 || index >= BL_SPACEDIM) {
+ //SWIG_SetErrorMsg(PyExc_IndexError,"Index out of bounds\n");
+ } else {
+ (*self).setVal(index,val);
+ }
+ }
+ int __cmp__(const IntVect* other){
+ if( (*self) == (*other) ) {
+ return 0;
+ }
+ if( (*self) <= (*other) ) {
+ return -1;
+ }
+ return 1;
+ }
+ PyObject *get() {
+ PyObject *arr = 0;
+ npy_intp dims[1];
+ dims[0] = BL_SPACEDIM;
+ arr = PyArray_NewFromDescr(&PyArray_Type,
+ PyArray_DescrFromType(NPY_INT), 1, dims, NULL,
+ self->getVect(), NPY_FORTRANORDER|NPY_ARRAY_WRITEABLE, NULL);
+ Py_INCREF(arr);
+ return arr;
+ }
+
+ //std::string display() {
+ // std::ostringstream str;
+ // str << *self;
+ // return str.str();
+ //}
+}
+
+//%include "../../BoxLib/Src/C_BaseLib/Box.H"
+//%include "../../BoxLib/Src/C_BaseLib/FArrayBox.H"
+//%include "../../BoxLib/Src/C_BaseLib/BoxArray.H"
+//%include "../../BoxLib/Src/C_BaseLib/MultiFab.H"
+
+//#if (BL_SPACEDIM > 2)
+%ignore GetDLogA;
+//#endif
+
+%include "../../BoxLib/Src/C_BaseLib/Geometry.H"
+
+%template(arrayBoxArray) Array<BoxArray>;
+
+%include "../../BoxLib/Src/C_ParticleLib/Particles.H"
+
+//%template("WarpXParticleBase") Particle<PIdx::nattribs,0>;
+%template("WarpXParticleContainerBase") ParticleContainer<PIdx::nattribs,0,std::vector<Particle<PIdx::nattribs,0> > >;
+
+%ignore GetChargeDensity;
+
+%include "../Source/ParticleContainer.H"
+%include "../Source/WarpXParticleContainer.H"
+
+%extend WarpXParticleContainer {
+ PyObject * getLocations() {
+ Array<Real> result(0);
+ self->GetParticleLocations(result);
+ npy_intp dims[2] = {BL_SPACEDIM, self->TotalNumberOfParticles()};
+ PyObject *arr = PyArray_NewFromDescr(&PyArray_Type,
+ PyArray_DescrFromType(NPY_DOUBLE), 2, dims, NULL,
+ result.dataPtr(), NPY_ARRAY_F_CONTIGUOUS|NPY_ARRAY_WRITEABLE, NULL);
+ Py_INCREF(arr);
+ return arr;
+ }
+ PyObject * getData(int start_comp, int num_comp) {
+ Array<Real> result(0);
+ self->GetParticleData(result, start_comp, num_comp);
+ npy_intp dims[2] = {num_comp, self->TotalNumberOfParticles()};
+ PyObject *arr = PyArray_NewFromDescr(&PyArray_Type,
+ PyArray_DescrFromType(NPY_DOUBLE), 2, dims, NULL,
+ result.dataPtr(), NPY_ARRAY_F_CONTIGUOUS|NPY_ARRAY_WRITEABLE, NULL);
+ Py_INCREF(arr);
+ return arr;
+ }
+ PyObject * getAllData() {
+ int num_comp = PIdx::nattribs;
+ Array<Real> result(0);
+ self->GetParticleData(result, 0, num_comp);
+ npy_intp dims[2] = {num_comp, self->TotalNumberOfParticles()};
+ PyObject *arr = PyArray_NewFromDescr(&PyArray_Type,
+ PyArray_DescrFromType(NPY_DOUBLE), 2, dims, NULL,
+ result.dataPtr(), NPY_ARRAY_F_CONTIGUOUS|NPY_ARRAY_WRITEABLE, NULL);
+ Py_INCREF(arr);
+ return arr;
+ }
+};
+
+%include "../../BoxLib/Src/C_AmrCoreLib/AmrCore.H"
+%include "../Source/WarpX.H"
+