psi88
|
README,
examples,
fchk2psi,
fchk2psi.txt,
g2psi,
g2psi.txt,
posting,
psi88.doc,
psi88.tar.Z,
src,
unix,
update.note,
vms
|
|
|
#!/bin/sh
# @(#) g2psi: extracts coordinates and MO coefficients
# and generates psi88 input files (i.e., psi1, psi2 and psicon).
# Molecular coordinates are extracted from the last occurrence
# of "Standard orientation". If the "Standard orientation" does
# not exist, "Z-Matrix orientation" is extracted instead.
# Molecule orbital coefficients are extracted from the last
# occurrence of "Molecular Orbital Coefficients".
printUsage() {
echo "Usage: `basename $0` file1[.log] file2[.log] ..."
echo ""
echo ' g2psi extracts Standard orientation (or Z-Matrix orientation,'
echo ' if Standard orientaion does not exist) of molecular coordinates'
echo ' and MO coefficients from Gaussin output, and then generates'
echo ' psi88 input files (i.e., psi1, psi2 and psicon).'
echo ' Molecular coordinates are extracted from the last occurrence'
echo ' of "Standard orientation" (or "Z-Matrix orientation").'
echo ' Molecule orbital coefficients are extracted from the last'
echo ' occurrence of "Molecular Orbital Coefficients".'
}
if [ $# = 0 ]; then printUsage; exit; fi
for FILE in $*
do
BASE=`basename "$FILE" '\.log'`
DIR=`dirname "$FILE"`
if [ ! -r "$FILE" ]
then
if [ ! -r "${FILE}.log" ]
then echo "File $FILE does not exist."; continue;
else FILE=${FILE}.log
fi
fi
nawk '
BEGIN {
psi1 = "'$BASE'.psi1";
psi2 = "'$BASE'.psi2";
psicon = "'$BASE'.psicon";
eigen = 0;
nbasis = 0;
basis = "";
ndata = 0;
natoms = 0;
nmo = 0;
number = "^[-+]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eE][-+]?[0-9]+)?$"
}
/Standard basis:/ {
basis = $3;
next;
}
# Standard orientation (or Z-Matrix orientation) is used for overlapping MO.
# Since "Standard orientation" always appears after "Z-Matrix orientation",
# the former is always used if it exists.
/(Standard orientation|Z-Matrix orientation)/ {
natoms = 0;
getline; getline; getline; getline;
while (1) {
getline;
if (match($0, "---")) break;
if ($2 <= 0 + 0) continue;
natoms++;
an[natoms] = $2;
coord[natoms,1] = $3;
coord[natoms,2] = $4;
coord[natoms,3] = $5;
}
next;
}
# there can be multiple MO coefficients block, e.g., OPT=CALCALL
/Molecular Orbital Coefficients/ {
nmo++;
ndata = 0;
norbs = 0;
nbasis = 0;
if (nmo > 1 + 0) {
close(tmppsi);
cmd = sprintf("rm %s", tmppsi);
system(cmd);
}
tmppsi = sprintf("%s.tmppsi%d", "'$BASE'", nmo);
print_psi1_coord(coord, an, natoms, basis, tmppsi);
next;
}
/EIGENVALUES --/ {
eigen = 1;
nf = 0;
# count the number of eigenvalues in this line
for(i=1;i<=5;i++) {
eigval = substr($0,(i+1)*10+2,10);
if (eigval != " " && eigval != "") nf++;
}
norbs += nf;
next;
}
eigen == 0 {next}
{
# store MO coefficients in a temporary file
for(i=1;i<=nf;i++) coeff[i] = substr($0,(i+1)*10+2,10) + 0.0;
if (substr($0, 0, 4) == " ") {
for(j=1;j<=nf;j++) {
for(i=1;i<=nbasis;i++) {
ndata++;
printf("% 10.6f", mo[j,i]) > tmppsi
if (ndata%8==0+0) printf("\n") > tmppsi
}
}
eigen = 0;
nbasis = 0;
next;
}
nbasis++;
for(i=1;i<=nf;i++) mo[i,nbasis] = coeff[i];
}
END {
if (natoms == 0) {
printf("\007!!!!! Standard of Z-Matrix orientation is not found. !!!!!\n");
exit;
}
#psi1
printf("\n") > tmppsi
cmd = sprintf("%s %s %s", "mv", tmppsi, psi1);
system(cmd);
#psicon
printf("%s\n", basis) > psicon
printf(" 1 1 0 1\n") > psicon
printf(" 0.075000\n") > psicon
#psi2
printf("TITLE\n") > psi2
printf("SUBTITLE\n") > psi2
printf("010000 1.0\n") > psi2
printf("00\n") > psi2
printf("0 COMMENT GOES HERE\n") > psi2
print_coord(coord, an, natoms, psi2);
printf("99\n") > psi2
printf(" 61.1000 132.1000 1.1000 0.8500\n") > psi2
printf("02\n") > psi2
}
function print_psi1_coord (coord, an, natoms, basis, file, i) {
printf("%s\n", basis) > file
printf("AUTO0\n") > file
printf("0101 1.0\n") > file
printf("0\n") > file
print_coord(coord, an, natoms, file)
printf("99\n") > file
}
function print_coord (coord, an, natoms, file, i)
{
for(i=1;i<=natoms;i++) {
printf("%2d % 10.6f% 10.6f% 10.6f\n",
an[i], coord[i,1], coord[i,2], coord[i,3]) > file
}
}
' $FILE
done
|