Bläddra i källkod

Add bash script to generate perturbed initial conditions from NEMO restart

fmasson 7 år sedan
förälder
incheckning
f1da60f28c
1 ändrade filer med 105 tillägg och 0 borttagningar
  1. 105 0
      gener_perturb_nemo_restart.bash

+ 105 - 0
gener_perturb_nemo_restart.bash

@@ -0,0 +1,105 @@
+#!/bin/bash
+#
+# -- Author : François Massonnet, francois.massonnet@ic3.cat
+# -- Date   : 30 Jan 2015
+# -- At     : IC3, Barcelona
+# -- Modified : 19 Jan 2016, omar.bellprat@bsc.es 
+#               November 2017, francois.massonnet@uclouvain.be
+# -- Purpose: Generation of an arbitrary number of NEMO oceanic restarts that are copies of a reference, plus a perturbation
+#
+# -- Method : The reference file is duplicated in this script, then read by a R script. The perturbation is introduced and finally written to this latter file.
+
+module load R
+
+set -o errexit
+set -o nounset
+#set -x
+
+
+if [ $# == 0 ] ; then
+  echo ""
+  echo "  Usage: gener_perturb_restart.bash NETCDF-file NUMBER-members"
+  echo "      PURPOSE : "
+  echo "        Creates NUMBER-members copies of the input NETCDF-file file"
+  echo "        and adds for each copy a white noise to sea surface"
+  echo "        temperature (standard deviation: 10^(-4) K)"
+  echo "        This script can be used to generate ensemble members"
+  echo "        for coupled simulations"
+  echo "      ARGUMENTS : "
+  echo "        NETCDF-file : Restart file of NEMO (NetCDF format). The file"
+  echo "                      must contain a variable named tn"
+  echo "        NUMBER-members : number of perturbed restarts to generate"
+  echo "      OUTPUT : "
+  echo "        NUMBER-members copies of the original files with perturbed"
+  echo "        variable tn. The file names are the same as the input files"
+  echo "        but with suffix pertXX where XX = 01, 02, 03, ..."
+  echo "      EXAMPLE : "
+  echo "        ./gener_perturb_restart.bash EC04_00046752_restart_oce_0005.nc 5"
+  echo "        --> will create:"
+  echo "              EC04_00046752_restart_oce_0005_pert01.nc"
+  echo "              EC04_00046752_restart_oce_0005_pert02.nc"
+  echo "              EC04_00046752_restart_oce_0005_pert03.nc"
+  echo "              EC04_00046752_restart_oce_0005_pert04.nc"
+  echo "              EC04_00046752_restart_oce_0005_pert05.nc"
+  echo "      HELPDESK : "
+  echo "        francois.massonnet@uclouvain.be"
+  echo ""
+  exit
+fi
+
+filein=$1
+nmemb=$2
+
+# ---------------------------------------------------------
+
+var=tn          # Variable to be perturbed
+per=0.0001      # Standard deviation of gaussian perturbation to be applied,
+                # in units of the variable (for tn: in K for example)
+
+cp $filein ${filein}.backup # Do a backup
+
+for jmemb in `seq 1 $nmemb`
+do
+  echo "Doing copy $jmemb out of $nmemb"
+  jmemb=$(printf "%02d" $jmemb)
+  # 1. Make a copy of the original file, with the new name
+  filenew="${filein%.nc}_pert${jmemb}.nc"
+  cp $filein $filenew
+
+  # 2. Prepare the R script
+
+  echo "#!/usr/bin/env Rscript
+  library(ncdf4)
+
+  # François Massonnet, 30 Jan 2015
+  # Adds a gaussian perturbation at the first level of a 3D field
+  # Tested only for NEMO restarts
+  #
+  # This script should be called by a bash script so that the variable and file names are specified, as well as the perturbation
+
+  varname='$var'
+  filein <- '$filenew'
+  ex.nc           <- nc_open(filein,write=TRUE)
+  spert <- $per
+
+  myvar     <- ncvar_get(ex.nc, varname)
+  myvarpert <- myvar
+  for (i in seq(1,dim(myvar)[1])){
+    for (j in seq(1,dim(myvar)[2])){
+      if (myvar[i,j,1] != 0){
+        myvarpert[i,j,1] = myvarpert[i,j,1] + rnorm(1,sd=spert)
+      }
+    }
+  }
+
+  ncvar_put(ex.nc,varname,myvarpert)
+  nc_close(ex.nc)" > Rtmpfile.R
+
+  chmod 744 Rtmpfile.R
+
+  # 3. Run the R script, that produces the new NetCDF
+  ./Rtmpfile.R 
+
+  rm -f Rtmpfile.R
+done
+