Skip to content
Snippets Groups Projects
check_commit_mesonh.sh 8.91 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/bin/bash
    
    #set -x
    set -e
    
    # Repertoire où Mesonh MNH-V5-5-0 officiel est installe
    #REFDIR=$HOME
    # Repertoire où MNH-V5-5-0_PHYEX.tar.gz modifie pour accueillir PHYEX se trouve
    #TARGZDIR=$HOME
    
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
    availTests="007_16janvier/008_run2"
    defaultTest="007_16janvier/008_run2"
    separator='_' #- be carrefull, gmkpack (at least on belenos) has multiple allergies (':', '.', '@')
                  #- seprator must be in sync with prep_code.sh separator
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
    PHYEXTOOLSDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    
    function usage {
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      echo "Usage: $0 [-h] [-c] [-r] [-C] [-s] [--expand] commit reference"
      echo "commit          commit hash (or a directory)"
      echo "reference       commit hash or a directory or nothing for ref"
    
      echo "-s              suppress compilation pack"
      echo "-c              performs compilation"
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      echo "-r              runs the tests"
    
      echo "-C              checks the result against the reference"
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      echo "--expand        use mnh_expand (code will use do loops)"
    
      echo ""
      echo "If nothing is asked (compilation, running, check) everything is done"
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      echo
      echo "The directory (for commit only, not ref) can take the form server:directory"
      echo
      echo "If using a directory (for commit or reference) it must contain at least one '/'"
    
    }
    
    compilation=0
    run=0
    check=0
    commit=""
    reference=""
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
    tests=""
    
    suppress=0
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
    useexpand=0
    
    
    while [ -n "$1" ]; do
      case "$1" in
        '-h') usage;;
        '-s') suppress=1;;
        '-c') compilation=1;;
        '-r') run=$(($run+1));;
        '-C') check=1;;
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
        '--expand') useexpand=1;;
    
        #-b) param="$2"; shift ;;
        #--) shift; break ;;
         *) if [ -z "${commit-}" ]; then
              commit=$1
            else
              if [ -z "${reference-}" ]; then
                reference=$1
              else
                echo "Only two commit hash allowed on command line"
                exit 1
              fi
            fi;;
      esac
      shift
    done
    
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
    [ "$reference" == 'REF' ] && reference="" #Compatibility with check_commit_arome.sh
    
    MNHPACK=${MNHPACK:=$HOME/MesoNH/PHYEX}
    REFDIR=${REFDIR:=$PHYEXTOOLSDIR/pack/}
    TARGZDIR=${TARGZDIR:=$PHYEXTOOLSDIR/pack/}
    if [ -z "${tests-}" ]; then
      tests=$defaultTest
    elif [ $tests == 'ALL' ]; then
      tests=$availTests
    fi
    
    
    if [ $compilation -eq 0 -a \
         $run -eq 0 -a \
         $check -eq 0 ]; then
      compilation=1
      run=1
      check=1
    fi
    
    if [ -z "${commit-}" ]; then
      echo "At least one commit hash must be provided on command line"
      exit 2
    fi
    
    
    #Two possibilities are supported for the simulations
    # - they can be done in the the pack we are currently checking
    # - they can be done in the reference pack
    #They are done in the current pack except if the reference pack
    #already contains a tested simulation
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
    run_in_ref=$(ls -d $REFDIR/MNH-V5-5-0/MY_RUN/KTEST/007_16janvier/008_run2_* 2> /dev/null | tail -1 |wc -l)
    
    #Name and directory for compiling and executing user pack
    fromdir=''
    if echo $commit | grep '/' > /dev/null; then
      fromdir=$commit
      tag=$(echo $commit | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')
    else
      tag=$commit
    fi
    name=MNH-V5-5-0-$tag
    [ $suppress -eq 1 -a -d $MNHPACK/$name ] && rm -rf $MNHPACK/$name
    if [ $run_in_ref -eq 1 ]; then
      path_user_beg=$REFDIR/MNH-V5-5-0 #pack directory containing the simulation
      path_user_end=_$tag #to be appended to the 'run' simulation directory
    else
      path_user_beg=$MNHPACK/$name #pack directory containing the simulation
      path_user_end= #to be appended to the 'run' simulation directory
    fi
    
    #Name and directory for the reference
    reffromdir=''
    if echo $reference | grep '/' > /dev/null; then
      reffromdir=$reference
      reftag=$(echo $reference | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')
    else
      reftag=$reference
    fi
    refname=MNH-V5-5-0-$reftag
    
    if [ $run_in_ref -eq 1 ]; then
      path_ref_beg=$REFDIR/MNH-V5-5-0
      if [ "$reference" == "" ]; then
        path_ref_end=
      else
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
        path_ref_end=_$reftag
    
      fi
    else
      path_ref_end=
      if [ "$reference" == "" ]; then
        path_ref_beg=$REFDIR/MNH-V5-5-0
      else
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
        path_ref_beg=$MNHPACK/MNH-V5-5-0-$reftag
    
    if [ $compilation -eq 1 ]; then
      echo "### Compilation of commit $commit"
    
      if [ -d $MNHPACK/$name ]; then
        echo "Pack already exists ($MNHPACK/$name), suppress it to be able to compile it again (or use the -s option to automatically suppress it)"
        exit 5
      fi
    
      # Prepare the pack
      cd $MNHPACK
      cp $TARGZDIR/MNH-V5-5-0_PHYEX.tar.gz .
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      tar xfz MNH-V5-5-0_PHYEX.tar.gz 
    
      rm MNH-V5-5-0_PHYEX.tar.gz
      mv MNH-V5-5-0 $name
      cd $name/src
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      rm -rf PHYEX
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      MNH_EXPAND_DIR=$PHYEXTOOLSDIR/mnh_expand
      export PATH=$MNH_EXPAND_DIR/filepp:$MNH_EXPAND_DIR/MNH_Expand_Array:$PATH
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      if [ $useexpand == 1 ]; then
        expand_options="-D MNH_EXPAND -D MNH_EXPAND_LOOP"
      else
        expand_options=""
      fi
      subs="-s turb -s micro -s aux -s ext -s conv"
      prep_code=$PHYEXTOOLSDIR/prep_code.sh
      if [ "$fromdir" == '' ]; then
        echo "Clone repository, and checkout commit $commit (using prep_code.sh)"
        if [[ $commit == mesonh${separator}* ]]; then
          $prep_code --renameFf -c $commit PHYEX #This commit is ready for inclusion
        else
          $prep_code --renameFf -c $commit $expand_options $subs -m mesonh PHYEX
        fi
      else
        echo "Copy $fromdir"
        scp -q -r $fromdir PHYEX
        $prep_code --renameFf $expand_options $subs -m mesonh PHYEX
      fi
      rm -rf PHYEX/.git
      find PHYEX -type f -exec touch {} \; #to be sure a recompilation occurs
    
    
      # Move manually ext/ files in src/MNH
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      mv -f PHYEX/ext/* MNH/
      rmdir PHYEX/ext
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      cd $MNHPACK/$name/src/PHYEX/turb
    
      # Delete files of MNH-V5-5-0/src/MNH and MNH/src/LIB/SURCOUCHE/src with same name
      for rep in turb micro conv aux ; do
        cd ../$rep
        for f in *.f90; do
          echo $f
          rm -f ../../MNH/$f
          rm -f ../../LIB/SURCOUCHE/src/$f
        done
      done
      cd ..
      
      # Delete old files of MNH-V5-5-0/src/MNH that is now called by mode_... NO /aux NEEDED!
      find turb micro conv -name 'mode_*' > remove_non_mode.sh
      sed -i 's/turb\/mode_/rm -f MNH\//g' remove_non_mode.sh
      sed -i 's/micro\/mode_/rm -f MNH\//g' remove_non_mode.sh
      sed -i 's/conv\/mode_/rm -f MNH\//g' remove_non_mode.sh
      chmod +x remove_non_mode.sh
      mv remove_non_mode.sh ../.
      cd ../
      ./remove_non_mode.sh
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      # nettoyage, routines non appellees : 
    
      rm -f MNH/mf_turb_greyzone.f90
      rm -f MNH/compute_frac_ice.f90
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      rm -f MNH/rain_ice_red.f90
    
    
      #Configure and compilation
      ./configure
      set +e #file ends with a test that can return false
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      . ../conf/profile_mesonh-*
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      make -j 8 | tee ../Output_compilation
      make installmaster | tee -a ../Output_compilation
    
    fi
    
    if [ $run -ge 1 ]; then
      echo "### Running of commit $commit"
    
      if [ ! -f $MNHPACK/$name/exe/MESONH* ]; then
        echo "Pack does not exist ($MNHPACK/$name) or compilation has failed, please check"
        exit 6
      fi
    
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      for t in $(echo $tests | sed 's/,/ /g'); do
        case=$(echo $t | cut -d / -f 1)
        exedir=$(echo $t | cut -d / -f 2)
        if [ $run_in_ref -eq 1 ]; then
          cd $REFDIR/MNH-V5-5-0/MY_RUN/KTEST/$case/
          [ ! -d ${exedir}_$commit ] && cp -R ${exedir} ${exedir}_$commit
          cd $REFDIR/MNH-V5-5-0/MY_RUN/KTEST/$case/${exedir}_$commit
        else
          cd $MNHPACK/$name/MY_RUN/KTEST/$case/
          for rep in ???_*; do
            if [ $rep != ${exedir} ]; then
              rm -rf $rep
              ln -s $REFDIR/MNH-V5-5-0/MY_RUN/KTEST/$case/$rep .
            fi
          done
          [ -d ${exedir} ] && rm -rf ${exedir}
          cp -R $REFDIR/MNH-V5-5-0/MY_RUN/KTEST/$case/${exedir} .
          cd ${exedir}
        fi
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
        set +e #file ends with a test that can return false
        [ $compilation -eq 0 ] && . $MNHPACK/$name/conf/profile_mesonh-*
        set -e
        ./clean_mesonh_xyz
        ./run_mesonh_xyz | tee Output_run
      done
    fi
    
    
    if [ $check -eq 1 ]; then
      echo "### Check commit $commit against commit $reference"
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
      allt=0
      for t in $(echo $tests | sed 's/,/ /g'); do
        case=$(echo $t | cut -d / -f 1)
        exedir=$(echo $t | cut -d / -f 2)
    
    RIETTE Sébastien's avatar
    RIETTE Sébastien committed
        path_user=$path_user_beg/MY_RUN/KTEST/007_16janvier/008_run2$path_user_end
        path_ref=$path_ref_beg/MY_RUN/KTEST/007_16janvier/008_run2$path_ref_end
        if [ ! -d $path_user ]; then
          echo "$path_user is missing, please run the simulation"
          exit 7
        fi
        if [ ! -d $path_ref ]; then
          echo "$path_ref is missing, please run the reference simulation"
          exit 8
        fi
    
        if [ $case == 007_16janvier ]; then
          echo "Compare with python..."
          # Compare variable of both Synchronous and Diachronic files with printing difference
          set +e
          $PHYEXTOOLSDIR/compare.py $path_user $path_ref
          t=$?
          set -e
          allt=$(($allt+$t))
          
          #Check bit-repro before date of creation of Synchronous file from ncdump of all values (pb with direct .nc file checks)
          file1=$path_user/16JAN.1.12B18.001.nc 
          file2=$path_ref/16JAN.1.12B18.001.nc
          echo "Compare with ncdump..."
          set +e
          diff <(ncdump $file1 | head -c 62889) <(ncdump $file2 | head -c 62889)
          t=$?
          set -e
          allt=$(($allt+$t))
        fi
      done
    
    
      if [ $allt -eq 0 ]; then
        status="OK"
      else
        status="Files are different"
      fi
      echo "...comparison done: $status"