From 23090ab7c46f689ae934b9b0bffb156d5ffc5960 Mon Sep 17 00:00:00 2001 From: acrovato <a.crovato@uliege.be> Date: Thu, 2 May 2024 12:10:46 +0200 Subject: [PATCH] Add interface for sdpmDouble --- sdpm/_src/sdpmw.i | 39 ++++++++++++++++++++++++++++++++------- sdpm/api/om.py | 4 ++-- sdpm/src/sdpm.h | 2 ++ 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/sdpm/_src/sdpmw.i b/sdpm/_src/sdpmw.i index ecfd4a1..2ce749b 100644 --- a/sdpm/_src/sdpmw.i +++ b/sdpm/_src/sdpmw.i @@ -90,6 +90,9 @@ threads="1" // SDPM typemaps %include "sdpm_def.h" // needed to access USE_CODI in SWIG interface +#ifndef USE_CODI +typedef double sdpmDouble; // needed so that SWIG does not convert sdpmDouble to double +#endif %typemap(out) sdpmDouble { #ifndef USE_CODI $result = PyFloat_FromDouble($1); @@ -106,6 +109,14 @@ threads="1" %template(std_vector_Elementp) std::vector<sdpm::Element *>; %template(std_vector_Tagp) std::vector<sdpm::Tag *>; %template(std_map_string_Tagp) std::map<std::string, sdpm::Tag *>; +%template(std_vector_vector3d) std::vector<sdpmVector3d>; +#ifndef USE_CODI +%rename(std_vector_double) std::vector<sdpmDouble>; +%rename(std_vector_vector_double) std::vector<std::vector<sdpmDouble>>; +#else +%template(std_vector_sdpmdouble) std::vector<sdpmDouble>; +%template(std_vector_vector_sdpmdouble) std::vector<std::vector<sdpmDouble>>; +#endif // SDPM %include "sdpm.h" @@ -134,26 +145,40 @@ threads="1" // Interface to SDPM types class sdpmVector3d {}; - %extend sdpmVector3d { - double getitem(int i) + double __getitem__(int i) { + if (i > 2) + throw std::runtime_error("sdpmVector3d: index out of range (size 3)!\n"); #ifndef USE_CODI return (*self)(i); #else return (*self)(i).getValue(); #endif } - std::string __str__() + // use repr instead of str so that iterables also print nicely + std::string __repr__() { - std::ostringstream out; out << *self; return out.str(); + std::ostringstream out; out << *self; + return out.str(); } +} - %pythoncode { -def __getitem__(self, idx): - return self.getitem(idx) +#ifdef USE_CODI +class sdpmDouble {}; +%extend sdpmDouble { + double __float__() + { + return (*self).getValue(); + } + // use repr instead of str so that iterables also print nicely + std::string __repr__() + { + std::ostringstream out; out << *self; + return out.str(); } } +#endif // Interface to SDPM classes namespace sdpm { diff --git a/sdpm/api/om.py b/sdpm/api/om.py index e052755..4e75025 100644 --- a/sdpm/api/om.py +++ b/sdpm/api/om.py @@ -80,8 +80,8 @@ class SdpmSolver(om.ExplicitComponent): self.adj.solve() # Set outputs for i in range(self.nf): - outputs['Q_re'][i, :, :] = np.array(self.sol.getGafMatrixRe(i)) - outputs['Q_im'][i, :, :] = np.array(self.sol.getGafMatrixIm(i)) + outputs['Q_re'][i, :, :] = np.array(self.sol.getGafMatrixRe(i), dtype=float) + outputs['Q_im'][i, :, :] = np.array(self.sol.getGafMatrixIm(i), dtype=float) class SdpmBuilder(Builder): """SDPM builder for OpenMDAO diff --git a/sdpm/src/sdpm.h b/sdpm/src/sdpm.h index eca4d3e..180f34c 100644 --- a/sdpm/src/sdpm.h +++ b/sdpm/src/sdpm.h @@ -35,6 +35,7 @@ #include <Eigen/Dense> #include <complex> +#ifndef SWIG #ifndef USE_CODI using sdpmDouble = double; #else // USE_CODI @@ -51,6 +52,7 @@ using sdpmVector3d = Eigen::Matrix<sdpmDouble, 3, 1>; using sdpmMatrixXcd = Eigen::Matrix<sdpmComplex, Eigen::Dynamic, Eigen::Dynamic>; using sdpmVectorXcd = Eigen::Matrix<sdpmComplex, Eigen::Dynamic, 1>; using sdpmVector3cd = Eigen::Matrix<sdpmComplex, 3, 1>; +#endif // SWIG namespace sdpm { -- GitLab