aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetIOScalar/src/util/mergeCarpetIOScalar.pl
blob: f174b9cae60356d5eed34bfed5e95b82f4bf9ca5 (plain)
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
#! /usr/bin/perl -w
#/*@@
#  @file      mergeCarpetIOScalar.pl
#  @date      Tue 15 August 2006
#  @author    Thomas Radke
#  @desc
#             Perl script to merge CarpetIOScalar output files,
#             eliminating duplicate timesteps.
#
#             Source code comments also by Thomas Radke :-)
#  @enddesc
#@@*/


if (@ARGV) {
  print "\n" .
        "  This script can be used to merge CarpetIOScalar output written\n" .
        "  before and after recovery.\n" .
        "  It reads from STDIN the contents of one or more files\n" .
        "  in CarpetIOScalar format and writes them to STDOUT again,\n" .
        "  eliminating duplicate timesteps.\n\n" .
        "  Example: cat alp.norm1.asc | $0 > alp.norm1.asc.merged\n\n";
  exit;
}

# Skalar-Variable zur Speicherung der aktuellen Zeilennummer
my $line = 0;

# Rauten-Feld zur Speicherung der bereits ausgegebenen Datensaetze
my %timesteps = ();

# lese die naechste Zeile von der Standard-Eingabe, solange das Dateiende
# nicht erreicht ist
while (<STDIN>) {

  # aktualisiere die Zeilennummer
  $line++;

  # vergleiche die aktuelle Zeile mit dem Format fuer eine Datenzeile
  if (/^(\d+) /) {

    # ermittle die Iterationsnummer aus der Datenzeile
    my $iteration = $1;

    # pruefe im Rauten-Feld, ob dieser Datensatz bereits ausgegeben wurde
    while (defined $timesteps{$iteration}) {

      # lies alle folgenden Zeilen von der Standard-Eingabe
      # bis zur Datenzeile des naechsten Datensatzes
      while (<STDIN>) {
        $line++;
        next unless (/^(\d+) /);

        $iteration = $1;
        last;
      }
    }

    # vermerke im Rauten-Feld, dass dieser Datensatz ausgegeben wurde
    $timesteps{$iteration} = 1;
  }

  # gib die aktuelle Zeile auf der Standard-Ausgabe aus
  print;
}