OPAL (Object Oriented Parallel Accelerator Library) 2022.1
OPAL
PyNDGrid.cpp
Go to the documentation of this file.
1#include <Python.h>
2#include <structmember.h>
3
4#include <exception>
5#include <iostream>
6#include <boost/python.hpp>
7#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
8
10
13
14
15namespace PyOpal {
16
17namespace PyNDGrid {
18
19using namespace interpolation;
20namespace py = boost::python;
21
22class Inform;
23extern Inform *gmsg;
24
25NDGrid initialiseVariableSpacing(boost::python::list gridCoordinates) {
26 int gLength = boost::python::len(gridCoordinates);
27 std::vector<std::vector<double> > coords(gLength);
28 for (int i = 0; i < gLength; ++i) {
29 int lineLength = boost::python::len(gridCoordinates[i]);
30 coords[i] = std::vector<double>(lineLength);
31 for (int j = 0; j < lineLength; ++j) {
32 coords[i][j] = boost::python::extract<double>(gridCoordinates[i][j]);
33 }
34 }
35 return NDGrid(coords);
36}
37
38
39NDGrid initialiseFixedSpacing(boost::python::list size,
40 boost::python::list spacing,
41 boost::python::list min) {
42 int dim = boost::python::len(size);
43 if (dim != boost::python::len(spacing)) {
44 // error
45 } else if (dim != boost::python::len(min)) {
46 // error
47 }
48 std::vector<int> sizeVec(dim);
49 std::vector<double> spacingVec(dim);
50 std::vector<double> minVec(dim);
51 for (int i = 0; i < dim; ++i) {
52 sizeVec[i] = boost::python::extract<int>(size[i]);
53 spacingVec[i] = boost::python::extract<double>(spacing[i]);
54 minVec[i] = boost::python::extract<double>(min[i]);
55 }
56
57 return NDGrid(dim, &sizeVec[0], &spacingVec[0], &minVec[0]);
58}
59
60py::list coordVector(NDGrid& grid, int dimension) {
61 if (dimension >= grid.getPositionDimension()) {
62 throw OpalException("PyNDGrid::coordVector",
63 "Dimension out of bounds");
64 }
65 std::vector<double> vec = grid.coordVector(dimension);
66 py::list coord = py::list();
67 for (size_t i = 0; i < vec.size(); ++i) {
68 coord.append(vec[i]);
69 }
70 return coord;
71}
72
73
74
75
76const char* module_docstring = "ndgrid module for generating grids";
77
80 boost::python::class_<NDGrid>("NDGrid")
81 .def("initialise_variable_spacing", &initialiseVariableSpacing)
82 .staticmethod("initialise_variable_spacing")
83 .def("initialise_fixed_spacing", &initialiseFixedSpacing)
84 .staticmethod("initialise_fixed_spacing")
85 .def("size", &NDGrid::size)
86 .def("get_position_dimension", &NDGrid::getPositionDimension)
87 .def("coord_vector", &coordVector)
88 ;
89}
90} // namespace PyNDGrid
91} // namespace PyOpal
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
Definition: ReductionLoc.h:76
const char * module_docstring
Definition: PyNDGrid.cpp:76
Inform * gmsg
Definition: PyNDGrid.cpp:22
py::list coordVector(NDGrid &grid, int dimension)
Definition: PyNDGrid.cpp:60
NDGrid initialiseVariableSpacing(boost::python::list gridCoordinates)
Definition: PyNDGrid.cpp:25
BOOST_PYTHON_MODULE(ndgrid)
Definition: PyNDGrid.cpp:78
NDGrid initialiseFixedSpacing(boost::python::list size, boost::python::list spacing, boost::python::list min)
Definition: PyNDGrid.cpp:39
int getPositionDimension() const
Definition: NDGrid.h:376
int size(const int &dimension) const
Definition: NDGrid.h:310
std::vector< double > coordVector(const int &dimension) const
Definition: NDGrid.h:314
The base class for all OPAL exceptions.
Definition: OpalException.h:28
Definition: Inform.h:42
Definition: Vec.h:22