#!/bin/csh -f

setenv START_OF_COMPILE "`date`"

cont1:

if ( !  -e configure.wrf  ) then
   if ( $1 == "all_wrfvar" ) then
      ./configure wrfda
      set dontask
   else
      ./configure $1
      set dontask
   endif
endif


#----------------------------------
if ( ! $?WRF_KPP )   setenv WRF_KPP  0
if ( $WRF_KPP == 1 ) then
chem/KPP/compile_wkc
endif

#---------------------------------

if ( ! $?dontask && $?prompt ) then
  echo "This script assumes you have configured the code already."
  echo "You only need to configure once."
  echo "If you wish to reconfigure, type c at the prompt below"
  echo " "
  echo "Ready to compile? [ync]"
  set resp=$<

  if ( "$resp" == "c" ) then
    ./configure
    goto cont1
  endif

  if ( "$resp" == "n" ) then
    exit 2
  endif
endif

set arglist=""
foreach a ( $argv )
  if ( "$a" == "-h" ) then
    goto hlp
  else
    if ( "$a" != "-d" ) then
      set arglist = ( $arglist $a )
    endif
    if ( "$a" == "all_wrfvar" ) then
      grep "DA_CORE=1" configure.wrf > /dev/null
      if ( ! $status ) then 
         # If configuration file has DA_CORE=1 hardwired, ok to set WRF_DA_CORE to 1
         setenv WRF_DA_CORE 1
      endif
    endif
    if ( "$a" == "nmm_real" ) then
      grep "NMM_CORE=1" configure.wrf > /dev/null
      if ( ! $status ) then 
         # If configuration file has NMM_CORE=1 hardwired, ok to set WRF_NMM_CORE to 1
         if ( ! $?WRF_NMM_CORE ) setenv WRF_NMM_CORE 1
      endif
    endif
    if ( "$a" == "-j" ) then
      shift argv
      setenv J "-j $argv[1]"
    endif
  endif
end

if ( "$arglist" == "" ) then
  goto hlp
else
  unsetenv A2DCASE
  setenv A2DCASE `echo $arglist | grep 2d`

  if ( ! (   $?WRF_EM_CORE  || $?WRF_NMM_CORE \
          ||  $?WRF_COAMPS_CORE || $?WRF_EXP_CORE )) then 
    echo 'None of WRF_EM_CORE, WRF_NMM_CORE, '
#    echo '        WRF_COAMPS_CORE, or WRF_EXP_CORE '
    echo '        specified in shell environment.... '
    setenv WRF_EM_CORE 1
    setenv WRF_NMM_CORE 0
    setenv WRF_COAMPS_CORE 0
    setenv WRF_EXP_CORE 0
  endif

# these settings get passed down through the environment in the
# calls to Make
  if ( ! $?WRF_DA_CORE )     setenv WRF_DA_CORE 0
  if ( ! $?WRF_EM_CORE )     setenv WRF_EM_CORE 0
  if ( ! $?WRF_NMM_CORE )    setenv WRF_NMM_CORE 0
  if ( ! $?WRF_NMM_NEST )    setenv WRF_NMM_NEST 0
  if ( ! $?WRF_COAMPS_CORE ) setenv WRF_COAMPS_CORE 0
  if ( ! $?WRF_EXP_CORE )    setenv WRF_EXP_CORE 0
  if ( ! $?WRF_CHEM )        setenv WRF_CHEM 0
  if ( ! $?WRF_DFI_RADAR )   setenv WRF_DFI_RADAR 0
  if ( ! $?HWRF )            setenv HWRF 0
  if ( ! $?WRF_CONVERT ) then
     if ( "$arglist" == "convert_em" ) then
       setenv WRF_CONVERT 1
       setenv WRF_EM_CORE 0
     else
       setenv WRF_CONVERT 0
     endif
  endif

  if ( ! $?DA_ARCHFLAGS )     setenv DA_ARCHFLAGS ""

  if ( ( $WRF_DA_CORE == 1 )  && ( ! -d var ) ) then
    echo "  "
    echo "You need to download and untar the Var code, or"
    echo "unset the WRF_DA_CORE env variable."
    echo "  "
    exit
  endif

  if ( ( $WRF_CHEM == 1 )  && ( ! -d chem ) ) then
    echo "  "
    echo "You need to download and untar the chem code, or"
    echo "unset the WRF_CHEM env variable."
    echo "  "
    exit
  endif

  set overwrite=0
  if ($WRF_NMM_CORE == 1 && $WRF_DFI_RADAR == 1 ) then
    echo "radar dfi not yet supported in NMM core, set WRF_DFI_RADAR to 0 "
  endif

  if ($WRF_NMM_CORE == 1 && $WRF_CHEM == 1 ) then
    echo "Chemistry not yet supported in NMM core, set WRF_CHEM to 0 "
    if ( ! -f Registry/Registry ) then
      echo Registry file does not exist
      set overwrite=1
    else
      head -2 Registry/Registry | tail -1 | grep NMM_CHEM > /dev/null
      if ( $status ) then
        set overwrite=1
      else 
        set nmm_time=`ls -1tr Registry | cat -n | grep -w 'Registry\.NMM_CHEM' | grep -v 'Registry.NMM_CHEM.' | awk '{print $1}'`
        set rg_time=`ls -1tr Registry | cat -n | grep -w 'Registry' | grep -v 'Registry.' | awk '{print $1}'`
        if ( $nmm_time > $rg_time ) set overwrite=1
      endif
    endif
    if ( $overwrite ) then
      echo copying Registry/Registry.NMM_CHEM to Registry/Registry
      echo '## WARNING: this file is autogenerated from Registry/Registry.NMM_CHEM. Changes may be lost' > Registry/Registry
      /bin/cat Registry/Registry.NMM_CHEM >> Registry/Registry
    endif
