Subject: extracting normal modes from gaussian output

From: Dongchul Lim <[email-masked]>
Date: Mon, 28 Feb 94 1:36:17 EST

Dear netters,
There was a PERL utility which extracts vibratinal modes
(for XMOL input) from gaussian frequency calculation output.
This works perfect but I wrote it in AWK so that
people who don't have PERL can use it.
I guess this version will be more readable than PERL code.
Do whatever you want with this.
-DL

<PS> I never used XMOL before. If the output doesn't work for
     XMOL, please let me know.

------------------- CUT HERE -------------------------------------------------
#!/usr/bin/nawk -f
# @(#) g92vib: extracts vibrational modes from gaussian output for XMOL
# Dongchul Lim, [email-masked]
# Usage: g92vib filename

BEGIN {
	# initialize atomic symbols (add more rows if you need beyond Kr)
	nrows = 0;
	row[++nrows] = "H                                                  He";
	row[++nrows] = "Li Be                               B  C  N  O  F  Ne";
	row[++nrows] = "Na Mg                               Al Si P  S  Cl Ar";
	row[++nrows] = "K  Ca Sc Ti V  Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr";
	for(i=1;i<=nrows;i++) {
		n = split(row[i], s, " ");
		for(j=1;j<=n;j++) symbol[nsymbol+j] = s[j];
		nsymbol += n;
	}
	natoms = 0;
}

# get either Z-Matrix orientation or Standard orientation.
# if both are present, Standard orientation will be used, since
# it is found later than Z-Matrix orientation in Gaussian output.

/(Z-Matrix orientation:|Standard orientation:)/	{
	natoms = 0;
	for(i=1;i<=4;i++) getline;	# skip 4 lines
	while (1) {
		getline;
		if (match($0, "---")) break;
		if ($2 <= 0) continue;	# skip dummies
		natoms++;
		an[natoms] = $2;
		x[natoms]  = $3;
		y[natoms]  = $4;
		z[natoms]  = $5;
	}
	next;
}

# look for Harmonic frequencies
/Harmonic frequencies/	{
	if (natoms == 0 ) {
		printf("Standard orientation / Z-Matrix orientation not found.\n");
		exit;
	}

	# skip two lines
	getline; getline;

	nfreq = 0;
	while (1) {
		getline;
		if (match($0, "Harmonic") != 0) break;
		getline;

		# read in frequencies
		getline;
		nf = split(substr($0, 24), freq, " ");

		# skip 6 lines
		for(i=1;i<=6;i++) getline;

		# read in normal mode vectors
		for(i=1;i<=natoms;i++) {
			getline;
			for(j=1;j<=nf;j++) xmode[i,j] = $(j+3);
			getline;
			for(j=1;j<=nf;j++) ymode[i,j] = $(j+3);
			getline;
			for(j=1;j<=nf;j++) zmode[i,j] = $(j+3);
		}

		# print out coords and normval mode vectors for each mode
		for(i=1;i<=nf;i++) {
			nfreq++;
			file = sprintf("%s.nu%02d", FILENAME, nfreq);
			printf("%d\n", natoms) > file
			printf("NU=%.3f\n", freq[i]) > file
			for(j=1;j<=natoms;j++) {
				sym = (an[j] <= 0 || an[j] > nsymbol) ? "X" : symbol[an[j]];
				printf(" %2s % 12.6f % 12.6f % 12.6f % 12.6f % 12.6f % 12.6f\n",
				sym, x[j], y[j], z[j], xmode[j,i], ymode[j,i], zmode[j,i]) > file
			}
			close(file);
		}
	}
	exit;
}

------------------- CUT HERE -------------------------------------------------