psi88
|
README,
examples,
fchk2psi,
fchk2psi.txt,
g2psi,
g2psi.txt,
posting,
psi88.doc,
psi88.tar.Z,
src,
unix,
update.note,
vms
|
|
|
#!/usr/bin/nawk -f
# @(#) fchk2psi: extracts molecular coordinates and MO coefficients
# from Gaussian formchekpoint file and creates input files for
# the PSI88 package written by Prof. William Jorgensen and Dr.
# Dan Severance at Yale University.
# To get MO coefficients from Gaussian, specify FORMCHECK=ALL.
#
# Usage: fchk2psi filename
# Author: Dongchul Lim
# Department of Chemistry, Yale University
# lim@rani.chem.yale.edu
BEGIN {
natoms = 0; # number of atoms
nbasis = 0; # number of basis functions
bohr2A = 0.529177; # Bohr to Angstrom conversion factor
number = "^[-+]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eE][-+]?[0-9]+)?$";
getline; # 1st line (ignore)
getline; # 2nd line (contains basis set)
basis = substr($0,35,20); # basis set
sub(/^[ \t]+/, "", basis); # remove preceding spaces and tabs
if (FILENAME == "-") { # standard input
file_psi1 = "tmp.psi1";
file_psi2 = "tmp.psi2";
file_psicon = "tmp.psicon";
} else {
file = FILENAME;
sub(/\.fchk$/, "", file); # replace ".log" by ""
file_psi1 = sprintf("%s.psi1", file);
file_psi2 = sprintf("%s.psi2", file);
file_psicon = sprintf("%s.psicon", file);
}
if (Debug) {
printf("basis = %s\n", basis);
printf("psi1 = %s\n", file_psi1);
printf("psi2 = %s\n", file_psi2);
printf("psicon = %s\n", file_psicon);
}
}
/Number of basis functions/ {
nbasis = substr($0,50,20) + 0;
}
/Number of atoms/ {
natoms = substr($0,50,20) + 0;
}
/Atomic numbers/ {
n = 0;
while (getline > 0 && match($1,number)) {
for(i=1;i<=NF;i++) {n++; an[n] = $i+0;}
}
}
/Current cartesian coordinates/ {
n = 0;
while (getline > 0 && match($1,number)) {
for(i=1;i<=NF;i++) {n++; xyz[n] = $i * bohr2A;}
}
}
/Alpha MO coefficients/ {
print_psi1(xyz, an, natoms, basis, file_psi1);
n = 0;
while (getline > 0 && match($1,number)) {
for(i=1;i<=NF;i++) {
n++;
mo[n] = $i+0;
if (n == 8) {
print_mo(mo,n, file_psi1);
n = 0;
}
}
}
print_mo(mo,n, file_psi1);
}
END {
if (natoms == 0) {
printf("\007No atoms found.\n");
exit;
}
# psi1 has been already printed. So output just psi2 and psicon.
print_psi2(xyz, an, natoms, basis, file_psi2);
print_psicon(basis, file_psicon);
}
function print_mo(mo, n, file, i)
{
for(i=1;i<=n;i++) printf("% 10.6f", mo[i]) > file
if (n>0) printf("\n") > file
}
function print_psi1 (xyz, an, natoms, basis, file)
{
printf("%s\n", basis) > file
printf("AUTO0\n") > file
printf("0101 1.0\n") > file
printf("0\n") > file
print_coord(xyz, an, natoms, file);
printf("99\n") > file
}
function print_coord (xyz, an, natoms, file, i)
{
for(i=0;i file
}
}
function print_psicon (basis, file)
{
printf("%s\n", basis) > file
printf(" 1 1 0 1\n") > file
printf(" 0.075000\n") > file
}
function print_psi2 (xyz, an, natoms, basis, file)
{
printf("%s\n", basis) > file
printf("SUBTITLE\n") > file
printf("010000 1.0\n") > file
printf("00\n") > file
printf("0 COMMENT\n") > file
print_coord(xyz, an, natoms, file);
printf("99\n") > file
printf(" 61.1000 132.1000 1.1000 0.8500\n") > file
printf("02\n") > file
}
|