Новосибирский институт органической химии им. Н.Н. Ворожцова СО РАН

Лаборатория изучения механизмов органических реакций

portion


#!/usr/bin/perl -ws

our ($h, $help, $kkal, $kJ); # Options

if ($h || $help) {
  (my $prog = $0) =~ s/.*\///;
  print "
Usage: $prog files.xyz

Ищет строки, содержащие Energy <number> в файлах или в stdin и
печатает заселенности по больцману и энтропию смешивания.

Зависимости: Perl

Опции:
-T=298    Температура
       По умолчанию энергии в a.u. (hartree)
-kkal  Энергии в ккал/моль
-kJ    Энергии в кДж/моль\n";
exit;
}

use List::Util qw(sum min);
$T ||= 298;
$factor = 627.5; # default energy unit is a.u. (hartree)
$R = 1.987;

if ($kkal) {
  $factor = 1;
}
elsif ($kJ) {
  $factor = 1/4.184;
}

while (<>) {
  if (m/Energy\s+(-?\d+(?:\.\d+)?)/) {
    push @energy, $1;
  }
}

$min = min(@energy);
#print "Min energy $min\n";

@portions = map {exp(-($_-$min)*$factor*1000/$R/$T)} @energy;
#print "@portions\n";
$sum = sum(@portions);
@portions = map {$_/$sum} @portions;
$Smix = -$R*sum(map {$_*log($_)} @portions);

printf "%3s %12s %9s\n", qw(N Energy Portion);
for ($i=0; $i<@portions; $i++) {
  printf "%3d %12.2f %8.1f%%\n", $i+1,($energy[$i]-$min)*$factor, $portions[$i]*100;
}
$Smix *= 4.184 if $kJ;
printf "Entropy of mixing %.2f %s/mole/K\n", $Smix, $kJ ? 'J' : 'cal';