#!/usr/bin/perl #!/opt/local/bin/perl # # Search given file for addfld calls. For each uncommented addfld call, # extract the first argument, i.e., the field name, enclosed in single # quotes. After scanning the file, construct a "SECFLDS" list from the # addfld field names, suitable for use in a model namelist read file. # while (@ARGV) { $file_in = shift; push(@files_in,$file_in); } $nfiles = $#files_in + 1; foreach $file_in (@files_in) { open(FILE_IN ,"< $file_in") || die "Error opening input file $file_in\n"; while () { if (/^\s+call addfld(.*)/) { # is an active addfld call (not commented) $fname = $_; # Assume field name first arg is enclosed in single quotes: if ($fname =~ /addfld\(\'(\w+)\'/ ) { $fname = $1; } $fname = "'" . $fname . "'"; # re-quote push(@fnames, $fname); } # line is an addfld call } # while file_in # # Print readable list of field names, that can be # used in model and post-proc namelist read input files. # &printnames($file_in,@fnames); # # Update list of fields from all files: # if ($#fnames > -1) { print"\n"; push @fnames_all,@fnames; } @fnames = (); @fnames_new = (); } # foreach file # # Print list of all fields: # $ntot = $#fnames_all + 1; &printnames('all',@fnames_all); #----------------------------------------------------------------------- sub printnames { my ($file,@fnames) = @_; # # Construct quoted list of field names from @fnames, suitable for # namelist read. This works best if field names are <= 8 chars. # my $name; foreach $name (@fnames) { $name =~ s/ //g; # remove blanks my $len = length($name); # Append blanks to the end up to 10 chars (8-char name + 2 quotes + 1 comma) if ($len < 10) { for ($i=$len+1; $i <= 10; $i++) { $name = $name . ' '; } } $name = $name . ','; # add trailing comma $len = length($name); push @fnames_new,$name; } @fnames = @fnames_new; # my $npergroup = 5; my $nnames = $#fnames + 1; my $ngroups = int($nnames / $npergroup); my $nextra = $nnames % $npergroup; # print "nnames=$nnames npergroup=$npergroup ngroups=$ngroups nextra=$nextra\n"; if ($file ne 'all') { print "; $nnames fields from file $file\n"; } else { print "; Total of $nnames fields from $nfiles files:\n"; } for (my $ig=0; $ig<=$ngroups-1; $ig++) { if ($ig==0) { print " SECFLDS = "; } else { print " "; } for (my $i=0; $i<=$npergroup-1; $i++) { $ii = $ig * $npergroup + $i; print "$fnames[$ii]"; } print "\n"; } if ($nextra > 0) { for (my $i=1; $i<=$nextra; $i++) { if ($i==1) {print " ";} print "$fnames[$nnames - $nextra + $i - 1]"; } print "\n"; } }