Konstantin Ladutenko 6 роки тому
батько
коміт
a1ffac2d48
1 змінених файлів з 113 додано та 89 видалено
  1. 113 89
      src/nmie.cc

+ 113 - 89
src/nmie.cc

@@ -49,6 +49,7 @@
 #include "nmie-impl.hpp"
 #include "nmie-precision.hpp"
 #include <array>
+#include <tuple>
 #include <algorithm>
 #include <cstdio>
 #include <cstdlib>
@@ -62,100 +63,11 @@
 #include <pybind11/complex.h>
 
 
-// // -------------
-// // pure C++ code
-// // -------------
-
-// std::vector<int> multiply(const std::vector<double>& input)
-// {
-//   std::vector<int> output(input.size());
-
-//   for ( size_t i = 0 ; i < input.size() ; ++i )
-//     output[i] = 10*static_cast<int>(input[i]);
-
-//   return output;
-// }
-
-// // ----------------
-// // Python interface
-// // ----------------
-
-// namespace py = pybind11;
-
-// // wrap C++ function with NumPy array IO
-// py::array_t<int> py_multiply(py::array_t<double, py::array::c_style | py::array::forcecast> array)
-// {
-//   // allocate std::vector (to pass to the C++ function)
-//   std::vector<double> array_vec(array.size());
-
-//   // copy py::array -> std::vector
-//   std::memcpy(array_vec.data(),array.data(),array.size()*sizeof(double));
-
-//   // call pure C++ function
-//   std::vector<int> result_vec = multiply(array_vec);
-
-//   // allocate py::array (to pass the result of the C++ function to Python)
-//   auto result        = py::array_t<int>(array.size());
-//   auto result_buffer = result.request();
-//   int *result_ptr    = (int *) result_buffer.ptr;
-
-//   // copy std::vector -> py::array
-//   std::memcpy(result_ptr,result_vec.data(),result_vec.size()*sizeof(int));
-
-//   return result;
-// }
-
-// // wrap as Python module
-// PYBIND11_MODULE(example,m)
-// {
-//   m.doc() = "pybind11 example plugin";
-
-//   m.def("multiply", &py_multiply, "Convert all entries of an 1-D NumPy-array to int and multiply by 10");
-// }
-
 namespace py = pybind11;
 
-int add(int i, int j) {
-    return i + j;
-}
-
-int test_stdvec(const int a, const std::vector<double> input, std::vector<double>& output) {
-  for (unsigned int i = 0; i < input.size();++i){    
-    output[i] = input[i]*a;
-  }
-  return a;
-}
-
-// PYBIND11_MAKE_OPAQUE(std::vector<double>);
-
-py::array_t<double, py::array::c_style | py::array::forcecast>
-py_test_stdvec(const int a,
-                   py::array_t<double, py::array::c_style | py::array::forcecast> py_input) {
-  std::vector<double> c_input(py_input.size());
-  std::vector<double> c_output(py_input.size());
-  
-  std::memcpy(c_input.data(), py_input.data(), py_input.size()*sizeof(double));
-
-  int c_a = 0;
-  c_a = test_stdvec(a, c_input, c_output);
-    
-
-  auto result        = py::array_t<double>(c_output.size());
-  auto result_buffer = result.request();
-  double *result_ptr    = (double *) result_buffer.ptr;
 
-  std::memcpy(result_ptr,c_output.data(),c_output.size()*sizeof(double));
 
-  return result;
 
-}
-
-PYBIND11_MODULE(example, m) {
-    m.doc() = "pybind11 example plugin"; // optional module docstring
-
-    m.def("add", &add, "A function which adds two numbers");
-    m.def("test_stdvec", &py_test_stdvec, "Multipy vec by a const");
-}
 
 namespace nmie {
   
@@ -446,3 +358,115 @@ namespace nmie {
     return 0;
   }
 }  // end of namespace nmie
