/[MITgcm]/MITgcm/utils/scripts/joinmds
ViewVC logotype

Annotation of /MITgcm/utils/scripts/joinmds

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (hide annotations) (download)
Wed May 26 23:19:47 1999 UTC (25 years ago) by adcroft
Branch: MAIN
CVS Tags: checkpoint46n_post, checkpoint51k_post, checkpoint62v, checkpoint47e_post, checkpoint57m_post, checkpoint52l_pre, checkpoint44e_post, checkpoint62u, hrcube4, hrcube5, checkpoint46l_post, checkpoint57g_pre, checkpoint46g_pre, checkpoint47c_post, release1_p13_pre, checkpoint62t, checkpoint50c_post, checkpoint57s_post, checkpoint58b_post, checkpoint57b_post, checkpoint46f_post, checkpoint52d_pre, checkpoint57g_post, checkpoint48e_post, checkpoint56b_post, checkpoint50c_pre, checkpoint57y_post, checkpoint44f_post, checkpoint46b_post, checkpoint52j_pre, checkpoint43a-release1mods, checkpoint51o_pre, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint54d_post, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint54e_post, checkpoint65l, checkpoint65m, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, ecco_c50_e32, ecco_c50_e33, ecco_c50_e30, ecco_c50_e31, release1_p13, checkpoint40pre3, checkpoint62c, checkpoint40pre1, checkpoint51l_post, checkpoint40pre7, checkpoint40pre6, checkpoint48i_post, checkpoint57r_post, checkpoint40pre9, checkpoint40pre8, checkpoint46l_pre, checkpoint57d_post, checkpoint57i_post, checkpoint52l_post, checkpoint52k_post, chkpt44d_post, checkpoint59, checkpoint58, checkpoint55, checkpoint54, checkpoint57, checkpoint56, checkpoint51, checkpoint50, checkpoint53, checkpoint52, release1_p8, release1_p9, checkpoint50d_post, release1_p1, release1_p2, release1_p3, release1_p4, release1_p5, release1_p6, release1_p7, checkpoint58f_post, checkpoint52f_post, checkpoint57n_post, checkpoint58d_post, checkpoint62s, checkpoint58a_post, checkpoint62r, checkpoint62q, checkpoint50b_pre, checkpoint44e_pre, checkpoint62p, checkpoint57z_post, checkpoint54f_post, checkpoint51f_post, checkpoint62a, release1_b1, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, ecco_c51_e34d, ecco_c51_e34e, ecco_c51_e34f, ecco_c51_e34g, checkpoint62w, ecco_c51_e34a, ecco_c51_e34b, ecco_c51_e34c, checkpoint62z, checkpoint62y, checkpoint62x, checkpoint58y_post, checkpoint48b_post, checkpoint43, checkpoint51d_post, checkpoint48c_pre, checkpoint47d_pre, checkpoint51t_post, checkpoint58t_post, checkpoint38, checkpoint51n_post, release1_chkpt44d_post, checkpoint55i_post, checkpoint58m_post, checkpoint57l_post, checkpoint52i_pre, hrcube_1, hrcube_2, hrcube_3, checkpoint51s_post, checkpoint47a_post, checkpoint57t_post, checkpoint55c_post, checkpoint48d_pre, checkpoint51j_post, checkpoint47i_post, checkpoint63g, checkpoint52e_pre, checkpoint57v_post, branch-atmos-merge-shapiro, checkpoint57f_post, checkpoint52e_post, checkpoint51n_pre, checkpoint47d_post, icebear5, icebear4, icebear3, icebear2, checkpoint53d_post, checkpoint46d_pre, checkpoint40pre2, checkpoint64, checkpoint65, checkpoint60, checkpoint61, checkpoint62, checkpoint63, checkpoint57a_post, checkpoint48d_post, release1-branch_tutorials, checkpoint57h_pre, checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint48f_post, checkpoint45d_post, checkpoint52b_pre, checkpoint54b_post, checkpoint46j_pre, checkpoint58w_post, checkpoint57h_post, checkpoint51l_pre, checkpoint52m_post, checkpoint57y_pre, chkpt44a_post, checkpoint55g_post, checkpoint44h_pre, checkpoint48h_post, checkpoint51q_post, checkpoint40pre4, ecco_c50_e29, checkpoint51b_pre, checkpoint46a_post, checkpoint47g_post, checkpoint52b_post, checkpoint52c_post, checkpoint46j_post, checkpoint28, checkpoint29, checkpoint51h_pre, checkpoint23, checkpoint24, checkpoint25, checkpoint46k_post, checkpoint27, ecco_c50_e28, chkpt44c_pre, checkpoint58o_post, checkpoint48a_post, checkpoint45a_post, checkpoint57c_post, checkpoint50f_post, checkpoint50a_post, checkpoint50f_pre, checkpoint58p_post, checkpoint58q_post, branch-atmos-merge-freeze, branch-atmos-merge-start, checkpoint52f_pre, checkpoint55d_post, ecco_c44_e19, ecco_c44_e18, ecco_c44_e17, ecco_c44_e16, release1_p12, checkpoint58e_post, release1_p10, release1_p11, release1_p16, release1_p17, release1_p14, release1_p15, checkpoint47j_post, pre38tag1, checkpoint54a_pre, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, ecco_c50_e33a, checkpoint53c_post, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint55d_pre, checkpoint57c_pre, checkpoint58r_post, checkpoint55j_post, branch-exfmods-tag, checkpoint44g_post, branchpoint-genmake2, checkpoint26, checkpoint54a_post, checkpoint46e_pre, checkpoint55h_post, checkpoint58n_post, checkpoint51r_post, checkpoint48c_post, checkpoint45b_post, checkpoint46b_pre, checkpoint51i_post, checkpoint57e_post, release1-branch-end, c37_adj, release1_final_v1, checkpoint55b_post, checkpoint51b_post, checkpoint51c_post, checkpoint46c_pre, checkpoint53a_post, checkpoint46, checkpoint65o, checkpoint47b_post, checkpoint44b_post, checkpoint59q, checkpoint59p, checkpoint59r, checkpoint59e, checkpoint59d, checkpoint59g, checkpoint59f, checkpoint59a, checkpoint55f_post, checkpoint59c, checkpoint59b, checkpoint59m, checkpoint59l, checkpoint59o, checkpoint59n, checkpoint59i, checkpoint59h, checkpoint59k, ecco_c51_e34, checkpoint46h_pre, checkpoint52d_post, checkpoint53g_post, checkpoint46m_post, checkpoint57p_post, checkpint57u_post, checkpoint46a_pre, checkpoint50g_post, checkpoint45c_post, checkpoint57q_post, ecco_ice2, ecco_ice1, checkpoint44h_post, pre38-close, eckpoint57e_pre, checkpoint46g_post, release1_p12_pre, checkpoint58k_post, checkpoint39, checkpoint52a_pre, checkpoint33, checkpoint32, checkpoint31, checkpoint30, checkpoint37, checkpoint36, checkpoint35, checkpoint34, checkpoint62b, ecco_c44_e22, checkpoint58v_post, checkpoint50h_post, checkpoint52i_post, checkpoint50e_pre, checkpoint50i_post, ecco_c44_e25, checkpoint51i_pre, checkpoint52h_pre, checkpoint56a_post, checkpoint64y, checkpoint64x, checkpoint58l_post, checkpoint64z, checkpoint53f_post, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint40pre5, checkpoint57h_done, checkpoint52j_post, checkpoint47f_post, checkpoint50e_post, chkpt44a_pre, checkpoint46i_post, ecco_c44_e23, ecco_c44_e20, ecco_c44_e21, ecco_c44_e26, ecco_c44_e27, ecco_c44_e24, checkpoint57j_post, checkpoint57f_pre, checkpoint61f, checkpoint46c_post, checkpoint58g_post, ecco-branch-mod1, ecco-branch-mod2, ecco-branch-mod3, ecco-branch-mod4, ecco-branch-mod5, branch-netcdf, checkpoint50d_pre, checkpoint58x_post, branch-atmos-merge-zonalfilt, checkpoint61n, checkpoint52n_post, checkpoint53b_pre, checkpoint46e_post, checkpoint59j, release1_beta1, checkpoint58h_post, checkpoint56c_post, checkpoint58j_post, checkpoint51e_post, checkpoint44b_pre, checkpoint42, checkpoint57a_pre, checkpoint40, checkpoint41, checkpoint55a_post, checkpoint47, checkpoint44, checkpoint45, checkpoint48, checkpoint49, checkpoint57o_post, checkpoint46h_post, checkpoint51o_post, checkpoint61q, checkpoint57k_post, checkpoint51f_pre, chkpt44c_post, checkpoint48g_post, checkpoint53b_post, checkpoint47h_post, checkpoint52a_post, checkpoint57w_post, checkpoint61e, checkpoint44f_pre, branch-atmos-merge-phase5, branch-atmos-merge-phase4, branch-atmos-merge-phase7, branch-atmos-merge-phase6, branch-atmos-merge-phase1, checkpoint58i_post, branch-atmos-merge-phase3, branch-atmos-merge-phase2, checkpoint51g_post, ecco_c52_e35, checkpoint57x_post, checkpoint46d_post, checkpoint50b_post, checkpoint58c_post, checkpoint58u_post, release1-branch_branchpoint, checkpoint51m_post, checkpoint53d_pre, checkpoint58s_post, checkpoint55e_post, checkpoint61g, checkpoint61d, checkpoint54c_post, checkpoint61b, checkpoint61c, checkpoint61a, checkpoint51a_post, checkpoint61o, checkpoint61l, checkpoint61m, checkpoint61j, checkpoint61k, checkpoint61h, checkpoint61i, checkpoint61v, checkpoint61w, checkpoint61t, checkpoint61u, checkpoint61r, checkpoint61s, checkpoint61p, checkpoint51p_post, checkpoint61z, checkpoint61x, checkpoint61y, checkpoint51u_post, HEAD
Branch point for: c24_e25_ice, branch-exfmods-curt, release1_final, release1-branch, branch-genmake2, release1, branch-nonh, tg2-branch, ecco-branch, release1_50yr, netcdf-sm0, icebear, checkpoint51n_branch, branch-atmos-merge, pre38, release1_coupled
Added matlab and scripts directories:
 o matlab contains rdmeta.m and rdmds.m, scripts for reading model
   output directly into Matlab
 o scripts contains joinds, Zhangfan's post-processing script for
   joining processor-based model output
   and joinmds, a place-holder (ie. hack) post-processing script that
   joins tiled-based model output

