#!/usr/bin/perl -ws our ($h, $help, $kkal, $kJ); # Options if ($h || $help) { (my $prog = $0) =~ s/.*\///; print " Usage: $prog files.xyz Ищет строки, содержащие Energy в файлах или в 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';