From 07d321e427c3d5b3b503514b00d64606892d4320 Mon Sep 17 00:00:00 2001 From: tdprice-858 <76229513+tdprice-858@users.noreply.github.com> Date: Thu, 20 Jan 2022 16:57:08 -0800 Subject: [PATCH 01/21] analysis folder --- analysis/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 analysis/README.md diff --git a/analysis/README.md b/analysis/README.md new file mode 100644 index 0000000..54832c2 --- /dev/null +++ b/analysis/README.md @@ -0,0 +1 @@ +Folder for creating analysis module to plot results, etc From 8e5a45f73f08f11374de154bb854f2cd37be14f6 Mon Sep 17 00:00:00 2001 From: tdprice-858 <76229513+tdprice-858@users.noreply.github.com> Date: Thu, 20 Jan 2022 16:58:39 -0800 Subject: [PATCH 02/21] Create README.md --- cluster_and_vasp_environment/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 cluster_and_vasp_environment/README.md diff --git a/cluster_and_vasp_environment/README.md b/cluster_and_vasp_environment/README.md new file mode 100644 index 0000000..6c25975 --- /dev/null +++ b/cluster_and_vasp_environment/README.md @@ -0,0 +1 @@ +Put all the hard coded aspect of kT here. From 96bbbb947d8cd191264a9587d6954c9282335030 Mon Sep 17 00:00:00 2001 From: tdprice-858 <76229513+tdprice-858@users.noreply.github.com> Date: Thu, 20 Jan 2022 16:59:43 -0800 Subject: [PATCH 03/21] Create README.md --- Calculation_Types/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Calculation_Types/README.md diff --git a/Calculation_Types/README.md b/Calculation_Types/README.md new file mode 100644 index 0000000..45b9eb5 --- /dev/null +++ b/Calculation_Types/README.md @@ -0,0 +1 @@ +Put all calculation types specific code here. From 2cea5834ebcb0f56a9977053280148b14126b7fe Mon Sep 17 00:00:00 2001 From: tdprice-858 <76229513+tdprice-858@users.noreply.github.com> Date: Thu, 20 Jan 2022 17:00:52 -0800 Subject: [PATCH 04/21] Create README.md --- structure_types/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 structure_types/README.md diff --git a/structure_types/README.md b/structure_types/README.md new file mode 100644 index 0000000..bc6581d --- /dev/null +++ b/structure_types/README.md @@ -0,0 +1 @@ +Add structure specific info here From cbf6a733f5d497727fa7bb74d8ecbaca30d235f7 Mon Sep 17 00:00:00 2001 From: tdprice-858 <76229513+tdprice-858@users.noreply.github.com> Date: Thu, 20 Jan 2022 17:02:12 -0800 Subject: [PATCH 05/21] Create README.md --- submission/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 submission/README.md diff --git a/submission/README.md b/submission/README.md new file mode 100644 index 0000000..a244cce --- /dev/null +++ b/submission/README.md @@ -0,0 +1,2 @@ +Submission related scripts should go here. +Headers should be appropriate for environment and cluster being used From 270feb83419b4cb9364310858dc812c2b1fabd21 Mon Sep 17 00:00:00 2001 From: tdprice-858 <76229513+tdprice-858@users.noreply.github.com> Date: Thu, 20 Jan 2022 17:03:23 -0800 Subject: [PATCH 06/21] Create README.md --- kT_object/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 kT_object/README.md diff --git a/kT_object/README.md b/kT_object/README.md new file mode 100644 index 0000000..a934118 --- /dev/null +++ b/kT_object/README.md @@ -0,0 +1 @@ +Script related to creating the kT object From fd112e472d30aa03c35d7538ca3eee2d5aea391c Mon Sep 17 00:00:00 2001 From: tdprice-858 <76229513+tdprice-858@users.noreply.github.com> Date: Thu, 20 Jan 2022 17:05:00 -0800 Subject: [PATCH 07/21] Add files via upload --- kt.pptx | Bin 0 -> 42976 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 kt.pptx diff --git a/kt.pptx b/kt.pptx new file mode 100644 index 0000000000000000000000000000000000000000..8455f3b5252626e2939ff06447a5a8e7225ff686 GIT binary patch literal 42976 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 q!(=YP#UQz!Lao(Lj=XhsA7`C Date: Thu, 20 Jan 2022 17:06:33 -0800 Subject: [PATCH 08/21] Add files via upload --- kt.pdf | Bin 0 -> 88314 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 kt.pdf diff --git a/kt.pdf b/kt.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7a24b4fb18522f888251f536a64cddfbee86913c GIT binary patch literal 88314 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≤& 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 V#=kNp2RkQ#4VH{dR9+1B{{sTe^=$wE literal 0 HcmV?d00001 From af3cbdde1bba40d6177a02a5040780fa9b293aaa Mon Sep 17 00:00:00 2001 From: saurabhsivakumar Date: Fri, 4 Feb 2022 11:35:21 -0800 Subject: [PATCH 09/21] Layout added --- kT_object/KT_object.py | 47 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 kT_object/KT_object.py diff --git a/kT_object/KT_object.py b/kT_object/KT_object.py new file mode 100644 index 0000000..e10056b --- /dev/null +++ b/kT_object/KT_object.py @@ -0,0 +1,47 @@ +class structure(custom_params,ase_atoms) + assert param has been Changed + ISMEAR SIGMA etc + structure.get_calc_object (VASP,QE) + structure.set_defaults + +class calculation_type(custom_params): + self.params = {} + self.params["IBRION"] = self.custom + contains default params for each calc + if calculator_name - 'VASP': + kt_params = "" + else assert +assert param has been Changed +IBRION,NSW,EDIFFG,POTIM + + +from kt.calculation_type import calc_params... + +.sh script package -> environments + +class KT_Object: + + def __init__(self,structure,calc_params): + + kt_params = {IBRION,NSW,EDIFF,etc} + self.params = kt_params + self.structure = structure + self.calculation_type = calculation_type + + def load_params(self): + + self.hpc = self.identify_hpc_cluster() + print('KT: HPC= %s' %self.hpc) + self.gamma_only = gamma_only + print('KT: VASP_GAMMA= %s' %self.gamma_only) + + self.structure_type = structure_type + self.calculation_type = calculation_type + self.main_dir = os.getcwd() + self.structure = structure + + self.identify_vasp_eviron() + print('KT: VASP_PP_PATH= %s' %self.vasp_pp_path) + print('KT: VASP_COMMAND= %s' %self.vasp_command) + + self.assign_default_calculator() \ No newline at end of file From 49104c18b4aa710b363e163150ef33f89c1c4c4c Mon Sep 17 00:00:00 2001 From: saurabhsivakumar Date: Tue, 15 Feb 2022 13:11:55 -0800 Subject: [PATCH 10/21] Refactor main kt file --- kul_tools.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/kul_tools.py b/kul_tools.py index b45db1a..1c40208 100644 --- a/kul_tools.py +++ b/kul_tools.py @@ -1,4 +1,4 @@ -# Kulkarn group @ UC Davis +# Kulkarni group @ UC Davis """Definition of the Zeotype class. This module defines the central object in analyzing Zeotypes @@ -362,14 +362,3 @@ def run_specific_calcualtion_type(): return atoms - - - - - - - - - - - From 462ee9ca6c441634b20546917f77058259667f38 Mon Sep 17 00:00:00 2001 From: saurabhsivakumar Date: Tue, 15 Feb 2022 13:14:20 -0800 Subject: [PATCH 11/21] Refactor main kt file --- .vs/ProjectSettings.json | 3 + .vs/VSWorkspaceState.json | 7 ++ .vs/kultools/v17/.suo | Bin 0 -> 15872 bytes .vs/slnx.sqlite | Bin 0 -> 90112 bytes kT_object/.vs/ProjectSettings.json | 3 + kT_object/.vs/VSWorkspaceState.json | 7 ++ kT_object/.vs/kT_object/project-colors.json | 11 +++ kT_object/.vs/kT_object/v17/.suo | Bin 0 -> 38912 bytes kT_object/.vs/slnx.sqlite | Bin 0 -> 90112 bytes kT_object/KT_object.py | 99 +++++++++++++++----- kT_object/__init__.py | 0 kT_object/calc_object.py | 40 ++++++++ kT_object/kt_structure.py | 44 +++++++++ kT_object/load_environ.py | 66 +++++++++++++ kT_object/run_Kultools.py | 35 +++++++ 15 files changed, 294 insertions(+), 21 deletions(-) create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/kultools/v17/.suo create mode 100644 .vs/slnx.sqlite create mode 100644 kT_object/.vs/ProjectSettings.json create mode 100644 kT_object/.vs/VSWorkspaceState.json create mode 100644 kT_object/.vs/kT_object/project-colors.json create mode 100644 kT_object/.vs/kT_object/v17/.suo create mode 100644 kT_object/.vs/slnx.sqlite create mode 100644 kT_object/__init__.py create mode 100644 kT_object/calc_object.py create mode 100644 kT_object/kt_structure.py create mode 100644 kT_object/load_environ.py create mode 100644 kT_object/run_Kultools.py diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000..f8b4888 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..99339e0 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,7 @@ +{ + "ExpandedNodes": [ + "" + ], + "SelectedNode": "\\W:\\Github Repos\\kultools", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/kultools/v17/.suo b/.vs/kultools/v17/.suo new file mode 100644 index 0000000000000000000000000000000000000000..f13fe91338468e88b310b7c9297915086c4962c2 GIT binary patch literal 15872 zcmeHONpl-T6mBJKVGn^2OaK#15+E{`EIW2Wg5xC%U=rfQrV3xIEmka9su{^7NB#kS zAywQdE*wG?MNu3m4kSm8@I#3CzV2zMHPT3}vB4RmcD+$=)34v_ep~nW{=NNw-uZ6e zFX2mP#a{7XbDwz3sE-+W@w^a^qRhGno12?#VjkIkiVz2`iZcGHVo=P9b^JQwHkZ;m z9mFosu)B{?MA4mBqLrz~r z{#ma~`S;7b9*6IDlmF+8arJxs-<{zA*DDBU8`#G6=3byJ;JR}ka1Ch-sQ;ld71(tQa5VF>bI!_Rs5rU>PAa&ZWc|{lS~U3xhOfU za40(Sz<2|-j*Nj+i|X%xo&f*p*K6Ov-`=h~gG%adrpqFY=x-j_oE9E0N)4|11wD@d zKW&qaNrL*B_0uSD&oIq^dhS41EQ017xE{39s=xn<{a0Um?g4*$yK?jT=fHs)=)VE% zj#!c$&p-;e2fL@i5ctnxSlVi)zWo2c<$qpW71!a3`Srk{p$XMaY5zPLV*h=Fq3BC) zSJJxIR{pjNuO27L_)U8=58Xp6s5H?qG+_-os0s^F5*MJG$|zUFr|3azrL@yo=wF`k z(C4@1Km7&0{fA{w94z4^(w}h3W5I;-lNTAngzY4{o&|2 zjK2mhm%$JEJe};&aqypfXB=qD|1;=21z_^yr$3g#3@UP^>2r0$&RDT`{(k_xn*Z(a zD=&{bAuIjEPV*TD{X8q-S*I=ir#s-M|G5sl)W`I{h`Un){V~SmjKyv7(^pS>0_fNK zVf;T1)%X9%{pk6B3sTy-&sO1uGv27eBVf#9M`2Q47cKEQtbIjFChrI7i#bgb!2Yk}wxyqUg_Hp^4NQyLvD4FEnRPb#wQ4+F zD-^Twjby0zDTnIp24}t@@E3m=`{J&1_uH`Zx1n)2_p#gm!5pCfM}4+~{$J1c@4L+Z zlXo&<{XhTuhtU6$|2zY<)jxgx-`D?IqxAK^=ETnY_Wl20|J&04@7e!)nEe0kIR7O* zlw(`{-#`D|URl?%hb{k2>|8gV$A(Q?eV=~IR`4_K=lhK@DpM$0r>)N48c{&U#=HYM zSXAq~Otb4&>dbL$^IXU80WU>2JR>&12U75JL@6j?7jP|{NUwv7y~w>69T}hma_6}C z%|wd#{+Zvx_kO8JQ@}5;N|J(KA|l29HON5!Qm3jtCB#n=rK13AF@gO=N&YpWG^qb2 zS;LC(4pnKTsMt5XgS1xSIe0PBtFZy8pmaE(qk#Jq?yTP;y0b`&BfT$vg~7WxQWF)O z#sB6iV%B+3(Xe~E9CbPrb6 zv6A^0ua`RK%y*dow-fK3<~`mPWaLP1it%Hm{sp%XXYk+5Jf-57H_eIPLGuh@Xe=?3 zSxF?a@pL9R5>F-5>G;I>_+&hl%1kCENAmg1=!)bl`PWFF-{Y6Z;nPsd7r3rqJWSpt R5V!K#DK*cgQ_uEo{{Y6jAeR6D literal 0 HcmV?d00001 diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..d6234989e7ade3b053e1d8b2a116d56a76017112 GIT binary patch literal 90112 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 literal 0 HcmV?d00001 diff --git a/kT_object/KT_object.py b/kT_object/KT_object.py index e10056b..7e675bb 100644 --- a/kT_object/KT_object.py +++ b/kT_object/KT_object.py @@ -1,4 +1,4 @@ -class structure(custom_params,ase_atoms) +'''class structure(custom_params,ase_atoms) assert param has been Changed ISMEAR SIGMA etc structure.get_calc_object (VASP,QE) @@ -17,31 +17,88 @@ class calculation_type(custom_params): from kt.calculation_type import calc_params... -.sh script package -> environments +.sh script package -> environments''' -class KT_Object: +from kt_structure import KT_structure +from ase.calculators.vasp import Vasp +from load_environ import identify_hpc_cluster, identify_vasp_eviron - def __init__(self,structure,calc_params): +class KT_Object(KT_structure): + + def __init__(self,gamma_only,structure,structure_type,calculator_name,calculation_type,calc_params={}): - kt_params = {IBRION,NSW,EDIFF,etc} - self.params = kt_params - self.structure = structure - self.calculation_type = calculation_type + super().__init__(structure,structure_type,calculator_name,calculation_type) - def load_params(self): + self.gamma = gamma_only + self.user_params = calc_params + self.kt_params = {} + + if self.calc_name.lower() == 'vasp': + self.load_structure_type_params_vasp() + self.load_calc_type_params_vasp() + + self.load_update_kt_params() + + self.init_ase_calc() + + self.hpc = identify_hpc_cluster() + identify_vasp_eviron(self.hpc,self.gamma) - self.hpc = self.identify_hpc_cluster() - print('KT: HPC= %s' %self.hpc) - self.gamma_only = gamma_only - print('KT: VASP_GAMMA= %s' %self.gamma_only) - self.structure_type = structure_type - self.calculation_type = calculation_type - self.main_dir = os.getcwd() - self.structure = structure + + def load_structure_type_params_vasp(self): + + if self.structure_type.lower() == 'metal': + self.default_calc_params.update({'sigma' : 0.2, 'ismear' : 1}) + + elif self.structure_type.lower() == 'gas-phase': + self.default_calc_params.update({'lreal' : False}) + + else: + pass + + def load_calc_type_params_vasp(self): + + if self.calculation_type.lower() == 'spe': + self.default_calc_params.update({'nsw' : 0}) + + elif self.calculation_type.lower() == 'opt_fine': + self.default_calc_params.update({'ibrion' : 1, 'potim' : 0.05, 'nsw' : 50, 'ediffg' : -0.03}) + + elif self.calculation_type.lower() == 'vib': + self.default_calc_params.update({'ibrion' : 5, 'potim' : 0.02, 'nsw' : 1}) + + elif self.calculation_type.lower() == 'solv': + self.default_calc_params.update({'potim' : 0.0, 'nsw' : 5, 'lwave' : True,'lsol' : False,'prec' : 'Accurate'}) + + elif self.calculation_type.lower() == 'solv-spe': + self.default_calc_params.update({'potim' : 0.0, 'nsw' : 3, 'lwave' : True,'lsol' : True,'prec' : 'Accurate'}) + + elif self.calculation_type.lower() == 'solv-spe-rho': + self.default_calc_params.update({'potim' : 0.0, 'nsw' : 5, 'lrho' : True , 'lwave' : True,'lsol' : True,'prec' : 'Accurate', 'lrhob' : True,'lrhoion' : True}) + + elif self.calculation_type.lower() == 'md': + self.default_calc_params.update({'ibrion' : 0, 'nsw' : 1000000, 'tebeg' : 298, 'isif' : 2, 'smass' : 0}) + + else: + pass + + def load_update_kt_params(self): + self.default_calc_params.update(self.user_params) + self.kt_params = self.default_calc_params + + + def init_ase_calc(self): + if self.calc_name.lower() == 'vasp': + self.ase_calculator = Vasp() + else: + pass + + for key in self.kt_params: + self.ase_calculator.set(key = self.kt_params[key]) + + + + - self.identify_vasp_eviron() - print('KT: VASP_PP_PATH= %s' %self.vasp_pp_path) - print('KT: VASP_COMMAND= %s' %self.vasp_command) - self.assign_default_calculator() \ No newline at end of file diff --git a/kT_object/__init__.py b/kT_object/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/kT_object/calc_object.py b/kT_object/calc_object.py new file mode 100644 index 0000000..665b8af --- /dev/null +++ b/kT_object/calc_object.py @@ -0,0 +1,40 @@ +from ase.calculators.vasp import Vasp + +class default_calc: + def __init__(self): + pass + def load_default_vasp(self): + self.vasp_params = {"kpts": (1,1,1), + "potim":0.5, + "encut":500, + "ispin":2, + "nsw":50, + "prec":'Normal', + "istart":1, + "isif":2, + "ismear":0, + "sigma":0.05, + "nelmin":4, + "nelmdl":-4, + "nwrite":1, + "icharg":2, + "lasph":True, + "ediff":1E-6, + "ediffg":-0.05, + "ibrion":2, + "lcharg":False, + "lwave":False, + "laechg":False, + "voskown":1, + "algo":'Fast', + "lplane":True, + "lreal":'Auto', + "isym":0, + "xc":'PBE', + "lorbit":11, + "nupdown":-1, + "npar":4, + "nsim":4, + "ivdw":12 + } + return self.vasp_params diff --git a/kT_object/kt_structure.py b/kT_object/kt_structure.py new file mode 100644 index 0000000..434512f --- /dev/null +++ b/kT_object/kt_structure.py @@ -0,0 +1,44 @@ +from calc_object import default_calc +from ase import Atoms + +class KT_structure(default_calc): + + def __init__(self,structure,structure_type,calculator_name,calculation_type): + super().__init__() + self.structure = structure + self.structure_type = structure_type + self.calc_name = calculator_name + self.calculation_type = calculation_type + + + self.check_calculator_name() + self.load_default_calc_params() + self.check_structure_type() + self.check_calc_type() + + def check_calculator_name(self): + + assert self.calc_name.lower() in ['vasp','emt'], "Unknown/Not implemented calculator name = %s" % self.calc_name + + def load_default_calc_params(self): + + if self.calc_name.lower() == "vasp": + self.default_calc_params = self.load_default_vasp() + + else: + pass + + def check_structure_type(self): + + if self.calculation_type.lower() == 'neb': + assert isinstance(self.structure, list) and isinstance(self.structure[0], Atoms) , "Not an ASE atoms object" + + else: + assert isinstance(self.structure,Atoms) , "Not an ASE atoms object" + + assert self.structure_type.lower() in ['zeo','mof','metal','gas-phase'], "Unknown structure_type = %s" % self.structure_type + + def check_calc_type(self): + + assert self.calculation_type.lower() in ['spe','opt','opt_fine','vib','neb','md','solv','solv-spe','solv-spe-rho'], "Unknown calculation_type = %s" % self.calculation_type + diff --git a/kT_object/load_environ.py b/kT_object/load_environ.py new file mode 100644 index 0000000..2a3fb4a --- /dev/null +++ b/kT_object/load_environ.py @@ -0,0 +1,66 @@ +import sys, os + +def identify_hpc_cluster(): + path_home = os.environ['HOME'] + if path_home.startswith('/global/homes'): + host_name = 'cori' + elif path_home.startswith('/home/'): + if os.environ['SLURM_SUBMIT_HOST']=='hpc1': + host_name = 'hpc1' + elif os.environ['SLURM_SUBMIT_HOST']=='hpc2': + host_name = 'hpc2' + elif path_home.startswith('/Users/'): + host_name = 'local' + elif path_home.startswith('/home1/'): + host_name = 'stampede' + else: + print('Check cluster settings') + sys.exit() + return host_name + +def identify_vasp_eviron(hpc,gamma_only): + if hpc.lower() == 'hpc1': + os.environ['VASP_PP_PATH']='/home/ark245/programs/vasp5.4.4/pseudopotentials/pseudo54' + if self.gamma_only: + vasp_exe = 'vasp_gam' + else: + vasp_exe = 'vasp_std' + os.environ['VASP_COMMAND']='module load vasp/5.4.4pl2-vtst; NTASKS=`echo $SLURM_TASKS_PER_NODE|tr \'(\' \' \'|awk \'{print $1}\'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo " $NTASKS * $NNODES " | bc`; echo "num_cpu=" $NCPU; srun -n $NCPU %s | tee -a op.vasp' % vasp_exe + + elif hpc.lower() == 'hpc2': + os.environ['VASP_PP_PATH']= '/home/sours/programs/vasp_PP' # '/home/ark245/programs/pseudopotentials/pseudo54' + if self.gamma_only: + vasp_exe = 'vasp_gam' + else: + vasp_exe = 'vasp_std' + os.environ['VASP_COMMAND']='NTASKS=`echo $SLURM_TASKS_PER_NODE|tr \'(\' \' \'|awk \'{print $1}\'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo " $NTASKS * $NNODES " | bc`; echo "num_cpu=" $NCPU; $(which mpirun) --map-by core --display-map --report-bindings --mca btl_openib_allow_ib true --mca btl_openib_if_include mlx5_0:1 --mca btl_openib_warn_nonexistent_if 0 --mca btl_openib_warn_no_device_params_found 0 --mca pml ob1 --mca btl openib,self,vader --mca mpi_cuda_support 0 -np $NCPU %s | tee -a op.vasp' % vasp_exe + print(os.environ['VASP_COMMAND']) + + elif hpc.lower() == 'cori': + os.environ['VASP_PP_PATH']='/global/homes/a/ark245/pseudopotentials/PBE54' + if self.gamma_only: + vasp_exe = 'vasp_gam' + else: + vasp_exe = 'vasp_std' + os.environ['VASP_COMMAND']='NTASKS=`echo $SLURM_TASKS_PER_NODE|tr \'(\' \' \'|awk \'{print $1}\'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo " $NTASKS * $NNODES " | bc`; echo "num_cpu=" $NCPU; srun -n $NCPU %s | tee -a op.vasp' % vasp_exe + + elif hpc.lower() == 'stampede': + os.environ['VASP_PP_PATH']='/home1/05364/ark245/pseudopotentials/PBE54' + if self.gamma_only: + vasp_exe = 'vasp_gam_vtst' + else: + vasp_exe = 'vasp_std_vtst' + os.environ['VASP_COMMAND']='module load vasp/5.4.4; export OMP_NUM_THREADS=1;rm op.vasp; mpirun -np $SLURM_NTASKS %s | tee op.vasp' % vasp_exe + + elif hpc.lower() == 'local': + os.environ['VASP_PP_PATH']='local_vasp_pp' + if self.gamma_only: + vasp_exe = 'vasp_gam' + else: + vasp_exe = 'vasp_std' + os.environ['VASP_COMMAND']='local_%s' % vasp_exe + else: + print('Check cluster settings') + sys.exit() + self.vasp_pp_path = os.environ['VASP_PP_PATH'] + self.vasp_command = os.environ['VASP_COMMAND'] diff --git a/kT_object/run_Kultools.py b/kT_object/run_Kultools.py new file mode 100644 index 0000000..b993cb0 --- /dev/null +++ b/kT_object/run_Kultools.py @@ -0,0 +1,35 @@ +from copy import copy + + +class run_KulTools(KT_Object): + + def __init__(self,gamma_only,structure,structure_type,calculator_name,calculation_type,calc_params={}): + + super().__init__(gamma_only,structure,structure_type,calculator_name,calculation_type,calc_params) + + self.run_calculation() + + + def run_calculation(self): + + if self.calculation_type.lower() == 'opt': + self.run_opt() + elif + elif + else + + def run_opt(self): + ase_atoms = copy.deepcopy(self.structure) + + dir_name = 'opt' + + #Set working directory generations + self.ase_calculator.set('directory':os.getwd()) + + ase_atoms.set_calculator(self.ase_calculator) + energy = atoms.get_potential_energy() + + + new_atoms = self.run_dft(atoms,dir_name) + return new_atoms + From 5ab9650810288b5e16ebf4b882549bc6d8cb44ea Mon Sep 17 00:00:00 2001 From: saurabhsivakumar Date: Tue, 15 Feb 2022 13:18:16 -0800 Subject: [PATCH 12/21] added .gitignore --- .gitignore | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..44696e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +__pycache__/ +*.pyc +.vs/ +.ipynb_checkpoints/ + +*.db +*.traj +*.txt +*.json From 4e3d90400100e09e4a418bf3294423c22bebbad7 Mon Sep 17 00:00:00 2001 From: saurabhsivakumar Date: Tue, 15 Feb 2022 13:20:17 -0800 Subject: [PATCH 13/21] Recommit with gitignore --- kT_object/load_environ.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kT_object/load_environ.py b/kT_object/load_environ.py index 2a3fb4a..cc90f6b 100644 --- a/kT_object/load_environ.py +++ b/kT_object/load_environ.py @@ -63,4 +63,4 @@ def identify_vasp_eviron(hpc,gamma_only): print('Check cluster settings') sys.exit() self.vasp_pp_path = os.environ['VASP_PP_PATH'] - self.vasp_command = os.environ['VASP_COMMAND'] + self.vasp_command = os.environ['VASP_COMMAND'] \ No newline at end of file From 10568edd80bef7e1c81e73b6c10c7e917106e5a3 Mon Sep 17 00:00:00 2001 From: saurabhsivakumar Date: Tue, 15 Feb 2022 13:21:53 -0800 Subject: [PATCH 14/21] Update .gitignore --- .vs/ProjectSettings.json | 3 --- .vs/VSWorkspaceState.json | 7 ------- .vs/kultools/v17/.suo | Bin 15872 -> 0 bytes .vs/slnx.sqlite | Bin 90112 -> 0 bytes CHA.traj | Bin 4779 -> 0 bytes kT_object/.vs/ProjectSettings.json | 3 --- kT_object/.vs/VSWorkspaceState.json | 7 ------- kT_object/.vs/kT_object/project-colors.json | 11 ----------- kT_object/.vs/kT_object/v17/.suo | Bin 38912 -> 0 bytes kT_object/.vs/slnx.sqlite | Bin 90112 -> 0 bytes 10 files changed, 31 deletions(-) delete mode 100644 .vs/ProjectSettings.json delete mode 100644 .vs/VSWorkspaceState.json delete mode 100644 .vs/kultools/v17/.suo delete mode 100644 .vs/slnx.sqlite delete mode 100644 CHA.traj delete mode 100644 kT_object/.vs/ProjectSettings.json delete mode 100644 kT_object/.vs/VSWorkspaceState.json delete mode 100644 kT_object/.vs/kT_object/project-colors.json delete mode 100644 kT_object/.vs/kT_object/v17/.suo delete mode 100644 kT_object/.vs/slnx.sqlite diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json deleted file mode 100644 index f8b4888..0000000 --- a/.vs/ProjectSettings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "CurrentProjectSetting": null -} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json deleted file mode 100644 index 99339e0..0000000 --- a/.vs/VSWorkspaceState.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "ExpandedNodes": [ - "" - ], - "SelectedNode": "\\W:\\Github Repos\\kultools", - "PreviewInSolutionExplorer": false -} \ No newline at end of file diff --git a/.vs/kultools/v17/.suo b/.vs/kultools/v17/.suo deleted file mode 100644 index f13fe91338468e88b310b7c9297915086c4962c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15872 zcmeHONpl-T6mBJKVGn^2OaK#15+E{`EIW2Wg5xC%U=rfQrV3xIEmka9su{^7NB#kS zAywQdE*wG?MNu3m4kSm8@I#3CzV2zMHPT3}vB4RmcD+$=)34v_ep~nW{=NNw-uZ6e zFX2mP#a{7XbDwz3sE-+W@w^a^qRhGno12?#VjkIkiVz2`iZcGHVo=P9b^JQwHkZ;m z9mFosu)B{?MA4mBqLrz~r z{#ma~`S;7b9*6IDlmF+8arJxs-<{zA*DDBU8`#G6=3byJ;JR}ka1Ch-sQ;ld71(tQa5VF>bI!_Rs5rU>PAa&ZWc|{lS~U3xhOfU za40(Sz<2|-j*Nj+i|X%xo&f*p*K6Ov-`=h~gG%adrpqFY=x-j_oE9E0N)4|11wD@d zKW&qaNrL*B_0uSD&oIq^dhS41EQ017xE{39s=xn<{a0Um?g4*$yK?jT=fHs)=)VE% zj#!c$&p-;e2fL@i5ctnxSlVi)zWo2c<$qpW71!a3`Srk{p$XMaY5zPLV*h=Fq3BC) zSJJxIR{pjNuO27L_)U8=58Xp6s5H?qG+_-os0s^F5*MJG$|zUFr|3azrL@yo=wF`k z(C4@1Km7&0{fA{w94z4^(w}h3W5I;-lNTAngzY4{o&|2 zjK2mhm%$JEJe};&aqypfXB=qD|1;=21z_^yr$3g#3@UP^>2r0$&RDT`{(k_xn*Z(a zD=&{bAuIjEPV*TD{X8q-S*I=ir#s-M|G5sl)W`I{h`Un){V~SmjKyv7(^pS>0_fNK zVf;T1)%X9%{pk6B3sTy-&sO1uGv27eBVf#9M`2Q47cKEQtbIjFChrI7i#bgb!2Yk}wxyqUg_Hp^4NQyLvD4FEnRPb#wQ4+F zD-^Twjby0zDTnIp24}t@@E3m=`{J&1_uH`Zx1n)2_p#gm!5pCfM}4+~{$J1c@4L+Z zlXo&<{XhTuhtU6$|2zY<)jxgx-`D?IqxAK^=ETnY_Wl20|J&04@7e!)nEe0kIR7O* zlw(`{-#`D|URl?%hb{k2>|8gV$A(Q?eV=~IR`4_K=lhK@DpM$0r>)N48c{&U#=HYM zSXAq~Otb4&>dbL$^IXU80WU>2JR>&12U75JL@6j?7jP|{NUwv7y~w>69T}hma_6}C z%|wd#{+Zvx_kO8JQ@}5;N|J(KA|l29HON5!Qm3jtCB#n=rK13AF@gO=N&YpWG^qb2 zS;LC(4pnKTsMt5XgS1xSIe0PBtFZy8pmaE(qk#Jq?yTP;y0b`&BfT$vg~7WxQWF)O z#sB6iV%B+3(Xe~E9CbPrb6 zv6A^0ua`RK%y*dow-fK3<~`mPWaLP1it%Hm{sp%XXYk+5Jf-57H_eIPLGuh@Xe=?3 zSxF?a@pL9R5>F-5>G;I>_+&hl%1kCENAmg1=!)bl`PWFF-{Y6Z;nPsd7r3rqJWSpt R5V!K#DK*cgQ_uEo{{Y6jAeR6D diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite deleted file mode 100644 index d6234989e7ade3b053e1d8b2a116d56a76017112..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90112 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 From 48824ddbeb9c7dec5550697b835253829d62000b Mon Sep 17 00:00:00 2001 From: saurabhsivakumar Date: Tue, 15 Feb 2022 13:24:09 -0800 Subject: [PATCH 15/21] Update .gitignore --- .gitignore | 1 + .idea/.gitignore | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 .idea/.gitignore diff --git a/.gitignore b/.gitignore index 44696e2..4ab6d5b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ __pycache__/ *.pyc .vs/ .ipynb_checkpoints/ +.idea/ *.db *.traj diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index fb0392b..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/workspace.xml -*.db \ No newline at end of file From 6a9233688ecc3a50b2db922682c7cd3b07710d62 Mon Sep 17 00:00:00 2001 From: saurabhsivakumar Date: Tue, 15 Feb 2022 13:26:58 -0800 Subject: [PATCH 16/21] Clean commit From 60cae600827760b452b9b49f335e403276ef416f Mon Sep 17 00:00:00 2001 From: saurabhsivakumar Date: Tue, 15 Feb 2022 13:34:23 -0800 Subject: [PATCH 17/21] changed file directories --- Calculation_Types/README.md | 1 - {kT_object => KulTools}/KT_object.py | 0 {kT_object => KulTools}/README.md | 0 {kT_object => KulTools}/__init__.py | 0 {kT_object => KulTools}/calc_object.py | 0 {kT_object => KulTools}/kt_structure.py | 0 {kT_object => KulTools}/load_environ.py | 0 {kT_object => KulTools}/run_Kultools.py | 0 cluster_and_vasp_environment/README.md | 1 - structure_types/README.md | 1 - submission/README.md | 2 -- 11 files changed, 5 deletions(-) delete mode 100644 Calculation_Types/README.md rename {kT_object => KulTools}/KT_object.py (100%) rename {kT_object => KulTools}/README.md (100%) rename {kT_object => KulTools}/__init__.py (100%) rename {kT_object => KulTools}/calc_object.py (100%) rename {kT_object => KulTools}/kt_structure.py (100%) rename {kT_object => KulTools}/load_environ.py (100%) rename {kT_object => KulTools}/run_Kultools.py (100%) delete mode 100644 cluster_and_vasp_environment/README.md delete mode 100644 structure_types/README.md delete mode 100644 submission/README.md diff --git a/Calculation_Types/README.md b/Calculation_Types/README.md deleted file mode 100644 index 45b9eb5..0000000 --- a/Calculation_Types/README.md +++ /dev/null @@ -1 +0,0 @@ -Put all calculation types specific code here. diff --git a/kT_object/KT_object.py b/KulTools/KT_object.py similarity index 100% rename from kT_object/KT_object.py rename to KulTools/KT_object.py diff --git a/kT_object/README.md b/KulTools/README.md similarity index 100% rename from kT_object/README.md rename to KulTools/README.md diff --git a/kT_object/__init__.py b/KulTools/__init__.py similarity index 100% rename from kT_object/__init__.py rename to KulTools/__init__.py diff --git a/kT_object/calc_object.py b/KulTools/calc_object.py similarity index 100% rename from kT_object/calc_object.py rename to KulTools/calc_object.py diff --git a/kT_object/kt_structure.py b/KulTools/kt_structure.py similarity index 100% rename from kT_object/kt_structure.py rename to KulTools/kt_structure.py diff --git a/kT_object/load_environ.py b/KulTools/load_environ.py similarity index 100% rename from kT_object/load_environ.py rename to KulTools/load_environ.py diff --git a/kT_object/run_Kultools.py b/KulTools/run_Kultools.py similarity index 100% rename from kT_object/run_Kultools.py rename to KulTools/run_Kultools.py diff --git a/cluster_and_vasp_environment/README.md b/cluster_and_vasp_environment/README.md deleted file mode 100644 index 6c25975..0000000 --- a/cluster_and_vasp_environment/README.md +++ /dev/null @@ -1 +0,0 @@ -Put all the hard coded aspect of kT here. diff --git a/structure_types/README.md b/structure_types/README.md deleted file mode 100644 index bc6581d..0000000 --- a/structure_types/README.md +++ /dev/null @@ -1 +0,0 @@ -Add structure specific info here diff --git a/submission/README.md b/submission/README.md deleted file mode 100644 index a244cce..0000000 --- a/submission/README.md +++ /dev/null @@ -1,2 +0,0 @@ -Submission related scripts should go here. -Headers should be appropriate for environment and cluster being used From e085c7154b460b21a39390b157c6928bffab311f Mon Sep 17 00:00:00 2001 From: saurabhsivakumar Date: Tue, 15 Feb 2022 13:48:11 -0800 Subject: [PATCH 18/21] Flake8 formatting --- .pre-commit-config.yaml | 13 ++ 00_make_molecule.py | 10 +- 01_submit_job.py | 50 ++--- 05_dimer_demo.py | 25 ++- KulTools/KT_object.py | 116 ++++++---- KulTools/calc_object.py | 69 +++--- KulTools/kt_structure.py | 36 ++- KulTools/load_environ.py | 118 +++++----- KulTools/run_Kultools.py | 5 +- README.md | 6 +- __init__.py | 1 - hpc2_header.py | 30 +-- kul_tools.py | 462 +++++++++++++++++++++------------------ 13 files changed, 534 insertions(+), 407 deletions(-) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..eb97226 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,13 @@ +repos: +- repo: https://github.com/ambv/black + rev: stable + hooks: + - id: black + language_version: python3.9 +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.3.0 + hooks: + - id: flake8 + - id: trailing-whitespace + - id: check-added-large-files + - id: end-of-file-fixer \ No newline at end of file diff --git a/00_make_molecule.py b/00_make_molecule.py index 2a07e99..5cc3617 100644 --- a/00_make_molecule.py +++ b/00_make_molecule.py @@ -1,13 +1,13 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import numpy as np +import numpy as np from ase.build import molecule -from ase.visualize import view +from ase.visualize import view import ase.io as io -atoms = molecule('H2O') -atoms.set_cell(8*np.identity(3)) +atoms = molecule("H2O") +atoms.set_cell(8 * np.identity(3)) atoms.center() view(atoms) -io.write('start.traj', atoms) +io.write("start.traj", atoms) diff --git a/01_submit_job.py b/01_submit_job.py index 55eec8a..5bd9493 100644 --- a/01_submit_job.py +++ b/01_submit_job.py @@ -1,43 +1,43 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -#SBATCH -p high -#SBATCH --job-name=opt_try -#SBATCH --output=job.out -#SBATCH --error=job.err -#SBATCH --time=8:00:00 -#SBATCH --nodes=1 -#SBATCH --ntasks-per-node=16 -#SiBATCH --exclusive +# SBATCH -p high +# SBATCH --job-name=opt_try +# SBATCH --output=job.out +# SBATCH --error=job.err +# SBATCH --time=8:00:00 +# SBATCH --nodes=1 +# SBATCH --ntasks-per-node=16 +# SiBATCH --exclusive """ Created on Thu Mar 26 17:10:56 2020 @author: ark245 """ -import os, sys -sys.path.insert(0,'/home/ark245/lib/onboarding_DFT/') +import os, sys + +sys.path.insert(0, "/home/ark245/lib/onboarding_DFT/") from ase import io from kul_tools import KulTools as KT -kt = KT(gamma_only=False,structure_type='zeo') -kt.set_calculation_type('opt') -atoms = io.read('start.traj') -atoms.pbc=True +kt = KT(gamma_only=False, structure_type="zeo") +kt.set_calculation_type("opt") +atoms = io.read("start.traj") +atoms.pbc = True kt.set_structure(atoms) -kt.set_overall_vasp_params({'gga':'RP'}) +kt.set_overall_vasp_params({"gga": "RP"}) kt.run() -#print(kt.calc_default.int_params['ismear']) -#print(kt.calc_default.special_params['lreal']) -#print(kt.calculation_type) - +# print(kt.calc_default.int_params['ismear']) +# print(kt.calc_default.special_params['lreal']) +# print(kt.calculation_type) -# Calculation type -# opt --> needs atoms -# opt_fine --> needs constraints -# vib --> needs constraints -# dimer --> needs path annd atoms -# neb --> needs traj +# Calculation type +# opt --> needs atoms +# opt_fine --> needs constraints +# vib --> needs constraints +# dimer --> needs path annd atoms +# neb --> needs traj diff --git a/05_dimer_demo.py b/05_dimer_demo.py index 5dba33d..3d19074 100644 --- a/05_dimer_demo.py +++ b/05_dimer_demo.py @@ -1,26 +1,27 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -#SBATCH -p high -#SBATCH --job-name=opt_try -#SBATCH --output=job.out -#SBATCH --error=job.err -#SBATCH --time=8:00:00 -#SBATCH --nodes=1 -#SBATCH --ntasks-per-node=64 -c 2 -#SiBATCH --exclusive +# SBATCH -p high +# SBATCH --job-name=opt_try +# SBATCH --output=job.out +# SBATCH --error=job.err +# SBATCH --time=8:00:00 +# SBATCH --nodes=1 +# SBATCH --ntasks-per-node=64 -c 2 +# SiBATCH --exclusive """ Created on Thu Mar 26 17:10:56 2020 @author: ark245 """ import os, sys -sys.path.insert(0,'/home/ark245/lib/onboarding_DFT/') + +sys.path.insert(0, "/home/ark245/lib/onboarding_DFT/") from ase import io from kul_tools import KulTools as KT -kt = KT(gamma_only=False,structure_type='zeo',calculation_type='dimer') -atoms = io.read('dimer_start.traj') +kt = KT(gamma_only=False, structure_type="zeo", calculation_type="dimer") +atoms = io.read("dimer_start.traj") kt.set_structure(atoms) -kt.set_overall_vasp_params({'gga':'RP'}) +kt.set_overall_vasp_params({"gga": "RP"}) kt.run() diff --git a/KulTools/KT_object.py b/KulTools/KT_object.py index 7e675bb..2c661b9 100644 --- a/KulTools/KT_object.py +++ b/KulTools/KT_object.py @@ -1,4 +1,4 @@ -'''class structure(custom_params,ase_atoms) +"""class structure(custom_params,ase_atoms) assert param has been Changed ISMEAR SIGMA etc structure.get_calc_object (VASP,QE) @@ -17,23 +17,31 @@ class calculation_type(custom_params): from kt.calculation_type import calc_params... -.sh script package -> environments''' +.sh script package -> environments""" from kt_structure import KT_structure from ase.calculators.vasp import Vasp from load_environ import identify_hpc_cluster, identify_vasp_eviron -class KT_Object(KT_structure): - - def __init__(self,gamma_only,structure,structure_type,calculator_name,calculation_type,calc_params={}): - super().__init__(structure,structure_type,calculator_name,calculation_type) +class KT_Object(KT_structure): + def __init__( + self, + gamma_only, + structure, + structure_type, + calculator_name, + calculation_type, + calc_params={}, + ): + + super().__init__(structure, structure_type, calculator_name, calculation_type) self.gamma = gamma_only self.user_params = calc_params self.kt_params = {} - if self.calc_name.lower() == 'vasp': + if self.calc_name.lower() == "vasp": self.load_structure_type_params_vasp() self.load_calc_type_params_vasp() @@ -42,43 +50,72 @@ def __init__(self,gamma_only,structure,structure_type,calculator_name,calculatio self.init_ase_calc() self.hpc = identify_hpc_cluster() - identify_vasp_eviron(self.hpc,self.gamma) + identify_vasp_eviron(self.hpc, self.gamma) - - def load_structure_type_params_vasp(self): - if self.structure_type.lower() == 'metal': - self.default_calc_params.update({'sigma' : 0.2, 'ismear' : 1}) + if self.structure_type.lower() == "metal": + self.default_calc_params.update({"sigma": 0.2, "ismear": 1}) - elif self.structure_type.lower() == 'gas-phase': - self.default_calc_params.update({'lreal' : False}) + elif self.structure_type.lower() == "gas-phase": + self.default_calc_params.update({"lreal": False}) else: pass def load_calc_type_params_vasp(self): - if self.calculation_type.lower() == 'spe': - self.default_calc_params.update({'nsw' : 0}) - - elif self.calculation_type.lower() == 'opt_fine': - self.default_calc_params.update({'ibrion' : 1, 'potim' : 0.05, 'nsw' : 50, 'ediffg' : -0.03}) - - elif self.calculation_type.lower() == 'vib': - self.default_calc_params.update({'ibrion' : 5, 'potim' : 0.02, 'nsw' : 1}) - - elif self.calculation_type.lower() == 'solv': - self.default_calc_params.update({'potim' : 0.0, 'nsw' : 5, 'lwave' : True,'lsol' : False,'prec' : 'Accurate'}) - - elif self.calculation_type.lower() == 'solv-spe': - self.default_calc_params.update({'potim' : 0.0, 'nsw' : 3, 'lwave' : True,'lsol' : True,'prec' : 'Accurate'}) - - elif self.calculation_type.lower() == 'solv-spe-rho': - self.default_calc_params.update({'potim' : 0.0, 'nsw' : 5, 'lrho' : True , 'lwave' : True,'lsol' : True,'prec' : 'Accurate', 'lrhob' : True,'lrhoion' : True}) - - elif self.calculation_type.lower() == 'md': - self.default_calc_params.update({'ibrion' : 0, 'nsw' : 1000000, 'tebeg' : 298, 'isif' : 2, 'smass' : 0}) + if self.calculation_type.lower() == "spe": + self.default_calc_params.update({"nsw": 0}) + + elif self.calculation_type.lower() == "opt_fine": + self.default_calc_params.update( + {"ibrion": 1, "potim": 0.05, "nsw": 50, "ediffg": -0.03} + ) + + elif self.calculation_type.lower() == "vib": + self.default_calc_params.update({"ibrion": 5, "potim": 0.02, "nsw": 1}) + + elif self.calculation_type.lower() == "solv": + self.default_calc_params.update( + { + "potim": 0.0, + "nsw": 5, + "lwave": True, + "lsol": False, + "prec": "Accurate", + } + ) + + elif self.calculation_type.lower() == "solv-spe": + self.default_calc_params.update( + { + "potim": 0.0, + "nsw": 3, + "lwave": True, + "lsol": True, + "prec": "Accurate", + } + ) + + elif self.calculation_type.lower() == "solv-spe-rho": + self.default_calc_params.update( + { + "potim": 0.0, + "nsw": 5, + "lrho": True, + "lwave": True, + "lsol": True, + "prec": "Accurate", + "lrhob": True, + "lrhoion": True, + } + ) + + elif self.calculation_type.lower() == "md": + self.default_calc_params.update( + {"ibrion": 0, "nsw": 1000000, "tebeg": 298, "isif": 2, "smass": 0} + ) else: pass @@ -87,18 +124,11 @@ def load_update_kt_params(self): self.default_calc_params.update(self.user_params) self.kt_params = self.default_calc_params - def init_ase_calc(self): - if self.calc_name.lower() == 'vasp': + if self.calc_name.lower() == "vasp": self.ase_calculator = Vasp() else: pass for key in self.kt_params: - self.ase_calculator.set(key = self.kt_params[key]) - - - - - - + self.ase_calculator.set(key=self.kt_params[key]) diff --git a/KulTools/calc_object.py b/KulTools/calc_object.py index 665b8af..969008c 100644 --- a/KulTools/calc_object.py +++ b/KulTools/calc_object.py @@ -1,40 +1,43 @@ from ase.calculators.vasp import Vasp + class default_calc: def __init__(self): pass + def load_default_vasp(self): - self.vasp_params = {"kpts": (1,1,1), - "potim":0.5, - "encut":500, - "ispin":2, - "nsw":50, - "prec":'Normal', - "istart":1, - "isif":2, - "ismear":0, - "sigma":0.05, - "nelmin":4, - "nelmdl":-4, - "nwrite":1, - "icharg":2, - "lasph":True, - "ediff":1E-6, - "ediffg":-0.05, - "ibrion":2, - "lcharg":False, - "lwave":False, - "laechg":False, - "voskown":1, - "algo":'Fast', - "lplane":True, - "lreal":'Auto', - "isym":0, - "xc":'PBE', - "lorbit":11, - "nupdown":-1, - "npar":4, - "nsim":4, - "ivdw":12 - } + self.vasp_params = { + "kpts": (1, 1, 1), + "potim": 0.5, + "encut": 500, + "ispin": 2, + "nsw": 50, + "prec": "Normal", + "istart": 1, + "isif": 2, + "ismear": 0, + "sigma": 0.05, + "nelmin": 4, + "nelmdl": -4, + "nwrite": 1, + "icharg": 2, + "lasph": True, + "ediff": 1e-6, + "ediffg": -0.05, + "ibrion": 2, + "lcharg": False, + "lwave": False, + "laechg": False, + "voskown": 1, + "algo": "Fast", + "lplane": True, + "lreal": "Auto", + "isym": 0, + "xc": "PBE", + "lorbit": 11, + "nupdown": -1, + "npar": 4, + "nsim": 4, + "ivdw": 12, + } return self.vasp_params diff --git a/KulTools/kt_structure.py b/KulTools/kt_structure.py index 434512f..68969ae 100644 --- a/KulTools/kt_structure.py +++ b/KulTools/kt_structure.py @@ -1,15 +1,14 @@ from calc_object import default_calc from ase import Atoms -class KT_structure(default_calc): - def __init__(self,structure,structure_type,calculator_name,calculation_type): +class KT_structure(default_calc): + def __init__(self, structure, structure_type, calculator_name, calculation_type): super().__init__() self.structure = structure self.structure_type = structure_type self.calc_name = calculator_name self.calculation_type = calculation_type - self.check_calculator_name() self.load_default_calc_params() @@ -18,7 +17,9 @@ def __init__(self,structure,structure_type,calculator_name,calculation_type): def check_calculator_name(self): - assert self.calc_name.lower() in ['vasp','emt'], "Unknown/Not implemented calculator name = %s" % self.calc_name + assert self.calc_name.lower() in ["vasp", "emt"], ( + "Unknown/Not implemented calculator name = %s" % self.calc_name + ) def load_default_calc_params(self): @@ -30,15 +31,30 @@ def load_default_calc_params(self): def check_structure_type(self): - if self.calculation_type.lower() == 'neb': - assert isinstance(self.structure, list) and isinstance(self.structure[0], Atoms) , "Not an ASE atoms object" + if self.calculation_type.lower() == "neb": + assert isinstance(self.structure, list) and isinstance( + self.structure[0], Atoms + ), "Not an ASE atoms object" else: - assert isinstance(self.structure,Atoms) , "Not an ASE atoms object" + assert isinstance(self.structure, Atoms), "Not an ASE atoms object" - assert self.structure_type.lower() in ['zeo','mof','metal','gas-phase'], "Unknown structure_type = %s" % self.structure_type + assert self.structure_type.lower() in ["zeo", "mof", "metal", "gas-phase"], ( + "Unknown structure_type = %s" % self.structure_type + ) def check_calc_type(self): - assert self.calculation_type.lower() in ['spe','opt','opt_fine','vib','neb','md','solv','solv-spe','solv-spe-rho'], "Unknown calculation_type = %s" % self.calculation_type - + assert self.calculation_type.lower() in [ + "spe", + "opt", + "opt_fine", + "vib", + "neb", + "md", + "solv", + "solv-spe", + "solv-spe-rho", + ], ( + "Unknown calculation_type = %s" % self.calculation_type + ) diff --git a/KulTools/load_environ.py b/KulTools/load_environ.py index cc90f6b..149021c 100644 --- a/KulTools/load_environ.py +++ b/KulTools/load_environ.py @@ -1,66 +1,84 @@ import sys, os + def identify_hpc_cluster(): - path_home = os.environ['HOME'] - if path_home.startswith('/global/homes'): - host_name = 'cori' - elif path_home.startswith('/home/'): - if os.environ['SLURM_SUBMIT_HOST']=='hpc1': - host_name = 'hpc1' - elif os.environ['SLURM_SUBMIT_HOST']=='hpc2': - host_name = 'hpc2' - elif path_home.startswith('/Users/'): - host_name = 'local' - elif path_home.startswith('/home1/'): - host_name = 'stampede' + path_home = os.environ["HOME"] + if path_home.startswith("/global/homes"): + host_name = "cori" + elif path_home.startswith("/home/"): + if os.environ["SLURM_SUBMIT_HOST"] == "hpc1": + host_name = "hpc1" + elif os.environ["SLURM_SUBMIT_HOST"] == "hpc2": + host_name = "hpc2" + elif path_home.startswith("/Users/"): + host_name = "local" + elif path_home.startswith("/home1/"): + host_name = "stampede" else: - print('Check cluster settings') + print("Check cluster settings") sys.exit() return host_name - -def identify_vasp_eviron(hpc,gamma_only): - if hpc.lower() == 'hpc1': - os.environ['VASP_PP_PATH']='/home/ark245/programs/vasp5.4.4/pseudopotentials/pseudo54' - if self.gamma_only: - vasp_exe = 'vasp_gam' + + +def identify_vasp_eviron(hpc, gamma_only): + if hpc.lower() == "hpc1": + os.environ[ + "VASP_PP_PATH" + ] = "/home/ark245/programs/vasp5.4.4/pseudopotentials/pseudo54" + if self.gamma_only: + vasp_exe = "vasp_gam" else: - vasp_exe = 'vasp_std' - os.environ['VASP_COMMAND']='module load vasp/5.4.4pl2-vtst; NTASKS=`echo $SLURM_TASKS_PER_NODE|tr \'(\' \' \'|awk \'{print $1}\'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo " $NTASKS * $NNODES " | bc`; echo "num_cpu=" $NCPU; srun -n $NCPU %s | tee -a op.vasp' % vasp_exe + vasp_exe = "vasp_std" + os.environ["VASP_COMMAND"] = ( + "module load vasp/5.4.4pl2-vtst; NTASKS=`echo $SLURM_TASKS_PER_NODE|tr '(' ' '|awk '{print $1}'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo \" $NTASKS * $NNODES \" | bc`; echo \"num_cpu=\" $NCPU; srun -n $NCPU %s | tee -a op.vasp" + % vasp_exe + ) - elif hpc.lower() == 'hpc2': - os.environ['VASP_PP_PATH']= '/home/sours/programs/vasp_PP' # '/home/ark245/programs/pseudopotentials/pseudo54' + elif hpc.lower() == "hpc2": + os.environ[ + "VASP_PP_PATH" + ] = "/home/sours/programs/vasp_PP" # '/home/ark245/programs/pseudopotentials/pseudo54' if self.gamma_only: - vasp_exe = 'vasp_gam' + vasp_exe = "vasp_gam" else: - vasp_exe = 'vasp_std' - os.environ['VASP_COMMAND']='NTASKS=`echo $SLURM_TASKS_PER_NODE|tr \'(\' \' \'|awk \'{print $1}\'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo " $NTASKS * $NNODES " | bc`; echo "num_cpu=" $NCPU; $(which mpirun) --map-by core --display-map --report-bindings --mca btl_openib_allow_ib true --mca btl_openib_if_include mlx5_0:1 --mca btl_openib_warn_nonexistent_if 0 --mca btl_openib_warn_no_device_params_found 0 --mca pml ob1 --mca btl openib,self,vader --mca mpi_cuda_support 0 -np $NCPU %s | tee -a op.vasp' % vasp_exe - print(os.environ['VASP_COMMAND']) + vasp_exe = "vasp_std" + os.environ["VASP_COMMAND"] = ( + "NTASKS=`echo $SLURM_TASKS_PER_NODE|tr '(' ' '|awk '{print $1}'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo \" $NTASKS * $NNODES \" | bc`; echo \"num_cpu=\" $NCPU; $(which mpirun) --map-by core --display-map --report-bindings --mca btl_openib_allow_ib true --mca btl_openib_if_include mlx5_0:1 --mca btl_openib_warn_nonexistent_if 0 --mca btl_openib_warn_no_device_params_found 0 --mca pml ob1 --mca btl openib,self,vader --mca mpi_cuda_support 0 -np $NCPU %s | tee -a op.vasp" + % vasp_exe + ) + print(os.environ["VASP_COMMAND"]) - elif hpc.lower() == 'cori': - os.environ['VASP_PP_PATH']='/global/homes/a/ark245/pseudopotentials/PBE54' - if self.gamma_only: - vasp_exe = 'vasp_gam' + elif hpc.lower() == "cori": + os.environ["VASP_PP_PATH"] = "/global/homes/a/ark245/pseudopotentials/PBE54" + if self.gamma_only: + vasp_exe = "vasp_gam" else: - vasp_exe = 'vasp_std' - os.environ['VASP_COMMAND']='NTASKS=`echo $SLURM_TASKS_PER_NODE|tr \'(\' \' \'|awk \'{print $1}\'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo " $NTASKS * $NNODES " | bc`; echo "num_cpu=" $NCPU; srun -n $NCPU %s | tee -a op.vasp' % vasp_exe - - elif hpc.lower() == 'stampede': - os.environ['VASP_PP_PATH']='/home1/05364/ark245/pseudopotentials/PBE54' - if self.gamma_only: - vasp_exe = 'vasp_gam_vtst' + vasp_exe = "vasp_std" + os.environ["VASP_COMMAND"] = ( + "NTASKS=`echo $SLURM_TASKS_PER_NODE|tr '(' ' '|awk '{print $1}'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo \" $NTASKS * $NNODES \" | bc`; echo \"num_cpu=\" $NCPU; srun -n $NCPU %s | tee -a op.vasp" + % vasp_exe + ) + + elif hpc.lower() == "stampede": + os.environ["VASP_PP_PATH"] = "/home1/05364/ark245/pseudopotentials/PBE54" + if self.gamma_only: + vasp_exe = "vasp_gam_vtst" else: - vasp_exe = 'vasp_std_vtst' - os.environ['VASP_COMMAND']='module load vasp/5.4.4; export OMP_NUM_THREADS=1;rm op.vasp; mpirun -np $SLURM_NTASKS %s | tee op.vasp' % vasp_exe + vasp_exe = "vasp_std_vtst" + os.environ["VASP_COMMAND"] = ( + "module load vasp/5.4.4; export OMP_NUM_THREADS=1;rm op.vasp; mpirun -np $SLURM_NTASKS %s | tee op.vasp" + % vasp_exe + ) - elif hpc.lower() == 'local': - os.environ['VASP_PP_PATH']='local_vasp_pp' - if self.gamma_only: - vasp_exe = 'vasp_gam' + elif hpc.lower() == "local": + os.environ["VASP_PP_PATH"] = "local_vasp_pp" + if self.gamma_only: + vasp_exe = "vasp_gam" else: - vasp_exe = 'vasp_std' - os.environ['VASP_COMMAND']='local_%s' % vasp_exe - else: - print('Check cluster settings') + vasp_exe = "vasp_std" + os.environ["VASP_COMMAND"] = "local_%s" % vasp_exe + else: + print("Check cluster settings") sys.exit() - self.vasp_pp_path = os.environ['VASP_PP_PATH'] - self.vasp_command = os.environ['VASP_COMMAND'] \ No newline at end of file + self.vasp_pp_path = os.environ["VASP_PP_PATH"] + self.vasp_command = os.environ["VASP_COMMAND"] diff --git a/KulTools/run_Kultools.py b/KulTools/run_Kultools.py index b993cb0..a77642d 100644 --- a/KulTools/run_Kultools.py +++ b/KulTools/run_Kultools.py @@ -9,7 +9,7 @@ def __init__(self,gamma_only,structure,structure_type,calculator_name,calculatio self.run_calculation() - + def run_calculation(self): if self.calculation_type.lower() == 'opt': @@ -29,7 +29,6 @@ def run_opt(self): ase_atoms.set_calculator(self.ase_calculator) energy = atoms.get_potential_energy() - + new_atoms = self.run_dft(atoms,dir_name) return new_atoms - diff --git a/README.md b/README.md index ed8ff13..0f509a2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # VASP Test Instructions -1. add `module load vasp/5.4.4` to your `.bashrc` file and reload it or reconnect +1. add `module load vasp/5.4.4` to your `.bashrc` file and reload it or reconnect 2. run file `00_make_molecule.py` by running `python3 00_make_molecule.py` -3. verify that the file `start.traj` was created -4. run the second file with slurm by typing `sbatch 01_submit_job.py` (you might need a __init__.py file for kultools.py to be recognized as a module). +3. verify that the file `start.traj` was created +4. run the second file with slurm by typing `sbatch 01_submit_job.py` (you might need a __init__.py file for kultools.py to be recognized as a module). 5. Check the `job.out` and `job.err` files for errors diff --git a/__init__.py b/__init__.py index 8b13789..e69de29 100644 --- a/__init__.py +++ b/__init__.py @@ -1 +0,0 @@ - diff --git a/hpc2_header.py b/hpc2_header.py index 5ce4aab..bc734de 100644 --- a/hpc2_header.py +++ b/hpc2_header.py @@ -1,14 +1,14 @@ #!/usr/bin/env python ##SBATCH --exclude=agate-0,agate-1 -#SBATCH --nodes=1 --partition=high -#SBATCH --ntasks-per-node=64 -#SBATCH --ntasks-per-core=1 -#SBATCH --threads-per-core=1 -#SBATCH --output=job.out -#SBATCH --error=job.err -#SBATCH --time=28:00:00 -#SBATCH --verbose +# SBATCH --nodes=1 --partition=high +# SBATCH --ntasks-per-node=64 +# SBATCH --ntasks-per-core=1 +# SBATCH --threads-per-core=1 +# SBATCH --output=job.out +# SBATCH --error=job.err +# SBATCH --time=28:00:00 +# SBATCH --verbose import shutil from ase.parallel import * @@ -18,7 +18,7 @@ import os import time import shutil -from ase.optimize import BFGS,FIRE, QuasiNewton +from ase.optimize import BFGS, FIRE, QuasiNewton from glob import glob from ase.calculators.emt import EMT from ase.constraints import FixAtoms @@ -26,11 +26,15 @@ from ase.calculators.vasp import Vasp from ase.optimize.gpmin import gpmin -os.environ['VASP_PP_PATH']='/home/sours/programs/vasp_PP' -os.environ["MPIRUN_OPTIONS"] = "--verbose --map-by core --display-map --report-bindings " -os.environ["MPIRUN_OPTIONS"] += "--mca btl_openib_allow_ib true --mca btl_openib_if_include mlx5_0:1 " +os.environ["VASP_PP_PATH"] = "/home/sours/programs/vasp_PP" +os.environ[ + "MPIRUN_OPTIONS" +] = "--verbose --map-by core --display-map --report-bindings " +os.environ[ + "MPIRUN_OPTIONS" +] += "--mca btl_openib_allow_ib true --mca btl_openib_if_include mlx5_0:1 " os.environ["MPIRUN_OPTIONS"] += "--mca btl_openib_warn_nonexistent_if 0 " os.environ["MPIRUN_OPTIONS"] += "--mca btl_openib_warn_no_device_params_found 0 " os.environ["MPIRUN_OPTIONS"] += "--mca pml ob1 --mca btl openib,self,vader " os.environ["MPIRUN_OPTIONS"] += "--mca mpi_cuda_support 0 " -os.environ['VASP_COMMAND'] = "mpirun $MPIRUN_OPTIONS -np $SLURM_NTASKS vasp_gam" +os.environ["VASP_COMMAND"] = "mpirun $MPIRUN_OPTIONS -np $SLURM_NTASKS vasp_gam" diff --git a/kul_tools.py b/kul_tools.py index 1c40208..be2a8dd 100644 --- a/kul_tools.py +++ b/kul_tools.py @@ -1,13 +1,14 @@ -# Kulkarni group @ UC Davis +# Kulkarni group @ UC Davis """Definition of the Zeotype class. -This module defines the central object in analyzing Zeotypes +This module defines the central object in analyzing Zeotypes """ import sys, os -import numpy as np +import numpy as np from ase import Atoms from ase.neighborlist import NeighborList + try: from ase.neighborlist import natural_cutoffs except: @@ -15,98 +16,123 @@ from ase.visualize import view from ase.calculators.vasp import Vasp + class KulTools: - """KulTools class that provides all the necessary tools for running simulations. Currently targetted towards using vasp. """ - def __init__(self,gamma_only=False,structure_type=None,calculation_type='spe',structure=None): + """KulTools class that provides all the necessary tools for running simulations. Currently targetted towards using vasp.""" + + def __init__( + self, + gamma_only=False, + structure_type=None, + calculation_type="spe", + structure=None, + ): self.working_dir = os.getcwd() - + self.hpc = self.identify_hpc_cluster() - print('KT: HPC= %s' %self.hpc) + print("KT: HPC= %s" % self.hpc) self.gamma_only = gamma_only - print('KT: VASP_GAMMA= %s' %self.gamma_only) - + print("KT: VASP_GAMMA= %s" % self.gamma_only) + self.structure_type = structure_type self.calculation_type = calculation_type self.main_dir = os.getcwd() - self.structure = structure + self.structure = structure self.identify_vasp_eviron() - print('KT: VASP_PP_PATH= %s' %self.vasp_pp_path) - print('KT: VASP_COMMAND= %s' %self.vasp_command) + print("KT: VASP_PP_PATH= %s" % self.vasp_pp_path) + print("KT: VASP_COMMAND= %s" % self.vasp_command) self.assign_default_calculator() def identify_hpc_cluster(self): - path_home = os.environ['HOME'] - if path_home.startswith('/global/homes'): - host_name = 'cori' - elif path_home.startswith('/home/'): - if os.environ['SLURM_SUBMIT_HOST']=='hpc1': - host_name = 'hpc1' - elif os.environ['SLURM_SUBMIT_HOST']=='hpc2': - host_name = 'hpc2' - elif path_home.startswith('/Users/'): - host_name = 'local' - elif path_home.startswith('/home1/'): - host_name = 'stampede' + path_home = os.environ["HOME"] + if path_home.startswith("/global/homes"): + host_name = "cori" + elif path_home.startswith("/home/"): + if os.environ["SLURM_SUBMIT_HOST"] == "hpc1": + host_name = "hpc1" + elif os.environ["SLURM_SUBMIT_HOST"] == "hpc2": + host_name = "hpc2" + elif path_home.startswith("/Users/"): + host_name = "local" + elif path_home.startswith("/home1/"): + host_name = "stampede" else: - print('Check cluster settings') + print("Check cluster settings") sys.exit() return host_name - + def identify_vasp_eviron(self): - if self.hpc == 'hpc1': - os.environ['VASP_PP_PATH']='/home/ark245/programs/vasp5.4.4/pseudopotentials/pseudo54' - if self.gamma_only: - vasp_exe = 'vasp_gam' + if self.hpc == "hpc1": + os.environ[ + "VASP_PP_PATH" + ] = "/home/ark245/programs/vasp5.4.4/pseudopotentials/pseudo54" + if self.gamma_only: + vasp_exe = "vasp_gam" else: - vasp_exe = 'vasp_std' - os.environ['VASP_COMMAND']='module load vasp/5.4.4pl2-vtst; NTASKS=`echo $SLURM_TASKS_PER_NODE|tr \'(\' \' \'|awk \'{print $1}\'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo " $NTASKS * $NNODES " | bc`; echo "num_cpu=" $NCPU; srun -n $NCPU %s | tee -a op.vasp' % vasp_exe + vasp_exe = "vasp_std" + os.environ["VASP_COMMAND"] = ( + "module load vasp/5.4.4pl2-vtst; NTASKS=`echo $SLURM_TASKS_PER_NODE|tr '(' ' '|awk '{print $1}'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo \" $NTASKS * $NNODES \" | bc`; echo \"num_cpu=\" $NCPU; srun -n $NCPU %s | tee -a op.vasp" + % vasp_exe + ) - elif self.hpc == 'hpc2': - os.environ['VASP_PP_PATH']= '/home/sours/programs/vasp_PP' # '/home/ark245/programs/pseudopotentials/pseudo54' + elif self.hpc == "hpc2": + os.environ[ + "VASP_PP_PATH" + ] = "/home/sours/programs/vasp_PP" # '/home/ark245/programs/pseudopotentials/pseudo54' if self.gamma_only: - vasp_exe = 'vasp_gam' + vasp_exe = "vasp_gam" else: - vasp_exe = 'vasp_std' - os.environ['VASP_COMMAND']='NTASKS=`echo $SLURM_TASKS_PER_NODE|tr \'(\' \' \'|awk \'{print $1}\'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo " $NTASKS * $NNODES " | bc`; echo "num_cpu=" $NCPU; $(which mpirun) --map-by core --display-map --report-bindings --mca btl_openib_allow_ib true --mca btl_openib_if_include mlx5_0:1 --mca btl_openib_warn_nonexistent_if 0 --mca btl_openib_warn_no_device_params_found 0 --mca pml ob1 --mca btl openib,self,vader --mca mpi_cuda_support 0 -np $NCPU %s | tee -a op.vasp' % vasp_exe - print(os.environ['VASP_COMMAND']) - - elif self.hpc == 'cori': - os.environ['VASP_PP_PATH']='/global/homes/a/ark245/pseudopotentials/PBE54' - if self.gamma_only: - vasp_exe = 'vasp_gam' + vasp_exe = "vasp_std" + os.environ["VASP_COMMAND"] = ( + "NTASKS=`echo $SLURM_TASKS_PER_NODE|tr '(' ' '|awk '{print $1}'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo \" $NTASKS * $NNODES \" | bc`; echo \"num_cpu=\" $NCPU; $(which mpirun) --map-by core --display-map --report-bindings --mca btl_openib_allow_ib true --mca btl_openib_if_include mlx5_0:1 --mca btl_openib_warn_nonexistent_if 0 --mca btl_openib_warn_no_device_params_found 0 --mca pml ob1 --mca btl openib,self,vader --mca mpi_cuda_support 0 -np $NCPU %s | tee -a op.vasp" + % vasp_exe + ) + print(os.environ["VASP_COMMAND"]) + + elif self.hpc == "cori": + os.environ["VASP_PP_PATH"] = "/global/homes/a/ark245/pseudopotentials/PBE54" + if self.gamma_only: + vasp_exe = "vasp_gam" else: - vasp_exe = 'vasp_std' - os.environ['VASP_COMMAND']='NTASKS=`echo $SLURM_TASKS_PER_NODE|tr \'(\' \' \'|awk \'{print $1}\'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo " $NTASKS * $NNODES " | bc`; echo "num_cpu=" $NCPU; srun -n $NCPU %s | tee -a op.vasp' % vasp_exe - elif self.hpc == 'stampede': - os.environ['VASP_PP_PATH']='/home1/05364/ark245/pseudopotentials/PBE54' - if self.gamma_only: - vasp_exe = 'vasp_gam_vtst' + vasp_exe = "vasp_std" + os.environ["VASP_COMMAND"] = ( + "NTASKS=`echo $SLURM_TASKS_PER_NODE|tr '(' ' '|awk '{print $1}'`; NNODES=`scontrol show hostnames $SLURM_JOB_NODELIST|wc -l`; NCPU=`echo \" $NTASKS * $NNODES \" | bc`; echo \"num_cpu=\" $NCPU; srun -n $NCPU %s | tee -a op.vasp" + % vasp_exe + ) + elif self.hpc == "stampede": + os.environ["VASP_PP_PATH"] = "/home1/05364/ark245/pseudopotentials/PBE54" + if self.gamma_only: + vasp_exe = "vasp_gam_vtst" else: - vasp_exe = 'vasp_std_vtst' - os.environ['VASP_COMMAND']='module load vasp/5.4.4; export OMP_NUM_THREADS=1;rm op.vasp; mpirun -np $SLURM_NTASKS %s | tee op.vasp' % vasp_exe - elif self.hpc == 'local': - os.environ['VASP_PP_PATH']='local_vasp_pp' - if self.gamma_only: - vasp_exe = 'vasp_gam' + vasp_exe = "vasp_std_vtst" + os.environ["VASP_COMMAND"] = ( + "module load vasp/5.4.4; export OMP_NUM_THREADS=1;rm op.vasp; mpirun -np $SLURM_NTASKS %s | tee op.vasp" + % vasp_exe + ) + elif self.hpc == "local": + os.environ["VASP_PP_PATH"] = "local_vasp_pp" + if self.gamma_only: + vasp_exe = "vasp_gam" else: - vasp_exe = 'vasp_std' - os.environ['VASP_COMMAND']='local_%s' % vasp_exe - else: - print('Check cluster settings') + vasp_exe = "vasp_std" + os.environ["VASP_COMMAND"] = "local_%s" % vasp_exe + else: + print("Check cluster settings") sys.exit() - self.vasp_pp_path = os.environ['VASP_PP_PATH'] - self.vasp_command = os.environ['VASP_COMMAND'] + self.vasp_pp_path = os.environ["VASP_PP_PATH"] + self.vasp_command = os.environ["VASP_COMMAND"] def assign_default_calculator(self): """Sets a default calculator regadless of the structure type""" - self.calc_default = Vasp(kpts=(1,1,1), + self.calc_default = Vasp( + kpts=(1, 1, 1), potim=0.5, encut=500, ispin=2, nsw=50, - prec='Normal', + prec="Normal", istart=1, isif=2, ismear=0, @@ -116,249 +142,267 @@ def assign_default_calculator(self): nwrite=1, icharg=2, lasph=True, - ediff=1E-6, - ediffg=-0.05, + ediff=1e-6, + ediffg=-0.05, ibrion=2, lcharg=False, lwave=False, laechg=False, voskown=1, - algo='Fast', + algo="Fast", lplane=True, - lreal='Auto', + lreal="Auto", isym=0, - xc='PBE', + xc="PBE", lorbit=11, nupdown=-1, npar=4, nsim=4, - ivdw=12) + ivdw=12, + ) self.modify_calc_according_to_structure_type() - - def set_overall_vasp_params(self,overall_vasp_params): + + def set_overall_vasp_params(self, overall_vasp_params): self.overall_vasp_params = overall_vasp_params - + def modify_calc_according_to_structure_type(self): - assert self.structure_type in ['zeo','mof','metal','gas-phase'], "Unknown structure_type = %s" % self.structure_type - if self.structure_type == 'zeo' or self.structure_type == 'mof': + assert self.structure_type in ["zeo", "mof", "metal", "gas-phase"], ( + "Unknown structure_type = %s" % self.structure_type + ) + if self.structure_type == "zeo" or self.structure_type == "mof": pass - elif self.structure_type == 'metal': - self.calc_default.set(sigma=0.2,ismear=1) - elif self.structure_type == 'gas-phase': - self.calc_default.set(kpts=(1,1,1),lreal=False) - - def set_calculation_type(self,calculation_type): - assert self.calculation_type in ['spe','opt','opt_fine'], "Unknown calculation_type = %s" % self.calculation_type + elif self.structure_type == "metal": + self.calc_default.set(sigma=0.2, ismear=1) + elif self.structure_type == "gas-phase": + self.calc_default.set(kpts=(1, 1, 1), lreal=False) + + def set_calculation_type(self, calculation_type): + assert self.calculation_type in ["spe", "opt", "opt_fine"], ( + "Unknown calculation_type = %s" % self.calculation_type + ) self.calculation_type = calculation_type - - def set_structure(self,atoms_or_traj): + + def set_structure(self, atoms_or_traj): if isinstance(atoms_or_traj, Atoms): atoms = atoms_or_traj - self.structure = atoms - self.allowed_calculation_types = ['opt','opt_fine','vib'] + self.structure = atoms + self.allowed_calculation_types = ["opt", "opt_fine", "vib"] self.structure_istraj = False - if isinstance(atoms_or_traj, list) and isinstance(atoms_or_traj[0], Atoms): - #print('Dealing with an traj object') + if isinstance(atoms_or_traj, list) and isinstance(atoms_or_traj[0], Atoms): + # print('Dealing with an traj object') traj = atoms_or_traj self.structure = traj - self.allowed_calculation_types = ['neb'] + self.allowed_calculation_types = ["neb"] self.structure_istraj = True - + def get_structure(self): return self.structure - - def _change_to_dir(self,dir_name): + + def _change_to_dir(self, dir_name): if not os.path.exists(dir_name): os.makedirs(dir_name) os.chdir(dir_name) - def run_dft(self,atoms,dir_name): + def run_dft(self, atoms, dir_name): atoms.set_calculator(self.calc) atoms.calc.set(**self.overall_vasp_params) - if self.calculation_type == 'opt' or self.calculation_type == 'vib': - encut_for_dir = atoms.calc.float_params['encut'] - kpts_for_dir = ''.join([str(val) for val in atoms.calc.input_params['kpts']]) - func_for_dir = atoms.calc.input_params['xc'] - directory = dir_name + '_' + str(func_for_dir) + '_' + str(encut_for_dir) + '_' + str(kpts_for_dir) + if self.calculation_type == "opt" or self.calculation_type == "vib": + encut_for_dir = atoms.calc.float_params["encut"] + kpts_for_dir = "".join( + [str(val) for val in atoms.calc.input_params["kpts"]] + ) + func_for_dir = atoms.calc.input_params["xc"] + directory = ( + dir_name + + "_" + + str(func_for_dir) + + "_" + + str(encut_for_dir) + + "_" + + str(kpts_for_dir) + ) self._change_to_dir(directory) - energy = atoms.get_potential_energy() # Run vasp here - os.chdir(self.working_dir) + energy = atoms.get_potential_energy() # Run vasp here + os.chdir(self.working_dir) # Check for convergence after optimization - #f = atoms.get_forces() - #forces=np.sqrt(np.square(f[:,0]) +np.square(f[:,1]) + np.square(f[:,2])) - #max_forces = max(forces) - #magmoms = atoms.get_magnetic_moments() - #mag_oszi = atoms.get_magnetic_moment() - return (atoms) - + # f = atoms.get_forces() + # forces=np.sqrt(np.square(f[:,0]) +np.square(f[:,1]) + np.square(f[:,2])) + # max_forces = max(forces) + # magmoms = atoms.get_magnetic_moments() + # mag_oszi = atoms.get_magnetic_moment() + return atoms + def run(self): - if self.calculation_type == 'opt': - self.structure_after = self.run_opt()#atoms,dir_name) - elif self.calculation_type == 'opt_fine': + if self.calculation_type == "opt": + self.structure_after = self.run_opt() # atoms,dir_name) + elif self.calculation_type == "opt_fine": self.structure_after = self.run_opt_fine() - elif self.calculation_type == 'vib': + elif self.calculation_type == "vib": self.structure_after = self.run_vib() - elif self.calculation_type == 'solv': + elif self.calculation_type == "solv": self.structure_after = self.run_solv() - elif self.calculation_type == 'md': + elif self.calculation_type == "md": self.structure_after = self.run_md() def run_spe(self): """Runs a simple single point energy""" atoms = self.structure - dir_name = 'spe' + dir_name = "spe" self.calc = self.calc_default self.calc.set(nsw=0) - new_atoms = self.run_dft(atoms,dir_name) + new_atoms = self.run_dft(atoms, dir_name) return new_atoms - + def run_opt(self): """Runs a simple optimization""" atoms = self.structure self.calc = self.calc_default - dir_name = 'opt' - new_atoms = self.run_dft(atoms,dir_name) + dir_name = "opt" + new_atoms = self.run_dft(atoms, dir_name) return new_atoms - + def run_opt_fine(self): """Runs a finer optimization""" atoms = self.structure - dir_name = 'opt_fine' + dir_name = "opt_fine" self.calc = self.calc_default - self.calc.set(ibrion=1, potim = 0.05, nsw = 50, ediffg=-0.03) - new_atoms = self.run_dft(atoms,dir_name) + self.calc.set(ibrion=1, potim=0.05, nsw=50, ediffg=-0.03) + new_atoms = self.run_dft(atoms, dir_name) return new_atoms - + def run_vib(self): """Runs a simple vib calculation""" atoms = self.structure - dir_name = 'vib' + dir_name = "vib" self.calc = self.calc_default - self.calc.set(ibrion=5,potim=0.02,nsw=1) - new_atoms = self.run_dft(atoms,dir_name) + self.calc.set(ibrion=5, potim=0.02, nsw=1) + new_atoms = self.run_dft(atoms, dir_name) return new_atoms - - def run_solv(self,lrho=False): + + def run_solv(self, lrho=False): """Runs a simple solvation calculation""" atoms = self.structure - dir_name = 'spe' + dir_name = "spe" if not os.path.exists(dir_name): os.makedirs(dir_name) self.calc = self.calc_default - self.calc.set(potim=0.0,nsw=5,lwave=True,lsol=False,prec='Accurate') - new_atoms = self.run_dft(atoms,dir_name) - + self.calc.set(potim=0.0, nsw=5, lwave=True, lsol=False, prec="Accurate") + new_atoms = self.run_dft(atoms, dir_name) + atoms = new_atoms - dir_name = 'solv-spe' + dir_name = "solv-spe" if not os.path.exists(dir_name): os.makedirs(dir_name) self.calc = self.calc_default - shutil.copyfile('spe/WAVECAR','solv-spe/WAVECAR') - self.calc.set(potim=0.0,nsw=3,lwave=True,lsol=True,prec='Accurate') - new_atoms = self.run_dft(atoms,dir_name) - - if lrho: + shutil.copyfile("spe/WAVECAR", "solv-spe/WAVECAR") + self.calc.set(potim=0.0, nsw=3, lwave=True, lsol=True, prec="Accurate") + new_atoms = self.run_dft(atoms, dir_name) + + if lrho: atoms = new_atoms - dir_name = 'solv-spe-rho' + dir_name = "solv-spe-rho" if not os.path.exists(dir_name): os.makedirs(dir_name) self.calc = self.calc_default - shutil.copyfile('spe-spe/WAVECAR','solv-spe-rho/WAVECAR') - self.calc.set(potim=0.0,nsw=0,lwave=True,lsol=True,prec='Accurate',lrhob=True,lrhoion=True) - new_atoms = self.run_dft(atoms,dir_name) - + shutil.copyfile("spe-spe/WAVECAR", "solv-spe-rho/WAVECAR") + self.calc.set( + potim=0.0, + nsw=0, + lwave=True, + lsol=True, + prec="Accurate", + lrhob=True, + lrhoion=True, + ) + new_atoms = self.run_dft(atoms, dir_name) + return new_atoms - + def run_md(self): """Runs a finer optimization""" atoms = self.structure - dir_name = 'md' + dir_name = "md" self.calc = self.calc_default - self.calc.set(nsw=100000,ibrion=0,tebeg=298, isif=2, smass=0) - new_atoms = self.run_dft(atoms,dir_name) + self.calc.set(nsw=100000, ibrion=0, tebeg=298, isif=2, smass=0) + new_atoms = self.run_dft(atoms, dir_name) return new_atoms - - - -# if not 'solv-opt' in mode and not 'solv-spe' in mode: -# print('ERROR: Check mode') -# sys.exit() -# cwd = os.getcwd() -# if 'opt' in mode: -# dir_name = 'opt' -# my_nsw = 100 -# elif 'spe' in mode: -# dir_name = 'spe' -# my_nsw = 0 -# atoms = opt(atoms,dir_name=dir_name,lwave=True,lsol=False,nsw=my_nsw) -# -# directory = mode #solv-spe or solv-opt -# if not os.path.exists(directory): -# os.makedirs(directory) -# os.chdir(directory) -# shutil.copyfile('../spe/WAVECAR','WAVECAR') -# atoms = opt(atoms,dir_name='solv-spe',nsw=0,lwave=False,lsol=True) + + # if not 'solv-opt' in mode and not 'solv-spe' in mode: + # print('ERROR: Check mode') + # sys.exit() + # cwd = os.getcwd() + # if 'opt' in mode: + # dir_name = 'opt' + # my_nsw = 100 + # elif 'spe' in mode: + # dir_name = 'spe' + # my_nsw = 0 + # atoms = opt(atoms,dir_name=dir_name,lwave=True,lsol=False,nsw=my_nsw) + # + # directory = mode #solv-spe or solv-opt + # if not os.path.exists(directory): + # os.makedirs(directory) + # os.chdir(directory) + # shutil.copyfile('../spe/WAVECAR','WAVECAR') + # atoms = opt(atoms,dir_name='solv-spe',nsw=0,lwave=False,lsol=True) def run_specific_calcualtion_type(): - if self.calculation_type == 'opt': + if self.calculation_type == "opt": atoms = run_opt() - elif self.calculation_type == 'opt_fine': + elif self.calculation_type == "opt_fine": atoms = run_opt_fine() - elif self.calculation_type == 'vib': + elif self.calculation_type == "vib": atoms = run_vib() - elif self.calculation_type == 'solv': + elif self.calculation_type == "solv": atoms = run_vib() - - if 'solv' in mode: - if not 'solv-opt' in mode and not 'solv-spe' in mode: - print('ERROR: Check mode') + + if "solv" in mode: + if not "solv-opt" in mode and not "solv-spe" in mode: + print("ERROR: Check mode") sys.exit() cwd = os.getcwd() - if 'opt' in mode: - dir_name = 'opt' + if "opt" in mode: + dir_name = "opt" my_nsw = 100 - elif 'spe' in mode: - dir_name = 'spe' + elif "spe" in mode: + dir_name = "spe" my_nsw = 0 - atoms = opt(atoms,dir_name=dir_name,lwave=True,lsol=False,nsw=my_nsw) - - directory = mode #solv-spe or solv-opt + atoms = opt(atoms, dir_name=dir_name, lwave=True, lsol=False, nsw=my_nsw) + + directory = mode # solv-spe or solv-opt if not os.path.exists(directory): os.makedirs(directory) os.chdir(directory) - shutil.copyfile('../spe/WAVECAR','WAVECAR') - atoms = opt(atoms,dir_name='solv-spe',nsw=0,lwave=False,lsol=True) - + shutil.copyfile("../spe/WAVECAR", "WAVECAR") + atoms = opt(atoms, dir_name="solv-spe", nsw=0, lwave=False, lsol=True) + os.chdir(cwd) - - - - # vibrations - if 'vib' in mode and 'ts' not in mode and 'isolated' not in mode: + + # vibrations + if "vib" in mode and "ts" not in mode and "isolated" not in mode: atoms = apply_constraints(atoms) atoms = vib_workflow(atoms, **kwargs) - elif 'vib' in mode and 'ts' in mode: - atoms = apply_constraints(atoms) - atoms = vib_workflow(atoms,type_vib='ts',**kwargs) - elif 'vib' in mode and 'isolated' in mode: - atoms = vib_workflow(atoms,type_vib='isolated', **kwargs) - - # dimer - if mode == 'dimer': - if not os.path.exists('NEWMODECAR'): - atoms = io.read('dimer_start.traj') + elif "vib" in mode and "ts" in mode: + atoms = apply_constraints(atoms) + atoms = vib_workflow(atoms, type_vib="ts", **kwargs) + elif "vib" in mode and "isolated" in mode: + atoms = vib_workflow(atoms, type_vib="isolated", **kwargs) + + # dimer + if mode == "dimer": + if not os.path.exists("NEWMODECAR"): + atoms = io.read("dimer_start.traj") atoms = apply_constraints(atoms) - dimer(atoms) - else: - atoms = io.read('CENTCAR',format='vasp') - shutil.copyfile('NEWMODECAR', 'MODECAR') - shutil.copyfile('OUTCAR', 'OUTCAR.bak') - shutil.copyfile('vasprun.xml', 'vasprun.xml.bak') - + dimer(atoms) + else: + atoms = io.read("CENTCAR", format="vasp") + shutil.copyfile("NEWMODECAR", "MODECAR") + shutil.copyfile("OUTCAR", "OUTCAR.bak") + shutil.copyfile("vasprun.xml", "vasprun.xml.bak") + atoms = apply_constraints(atoms) dimer(atoms) - + return atoms - From d1b43c05a1b149f1502a8560b2f15ab0d6ed9cfd Mon Sep 17 00:00:00 2001 From: saurabhsivakumar Date: Tue, 15 Feb 2022 14:08:15 -0800 Subject: [PATCH 19/21] changed function names --- KulTools/kt_structure.py | 16 ++++++++-------- KulTools/run_Kultools.py | 11 ++++------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/KulTools/kt_structure.py b/KulTools/kt_structure.py index 68969ae..3a73695 100644 --- a/KulTools/kt_structure.py +++ b/KulTools/kt_structure.py @@ -10,18 +10,18 @@ def __init__(self, structure, structure_type, calculator_name, calculation_type) self.calc_name = calculator_name self.calculation_type = calculation_type - self.check_calculator_name() - self.load_default_calc_params() - self.check_structure_type() - self.check_calc_type() + self._check_calculator_name() + self._load_default_calc_params() + self._check_structure_type() + self._check_calc_type() - def check_calculator_name(self): + def _check_calculator_name(self): assert self.calc_name.lower() in ["vasp", "emt"], ( "Unknown/Not implemented calculator name = %s" % self.calc_name ) - def load_default_calc_params(self): + def _load_default_calc_params(self): if self.calc_name.lower() == "vasp": self.default_calc_params = self.load_default_vasp() @@ -29,7 +29,7 @@ def load_default_calc_params(self): else: pass - def check_structure_type(self): + def _check_structure_type(self): if self.calculation_type.lower() == "neb": assert isinstance(self.structure, list) and isinstance( @@ -43,7 +43,7 @@ def check_structure_type(self): "Unknown structure_type = %s" % self.structure_type ) - def check_calc_type(self): + def _check_calc_type(self): assert self.calculation_type.lower() in [ "spe", diff --git a/KulTools/run_Kultools.py b/KulTools/run_Kultools.py index a77642d..d6e781f 100644 --- a/KulTools/run_Kultools.py +++ b/KulTools/run_Kultools.py @@ -1,5 +1,5 @@ from copy import copy - +from KT_object import KT_Object class run_KulTools(KT_Object): @@ -7,9 +7,6 @@ def __init__(self,gamma_only,structure,structure_type,calculator_name,calculatio super().__init__(gamma_only,structure,structure_type,calculator_name,calculation_type,calc_params) - self.run_calculation() - - def run_calculation(self): if self.calculation_type.lower() == 'opt': @@ -18,7 +15,7 @@ def run_calculation(self): elif else - def run_opt(self): + def _run_opt(self): ase_atoms = copy.deepcopy(self.structure) dir_name = 'opt' @@ -27,8 +24,8 @@ def run_opt(self): self.ase_calculator.set('directory':os.getwd()) ase_atoms.set_calculator(self.ase_calculator) - energy = atoms.get_potential_energy() + energy = ase_atoms.get_potential_energy() - new_atoms = self.run_dft(atoms,dir_name) + new_atoms = self.run_dft(ase_atoms,dir_name) return new_atoms From 46eac447a8990872f233d92c14dc0259c69b15c2 Mon Sep 17 00:00:00 2001 From: saurabhsivakumar Date: Tue, 15 Feb 2022 14:19:55 -0800 Subject: [PATCH 20/21] ktobject changes + fixes --- .pre-commit-config.yaml | 2 +- KulTools/KT_object.py | 30 +++++++++++++++++++----------- KulTools/load_environ.py | 17 +++++++++-------- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index eb97226..bb0de12 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,4 +10,4 @@ repos: - id: flake8 - id: trailing-whitespace - id: check-added-large-files - - id: end-of-file-fixer \ No newline at end of file + - id: end-of-file-fixer diff --git a/KulTools/KT_object.py b/KulTools/KT_object.py index 2c661b9..a796015 100644 --- a/KulTools/KT_object.py +++ b/KulTools/KT_object.py @@ -21,7 +21,7 @@ class calculation_type(custom_params): from kt_structure import KT_structure from ase.calculators.vasp import Vasp -from load_environ import identify_hpc_cluster, identify_vasp_eviron +from load_environ import identify_hpc_cluster, identify_vasp_environ class KT_Object(KT_structure): @@ -41,18 +41,26 @@ def __init__( self.user_params = calc_params self.kt_params = {} + self._set_environment_variables() + if self.calc_name.lower() == "vasp": - self.load_structure_type_params_vasp() - self.load_calc_type_params_vasp() + self._load_structure_type_params_vasp() + self._load_calc_type_params_vasp() + + self._load_update_kt_params() - self.load_update_kt_params() + self._init_ase_calc() - self.init_ase_calc() + def _set_environment_variables(self): + if self.calc_name.lower() == "vasp": + self.hpc = identify_hpc_cluster() + print("ENVIRONMENT VARIABLES ARE AT:") + print(identify_vasp_environ(self.hpc, self.gamma)) - self.hpc = identify_hpc_cluster() - identify_vasp_eviron(self.hpc, self.gamma) + else: + pass - def load_structure_type_params_vasp(self): + def _load_structure_type_params_vasp(self): if self.structure_type.lower() == "metal": self.default_calc_params.update({"sigma": 0.2, "ismear": 1}) @@ -63,7 +71,7 @@ def load_structure_type_params_vasp(self): else: pass - def load_calc_type_params_vasp(self): + def _load_calc_type_params_vasp(self): if self.calculation_type.lower() == "spe": self.default_calc_params.update({"nsw": 0}) @@ -120,11 +128,11 @@ def load_calc_type_params_vasp(self): else: pass - def load_update_kt_params(self): + def _load_update_kt_params(self): self.default_calc_params.update(self.user_params) self.kt_params = self.default_calc_params - def init_ase_calc(self): + def _init_ase_calc(self): if self.calc_name.lower() == "vasp": self.ase_calculator = Vasp() else: diff --git a/KulTools/load_environ.py b/KulTools/load_environ.py index 149021c..014354a 100644 --- a/KulTools/load_environ.py +++ b/KulTools/load_environ.py @@ -20,12 +20,12 @@ def identify_hpc_cluster(): return host_name -def identify_vasp_eviron(hpc, gamma_only): +def identify_vasp_environ(hpc, gamma_only): if hpc.lower() == "hpc1": os.environ[ "VASP_PP_PATH" ] = "/home/ark245/programs/vasp5.4.4/pseudopotentials/pseudo54" - if self.gamma_only: + if gamma_only: vasp_exe = "vasp_gam" else: vasp_exe = "vasp_std" @@ -38,7 +38,7 @@ def identify_vasp_eviron(hpc, gamma_only): os.environ[ "VASP_PP_PATH" ] = "/home/sours/programs/vasp_PP" # '/home/ark245/programs/pseudopotentials/pseudo54' - if self.gamma_only: + if gamma_only: vasp_exe = "vasp_gam" else: vasp_exe = "vasp_std" @@ -50,7 +50,7 @@ def identify_vasp_eviron(hpc, gamma_only): elif hpc.lower() == "cori": os.environ["VASP_PP_PATH"] = "/global/homes/a/ark245/pseudopotentials/PBE54" - if self.gamma_only: + if gamma_only: vasp_exe = "vasp_gam" else: vasp_exe = "vasp_std" @@ -61,7 +61,7 @@ def identify_vasp_eviron(hpc, gamma_only): elif hpc.lower() == "stampede": os.environ["VASP_PP_PATH"] = "/home1/05364/ark245/pseudopotentials/PBE54" - if self.gamma_only: + if gamma_only: vasp_exe = "vasp_gam_vtst" else: vasp_exe = "vasp_std_vtst" @@ -72,7 +72,7 @@ def identify_vasp_eviron(hpc, gamma_only): elif hpc.lower() == "local": os.environ["VASP_PP_PATH"] = "local_vasp_pp" - if self.gamma_only: + if gamma_only: vasp_exe = "vasp_gam" else: vasp_exe = "vasp_std" @@ -80,5 +80,6 @@ def identify_vasp_eviron(hpc, gamma_only): else: print("Check cluster settings") sys.exit() - self.vasp_pp_path = os.environ["VASP_PP_PATH"] - self.vasp_command = os.environ["VASP_COMMAND"] + vasp_pp_path = os.environ["VASP_PP_PATH"] + vasp_command = os.environ["VASP_COMMAND"] + return vasp_pp_path, vasp_command From 7383bfe85f606e6ed9ff592b496a345e1771f6e5 Mon Sep 17 00:00:00 2001 From: saurabhsivakumar Date: Mon, 21 Feb 2022 11:30:41 -0800 Subject: [PATCH 21/21] minor changes --- KulTools/kt_structure.py | 3 ++- KulTools/run_Kultools.py | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/KulTools/kt_structure.py b/KulTools/kt_structure.py index 3a73695..cd9a255 100644 --- a/KulTools/kt_structure.py +++ b/KulTools/kt_structure.py @@ -40,7 +40,8 @@ def _check_structure_type(self): assert isinstance(self.structure, Atoms), "Not an ASE atoms object" assert self.structure_type.lower() in ["zeo", "mof", "metal", "gas-phase"], ( - "Unknown structure_type = %s" % self.structure_type + "Unknown structure_type = %s" + % self.structure_type # Add insulating slab , conducting slab and gas-phase no need for metal ) def _check_calc_type(self): diff --git a/KulTools/run_Kultools.py b/KulTools/run_Kultools.py index d6e781f..c85a6aa 100644 --- a/KulTools/run_Kultools.py +++ b/KulTools/run_Kultools.py @@ -10,8 +10,9 @@ def __init__(self,gamma_only,structure,structure_type,calculator_name,calculatio def run_calculation(self): if self.calculation_type.lower() == 'opt': - self.run_opt() - elif + self._run_opt() + elif self.calculation_type.lower() == 'vib': + self._run_vib() elif else @@ -24,7 +25,7 @@ def _run_opt(self): self.ase_calculator.set('directory':os.getwd()) ase_atoms.set_calculator(self.ase_calculator) - energy = ase_atoms.get_potential_energy() + energy = ase_atoms.get_potential_energy() #Running vasp new_atoms = self.run_dft(ase_atoms,dir_name)