#   exit 2
  endif


  if ($WRF_EM_CORE == 1 && $WRF_NMM_CORE == 1 ) then
    echo "Cannot compile both EM and NMM cores in same executable yet."
    exit 2
  endif
  if ($WRF_EM_CORE == 0 && $WRF_NMM_CORE == 0 && ! $WRF_CONVERT == 1 ) then
    echo "Cannot compile because both EM and NMM cores are set to 0."
    exit 2
  endif
  if ("$arglist" == 'nmm_real' && $WRF_NMM_CORE == 0) then
    echo WRF_NMM_CORE must be set to 1 in order to compile nmm_real
    exit 2
  endif
  if (($WRF_EM_CORE == 1)&&($WRF_DA_CORE == 0 ) &&($WRF_CHEM == 0 )&&($WRF_CONVERT == 0))  then
    if ( ! -f Registry/Registry ) then
      set overwrite=1
    else
      head -2 Registry/Registry | tail -1 | grep EM > /dev/null
      if ( $status ) then
        set overwrite=1
      else
        set em_time=`ls -1tr Registry | cat -n | grep -w 'Registry\.EM' | grep -v 'Registry.EM.' | awk '{print $1}'`
        set rg_time=`ls -1tr Registry | cat -n | grep -w 'Registry' | grep -v 'Registry.' | awk '{print $1}'`
        if ( $em_time > $rg_time ) set overwrite=1
      endif
    endif
    if ( $overwrite ) then
      echo copying Registry/Registry.EM to Registry/Registry
      echo '## WARNING: this file is autogenerated from Registry/Registry.EM. Changes may be lost' > Registry/Registry
      /bin/cat Registry/Registry.EM >> Registry/Registry
    endif
  else if (($WRF_EM_CORE == 1)&&($WRF_CHEM == 1 ))  then
    if ( ! -f Registry/Registry ) then
      set overwrite=1
    else
      head -2 Registry/Registry | tail -1 | grep EM_CHEM > /dev/null
      if ( $status ) then
        set overwrite=1
      else
        set em_time=`ls -1tr Registry | cat -n | grep -w 'Registry\.EM_CHEM' | grep -v 'Registry.EM_CHEM.' | awk '{print $1}'`
        set rg_time=`ls -1tr Registry | cat -n | grep -w 'Registry' | grep -v 'Registry.' | awk '{print $1}'`
        if ( $em_time > $rg_time ) set overwrite=1
      endif
    endif
    if ( $overwrite ) then
      echo copying Registry/Registry.EM_CHEM to Registry/Registry
      echo '## WARNING: this file is autogenerated from Registry/Registry.EM_CHEM. Changes may be lost' > Registry/Registry
      /bin/cat Registry/Registry.EM_CHEM >> Registry/Registry
    endif
  else if (($WRF_EM_CORE == 1)&&($WRF_DFI_RADAR == 1 ))  then
    if ( ! -f Registry/Registry ) then
      set overwrite=1
    endif
    if ( $overwrite ) then
      echo copying Registry/Registry.EM to Registry/Registry
      echo '## WARNING: this file is autogenerated from Registry/Registry.EM. Changes may be lost' > Registry/Registry
      /bin/cat Registry/Registry.EM >> Registry/Registry
    endif
  else if (($WRF_EM_CORE == 0)&&($WRF_CONVERT == 1 ))  then
    if ( ! -f Registry/Registry ) then
      set overwrite=1
    else
      head -2 Registry/Registry | tail -1 | grep EM_CONVERT > /dev/null
      if ( $status ) then
        set overwrite=1
      else
        set em_time=`ls -1tr Registry | cat -n | grep -w 'Registry\.EM_CONVERT' | grep -v 'Registry.EM_CONVERT.' | awk '{print $1}'`
        set rg_time=`ls -1tr Registry | cat -n | grep -w 'Registry' | grep -v 'Registry.' | awk '{print $1}'`
        if ( $em_time > $rg_time ) set overwrite=1
      endif
    endif
    if ( $overwrite ) then
      echo copying Registry/Registry.CONVERT to Registry/Registry
      echo '## WARNING: this file is autogenerated from Registry/Registry.CONVERT. Changes may be lost' > Registry/Registry
      /bin/cat Registry/Registry.CONVERT >> Registry/Registry
    endif
  else if ( $WRF_DA_CORE == 1 )  then
    if ( ! -f Registry/Registry ) then
      set overwrite=1
    else
      head -2 Registry/Registry | tail -1 | grep WRFVAR > /dev/null
      if ( $status ) then
        set overwrite=1
      else
        set nmm_time=`ls -1tr Registry | cat -n | grep -w 'Registry\.NMM' | grep -v 'Registry.NMM.' | awk '{print $1}'`
        set rg_time=`ls -1tr Registry | cat -n | grep -w 'Registry' | grep -v 'Registry.' | awk '{print $1}'`
        if ( $nmm_time > $rg_time ) set overwrite=1
      endif
    endif
    if ( $overwrite ) then
      echo copying Registry/Registry.wrfvar to Registry/Registry
      echo '## WARNING: this file is autogenerated from Registry/Registry.wrfvar. Changes may be lost' > Registry/Registry
      /bin/cat Registry/Registry.wrfvar >> Registry/Registry
    endif
    if ( $?CRTM ) then
       if ( ! $?BUFR ) then
          echo "  "
          echo "BUFR library will be compiled for radiance data ingest."
          echo "  "
          setenv BUFR 1
       endif
       setenv CRTM_CPP "-DCRTM"
       setenv CRTM_LIB "-L../external/crtm/libsrc -lCRTM"
       setenv CRTM_SRC "-I../external/crtm/libsrc"
       setenv SFC_CRTM `grep '^SFC' configure.wrf | awk '{print $3}' | sed -e 's/\// /g' | awk '{print $NF}'`
       setenv ABI_CRTM `grep '^SFC' configure.wrf | grep -o -E "\-m[0-9]{2}"`
    else
       setenv CRTM_CPP " "
       setenv CRTM_LIB " "
       setenv CRTM_SRC " "
    endif
    if ( $?RTTOV ) then
       if ( ! $?BUFR ) then
          echo "  "
          echo "BUFR library is needed for radiance data ingest."
          echo "  "
          setenv BUFR 1
       endif
       setenv RTTOV_CPP "-DRTTOV"
       setenv RTTOV_LIB "-L${RTTOV}/lib -lrttov10.1.0_coef_io -lrttov10.1.0_emis_atlas -lrttov10.1.0_main"
       setenv RTTOV_SRC "-I${RTTOV}/include -I${RTTOV}/mod"
    else
       setenv RTTOV_CPP " "
       setenv RTTOV_LIB " "
       setenv RTTOV_SRC " "
    endif
    if ( $?BUFR ) then
       setenv BUFR_CPP "-DBUFR"
       setenv BUFR_LIB "-L../external/bufr -lbufr"
    else
       setenv BUFR_CPP " "
       setenv BUFR_LIB " "
    endif
    if ( $?WAVELET ) then
       setenv WAVELET_LIB "../external/wavelet/libWavelet.a ../external/wavelet/lib_wavelet.a"
    else
       setenv WAVELET_LIB " "
    endif
    if ( $?MADIS ) then
       setenv MADIS_CPP "-DMADIS"
       setenv MADIS_STATIC ${MADIS}/static
       setenv MADIS_LIB "-L${MADIS} -lmadis"
    else
       setenv MADIS_CPP " "
       setenv MADIS_LIB " "
    endif
    setenv DA_ARCHFLAGS "${BUFR_CPP} ${MADIS_CPP} -DFFTPACK -DNORESHAPE"
  endif
  if (($WRF_NMM_CORE == 1)&&($WRF_CHEM == 0 )) then
    if ( ! -f Registry/Registry ) then
      set overwrite=1
    else
      head -2 Registry/Registry | tail -1 | grep NMM > /dev/null
      if ( $status ) then
        set overwrite=1
      else
        set nmm_time=`ls -1tr Registry | cat -n | grep -w 'Registry\.NMM' | grep -v 'Registry.NMM.' | awk '{print $1}'`
        set rg_time=`ls -1tr Registry | cat -n | grep -w 'Registry' | grep -v 'Registry.' | awk '{print $1}'`
        if ( $nmm_time > $rg_time ) set overwrite=1
      endif
    endif
    if ( $overwrite ) then
      if (($WRF_NMM_CORE == 1)&&($WRF_NMM_NEST == 1)) then
        echo copying Registry/Registry.NMM_NEST to Registry/Registry
        echo '## WARNING: this file is autogenerated from Registry/Registry.NMM_NEST. Changes may be lost' > Registry/Registry
        /bin/cat Registry/Registry.NMM_NEST >> Registry/Registry
      else
        echo copying Registry/Registry.NMM to Registry/Registry
        echo '## WARNING: this file is autogenerated from Registry/Registry.NMM. Changes may be lost' > Registry/Registry
        /bin/cat Registry/Registry.NMM >> Registry/Registry
      endif
    endif
