79 lines
3.1 KiB
Python
79 lines
3.1 KiB
Python
from __future__ import print_function
|
|
|
|
from chempy import bmin,feedback
|
|
from chempy import io
|
|
|
|
import os
|
|
import re
|
|
import getpass # for getuser()
|
|
|
|
class State:
|
|
|
|
def __init__(self):
|
|
if feedback['verbose']:
|
|
print(' '+str(self.__class__)+': created.')
|
|
self.default = {}
|
|
self.echo = 0
|
|
self.model = None
|
|
self.counter = 0
|
|
self.prefix = "bmintmp"
|
|
|
|
def minimize(self,max_iter=100,fix_flag=None,rest_flag=None,
|
|
rest_coeff = 100.0,solvation=None):
|
|
if feedback['actions']:
|
|
print(' '+str(self.__class__)+': starting minimization run...')
|
|
io.mmd.toFile(self.model,self.prefix+".dat")
|
|
|
|
f = open(self.prefix+".com",'w')
|
|
# get home-relative path
|
|
# pth = os.getcwd()
|
|
# pth = re.sub(r".*\/"+getpass.getuser()+"\/",'',pth)
|
|
# provide io filenames
|
|
# f.write("%s\n%s\n"%(pth+"/"+self.prefix+".dat",
|
|
# pth+"/"+self.prefix+".out"))
|
|
f.write("%s\n%s\n"%(self.prefix+".dat",
|
|
self.prefix+".out"))
|
|
f.write(" MMOD 0 1 0 0 0.0000 0.0000 0.0000 0.0000\n")
|
|
# select forcefield treatments
|
|
if not solvation: # no solvent, constant dielectric
|
|
f.write(" FFLD 10 1 0 1 1.0000 0.0000 0.0000 0.0000\n")
|
|
else:
|
|
f.write(''' FFLD 10 1 0 1 1.0000 0.0000 0.0000 0.0000
|
|
SOLV 3 1 0 0 0.0000 0.0000 0.0000 0.0000
|
|
EXNB 0 0 0 0 0.0000 0.0000 0.0000 0.0000
|
|
''')
|
|
# read files
|
|
f.write(" READ 0 0 0 0 0.0000 0.0000 0.0000 0.0000\n")
|
|
# fix/restrain atoms according to flags provided
|
|
if fix_flag is not None: # are we fixing any atoms?
|
|
c = 0
|
|
mask= 2 ** fix_flag
|
|
for a in self.model.atom:
|
|
c = c + 1
|
|
if mask&a.flags:
|
|
f.write(" FXAT %6d 0 0 0 -1.0000 0.0000 0.0000 0.0000\n"%
|
|
c)
|
|
if rest_flag is not None: # are we restraining any atoms?
|
|
c = 0
|
|
mask= 2 ** rest_flag
|
|
for a in self.model.atom:
|
|
c = c + 1
|
|
if mask&a.flags:
|
|
f.write(" FXAT %6d 0 0 0 %10.4f 0.0000 0.0000 0.0000\n"%
|
|
(c,rest_coeff))
|
|
f.write(
|
|
''' CONV 2 0 0 0 0.0500 0.0000 0.0000 0.0000
|
|
MINI 1 0 %6d 0 0.0000 0.0000 0.0000 0.0000
|
|
DEBG 6
|
|
'''%(max_iter))
|
|
f.close()
|
|
|
|
bmin.do(self.prefix)
|
|
io.mmd.updateFromFile(self.model,self.prefix+".out")
|
|
if hasattr(self.model.molecule,'energy'):
|
|
self.model.molecule.title = "%1.3f"%self.model.molecule.energy
|
|
def load_model(self,a):
|
|
if feedback['verbose']:
|
|
print(' '+str(self.__class__)+': new model loaded.')
|
|
self.model = a
|