bugs in neb code
Posted: Mon Apr 01, 2019 2:00 pm
I've found two bugs in neb code
1) In tsase/neb/util.py vproj(v1,v2) it has to divide by the square of the modulus of v2 ,
but currently it divides by the modulus of v2. A patch to fix that bug (just changing vmag to vmag2) is:
[code]
diff a/tsase/neb/util.py b/tsase/neb/util.py
--- a/tsase/neb/util.py
+++ b/tsase/neb/util.py
@@ -61,7 +61,7 @@ def vproj(v1, v2):
Parameters:
v1, v2: numpy vectors
"""
- mag2 = vmag(v2)
+ mag2 = vmag2(v2)
if mag2 == 0:
printf("Can't project onto a zero vector", ERR)
return v1
[/code]
2) In both tsase/neb/pssneb.py and tsase/neb/ssneb.py forces calculation, when using dneb modification,
it has to multiply fsdneb by 2/pi * atan( |Fperp|²/|Fsperp|² ) but currently it multiplies by
2/pi * atan( |Fperp|/|Fsperp| ) (no squares). A patch to fix that bug (just changing vmag to vmag2) is:
[code]
diff a/tsase/neb/pssneb.py b/tsase/neb/pssneb.py
--- a/tsase/neb/pssneb.py
+++ b/tsase/neb/pssneb.py
@@ -334,8 +334,8 @@ class pssneb:
# New dneb where dneb force converges with (What?!)
if not self.dnebOrg:
- FperpSQ = vmag(self.path[i].fPerp)
- FsperpSQ = vmag(self.path[i].fsperp)
+ FperpSQ = vmag2(self.path[i].fPerp)
+ FsperpSQ = vmag2(self.path[i].fsperp)
if FsperpSQ > 0:
self.path[i].fsdneb *= 2.0 / pi * atan(FperpSQ / \
FsperpSQ)
diff a/tsase/neb/ssneb.py b/tsase/neb/ssneb.py
--- a/tsase/neb/ssneb.py
+++ b/tsase/neb/ssneb.py
@@ -409,8 +409,8 @@ class ssneb:
# dneb modification so that it will converge
if not self.dnebOrg:
- FperpSQ = vmag(self.path[i].fPerp)
- FsperpSQ = vmag(self.path[i].fsperp)
+ FperpSQ = vmag2(self.path[i].fPerp)
+ FsperpSQ = vmag2(self.path[i].fsperp)
if FsperpSQ > 0:
self.path[i].fsdneb *= 2.0/pi*atan(FperpSQ/FsperpSQ)
[/code]
1) In tsase/neb/util.py vproj(v1,v2) it has to divide by the square of the modulus of v2 ,
but currently it divides by the modulus of v2. A patch to fix that bug (just changing vmag to vmag2) is:
[code]
diff a/tsase/neb/util.py b/tsase/neb/util.py
--- a/tsase/neb/util.py
+++ b/tsase/neb/util.py
@@ -61,7 +61,7 @@ def vproj(v1, v2):
Parameters:
v1, v2: numpy vectors
"""
- mag2 = vmag(v2)
+ mag2 = vmag2(v2)
if mag2 == 0:
printf("Can't project onto a zero vector", ERR)
return v1
[/code]
2) In both tsase/neb/pssneb.py and tsase/neb/ssneb.py forces calculation, when using dneb modification,
it has to multiply fsdneb by 2/pi * atan( |Fperp|²/|Fsperp|² ) but currently it multiplies by
2/pi * atan( |Fperp|/|Fsperp| ) (no squares). A patch to fix that bug (just changing vmag to vmag2) is:
[code]
diff a/tsase/neb/pssneb.py b/tsase/neb/pssneb.py
--- a/tsase/neb/pssneb.py
+++ b/tsase/neb/pssneb.py
@@ -334,8 +334,8 @@ class pssneb:
# New dneb where dneb force converges with (What?!)
if not self.dnebOrg:
- FperpSQ = vmag(self.path[i].fPerp)
- FsperpSQ = vmag(self.path[i].fsperp)
+ FperpSQ = vmag2(self.path[i].fPerp)
+ FsperpSQ = vmag2(self.path[i].fsperp)
if FsperpSQ > 0:
self.path[i].fsdneb *= 2.0 / pi * atan(FperpSQ / \
FsperpSQ)
diff a/tsase/neb/ssneb.py b/tsase/neb/ssneb.py
--- a/tsase/neb/ssneb.py
+++ b/tsase/neb/ssneb.py
@@ -409,8 +409,8 @@ class ssneb:
# dneb modification so that it will converge
if not self.dnebOrg:
- FperpSQ = vmag(self.path[i].fPerp)
- FsperpSQ = vmag(self.path[i].fsperp)
+ FperpSQ = vmag2(self.path[i].fPerp)
+ FsperpSQ = vmag2(self.path[i].fsperp)
if FsperpSQ > 0:
self.path[i].fsdneb *= 2.0/pi*atan(FperpSQ/FsperpSQ)
[/code]