# integrity check for a kludge where a hard coded value in the 
# registry must match the same value in arch/preamble_new
    set registryvalue=`grep 'dimspec.* q ' Registry/registry.dimspec | sed -e 's/..*constant=//' -e 's/ ..*$//'`
    set preamblevalue=`grep 'DNMM_MAX_DIM=.*' arch/preamble_new | sed -e 's/..*-DNMM_MAX_DIM=//' -e 's/ ..*$//'`
    if ( $registryvalue != $preamblevalue ) then
      echo "Harded coded value of dimspec q in Registry ($registryvalue) does not"
      echo "equal the hard coded value of NMM_MAX_DIM in arch/preamble_new ($preamblevalue)"
      echo "Please fix and try again."
      exit 2
    endif
  endif

  echo " "
  echo -n "Compiling: "
  if ( $WRF_DA_CORE ) echo -n "WRF_DA_CORE "
  if ( $WRF_EM_CORE ) echo -n "WRF_EM_CORE "
  if ( $WRF_NMM_CORE ) echo -n "WRF_NMM_CORE "
  if ( $WRF_COAMPS_CORE ) echo -n "WRF_COAMPS_CORE "
  if ( $WRF_EXP_CORE ) echo -n "WRF_EXP_CORE "
  echo "."
  echo " "

  if ( ! $?WRF_SRC_ROOT_DIR ) setenv WRF_SRC_ROOT_DIR `pwd`

