diff --git a/tools/check_commit_ial.sh b/tools/check_commit_ial.sh
index fd36cf2197dbfe4e9b992bc2cc10f13c6384b544..da9ef89114d2de2e42316792a169eb932a0cf260 100755
--- a/tools/check_commit_ial.sh
+++ b/tools/check_commit_ial.sh
@@ -55,22 +55,36 @@ set -o pipefail #abort if left command on a pipe fails
 #                       the commit d095d11 (20 March 2023) when running in 48t3
 #                       the commit 7e55649 when running in 49t0 (9164c67 (last commit in 48t3) is identical to d095d11)
 
+#######################
+#### CONFIGURATION ####
+#######################
+
 #Special pack names:
 # - recompil: original source code (everything under mpa)
 # - split_48t1: original 48t1 source code but with physics source code under phyex directory
 # - split_48t3: same as split_48t1 but for the 48t3 cycle
 # - split: symbolic link to split_48t1 (backward compatibility)
 # - split_49t0: same as split_48t1 but for the 49t0 cycle
-
 specialPack="ori split split_48t1 split_48t3 recompil split_49t0"
-availTests="small_3D,small_3D_np2,small_3D_alt1,small_3D_alt2,small_3D_alt3,small_3D_alt4,small_3D_alt5,small_3D_alt6,small_3D_alt7"
+
+#About the tests:
+# - ALLTests is a list of tests to be done when '-t ALL' is used. This list is filled here
+#   in case there is no ial_version.json file containig a 'testing' section. If this 'testing'
+#   section exists, this list is overridden.
+# - allowedTests is the list of allowed tests which can depend on platform, if we ask to perform an action
+#   with a test not in the allowedTests list, the action is ignored
+# - defaultTest is the list of tests to perform when no '-t' option is provided on the command line.
+ALLTests="small_3D,small_3D_np2,small_3D_alt1,small_3D_alt2,small_3D_alt3,small_3D_alt4,small_3D_alt5,small_3D_alt6,small_3D_alt7"
 defaultTest="small_3D"
 allowedTests="small_3D,small_3D_np2,small_3D_alt1,small_3D_alt2,small_3D_alt3,small_3D_alt4,small_3D_alt5,small_3D_alt6,small_3D_alt7,small_3D_alt8,small_3D_alt9,small_3D_alt10,small_3D_alt11,small_3D_alt12,small_3D_lima"
+
 separator='_' #- be carrefull, gmkpack (at least on belenos) has multiple allergies (':', '.', '@')
               #- seprator must be in sync with prep_code.sh separator
 
 PHYEXTOOLSDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 
+HOMEPACK=${HOMEPACK:=$HOME/pack}
+
 dirpack=$PHYEXTOOLSDIR/pack
 dirconf=$PHYEXTOOLSDIR/conf_tests
 declare -A gmkpack_l
@@ -83,7 +97,7 @@ if [ $(hostname | cut -c 1-7) == 'belenos' -o $(hostname | cut -c 1-7) == 'taran
   gmkpack_o[49t0]=x
   defaultMainPackVersion=01
   defaultRef='split_${cycle}'
-  availTests="${availTests},big_3D"
+  ALLTests="${ALLTests},big_3D"
   allowedTests="${allowedTests},big_3D"
 else
   HPC=0
@@ -96,10 +110,12 @@ else
 fi
 mainPackVersion=${mainPackVersion:-${defaultMainPackVersion}}
 
-extraCompilationCheck=1
+################################
+#### COMMAND LINE ARGUMENTS ####
+################################
 
 function usage {
-  echo "Usage: $0 [-h] [-p] [-c] [-r] [-C] [-s] [-f] [--noexpand] [-t test] [--cycle CYCLE] [--repo-user] [--repo-protocol] [--remove] commit [reference]"
+  echo "Usage: $0 [-h] [-p] [-c] [-r] [-C] [-s] [-f] [--noexpand] [-t test] [--cycle CYCLE] [--scripttag TAG] [--repo-user USER] [--repo-protocol PROTOCOL] [--remove] [--onlyIfNeeded] [--computeRefIfNeeded] commit [reference]"
   echo "commit          commit hash (or a directory, or among $specialPack) to test"
   echo "reference       commit hash (or a directory, or among $specialPack) REF to use as a reference"
   echo "-s              suppress compilation pack"
@@ -113,11 +129,17 @@ function usage {
   echo "-f              full compilation (do not use pre-compiled pack)"
   echo "--cycle CYCLE   to force using CYCLE"
   echo "--scripttag TAG script tag to use in case --cycle is provided"
-  echo "--repo-user     user hosting the PHYEX repository on github,"
+  echo "--repo-user USER"
+  echo "                user hosting the PHYEX repository on github,"
   echo "                defaults to the env variable PHYEXREOuser (=$PHYEXREOuser)"
-  echo "--repo-protocol protocol (https or ssh) to reach the PHYEX repository on github,"
+  echo "--repo-protocol PROTOCOL"
+  echo "                protocol (https or ssh) to reach the PHYEX repository on github,"
   echo "                defaults to the env variable PHYEXREOprotocol (=$PHYEXREOprotocol)"
   echo "--remove        removes the pack"
+  echo "--onlyIfNeeded  performs the pack creation and/or the compilation and/or the execution"
+  echo "                only if the step has not already been done"
+  echo "--computeRefIfNeeded"
+  echo "                computes the missing references"
   echo ""
   echo "If nothing is asked (pack creation, compilation, running, check, removing) everything"
   echo "except the removing is done"
@@ -149,6 +171,8 @@ fullcompilation=0
 cycle=""
 scripttag=''
 remove=0
+onlyIfNeeded=0
+computeRefIfNeeded=0
 
 while [ -n "$1" ]; do
   case "$1" in
@@ -166,6 +190,9 @@ while [ -n "$1" ]; do
     '--repo-user') export PHYEXREPOuser=$2; shift;;
     '--repo-protocol') export PHYEXREPOprotocol=$2; shift;;
     '--remove') remove=1;;
+    '--onlyIfNeeded') onlyIfNeeded=1;;
+    '--computeRefIfNeeded') computeRefIfNeeded=1;;
+
     #--) shift; break ;;
      *) if [ -z "${commit-}" ]; then
           commit=$1
@@ -181,26 +208,6 @@ while [ -n "$1" ]; do
   shift
 done
 
