@@ -84,6 +84,18 @@ namespace BasisClasses
8484 // ! Subspace index
8585 virtual const std::string harmonic () = 0;
8686
87+ // @{
88+ // ! Compute acceleration helper
89+ virtual void computeAccel (double x, double y, double z,
90+ std::vector<double >& vstore) = 0;
91+
92+ // ! C++ local storage for getAccel
93+ std::vector<double > vstore {0.0 , 0.0 , 0.0 };
94+
95+ // ! C++ local storage for getAccelArray
96+ std::vector<std::vector<double >> vstore_array;
97+ // @}
98+
8799 public:
88100
89101 // ! Constructor from YAML node
@@ -172,9 +184,46 @@ namespace BasisClasses
172184
173185 // ! Evaluate acceleration in Cartesian coordinates in centered
174186 // ! coordinate system
175- virtual std::vector<double > getAccel (double x, double y, double z) = 0;
187+ virtual std::vector<double >& getAccel (double x, double y, double z)
188+ {
189+ computeAccel (x, y, z, vstore);
190+ return vstore;
191+ }
192+
193+ // ! Evaluate acceleration in Cartesian coordinates in centered
194+ // ! coordinate system for a collections of points
195+ virtual RowMatrixXd getAccelArray (Eigen::VectorXd& x,
196+ Eigen::VectorXd& y,
197+ Eigen::VectorXd& z)
198+ {
199+ // Sanity check
200+ if (x.size () != y.size () || x.size () != z.size ())
201+ throw std::runtime_error (" BiorthBasis::getAccelArray: "
202+ " x, y, z vectors must be of the same size" );
203+
204+ int max_threads = 1 ;
205+ #if defined(_OPENMP)
206+ max_threads = omp_get_max_threads ();
207+ #endif
208+ vstore_array.resize (max_threads);
209+ for (auto & v : vstore_array) v.resize (3 );
210+
211+ RowMatrixXd ret (x.size (), 3 );
212+ std::vector<double > v (3 );
213+ int tid = 0 ; // Default thread ID if no OpenMP
214+ #pragma omp parallel for
215+ for (int i=0 ; i<x.size (); ++i) {
216+ #if defined(_OPENMP)
217+ tid = omp_get_thread_num ();
218+ #endif
219+ computeAccel (x (i), y (i), z (i), vstore_array[tid]);
220+ for (int k=0 ; k<3 ; k++) ret (i, k) = vstore_array[tid][k];
221+ }
222+
223+ return ret;
224+ }
176225 };
177-
226+
178227 /* *
179228 An abstract spherical basis to evaluate expansion coeffients and
180229 provide potential and density basis fields
@@ -263,6 +312,11 @@ namespace BasisClasses
263312
264313 // @}
265314
315+ // ! Evaluate acceleration in Cartesian coordinates in centered
316+ // ! coordinate system
317+ virtual void computeAccel (double x, double y, double z,
318+ std::vector<double >& vstore);
319+
266320 public:
267321
268322 // ! Constructor from YAML node
@@ -317,9 +371,6 @@ namespace BasisClasses
317371 return ret;
318372 }
319373
320- // ! Evaluate acceleration in Cartesian coordinates in centered
321- // ! coordinate system
322- virtual std::vector<double > getAccel (double x, double y, double z);
323374 };
324375
325376 /* *
@@ -504,6 +555,11 @@ namespace BasisClasses
504555 // ! Subspace index
505556 virtual const std::string harmonic () { return " m" ;}
506557
558+ // ! Evaluate acceleration in Cartesian coordinates in centered
559+ // ! coordinate system
560+ void computeAccel (double x, double y, double z,
561+ std::vector<double >& vstore);
562+
507563 public:
508564
509565 // ! Constructor from YAML node
@@ -555,10 +611,6 @@ namespace BasisClasses
555611 return ret;
556612 }
557613
558- // ! Evaluate acceleration in Cartesian coordinates in centered
559- // ! coordinate system
560- std::vector<double > getAccel (double x, double y, double z);
561-
562614 };
563615
564616 /* *
@@ -659,6 +711,11 @@ namespace BasisClasses
659711 // ! Subspace index
660712 virtual const std::string harmonic () { return " m" ;}
661713
714+ // ! Evaluate acceleration in Cartesian coordinates in centered
715+ // ! coordinate system
716+ void computeAccel (double x, double y, double z,
717+ std::vector<double >& vstore);
718+
662719 public:
663720
664721 // ! Constructor from YAML node
@@ -710,10 +767,6 @@ namespace BasisClasses
710767 return ret;
711768 }
712769
713- // ! Evaluate acceleration in Cartesian coordinates in centered
714- // ! coordinate system
715- std::vector<double > getAccel (double x, double y, double z);
716-
717770 };
718771
719772 /* *
@@ -809,6 +862,11 @@ namespace BasisClasses
809862 // ! Subspace index
810863 virtual const std::string harmonic () { return " m" ;}
811864
865+ // ! Evaluate acceleration in Cartesian coordinates in centered
866+ // ! coordinate system
867+ void computeAccel (double x, double y, double z,
868+ std::vector<double >& vstore);
869+
812870 public:
813871
814872 // ! Constructor from YAML node
@@ -870,10 +928,6 @@ namespace BasisClasses
870928 return ret;
871929 }
872930
873- // ! Evaluate acceleration in Cartesian coordinates in centered
874- // ! coordinate system
875- std::vector<double > getAccel (double x, double y, double z);
876-
877931 };
878932
879933 /* *
@@ -967,6 +1021,11 @@ namespace BasisClasses
9671021 std::tuple<double , double , double , double , double >
9681022 eval (double x, double y, double z);
9691023
1024+ // ! Evaluate acceleration in Cartesian coordinates in centered
1025+ // ! coordinate system
1026+ void computeAccel (double x, double y, double z,
1027+ std::vector<double >& vstore);
1028+
9701029 public:
9711030
9721031 // ! Constructor from YAML node
@@ -1020,10 +1079,6 @@ namespace BasisClasses
10201079 return true ;
10211080 }
10221081
1023- // ! Evaluate acceleration in Cartesian coordinates in centered
1024- // ! coordinate system
1025- std::vector<double > getAccel (double x, double y, double z);
1026-
10271082 };
10281083
10291084 /* *
@@ -1101,6 +1156,12 @@ namespace BasisClasses
11011156 // ! Readable index name
11021157 virtual const std::string harmonic () { return " n" ;}
11031158
1159+ // ! Evaluate acceleration in Cartesian coordinates in centered
1160+ // ! coordinate system
1161+ void computeAccel (double x, double y, double z,
1162+ std::vector<double >& vstore);
1163+
1164+
11041165 public:
11051166
11061167 // ! Constructor from YAML node
@@ -1146,10 +1207,6 @@ namespace BasisClasses
11461207 return true ;
11471208 }
11481209
1149- // ! Evaluate acceleration in Cartesian coordinates in centered
1150- // ! coordinate system
1151- std::vector<double > getAccel (double x, double y, double z);
1152-
11531210 };
11541211
11551212
0 commit comments