#! @PERL@ -w # # Project: ESPACK # Jan Hamaekers # Frederik Heber # 2007 # use strict; my ($Help, $Prefix, $Outputdir, $Inputdir, $bytes, $ions); my $i; use Getopt::Long; use File::Copy; GetOptions("help" => \$Help, "prefix=s" => \$Prefix, "inputdir=s" => \$Inputdir, "outputdir=s", => \$Outputdir); if ($Help) { usage(); } sub usage { print STDERR <<"EOF"; Usage: $0 [OPTIONS] Recreates the .dx files for OpenDX in a desired sequence from given .doc and .data files --prefix read data from file prefixed with this --inputdir read data from this directory --outputdir put the resequenced field into this dir --help this help EOF exit 1; } # open new .dx files and copy standard ones files if (!defined $Outputdir) { if (defined $Inputdir) { $Outputdir="$Inputdir/view"; } else { $Outputdir="./view"; } } mkdir $Outputdir; open(ELECTRONS_DX, ">$Outputdir/$Prefix.density.dx") or die "could not open $Outputdir/$Prefix.density.dx: $!"; open(IONS_DX, ">$Outputdir/$Prefix.ions.dx") or die "could not open $Outputdir/$Prefix.ions.dx: $!"; if (defined $Prefix && defined $Inputdir) { copy("$Inputdir/$Prefix.density.doc","$Outputdir/$Prefix.density.doc") or die "could not copy $Inputdir/$Prefix.density.doc to $Outputdir/: $!"; copy("$Inputdir/$Prefix.ions.datZ","$Outputdir/$Prefix.ions.datZ") or die "could not copy $Inputdir/$Prefix.ions.datZ to $Outputdir/: $!"; copy("$Inputdir/$Prefix.ions.doc","$Outputdir/$Prefix.ions.doc") or die "could not copy $Inputdir/$Prefix.ions.doc to $Outputdir/: $!"; } else { print "Need to know a prefix and inputdir for all OpenDX files!\n"; exit 1; } # copy first the lines or so for the box open(INPUT ,"<$Inputdir/$Prefix.density.dx"); my $buffer; for ($i=1;$i<=11;$i++) { $buffer = ; print ELECTRONS_DX "$buffer"; } while () { if ( /object "dat.0000"/ ) { my @linebuffer = split(/[ \t]+/); $bytes = $linebuffer[9]; } } print "Found $bytes per data file\n"; close(INPUT); open(INPUT ,"<$Inputdir/$Prefix.ions.dx"); for ($i=1;$i<=4;$i++) { $buffer = ; print IONS_DX "$buffer"; } while () { if ( /object "ionpos.0000"/ ) { my @linebuffer = split(/[ \t]+/); $ions = $linebuffer[11]; } } print "Found $ions per data file\n"; close(INPUT); # add per object the referencing and copy the .data file my ($source, $dest); for($i=0;$i<=$#ARGV;$i++) { $source = sprintf("%04d",$ARGV[$i]); $dest = sprintf("%04d",$i); copy("$Inputdir/$Prefix.density.data.$source","$Outputdir/$Prefix.density.data.$dest") or die "could not copy $Inputdir/$Prefix.density.data.$source to $Outputdir/$Prefix.density.data.$dest: $!"; printf(ELECTRONS_DX "object \"dat.%04d\" class array type float rank 0 items %d lsb binary\n", $i, $bytes); printf(ELECTRONS_DX "data file $Prefix.density.data.%04d,0\n",$i); print (ELECTRONS_DX "attribute \"dep\" string \"positions\"\n\n"); # 0 - 8586755 Bytes\n\n"); printf(ELECTRONS_DX "object \"obj.%04d\" class field\n",$i); printf(ELECTRONS_DX "component \"positions\" \"posdens\"\ncomponent \"connections\" \"gridcon\"\ncomponent \"data\" \"dat.%04d\"\n\n",$i); copy("$Inputdir/$Prefix.ions.force.$source","$Outputdir/$Prefix.ions.force.$dest") or die "could not copy $Inputdir/$Prefix.ions.force.$source to $Outputdir/$Prefix.ions.force.$dest:$!"; copy("$Inputdir/$Prefix.ions.pos.$source","$Outputdir/$Prefix.ions.pos.$dest") or die "could not copy $Inputdir/$Prefix.ions.pos.$source to $Outputdir/$Prefix.ions.pos.$dest:$!"; printf(IONS_DX "object \"ionpos.%04d\" class array type float rank 1 shape 3 items %d lsb binary\n", $i, $ions); printf(IONS_DX "data file $Prefix.ions.pos.%04d,0\n\n",$i); printf(IONS_DX "object \"iondatF.%04d\" class array type float rank 1 shape 3 items %d lsb binary\n",$i, $ions); printf(IONS_DX "data file $Prefix.ions.force.%04d,0\nattribute \"dep\" string \"positions\"\n\n",$i); printf(IONS_DX "object \"ionobjF.%04d\" class field\n",$i); printf(IONS_DX "component \"positions\" \"ionpos.%04d\"\n",$i); printf(IONS_DX "component \"data\" \"iondatF.%04d\"\n",$i); printf(IONS_DX "object \"ionobjZ.%04d\" class field\n",$i); printf(IONS_DX "component \"positions\" \"ionpos.%04d\"\ncomponent \"data\" \"iondatZ\"\n\n",$i); } # finialize with member list print ELECTRONS_DX "object \"series\" class series\n"; print IONS_DX "object \"ionseriesF\" class series\n"; for($i=0;$i<=$#ARGV;$i++) { printf(ELECTRONS_DX "member %d \"obj.%04d\" position %d.000000\n",$i,$i,$i); printf(IONS_DX "member %d \"ionobjF.%04d\" position %d.000000\n",$i,$i,$i); } print ELECTRONS_DX "end\n"; print IONS_DX "\n"; print IONS_DX "object \"ionseriesZ\" class series\n"; for($i=0;$i<=$#ARGV;$i++) { printf(IONS_DX "member %d \"ionobjZ.%04d\" position %d.000000\n",$i,$i,$i); } print IONS_DX "end\n"; # end exit 0