clm5.0/bld/queryDefaultXML.pm
2025-01-12 20:48:10 +08:00

162 lines
5.1 KiB
Perl

#=======================================================================
#
# This is a perl module to read in a list of namelist_default files.
#
#=======================================================================
use strict;
use Build::Config;
use Build::NamelistDefinition;
use Build::NamelistDefaults;
use Build::Namelist;
package queryDefaultXML;
#-------------------------------------------------------------------------------
sub read_cfg_file
#
# Read in the configuration cache XML file on the build-time configuration
#
{
my ($file, $empty_cfg_file, $printing, $settings_ref) = @_;
my $cfg;
my %config;
if ( $file eq "noconfig" ) {
print "No configuration cache file to read in.\n" if $printing;
$cfg = Build::Config->new( $empty_cfg_file );
} elsif ( -f "$file" ) {
$cfg = Build::Config->new($file);
} else {
die "Bad filename entered: $file does NOT exist or can not open it.\n";
}
#
# Make sure variables are set to valid values
#
foreach my $key ( keys( %config ) ) {
if ( $cfg->is_valid_name( $key ) ) {
$cfg->set( $key, $config{$key} );
}
}
foreach my $key ( $cfg->get_names( ) ) {
if ( defined($$settings_ref{$key}) ) {
if ( $cfg->is_valid_name( $key ) ) {
$cfg->set( $key, $$settings_ref{$key} );
}
}
}
return( $cfg );
}
#-------------------------------------------------------------------------------
sub ReadDefaultXMLFile {
#
# Read in the default XML file for the default namelist settings
#
my $opts_ref = shift;
my $settings_ref = shift;
# Error check that input and opts hash has the expected variables
my $ProgName = $$opts_ref{'ProgName'};
my $nm = "${ProgName}::ReadDefaultXMLFile";
my @required_list = ( "files", "nldef_files", "empty_cfg_file", "config", "namelist",
"csmdata", "hgrid", "printing", "ProgName", "cmdline",
"cfgdir" );
foreach my $var ( @required_list ) {
if ( ! defined($$opts_ref{$var}) ) {
die "ERROR($nm): Required input variable $var was not found\n";
}
}
my $printing = $$opts_ref{'printing'};
my $cmdline = $$opts_ref{'cmdline'};
# Initialize some local variables
my $files_ref = $$opts_ref{'files'};
my @files = @$files_ref;
my $nldef_ref = $$opts_ref{'nldef_files'};
my @nl_definition_files= @$nldef_ref;
my $empty_config_file = $$opts_ref{'empty_cfg_file'};
my $namelist = $$opts_ref{'namelist'};
my $cfg = read_cfg_file( $$opts_ref{'config'}, $$opts_ref{'empty_cfg_file'},
$printing, $settings_ref );
#
# Set up options to send to namelist defaults object
#
my %nlopts;
foreach my $var ( keys( %$settings_ref) ) {
if ( $var ne "csmdata" ) {
$nlopts{$var} = $$settings_ref{$var};
}
}
if ( $$opts_ref{'hgrid'} ne "any" ) {
$nlopts{'hgrid'} = $$opts_ref{'hgrid'};
}
#
# Loop through all variables in files
#
print "($nm) Read: $files[0]\n" if $printing;
my %defaults;
my $nldefaults = Build::NamelistDefaults->new($files[0], $cfg);
for ( my $i = 1; $i <= $#files; $i++ ) {
print "($nm) Read: $files[$i]\n" if $printing;
$nldefaults->add( $files[$i] );
}
my $definition = Build::NamelistDefinition->new( $nl_definition_files[0] );
for ( my $i = 1; $i <= $#nl_definition_files; $i++ ) {
print "($nm) Read: $nl_definition_files[$i]\n" if $printing;
$definition->add( $nl_definition_files[$i] );
}
if ( $$opts_ref{'csmdata'} eq "default" ) {
$$opts_ref{'csmdata'} = $nldefaults->get_value( "csmdata", \%nlopts );
}
$nlopts{'csmdata'} = $$opts_ref{'csmdata'};
foreach my $name ( $nldefaults->get_variable_names() ) {
my $value = $nldefaults->get_value( $name, \%nlopts );
if ( $value eq "null" ) { next; }
if ( defined($$settings_ref{'var'}) ) {
if ( $name ne $$settings_ref{'var'} ) { next; }
}
$value =~ s/\n//g;
my $isafile = 0;
if ( $definition->is_input_pathname($name) ) {
if ( defined($$settings_ref{'clm_usr_name'}) ) {
$value = $nldefaults->get_usr_file( $name, $definition, \%nlopts );
}
if ( $value && ($value !~ /^\/.+$/) ) {
$value = $$opts_ref{'csmdata'} . "/" . $value;
}
$isafile = 1;
}
my $isadir = 0;
my $isastr = 0;
if ( $definition->get_str_len($name) > 0 ) {
$isastr = 1;
}
#
# If is a directory (is a file and csmdata or a var with dir in name)
#
if ( $isafile && (($name eq "csmdata") || ($name =~ /dir/)) ) {
if ( $name eq "csmdata" ) {
$value = $$opts_ref{'csmdata'};
$isadir = 1;
} else {
$isadir = 1;
}
}
# Return hash with the results
my $group = $definition->get_group_name( $name );
if ( $group eq $namelist && $value && (! exists($defaults{$name}{'value'})) ) {
$defaults{$name}{'value'} = $value;
$defaults{$name}{'isfile'} = $isafile;
$defaults{$name}{'isdir'} = $isadir;
$defaults{$name}{'isstr'} = $isastr;
}
}
return( \%defaults );
}
1 # To make use or require happy