mirror of https://github.com/QMCPACK/qmcpack.git
128 lines
4.3 KiB
Python
128 lines
4.3 KiB
Python
##################################################################
|
|
## (c) Copyright 2018- by Jaron T. Krogel ##
|
|
##################################################################
|
|
|
|
|
|
#====================================================================#
|
|
# pyscf_sim.py #
|
|
# Nexus interface for the PySCF simulation framework. #
|
|
# #
|
|
# Content summary: #
|
|
# Pyscf #
|
|
# Simulation class for PySCF #
|
|
# #
|
|
# generate_pyscf #
|
|
# User-facing function to generate Pyscf simulation objects. #
|
|
#====================================================================#
|
|
|
|
|
|
import os
|
|
from generic import obj
|
|
from execute import execute
|
|
from simulation import Simulation
|
|
from pyscf_input import PyscfInput,generate_pyscf_input
|
|
from pyscf_analyzer import PyscfAnalyzer
|
|
from developer import ci
|
|
|
|
|
|
|
|
class Pyscf(Simulation):
|
|
input_type = PyscfInput
|
|
analyzer_type = PyscfAnalyzer
|
|
generic_identifier = 'pyscf'
|
|
infile_extension = '.py'
|
|
application = 'python3'
|
|
application_properties = set(['serial','mpi'])
|
|
application_results = set(['orbitals','wavefunction'])
|
|
|
|
|
|
def check_result(self,result_name,sim):
|
|
calculating_result = False
|
|
if result_name=='orbitals':
|
|
conv_requested = self.input.save_qmc
|
|
prefix_provided = self.input.prefix is not None
|
|
calculating_result = conv_requested and prefix_provided
|
|
elif result_name=='wavefunction':
|
|
calculating_result = self.input.checkpoint
|
|
#end if
|
|
return calculating_result
|
|
#end def check_result
|
|
|
|
|
|
def get_result(self,result_name,sim):
|
|
result = obj()
|
|
if result_name=='orbitals':
|
|
inp = self.input
|
|
if 'kpoints' not in inp or inp.kpoints is None:
|
|
h5_file = inp.prefix+'.h5'
|
|
else:
|
|
h5_file = inp.prefix+'.twistnum_000.h5'
|
|
if inp.tiled_kpoints is not None:
|
|
kpoints = inp.tiled_kpoints
|
|
else:
|
|
kpoints = inp.kpoints
|
|
#end if
|
|
result.kpoints = kpoints.copy()
|
|
result.orb_files = ['{}.twistnum_{}.h5'.format(inp.prefix,str(n).zfill(3)) for n in range(len(kpoints))]
|
|
#end if
|
|
result.h5_file = os.path.join(self.locdir,h5_file)
|
|
result.location = self.locdir
|
|
elif result_name=='wavefunction':
|
|
result.chkfile = os.path.join(self.locdir,self.input.chkfile)
|
|
else:
|
|
self.error('ability to get result '+result_name+' has not been implemented')
|
|
#end if
|
|
return result
|
|
#end def get_result
|
|
|
|
|
|
def incorporate_result(self,result_name,result,sim):
|
|
not_implemented = False
|
|
if not_implemented:
|
|
self.error('ability to incorporate result '+result_name+' has not been implemented')
|
|
#end if
|
|
#end def incorporate_result
|
|
|
|
|
|
def check_sim_status(self):
|
|
# success of a generic pyscf script is too hard to assess
|
|
# burden of when to initiate dependent simulations left to user
|
|
self.failed = False
|
|
self.finished = self.job.finished
|
|
#end def check_sim_status
|
|
|
|
|
|
def get_output_files(self):
|
|
output_files = []
|
|
return output_files
|
|
#end def get_output_files
|
|
|
|
|
|
def app_command(self):
|
|
app_command = self.app_name+' '+self.infile
|
|
return app_command
|
|
#end def app_command
|
|
|
|
#end class Pyscf
|
|
|
|
|
|
|
|
def generate_pyscf(**kwargs):
|
|
sim_args,inp_args = Pyscf.separate_inputs(kwargs)
|
|
|
|
if not 'input' in sim_args:
|
|
if 'input_type' in inp_args:
|
|
input_type = inp_args.input_type
|
|
del inp_args.input_type
|
|
#end if
|
|
if 'prefix' not in inp_args and 'identifier' in sim_args:
|
|
inp_args['prefix'] = sim_args['identifier']
|
|
#end if
|
|
sim_args.input = generate_pyscf_input(**inp_args)
|
|
#end if
|
|
py = Pyscf(**sim_args)
|
|
|
|
return py
|
|
#end def generate_pyscf
|
|
|