1 adcroft 1.1 #!/usr/local/bin/perl -w
2    
3     # MITgcmUV DataSet joining utility.
4     # Tested with perl 4.0 and newer.
5     # Tested on Linux 2.0.27/I486, Irix 6.2/{IP22,IP25}
6     # Zhangfan XING, xing@pacific.jpl.nasa.gov
7     # Adapted to work with MDS I/O format by adcroft@mit.edu, 5/7/1999
8     #
9     # LOGS:
10     # 980707, version 0.0.1, basically works
11     # 980721, version 0.2.0, proper handling of data file's header and terminator
12     # for diff bytesex.
13     # 990507, HACK'd by AJA. Needs to be properly merged with the original joinds
14    
15     #------
16     # usage
17     #------
18     sub usage {
19     print STDERR
20     "\nUsage:$0 [-Ddir0 -Ddir1 ...] " .
21     "prefix suffix [(little-endian|big-endian)]\n";
22     print STDERR "\nMITgcmUV DataSet joining utility, version 0.3.0\n";
23     print STDERR
24     "Check http://escher.jpl.nasa.gov:2000/tools/ for newer version.\n";
25     print STDERR "Report problem to xing\@pacific.jpl.nasa.gov\n\n";
26     exit 1;
27     }
28    
29     #------------------------------
30     # product of a list of integers
31     #------------------------------
32     sub listprod {
33     local ($product) = 1;
34     local ($x);
35     foreach $x (@_) {
36     $product *= $x;
37     }
38     $product;
39     }
40    
41     #----------------
42     # @list1 + @list2
43     #----------------
44     sub lists_add {
45     local (*l1,*l2) = @_;
46     ($#l1 == $#l2) || return undef;
47    
48     local (@l);
49     for (local($i)=0;$i<=$#l1;$i++) {
50     $l[$i]=$l1[$i]+$l2[$i];
51     }
52     @l;
53     }
54    
55     #-------------
56     # pos to index
57     # 0-based.
58     #-------------
59     sub pos2index {
60    
61     local ($pos,@dim) = @_;
62     local ($rightmost) = pop(@dim);
63    
64     local (@index,$d);
65     foreach $d (@dim) {
66     push(@index,$pos%$d);
67     $pos = int($pos/$d);
68     }
69    
70     # self-guarding
71     unless ($rightmost > $pos) {
72     return undef;
73     }
74    
75     push(@index,$pos);
76     @index;
77     }
78    
79     #-------------
80     # index to pos
81     # 0-based.
82     #-------------
83     sub index2pos {
84     local (*index,*dim) = @_;
85    
86     return undef unless ($#index == $#dim);
87    
88     local ($pos) = $index[$#index];
89     for (local($i)=$#dim;$i>0;$i--) {
90     $pos = $pos * $dim[$i-1] + $index[$i-1];
91     }
92     $pos;
93     }
94    
95     #-------------------------
96     # check machine's bytesex.
97     # returns "little-endian" or "big-endian"
98     # or dies if unable to figure out
99     #-------------------------
100     sub mach_bytesex {
101    
102     local ($foo) = pack("s2",1,2);
103     if ($foo eq "\1\0\2\0") {
104     return "little-endian";
105     } elsif ($foo eq "\0\1\0\2") {
106     return "big-endian";
107     } else {
108     die "Your machine has a strange bytesex.\n".
109     "Email your platform info to xing\@pacific.jpl.nasa.gov\n";
110     }
111     }
112    
113     #--------------------------------------------------
114     # check bytesex of a fortran unformatted data file
115     # current machine's bytesex is used as a reference.
116     # returns: one of "little-endian", "big-endian", "undecidable" and "unknown"
117     #--------------------------------------------------
118     sub file_bytesex {
119    
120     # only if this platform's bytesex is either big- or little-endian
121     # otherwise dies. Hope this won't happen.
122     local($mach_bytesex) = &mach_bytesex();
123    
124     local ($file) = shift;
125     local (*FILE);
126    
127     open(FILE,$file) || die "$file: $!\n";
128    
129     local(@fstat) = stat(FILE);
130     local ($size) = $fstat[7] - 8; # total data size in bytes
131    
132     local($hdr,$tmr) = ("","");
133     read(FILE,$hdr,4);
134     seek(FILE,-4,2);
135     read(FILE,$tmr,4);
136     close(FILE);
137    
138     # this part checks for self-consistency of Fortran unformatted file
139     ($hdr eq $tmr) || die "$file: not a Fortran unformatted data file.\n";
140    
141     local ($ori) = unpack("I",$hdr);
142     local ($rev) = unpack("I",join("",reverse(split(//,$hdr))));
143    
144     ($ori != $size && $rev != $size) &&
145     return "unknown";
146    
147     ($ori == $size && $rev == $size) &&
148     return "undecidable";
149    
150     local ($opposite) = ($mach_bytesex eq "little-endian") ?
151     "big-endian" : "little-endian";
152    
153     return ($ori == $size) ? $mach_bytesex : $opposite;
154    
155     }
156    
157     #--------------------------------
158     # check meta info for one dataset
159     #--------------------------------
160    
161     sub check_meta {
162    
163     local ($ds,$dir) = @_;
164     local ($fmeta) = "$dir/$ds.meta";
165    
166     #~~~~~~~~~~~~~~~~
167     # check meta info
168     #~~~~~~~~~~~~~~~~
169    
170     undef $/; # read to the end of file
171     open(MFILE,"<$fmeta") || die "$fmeta: $!\n";
172     $_=<MFILE>;
173     close(MFILE);
174     $/ = "\n"; # never mess up
175    
176     s/\([^)]*\)//g; #rm (.*)
177     s/\/\/[^\n]*\n//g; #rm comment lines
178     s/\/\*.*\*\///g; #rm inline comments
179     s/\s+//g; #rm white spaces
180     /nDims=\[(.+)\];dimList=\[(.+)\];format=\['(.+)'\];nrecords=\[(.+)\];timeStepNumber=\[(.+)\];/
181     || die "$fmeta: meta file format error\n";
182     local ($nDims_,$dimList_,$format_,$nrecords_,$timeStepNumber_) = ($1,$2,$3,$4,$5);
183    
184     # check Identifier
185     (defined $timeStepNumber) || ($timeStepNumber = $timeStepNumber_);
186     ($timeStepNumber eq $timeStepNumber_) ||
187     die "$fmeta: timeStepNumber $timeStepNumber_ inconsistent with other dataset\n";
188    
189     # check Number of dimensions
190     (defined $nDims) || ($nDims = $nDims_);
191     ($nDims eq $nDims_) ||
192     die "$fmeta: nDims $nDims_ inconsistent with other dataset\n";
193    
194     # check Field format
195     (defined $format) || ($format = $format_);
196     ($format eq $format_) ||
197     die "$fmeta: format $format_ inconsistent with other dataset\n";
198    
199     # check dimList
200     # calc dimesions and leading index of this subset
201     local (@dimList_) = split(/,/,$dimList_);
202    
203     ($nDims_*3 == $#dimList_+1) ||
204     die "$fmeta: nDims and dimList conflicting\n";
205    
206     local (@Dim,@dim,@Index0) = ();
207     for (local($i)=0;$i<$nDims_;$i++) {
208     push(@Dim,$dimList_[$i*3]);
209     push(@dim,$dimList_[$i*3+2]-$dimList_[$i*3+1]+1);
210     push(@Index0,$dimList_[$i*3+1]-1);
211     }
212     local ($Dim_) = join(",",@Dim);
213     local ($dim_) = join(",",@dim);
214    
215     (defined $Dim) || ($Dim = $Dim_);
216     ($Dim eq $Dim_) ||
217     die "$fmeta: dimList Global inconsistent with other dataset\n";
218    
219     (defined $dim) || ($dim = $dim_);
220     ($dim eq $dim_) ||
221     die "$fmeta: dimList Local inconsistent with other dataset\n";
222    
223     $ds_Index0{$ds} = join(",", @Index0);
224    
225     # print STDOUT "Okay $fmeta\n";
226     }
227    
228     #-------------------------------
229     # check completeness of datasets
230     # need to be more sophisticated
231     #-------------------------------
232     sub check_entirety {
233    
234     local (*Dim,*dim,*ds_Index0) = @_;
235    
236     local ($N) = &listprod(@Dim);
237     local ($n) = &listprod(@dim);
238     ($N) || return 0; # against null dimension
239     ($n) || return 0; # against null dimension
240     ($N%$n) && return 0; # $N/$n must be a whole number
241    
242     local (@ds) = keys %ds_Index0;
243     ($#ds+1 == $N/$n) || return 0; # Num of datasets must match subdomain
244    
245     1;
246     }
247    
248     #------------------
249     # merge one dataset
250     # assume @Dim, @dim and $bytes existing
251     # assume $Byte_Reorder existing
252     #------------------
253     sub merge_data {
254    
255     local ($ds,$dir,*Index0) = @_;
256     local ($fdata) = "$dir/$ds.data";
257    
258     # data size of one subset in bytes as told by meta info
259     local ($size) = &listprod(@dim) * $bytes;
260    
261     open(DFILE, "<$fdata") || die "$fdata: $!\n";
262    
263     local ($raw) = "";
264     #aja sysread(DFILE,$raw,4);
265     # Swap header if bytesex is diff from machine's
266     local ($hdr);
267     if ($Byte_Reorder) {
268     $hdr = unpack("I",join("",reverse(split(//,$raw))));
269     } else {
270     $hdr = unpack("I",$raw);
271     }
272    
273     #aja ($size == $hdr) ||
274     #aja die "$fdata: $hdr bytes inconsistent with meta info\n";
275    
276     print STDOUT "$ds.data: $size bytes, okay, ";
277    
278     # seek(DFILE,4,0); # rewind back to the beginning of data
279    
280     local ($data) = ""; # old perl (< 4.0) needs this to
281     sysread(DFILE,$data,$size); # avoid warning by sysread()
282     local ($len_chunk) = $dim[0] * $bytes;
283     local ($num_chunk) = $size/$len_chunk;
284    
285     local ($pos,@index,$Pos,@Index);
286     for (local($i)=0;$i<$num_chunk;$i++) {
287     $pos = $i * $dim[0];
288     @index = &pos2index($pos,@dim);
289     @Index = &lists_add(*index,*Index0);
290     $Pos = &index2pos(*Index,*Dim);
291     #aja seek(FILE,$Pos*$bytes+4,0);
292     seek(FILE,$Pos*$bytes,0);
293     syswrite(FILE,$data,$len_chunk,$pos*$bytes);
294     }
295    
296     close(DFILE);
297    
298     print STDOUT "merged from $dir\n";
299     }
300    
301     #============
302     # main script
303     #============
304    
305     #------------
306     # parse @ARGV
307     #............
308    
309     ($#ARGV >= 1) || &usage();
310    
311     undef @dirs;
312     while (1) {
313     $x = shift(@ARGV);
314     unless ($x =~ /^-D(.+)$/) {
315     unshift(@ARGV,$x);
316     last;
317     }
318     push(@dirs,$1);
319     }
320     (@dirs) || push(@dirs,".");
321     # @dirs is not empty after this line.
322     #print STDOUT join(" ",@dirs), "\n";
323    
324     ($#ARGV >= 1) || &usage();
325    
326     # data set prefix and suffix
327     $pref = shift(@ARGV);
328     $suff = shift(@ARGV);
329    
330     ($#ARGV >= 1) && &usage();
331     undef $forced_bytesex;
332     if (@ARGV) {
333     $forced_bytesex = shift(@ARGV);
334     $forced_bytesex =~ /^(little|big)-endian$/ || &usage();
335     }
336     #print STDOUT $forced_bytesex, "\n";
337    
338     #--------------------------
339     # obtain a list of datasets
340     #..........................
341    
342     # %ds_dir is a hash to store the directory that a dataset is in.
343     # After this step, it is assured that, for a dataset $ds,
344     # both $ds.meta and $ds.data exist in a unique dir $ds_dir{$ds}.
345    
346     %ds_dir = ();
347     foreach $dir (@dirs) {
348     opendir(DIR, $dir) || die "$dir: $!\n";
349     @fmeta = grep(/^$pref\.$suff\.\d+\.\d+\.meta$/, readdir(DIR));
350     closedir(DIR);
351     foreach $fmeta (@fmeta) {
352     $ds = $fmeta; $ds =~ s/\.meta$//g;
353     (defined $ds_dir{$ds}) &&
354     die "$fmeta appears in two dirs: $ds_dir{$ds} & $dir\n";
355     (-f "$dir/$ds.data") || die "In $dir, $ds.data missing\n";
356     $ds_dir{$ds} = $dir;
357     }
358     }
359    
360     @ds = sort(keys %ds_dir); # list of datasets
361     (@ds) || die "No dataset found.\n";
362     print STDOUT "There are ", $#ds+1, " datasets.\n";
363    
364     #---------------------------------
365     # check meta info for all datasets
366     #.................................
367    
368     undef $timeStepNumber;
369     undef $nDims;
370     undef $format;
371    
372     undef $Dim;
373     undef $dim;
374     undef %ds_Index0;
375    
376     #..............................................
377     # check each meta file and set some global vars
378    
379     foreach $ds (@ds) {
380     &check_meta($ds,$ds_dir{$ds});
381     }
382     print STDOUT "All existing meta files are self- and mutually consistent.\n";
383    
384     #print join(" ",$timeStepNumber,$nDims,$format,$Dim,$dim), "\n";
385     #foreach $ds (@ds) {
386     # $dir = $ds_dir{$ds};
387     # $Index0 = $ds_Index0{$ds};
388     # print "$ds\n";
389     # print "$Index0\n";
390     #}
391    
392     @Dim = split(/,/,$Dim);
393     @dim = split(/,/,$dim);
394    
395     #................................
396     # check meta info in its entirety
397    
398     &check_entirety(*Dim,*dim,*ds_Index0) ||
399     die "Datasets are not complete!\n";
400    
401     print STDOUT "Datasets are complete.\n";
402    
403     #...........
404     # set $bytes
405    
406     if ($format eq "float32") {
407     $bytes = 4;
408     } elsif ($format eq "float64") {
409     $bytes = 8
410     } else {
411     die "format '$format' unknown\n";
412     }
413    
414     #---------------------------
415     # check and merge data files
416     #...........................
417    
418     #........................
419     # check machine's bytesex
420     # it dies if neither little- nor big-endian.
421    
422     $Mach_Bytesex = &mach_bytesex();
423     print STDOUT "Current machine's endianness: $Mach_Bytesex\n";
424    
425     #...................
426     # check file bytesex and resolve related issues
427     #aja undef $File_Bytesex;
428     #aja foreach $ds (@ds) {
429     #aja $fdata = "$ds.data";
430     #aja $file_bytesex = &file_bytesex($ds_dir{$ds}."/$fdata");
431     #aja ($file_bytesex eq "unknown") &&
432     #aja die "$fdata: endianness is neither little- nor big-endian.\n";
433     #aja print STDOUT "$fdata: $file_bytesex\n";
434     #aja unless ($File_Bytesex) {
435     #aja $File_Bytesex = $file_bytesex;
436     #aja } else {
437     #aja ($File_Bytesex eq $file_bytesex) ||
438     #aja die "Data files are mutually inconsistent in endianness\n";
439     #aja }
440     #aja }
441     $File_Bytesex = 'big-endian';
442    
443     #------------------
444     # set $Byte_Reorder, which controls swapping of bytes in
445     # header and terminator of Fortran unformatted data files.
446     #aja $Byte_Reorder = 0;
447     $Byte_Reorder = 0;
448    
449     # if machine and data file have the same bytesex, no need for swapping
450     #aja ($File_Bytesex eq $Mach_Bytesex) && ($Byte_Reorder = 0);
451    
452     # if we can't determine bytesex of data file, need forced one from @ARGV.
453     if ($File_Bytesex eq "undecidable") {
454     # if no forced bytesex available, dies.
455     ($forced_bytesex) ||
456     die "Endianness of data files is undecidable, " .
457     "you have to give one at command line.\n";
458     ($forced_bytesex eq $Mach_Bytesex) && ($Byte_Reorder = 0);
459     print STDOUT "Endianness of data files is undecidable.\n";
460     print STDOUT "Data file header/tail will be treated as ";
461     print STDOUT "$forced_bytesex as you have instructed.\n";
462     # otherwise
463     } else {
464     # give a warining, if swapping is needed.
465     ($Byte_Reorder) &&
466     print STDOUT
467     "Please note: data files have different bytesex than machine!\n";
468     }
469    
470     #................
471     # merge data sets
472    
473     $Size = &listprod(@Dim) * $bytes;
474    
475     $fout = "$pref.$suff.data";
476    
477     open(FILE, ">$fout") || die "$fout: $!\n";
478    
479     # prepare header and teminator. Do byte reordering if necessary
480     $HdrTmr = pack("I",$Size);
481     ($Byte_Reorder) && ($HdrTmr = join("",reverse(split(//,$HdrTmr))));
482    
483     # write 4 byte header
484     #aja syswrite(FILE,$HdrTmr,4);
485    
486     # merge each dataset
487     foreach $ds (@ds) {
488     $dir = $ds_dir{$ds};
489     @Index0 = split(/,/,$ds_Index0{$ds});
490     &merge_data($ds,$dir,*Index0);
491     }
492    
493     # write 4 byte terminator
494     #aja seek(FILE,$Size+4,0);
495     #aja syswrite(FILE,$HdrTmr,4);
496    
497     close(FILE);
498    
499     print STDOUT "Global data (" .
500     join("x",@Dim) .
501     ") is in ./$fout (endianness is $File_Bytesex).\n";
502    
503     exit 0;

  ViewVC Help
Powered by ViewVC 1.1.22