#!/usr/bin/env perl # Test command line options of the build-namelist script. # Try to test that all the different options at least work. # Test that inconsistentcies are appropriately caught. ######################### use lib '.'; use Test::More; use xFail::expectedFail; use IO::File; ######################### use strict; use Getopt::Long; use NMLTest::CompFiles; use English; sub usage { die < Compare namelists for this version to namelists created by another version. -generate Leave the namelists in place to do a later compare. -test Use the -test option to make sure datasets exist. -csmdata "dir" Root directory of CESM input data. EOF } sub make_env_run { # # Create a env_run.xml file to read in # my %settings = @_; # Set default settings my %env_vars = ( DIN_LOC_ROOT=>"MYDINLOCROOT", GLC_TWO_WAY_COUPLING=>"FALSE" ); # Set any settings that came in from function call foreach my $item ( keys(%settings) ) { $env_vars{$item} = $settings{$item}; } # Now write the file out my $envfile = "env_run.xml"; my $fh = IO::File->new($envfile, '>') or die "can't open file: $envfile"; print $fh < EOF foreach my $item ( keys(%env_vars) ) { print $fh < EOF } print $fh < EOF $fh->close(); } # # Process command-line options. # my %opts = ( help => 0, generate => 0, test => 0, compare => undef, csmdata => undef, ); GetOptions( "h|help" => \$opts{'help'}, "compare=s" => \$opts{'compare'}, "generate" => \$opts{'generate'}, "test" => \$opts{'test'}, "csmdata=s" => \$opts{'csmdata'}, ) or usage(); # Give usage message. usage() if $opts{'help'}; # Check that the CESM inputdata root directory has been specified. This must be # a local or nfs mounted directory. my $inputdata_rootdir = undef; if (defined($opts{'csmdata'})) { $inputdata_rootdir = $opts{'csmdata'}; } elsif (defined $ENV{'CSMDATA'} ) { $inputdata_rootdir = $ENV{'CSMDATA'}; } else { # use yellowstone location as default $inputdata_rootdir="/glade/campaign/cesm/cesmdata/cseg/inputdata"; print("WARNING: -csmdata nor CSMDATA are set, using default yellowstone location: $inputdata_rootdir\n"); } ################################### #_# read in expected fail test list ################################### my $compGen; if ( $opts{'generate'} eq 1 && !(defined($opts{'compare'}) )) { $compGen='generate'; } elsif ( defined($opts{'compare'}) ) { $compGen='compare'; } elsif ( defined($opts{'compare'} && ($opts{'generate'} eq 1 ))) { #_# if compare and generate are both given, use compare $compGen='compare'; } my $ProgName; ($ProgName = $PROGRAM_NAME) =~ s!(.*)/!!; my $testType="namelistTest"; # # Figure out number of tests that will run # my $ntests = 940; if ( defined($opts{'compare'}) ) { $ntests += 576; } plan( tests=>$ntests ); #_# ============================================================ #_# setup for xFail module #_# ============================================================ my $xFail = xFail::expectedFail->new($ProgName,$compGen,$ntests); my $captOut=""; #_# variable to capture Test::More output Test::More->builder->output(\$captOut); #_# ============================================================ #_# #_# ============================================================ # Check for unparsed arguments if (@ARGV) { print "ERROR: unrecognized arguments: @ARGV\n"; usage(); } my $mode = "-phys clm5_0"; system( "../configure -s $mode" ); my $DOMFILE = "$inputdata_rootdir/atm/datm7/domain.lnd.T31_gx3v7.090928.nc"; my $real_par_file = "user_nl_clm_real_parameters"; my $bldnml = "../build-namelist -verbose -csmdata $inputdata_rootdir -lnd_frac $DOMFILE -glc_nec 10 -no-note -output_reals $real_par_file"; if ( $opts{'test'} ) { $bldnml .= " -test"; } my $tempfile = "temp_file.txt"; if ( -f $tempfile ) { system( "/bin/rm $tempfile" ); } my @files = ( "lnd_in", $tempfile, $real_par_file ); my $cwd = `pwd`; chomp( $cwd ); my $cfiles = NMLTest::CompFiles->new( $cwd, @files ); print "\n==================================================\n"; print "Run simple tests \n"; print "==================================================\n"; # Simple test -- just run build-namelist with -help option eval{ system( "$bldnml -help > $tempfile 2>&1 " ); }; is( $@, '', "help" ); &cleanup(); # Simple test -- just run build-namelist with -version option eval{ system( "$bldnml -version > $tempfile 2>&1 " ); }; is( $@, '', "version" ); system( "/bin/cat $tempfile" ); &cleanup(); # Simple test -- just run build-namelist &make_env_run(); eval{ system( "$bldnml > $tempfile 2>&1 " ); }; is( $@, '', "plain build-namelist" ); $cfiles->checkfilesexist( "default", $mode ); # Compare to baseline if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "default", $mode ); $cfiles->comparefiles( "default", $mode, $opts{'compare'} ); } print "\n==================================================\n"; print "Run simple tests with all list options \n"; print "==================================================\n"; $cfiles->copyfiles( "default", $mode ); &cleanup(); # Simple test -- run all the list options foreach my $options ( "clm_demand", "ssp_rcp", "res", "sim_year", "use_case" ) { &make_env_run(); eval{ system( "$bldnml -${options} list > $tempfile 2>&1 " ); }; my $result = `cat $tempfile`; my $expect; if ( $options =~ /use_case/ ) { $expect = "use cases :"; } else { $expect = "valid values for $options"; } $expect = "/CLM build-namelist : $expect/"; like( $result, $expect, "$options list" ); is( (-f "lnd_in"), undef, "Check that lnd_in file does NOT exist" ); &cleanup(); } print "\n==================================================\n"; print "Run simple tests with additional options \n"; print "==================================================\n"; # Exercise a bunch of options my $options = "-co2_ppmv 250 "; $options .= " -res 0.9x1.25 -ssp_rcp SSP1-2.6 -envxml_dir ."; &make_env_run(); eval{ system( "$bldnml $options > $tempfile 2>&1 " ); }; is( $@, '', "options: $options" ); $cfiles->checkfilesexist( "default", $mode ); $cfiles->copyfiles( "most_options", $mode ); # Compare to default $cfiles->doNOTdodiffonfile( "lnd_in", "default", $mode ); $cfiles->doNOTdodiffonfile( "$real_par_file", "default", $mode ); $cfiles->doNOTdodiffonfile( "$tempfile", "default", $mode ); $cfiles->comparefiles( "default", $mode ); # Compare to baseline if ( defined($opts{'compare'}) ) { $cfiles->dodiffonfile( "lnd_in", "most_options", $mode ); $cfiles->dodiffonfile( "$real_par_file", "most_options", $mode ); $cfiles->doNOTdodiffonfile( "$tempfile", "most_options", $mode ); $cfiles->comparefiles( "most_options", $mode, $opts{'compare'} ); } &cleanup(); print "\n==================================================\n"; print "Test drydep, fire_emis and megan namelists \n"; print "==================================================\n"; # drydep and megan namelists $mode = "-phys clm5_0"; system( "../configure -s $mode" ); my @mfiles = ( "lnd_in", "drv_flds_in", $tempfile ); my $mfiles = NMLTest::CompFiles->new( $cwd, @mfiles ); foreach my $options ( "-drydep", "-megan", "-drydep -megan", "-fire_emis", "-drydep -megan -fire_emis" ) { &make_env_run(); eval{ system( "$bldnml -envxml_dir . $options > $tempfile 2>&1 " ); }; is( $@, '', "options: $options" ); $mfiles->checkfilesexist( "$options", $mode); if ( $options ne "-drydep" ) { $mfiles->shownmldiff( "-drydep", $mode ); } if ( defined($opts{'compare'}) ) { $mfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode ); $mfiles->comparefiles( "$options", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $mfiles->copyfiles( "$options", $mode ); } &cleanup(); } $mode = "-phys clm5_0"; system( "../configure -s $mode" ); print "\n===============================================================================\n"; print "Test irrig, verbose, clm_demand, ssp_rcp, test, sim_year, use_case, l_ncpl\n"; print "=================================================================================\n"; # irrig, verbose, clm_demand, ssp_rcp, test, sim_year, use_case, l_ncpl my $startfile = "clmrun.clm2.r.1964-05-27-00000.nc"; foreach my $options ( "-namelist '&a irrigate=.true./'", "-verbose", "-ssp_rcp SSP1-2.6", "-test", "-sim_year 1850", "-use_case 1850_control", "-l_ncpl 1", "-clm_start_type startup", "-namelist '&a irrigate=.false./' -crop -bgc bgc", "-envxml_dir . -infile myuser_nl_clm", "-ignore_ic_date -clm_start_type branch -namelist '&a nrevsn=\"thing.nc\"/' -bgc bgc -crop", "-clm_start_type branch -namelist '&a nrevsn=\"thing.nc\",use_init_interp=T/'", "-ignore_ic_date -clm_start_type startup -namelist '&a finidat=\"thing.nc\"/' -bgc bgc -crop", ) { my $file = $startfile; &make_env_run(); eval{ system( "$bldnml -res 0.9x1.25 -envxml_dir . $options > $tempfile 2>&1 " ); }; is( $@, '', "options: $options" ); $cfiles->checkfilesexist( "$options", $mode ); $cfiles->shownmldiff( "default", $mode ); my $finidat = `grep finidat lnd_in`; if ( $options eq "-l_ncpl 1" ) { my $dtime = `grep dtime lnd_in`; like( $dtime, "/ 86400\$/", "$options" ); } elsif ( $options =~ /myuser_nl_clm/ ) { my $fsurdat = `grep fsurdat lnd_in`; like( $fsurdat, "/MYDINLOCROOT/lnd/clm2/PTCLMmydatafiles/1x1pt_US-UMB/surfdata_1x1pt_US-UMB_simyr2000_clm4_5_c131122.nc/", "$options" ); } if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode ); $cfiles->dodiffonfile( "$real_par_file", "$options", $mode ); $cfiles->comparefiles( "$options", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options", $mode ); } &cleanup(); } print "\n==============================================================\n"; print "Test several use_cases and specific configurations for clm5_0\n"; print "==============================================================\n"; $mode = "-phys clm5_0"; system( "../configure -s $mode" ); foreach my $options ( "-bgc bgc -use_case 1850-2100_SSP1-2.6_transient -namelist '&a start_ymd=20100101/'", "-bgc sp -use_case 1850-2100_SSP2-4.5_transient -namelist '&a start_ymd=18501223/'", "-bgc bgc -use_case 1850-2100_SSP3-7.0_transient -namelist '&a start_ymd=20701029/'", "-bgc fates -use_case 2000_control -no-megan", "-bgc bgc -use_case 2010_control", "-res 1x1_mexicocityMEX -use_case stdurbpt_pd", "-bgc sp -use_case 2000_control -res 0.9x1.25 -namelist '&a use_soil_moisture_streams = T/'", "-bgc cn -use_case 1850-2100_SSP5-8.5_transient -namelist '&a start_ymd=19201023/'", "-bgc bgc -use_case 2000_control -namelist \"&a fire_method='nofire'/\" -crop", "-res 0.9x1.25 -bgc bgc -use_case 20thC_smyle_transient ", "-res 0.9x1.25 -bgc bgc -use_case 1850_smyle_control ", "-bgc sp -use_case 20thC_transient ", "-res 0.9x1.25 -bgc bgc -use_case 1850_noanthro_control -drydep -fire_emis -light_res 360x720", ) { my $file = $startfile; &make_env_run(); eval{ system( "$bldnml -res 0.9x1.25 -envxml_dir . $options > $tempfile 2>&1 " ); }; is( $@, '', "options: $options" ); $cfiles->checkfilesexist( "$options", $mode ); $cfiles->shownmldiff( "default", $mode ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode ); $cfiles->dodiffonfile( "lnd_in", "$options", $mode ); $cfiles->dodiffonfile( "$real_par_file", "$options", $mode ); $cfiles->comparefiles( "$options", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options", $mode ); } &cleanup(); } print "\n==================================================\n"; print "Start Failure testing. These should fail \n"; print "==================================================\n"; # Failure testing, do things that SHOULD fail my $finidat = "thing.nc"; system( "touch $finidat" ); my %failtest = ( "coldstart but with IC file"=>{ options=>"-clm_start_type cold -envxml_dir .", namelst=>"finidat='$finidat'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"", }, "clm_demand on finidat" =>{ options=>"-clm_demand finidat -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"", }, "blank IC file, not cold" =>{ options=>"-clm_start_type startup -envxml_dir .", namelst=>"finidat=' '", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"", }, "startup without interp" =>{ options=>"-clm_start_type startup -envxml_dir . -bgc sp -sim_year 1850", namelst=>"use_init_interp=.false., start_ymd=19200901", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "l_ncpl is zero" =>{ options=>"-l_ncpl 0 -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"", }, "l_ncpl not integer" =>{ options=>"-l_ncpl 1.0 -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"", }, "both l_ncpl and dtime" =>{ options=>"-l_ncpl 24 -envxml_dir .", namelst=>"dtime=1800", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"", }, "use_crop without -crop" =>{ options=>" -envxml_dir .", namelst=>"use_crop=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "reseed without CN" =>{ options=>" -envxml_dir . -bgc sp", namelst=>"reseed_dead_plants=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "dribble_crphrv w/o CN" =>{ options=>" -envxml_dir . -bgc sp", namelst=>"dribble_crophrv_xsmrpool_2atm=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "dribble_crphrv w/o crop" =>{ options=>" -envxml_dir . -bgc cn -no-crop", namelst=>"dribble_crophrv_xsmrpool_2atm=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "CNDV with flanduse_timeseries" =>{ options=>" -envxml_dir .", namelst=>"flanduse_timeseries='my_flanduse_timeseries_file.nc'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-bgc cndv", }, "soilm_stream wo use" =>{ options=>"-res 0.9x1.25 -envxml_dir .", namelst=>"use_soil_moisture_streams = .false.,stream_fldfilename_soilm='missing_file'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "clm50CNDVwtransient" =>{ options=>" -envxml_dir . -use_case 20thC_transient -dynamic_vegetation -res 10x15", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "CNDV with flanduse_timeseries - clm4_5"=>{ options=>"-bgc bgc -dynamic_vegetation -envxml_dir .", namelst=>"flanduse_timeseries='my_flanduse_timeseries_file.nc'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "use_cndv=T without bldnml op"=>{ options=>"-bgc cn -envxml_dir .", namelst=>"use_cndv=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "use_cndv=F with dyn_veg op"=>{ options=>"-bgc cn -dynamic_vegetation -envxml_dir .", namelst=>"use_cndv=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "crop with use_crop false" =>{ options=>"-crop -bgc bgc -envxml_dir .", namelst=>"use_crop=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "crop without CN" =>{ options=>"-crop -bgc sp -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "baset_map without crop" =>{ options=>"-bgc bgc -envxml_dir . -no-crop", namelst=>"baset_mapping='constant'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "mapvary var w/o varymap" =>{ options=>"-crop -bgc bgc -envxml_dir . -crop", namelst=>"baset_mapping='constant', baset_latvary_slope=1.0, baset_latvary_intercept=10.0", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "-irrig with clm5_0" =>{ options=>"-bgc bgc -crop -irrig .true. -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "-irrig with -crop" =>{ options=>"-irrig .true. -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_0 -bgc cn -crop on", }, # This one should fail now, because we don't have non irrigated non-crop datasets "-irrigate=F without -crop" =>{ options=>"-bgc cn -no-crop -envxml_dir .", namelst=>"irrigate=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "grainproductWOcrop" =>{ options=>"-bgc cn -no-crop -envxml_dir .", namelst=>"use_grainproduct=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "interp without finidat" =>{ options=>"-bgc sp -envxml_dir .", namelst=>"use_init_interp=.true. finidat=' '", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "sp and c13" =>{ options=>"-bgc sp -envxml_dir .", namelst=>"use_c13=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "sp and c14" =>{ options=>"-bgc sp -envxml_dir .", namelst=>"use_c14=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "bombspike no c14" =>{ options=>"-bgc bgc -envxml_dir .", namelst=>"use_c14=.false. use_c14_bombspike=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "use c13 timeseries no cn" =>{ options=>"-bgc sp -envxml_dir .", namelst=>"use_c13_timeseries=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "use c13 timeseries no c13"=>{ options=>"-bgc bgc -envxml_dir .", namelst=>"use_c13=.false. use_c13_timeseries=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "bombspike no cn" =>{ options=>"-bgc sp -envxml_dir .", namelst=>"use_c14_bombspike=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "lightres no cn" =>{ options=>"-bgc sp -envxml_dir . -light_res 360x720", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "spno-fire" =>{ options=>"-bgc sp -envxml_dir . -use_case 2000_control", namelst=>"fire_method='nofire'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "lightres no fire" =>{ options=>"-bgc cn -envxml_dir . -light_res 360x720", namelst=>"fire_method='nofire'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "lightres none bgc" =>{ options=>"-bgc bgc -envxml_dir . -light_res none", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "lightresnotnone-nofire" =>{ options=>"-bgc bgc -envxml_dir . -light_res 94x192", namelst=>"fire_method='nofire'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "lightresnonenofirelightfil"=>{ options=>"-bgc bgc -envxml_dir . -light_res none", namelst=>"fire_method='nofire',stream_fldfilename_lightng='build-namelist_test.pl'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "lightrescontradictlightfil"=>{ options=>"-bgc bgc -envxml_dir . -light_res 360x720", namelst=>"stream_fldfilename_lightng='build-namelist_test.pl'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "bgc=cn and bgc settings" =>{ options=>"-bgc cn -envxml_dir .", namelst=>"use_lch4=.true.,use_nitrif_denitrif=.true.,use_vertsoilc=.true.,use_century_decomp=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "finundated and not methane"=>{ options=>"-bgc cn -envxml_dir .", namelst=>"use_lch4=.false.,finundation_method='h2osfc'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "bgc=bgc and cn-only set" =>{ options=>"-bgc bgc -envxml_dir .", namelst=>"use_lch4=.false.,use_nitrif_denitrif=.false.,use_vertsoilc=.false.,use_century_decomp=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "use_cn=true bgc=sp" =>{ options=>"-bgc sp -envxml_dir .", namelst=>"use_cn=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "use_cn=false bgc=cn" =>{ options=>"-bgc cn -envxml_dir .", namelst=>"use_cn=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "lower=aqu-45 with/o Zeng" =>{ options=>"-envxml_dir .", namelst=>"lower_boundary_condition=4,soilwater_movement_method=1,use_bedrock=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "Zeng w lower=flux" =>{ options=>"-envxml_dir .", namelst=>"lower_boundary_condition=1,soilwater_movement_method=0,use_bedrock=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "Zeng w lower=zeroflux" =>{ options=>"-envxml_dir .", namelst=>"lower_boundary_condition=2,soilwater_movement_method=0", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "Zeng w lower=table" =>{ options=>"-envxml_dir .", namelst=>"lower_boundary_condition=3,soilwater_movement_method=0,use_bedrock=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "vichydro without clm4_5" =>{ options=>"-vichydro -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_0", }, "use_vic=F with -vic op" =>{ options=>"-vichydro -envxml_dir .", namelst=>"use_vichydro=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "-vic with l_bnd=flux" =>{ options=>"-vichydro -envxml_dir .", namelst=>"lower_boundary_condition=1", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "-vic with l_bnd=zeroflux" =>{ options=>"-vichydro -envxml_dir .", namelst=>"lower_boundary_condition=2", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "-vic with origflag=1" =>{ options=>"-vichydro -envxml_dir .", namelst=>"origflag=1", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "l_bnd=flux with origflag=0"=>{ options=>"-envxml_dir .", namelst=>"origflag=0, lower_boundary_condition=1", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "l_bnd=zflux with origflag=0"=>{ options=>"-envxml_dir .", namelst=>"origflag=0, lower_boundary_condition=2", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "bedrock with l_bnc=flux" =>{ options=>"-envxml_dir .", namelst=>"use_bedrock=.true., lower_boundary_condition=1", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "bedrock with l_bnc=tabl" =>{ options=>"-envxml_dir .", namelst=>"use_bedrock=.true., lower_boundary_condition=3", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "bedrock with l_bnc=aqui" =>{ options=>"-envxml_dir .", namelst=>"use_bedrock=.true., lower_boundary_condition=4", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "zengdeck with l_bnc=flux" =>{ options=>"-envxml_dir .", namelst=>"soilwater_movement_method=0, lower_boundary_condition=1", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "zengdeck with l_bnc=z-flux"=>{ options=>"-envxml_dir .", namelst=>"soilwater_movement_method=0, lower_boundary_condition=2", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "zengdeck with l_bnc=tabl" =>{ options=>"-envxml_dir .", namelst=>"soilwater_movement_method=0, lower_boundary_condition=3", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "l_bnd=tabl with h2osfcfl=0"=>{ options=>"-envxml_dir .", namelst=>"h2osfcflag=0, lower_boundary_condition=3", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "l_bnd=flux with h2osfcfl=0"=>{ options=>"-envxml_dir .", namelst=>"h2osfcflag=0, lower_boundary_condition=1", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "l_bnd=zflux with h2osfcfl=0"=>{ options=>"-envxml_dir .", namelst=>"h2osfcflag=0, lower_boundary_condition=2", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "h2osfcfl=0 with clm5.0" =>{ options=>"-envxml_dir .", namelst=>"h2osfcflag=0", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "origflag=0 with clm5.0" =>{ options=>"-envxml_dir .", namelst=>"origflag=0", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "oldfflag=0 with clm5.0" =>{ options=>"-envxml_dir .", namelst=>"oldfflag=0", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "bgc without clm4_5" =>{ options=>"-bgc sp -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_0", }, "spinup_state without clm4_5" =>{ options=>"-clm_accelerated_spinup on -envxml_dir .", namelst=>"spinup_state=1", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_0", }, "40bad lnd_tuning_mode value" =>{ options=>"-lnd_tuning_mode clm4_5_CRUNCEP -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_0", }, "45bad lnd_tuning_mode value" =>{ options=>"-lnd_tuning_mode clm5_0_GSWP3 -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "50bad lnd_tuning_mode value" =>{ options=>"-lnd_tuning_mode clm4_5_CRUNCEP -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "DV without clm4_5" =>{ options=>"-dynamic_vegetation -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_0", }, "bgc_spinup without cn" =>{ options=>"-clm_accelerated_spinup on -bgc sp -envxml_dir .", namelst=>"spinup_state=1", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "spinup=1 without bldnml op"=>{ options=>"-clm_accelerated_spinup off -bgc bgc -envxml_dir .", namelst=>"spinup_state=1",, GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "DV without clm4_5" =>{ options=>"-dynamic_vegetation -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_0", }, "bgc_spinup without cn" =>{ options=>"-clm_accelerated_spinup on -bgc sp -envxml_dir .", namelst=>"spinup_state=1", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "baseflow w aquifer" =>{ options=>"-bgc sp -envxml_dir .", namelst=>"baseflow_scalar=1.0, lower_boundary_condition=4,use_bedrock=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "baseflow w table" =>{ options=>"-bgc sp -envxml_dir .", namelst=>"baseflow_scalar=1.0, lower_boundary_condition=3,use_bedrock=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "br_root and bgc=sp" =>{ options=>"-bgc sp -envxml_dir .", namelst=>"br_root=1.0", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "both co2_type and on nml" =>{ options=>"-co2_type constant -envxml_dir .", namelst=>"co2_type='prognostic'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"", }, "both lnd_frac and on nml" =>{ options=>"-lnd_frac domain.nc -envxml_dir .", namelst=>"fatmlndfrc='frac.nc'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"", }, "branch but NO nrevsn" =>{ options=>"-clm_start_type branch -envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"", }, "glc_nec inconsistent" =>{ options=>"-envxml_dir .", namelst=>"maxpatch_glcmec=5", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"", }, "NoGLCMec" =>{ options=>"-envxml_dir . -glc_nec 0", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "UpdateGlcContradict" =>{ options=>"-envxml_dir .", namelst=>"glc_do_dynglacier=.false.", GLC_TWO_WAY_COUPLING=>"TRUE", conopts=>"-phys clm4_5", }, "clm40andUpdateGlc" =>{ options=>"-envxml_dir .", namelst=>"", GLC_TWO_WAY_COUPLING=>"TRUE", conopts=>"-phys clm4_0", }, "useFATESContradict" =>{ options=>"-bgc fates -envxml_dir . -no-megan", namelst=>"use_fates=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "useFATESContradict2" =>{ options=>"-envxml_dir . -no-megan", namelst=>"use_fates=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "useFATESWCN" =>{ options=>"-bgc fates -envxml_dir . -no-megan", namelst=>"use_cn=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "useFATESWcreatecrop" =>{ options=>"-bgc fates -envxml_dir . -no-megan", namelst=>"create_crop_landunit=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "createcropFalse" =>{ options=>"-bgc bgc -envxml_dir . -no-megan", namelst=>"create_crop_landunit=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "useFATESWTransient" =>{ options=>"-bgc fates -use_case 20thC_transient -envxml_dir . -no-megan -res 10x15", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "useFATESclm40" =>{ options=>"-bgc fates -envxml_dir . -no-megan", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_0", }, "usespitfireButNOTFATES" =>{ options=>"-envxml_dir . -no-megan", namelst=>"use_fates_spitfire=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "useloggingButNOTFATES" =>{ options=>"-envxml_dir . -no-megan", namelst=>"use_fates_logging=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "useinventorybutnotfile" =>{ options=>"-bgc fates -envxml_dir . -no-megan", namelst=>"use_fates_inventory_init=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "inventoryfileDNE" =>{ options=>"-bgc fates -envxml_dir . -no-megan", namelst=>"use_fates_inventory_init=.true., fates_inventory_ctrl_filename='zztop'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "useMEGANwithFATES" =>{ options=>"-bgc fates -envxml_dir . -megan", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, "useHYDSTwithFATES" =>{ options=>"-bgc fates -envxml_dir . -no-megan", namelst=>"use_hydrstress=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "useHYDSTwithdynroot" =>{ options=>"-bgc bgc -envxml_dir . -megan", namelst=>"use_hydrstress=.true., use_dynroot=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "fireemiswith40" =>{ options=>"-envxml_dir . -fire_emis", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_0", }, "specWOfireemis" =>{ options=>"-envxml_dir . -no-fire_emis", namelst=>"fire_emis_specifier='bc_a1 = BC'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "elevWOfireemis" =>{ options=>"-envxml_dir . -no-fire_emis", namelst=>"fire_emis_elevated=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "noanthro_w_crop" =>{ options=>"-envxml_dir . -res 0.9x1.25 -bgc bgc -crop -use_case 1850_noanthro_control", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "noanthro_w_irrig" =>{ options=>"-envxml_dir . -res 0.9x1.25 -bgc bgc -use_case 1850_noanthro_control", namelst=>"irrigate=T", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "spdotransconflict" =>{ options=>"-envxml_dir . -bgc sp -use_case 20thC_transient", namelst=>"do_transient_pfts=T,do_transient_crops=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "nocropwfert" =>{ options=>"-envxml_dir . -bgc sp -no-crop", namelst=>"use_fertilizer=T", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "lmr1WOcn" =>{ options=>"-envxml_dir . -bgc sp", namelst=>"leafresp_method=1", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "lmr2WOcn" =>{ options=>"-envxml_dir . -bgc sp", namelst=>"leafresp_method=2", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "lmr0Wcn" =>{ options=>"-envxml_dir . -bgc bgc", namelst=>"leafresp_method=0", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "nofireButSetcli_scale" =>{ options=>"-envxml_dir . -bgc bgc", namelst=>"fire_method='nofire', cli_scale=5.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "nocnButSetrh_low" =>{ options=>"-envxml_dir . -bgc sp", namelst=>"rh_low=5.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "funWOcn" =>{ options=>"-envxml_dir . -bgc sp", namelst=>"use_fun=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "flexCNWOcn" =>{ options=>"-envxml_dir . -bgc sp", namelst=>"use_flexibleCN=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "flexCNFUNwcarbonresp" =>{ options=>"-envxml_dir . -bgc bgc", namelst=>"use_flexibleCN=.true.,use_FUN=.true.,carbon_resp_opt=1", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "funWOnitrif" =>{ options=>"-envxml_dir .", namelst=>"use_fun=.true., use_nitrif_denitrif=.false.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "knitrmaxWOnitrif" =>{ options=>"-envxml_dir . -bgc bgc", namelst=>"use_nitrif_denitrif=.false., k_nitr_max=1.0", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "respcoefWOnitrif" =>{ options=>"-envxml_dir . -bgc bgc", namelst=>"use_nitrif_denitrif=.false., denitrif_respiration_coefficient=1.0", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "respexpWOnitrif" =>{ options=>"-envxml_dir . -bgc bgc", namelst=>"use_nitrif_denitrif=.false., denitrif_respiration_exponent=1.0", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "nitrcoefWOnitrif" =>{ options=>"-envxml_dir . -bgc bgc", namelst=>"use_nitrif_denitrif=.false., denitrif_nitrateconc_coefficient=1.0", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "nitrexpWOnitrif" =>{ options=>"-envxml_dir . -bgc bgc", namelst=>"use_nitrif_denitrif=.false., denitrif_nitrateconc_exponent=1.0", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "lunaWSPandlnctrue" =>{ options=>"-envxml_dir . -bgc sp", namelst=>"use_luna=.true., lnc_opt=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "NOlunabutsetJmaxb1" =>{ options=>"-envxml_dir . -bgc sp", namelst=>"use_luna=.false., jmaxb1=1.0", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "envxml_not_dir" =>{ options=>"-envxml_dir myuser_nl_clm", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"", }, "envxml_emptydir" =>{ options=>"-envxml_dir xFail", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"", }, ); foreach my $key ( keys(%failtest) ) { print( "$key\n" ); system( "../configure -s ".$failtest{$key}{"conopts"}); my $options = $failtest{$key}{"options"}; my $namelist = $failtest{$key}{"namelst"}; &make_env_run( GLC_TWO_WAY_COUPLING=>$failtest{$key}{"GLC_TWO_WAY_COUPLING"} ); eval{ system( "$bldnml $options -namelist \"&clmexp $namelist /\" > $tempfile 2>&1 " ); }; isnt( $?, 0, $key ); system( "cat $tempfile" ); } print "\n===============================================================================\n"; print "Start Warning testing. These should fail unless -ignore_warnings option is used \n"; print "=================================================================================\n"; # Warning testing, do things that give warnings, unless -ignore_warnings option is used my %warntest = ( # Warnings without the -ignore_warnings option given "coldwfinidat" =>{ options=>"-envxml_dir . -clm_start_type cold", namelst=>"finidat = 'testfile.nc'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "bgcspin_w_suplnitro" =>{ options=>"-envxml_dir . -bgc bgc -clm_accelerated_spinup on", namelst=>"suplnitro='ALL'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "use_c13_wo_bgc" =>{ options=>"-envxml_dir . -bgc cn", namelst=>"use_c13=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "use_c14_wo_bgc" =>{ options=>"-envxml_dir . -bgc cn", namelst=>"use_c14=.true.", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "maxpft_wrong" =>{ options=>"-envxml_dir . -bgc cn", namelst=>"maxpatch_pft=19", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "soilm_stream w transient" =>{ options=>"-res 0.9x1.25 -envxml_dir . -use_case 20thC_transient", namelst=>"use_soil_moisture_streams=T,soilm_tintalgo='linear'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "missing_ndep_file" =>{ options=>"-envxml_dir . -bgc bgc -ssp_rcp SSP4-6.0", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "ext_SSP1-2.6" =>{ options=>"-res 0.9x1.25 -envxml_dir . -bgc bgc -crop -use_case 2100-2300_SSP1-2.6_transient", namelst=>"", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm5_0", }, "bad_megan_spec" =>{ options=>"-envxml_dir . -bgc bgc -megan", namelst=>"megan_specifier='ZZTOP=zztop'", GLC_TWO_WAY_COUPLING=>"FALSE", conopts=>"-phys clm4_5", }, ); foreach my $key ( keys(%warntest) ) { print( "$key\n" ); system( "../configure -s ".$warntest{$key}{"conopts"}); my $options = $warntest{$key}{"options"}; my $namelist = $warntest{$key}{"namelst"}; &make_env_run( GLC_TWO_WAY_COUPLING=>$warntest{$key}{"GLC_TWO_WAY_COUPLING"} ); eval{ system( "$bldnml $options -namelist \"&clmexp $namelist /\" > $tempfile 2>&1 " ); }; isnt( $?, 0, $key ); system( "cat $tempfile" ); # Now run with -ignore_warnings and make sure it works $options .= " -ignore_warnings"; eval{ system( "$bldnml $options -namelist \"&clmexp $namelist /\" > $tempfile 2>&1 " ); }; is( $?, 0, $key ); is( $@, '', "$options" ); system( "cat $tempfile" ); } print "\n==================================================\n"; print "Test ALL resolutions with CLM5.0 and SP \n"; print "==================================================\n"; # Check for ALL resolutions with CLM50SP $mode = "-phys clm5_0"; system( "../configure -s $mode" ); my $reslist = `../queryDefaultNamelist.pl -res list -s`; my @resolutions = split( / /, $reslist ); my @regional; foreach my $res ( @resolutions ) { chomp($res); print "=== Test $res === \n"; my $options = "-res $res -bgc sp -envxml_dir ."; # Regional single point resolutions if ( $res =~ /^([0-9]+x[0-9]+_[a-zA-Z]+)$/ ) { push( @regional, $res ); next; # Resolutions for mksurfdata mapping } elsif ( $res eq "0.5x0.5" || $res eq "0.25x0.25" || $res eq "0.1x0.1" || $res eq "3x3min" || $res eq "5x5min" || $res eq "10x10min" || $res eq "0.125x0.125" || $res eq "0.33x0.33" || $res eq "1km-merge-10min" ) { next; # Resolutions supported in clm40 but NOT clm45/clm50 } elsif ( $res eq "ne240np4" || $res eq "ne60np4" || $res eq "ne4np4" || $res eq "2.5x3.33" || $res eq "0.23x0.31" || $res eq "0.47x0.63" || $res eq "94x192" || $res eq "8x16" || $res eq "32x64" || $res eq "128x256" || $res eq "360x720cru" || $res eq "512x1024" ) { next; # Resolutions not supported on release branch } elsif ( $res eq "ne120np4" || $res eq "conus_30_x8" ) { next; } &make_env_run(); eval{ system( "$bldnml $options > $tempfile 2>&1 " ); }; is( $@, '', "$options" ); $cfiles->checkfilesexist( "$options", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode ); $cfiles->dodiffonfile( "$real_par_file", "$options", $mode ); $cfiles->comparefiles( "$options", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options", $mode ); } &cleanup(); print "\n"; } print "\n==================================================\n"; print " Test important resolutions for CLM4.5 and BGC\n"; print "==================================================\n"; $mode = "-phys clm4_5"; system( "../configure -s $mode" ); my @resolutions = ( "4x5", "10x15", "ne30np4", "ne16np4", "1.9x2.5", "0.9x1.25" ); my @regional; my $nlbgcmode = "bgc"; my $mode = "clm45-$nlbgcmode"; foreach my $res ( @resolutions ) { chomp($res); print "=== Test $res === \n"; my $options = "-res $res -envxml_dir . -bgc $nlbgcmode"; &make_env_run(); eval{ system( "$bldnml $options > $tempfile 2>&1 " ); }; is( $@, '', "$options" ); $cfiles->checkfilesexist( "$options", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode ); $cfiles->comparefiles( "$options", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options", $mode ); } &cleanup(); print "\n"; } print "\n==================================================\n"; print " Test all use-cases \n"; print "==================================================\n"; # Run over all use-cases... my $list = `$bldnml -use_case list 2>&1 | grep "use case"`; my @usecases; if ( $list =~ /build-namelist : use cases : (.+)$/ ) { my @usecases = split( / /, $list ); } else { die "ERROR:: Trouble getting list of use-cases\n"; } foreach my $usecase ( @usecases ) { $options = "-use_case $usecase -envxml_dir ."; &make_env_run(); eval{ system( "$bldnml $options > $tempfile 2>&1 " ); }; is( $@, '', "options: $options" ); $cfiles->checkfilesexist( "$options", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode ); $cfiles->comparefiles( "$options", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options", $mode ); } &cleanup(); } print "\n==================================================\n"; print "Test single-point regional cases \n"; print "==================================================\n"; # Run over single-point regional cases foreach my $res ( @regional ) { $mode = "-sitespf_pt $res -phys clm4_0"; system( "../configure -s $mode" ); &make_env_run(); eval{ system( "$bldnml -envxml_dir . > $tempfile 2>&1 " ); }; is( $@, '', "$res" ); $cfiles->checkfilesexist( "$res", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$res", $mode ); $cfiles->dodiffonfile( "$real_par_file", "$res", $mode ); $cfiles->comparefiles( "$res", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$res", $mode ); } &cleanup(); } print "\n==================================================\n"; print "Test crop resolutions \n"; print "==================================================\n"; # Check for crop resolutions $mode = "-phys clm5_0"; system( "../configure -s $mode" ); my @crop_res = ( "1x1_numaIA", "1x1_smallvilleIA", "4x5", "10x15", "0.9x1.25", "1.9x2.5", "ne30np4" ); foreach my $res ( @crop_res ) { $options = "-bgc bgc -crop -res $res -envxml_dir ."; &make_env_run(); eval{ system( "$bldnml $options > $tempfile 2>&1 " ); }; is( $@, '', "$options" ); $cfiles->checkfilesexist( "$options", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode ); $cfiles->dodiffonfile( "$real_par_file", "$options", $mode ); $cfiles->comparefiles( "$options", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options", $mode ); } &cleanup(); } print "\n==================================================\n"; print " Test glc_mec resolutions \n"; print "==================================================\n"; # Check for glc_mec resolutions # # NOTE(wjs, 2017-12-17) I'm not sure if these glc_mec-specific tests are # still needed: are they covered with other tests now that we always run # with glc_mec? Some historical notes: (1) The three resolutions listed # here used to be the only three with which you could run glc_mec; now # you can run glc_mec with all resolutions. (2) This used to point to # all of the glacierMEC use cases; now we don't have glacierMEC-specific # use cases, but I've kept these pointing to the equivalent normal use # cases; I'm not sure if it's actually important to test this with all # of the different use cases. $mode = "-phys clm4_5"; system( "../configure -s $mode" ); my @glc_res = ( "0.9x1.25", "1.9x2.5" ); my @use_cases = ( "1850-2100_SSP1-2.6_transient", "1850-2100_SSP2-4.5_transient", "1850-2100_SSP3-7.0_transient", "1850-2100_SSP5-8.5_transient", "1850_control", "2000_control", "2010_control", "20thC_transient", ); foreach my $res ( @glc_res ) { foreach my $usecase ( @use_cases ) { $options = "-bgc bgc -res $res -use_case $usecase -envxml_dir . "; &make_env_run(); eval{ system( "$bldnml $options > $tempfile 2>&1 " ); }; is( $@, '', "$options" ); $cfiles->checkfilesexist( "$options", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode ); $cfiles->comparefiles( "$options", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options", $mode ); } &cleanup(); } } # Extensions at one degree with crop on $mode = "-phys clm5_0"; system( "../configure -s $mode" ); @glc_res = ( "0.9x1.25" ); my @use_cases = ( "2100-2300_SSP5-8.5_transient", "2100-2300_SSP5-3.4_transient", "2100_SSP3-7.0_control", ); foreach my $res ( @glc_res ) { foreach my $usecase ( @use_cases ) { $options = "-bgc bgc -res $res -bgc bgc -crop -use_case $usecase -envxml_dir . "; &make_env_run(); eval{ system( "$bldnml $options > $tempfile 2>&1 " ); }; is( $@, '', "$options" ); $cfiles->checkfilesexist( "$options", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode ); $cfiles->comparefiles( "$options", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options", $mode ); } &cleanup(); } } # Transient 20th Century simulations $mode = "-phys clm5_0"; system( "../configure -s $mode" ); my @tran_res = ( "48x96", "0.9x1.25", "1.9x2.5", "ne30np4", "10x15" ); my $usecase = "20thC_transient"; my $GLC_NEC = 10; foreach my $res ( @tran_res ) { $options = "-res $res -use_case $usecase -envxml_dir . "; &make_env_run(); eval{ system( "$bldnml $options > $tempfile 2>&1 " ); }; is( $@, '', "$options" ); $cfiles->checkfilesexist( "$options", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode ); $cfiles->dodiffonfile( "$real_par_file", "$options", $mode ); $cfiles->comparefiles( "$options", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options", $mode ); } &cleanup(); } # Transient ssp_rcp scenarios that work $mode = "-phys clm5_0"; system( "../configure -s $mode" ); my @tran_res = ( "0.9x1.25", "1.9x2.5", "10x15" ); foreach my $usecase ( "1850_control", "1850-2100_SSP5-8.5_transient", "1850-2100_SSP1-2.6_transient", "1850-2100_SSP3-7.0_transient", "1850-2100_SSP2-4.5_transient" ) { foreach my $res ( @tran_res ) { $options = "-res $res -bgc bgc -crop -use_case $usecase -envxml_dir . "; &make_env_run(); eval{ system( "$bldnml $options > $tempfile 2>&1 " ); }; is( $@, '', "$options" ); $cfiles->checkfilesexist( "$options", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options", $mode ); $cfiles->dodiffonfile( "$real_par_file", "$options", $mode ); $cfiles->comparefiles( "$options", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options", $mode ); } &cleanup(); } } # The SSP's that fail... my $res = "0.9x1.25"; foreach my $usecase ( "1850-2100_SSP4-3.4_transient", "1850-2100_SSP5-3.4_transient", "1850-2100_SSP1-1.9_transient", "1850-2100_SSP4-6.0_transient" ) { $options = "-res $res -bgc bgc -crop -use_case $usecase -envxml_dir . "; &make_env_run(); eval{ system( "$bldnml $options > $tempfile 2>&1 " ); }; isnt( $?, 0, $usecase ); system( "cat $tempfile" ); } print "\n==================================================\n"; print "Test clm4.5/clm5.0 resolutions \n"; print "==================================================\n"; foreach my $phys ( "clm4_5", 'clm5_0' ) { my $mode = "-phys $phys"; system( "../configure -s $mode" ); my @clmoptions = ( "-bgc bgc -envxml_dir .", "-bgc bgc -envxml_dir . -clm_accelerated_spinup=on", "-bgc bgc -envxml_dir . -light_res 360x720", "-bgc sp -envxml_dir . -vichydro", "-bgc bgc -dynamic_vegetation", "-bgc bgc -clm_demand flanduse_timeseries -sim_year 1850-2000", "-bgc bgc -envxml_dir . -namelist '&a use_c13=.true.,use_c14=.true.,use_c14_bombspike=.true./'" ); foreach my $clmopts ( @clmoptions ) { my @clmres = ( "10x15", "0.9x1.25", "1.9x2.5" ); foreach my $res ( @clmres ) { $options = "-res $res -envxml_dir . "; &make_env_run( ); eval{ system( "$bldnml $options $clmopts > $tempfile 2>&1 " ); }; is( $@, '', "$options $clmopts" ); $cfiles->checkfilesexist( "$options $clmopts", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options $clmopts", $mode ); $cfiles->comparefiles( "$options $clmopts", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options $clmopts", $mode ); } &cleanup(); } } my @clmoptions = ( "-bgc bgc -envxml_dir .", "-bgc sp -envxml_dir .", ); foreach my $clmopts ( @clmoptions ) { my @clmres = ( "ne16np4" ); foreach my $res ( @clmres ) { $options = "-res $res -envxml_dir . "; &make_env_run( ); eval{ system( "$bldnml $options $clmopts > $tempfile 2>&1 " ); }; is( $@, '', "$options $clmopts" ); $cfiles->checkfilesexist( "$options $clmopts", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options $clmopts", $mode ); $cfiles->comparefiles( "$options $clmopts", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options $clmopts", $mode ); } &cleanup(); } } system( "../configure -s $mode" ); my $clmopts = "-bgc cn -crop"; my $res = "1.9x2.5"; $options = "-res $res -namelist '&a irrigate=.true./' -crop -bgc cn -envxml_dir ."; &make_env_run(); eval{ system( "$bldnml $options $clmopts > $tempfile 2>&1 " ); }; is( $@, '', "$options $clmopts" ); $cfiles->checkfilesexist( "$options $clmopts", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options $clmopts", $mode ); $cfiles->comparefiles( "$options $clmopts", "$mode", $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options $clmopts", $mode ); } &cleanup(); # Run FATES mode for several resolutions and configurations system( "../configure -s $mode" ); my $clmoptions = "-bgc fates -envxml_dir . -no-megan"; my @clmres = ( "1x1_brazil", "5x5_amazon", "10x15", "1.9x2.5" ); foreach my $res ( @clmres ) { $options = "-res $res"; my @edoptions = ( "-use_case 2000_control", "", "-namelist \"&a use_lch4=.true.,use_nitrif_denitrif=.true./\"", "-clm_accelerated_spinup on" ); foreach my $edop (@edoptions ) { &make_env_run( ); eval{ system( "$bldnml $options $clmoptions $edop > $tempfile 2>&1 " ); }; is( $@, '', "$options $edop" ); $cfiles->checkfilesexist( "$options $edop", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$options $edop", $mode ); $cfiles->comparefiles( "$options $edop", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$options $edop", $mode ); } &cleanup(); } } } # # Run over the differen lnd_tuning modes # my $res = "0.9x1.25"; my $mask = "gx1v6"; my $simyr = "1850"; foreach my $phys ( "clm4_0", "clm4_5", 'clm5_0' ) { my $mode = "-phys $phys"; system( "../configure -s $mode" ); foreach my $forc ( "CRUv7", "GSWP3v1", "cam6.0" ) { foreach my $bgc ( "sp", "bgc" ) { my $lndtuningmode = "${phys}_${forc}"; my $clmoptions = "-res $res -mask $mask -sim_year $simyr -envxml_dir . -lnd_tuning_mod $lndtuningmode"; if ( $phys eq "clm4_0" ) { $clmoptions .= " -glc_nec 0"; } else { $clmoptions .= " -bgc $bgc"; } &make_env_run( ); eval{ system( "$bldnml $clmoptions > $tempfile 2>&1 " ); }; is( $@, '', "$clmoptions" ); $cfiles->checkfilesexist( "$clmoptions", $mode ); $cfiles->shownmldiff( "default", "standard" ); if ( defined($opts{'compare'}) ) { $cfiles->doNOTdodiffonfile( "$tempfile", "$clmoptions", $mode ); $cfiles->comparefiles( "$clmoptions", $mode, $opts{'compare'} ); } if ( defined($opts{'generate'}) ) { $cfiles->copyfiles( "$clmoptions", $mode ); } &cleanup(); } } } &cleanup(); system( "/bin/rm $finidat" ); print "\n==================================================\n"; print " Dumping output \n"; print "==================================================\n"; $xFail->parseOutput($captOut); print "Successfully ran all testing for build-namelist\n\n"; &cleanup( "config" ); system( "/bin/rm $tempfile" ); sub cleanup { # # Cleanup files created # my $type = shift; print "Cleanup files created\n"; system( "/bin/rm env_run.xml $real_par_file" ); if ( defined($type) ) { if ( $type eq "config" ) { system( "/bin/rm Filepath config_cache.xml CESM_cppdefs" ); } } else { system( "/bin/rm $tempfile *_in" ); } }