#!/usr/bin/perl
use Getopt::Long;
use IO::File;
#
# Make a namelist input file for timegcm:
#
$user  = $ENV{"LOGNAME"};
($USER = $user) =~ tr/a-z/A-Z/;
$tgcmroot = $ENV{TGCMROOT}; 
$tgcmdata = $ENV{TGCMDATA}; 
#
# Defaults for mknamelist:
#
$model = "timegcm";
$modelres  = 5.0;
#
# Set default namelist parameters:
#
&set_defaults;
#
# Get user options:
#
&GetOptions(
  "model=s"       => \$model,
  "fileout=s"     => \$fileout,
  "modelres=f"    => \$modelres,
  "comment=s@"    => \@comment,
  "uncomment=s@"  => \@uncomment,
  "h|help"        => \$help,
#
# Begin namelist parameter options:
#
  "LABEL=s"               => \$LABEL,
  "START_YEAR=i"          => \$START_YEAR,
  "START_DAY=i"           => \$START_DAY,
  "CALENDAR_ADVANCE=i"    => \$CALENDAR_ADVANCE,
  "SOURCE=s"              => \$SOURCE,
  "SOURCE_START=s"        => \$SOURCE_START,
  "START=s"               => \$START,
  "STOP=s"                => \$STOP,
  "STEP=i"                => \$STEP,
  "HIST=s"                => \$HIST,
  "OUTPUT=s"              => \$OUTPUT,
  "MXHIST_PRIM=i"         => \$MXHIST_PRIM,
  "SECSTART=s"            => \$SECSTART,
  "SECSTOP=s"             => \$SECSTOP,
  "SECHIST=s"             => \$SECHIST,
  "SECOUT=s"              => \$SECOUT,
  "MXHIST_SECH=s"         => \$MXHIST_SECH,
  "SECFLDS=s"             => \$SECFLDS,
  "SECFLDS0=s"            => \$SECFLDS0,
  "SECFLDS1=s"            => \$SECFLDS1,
  "SECFLDS2=s"            => \$SECFLDS2,
  "HPSS_PATH=s"           => \$HPSS_PATH,
  "TIDE=s"                => \$TIDE,
  "TIDE2=s"               => \$TIDE2,
  "TIDE3M3=s"             => \$TIDE3M3,
  "TIDEANN=s"             => \$TIDEANN,
  "ZATMOS_NCFILE=s"       => \$ZATMOS_NCFILE,
  "SOLGAR_BNDRY=s"        => \$SOLGAR_BNDRY,
  "SOLGAR_IMPORT=s"       => \$SOLGAR_IMPORT,
  "NCEP_NCFILE=s"         => \$NCEP_NCFILE,
  "ECMWF_NCFILE=s"        => \$ECMWF_NCFILE,
  "GSWM_MI_DI_NCFILE=s"   => \$GSWM_MI_DI_NCFILE,
  "GSWM_MI_SDI_NCFILE=s"  => \$GSWM_MI_SDI_NCFILE,
  "GSWM_NM_DI_NCFILE=s"   => \$GSWM_NM_DI_NCFILE,
  "GSWM_NM_SDI_NCFILE=s"  => \$GSWM_NM_SDI_NCFILE,
  "POTENTIAL_MODEL=s"     => \$POTENTIAL_MODEL,
  "GPI_NCFILE=s"          => \$GPI_NCFILE,
  "KP=f"                  => \$KP,
  "POWER=f"               => \$POWER,
  "CTPOTEN=f"             => \$CTPOTEN,
  "F107=f"                => \$F107,
  "F107A=f"               => \$F107A,
  "BXIMF=f"               => \$BXIMF,
  "BYIMF=f"               => \$BYIMF,
  "BZIMF=f"               => \$BZIMF,
  "SWVEL=f"               => \$SWVEL,
  "SWDEN=f"               => \$SWDEN,
  "SEE_NCFILE=s"          => \$SEE_NCFILE,
  "AURORA=i"              => \$AURORA,
  "COLFAC=f"              => \$COLFAC,
  "DYNAMO=i"              => \$DYNAMO,
  "CURRENT_PG=i"          => \$CURRENT_PG,
  "CURRENT_KQ=i"          => \$CURRENT_KQ
) or usage();
if ($help) { usage(); } # provide usage if help was requested
#
# Check for unparsed arguments:
#
if (@ARGV) {
    print STDERR ">>> $0: unrecognized arguments: @ARGV\n";
    usage();
}
#
# Validate resolution option:
#
if ($modelres != 5.0 and $modelres != 2.5) { 
  print STDERR "\n>>> Bad modelres: $modelres (must be either 5.0 or 2.5)\n";
  exit;
}
#
# Set resolution sensitive parameters:
#
$highres = 0;
if ($modelres == 2.5) { $highres = 1; }
&set_res_params($highres);
#
# Set 1 or 2 lines of SECFLDS:
#
if (defined $SECFLDS) { 
  $SECFLDS0 = $SECFLDS;
  undef $SECFLDS1;
  undef $SECFLDS2;
} 
#
# Namelist parameters to be commented or uncommented:
#
foreach $usr_comment (@comment) {
  if (! defined $comments{$usr_comment}) {
    print ">>> WARNING: Cannot find parameter $usr_comment to set comment.\n"; 
  } else {
    $comments{$usr_comment} = ";";
  }
}
foreach $usr_uncomment (@uncomment) {
  if (! defined $comments{$usr_uncomment}) {
    print ">>> WARNING: Cannot find parameter $usr_uncomment to set uncomment.\n"; 
  } else {
    $comments{$usr_uncomment} = " ";
  }
}
#
# Name of output namelist file:
#
if (defined $fileout) {
  $namelist_file = $fileout;
} else { 
  if ($highres) {
    $namelist_file = $model . "_dres_default.inp";
  } else {
    $namelist_file = $model . "_default.inp";
  }
}
#
# Write the namelist output file:
#
&write_namelist($namelist_file);
#
print "$namelist_file\n";
exit;
#-------------------------------------------------------------------------
sub set_defaults {
#
# Default namelist parameters:
#
$START_YEAR = 2002;
$START_DAY  = 80;
$CALENDAR_ADVANCE = 1;
$SOURCE_START = "80,0,0";
$START= "80,0,0";
$STOP=  "80,1,0";
$STEP= 120;
$HIST=  "0,1,0";
$MXHIST_PRIM = 10;
$SECSTART = "80,0,0";
$SECSTOP  = "80,1,0";
$SECHIST  = "0,0,12";
$MXHIST_SECH = 24;
$SECFLDS0 = "'TN','UN','VN','OMEGA','O3','O1','OX','NO','NO2','NOZ','H2O'";
$SECFLDS1 = "'OH','HO2','H','HOX','OP','CO2','CO','CH4','NE','TE','TI','Z'";
$SECFLDS2 = "'POTEN','UI_VEL','VI_VEL','WI_VEL'";
$HPSS_PATH = "'/home/$user/$model'";
$TIDE    = "0.,0.,0.,0.,0.,0.,0.,0.,0.,0.";
$TIDE2   = "0.,0.";
$TIDE3M3 = "0.,0.";
$TIDEANN = "1";
#$ZATMOS_NCFILE = "'\$TGCMDATA/zatmos_bndry.nc'";
#$SOLGAR_BNDRY_FILE  = "'\$TGCMDATA/solgar_bndry.nc'";
#$SOLGAR_IMPORT_FILE = "'\$TGCMDATA/solgar_import_ubc7.nc'";
$NCEP_NCFILE = "'\$TGCMDATA/ncep_2000001-2006365.nc'";
$ECMWF_NCFILE = "'\$TGCMDATA/ecmwf_toga_2002001-2002365.nc'";
$POTENTIAL_MODEL = "'HEELIS'";
$GPI_NCFILE = "'\$TGCMDATA/gpi_2000001-2013120.nc'";
$KP = "4.0";
$POWER  = "18.";
$CTPOTEN="30.";
$F107  = "70.";
$F107A = "70.";
$BXIMF = "0.";
$BYIMF = "0.";
$BZIMF = "0.";
$SWVEL = "400.";
$SWDEN = "4.0";
$SEE_NCFILE = "'\$TGCMDATA/see__L3_merged_2005007_007.nc'";
$AURORA = 1;
$COLFAC = "1.5";
$DYNAMO = "1";
$CURRENT_PG = "1";
$CURRENT_KQ = "0";
#
# Set default comments:
#
%comments = (
  LABEL               =>" ",
  START_YEAR          =>" ",
  START_DAY           =>" ",
  CALENDAR_ADVANCE    =>" ",
  SOURCE              =>" ",
  SOURCE_START        =>" ",
  START               =>" ",
  STOP                =>" ",
  STEP                =>" ",
  HIST                =>" ",
  OUTPUT              =>" ",
  MXHIST_PRIM         =>" ",
  SECSTART            =>" ",
  SECSTOP             =>" ",
  SECHIST             =>" ",
  SECOUT              =>" ",
  MXHIST_SECH         =>" ",
  SECFLDS             =>" ",
  SECFLDS0            =>" ",
  SECFLDS1            =>" ",
  SECFLDS2            =>" ",
  HPSS_PATH           =>";",
  TIDE                =>" ",
  TIDE2               =>" ",
  TIDE3M3             =>" ",
  TIDEANN             =>" ",
  SOLGAR_BNDRY_FILE   =>" ",
  SOLGAR_IMPORT_FILE  =>" ",
  ZATMOS_NCFILE       =>" ",
  NCEP_NCFILE         =>";",
  ECMWF_NCFILE        =>";",
  GSWM_MI_DI_NCFILE   =>" ",
  GSWM_MI_SDI_NCFILE  =>" ",
  GSWM_NM_DI_NCFILE   =>";",
  GSWM_NM_SDI_NCFILE  =>";",
  POTENTIAL_MODEL     =>" ",
  GPI_NCFILE          =>";",
  KP                  =>";",
  POWER               =>" ",
  CTPOTEN             =>" ",
  F107                =>" ",
  F107A               =>" ", 
  BXIMF               =>";",
  BYIMF               =>" ",
  BZIMF               =>" ",
  SWVEL               =>";",
  SWDEN               =>";",
  SEE_NCFILE          =>";",
  AURORA              =>" ",
  COLFAC              =>" ",
  DYNAMO              =>" ",
  CURRENT_PG          =>" ",
  CURRENT_KQ          =>" "
);

} # end sub set_defaults
#-------------------------------------------------------------------------
sub set_res_params {
  my ($highres) = @_;

  if (! defined($LABEL)) {
    if ($highres) {
      $LABEL="'${model}${version} res=2.5'";
    } else {
      $LABEL="'${model}${version} res=5.0'";
    }
  }
  if (! defined($STEP)) {
    if ($highres) {
      $STEP=60;
    } else {
      $STEP=120;
    }
  }
  if (! defined($SOURCE)) {
    if ($highres) {
      $SOURCE = "'\$TGCMDATA/timegcm1.42/ROBLE.timegcm1.42d.peqsm002.nc'"; # has 10,0,0
      $SOURCE_START = "10,0,0";
    } else {
      $SOURCE = "'\$TGCMDATA/timegcm1.42/TGCM.timegcm1.42.pcntr_eqnx_smin.nc'";
      $SOURCE_START = "80,0,0";
    }
  }
  if (! defined($OUTPUT)) {
    if ($highres) {
      $OUTPUT = "'" . $USER . "." . $model . "_dres.ptest001.nc'";
    } else {
      $OUTPUT = "'" . $USER . "." . $model . ".ptest001.nc'";
    }
  }
  if (! defined($SECOUT)) {
    if ($highres) {
      $SECOUT   = "'" . $USER . "." . $model . "_dres.stest001.nc'";
    } else {
      $SECOUT   = "'" . $USER . "." . $model . ".stest001.nc'";
    }
  }
  if (! defined($GSWM_MI_DI_NCFILE)) { 
    if ($highres) { $GSWM_MI_DI_NCFILE  = "'\$TGCMDATA/gswm_diurn_2.5d_32km.nc'"; }
    else          { $GSWM_MI_DI_NCFILE  = "'\$TGCMDATA/gswm_diurn_5.0d_32km.nc'"; }
  }
  if (! defined($GSWM_MI_SDI_NCFILE)) { 
    if ($highres) { $GSWM_MI_SDI_NCFILE = "'\$TGCMDATA/gswm_semi_2.5d_32km.nc'"; }
    else          { $GSWM_MI_SDI_NCFILE = "'\$TGCMDATA/gswm_semi_5.0d_32km.nc'"; }
  }
  if (! defined($GSWM_NM_DI_NCFILE)) { 
    if ($highres) { $GSWM_NM_DI_NCFILE  = "'\$TGCMDATA/gswm_nonmig_diurn_2.5d_32km.nc'"; 
                    $comments{GSWM_NM_DI_NCFILE} =" "; }
    else          { $GSWM_NM_DI_NCFILE  = "'\$TGCMDATA/gswm_nonmig_diurn_5.0d_32km.nc'"; }
  }
  if (! defined($GSWM_NM_SDI_NCFILE)) { 
    if ($highres) { $GSWM_NM_SDI_NCFILE = "'\$TGCMDATA/gswm_nonmig_semi_2.5d_32km.nc'"; 
                    $comments{GSWM_NM_SDI_NCFILE} =" "; }
    else          { $GSWM_NM_SDI_NCFILE = "'\$TGCMDATA/gswm_nonmig_semi_5.0d_32km.nc'"; }
  }
  if (! defined($ZATMOS_NCFILE)) { 
    if ($highres) { $ZATMOS_NCFILE = "'\$TGCMDATA/zatmos_bndry_2.5deg.nc'"; }
    else          { $ZATMOS_NCFILE = "'\$TGCMDATA/zatmos_bndry.nc'"; }
  }
  if (! defined($SOLGAR_BNDRY_FILE)) { 
    if ($highres) { $SOLGAR_BNDRY_FILE = "'\$TGCMDATA/solgar_bndry_2.5deg.nc'"; }
    else          { $SOLGAR_BNDRY_FILE = "'\$TGCMDATA/solgar_bndry.nc'"; }
  }
  if (! defined($SOLGAR_IMPORT_FILE)) { 
    if ($highres) { $SOLGAR_IMPORT_FILE = "'\$TGCMDATA/solgar_import_2.5deg_ubc7.nc'"; }
    else          { $SOLGAR_IMPORT_FILE = "'\$TGCMDATA/solgar_import_ubc7.nc'"; }
  }
  if (! defined($HPSS_PATH)) { 
    $HPSS_PATH = "/home/$user/$model";
  }
} # end sub set_res_params
#-------------------------------------------------------------------------
sub write_namelist {
my ($namelist_file) = @_;
my $fh_out = new IO::File;
$fh_out->open(">$namelist_file") or die ">>> Can't open new file $namelist_file\n";

print $fh_out <<"EOF";
&tgcm_input
;
; Namelist input file for model $model
;
$comments{LABEL}LABEL = $LABEL
$comments{START_YEAR}START_YEAR = $START_YEAR
$comments{START_DAY}START_DAY  = $START_DAY
$comments{CALENDAR_ADVANCE}CALENDAR_ADVANCE = $CALENDAR_ADVANCE
;
; SOURCE:       Start-up history file (for initial runs only)
; SOURCE_START: Time of history on start-up file (initial runs only)
;
$comments{SOURCE}SOURCE = $SOURCE
$comments{SOURCE_START}SOURCE_START = $SOURCE_START
;
; START: Start time (day,hour,minute)
; STOP:  Stop time (day,hour,minute)
; STEP:  Timestep (seconds)
;
$comments{START}START = $START
$comments{STOP}STOP  = $STOP
$comments{STEP}STEP  = $STEP
;
; Primary History parameters:
;
$comments{HIST}HIST = $HIST
$comments{OUTPUT}OUTPUT = $OUTPUT
$comments{MXHIST_PRIM}MXHIST_PRIM = $MXHIST_PRIM
;
; Secondary History parameters:
;
$comments{SECSTART}SECSTART = $SECSTART
$comments{SECSTOP}SECSTOP  = $SECSTOP
$comments{SECHIST}SECHIST  =  $SECHIST
$comments{SECOUT}SECOUT   = $SECOUT
$comments{MXHIST_SECH}MXHIST_SECH = $MXHIST_SECH
$comments{SECFLDS}SECFLDS = $SECFLDS0,
$comments{SECFLDS}          $SECFLDS1,
$comments{SECFLDS}          $SECFLDS2
;
; If HPSS_PATH is set, a csh script will be made in the execdir, that
; will copy history disk files to the HPSS in the directory HPSS_PATH.
;
$comments{HPSS_PATH}HPSS_PATH = $HPSS_PATH
;
$comments{TIDE}TIDE = $TIDE
$comments{TIDE2}TIDE2 = $TIDE2
$comments{TIDE3M3}TIDE3M3 = $TIDE3M3
$comments{TIDEANN}TIDEANN = $TIDEANN

$comments{ZATMOS_NCFILE}ZATMOS_NCFILE = $ZATMOS_NCFILE
$comments{SOLGAR_BNDRY_FILE}SOLGAR_BNDRY_FILE = $SOLGAR_BNDRY_FILE
$comments{SOLGAR_IMPORT_FILE}SOLGAR_IMPORT_FILE = $SOLGAR_IMPORT_FILE
$comments{NCEP_NCFILE}NCEP_NCFILE = $NCEP_NCFILE
$comments{ECMWF_NCFILE}ECMWF_NCFILE = $ECMWF_NCFILE
;
; At 5 deg resolution, use gswm migrating tides only.
; At 2.5 deg resolution, optionally use both migrating 
;   and non-migrating tides.
;
$comments{GSWM_MI_DI_NCFILE}GSWM_MI_DI_NCFILE  = $GSWM_MI_DI_NCFILE
$comments{GSWM_MI_SDI_NCFILE}GSWM_MI_SDI_NCFILE = $GSWM_MI_SDI_NCFILE
$comments{GSWM_NM_DI_NCFILE}GSWM_NM_DI_NCFILE  = $GSWM_NM_DI_NCFILE
$comments{GSWM_NM_SDI_NCFILE}GSWM_NM_SDI_NCFILE = $GSWM_NM_SDI_NCFILE
;
 POTENTIAL_MODEL = $POTENTIAL_MODEL
;
; Uncomment GPI_NCFILE to calculate POWER and CTPOTEN from
; Kp data, and to use data for f10.7 flux. GPI_NCFILE can be
; used only when potential_model='HEELIS'. If GPI_NCFILE is
; specified, one or more of POWER,CTPOTEN,F107,F107A must be
; commented out (data will be used for those that are commented
; out, otherwise the user-provided values will be used).
;
;GPI_NCFILE = $GPI_NCFILE
;
$comments{POWER}POWER   = $POWER
$comments{CTPOTEN}CTPOTEN = $CTPOTEN
$comments{F107}F107    = $F107
$comments{F107A}F107A   = $F107A
;
$comments{BYIMF}BYIMF   = $BYIMF
$comments{BZIMF}BZIMF   = $BZIMF
$comments{AURORA}AURORA = $AURORA
$comments{COLFAC}COLFAC = $COLFAC
$comments{DYNAMO}DYNAMO = $DYNAMO
;
; If CURRENT_PG=1, current due to plasma pressure gradient and gravity is calculated
; and included as a forcing term in the dynamo equation (default=1) (ignored if DYNAMO=0)
;
$comments{CURRENT_PG}CURRENT_PG = $CURRENT_PG
;
; If CURRENT_KQ=1, then height-integrated current density of current sheet, and
; upward current density at the top of the ionosphere is calculated (default=0)
; (ignored if DYNAMO=0) (see current.F90 to save JQR, JE13D, JE23D, KQPHI, KQLAM)
;
$comments{CURRENT_KQ}CURRENT_KQ = $CURRENT_KQ
/
EOF

$fh_out->close;
#print STDERR "mknamelist: Wrote namelist file $namelist_file\n";
} # end sub write_namelist
#-------------------------------------------------------------------------
