#! /usr/bin/env perl
use strict;
use Cwd;

if ($#ARGV == -1) {
    die " ERROR clm.buildexe: must specify a caseroot input argument";
}
my ($CASEROOT) = @ARGV;
chdir "${CASEROOT}";

my @dirs = ("$CASEROOT/Tools");
unshift @INC, @dirs;
require SetupTools;
my $sysmod; 

my $CASEBUILD		= `./xmlquery  CASEBUILD	   -value`;
my $CCSM_COMPSET	= `./xmlquery  CCSM_COMPSET	   -value`;
my $CCSM_CO2_PPMV	= `./xmlquery  CCSM_CO2_PPMV	   -value`;
my $CLM_CO2_TYPE	= `./xmlquery  CLM_CO2_TYPE	   -value`;
my $CLM_USRDAT_NAME	= `./xmlquery  CLM_USRDAT_NAME	   -value`;
my $CLM_CONFIG_OPTS	= `./xmlquery  CLM_CONFIG_OPTS	   -value`;
my $CLM_NAMELIST_OPTS	= `./xmlquery  CLM_NAMELIST_OPTS   -value`;
my $CLM_BLDNML_OPTS	= `./xmlquery  CLM_BLDNML_OPTS	   -value`;
my $CLM_NML_USE_CASE	= `./xmlquery  CLM_NML_USE_CASE	   -value`;
my $CLM_FORCE_COLDSTART = `./xmlquery  CLM_FORCE_COLDSTART -value`;
my $CCSMROOT		= `./xmlquery  CCSMROOT		   -value`;
my $COMP_INTERFACE	= `./xmlquery  COMP_INTERFACE	   -value`;
my $COMP_GLC		= `./xmlquery  COMP_GLC		   -value`;
my $DEBUG		= `./xmlquery  DEBUG		   -value`;
my $DIN_LOC_ROOT	= `./xmlquery  DIN_LOC_ROOT	   -value`;
my $GLC_NEC		= `./xmlquery  GLC_NEC		   -value`;
my $LND_GRID		= `./xmlquery  LND_GRID		   -value`;
my $LND_NCPL		= `./xmlquery  LND_NCPL		   -value`;
my $LND_DOMAIN_PATH	= `./xmlquery  LND_DOMAIN_PATH	   -value`;
my $LND_DOMAIN_FILE	= `./xmlquery  LND_DOMAIN_FILE	   -value`;
my $MASK_GRID		= `./xmlquery  MASK_GRID	   -value`;
my $NTHRDS_LND		= `./xmlquery  NTHRDS_LND	   -value`;
my $NTASKS_LND		= `./xmlquery  NTASKS_LND	   -value`;
my $NINST_LND		= `./xmlquery  NINST_LND	   -value`;
my $RUNDIR		= `./xmlquery  RUNDIR		   -value`;
my $RUN_TYPE		= `./xmlquery  RUN_TYPE		   -value`;
my $RUN_STARTDATE	= `./xmlquery  RUN_STARTDATE	   -value`;
my $RUN_REFCASE		= `./xmlquery  RUN_REFCASE	   -value`;
my $RUN_REFDATE		= `./xmlquery  RUN_REFDATE	   -value`;
my $RUN_REFTOD		= `./xmlquery  RUN_REFTOD	   -value`;
my $UTILROOT		= `./xmlquery  UTILROOT		   -value`;
my $GLC_SMB		= `./xmlquery  GLC_SMB		   -value`;

if (! -d "$CASEBUILD/clmconf" ) {
    $sysmod = "mkdir $CASEBUILD/clmconf";
    system($sysmod) == 0 or die "ERROR clm.buildnml: $sysmod failed: $?\n";
}
chdir "$CASEBUILD/clmconf";

#--------------------------------------------------------------------
# Invoke clm configure - output will go in CASEBUILD/clmconf
#--------------------------------------------------------------------

my $config_opts;
my $resolution;
my $clmusr;
if ($MASK_GRID ne "reg") {
    $config_opts = " ";
    $resolution = $LND_GRID;
    $clmusr     = "";
}
if (($MASK_GRID eq "reg") && ($LND_GRID ne "CLM_USRDAT" )) {
    $config_opts = "-sitespf_pt $LND_GRID";
    $resolution  = $LND_GRID ;
    $clmusr      = "";
}
if ( $LND_GRID eq "CLM_USRDAT" ) {
    $config_opts=" ";
    $resolution = $CLM_USRDAT_NAME;
    $clmusr     = " -clm_usr_name $CLM_USRDAT_NAME";
}
if ("$CCSM_COMPSET" =~ /1PT.*/ ) {
    $config_opts = " -sitespf_pt reg";
}

$sysmod = "$CCSMROOT/components/clm/bld/configure";
$sysmod = "$sysmod  $config_opts -comp_intf $COMP_INTERFACE ";
$sysmod = "$sysmod  $CLM_CONFIG_OPTS ";
$sysmod = "$sysmod -usr_src $CASEROOT/SourceMods/src.clm";
system($sysmod) == 0 or die "ERROR clm.buildnml: $sysmod failed: $?\n";

#--------------------------------------------------------------------
# Invoke clm build-namelist - output will go in $CASEBUILD/clmconf
#--------------------------------------------------------------------

