Dave Cross: Still Munging Data With Perl: Online event - Mar 17 Learn more

#!/usr/bin/env perl
# DMR April 26, 2014
#
# perl examples/dftd3.pl
#
# reads reads examples/xyzs
# and runs dftd3 xyz -func b3pw91 -bj
# and pulls the dispersion energy
#
# the xyz files are taken from the supporting info of
# D. Riccardi, H.-B. Guo, J.M. Parks, B. Gu, L. Liang, J.C. Smith,
# Cluster-Continuum Calculations of Hydration Free Energies of Anions and Group 12 Divalent Cations,
# J. Chem. Theory Comput., 9, 555 (2013)
#
# use PrepXyzACS.pl for setup
#
# uses the DFT-D3 program
# by Stefan Grimme, Jens Antony, Stephan Ehrlich, and Helge Krieg
# J. Chem. Phys. 132, 154104 (2010); DOI:10.1063/1.3382344
#
# with BJ-damping,
# Stefan Grimme, Stephan Ehrlich and Lars Goerigk
# J. Comput. Chem. 32, 1456 (2011); DOI:10.1002/jcc.21759
#
#
# cd into directory and install with fortran compiler (e.g. gfortran or intel's ifort)
# may have to edit make file to use whichever compiler you have
my $hack = HackaMol->new( data => "examples/xyzs", );
my $i = 0;
my $scratch = path('tmp');
foreach my $xyz ( $hack->data->children(qr/\.xyz$/) ) {
my $mol = $hack->read_file_mol($xyz);
my $Calc = HackaMol::X::Calculator->new(
mol => $mol,
scratch => $scratch,
in_fn => "bah$i.xyz",
out_fn => "calc-$i.out",
map_in => \&input_map,
map_out => \&output_map,
exe => '~/bin/dftd3',
exe_endops => '-func b3pw91 -bj',
);
$Calc->map_input;
$Calc->capture_sys_command;
my $energy = $Calc->map_output(627.51);
printf( "Energy from xyz file: %10.6f\n", $energy );
$i++;
}
$scratch->remove_tree;
# our functions to map molec info to input and from output
sub input_map {
my $calc = shift;
$calc->mol->print_xyz( $calc->in_fn );
}
sub output_map {
my $calc = shift;
my $conv = shift;
my $out = $calc->out_fn->slurp;
$out =~ m /Edisp \/kcal,au:\s+-\d+.\d+\s+(-\d+.\d+)/;
return ( $1 * $conv );
}