我正在通过很多参数描述力场中某些粒子的动力学模拟。
如果我在C或Fortran中这样做,我会将这些参数定义为全局变量(最方便)。在这里,当我使用scipy编织时,我必须将它们作为函数的参数传递。我不喜欢,因为我每次添加或删除参数时都必须编辑许多函数的标题。此外,由于传递了许多参数(这是性能关键的紧密循环),函数的调用可能会变慢。
例如,在以下代码中,参数k, x_surf, C6, C12, CQ, zeta, e0
和T1, beta
一次又一次地在多个相关函数的标头中传递。
inline double getForce(
double x, double Q,
double k, double x_surf, double C6, double C12, double CQ, double zeta, double e0
){ ... }
inline void move(
double dt, double imass, double T1, double beta,
double k, double x_surf, double C6, double C12, double CQ, double zeta, double e0,
double &x, double &v, double &Q
){
...
double f = getForce( x, Q, k, x_surf, C6, C12, CQ, zeta, e0 );
...
}
void trj2buff(
double dt, int nsteps, double mass, double T1, double beta,
double k, double x_surf, double C6, double C12, double CQ, double zeta, double e0,
double x_start, double v_start, double Q_start,
double* x_buff, double* v_buff, double* Q_buff
){
...
move( dt, imass, T1, beta, k, Q, x_surf, C6, C12, CQ, zeta, e0, x, v, Q );
...
}
一种解决方案可能是将所有参数作为单个double*
缓冲区传递(但它会降低代码的可读性,因为它会点头命名)。或者更好地作为用户定义struct{}
。但是我不清楚如何在这种情况下使用struct{}
进行scipy编织。