Index: /configs/testing/bash/X64_CURIE.sh
===================================================================
--- /configs/testing/bash/X64_CURIE.sh	(revision 519)
+++ /configs/testing/bash/X64_CURIE.sh	(revision 520)
@@ -5,5 +5,5 @@
 # create_runs.sh and submit.sh
 
-# NB : we must the queue 'normal' because there seems to be a limit
+# NB : we must use the queue 'normal' because there seems to be a limit
 # on the number of jobs that can be submitted to queue 'test'
 
@@ -18,4 +18,7 @@
 function split_mpi_80() {
     setvar nbp 81 nsplit_i 4 nsplit_j 2
+}
+function split_mpi_omp_40() {
+    setvar nbp 41 nsplit_i 2 nsplit_j 2 omp_level_size 4
 }
 
@@ -33,6 +36,7 @@
 #------------------------------ job_XXX -----------------------------
 
+# Serial jobs
 function job_serial() { # EXP_NAME
-    job_X64_CURIE $1 1 "" 
+    job_X64_CURIE $1 1 1 "./gcm.exe"
 }
 function job_serial_40() { # EXP_NAME
@@ -40,6 +44,7 @@
 }
 
+# MPI jobs
 function job_mpi() { #EXP_NAME NB_MPI
-    job_X64_CURIE $1 $2 ccc_mprun
+    job_X64_CURIE $1 $2 1 "ccc_mprun ./gcm.exe"
 }
 function job_mpi_40() { # EXP_NAME
@@ -50,5 +55,14 @@
 }
 
-function job_X64_CURIE() { # EXP_NAME MPI_TASKS MPIRUN
+# MPI-OMP jobs
+function job_mpi_omp() { #EXP_NAME NB_MPI NB_OMP
+    job_X64_CURIE $1 $2 $3 "ccc_mprun ./gcm.exe"
+}
+function job_mpi_omp_40() { # EXP_NAME
+    job_mpi_omp $1 40 4
+}
+
+# Generic
+function job_X64_CURIE() { # EXP_NAME MPI_TASKS OMP_TASKS MPIRUN
     cat <<EOF
 #!/bin/bash
@@ -60,4 +74,6 @@
 ## Number of tasks (=MPI processes) to use
 #MSUB -n $2
+## Number of OpenMP threads
+#MSUB -c $3
 ## Elapsed time limit in seconds
 #MSUB -T 600
@@ -65,5 +81,5 @@
 #MSUB -Q normal
 
-export OMP_NUM_THREADS=1
+export OMP_NUM_THREADS=$3
 cd \${BRIDGE_MSUB_PWD} 
 
@@ -73,5 +89,5 @@
 date > gcm.log
 ulimit -s unlimited
-$3 ./gcm.exe >> gcm.log
+$4 ./gcm.exe >> gcm.log
 date >> gcm.log
 
Index: /configs/testing/bash/create_runs.sh
===================================================================
--- /configs/testing/bash/create_runs.sh	(revision 519)
+++ /configs/testing/bash/create_runs.sh	(revision 520)
@@ -12,5 +12,7 @@
     cd $EXPDIR
     ln -sf $ROOT/bin/icosa_${EXEC}.exe gcm.exe
-    ln -sf $ROOT/python/post_${EXP}.py post.py
+    cp $ROOT/python/common.py post.py
+    echo "post_${EXP}()" >> post.py
+#    ln -sf $ROOT/python/post_${EXP}.py post.py
     rundef_$EXP $* > tmp.def
     sort tmp.def | cut -c 7- > run.def
@@ -103,5 +105,5 @@
     rundef_DCMIP $NBP
     setvar hydrostatic .FALSE.
-    setvar omega 0. llm 10 disvert ncar ncar_T0 300 ncar_p0 1e5 ncar_disvert_c 1 ncar_dz 1118 
+    setvar omega 0. llm 10 disvert ncar ncar_T0 300 ncar_p0 1e5 ncar_disvert_c 1 ncar_dz 1118
     setvar tau_graddiv $TAU tau_gradrot $TAU tau_divgrad $TAU 
     setvar scale_factor 125 write_period 7500 run_length 4.5e5 etat0 dcmip3
@@ -139,5 +141,32 @@
 }
 
-#----------------------------- END ----------------------------
+#------------------------------------- OTHER ---------------------------------
+
+function rundef_bubble() { # NBP TAU
+    NBP=$1 ; TAU=$2
+    rundef_all
+    set_nbp_$NBP
+    setvar llm 50 disvert ncar ncar_dz 20 ncar_T0 300 ncar_p0 1e5
+#    setvar time_scheme ARK2.3
+    setvar nitergdiv 2 nitergrot 2 niterdivgrad 2 tau_graddiv $TAU tau_gradrot $TAU tau_divgrad $TAU
+    setvar radius 5e6 scale_factor 10000  g 9.80616 kappa 0.2857143 cpp 1004.5 preff 1e5 omega 0.
+}
+function job_bubble() { # EXEC NBP
+    job_$1_$2 Bubble_$1
+}
+
+function rundef_held_suarez() { # NBP TAU
+    NBP=$1 ; TAU=$2
+    rundef_DCMIP $NBP
+    setvar llm 19 disvert std write_period 86400 run_length 2592000 etat0 held_suarez # physics held_suarez
+    setvar time_scheme RK2.5
+    setvar nitergdiv 2 nitergrot 2 niterdivgrad 2 tau_graddiv $TAU tau_gradrot $TAU tau_divgrad $TAU
+}
+function job_held_suarez() { # EXEC NBP
+    job_$1_$2 HS94_$1
+}
+
+
+#-------------------------------- END TEST CASES -----------------------------
 
 function basic()
@@ -154,4 +183,6 @@
     create_exp mpi DCMIP41 two_degree 24h 40 10000 # nbp tau 
 #    create_exp mpi DCMIP51 one_degree 2h  80 10000 # nbp tau 
+# Other
+    create_exp mpi_omp held_suarez two_degree 24h 40 10000 # nbp tau 
 }
 
