9
1
mirror of https://github.com/QuantumPackage/qp2.git synced 2024-10-12 10:51:31 +02:00
qp2/bin/qp_set_frozen_core

123 lines
3.6 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Automatically finds n, the number of core electrons. Calls qp_set_mo_class
setting all MOs as Active, except the n/2 first ones which are set as Core.
If pseudo-potentials are used, all the MOs are set as Active.
Usage:
qp_set_frozen_core [-q|--query] [(-l|-s|-u|--large|--small|--unset)] EZFIO_DIR
Options:
-q --query Prints in the standard output the number of frozen MOs
-l --large Use a small core
-s --small Use a large core
-u --unset Unset frozen core
Default numbers of frozen electrons:
========== ========= ======= =======
Range Default Small Large
========== ========= ======= =======
H -> He 0 0 0
Li -> Be 0 0 2
B -> Ne 2 2 2
Na -> Mg 2 2 10
Al -> Ar 10 2 10
K -> Ca 10 10 18
Sc -> Zn 10 10 18
Ga -> Kr 18 10 18
Rb -> Sr 18 18 36
Y -> Cd 18 18 36
In -> Xe 36 18 36
Cs -> Ba 36 36 54
La -> Hg 36 36 54
Tl -> Rn 54 36 54
Fr -> Ra 54 54 86
Ac -> Cn 54 54 86
Nh -> Og 86 54 86
========== ========= ======= =======
"""
import os
import sys
import os.path
try:
import qp_path
except ImportError:
print("source quantum_package.rc")
raise
from docopt import docopt
from ezfio import ezfio
def main(arguments):
"""Main function"""
filename = arguments["EZFIO_DIR"]
ezfio.set_filename(filename)
n_frozen = 0
try:
do_pseudo = ezfio.pseudo_do_pseudo
except:
do_pseudo = False
if not do_pseudo:
if arguments["--large"]:
for charge in ezfio.nuclei_nucl_charge:
if charge <= 2: pass
elif charge <= 10: n_frozen += 1
elif charge <= 18: n_frozen += 5
elif charge <= 36: n_frozen += 9
elif charge <= 54: n_frozen += 18
elif charge <= 86: n_frozen += 27
elif charge <= 118: n_frozen += 43
elif arguments["--small"]:
if charge <= 4: pass
elif charge <= 18: n_frozen += 1
elif charge <= 36: n_frozen += 5
elif charge <= 54: n_frozen += 9
elif charge <= 86: n_frozen += 18
elif charge <= 118: n_frozen += 27
elif arguments["--unset"]:
n_frozen = 0
else: # default
for charge in ezfio.nuclei_nucl_charge:
if charge <= 4: pass
elif charge <= 12: n_frozen += 1
elif charge <= 30: n_frozen += 5
elif charge <= 48: n_frozen += 9
elif charge <= 80: n_frozen += 18
elif charge <= 112: n_frozen += 27
mo_num = ezfio.mo_basis_mo_num
if arguments["--query"]:
print(n_frozen)
sys.exit(0)
if n_frozen == 0:
os.system("""qp_set_mo_class -a "[1-%d]" %s""" %
(mo_num, filename))
else:
os.system("""qp_set_mo_class -c "[1-%d]" -a "[%d-%d]" %s""" %
(n_frozen, n_frozen+1, mo_num, filename))
if __name__ == '__main__':
ARGUMENTS = docopt(__doc__)
main(ARGUMENTS)