diff --git a/BaseGrid.h b/BaseGrid.h index ce171dbecb64bc641bf7c3061d57aa7098ede86f..129b6a212221b5429daa13a8f647d62e2a2080a1 100644 --- a/BaseGrid.h +++ b/BaseGrid.h @@ -617,6 +617,13 @@ public: } // Wrap vector distance, -0.5*l <= x < 0.5*l && ... + /* HOST DEVICE inline Vector3 wrapDiff(Vector3 r) const { */ + /* Vector3 l = basisInv.transform(r); */ + /* l.x = wrapDiff(l.x, nx); */ + /* l.y = wrapDiff(l.y, ny); */ + /* l.z = wrapDiff(l.z, nz); */ + /* return basis.transform(l); */ + /* } */ HOST DEVICE inline Vector3 wrapDiff(Vector3 r) const { Vector3 l = basisInv.transform(r); l.x = wrapDiff(l.x, nx); diff --git a/ComputeForce.cuh b/ComputeForce.cuh index 98b7fa39c232c4042d61acf0ae0991a2f65d0177..bda2c5730967707997f8298e324d18de6d167077 100644 --- a/ComputeForce.cuh +++ b/ComputeForce.cuh @@ -416,7 +416,6 @@ __global__ void computeTabulatedKernel(Vector3* force, Vector3* pos, int* type, if (get_energy && aj > ai) atomicAdd( &(g_energies[ai]), fe[tid].e ); } - } diff --git a/TabulatedPotential.h b/TabulatedPotential.h index 4fb3b592bde5c28267bb0fbe74e228fc32e52958..d3f6f5f710a8ae39065ccd9956335ca1e5bf1263 100644 --- a/TabulatedPotential.h +++ b/TabulatedPotential.h @@ -46,7 +46,7 @@ public: Vector3 computeForce(Vector3 r); - HOST DEVICE inline EnergyForce compute(Vector3 r) { + HOST DEVICE inline EnergyForce computeOLD(Vector3 r) { float d = r.length(); Vector3 rUnit = -r/d; int home = int(floorf((d - r0)/dr)); @@ -54,7 +54,7 @@ public: if (home >= n) return EnergyForce(e0, Vector3(0.0f)); float homeR = home*dr + r0; float w = (d - homeR)/dr; - + // Interpolate. float energy = v3[home]*w*w*w + v2[home]*w*w + v1[home]*w + v0[home]; Vector3 force = -(3.0f*v3[home] * w * w @@ -63,6 +63,22 @@ public: return EnergyForce(energy,force); } + HOST DEVICE inline EnergyForce compute(Vector3 r) { + float d = r.length(); + float w = (d - r0)/dr; + int home = int( floorf(w) ); + w = w - home; + if (home < 0) return EnergyForce(v0[0], Vector3(0.0f)); + if (home >= n) return EnergyForce(e0, Vector3(0.0f)); + + // Interpolate. + float energy = v3[home]*w*w*w + v2[home]*w*w + v1[home]*w + v0[home]; + Vector3 force = (-(3.0f*v3[home] *w*w + + 2.0f*v2[home] *w + + + v1[home])/(d*dr)) * r; + return EnergyForce(energy,force); + } + // private: public: float* pot; diff --git a/useful.cu b/useful.cu index 090665f5ca4f0fab28f0a92e6c8f15762081e16a..9e1a1186ea45f699aa955c5343e6850d8a1fd9aa 100644 --- a/useful.cu +++ b/useful.cu @@ -355,6 +355,7 @@ Matrix3::Matrix3(float s) { ezx = 0.0f; ezy = 0.0f; ezz = s; + isDiag = true; } Matrix3::Matrix3(float xx, float xy, float xz, float yx, float yy, float yz, float zx, float zy, float zz) { @@ -367,6 +368,7 @@ Matrix3::Matrix3(float xx, float xy, float xz, float yx, float yy, float yz, flo ezx = zx; ezy = zy; ezz = zz; + setIsDiag(); } Matrix3::Matrix3(float x, float y, float z) { @@ -379,6 +381,7 @@ Matrix3::Matrix3(float x, float y, float z) { ezx = 0.0f; ezy = 0.0f; ezz = z; + isDiag = true; } Matrix3::Matrix3(const Vector3& ex, const Vector3& ey, const Vector3& ez) { @@ -391,7 +394,7 @@ Matrix3::Matrix3(const Vector3& ex, const Vector3& ey, const Vector3& ez) { exz = ez.x; eyz = ez.y; ezz = ez.z; - + setIsDiag(); } Matrix3::Matrix3(const float* d) { @@ -403,8 +406,9 @@ Matrix3::Matrix3(const float* d) { eyz = d[5]; ezx = d[6]; ezy = d[7]; - ezz = d[8]; -} + ezz = d[8]; + setIsDiag(); +} const Matrix3 Matrix3::operator*(float s) const { Matrix3 m; @@ -417,7 +421,7 @@ const Matrix3 Matrix3::operator*(float s) const { m.ezx = s*ezx; m.ezy = s*ezy; m.ezz = s*ezz; - + m.isDiag = isDiag; return m; } @@ -435,6 +439,7 @@ const Matrix3 Matrix3::operator*(const Matrix3& m) const { ret.exz = exx*m.exz + exy*m.eyz + exz*m.ezz; ret.eyz = eyx*m.exz + eyy*m.eyz + eyz*m.ezz; ret.ezz = ezx*m.exz + ezy*m.eyz + ezz*m.ezz; + ret.setIsDiag(); return ret; } @@ -449,29 +454,33 @@ const Matrix3 Matrix3::operator-() const { m.ezx = -ezx; m.ezy = -ezy; m.ezz = -ezz; - + m.isDiag = isDiag; return m; } Matrix3 Matrix3::inverse() const { Matrix3 m; - float det = exx*(eyy*ezz-eyz*ezy) - exy*(eyx*ezz-eyz*ezx) + exz*(eyx*ezy-eyy*ezx); - - m.exx = (eyy*ezz - eyz*ezy)/det; - m.exy = -(exy*ezz - exz*ezy)/det; - m.exz = (exy*eyz - exz*eyy)/det; - m.eyx = -(eyx*ezz - eyz*ezx)/det; - m.eyy = (exx*ezz - exz*ezx)/det; - m.eyz = -(exx*eyz - exz*eyx)/det; - m.ezx = (eyx*ezy - eyy*ezx)/det; - m.ezy = -(exx*ezy - exy*ezx)/det; - m.ezz = (exx*eyy - exy*eyx)/det; - + if (isDiag) { + m = Matrix3(1.0f/exx,1.0f/eyy,1.0f/ezz); + } else { + float det = exx*(eyy*ezz-eyz*ezy) - exy*(eyx*ezz-eyz*ezx) + exz*(eyx*ezy-eyy*ezx); + m.exx = (eyy*ezz - eyz*ezy)/det; + m.exy = -(exy*ezz - exz*ezy)/det; + m.exz = (exy*eyz - exz*eyy)/det; + m.eyx = -(eyx*ezz - eyz*ezx)/det; + m.eyy = (exx*ezz - exz*ezx)/det; + m.eyz = -(exx*eyz - exz*eyx)/det; + m.ezx = (eyx*ezy - eyy*ezx)/det; + m.ezy = -(exx*ezy - exy*ezx)/det; + m.ezz = (exx*eyy - exy*eyx)/det; + m.isDiag = isDiag; + } return m; } float Matrix3::det() const { - return exx*(eyy*ezz-eyz*ezy) - exy*(eyx*ezz-eyz*ezx) + exz*(eyx*ezy-eyy*ezx); + return isDiag ? exx*eyy*ezz : + exx*(eyy*ezz-eyz*ezy) - exy*(eyx*ezz-eyz*ezx) + exz*(eyx*ezy-eyy*ezx); } diff --git a/useful.h b/useful.h index 1e52796aeb3c05b51f46dc450f48ccf420aef645..75a5d785533d46b189f57979bdea7a2ebda2b1e8 100644 --- a/useful.h +++ b/useful.h @@ -284,6 +284,7 @@ public: m.ezx = exz; m.ezy = eyz; m.ezz = ezz; + m.isDiag = isDiag; return m; } @@ -294,9 +295,15 @@ public: HOST DEVICE inline Vector3 transform(const Vector3& v) const { Vector3 w; - w.x = exx*v.x + exy*v.y + exz*v.z; - w.y = eyx*v.x + eyy*v.y + eyz*v.z; - w.z = ezx*v.x + ezy*v.y + ezz*v.z; + if (isDiag) { + w.x = exx*v.x; + w.y = eyy*v.y; + w.z = ezz*v.z; + } else { + w.x = exx*v.x + exy*v.y + exz*v.z; + w.y = eyx*v.x + eyy*v.y + eyz*v.z; + w.z = ezx*v.x + ezy*v.y + ezz*v.z; + } return w; } @@ -314,9 +321,18 @@ public: ret.exz = exx*m.exz + exy*m.eyz + exz*m.ezz; ret.eyz = eyx*m.exz + eyy*m.eyz + eyz*m.ezz; ret.ezz = ezx*m.exz + ezy*m.eyz + ezz*m.ezz; + ret.setIsDiag(); return ret; } + HOST DEVICE void setIsDiag() { + isDiag = (exy == 0 && exz == 0 && + eyx == 0 && eyz == 0 && + ezx == 0 && ezy == 0) ? true : false; + } + + + Vector3 ex() const; Vector3 ey() const; Vector3 ez() const; @@ -328,11 +344,10 @@ public: float exx, exy, exz; float eyx, eyy, eyz; float ezx, ezy, ezz; + bool isDiag; }; - - Matrix3 operator*(float s, Matrix3 m); Matrix3 operator/(Matrix3 m, float s);