@@ -162,5 +193,5 @@
     order 100 radius omega g cpp kappa preff scale_factor
     order 200 boussinesq hydrostatic
-    order 300 nbp optim_it nsplit_i nsplit_j llm disvert ncar_disvert_c ncar_dz ncar_T0 ncar_p0
+    order 300 nbp optim_it nsplit_i nsplit_j llm omp_level_size disvert ncar_disvert_c ncar_dz ncar_T0 ncar_p0
     order 400 caldyn_eta time_scheme caldyn_conserv dt nqtot itau_adv
     order 500 nitergdiv tau_graddiv nitergrot tau_gradrot niterdivgrad tau_divgrad rayleigh_friction_type rayleigh_friction_tau
Index: /configs/testing/python/common.py
===================================================================
--- /configs/testing/python/common.py	(revision 519)
+++ /configs/testing/python/common.py	(revision 520)
@@ -19,2 +19,105 @@
     plt.yticks(np.arange(-90,91,30))
 
+def slice_lon(nlon,llm,lon,Phi):
+    lon2, z = np.zeros((llm,nlon)), np.zeros((llm,nlon))
+    for lev in range(llm):
+        # average from interfaces to full levels
+        z[lev,:] = (.5/g)*(Phi[lev,:]+Phi[lev+1,:]) 
+        lon2[lev,:] = lon[:]
+    return lon2, z
+
+#--------------------------- DCMIP21 ---------------------------
+
+def post_DCMIP21():
+    def plot_var(nlon,nlat,llm, lon,Phi,var,varname):
+        # vertical slice at final time
+        print 'Reading data ...'
+        var, Phi = var[-1,:,nlat/2,:], Phi[-1,:,nlat/2,:]
+        print '... done.'
+        lon2, z = slice_lon(nlon,llm,lon,Phi)
+        plt.figure(figsize=(12,6))
+        plt.contourf(lon2,z,var)
+        plt.colorbar() 
+        plt.title('%s at final time'%varname)
+        axis_longitude()
+        plt.ylabel('z (m)')
+        #        plt.yticks(np.arange(0, 10001, 1000))
+        plt.savefig('%s.png'%varname)
+    lon, lat, Omega,T,u,Phi = getvars(nc, 'lon','lat','OMEGA', 'T', 'U', 'PHI')
+    plot_var(nlon,nlat,llm, lon,Phi,Omega,'Omega')
+    plot_var(nlon,nlat,llm, lon,Phi,u,'u')
+    plot_var(nlon,nlat,llm, lon,Phi,T,'T')
+
+#--------------------------- DCMIP31 ---------------------------
+
+def post_DCMIP31():
+    
+    def plot_T850(lon,lat,T850):  # T850 at final time
+        print 'Reading data ...'
+        lon, lat, T850 = lon[:], lat[:], T850[-1, :, :]
+        print '... done.'
+        plt.figure(figsize=(12,6))
+        plt.contourf(lon,lat,T850)
+        plt.colorbar() 
+        plt.title('T850')
+        axis_longitude()
+        axis_latitude()
+        plt.savefig('T850.png')
+        
+    def plot_dT(nlon,nlat,llm, lon,T,p,Phi): # perturbation temp, final time
+        # vertical slice at final time
+        print 'Reading data ...'
+        T,p, Phi = T[-1,:,nlat/2,:], p[-1,:,nlat/2,:], Phi[-1,:,nlat/2,:]
+        print '... done.'
+        N, Teq, peq = 0.01, 300., 1e5
+        N2, g2 = N*N, g*g
+        G = g2/(N2*Cpd)
+
+        lon2, z = slice_lon(nlon,llm,lon,Phi)
+        theta = T*((peq/p)**kappa)
+        Thetab = Teq*np.exp(N2*z/g)
+        plt.figure(figsize=(12,6))
+        plt.contourf(lon2,z,theta-Thetab, levels=np.arange(-0.12,0.12,0.02) )
+        plt.colorbar() 
+        plt.title('$\\Theta\'$')
+        axis_longitude()
+        plt.ylabel('z (m)')
+        plt.yticks(np.arange(0, 10001, 1000))
+        plt.savefig('dT.png')
+
+    lon, lat, T850, T, Phi, p = getvars(nc, 'lon','lat','T850', 'T', 'PHI','P')
+    plot_dT(nlon,nlat,llm, lon,T,p,Phi)
+    plot_T850(lon,lat,T850)
+
+#--------------------------- DCMIP41 ---------------------------
+
+def post_DCMIP41():
+    def plot_T850(day, lon,lat,T850):  # T850 at final time
+        print 'Reading data ...'
+        lon, lat, T850 = lon[:], lat[:], T850[day-1, :, :]
+        print '... done.'
+        plt.figure(figsize=(12,5))
+        plt.contourf(lon,lat,T850)
+        plt.colorbar() 
+        plt.title('T850 at day %d'%day)
+        axis_longitude()
+        axis_latitude()
+        plt.savefig('T850_day%02d.png'%day)
+
+    lon, lat, T850, T, Phi = getvars(nc, 'lon','lat','T850', 'T', 'PHI')    
+    plot_T850(7,lon,lat,T850)
+    plot_T850(10,lon,lat,T850)
+    plot_T850(30,lon,lat,T850)
+
+#------------------------ Held & Suarez ----------------------
+
+post_held_suarez = post_DCMIP41
+    
+#--------------------------- MAIN ----------------------------
+
+gridfile = 'netcdf/output_dcmip2016_regular.nc'
+nc = cdf.Dataset(gridfile, "r")
+llm, nlon, nlat, ntime = getdims(nc, 'lev','lon','lat','time_counter')
+Cpd, kappa, g = 1004.5, 0.2857143, 9.80616
+
+# Now call a routine post_XXX()
