nexus: fix LiH example

This commit is contained in:
Jaron Krogel 2018-05-11 10:04:13 -04:00
parent 2f59c3fd35
commit 273245c8f4
2 changed files with 81 additions and 45 deletions

View File

@ -49,8 +49,8 @@ rocksalt_LiH = generate_physical_system(
basis_vectors = 'conventional',
constants = 7.1,
units = 'B',
kgrid = (7,7,7),
kshift = (1,1,1),
kgrid = (1,1,1),
kshift = (0,0,0),
net_charge = 0,
net_spin = 0,
Li = 1,
@ -71,6 +71,8 @@ scf = generate_pwscf(
ecutrho = 1800,
conv_thr = 1.0e-10,
mixing_beta = 0.7,
kgrid = (7,7,7),
kshift = (1,1,1),
)
sims.append(scf)
@ -86,8 +88,6 @@ nscf = generate_pwscf(
ecutrho = 1800,
conv_thr = 1.0e-10,
mixing_beta = 0.7,
kgrid = (1,1,1),
kshift = (0,0,0),
dependencies = (scf,'charge-density')
)
sims.append(nscf)

View File

@ -285,42 +285,58 @@ class collection(hidden):
#end def __init__
def __setitem__(self,name,value):
self.error('elements can only be set via the add function')
#self.add(value)
#self.error('elements can only be set via the add function')
self.add(value,key=name)
#end def __setitem__
def __delitem__(self,name):
#self.error('elements can only be deleted via the remove function')
self.remove(name)
#end def __delitem__
def __setattr__(self,name,value):
#self.error('elements can only be set via the add function')
self.add(value,key=name)
#end def __setattr__
def __delattr__(self,name):
#self.error('elements can only be deleted via the remove function')
self.remove(name)
#end def __delattr__
def add(self,element,strict=True,key=None):
if key is None:
identifier = element.identifier
public = self.public()
missing_identifier = False
if not element.tag in plurals_inv and element.collection_id is None:
self.error('collection cannot be formed\n encountered non-plural element\n element class: {0}\n element tag: {1}\n tags allowed in a collection: {2}'.format(element.__class__.__name__,element.tag,sorted(plurals_inv.keys())))
elif identifier is None:
key = len(public)
elif isinstance(identifier,str):
if identifier in element:
key = element[identifier]
else:
missing_identifier = True
#end if
if not isinstance(element,QIxml):
self.error('collection cannot be formed\nadd attempted for non QIxml element\ntype received: {0}'.format(element.__class__.__name__))
#end if
keyin = key
key = None
public = self.public()
identifier = element.identifier
missing_identifier = False
if not element.tag in plurals_inv and element.collection_id is None:
self.error('collection cannot be formed\n encountered non-plural element\n element class: {0}\n element tag: {1}\n tags allowed in a collection: {2}'.format(element.__class__.__name__,element.tag,sorted(plurals_inv.keys())))
elif identifier is None:
key = len(public)
elif isinstance(identifier,str):
if identifier in element:
key = element[identifier]
else:
key = ''
for ident in identifier:
if ident in element:
key+=element[ident]
#end if
#end for
missing_identifier = key==''
#end if
if missing_identifier:
key = len(public)
#if strict:
# self.error('collection cannot be formed\n element is missing an identifier\n element class: {0}\n element tag: {1}\n identifier looked for: {2}\n element contents:\n{3}'.format(element.__class__.__name__,element.tag,identifier,str(element)))
#else:
# return False
##end if
missing_identifier = True
#end if
else:
key = ''
for ident in identifier:
if ident in element:
key+=element[ident]
#end if
#end for
missing_identifier = key==''
#end if
if missing_identifier:
key = len(public)
#end if
if keyin is not None and not isinstance(key,int) and keyin.lower()!=key.lower():
self.error('attempted to add key with incorrect name\nrequested key: {0}\ncorrect key: {1}'.format(keyin,key))
#end if
#if key in public:
# self.error('attempted to add duplicate key to collection: {0}\n keys present: {1}'.format(key,sorted(public.keys())))
@ -330,6 +346,16 @@ class collection(hidden):
return True
#end def add
def remove(self,key):
public = self.public()
if key in public:
del public[key]
self.hidden().order.remove(key)
else:
raise KeyError
#end if
#end def remove
def get_single(self,preference=None):
if len(self)>0:
if preference!=None and preference in self:
@ -4706,20 +4732,15 @@ def generate_jastrows(jastrows,system=None,return_list=False,check_ions=False):
if isinstance(jastrows,str):
jorders = set(jastrows.replace('generate',''))
if '1' in jorders and have_ions:
jin.append(
generate_jastrow('J1','bspline',8,system=system)
)
jterm = generate_jastrow('J1','bspline',8,system=system)
#end if
if '2' in jorders:
jin.append(
generate_jastrow('J2','bspline',8,system=system)
)
jterm = generate_jastrow('J2','bspline',8,system=system)
#end if
if '3' in jorders and have_ions:
jin.append(
generate_jastrow('J3','polynomial',3,3,4.0,system=system)
)
jterm = generate_jastrow('J3','polynomial',3,3,4.0,system=system)
#end if
jin.append(jterm)
if len(jin)==0:
QmcpackInput.class_error('jastrow generation requested but no orders specified (1,2,and/or 3)')
#end if
@ -4744,7 +4765,10 @@ def generate_jastrows(jastrows,system=None,return_list=False,check_ions=False):
else:
jsys = system
#end if
jin.append(generate_jastrow(jtype,system=jsys,**jdict))
jterm = generate_jastrow(jtype,system=jsys,**jdict)
if jterm is not None:
jin.append(jterm)
#end if
del jtype
del jsys
elif jastrow[0] in jset:
@ -5036,6 +5060,18 @@ def generate_jastrow2(function='bspline',*args,**kwargs):
else:
QmcpackInput.class_error('function is invalid\n you provided: {0}\n valid options are: bspline or pade'.format(function),'generate_jastrow2')
#end if
if 'system' in kwargs and kwargs['system'] is not None:
nup,ndn = kwargs['system'].particles.electron_counts()
if nup<2:
del j2.correlations.uu
#end if
if nup<1 or ndn<1:
del j2.correlations.ud
#end if
if len(j2.correlations)==0:
j2=None
#end if
#end if
return j2
#end def generate_jastrow2