1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
my ($file, $center, $occurrence) = @ARGV;
($file) or die "USAGE: $0 datafile.hd5 [center] [occurrence]\n";
my $label = "/Def/DensityMatrixEigenvalues/Size";
my $n = readDataSet($file, $label);
print "#There are $n center of orthogonalities\n";
my $nodata = "datafile.hd5 doesn't contain the data,";
my $perhaps = "perhaps you didn't add saveDensityMatrixEigenvalues in SolverOptions";
($n > 0) or die "$0: $nodata $perhaps\n";
($center) or exit(0);
if ($center =~ /(^\d+)\+(\d+$)/) {
$center = $1 - 1;
}
($center =~ /(^\d+$)/) or die "$0: center must be a number or number+number\n";
die "$0: Center too big, must be smaller than $n\n" if ($center >= $n);
$label = "/Def/DensityMatrixEigenvalues/$center/Size";
$n = readDataSet($file, $label);
print "#Center of orthogonality $center has $n occurrences\n";
($n > 0) or die "$0: $nodata for this center of orthogonality\n";
$occurrence = 0 if (!defined($occurrence) and $n == 1);
($occurrence) or exit(0);
($occurrence =~ /(^\d+$)/) or die "$0: occurrence must be a number\n";
die "$0: occurrence too big, must be smaller than $n\n" if ($occurrence >= $n);
$label = "/Def/DensityMatrixEigenvalues/$center/$occurrence";
my @eigs = readDataSet($file, $label);
printVector(\@eigs);
sub readDataSet
{
my ($file, $label) = @_;
if ($label =~ /(^[a-zA-Z0-9\/]+)/) {
$label = $1;
} else {
die "$0: Invalid label $label\n";
}
if ($file =~ /(^[a-zA-Z0-9\.\/]+)/) {
$file = $1;
} else {
die "$0: Invalid file $file\n";
}
die "$0: File $file not readable\n" unless (-r "$file");
$ENV{"PATH"} = "";
$ENV{"ENV"} = "";
$ENV{"BASH_ENV"} = "";
my $value = "";
open (PIPE, "/usr/bin/h5dump -d \"$label\" \"$file\" |") or die "$0: Cannot open pipe : $!\n";
while (<PIPE>) {
chomp;
if (/\([0-9]+\)\: +(.+$)/) {
$value .= $1;
}
}
close(PIPE);
die "$0: $label not found in $file" if ($value eq "");
my @a = split/,/, $value;
trimSpacesVector(\@a);
return (scalar(@a) == 1) ? $a[0] : @a;
}
sub trimSpacesVector
{
my ($a) = @_;
my $n = scalar(@$a);
for (my $i = 0; $i < $n; ++$i) {
$a->[$i] =~ s/^ +//;
$a->[$i] =~ s/ +$//;
}
}
sub printVector
{
my ($a) = @_;
my $n = scalar(@$a);
for (my $i = 0; $i < $n; ++$i) {
print "$a->[$i]\n";
}
}
|