my $startfiletype = "finidat";
my $start_type = "default";
if ($RUN_TYPE eq "startup" ) {
    if ($CLM_FORCE_COLDSTART eq "on") {$start_type = "cold";}
} else {
    if ($RUN_TYPE eq "hybrid" ) {
	$start_type = "startup";
    } else {
	$start_type = $RUN_TYPE;
    }
}
if ($RUN_TYPE eq "branch" ) {$startfiletype = "nrevsn";}

my $inst_string;
my $inst_counter = 1;
while ($inst_counter <= $NINST_LND) {

    # -----------------------------------------------------
    # determine instance string 
    # -----------------------------------------------------

    $inst_string = "";       
    if ($NINST_LND > 1) {
	$inst_string = `printf _%04d $inst_counter`;

	# If multi-instance case does not have restart file, use single-case restart
	# for each instance
	if ( (! -e "$RUNDIR/rpointer.lnd${inst_string}") && (-e "$RUNDIR/rpointer.lnd") ) {
	    $sysmod = "cp -v $RUNDIR/rpointer.lnd $RUNDIR/rpointer.lnd${inst_string}";
	    system($sysmod) == 0 or die "ERROR clm.buildnml: $sysmod failed: $?\n";
	}
    }

    # -----------------------------------------------------
    # create clmconf/cesm_namelist
    # -----------------------------------------------------

    if ( -e "$CASEBUILD/clm.input_data_list" ) {
	$sysmod = "rm $CASEBUILD/clm.input_data_list";
	system($sysmod) == 0 or die "ERROR clm.buildnml: $sysmod failed: $?\n";
    }
    my $clmicfile;
    my $clm_startfile;
    if (( $RUN_TYPE eq "hybrid") || ($RUN_TYPE eq "branch" )) {
	$clm_startfile = "${RUN_REFCASE}.clm2${inst_string}.r.${RUN_REFDATE}-${RUN_REFTOD}.nc";
	if ( -e "$RUNDIR/$clm_startfile") {
	    $clm_startfile = "$clm_startfile";
	} else {
	    $clm_startfile = "${RUN_REFCASE}.clm2.r.${RUN_REFDATE}-${RUN_REFTOD}.nc";
	}
	$clmicfile = " $startfiletype = \'$clm_startfile\'";
    }

    my $infile_text = "";
    if ($clmicfile) {$infile_text .= "$startfiletype = \'$clm_startfile\' \n"; }

    SetupTools::create_namelist_infile("$CASEROOT", 
				       "$CASEROOT/user_nl_clm${inst_string}", 
				       "$CASEBUILD/clmconf/cesm_namelist", 
				       "$infile_text");

    # -----------------------------------------------------
    # call build-namelist
    # -----------------------------------------------------

    my $glc_opts = "";
    if ("$COMP_GLC" ne "sglc" ) {$glc_opts = "-glc_present -glc_smb .$GLC_SMB. ";}

    my $usecase = " ";
    if ($CLM_NML_USE_CASE ne "UNSET") {$usecase = "-use_case $CLM_NML_USE_CASE";}

    my $start_ymd = `echo $RUN_STARTDATE | sed s/-//g`;
    my $ignore = "-ignore_ic_date";
    if (($RUN_STARTDATE =~ /.*-01-01.*/) || ($RUN_STARTDATE =~ /.*-09-01.*/)) {	$ignore = "-ignore_ic_year";}

    $sysmod = "$CCSMROOT/components/clm/bld/build-namelist -infile $CASEBUILD/clmconf/cesm_namelist ";
    $sysmod = "$sysmod -csmdata $DIN_LOC_ROOT -inputdata $CASEBUILD/clm.input_data_list $ignore"; 
    $sysmod = "$sysmod -namelist \" \&clm_inparm  start_ymd=$start_ymd $CLM_NAMELIST_OPTS \/\"";
    $sysmod = "$sysmod $usecase $glc_opts -res $resolution $clmusr -clm_start_type $start_type";
    $sysmod = "$sysmod -envxml_dir $CASEROOT -l_ncpl $LND_NCPL -lnd_frac ${LND_DOMAIN_PATH}/${LND_DOMAIN_FILE}";
    $sysmod = "$sysmod -glc_nec $GLC_NEC -co2_ppmv $CCSM_CO2_PPMV -co2_type $CLM_CO2_TYPE ";
    $sysmod = "$sysmod -config $CASEBUILD/clmconf/config_cache.xml $CLM_BLDNML_OPTS";
    system($sysmod) == 0 or die "ERROR clm.buildnml: $sysmod failed: $?\n";
    
    # -----------------------------------------------------
    # move lnd_in to $RUNDIR
    # -----------------------------------------------------

    if ( -d ${RUNDIR} ) {
	$sysmod = "cp $CASEBUILD/clmconf/lnd_in ${RUNDIR}/lnd_in${inst_string}";
	system($sysmod) == 0 or die "ERROR clm.buildnml: $sysmod failed: $?\n";

	# Only copy drv_flds_in namelist file if one doesn't already exist
	if ( ! -f "${RUNDIR}/drv_flds_in" && -f "$CASEBUILD/clmconf/drv_flds_in" ) {
	    $sysmod = "cp $CASEBUILD/clmconf/drv_flds_in ${RUNDIR}/. >& /dev/null";
	    system($sysmod) == 0 or die "ERROR clm.buildnml: $sysmod failed: $?\n";
	}
    }

    # -----------------------------------------------------
    # increment instance counter
    # -----------------------------------------------------

    $inst_counter = $inst_counter + 1;
}

exit (0);