-HOMEPACK=${HOMEPACK:=$HOME/pack}
-
-function exescript () {
-  #usage: exescript <output file> <script> [arg [arg ...]]
-  output=$1
-  shift
-  if [ $HPC -eq 1 ]; then
-    sbatch --wait -o $output $@
-    cat $output
-  else
-    $@ 2>&1 | tee $output
-  fi
-}
-
-if [ -z "${tests-}" ]; then
-  tests=$defaultTest
-elif [ $tests == 'ALL' ]; then
-  tests=$availTests
-fi
-
 if [ $packcreation -eq 0 -a \
      $compilation -eq 0 -a \
      $run -eq 0 -a \
@@ -222,6 +229,22 @@ if [ $check -eq 1 -a -z "${reference-}" ]; then
   exit 3
 fi
 
+##############################
+#### FUNCTION DEFINITIONS ####
+##############################
+
+function exescript () {
+  #usage: exescript <output file> <script> [arg [arg ...]]
+  output=$1
+  shift
+  if [ $HPC -eq 1 ]; then
+    sbatch --wait -o $output $@
+    cat $output
+  else
+    $@ 2>&1 | tee $output
+  fi
+}
+
 function apl_arome_content2cycle {
   # variable content_apl_arome must contain the source code of apl_arome.F90
   if grep CPG_DYN_TYPE <(echo $content_apl_arome) > /dev/null; then
@@ -231,52 +254,40 @@ function apl_arome_content2cycle {
   fi
 }
 
-function ial_version_content2key {
-  # variable content_ial_version must contain the source code of ial_version.json
-  # $1 must be the key name
-  # $2 is the default value
-  content_ial_version=$content_ial_version python3 -c "import json; import os; print(json.loads(os.environ['content_ial_version']).get('$1', '$2'))"
+function json_dictkey2value {
+  # $1 must contain the json string
+  # $2 must be the key name
+  # $3 is the default value
+  json_content="$1" python3 -c "import json; import os; result=json.loads(os.environ['json_content']).get('$2', '$3'); print(json.dumps(result) if isinstance(result, dict) else result)"
 }
 
+#################################
+#### CYCLE/COMMIT ADAPTATION ####
+#################################
+
+is_directory=0
+is_special=0
+is_commit=0
+if echo $commit | grep '/' | grep -v '^tags/' > /dev/null; then
+  is_directory=1
+elif echo $specialPack | grep -w $commit > /dev/null; then
+  is_special=1
+else
+  is_commit=1
+fi
+
 #Name is choosen such as it can be produced with a main pack: PHYEX/${cycle}_XXXXXXXXX.01.${gmkpack_l}.${gmkpack_o}
+declare -A refByTest
 fromdir=''
-if echo $commit | grep '/' | grep -v '^tags/' > /dev/null; then
-  fromdir=$commit
-  if [ "$cycle" == "" ]; then
+if [ $is_directory -eq 1 -o $is_commit -eq 1 ]; then
+  if [ $is_directory -eq 1 ]; then
+    #The git repository is a directory
+    fromdir=$commit
     content_ial_version=$(scp $commit/src/arome/ial_version.json /dev/stdout 2>/dev/null || echo "")
-    if [ "$content_ial_version" == "" ]; then
-      content_apl_arome=$(scp $commit/src/arome/ext/apl_arome.F90 /dev/stdout)
-      cycle=$(apl_arome_content2cycle)
-    else
-      cycle=$(ial_version_content2key cycle '')
-      scripttag=$(ial_version_content2key scripttag '')
-    fi
-  fi
-  if [[ ! -z "${gmkpack_o[$cycle]+unset}" ]]; then #the -v approach is valid only with bash > 4.3:  if [[ -v gmkpack_o[$cycle] ]]; then
-    gmkpack_o=${gmkpack_o[$cycle]}
-  else
-    gmkpack_o=${gmkpack_o[default]}
-  fi
-  if [[ ! -z "${gmkpack_l[$cycle]+unset}" ]]; then
-    gmkpack_l=${gmkpack_l[$cycle]}
-  else
-    gmkpack_l=${gmkpack_l[default]}
-  fi
-  packBranch=$(echo $commit | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')
-  name="PHYEX/${cycle}_${packBranch}.01.${gmkpack_l}.${gmkpack_o}"
-  [ $suppress -eq 1 -a -d $HOMEPACK/$name ] && rm -rf $HOMEPACK/$name
-elif echo $specialPack | grep -w $commit > /dev/null; then
-  name="PHYEX/$commit"
-  if [ $commit == split_49t0 ]; then
-    cycle=49t0
-  elif [ $commit == split_48t3 ]; then
-    cycle=48t3
+    cmd_apl_arome="scp $commit/src/arome/ext/apl_arome.F90 /dev/stdout"
+    packBranch=$(echo $commit | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')
   else
-    cycle=48t1
-  fi
-else
-  packBranch="COMMIT$(echo $commit | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')"
-  if [ "$cycle" == "" ]; then
+    #The git repository is on github
     if [[ $commit == arome${separator}* ]]; then
       apl_arome_file="ext/apl_arome.F90"
       ial_version_file="ial_version.json"
@@ -290,12 +301,30 @@ else
       urlcommit=$commit
     fi
     content_ial_version=$(wget --no-check-certificate https://raw.githubusercontent.com/$PHYEXREPOuser/PHYEX/${urlcommit}/$ial_version_file -O - 2>/dev/null || echo "")
+    cmd_apl_arome="wget --no-check-certificate https://raw.githubusercontent.com/$PHYEXREPOuser/PHYEX/${urlcommit}/$apl_arome_file -O - 2>/dev/null"
+    packBranch="COMMIT$(echo $commit | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g')"
+  fi
+  if [ ! "$content_ial_version" == "" ]; then
+    testing=$(json_dictkey2value "$content_ial_version" 'testing' '')
+    if [ ! "$testing" == "" ]; then
+      ALLTests='' #We reset the list of tests
+      for t in $(echo $allowedTests | sed 's/,/ /g'); do
+        ref=$(json_dictkey2value "$testing" "$t" '')
+        if [ ! "$ref" == "" ]; then
+          ALLTests="${ALLTests},$t"
+          refByTest[$t]=$ref
+        fi
+      done
+      ALLTests="${ALLTests:1}" #Remove first character (',')
+    fi
+  fi
+  if [ "$cycle" == "" ]; then
     if [ "$content_ial_version" == "" ]; then
-      content_apl_arome=$(wget --no-check-certificate https://raw.githubusercontent.com/$PHYEXREPOuser/PHYEX/${urlcommit}/$apl_arome_file -O - 2>/dev/null)
+      content_apl_arome=$($cmd_apl_arome)
       cycle=$(apl_arome_content2cycle)
     else
-      cycle=$(ial_version_content2key cycle)
-      scripttag=$(ial_version_content2key scripttag)
+      cycle=$(json_dictkey2value "$content_ial_version" 'cycle' '')
+      scripttag=$(json_dictkey2value "$content_ial_version" 'scripttag' '')
     fi
   fi
   if [[ ! -z "${gmkpack_o[$cycle]+unset}" ]]; then #the -v approach is valid only with bash > 4.3:  if [[ -v gmkpack_o[$cycle] ]]; then
@@ -310,284 +339,339 @@ else
   fi
   name="PHYEX/${cycle}_${packBranch}.01.${gmkpack_l}.${gmkpack_o}"
   [ $suppress -eq 1 -a -d $HOMEPACK/$name ] && rm -rf $HOMEPACK/$name
-fi
-if [ ! -z "${reference-}" ]; then
-  [ $reference == 'REF' ] && reference=$(eval echo $defaultRef) #echo to replace ${cycle} by value
-  reffromdir=''
-  if echo $reference | grep '/' > /dev/null; then
-    reffromdir=$reference
-    refname="PHYEX/*_$(echo $reference | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g').01.${gmkpack_l}.${gmkpack_o}"
-  elif echo $specialPack | grep -w $reference > /dev/null; then
-    refname="PHYEX/$reference"
+elif [ $is_special -eq 1 ]; then
+  name="PHYEX/$commit"
+  if [ $commit == split_49t0 ]; then
+    cycle=49t0
+  elif [ $commit == split_48t3 ]; then
+    cycle=48t3
   else
-    refname="PHYEX/*_COMMIT${reference}.01.${gmkpack_l}.${gmkpack_o}"
+    cycle=48t1
   fi
 fi
+if [ ! -z "${reference-}" ]; then
+  declare -A refnameByTest
+  #Reference to use for each test
+  for t in $(echo $ALLTests | sed 's/,/ /g'); do
+    #Name of the reference
+    if [ "$reference" == 'REF' ]; then
+      if [[ ! -z "${refByTest[$t]+unset}" ]]; then #the -v approach is valid only with bash > 4.3:  if [[ -v gmkpack_o[$cycle] ]]; then
+        #The json file contained the references to use on a per test case basis
+        caseref=${refByTest[$t]}
+      else
+        #No json file, we use the global default reference
+        caseref=$(eval echo $defaultRef) #echo to replace ${cycle} by value
+      fi
+    else
+      #The exact reference to use was given on the command line
+      caseref=$reference
+    fi
+    refByTest[$t]=$caseref
+    #Conversion into directory name
+    if echo $caseref | grep '/' > /dev/null; then
+      refname="PHYEX/*_$(echo $caseref | sed 's/\//'${separator}'/g' | sed 's/:/'${separator}'/g' | sed 's/\./'${separator}'/g').01.${gmkpack_l}.${gmkpack_o}"
+    elif echo $specialPack | grep -w $caseref > /dev/null; then
+      refname="PHYEX/$caseref"
+    else
+      refname="PHYEX/*_COMMIT${caseref}.01.${gmkpack_l}.${gmkpack_o}"
+    fi
+    refnameByTest[$t]=$refname
+  done
+fi
 
-if [ $packcreation -eq 1 ]; then
-  echo "### Compilation of commit $commit"
+if [ -z "${tests-}" ]; then
+  tests=$defaultTest
+elif echo "$tests" | grep -w 'ALL' > /dev/null; then
+  tests=$(echo "$tests" | sed "s/\bALL\b/$ALLTests/g")
+fi
 
-  if echo $specialPack | grep -w $commit > /dev/null; then
-    echo "Special commit '$commit' cannot be compiled with this script"
-    exit 4
-  fi
+#######################
+#### PACK CREATION ####
+#######################
 
+if [ $packcreation -eq 1 ]; then
   if [ -d $HOMEPACK/$name ]; then
-    echo "Pack already exists ($HOMEPACK/$name), suppress it to be able to compile it again (or use the -s option to automatically suppress it)"
-    exit 5
-  fi
+    if [ $onlyIfNeeded -eq 0 ]; then
+      echo "Pack already exists ($HOMEPACK/$name), suppress it to be able to compile it again (or use the -s option to automatically suppress it)"
+      exit 5
+    fi
+  else
+    echo "### Pack creation for commit $commit"
 
-  export GMKTMP=/dev/shm
+    if echo $specialPack | grep -w $commit > /dev/null; then
+      echo "Special commit '$commit' cannot be compiled with this script"
+      exit 4
+    fi
 
-  if [ $fullcompilation == 0 ]; then
-    basepack=${cycle}_main.01.${gmkpack_l}.${gmkpack_o}
-    #[ $HPC -eq 0 -a ! -d $ROOTPACK/$basepack ] &&  getpack $basepack
-    gmkpack -r ${cycle} -b phyex -v $mainPackVersion -l ${gmkpack_l} -o ${gmkpack_o} -p masterodb \
-            -f $dirpack/ \
-            -u $name
-    reftree='main'
-  else
-    if [ $(echo $cycle | cut -c 1-2) -ne 48 ]; then
-      hub='-K'
+    export GMKTMP=/dev/shm
+
+    if [ $fullcompilation == 0 ]; then
+      basepack=${cycle}_main.01.${gmkpack_l}.${gmkpack_o}
+      #[ $HPC -eq 0 -a ! -d $ROOTPACK/$basepack ] &&  getpack $basepack
+      gmkpack -r ${cycle} -b phyex -v $mainPackVersion -l ${gmkpack_l} -o ${gmkpack_o} -p masterodb \
+              -f $dirpack/ \
+              -u $name
+      reftree='main'
     else
-      hub=''
-    fi
-    #Create main pack
-    gmkpack -a $hub -r ${cycle} -b ${packBranch} -n 01 -l ${gmkpack_l} -o ${gmkpack_o} -p masterodb -h $HOMEPACK/PHYEX
-    #Populate hub
-    if [ -d $HOMEPACK/$name/hub ]; then
-      cd $HOMEPACK/$name/hub/local/src
+      if [ $(echo $cycle | cut -c 1-2) -ne 48 ]; then
+        hub='-K'
+      else
+        hub=''
+      fi
+      #Create main pack
+      gmkpack -a $hub -r ${cycle} -b ${packBranch} -n 01 -l ${gmkpack_l} -o ${gmkpack_o} -p masterodb -h $HOMEPACK/PHYEX
+      #Populate hub
+      if [ -d $HOMEPACK/$name/hub ]; then
+        cd $HOMEPACK/$name/hub/local/src
+        if [ $HPC -eq 1 ]; then
+          ssh sxphynh.cnrm.meteo.fr "wget http://anonymous:mto@webdav.cnrm.meteo.fr/public/algo/khatib/src/hub49.tgz -O -" > hub49.tgz
+        else
+          wget http://anonymous:mto@webdav.cnrm.meteo.fr/public/algo/khatib/src/hub49.tgz
+        fi
+        tar xf hub49.tgz
+        rm -f hub49.tgz
+      fi
+      #Populate
+      cd $HOMEPACK/$name/src/local/
       if [ $HPC -eq 1 ]; then
-        ssh sxphynh.cnrm.meteo.fr "wget http://anonymous:mto@webdav.cnrm.meteo.fr/public/algo/khatib/src/hub49.tgz -O -" > hub49.tgz
+        ssh sxphynh.cnrm.meteo.fr "wget http://anonymous:mto@webdav.cnrm.meteo.fr/public/algo/khatib/src/${cycle}_main.01.tgz -O -" > ${cycle}_main.01.tgz
       else
-        wget http://anonymous:mto@webdav.cnrm.meteo.fr/public/algo/khatib/src/hub49.tgz
+        wget http://anonymous:mto@webdav.cnrm.meteo.fr/public/algo/khatib/src/${cycle}_main.01.tgz
       fi
-      tar xf hub49.tgz
-      rm -f hub49.tgz
-    fi
-    #Populate
-    cd $HOMEPACK/$name/src/local/
-    if [ $HPC -eq 1 ]; then
-      ssh sxphynh.cnrm.meteo.fr "wget http://anonymous:mto@webdav.cnrm.meteo.fr/public/algo/khatib/src/${cycle}_main.01.tgz -O -" > ${cycle}_main.01.tgz
-    else
-      wget http://anonymous:mto@webdav.cnrm.meteo.fr/public/algo/khatib/src/${cycle}_main.01.tgz
-    fi
-    tar xf ${cycle}_main.01.tgz
-    rm -f ${cycle}_main.01.tgz
-    #Cleaning and moving
-    if [ "$cycle" == '48t3' -o "$cycle" == '49t0' ]; then
-      #extracting budgets from micro
-      mkdir mpa/budgets
-      for file in mpa/micro/module/moddb_intbudget.F90 mpa/micro/externals/aro_suintbudget_omp.F90 \
-                  mpa/micro/interface/aro_convbu.h mpa/micro/externals/aro_convbu.F90 \
-                  mpa/micro/interface/aro_startbu.h mpa/micro/externals/aro_startbu.F90 \
-                  mpa/micro/externals/aro_suintbudget.F90 mpa/micro/externals/aro_suintbudget_omp.F90 \
-                  mpa/micro/interface/aroini_budget.h mpa/micro/externals/aroini_budget.F90; do
-        [ -f $file ] && mv $file mpa/budgets/
-      done 
-      mkdir mpa/aux
-      for file in mpa/micro/interface/aroini_frommpa.h mpa/micro/externals/aroini_frommpa.F90 \
-                  mpa/micro/externals/modd_spp_type.F90 mpa/micro/externals/spp_mod_type.F90 \
-                  mpa/micro/interface/aroini_cstmnh.h mpa/micro/externals/aroini_cstmnh.F90; do
-        [ -f $file ] && mv $file mpa/aux/
+      tar xf ${cycle}_main.01.tgz
+      rm -f ${cycle}_main.01.tgz
+      #Cleaning and moving
+      if [ "$cycle" == '48t3' -o "$cycle" == '49t0' ]; then
+        #extracting budgets from micro
+        mkdir mpa/budgets
+        for file in mpa/micro/module/moddb_intbudget.F90 mpa/micro/externals/aro_suintbudget_omp.F90 \
+                    mpa/micro/interface/aro_convbu.h mpa/micro/externals/aro_convbu.F90 \
+                    mpa/micro/interface/aro_startbu.h mpa/micro/externals/aro_startbu.F90 \
+                    mpa/micro/externals/aro_suintbudget.F90 mpa/micro/externals/aro_suintbudget_omp.F90 \
+                    mpa/micro/interface/aroini_budget.h mpa/micro/externals/aroini_budget.F90; do
+          [ -f $file ] && mv $file mpa/budgets/
+        done 
+        mkdir mpa/aux
+        for file in mpa/micro/interface/aroini_frommpa.h mpa/micro/externals/aroini_frommpa.F90 \
+                    mpa/micro/externals/modd_spp_type.F90 mpa/micro/externals/spp_mod_type.F90 \
+                    mpa/micro/interface/aroini_cstmnh.h mpa/micro/externals/aroini_cstmnh.F90; do
+          [ -f $file ] && mv $file mpa/aux/
+        done
+        [ -f mpa/micro/externals/add_bounds.F90 ] && rm -f mpa/micro/externals/add_bounds.F90
+        [ -f mpa/micro/externals/aroini_wet_dep.F90 ] && mv mpa/micro/externals/aroini_wet_dep.F90 mpa/chem/externals/aroini_wet_dep.F90
+        [ -f mpa/micro/interface/aroini_wet_dep.h ] && mv mpa/micro/interface/aroini_wet_dep.h mpa/chem/interface/aroini_wet_dep.h
+      fi
+      if [ "$cycle" == '49t0' ]; then
+        rm -rf oopsifs
+      fi
+      #we keep everything from the official source code except internals and module subdirectories of mpa
+      #and except some files of mpa/conv/module
+      for file in modi_shallow_convection.F90 modi_shallow_convection_part1.F90 \
+                  modi_shallow_convection_part2.F90 modi_shallow_convection_part2_select.F90; do
+        if [ -f mpa/conv/module/$file ]; then
+          [ ! -d mpa/conv/module_save ] && mkdir mpa/conv/module_save
+          mv mpa/conv/module/$file mpa/conv/module_save/
+        fi
       done
-      [ -f mpa/micro/externals/add_bounds.F90 ] && rm -f mpa/micro/externals/add_bounds.F90
-      [ -f mpa/micro/externals/aroini_wet_dep.F90 ] && mv mpa/micro/externals/aroini_wet_dep.F90 mpa/chem/externals/aroini_wet_dep.F90
-      [ -f mpa/micro/interface/aroini_wet_dep.h ] && mv mpa/micro/interface/aroini_wet_dep.h mpa/chem/interface/aroini_wet_dep.h
-    fi
-    if [ "$cycle" == '49t0' ]; then
-      rm -rf oopsifs
-    fi
-    #we keep everything from the official source code except internals and module subdirectories of mpa
-    #and except some files of mpa/conv/module
-    for file in modi_shallow_convection.F90 modi_shallow_convection_part1.F90 \
-                modi_shallow_convection_part2.F90 modi_shallow_convection_part2_select.F90; do
-      if [ -f mpa/conv/module/$file ]; then
-        [ ! -d mpa/conv/module_save ] && mkdir mpa/conv/module_save
-        mv mpa/conv/module/$file mpa/conv/module_save/
+      for rep in turb micro conv; do
+        mkdir -p phyex/$rep
+        rm -rf mpa/$rep/internals mpa/$rep/module
+      done
+      [ -d mpa/conv/module_save ] && mv mpa/conv/module_save mpa/conv/module
+      if [ -f /cnrm/algo/khatib/drhook.c_for_ubuntu.tar -a $(echo $cycle | cut -c 1-2) -eq 48 ]; then
+        #If file exists it means that we are running on a CTI computer, so we are using ubuntu
+        tar xf /cnrm/algo/khatib/drhook.c_for_ubuntu.tar
       fi
-    done
-    for rep in turb micro conv; do
-      mkdir -p phyex/$rep
-      rm -rf mpa/$rep/internals mpa/$rep/module
-    done
-    [ -d mpa/conv/module_save ] && mv mpa/conv/module_save mpa/conv/module
-    if [ -f /cnrm/algo/khatib/drhook.c_for_ubuntu.tar -a $(echo $cycle | cut -c 1-2) -eq 48 ]; then
-      #If file exists it means that we are running on a CTI computer, so we are using ubuntu
-      tar xf /cnrm/algo/khatib/drhook.c_for_ubuntu.tar
-    fi
-    #Special modification of the compilation configuration file and script
-    sed -i 's/-ftree-vectorize//' $HOMEPACK/$name/.gmkfile/${gmkpack_l}.*
-    sed -i "/^MACROS_FRT/s/$/ -DREPRO48/" $HOMEPACK/$name/.gmkfile/${gmkpack_l}.*
-    #sed -i "s/PHYEX\/${cycle}_$$.01.${gmkpack_l}.${gmkpack_o}/$(echo $name | sed 's/\//\\\//')/" $HOMEPACK/$name/ics_masterodb #this line could be used if pack was renamed before compilation but it does not work on belenos
+      #Special modification of the compilation configuration file and script
+      sed -i 's/-ftree-vectorize//' $HOMEPACK/$name/.gmkfile/${gmkpack_l}.*
+      sed -i "/^MACROS_FRT/s/$/ -DREPRO48/" $HOMEPACK/$name/.gmkfile/${gmkpack_l}.*
+      #sed -i "s/PHYEX\/${cycle}_$$.01.${gmkpack_l}.${gmkpack_o}/$(echo $name | sed 's/\//\\\//')/" $HOMEPACK/$name/ics_masterodb #this line could be used if pack was renamed before compilation but it does not work on belenos
 
-    resetpack -f #Is it really useful?
-    reftree='local'
-  fi
-  cd $HOMEPACK/$name/src/local/phyex
+      resetpack -f #Is it really useful?
+      reftree='local'
+    fi
+    cd $HOMEPACK/$name/src/local/phyex
 
-  MNH_EXPAND_DIR=$PHYEXTOOLSDIR/mnh_expand
-  export PATH=$MNH_EXPAND_DIR/filepp:$MNH_EXPAND_DIR/MNH_Expand_Array:$PATH
+    MNH_EXPAND_DIR=$PHYEXTOOLSDIR/mnh_expand
+    export PATH=$MNH_EXPAND_DIR/filepp:$MNH_EXPAND_DIR/MNH_Expand_Array:$PATH
 
-  if [ $useexpand == 1 ]; then
-    expand_options="-D MNH_EXPAND -D MNH_EXPAND_LOOP"
-  else
-    expand_options=""
-  fi
-  subs="-s gmkpack_ignored_files -s turb -s micro -s aux -s ext -s conv -s externals" #externals is the old name for aux/ext
-  prep_code=$PHYEXTOOLSDIR/prep_code.sh
-  if [ "$fromdir" == '' ]; then
-    echo "Clone repository, and checkout commit $commit (using prep_code.sh)"
-    if [[ $commit == arome${separator}* ]]; then
-      $prep_code -c $commit PHYEX #This commit is ready for inclusion
+    if [ $useexpand == 1 ]; then
+      expand_options="-D MNH_EXPAND -D MNH_EXPAND_LOOP"
     else
-      $prep_code -c $commit $expand_options $subs -m arome PHYEX
+      expand_options=""
     fi
-  else
-    echo "Copy $fromdir"
-    mkdir PHYEX
-    scp -q -r $fromdir/src PHYEX/
-    $prep_code $expand_options $subs -m arome PHYEX
-  fi
-  find PHYEX -type f -exec touch {} \; #to be sure a recompilation occurs
-  for rep in turb micro conv aux; do
-    [ -d PHYEX/$rep ] && mv PHYEX/$rep .
-  done
-  #modd_nsv.F90 has been moved and gmkpack is lost in case a different version exists in main/.../micro
-  if [ -f ../../main/phyex/micro/modd_nsv.F90 -a -f aux/modd_nsv.F90 ]; then
-    mv aux/modd_nsv.F90 micro/
-    if [ -f PHYEX/gmkpack_ignored_files ]; then
-      grep -v micro/modd_nsv.F90 PHYEX/gmkpack_ignored_files > PHYEX/gmkpack_ignored_files_new
-      mv PHYEX/gmkpack_ignored_files_new PHYEX/gmkpack_ignored_files
-    fi
-  fi
-  if [ -f PHYEX/gmkpack_ignored_files ]; then
-    #gmkpack_ignored_files contains a list of file, present in the reference pack, that is not used anymore
-    #and must be excluded from compilation (in case of a full comilation) or from re-compilation (in case of a non-full
-    #compilation).
-    if [ $fullcompilation == 0 ]; then
-      #Content is added in the ics_masterodb script
-      sed -i "/^end_of_ignored_files/i $(first=1; for line in $(cat PHYEX/gmkpack_ignored_files); do echo -n $(test $first -ne 1 && echo \\n)${line}; first=0; done)" $HOMEPACK/$name/ics_masterodb
+    subs="-s gmkpack_ignored_files -s turb -s micro -s aux -s ext -s conv -s externals" #externals is the old name for aux/ext
+    prep_code=$PHYEXTOOLSDIR/prep_code.sh
+    if [ "$fromdir" == '' ]; then
+      echo "Clone repository, and checkout commit $commit (using prep_code.sh)"
+      if [[ $commit == arome${separator}* ]]; then
+        $prep_code -c $commit PHYEX #This commit is ready for inclusion
+      else
+        $prep_code -c $commit $expand_options $subs -m arome PHYEX
+      fi
     else
-      #Files must be suppressed (non phyex files)
-      for file in $(cat PHYEX/gmkpack_ignored_files); do
-        [ -f $HOMEPACK/$name/src/local/$file ] && rm -f $HOMEPACK/$name/src/local/$file
-      done
-      [ ! "$(ls -A $HOMEPACK/$name/src/local/mpa/dummy)" ] && rmdir $HOMEPACK/$name/src/local/mpa/dummy
+      echo "Copy $fromdir"
+      mkdir PHYEX
+      scp -q -r $fromdir/src PHYEX/
+      $prep_code $expand_options $subs -m arome PHYEX
     fi
-  fi
-
-  EXT=PHYEX/ext
-  [ ! -d $EXT ] && EXT=PHYEX/externals #old name for ext/aux
-  if [ -d $EXT ]; then
-    #Move manually files outside of mpa (a find on the whole repository would take too much a long time)
-    [ -f $EXT/yomparar.F90 ] && mv $EXT/yomparar.F90 ../arpifs/module/
-    [ -f $EXT/namparar.nam.h ] && mv $EXT/namparar.nam.h ../arpifs/namelist
-    [ -f $EXT/namlima.nam.h ] && mv $EXT/namlima.nam.h ../arpifs/namelist
-    [ -f $EXT/suparar.F90 ] && mv $EXT/suparar.F90 ../arpifs/phys_dmn/
-    [ -f $EXT/apl_arome.F90 ] && mv $EXT/apl_arome.F90 ../arpifs/phys_dmn/
-    [ -f $EXT/suphmpa.F90 ] && mv $EXT/suphmpa.F90 ../arpifs/phys_dmn/
-    [ -f $EXT/suphmse.F90 ] && mv $EXT/suphmse.F90 ../arpifs/phys_dmn/
-    [ -f $EXT/vdfhghtnhl.F90 ] && mv $EXT/vdfhghtnhl.F90 ../arpifs/phys_dmn/
-    [ -f $EXT/cpg_opts_type_mod.fypp ] && mv $EXT/cpg_opts_type_mod.fypp ../arpifs/module/
-    file=$EXT/cpg_pt_ulp_expl.fypp; [ -f $file ] && mv $file ../arpifs/adiab/
-    file=$EXT/field_variables_mod.fypp; [ -f $file ] && mv $file ../arpifs/module/
-    file=$EXT/cpg_type_mod.fypp; [ -f $file ] && mv $file ../arpifs/module/
-    file=$EXT/field_registry_mod.fypp; [ -f $file ] && mv $file ../arpifs/module/
-    file=$EXT/mf_phys_next_state_type_mod.fypp; [ -f $file ] && mv $file ../arpifs/module/
-    file=$EXT/yemlbc_model.F90; [ -f $file ] && mv $file ../arpifs/module/
-    [ -f $EXT/aplpar.F90 ] && mv $EXT/aplpar.F90 ../arpifs/phys_dmn/
-    [ -f $EXT/su0yomb.F90 ] && mv $EXT/su0yomb.F90 ../arpifs/setup/
-    [ -f $EXT/acvppkf.F90 ] && mv $EXT/acvppkf.F90 ../arpifs/phys_dmn/
-    #Special mpa case
-    for file in modd_spp_type.F90 spp_mod_type.F90 aroini_conf.h aroini_conf.F90; do
-      if [ -f $EXT/$file ]; then
-        [ ! -d ../mpa/aux ] && mkdir ../mpa/aux
-        mv $EXT/$file ../mpa/aux/
-      fi
+    find PHYEX -type f -exec touch {} \; #to be sure a recompilation occurs
+    for rep in turb micro conv aux; do
+      [ -d PHYEX/$rep ] && mv PHYEX/$rep .
     done
-    [ -d $EXT/dead_code ] && rm -rf $EXT/dead_code/
-    if [ $EXT == "PHYEX/externals" ]; then
-      mv $EXT .
-    else
-      #Move automatically all codes under mpa
-      for file in $EXT/*; do
-        extname=`basename $file`
-        loc=`find ../../$reftree/mpa/ -name $extname | sed "s/\/$reftree\//\/local\//g"`
-        nb=`echo $loc | wc -w`
-        if [ $nb -ne 1 ]; then
-          echo "Don't know where $file must be moved, none or several places found!"
-          exit 9
+    #modd_nsv.F90 has been moved and gmkpack is lost in case a different version exists in main/.../micro
+    if [ -f ../../main/phyex/micro/modd_nsv.F90 -a -f aux/modd_nsv.F90 ]; then
+      mv aux/modd_nsv.F90 micro/
+      if [ -f PHYEX/gmkpack_ignored_files ]; then
+        grep -v micro/modd_nsv.F90 PHYEX/gmkpack_ignored_files > PHYEX/gmkpack_ignored_files_new
+        mv PHYEX/gmkpack_ignored_files_new PHYEX/gmkpack_ignored_files
+      fi
+    fi
+    if [ -f PHYEX/gmkpack_ignored_files ]; then
+      #gmkpack_ignored_files contains a list of file, present in the reference pack, that is not used anymore
+      #and must be excluded from compilation (in case of a full comilation) or from re-compilation (in case of a non-full
+      #compilation).
+      if [ $fullcompilation == 0 ]; then
+        #Content is added in the ics_masterodb script
+        sed -i "/^end_of_ignored_files/i $(first=1; for line in $(cat PHYEX/gmkpack_ignored_files); do echo -n $(test $first -ne 1 && echo \\n)${line}; first=0; done)" $HOMEPACK/$name/ics_masterodb
+      else
+        #Files must be suppressed (non phyex files)
+        for file in $(cat PHYEX/gmkpack_ignored_files); do
+          [ -f $HOMEPACK/$name/src/local/$file ] && rm -f $HOMEPACK/$name/src/local/$file
+        done
+        [ ! "$(ls -A $HOMEPACK/$name/src/local/mpa/dummy)" ] && rmdir $HOMEPACK/$name/src/local/mpa/dummy
+      fi
+    fi
+
+    EXT=PHYEX/ext
+    [ ! -d $EXT ] && EXT=PHYEX/externals #old name for ext/aux
+    if [ -d $EXT ]; then
+      #Move manually files outside of mpa (a find on the whole repository would take too much a long time)
+      [ -f $EXT/yomparar.F90 ] && mv $EXT/yomparar.F90 ../arpifs/module/
+      [ -f $EXT/namparar.nam.h ] && mv $EXT/namparar.nam.h ../arpifs/namelist
+      [ -f $EXT/namlima.nam.h ] && mv $EXT/namlima.nam.h ../arpifs/namelist
+      [ -f $EXT/suparar.F90 ] && mv $EXT/suparar.F90 ../arpifs/phys_dmn/
+      [ -f $EXT/apl_arome.F90 ] && mv $EXT/apl_arome.F90 ../arpifs/phys_dmn/
+      [ -f $EXT/suphmpa.F90 ] && mv $EXT/suphmpa.F90 ../arpifs/phys_dmn/
+      [ -f $EXT/suphmse.F90 ] && mv $EXT/suphmse.F90 ../arpifs/phys_dmn/
+      [ -f $EXT/vdfhghtnhl.F90 ] && mv $EXT/vdfhghtnhl.F90 ../arpifs/phys_dmn/
+      [ -f $EXT/cpg_opts_type_mod.fypp ] && mv $EXT/cpg_opts_type_mod.fypp ../arpifs/module/
+      file=$EXT/cpg_pt_ulp_expl.fypp; [ -f $file ] && mv $file ../arpifs/adiab/
+      file=$EXT/field_variables_mod.fypp; [ -f $file ] && mv $file ../arpifs/module/
+      file=$EXT/cpg_type_mod.fypp; [ -f $file ] && mv $file ../arpifs/module/
+      file=$EXT/field_registry_mod.fypp; [ -f $file ] && mv $file ../arpifs/module/
+      file=$EXT/mf_phys_next_state_type_mod.fypp; [ -f $file ] && mv $file ../arpifs/module/
+      file=$EXT/yemlbc_model.F90; [ -f $file ] && mv $file ../arpifs/module/
+      [ -f $EXT/aplpar.F90 ] && mv $EXT/aplpar.F90 ../arpifs/phys_dmn/
+      [ -f $EXT/su0yomb.F90 ] && mv $EXT/su0yomb.F90 ../arpifs/setup/
+      [ -f $EXT/acvppkf.F90 ] && mv $EXT/acvppkf.F90 ../arpifs/phys_dmn/
+      #Special mpa case
+      for file in modd_spp_type.F90 spp_mod_type.F90 aroini_conf.h aroini_conf.F90; do
+        if [ -f $EXT/$file ]; then
+          [ ! -d ../mpa/aux ] && mkdir ../mpa/aux
+          mv $EXT/$file ../mpa/aux/
         fi
-        mv $file $loc
       done
+      [ -d $EXT/dead_code ] && rm -rf $EXT/dead_code/
+      if [ $EXT == "PHYEX/externals" ]; then
+        mv $EXT .
+      else
+        #Move automatically all codes under mpa
+        for file in $EXT/*; do
+          extname=`basename $file`
+          loc=`find ../../$reftree/mpa/ -name $extname | sed "s/\/$reftree\//\/local\//g"`
+          nb=`echo $loc | wc -w`
+          if [ $nb -ne 1 ]; then
+            echo "Don't know where $file must be moved, none or several places found!"
+            exit 9
+          fi
+          mv $file $loc
+        done
+      fi
     fi
+    rm -rf PHYEX
   fi
-  rm -rf PHYEX
 fi
 
+#####################
+#### COMPILATION ####
+#####################
+
 if [ $compilation -eq 1 ]; then
-  echo "### Compilation of commit $commit"
-
-  cd $HOMEPACK/$name
-  sed -i 's/GMK_THREADS=1$/GMK_THREADS=10/' ics_masterodb
-  cleanpack -f
-  resetpack -f
-
-  [ -f ics_packages ] && exescript Output_compilation_hub ics_packages
-  exescript Output_compilation ics_masterodb
-  if [ $extraCompilationCheck -eq 1 -a \
-       -f bin/MASTERODB \
-       -a $(grep Error Output_compilation | \
+  if [ $onlyIfNeeded -eq 0 -o ! -f $HOMEPACK/$name/bin/MASTERODB ]; then
+    echo "### Compilation of commit $commit"
+
+    cd $HOMEPACK/$name
+    sed -i 's/GMK_THREADS=1$/GMK_THREADS=10/' ics_masterodb
+    cleanpack -f
+    resetpack -f
+  
+    [ -f ics_packages ] && exescript Output_compilation_hub ics_packages
+    exescript Output_compilation ics_masterodb
+    if [ -f bin/MASTERODB \
+         -a $(grep Error Output_compilation | \
+              grep -v TestErrorHandler | \
+              grep -v "'Error" | \
+              grep -v "'CPLNG: Error" | \
+              grep -v '"Error' | \
+              grep -v "'*** Error" | \
+              grep -v "\-\- Up-to-date:" | wc -l) -ne 0 ]; then
+      echo "MASTERODB was produced but errors occured during compilation:"
+      grep Error Output_compilation | \
             grep -v TestErrorHandler | \
             grep -v "'Error" | \
             grep -v "'CPLNG: Error" | \
             grep -v '"Error' | \
             grep -v "'*** Error" | \
-            grep -v "\-\- Up-to-date:" | wc -l) -ne 0 ]; then
-    echo "MASTERODB was produced but errors occured during compilation:"
-    grep Error Output_compilation | \
-          grep -v TestErrorHandler | \
-          grep -v "'Error" | \
-          grep -v "'CPLNG: Error" | \
-          grep -v '"Error' | \
-          grep -v "'*** Error" | \
-          grep -v "\-\- Up-to-date:"
-    echo "MASTERODB suppressed!"
-    rm -f bin/MASTERODB
-    exit 12
+            grep -v "\-\- Up-to-date:"
+      echo "MASTERODB suppressed!"
+      rm -f bin/MASTERODB
+      exit 12
+    fi
   fi
 fi
 
 if [ $run -ge 1 ]; then
-  echo "### Running of commit $commit"
-
-  if [ ! -f $HOMEPACK/$name/bin/MASTERODB ]; then
-    echo "Pack does not exist ($HOMEPACK/$name) or compilation has failed, please check"
-    exit 6
-  fi
-
   #Cleaning to suppress old results that may be confusing in case of a crash during the run
-  for t in $(echo $tests | sed 's/,/ /g'); do
-    cd $HOMEPACK/$name
-    if [ -d conf_tests/$t ]; then
-      rm -rf conf_tests/$t
-    fi
-  done
+  if [ $onlyIfNeeded -eq 0 ]; then
+    for t in $(echo $tests | sed 's/,/ /g'); do
+      cd $HOMEPACK/$name
+      if [ -d conf_tests/$t ]; then
+        rm -rf conf_tests/$t
+      fi
+    done
+  fi
 
   #Run the tests one after the other
-  for t in $(echo $tests | sed 's/,/ /g'); do
-    if echo $allowedTests | grep -w $t > /dev/null; then
+  firstrun=1
+  for t in $(echo $tests | sed 's/,/ /g'); do #loop on tests
+    if echo $allowedTests | grep -w $t > /dev/null; then #test is allowed on this plateform
       cd $HOMEPACK/$name
-      mkdir -p conf_tests/$t
-      cd conf_tests/$t
-      MYLIB=$name TESTDIR=$dirconf/$t exescript Output_run $dirconf/$t/aro${cycle}${scripttag}.sh
+      if [ ! -d conf_tests/$t ]; then #We do not enter systematically this part if onlyIfNeeded=1
+        if [ $firstrun -eq 1 ]; then
+          echo "### Running of commit $commit"
+          firstrun=0
+        fi
+
+        if [ ! -f $HOMEPACK/$name/bin/MASTERODB ]; then
+          echo "Pack does not exist ($HOMEPACK/$name) or compilation has failed, please check"
+          exit 6
+        fi
+
+        mkdir -p conf_tests/$t
+        cd conf_tests/$t
+        MYLIB=$name TESTDIR=$dirconf/$t exescript Output_run $dirconf/$t/aro${cycle}${scripttag}.sh
+      fi
     else
       echo "The test $t is not allowed"
     fi
   done
 fi
 
+####################
+#### COMPARISON ####
+####################
+
 if [ $check -eq 1 ]; then
   echo "### Check commit $commit against commit $reference"
 
@@ -596,6 +680,12 @@ if [ $check -eq 1 ]; then
   filestocheck=""
   for t in $(echo $tests | sed 's/,/ /g'); do
     if echo $allowedTests | grep -w $t > /dev/null; then
+      #Run the reference if needed
+      if [ $computeRefIfNeeded -eq 1 ]; then
+        $0 -p -c -r -t $t --onlyIfNeeded ${refByTest[$t]}
+      fi
+
+      #Files to compare
       if echo $t | grep 'small' > /dev/null; then
         filestocheck="$filestocheck ${t},conf_tests/$t/ICMSHFPOS+0002:00 ${t},conf_tests/$t/DHFDLFPOS+0002"
       else
@@ -605,9 +695,12 @@ if [ $check -eq 1 ]; then
       echo "The test $t is not allowed"
     fi
   done
+
   for tag_file in $filestocheck; do
       tag=$(echo $tag_file | cut -d, -f1)
       file=$(echo $tag_file | cut -d, -f2)
+      refname=${refnameByTest[$tag]}
+      ref=${refByTest[$tag]}
       file1=$HOMEPACK/$name/$file
       file2=$(echo $HOMEPACK/$refname/$file) #echo to enable shell substitution
 
@@ -618,7 +711,7 @@ if [ $check -eq 1 ]; then
         t=1
       fi
       if [ ! -f "$file2" ]; then
-        mess2="Result ($file2) for commit $reference does not exist, please run the simulation"
+        mess2="Reference result ($file2) for commit $ref does not exist, please run the simulation"
         t=1
         if [ "$mess" = "" ]; then
           mess=$mess2
@@ -679,6 +772,10 @@ if [ $check -eq 1 ]; then
   fi
 fi
 
+##################
+#### CLEANING ####
+##################
+
 if [ $remove -eq 1 ]; then
   echo "### Remove model directory for commit $commit"
   [ -d $HOMEPACK/$name ] && rm -rf $HOMEPACK/$name
diff --git a/tools/comp_DDH.py b/tools/comp_DDH.py
index 1d9f06238ce2c70311169a990fbe7251f6ed6731..a2a625fe18e5a038357f3edaebe06c3bff1b0085 100755
--- a/tools/comp_DDH.py
+++ b/tools/comp_DDH.py
@@ -10,75 +10,80 @@ import matplotlib.pyplot as plt
 epygram.init_env()
 
 def comp_DDH(filename1, filename2, output_fig, tol_ad=3E-7, tol_rd=1.E-6, verbose=False):
-    r1 = epygram.formats.resource(filename1, 'r')
-    r2 = epygram.formats.resource(filename2, 'r')
-
-    l1 = set(r1.listfields())
-    l2 = set(r2.listfields())
-    pb_var = len(l1.symmetric_difference(l2)) != 0
-
-    def comp(fid, v1, v2):
-        t = numpy.all(v1 == v2)
-        toplt = False
-        if not t:
-            if verbose: print(fid, ':')
-            if numpy.array(v1).ndim == 0:
-                v1 = numpy.array([v1])
-                v2 = numpy.array([v2])
-            for i in range(len(v1)):
-                if v1[i] - v2[i] != 0.:
-                    ad = v1[i] - v2[i]
-                    rd = 200 * (v1[i] - v2[i]) / (v1[i] + v2[i])
-                    if verbose: print("   v1={v1}, v2={v2}, diff={ad}, rdiff={rd}".format(v1=v1[i], v2=v2[i], ad=ad, rd=rd))
-                    if abs(ad) > tol_ad and abs(rd) > tol_rd:
-                      if verbose: print("  ==> plot")
-                      toplt = True
-        return fid if toplt else None
-    toplt = []
-    for fid in [fid for fid in l1.intersection(l2) if fid != 'DOCFICHIER']:
-        v1 = r1.readfield(fid)
-        v2 = r2.readfield(fid)
-        if isinstance(v1, epygram.base.FieldSet):
-            for i in range(len(v1)): #fieldset
-                toplt.append(comp(fid, v1[i].getdata(), v2[i].getdata()))
-        else:
-            toplt.append(comp(fid, v1.getdata(), v2.getdata()))
-    toplt = [fid for fid in toplt if fid is not None]
-    pb_val = len(toplt) > 0
-    if pb_val:
-        ncols, nrows = min(10, len(toplt)), 1+(len(toplt)-1)//10
-        figure, ax = plt.subplots(ncols=ncols, nrows=nrows,
-                                  figsize=(5 * ncols, 10 * nrows), squeeze=False)
-        ax = ax.flatten()
-        figure.suptitle(filename1 + ' ' + filename2)
-        for ifid, fid in enumerate(toplt):
+    if filename1 != filename2:
+        r1 = epygram.formats.resource(filename1, 'r')
+        r2 = epygram.formats.resource(filename2, 'r')
+    
+        l1 = set(r1.listfields())
+        l2 = set(r2.listfields())
+        pb_var = len(l1.symmetric_difference(l2)) != 0
+    
+        def comp(fid, v1, v2):
+            t = numpy.all(v1 == v2)
+            toplt = False
+            if not t:
+                if verbose: print(fid, ':')
+                if numpy.array(v1).ndim == 0:
+                    v1 = numpy.array([v1])
+                    v2 = numpy.array([v2])
+                for i in range(len(v1)):
+                    if v1[i] - v2[i] != 0.:
+                        ad = v1[i] - v2[i]
+                        rd = 200 * (v1[i] - v2[i]) / (v1[i] + v2[i])
+                        if verbose: print("   v1={v1}, v2={v2}, diff={ad}, rdiff={rd}".format(v1=v1[i], v2=v2[i], ad=ad, rd=rd))
+                        if abs(ad) > tol_ad and abs(rd) > tol_rd:
+                          if verbose: print("  ==> plot")
+                          toplt = True
+            return fid if toplt else None
+        toplt = []
+        for fid in [fid for fid in l1.intersection(l2) if fid != 'DOCFICHIER']:
             v1 = r1.readfield(fid)
             v2 = r2.readfield(fid)
-            assert(len(v1) == len(v2))
-            for i in range(len(v1)): #fieldset
-                ad = v1[i].getdata() - v2[i].getdata()
-                ax[ifid].plot(v1[i].getdata(), v1[i].geometry.vcoordinate.levels, label='v1')
-                ax[ifid].plot(v2[i].getdata(), v2[i].geometry.vcoordinate.levels, label='v2')
-                ax[ifid].legend()
-                ax[ifid].twiny().plot(ad, v1[i].geometry.vcoordinate.levels, label='diff', color='black', ls=':')
-                ad = numpy.abs(ad)
-                rd = (200 * numpy.abs(v1[i].getdata() - v2[i].getdata()) / numpy.abs(v1[i].getdata() + v2[i].getdata()))
-                rd = rd[ad != 0.].max()
-                ad = ad.max()
-                ax[ifid].set_title("{fid}:\nmax_ad={ad}\nmax_rd={rd}%".format(fid=fid, ad=ad, rd=rd))
-        figure.savefig(output_fig[0])
-        for filename in output_fig[1:]:
-             shutil.copyfile(output_fig[0], filename)
-    if pb_var and pb_val:    
-        message = "Variables are different and values of common variables are also different"
-    elif pb_var:
-        message = "Variables are different but values of common variables are equal"
-    elif pb_val:
-        message = "Values are different"
-    else:
+            if isinstance(v1, epygram.base.FieldSet):
+                for i in range(len(v1)): #fieldset
+                    toplt.append(comp(fid, v1[i].getdata(), v2[i].getdata()))
+            else:
+                toplt.append(comp(fid, v1.getdata(), v2.getdata()))
+        toplt = [fid for fid in toplt if fid is not None]
+        pb_val = len(toplt) > 0
+        if pb_val:
+            ncols, nrows = min(10, len(toplt)), 1+(len(toplt)-1)//10
+            figure, ax = plt.subplots(ncols=ncols, nrows=nrows,
+                                      figsize=(5 * ncols, 10 * nrows), squeeze=False)
+            ax = ax.flatten()
+            figure.suptitle(filename1 + ' ' + filename2)
+            for ifid, fid in enumerate(toplt):
+                v1 = r1.readfield(fid)
+                v2 = r2.readfield(fid)
+                assert(len(v1) == len(v2))
+                for i in range(len(v1)): #fieldset
+                    ad = v1[i].getdata() - v2[i].getdata()
+                    ax[ifid].plot(v1[i].getdata(), v1[i].geometry.vcoordinate.levels, label='v1')
+                    ax[ifid].plot(v2[i].getdata(), v2[i].geometry.vcoordinate.levels, label='v2')
+                    ax[ifid].legend()
+                    ax[ifid].twiny().plot(ad, v1[i].geometry.vcoordinate.levels, label='diff', color='black', ls=':')
+                    ad = numpy.abs(ad)
+                    rd = (200 * numpy.abs(v1[i].getdata() - v2[i].getdata()) / numpy.abs(v1[i].getdata() + v2[i].getdata()))
+                    rd = rd[ad != 0.].max()
+                    ad = ad.max()
+                    ax[ifid].set_title("{fid}:\nmax_ad={ad}\nmax_rd={rd}%".format(fid=fid, ad=ad, rd=rd))
+            figure.savefig(output_fig[0])
+            for filename in output_fig[1:]:
+                 shutil.copyfile(output_fig[0], filename)
+        if pb_var and pb_val:    
+            message = "Variables are different and values of common variables are also different"
+        elif pb_var:
+            message = "Variables are different but values of common variables are equal"
+        elif pb_val:
+            message = "Values are different"
+        else:
+            message = ""
+        if pb_val:
+            message += ", plot is available in the folowing file(s): " + ', '.join(output_fig)
+    else: #same file
+        pb_var = False
+        pb_val = False
         message = ""
-    if pb_val:
-        message += ", plot is available in the folowing file(s): " + ', '.join(output_fig)
 
     print(message)
     return 1 if pb_var or pb_val else 0
diff --git a/tools/testing.sh b/tools/testing.sh
index 9d9de01b90254bb24eca6fa7d298d24614af3412..a413671d62cd507f127df9e078b8e92477a2c816 100755
--- a/tools/testing.sh
+++ b/tools/testing.sh
@@ -289,16 +289,19 @@ if [ ${force} -eq 1 -o $(get_statuses "${SHA}" | grep "${context}" | wc -l) -eq
     if [ "${model}" == 'ial' ]; then
       compilation='-p -c'
       execution='-r'
+      comparison='-C --computeRefIfNeeded'
       jsonfile="src/arome/ial_version.json"
       docmp=1
     elif [ "${model}" == 'lmdz' ]; then
       compilation='-p -c --nofcm'
       execution='-r --nofcm'
+      comparison='-C'
       jsonfile="src/${model}/${model}_version.json"
       docmp=0
     else
       compilation='-c'
       execution='-r'
+      comparison='-C'
       jsonfile="src/${model}/${model}_version.json"
       docmp=1
     fi
@@ -359,7 +362,7 @@ if [ ${force} -eq 1 -o $(get_statuses "${SHA}" | grep "${context}" | wc -l) -eq
           fi
         fi
         if [ ${result} -eq 0 -a ${docmp} -eq 1 -a ${comp} -eq 1 ]; then
-          compcmd="$cmd -C ${casearg} ${refarg}"
+          compcmd="$cmd ${comparison} ${casearg} ${refarg}"
           log 1 "Comparison with ${compcmd}"
           set +e
           ${compcmd}