#!/usr/bin/perl
# read normal modes from a Spartan output file
# determine bond length change between atoms $iatm and $jatm
# for each normal mode
$narg = $#ARGV ;
#$file = shift(@ARGV);    # Extract root file name into pattern
$iatm = -1 ; 
$iatm = shift(@ARGV) ;    # Extract atom number
$file = "output" ;
open(ARC,$file) || die "Can't find file $file\n";
while (<ARC>) {
	if (/coordinates/) { goto data };
	}
data:
   $_ = <ARC> ;
   $_ = <ARC> ;
  $natm = -1 ;
while ( <ARC> ) {
 $natm++ ;
($atom[$natm],$atmno[$natm],$ax[$natm],$ay[$natm],$az[$natm]) = split ;
# print "$atom[$natm];$atmno[$natm];$ax[$natm];$ay[$natm];$az[$natm]\n" ;
   if ( $atom[$natm] eq '' ) { goto endspec } ;
}
endspec:
# determine  neighbors
  for ($k=0 ; $k<5 ; $k++ ) { $idb[$k] = 0 ; $db[$k] = 1000 }
if ( ($iatm > 0) ) {
print ">>> Near neighbors (ang)<<<\n" ;
for ($jatm=1 ; $jatm<$natm ; $jatm++ ) {
  if ( $iatm == $jatm ) { next }
$dx = $ax[$jatm]-$ax[$iatm] ;
$dy = $ay[$jatm]-$ay[$iatm] ;
$dz = $az[$jatm]-$az[$iatm] ;
$d = $dx**2 + $dy**2 + $dz**2 ;
$d = sqrt($d) ;
print "$jatm   $d \n" ;
# keep 5 smallest distances
  for ($k=0 ; $k<5 ; $k++ ) {
   if ( $d <= $db[$k]) {
      for ($m=4 ; $m>$k ; $m--) { $db[$m]=$db[$m-1] ; $idb[$m]=$idb[$m-1] }
   $db[$k]=$d ; $idb[$k]=$jatm ;
   last ;
   } ; # end if $d<=
  } ; # end for $k
} ; # end for $jatm=0
print "==============================================================\n" ;
# print smallest 5
print " Smallest 5 distances from $atom[$iatm] ($iatm):\n" ;
format BIGGEST_TOP =
atom  #   <-> 
_________________________
.
format BIGGEST =
@<<<< (@>>>) @##.####
$atom[$idb[$k]],$idb[$k],$db[$k]
.
  $^ = "BIGGEST_TOP" ; $~ = "BIGGEST" ; $- = 0 ;
  for ($k=0 ; $k<5 ; $k++ ) {
#     print "atom $idb[$k]:  $db[$k]\n" ;
   write ;
  }
print "==============================================================\n" ;
} ; # end if $iatm>0