+
+// // -------------
+// // pure C++ code
+// // -------------
+
+// std::vector<double> length(const std::vector<double>& pos)
+// {
+//   size_t N = pos.size() / 2;
+
+//   std::vector<double> output(N*3);
+
+//   for ( size_t i = 0 ; i < N ; ++i ) {
+//     output[i*3+0] = pos[i*2+0];
+//     output[i*3+1] = pos[i*2+1];
+//     output[i*3+2] = std::pow(pos[i*2+0]*pos[i*2+1],.5);
+//   }
+
+//   return output;
+// }
+
+// // ----------------
+// // Python interface
+// // ----------------
+
+// namespace py = pybind11;
+
+// // wrap C++ function with NumPy array IO
+// py::array py_length(py::array_t<double, py::array::c_style | py::array::forcecast> array)
+// {
+//   // check input dimensions
+//   if ( array.ndim()     != 2 )
+//     throw std::runtime_error("Input should be 2-D NumPy array");
+//   if ( array.shape()[1] != 2 )
+//     throw std::runtime_error("Input should have size [N,2]");
+
+//   // allocate std::vector (to pass to the C++ function)
+//   std::vector<double> pos(array.size());
+
+//   // copy py::array -> std::vector
+//   std::memcpy(pos.data(),array.data(),array.size()*sizeof(double));
+
+//   // call pure C++ function
+//   std::vector<double> result = length(pos);
+
+//   ssize_t              ndim    = 2;
+//   std::vector<ssize_t> shape   = { array.shape()[0] , 3 };
+//   std::vector<ssize_t> strides = { sizeof(double)*3 , sizeof(double) };
+
+//   // return 2-D NumPy array
+//   return py::array(py::buffer_info(
+//     result.data(),                           /* data as contiguous array  */
+//     sizeof(double),                          /* size of one scalar        */
+//     py::format_descriptor<double>::format(), /* data type                 */
+//     ndim,                                    /* number of dimensions      */
+//     shape,                                   /* shape of the matrix       */
+//     strides                                  /* strides for each axis     */
+//   ));
+// }
+
+// // wrap as Python module
+// PYBIND11_MODULE(example,m)
+// {
+//   m.doc() = "pybind11 example plugin";
+
+//   m.def("length", &py_length, "Calculate the length of an array of vectors");
+// }
+
+
+
+
+  // int ScattCoeffs(const unsigned int L, const int pl, std::vector<double>& x, std::vector<std::complex<double> >& m,
+  //                 const int nmax, std::vector<std::complex<double> >& an, std::vector<std::complex<double> >& bn) {
+
+    
+std::complex<double>
+test_stdvec(const  std::complex<double> a, const std::vector< std::complex<double> > input, std::vector< std::complex<double> >& output) {
+  for (unsigned int i = 0; i < input.size();++i){    
+    output[i] = input[i]*a;
+  }
+  return a;
+}
+
+std::tuple<
+  py::array_t< std::complex<double>, py::array::c_style | py::array::forcecast>,
+ std::complex<double>
+  >
+py_test_stdvec(const  std::complex<double> a,
+                   py::array_t< std::complex<double>, py::array::c_style | py::array::forcecast> py_input) {
+  std::vector< std::complex<double> > c_input(py_input.size());
+  std::vector< std::complex<double> > c_output(py_input.size());
+  
+  std::memcpy(c_input.data(), py_input.data(), py_input.size()*sizeof( std::complex<double>));
+
+   std::complex<double> c_a = 0;
+  c_a = test_stdvec(a, c_input, c_output);
+    
+
+  auto result        = py::array_t< std::complex<double>>(c_output.size());
+  auto result_buffer = result.request();
+   std::complex<double> *result_ptr    = ( std::complex<double> *) result_buffer.ptr;
+
+  std::memcpy(result_ptr,c_output.data(),c_output.size()*sizeof( std::complex<double>));
+
+  return std::make_tuple(result, c_a);
+
+}
+
+PYBIND11_MODULE(example, m) {
+    m.doc() = "pybind11 example plugin"; // optional module docstring
+
+    m.def("test_stdvec", &py_test_stdvec, "Multipy vec by a const");
+}