#!/usr/local/bin/perl # Script to extract nomrmal modes from the DGAUSS output file. # Now how the data are printed? They are printed as required by xmol # to display frequences. Each normal mode is printed as a separate file # with an extension nu1 ... nu(3N-6). The root of file name is taken from # as everything from the beginning of output file name from GAUSSIAN up to # first period. The OUT file name from DGAUSS is given on the command line. # # search for line '---------- Optimization has converged ----------' # search for line 'Final Coordinates File: DOptx' # next line is no of atoms # next n_at lines are: # At. numb X Y Z (in angastroms) # search for line 'Mass weighted Cartesian displacement vectors' # what follows has a following structure: # # Mass weighted Cartesian displacement vectors # Vibrational frequencies cm-1 # # # 1 2 3 4 5 6 7 8 9 # # 0.00 0.00 0.00 0.00 0.00 0.00 274.20 277.21 410.79 # # 1 0.0000 0.0000 0.0000 0.0000 0.0000 0.2262 -0.0174 -0.0101 0.0015 # 2 -0.0061 0.0375 -0.1292 0.0503 -0.0626 0.0314 -0.0316 -0.0150 -0.0987 # 3 -0.0820 -0.0799 0.0230 0.0333 -0.1856 0.0063 0.0115 0.0028 0.0619 # 4 0.0299 -0.1387 -0.0505 -0.0420 0.0616 0.0741 0.0628 -0.0249 0.0649 # 5 0.0100 -0.0272 -0.1520 0.0302 -0.0423 -0.0398 0.0124 -0.0182 -0.0391 # 6 -0.1327 -0.0971 -0.0034 0.0411 0.0279 -0.0052 0.0169 -0.0347 -0.0831 # 7 -0.0595 -0.2769 -0.1644 -0.1831 0.1866 0.0080 0.1378 -0.0920 0.0467 # -------- etc---- # # i.e., there is a row of frequences number, then new line, then frequences, # then columns of normal modes (3*N rows, 9 columns) die "You did not give DGAUSS output file name as argument\n" if $#ARGV < 0; die "You need only one parameter --- DGAUSS output file name\n" if $#ARGV > 0; $DGOUT = $ARGV[0]; $DGOUT =~ /([\w\/+#-]+)/; $OUT_root = $1; @at_symbols = ('H ', 'He', 'Li', 'Be', 'B ', 'C ', 'N ', 'O ', 'F ', 'Ne', 'Na', 'Mg', 'Al', 'Si', 'P ', 'S ', 'Cl', 'Ar', 'K ', 'Ca', 'Ti', 'V ', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr', 'X '); open(DGOUT,"<$DGOUT") || die "Could not open $DGOUT\n"; while ($_ = ) { last if ($_ =~ /---------- Optimization has converged ----------/); } #now search for "Final Coordinates File: DOptx" line while () { last if /Final Coordinates File: DOptx/; } #now collect cartesian coordinates in an array $n_at = ; for ($i = 1; $i <= $n_at; $i++) { $line = ; $line =~ /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/; if($1 < $#at_symbols) { $at_symb[$i] = $at_symbols[$1-1]; } else { $at_symb[$i] = $at_symbols[$#at_symbols]; } $at_num[$i] = $1; $x_coor[$i] = $2; $y_coor[$i] = $3; $z_coor[$i] = $4; } #search for line: "Low frequencies ---" which starts frequences block while ($line = ) { last if ($line =~ /Mass weighted Cartesian displacement vectors/); } #skip 5 lines for($i = 1; $i <= 5; $i++) { $line = ; } $n_cols = 3*$n_at-6; #will be decremented by number of processed modes $n_col_num = 0; $first_pass = 1; while($n_cols > 0) { if($n_cols >= 9) { $n_curr_cols = 9; } else { $n_curr_cols = $n_cols; } if($first_pass == 1) { #skip first 6 modes $n_curr_cols = $n_curr_cols - 6; } #get frequences $line = ; chop($line); @vib_freq = split(/[ \t]+/, $line); if($first_pass == 1) { #skip first 6 modes for($i = 1; $i <= 6; $i++) { shift(@vib_freq); } } #open files for modes in the xmol format if($n_curr_cols >= 1) { $k = $n_col_num + 1; # Which frequency we are" $temp = sprintf("%d",$k); $NU1F = $OUT_root . '.nu' . $temp; open(NU1F,">$NU1F") || die "Could not open $NU1F\n"; } #open files for modes in the xmol format if($n_curr_cols >= 2) { $k = $n_col_num + 2; # Which frequency we are" $temp = sprintf("%d",$k); $NU2F = $OUT_root . '.nu' . $temp; open(NU2F,">$NU2F") || die "Could not open $NU2F\n"; } #open files for modes in the xmol format if($n_curr_cols >= 3) { $k = $n_col_num + 3; # Which frequency we are" $temp = sprintf("%d",$k); $NU3F = $OUT_root . '.nu' . $temp; open(NU3F,">$NU3F") || die "Could not open $NU3F\n"; } #open files for modes in the xmol format if($n_curr_cols >= 4) { $k = $n_col_num + 4; # Which frequency we are" $temp = sprintf("%d",$k); $NU4F = $OUT_root . '.nu' . $temp; open(NU4F,">$NU4F") || die "Could not open $NU4F\n"; } #open files for modes in the xmol format if($n_curr_cols >= 5) { $k = $n_col_num + 5; # Which frequency we are" $temp = sprintf("%d",$k); $NU5F = $OUT_root . '.nu' . $temp; open(NU5F,">$NU5F") || die "Could not open $NU5F\n"; } #open files for modes in the xmol format if($n_curr_cols >= 6) { $k = $n_col_num + 6; # Which frequency we are" $temp = sprintf("%d",$k); $NU6F = $OUT_root . '.nu' . $temp; open(NU6F,">$NU6F") || die "Could not open $NU6F\n"; } #open files for modes in the xmol format if($n_curr_cols >= 7) { $k = $n_col_num + 7; # Which frequency we are" $temp = sprintf("%d",$k); $NU7F = $OUT_root . '.nu' . $temp; open(NU7F,">$NU7F") || die "Could not open $NU7F\n"; } #open files for modes in the xmol format if($n_curr_cols >= 8) { $k = $n_col_num + 8; # Which frequency we are" $temp = sprintf("%d",$k); $NU8F = $OUT_root . '.nu' . $temp; open(NU8F,">$NU8F") || die "Could not open $NU8F\n"; } #open files for modes in the xmol format if($n_curr_cols >= 9) { $k = $n_col_num + 9; # Which frequency we are" $temp = sprintf("%d",$k); $NU9F = $OUT_root . '.nu' . $temp; open(NU9F,">$NU9F") || die "Could not open $NU9F\n"; } $i = 0; if($n_curr_cols >= 1) { printf NU1F "%d\nNUDGAUSS=%f\n",$n_at, $vib_freq[1]; } if($n_curr_cols >= 2) { printf NU2F "%d\nNUDGAUSS=%f\n",$n_at, $vib_freq[2]; } if($n_curr_cols >= 3) { printf NU3F "%d\nNUDGAUSS=%f\n",$n_at, $vib_freq[3]; } if($n_curr_cols >= 4) { printf NU4F "%d\nNUDGAUSS=%f\n",$n_at, $vib_freq[4]; } if($n_curr_cols >= 5) { printf NU5F "%d\nNUDGAUSS=%f\n",$n_at, $vib_freq[5]; } if($n_curr_cols >= 6) { printf NU6F "%d\nNUDGAUSS=%f\n",$n_at, $vib_freq[6]; } if($n_curr_cols >= 7) { printf NU7F "%d\nNUDGAUSS=%f\n",$n_at, $vib_freq[7]; } if($n_curr_cols >= 8) { printf NU8F "%d\nNUDGAUSS=%f\n",$n_at, $vib_freq[8]; } if($n_curr_cols >= 9) { printf NU9F "%d\nNUDGAUSS=%f\n",$n_at, $vib_freq[9]; } $line = ; #skip one line; for ($n = 1; $n <= $n_at; $n++) { if($n_curr_cols >= 1) { printf(NU1F " %2s %11.5f %11.5f %11.5f", $at_symb[$n], $x_coor[$n], $y_coor[$n], $z_coor[$n]); } if($n_curr_cols >= 2) { printf(NU2F " %2s %11.5f %11.5f %11.5f", $at_symb[$n], $x_coor[$n], $y_coor[$n], $z_coor[$n]); } if($n_curr_cols >= 3) { printf(NU3F " %2s %11.5f %11.5f %11.5f", $at_symb[$n], $x_coor[$n], $y_coor[$n], $z_coor[$n]); } if($n_curr_cols >= 4) { printf(NU4F " %2s %11.5f %11.5f %11.5f", $at_symb[$n], $x_coor[$n], $y_coor[$n], $z_coor[$n]); } if($n_curr_cols >= 5) { printf(NU5F " %2s %11.5f %11.5f %11.5f", $at_symb[$n], $x_coor[$n], $y_coor[$n], $z_coor[$n]); } if($n_curr_cols >= 6) { printf(NU6F " %2s %11.5f %11.5f %11.5f", $at_symb[$n], $x_coor[$n], $y_coor[$n], $z_coor[$n]); } if($n_curr_cols >= 7) { printf(NU7F " %2s %11.5f %11.5f %11.5f", $at_symb[$n], $x_coor[$n], $y_coor[$n], $z_coor[$n]); } if($n_curr_cols >= 8) { printf(NU8F " %2s %11.5f %11.5f %11.5f", $at_symb[$n], $x_coor[$n], $y_coor[$n], $z_coor[$n]); } if($n_curr_cols >= 9) { printf(NU9F " %2s %11.5f %11.5f %11.5f", $at_symb[$n], $x_coor[$n], $y_coor[$n], $z_coor[$n]); } for ($i = 1; $i <= 3; $i++) { $line = ; chop($line); @modes = split(/[ \t]+/, $line); shift(@modes); # skip numbering if($first_pass == 1) { #skip first 6 modes for ($j = 1; $j <= 6; $j++) { shift(@modes); } } if($n_curr_cols >= 1) { printf NU1F " %10.4f", $modes[1]; } if($n_curr_cols >= 2) { printf NU2F " %10.4f", $modes[2]; } if($n_curr_cols >= 3) { printf NU3F " %10.4f", $modes[3]; } if($n_curr_cols >= 4) { printf NU4F " %10.4f", $modes[4]; } if($n_curr_cols >= 5) { printf NU5F " %10.4f", $modes[5]; } if($n_curr_cols >= 6) { printf NU6F " %10.4f", $modes[6]; } if($n_curr_cols >= 7) { printf NU7F " %10.4f", $modes[7]; } if($n_curr_cols >= 8) { printf NU8F " %10.4f", $modes[8]; } if($n_curr_cols >= 9) { printf NU9F " %10.4f", $modes[9]; } } # for $i if($n_curr_cols >= 1) { printf NU1F "\n"; } if($n_curr_cols >= 2) { printf NU2F "\n"; } if($n_curr_cols >= 3) { printf NU3F "\n"; } if($n_curr_cols >= 4) { printf NU4F "\n"; } if($n_curr_cols >= 5) { printf NU5F "\n"; } if($n_curr_cols >= 6) { printf NU6F "\n"; } if($n_curr_cols >= 7) { printf NU7F "\n"; } if($n_curr_cols >= 8) { printf NU8F "\n"; } if($n_curr_cols >= 9) { printf NU9F "\n"; } } # for $n if($n_curr_cols >= 1) { close(NU1F); } if($n_curr_cols >= 2) { close(NU2F); } if($n_curr_cols >= 3) { close(NU3F); } if($n_curr_cols >= 4) { close(NU4F); } if($n_curr_cols >= 5) { close(NU5F); } if($n_curr_cols >= 6) { close(NU6F); } if($n_curr_cols >= 7) { close(NU7F); } if($n_curr_cols >= 8) { close(NU8F); } if($n_curr_cols >= 9) { close(NU9F); } $n_col_num += $n_curr_cols; $n_cols -= $n_curr_cols; #skip 3 lines to take next batch $line = ; $line = ; $line = ; $first_pass = 0; } # while close(DGOUT);