# new dec 2009.  check to see if make supports parallel -j option
  make -j 2 >& /dev/null
  if ( $status == 0 ) then              # Parallel make ok
    if ( ! $?J ) then                   # J not defined
      echo setting parallel make -j 2   # Set default to 2
      setenv J "-j 2"
    else
#     J is defined, check that it is a correctly formed variable
      set first2chars = `echo $J | cut -c 1-2`         # Are 1st two chars are -j?
      set second_word = `echo $J | cut -d" " -f2`      # Is second word a number?
      if    ( "$first2chars" == "-j" ) then
         if ( ( "$second_word" >= "2"  )  && \
              ( "$second_word" <= "20" ) ) then
            echo setting parallel make $J
         else if ( "$second_word" == "1" ) then
            echo setting serial make $J
         else
            echo "badly formed -j option for parallel make: $J"
            echo "or you set the number of processors above 20 "
            echo setting parallel make -j 2            # Set default to 2
            setenv J "-j 2"
         endif
      else
         if ( "$J" == "" ) then     # J blank is OK
            echo setting serial make $J
         else
            echo "parallel option for make is -j, you entered: $first2chars"
            echo setting parallel make -j 2               # Set default to 2
            setenv J "-j 2"
         endif
      endif
    endif
  else
    echo not setting parallel make
  endif

  make $arglist A2DCASE="$A2DCASE" WRF_SRC_ROOT_DIR="$WRF_SRC_ROOT_DIR"

endif

exit 0

hlp:

echo ' '
echo 'Usage:'
echo ' '
echo '   compile [-d] [-j n] wrf   compile wrf in run dir (NOTE: no real.exe, ndown.exe, or ideal.exe generated)'
echo ' '
echo '   or choose a test case (see README_test_cases for details) :'
foreach d ( `/bin/ls test` )
  if ( "$d" != "CVS" ) then
    echo "      compile $d"
  endif
end
echo ' '
echo '  compile -d                 compile without optimization and with debugging'
echo '  compile -j n               parallel make using n tasks if supported (default 2)'
echo '  compile -h                 help message'


