# @$-eo -r o2lamodb # @$-lt 1200 -lT 300 # @$-lM 1500mb -lV 0mb # @$-lP 1 set -x export VPP_MBX_SIZE=32000000 #======================================================================== # All necessary variables and pathnames are defined at the beginning of # the script!! Exceptions: executables names (defined in the proper # execution blocks). #======================================================================== #======================================================================== # -This script creates an input ODB for LAM data assimilation. The data # selection always includes a geographical selection for data in C+I # zone, and optionally a selection based on observation types. The # output ODB is always put into the following dir: # # $workdir/DATA/${expName}/ecma_${assimDate}.${assimType}${suff} # # -The assimDate and expName parameters are read from the assimParFile # parameter-file! # # -The number of pools in the LAM ODB is given by the NBPROC variable. # # -If SAVE_lamodb=TRUE, then the LAM ODB will be saved to kami # into the following tar-file: # # ASSIM_ALD/${expName}/${assimDate}.${assimType}/ECMA_LAM.tar # # This tar-file contains the pools and the ECMA.dd and ECMA.sch files! # # -The optional selection based on observational type can be controlled # via the SYNOP_NEED, AIREP_NEED etc. variables defined at the beginning # of the script. # # -Namelists supposed to be in DIR_namelist dir. and they are: # lamflag_odb.nml :lamflag_odb # obsort_3d.nml:obsort 3dvar # # -The script can work in the following modes (controlled via the # SCRIPT_MODE variable): # # ------------------------------------------------------------------- # 1: Convert obsoul file (DIR_obs) to global ODB, then select LAM data. # During this process the global ODB can be saved # with SAVE_globodb=TRUE) to kami into the following tar-file: # # ASSIM_ALD/globODB/${assimDate}/ecma_${assimDate}.${assimType}${suff}.tar # # This tar-file contains the pools and the ECMA.dd and ECMA.sch files!! # ------------------------------------------------------------------- # 2: Get operational global ODB ($DIR_OBS/ecmascr.tar), then select # LAM data # ------------------------------------------------------------------- # 3: Get previously saved global ODB (DIR_myGlobodb), then select # LAM data. It is suppodsed that global ODB is in a tar-file, with # similar name and structure as in mode 1! # ------------------------------------------------------------------- # 4: Get previously saved LAM ODB (DIR_myLamodb), then select LAM data. # (This mode is created to select diff. observation types). It is # suppodsed that LAM ODB is in a tar-file, with similar name and # structure as the result of SAVE_lamodb=TRUE (see above). # ------------------------------------------------------------------- # 5: Get previously saved LAM ODB (DIR_myLamodb), then only change # the number of pools. In this case input and output ODBs have to # refer to the same LAM domain. # # # Remark: 3 and 4 are basically the same, only the input dir. is diff. #======================================================================= #Number of pools in the final lam ODB NBPROC=1 #Read DA parameters from parfile (shared with screening+min script). #Only the 1st, the 3rd, the 4th and the 5th lines are needed. assimParFile=$HOME/devAL15/e131/par/assim_date.par set -- `cat $assimParFile` assimDate=$1 # assimilation date(yyyymmddhh) #NJOB=$3 #NMXJOB=$4 expName=$5 # number of pools for output LAM ODB #assimDate=2000122218 #expName=tot1 #Other DA parameters assimType=3d suff="" # Parse date to get obs directory name AAAAMMJJRR=$assimDate AAAAMMJJ=`expr $AAAAMMJJRR | cut -c1-8` AAAA=`expr $AAAAMMJJRR | cut -c1-4`; MM=`expr $AAAAMMJJRR | cut -c5-6` JJ=`expr $AAAAMMJJRR | cut -c7-8`; RRSV=`expr $AAAAMMJJRR | cut -c9-10` RR=$RRSV; [ $RR -eq "00" ] && RR=0; [ $RR -eq "06" ] && RR=6 cycle=24; version="t1"; bf="_op1"; numero=".04" #ODB settings cycle=24; version="t1"; bf="_op1"; numero=".04" ODB_SYS=~marp001/pub/cy${cycle}${version}${bf}${numero}/src/main/odb/${cycle}${version}/vpp5000 DIRNAME_odb_ecma=ecma_${assimDate}.${assimType}${suff} DIRNAME_odb_ecmascr=ecmascr_${assimDate}.${assimType}${suff} export ODB_STATIC_LINKING=1 export TO_ODB_ECMWF=0 export ODB_SCRPATH_ECMASCR=${TMPDIR}/${DIRNAME_odb_ecmascr} export ODB_DATAPATH_ECMASCR=${ODB_SCRPATH_ECMASCR} export ODB_SCRPATH_ECMA=${TMPDIR}/${DIRNAME_odb_ecma} export ODB_DATAPATH_ECMA=${ODB_SCRPATH_ECMA} export ODB_ANALYSIS_DATE=$(echo ${assimDate} | cut -c1-8) export ODB_ANALYSIS_TIME=$(echo ${assimDate} | cut -c9-10) DOLIST_odbout=FALSE #Flags for the observation type selection SYNOP_NEED=.T. AIREP_NEED=.T. SATOB_NEED=.T. DRIBU_NEED=.T. TEMP_NEED=.T. PILOT_NEED=.T. SATEM_NEED=.T. # Namelist dir DIR_namelist=$HOME/devAL15/examples/namelist DIR_script=$HOME/devAL15/examples # Operational obs dir DIR_obs=/chaine/mxpt/mxpt001/arpege/oper/assim/${AAAA}/${MM}/${JJ}/r${RR} # Define script mode SCRIPT_MODE=5 #Save SCRIPT_MODE=1 proc result into DIR_saveGlobodb on delage SAVE_globodb=FALSE DIR_saveGlobodb=ASSIM_ALD/globODB/${assimDate} if [ $SAVE_globodb = "TRUE" ] ; then cat > jaguar << EOF mkdir ASSIM_ALD mkdir ASSIM_ALD/globODB mkdir ASSIM_ALD/globODB/${assimDate} EOF ftuas <jaguar; \rm jaguar fi #Get global odb file at SCRIPT_MODE=2 from this dir on delage DIR_myGlobodb=ASSIM_ALD/globODB/${assimDate} # Save the final lamodb into DIR_myGlobodb on delage SAVE_lamodb=FALSE DIR_saveLamodb=ASSIM_ALD/${expName}/${assimDate}.${assimType} if [ $SAVE_lamodb = "TRUE" ] ; then cat > jaguar << EOF mkdir ASSIM_ALD mkdir ASSIM_ALD/${expName} mkdir ASSIM_ALD/${expName}/${assimDate}.${assimType} EOF ftuas <jaguar; \rm jaguar fi #Get lam odb file at SCRIPT_MODE=4 or 5 from this dir on delage #DIR_myLamodb=ASSIM_ALD/${expName}/${assimDate}.${assimType} DIR_myLamodb=ASSIM_ALD/all1/${assimDate}.${assimType} #============================================================ # # 1.1. OBSOUL -> GLOBAL ODB # output: $TMPDIR/ecma_${assimDate}.${assimType}${suff} # #============================================================ if [ $SCRIPT_MODE -eq 1 ] ; then cd $TMPDIR #------------------------------------------ # 1.1.1. BATOR, MANDALAY and OBSORT settings #------------------------------------------ EXE_bator=/u/ch/mxpt/mxpt001/arpege/france/dbl/exec/BATOR EXE_mandalay=/u/sm/marp/marp001/tampon/bin/man/ma07/ma07_op4.13.L9912.x.exe EXE_obsort=/u/ch/mxpt/mxpt001/arpege/france/oper/exec/OBSORT RUN_mandalay=0 # 1 pour extension [ $assimDate -le 2000061918 ] && RUN_mandalay=1 [ $assimType = "3d" ] && RUN_mandalay=0 RUN_obsort=1 [ $suff = ".cpl" ] && RUN_obsort=0 #Settings for OBSORT dato=`smsdate $assimDate -3` dat_obsort=`echo $dato | cut -c1-8` h_obsort=`echo $dato | cut -c9-10` MXUP_TRAJ=3 #xxx 3 #------------------------------------------ # 1.1.2. BATOR # task: convert obsoul file into CMA # namelist: NAMELIST # input: OBSOUL,PATOUCH # output: OBSARP #------------------------------------------ ftget ${DIR_obs}/obsoul OBSOUL cp /u/ch/mxpt/mxpt001/arpege/france/dbl/const/autres/LISTE_NOIRE_DIAP PATOUCH banner BATOR #Namelist for bator cat <<EOF > NAMELIST &NADIRS LMODAI=.FALSE., LINCRE=.TRUE., NRESUPD=3, NODEPT=0, &END EOF \rm BATOR 2>/dev/null #execute bator \ln -s $EXE_bator BATOR BATOR > lola cat lola \ls -l \rm -f BATOR bator.lst NAMELIST PATOUCH OBSOUL [ ! -r OBSARP ] && exit #----------------------------------------- # 1.1.3. MANDALAY # extension partie incrementale pour 4d # input: CMAFOCI01 # output: CMAFOCO01 #----------------------------------------- if [ ${RUN_mandalay} -eq 1 ] ; then banner MANDALAY \mv OBSARP CMAFOCI01 cat <<EOF > NAMELIST &NACTDO / &NADIRS LAEINC=.TRUE., NRESUPD=$MXUP_TRAJ, / &NAECLA / &NAFORC / &NAIMPO / &NALINO / &NASTAT / &NAMPONG / EOF \rm MANDALAY 2>/dev/null #execute mandalay \ln -s $EXE_mandalay MANDALAY MANDALAY >lola cat lola \ls -l \mv CMAFOCO01 OBSARP \rm -f MANDALAY NAMELIST CMAFOCI01 [ ! -f OBSARP ] && exit fi #------------------------------------------------------- # 1.1.4. OBSORT: # task: split obs data (CMA) for distr. memeory run # namelist: fort.4 # input: cmat01_in.1 # output: cmat01.001 #------------------------------------------------------- if [ ${RUN_obsort} -eq 1 ] ; then banner OBSORT export NCPUS=1 \mv OBSARP cmat01_in.1 #prepare namelist case ${assimType} in 3d ) sed -e "s/NBPROC_VAL/1/" \ ${DIR_namelist}/obsort_3d.nml > fort.4 ;; 4d ) echo "${DIR_ref}/NAML_4d_obsort 1 $dat_obsort $h_obsort" ; ${DIR_namelist}/obsort_4d.nml 1 $dat_obsort $h_obsort ;; esac cat fort.4 #run obsort ln -s ${EXE_obsort} OBSORT OBSORT 1 > lola cat lola \ls -l rm OBSORT fort.4 cmat01_in.1 logfile.* mv cmat01.001 OBSARP [ ! -f OBSARP ] && exit fi #------------------------------------------------------- # 1.1.5. Prepare ODBTOOLS RUN #------------------------------------------------------- banner PREPARE_ODB EXE_odbtools=/u/ch/mxpt/mxpt001/arpege/france/dbl/exec/TRANSFODB #environmental variables export ODB_CMA=ECMASCR #create and prepare ECMASCR dir [ -d ${ODB_DATAPATH_ECMASCR} ] && \rm -r ${ODB_DATAPATH_ECMASCR} \mkdir ${ODB_DATAPATH_ECMASCR} \cd ${ODB_DATAPATH_ECMASCR} FILE_ioassign=${ODB_DATAPATH_ECMASCR}/ioassign cat ${ODB_SYS}/ECMASCR/ECMASCR.IOASSIGN > ${FILE_ioassign} cat ${ODB_SYS}/ECMA/ECMA.IOASSIGN >> ${FILE_ioassign} export IOASSIGN=${FILE_ioassign} #create ECMA dir [ -d ${ODB_DATAPATH_ECMA} ] && \rm -r ${ODB_DATAPATH_ECMA} \mkdir ${ODB_DATAPATH_ECMA} #------------------------------------------------------- # 1.1.6. ODBTOOLS (TO_ODB) # task: create ecmascr from cmafile #------------------------------------------------------- banner TO_ODB cd ${TMPDIR} echo "\n TO_ODB \n====================================\n" > log_exe echo "\n TO_ODB \n====================================\n" > log_err #run obdbtool ln -s ${EXE_odbtools} to_odb.x to_odb.x OBSARP >> log_exe 2>>log_err #Listing if [ $DOLIST_odbout = "TRUE" ] ; then echo "\n LISTING TO_ODB EXE \n ===============================\n" cat log_exe echo "_n LISTING TO_ODB ERR \n ===============================\n" cat log_err fi mv ECMASCR.dd ${ODB_DATAPATH_ECMASCR}/ mv ECMASCR.sch ${ODB_DATAPATH_ECMASCR}/ \ls -lR ${ODB_DATAPATH_ECMASCR} \ls -l $TMPDIR \rm to_odb.x $TMPDIR/OBSARP $TMPDIR/obs_boxes \rm log_exe log_err #------------------------------------------------------- # 1.1.7. ODBTOOLS (SHUFFLE) # task: create ecma from ecmascr dir. #------------------------------------------------------- banner SHUFFLE cd ${ODB_DATAPATH_ECMASCR} case ${assimType} in 3d) nbslot=1 ;; 4d) nbslot=7 ;; esac na=1 nb=1 left_margin=-180 right_margin=180 echo "\n SHUFFLE \n====================================" > log_exe echo "\n SHUFFLE \n====================================" > log_err #run odb shuffle ln -s ${EXE_odbtools} shuffle shuffle -iECMASCR -oECMA -a$na -b$nb -B${assimDate} -L$left_margin -R$right_margin -T${nbslot} >> log_exe 2>>log_err #listing if [ $DOLIST_odbout = "TRUE" ] ; then echo "\n LISTING TO_ODB EXE \n ===============================\n" cat log_exe echo "_n LISTING TO_ODB ERR \n ===============================\n" cat log_err fi mv ECMA.dd ${ODB_DATAPATH_ECMA}/ mv ECMA.sch ${ODB_DATAPATH_ECMA}/ \ls -l $TMPDIR \ls -lR ${ODB_DATAPATH_ECMASCR} \ls -lR ${ODB_DATAPATH_ECMA} \rm shuffle log_exe log_err ${FILE_ioassign} cd $TMPDIR \rm -r ${DIRNAME_odb_ecmascr} #save the created ecma if needed if [ $SAVE_globodb = "TRUE" ] ; then cd $TMPDIR cd ${DIRNAME_odb_ecma} tar -cvf ${DIRNAME_odb_ecma}.tar ./* ftput ${DIRNAME_odb_ecma}.tar ${DIR_saveGlobodb}/${DIRNAME_odb_ecma}.tar \rm ${DIRNAME_odb_ecma}.tar fi #end of obsob->odb #============================================================ # # 1.2. GET EXISTING GLOBAL ODB (WITH 1 POOL) # FROM OPER DIR # #============================================================ elif [ $SCRIPT_MODE -eq 2 ] ; then cd $TMPDIR ftget ${DIR_obs}/ecmascr.tar ecma.tar tar -xvf ecma.tar \ls -lR \rm ecma.tar cd ECMASCR mv ECMASCR.dd ECMA.dd mv ECMASCR.sch ECMA.sch cd .. \mv ECMASCR ${DIRNAME_odb_ecma} \ls -lR #end of get oper odb #================================================================ # # 1.3. GET EXISTING GLOBAL ODB (WITH 1 POOL) FROM PERSONAL DIR # #================================================================ elif [ $SCRIPT_MODE -eq 3 ] ; then cd $TMPDIR [ -d ${DIRNAME_odb_ecma} ] || mkdir ${DIRNAME_odb_ecma} cd ${DIRNAME_odb_ecma} ftget ${DIR_myGlobodb}/${DIRNAME_odb_ecma}.tar ${DIRNAME_odb_ecma}.tar tar -xvf ${DIRNAME_odb_ecma}.tar \rm ${DIRNAME_odb_ecma}.tar \ls -l #end of get personal global odb #================================================================ # # 1.4. GET EXISTING LAM ODB FROM PERSONAL DIR # #================================================================ elif [ $SCRIPT_MODE -eq 4 ] ; then cd $TMPDIR [ -d ${DIRNAME_odb_ecma} ] || mkdir ${DIRNAME_odb_ecma} cd ${DIRNAME_odb_ecma} ftget ${DIR_myLamodb}/ECMA_LAM.tar ${DIRNAME_odb_ecma}.tar tar -xvf ${DIRNAME_odb_ecma}.tar \rm ${DIRNAME_odb_ecma}.tar \ls -l #end of getting personal lam odb #================================================================ # # 1.5. GET EXISTING LAM ODB FROM PERSONAL DIR (directly for shuffle) # #================================================================ elif [ $SCRIPT_MODE -eq 5 ] ; then cd $TMPDIR [ -d ${DIRNAME_odb_ecmascr} ] || mkdir ${DIRNAME_odb_ecmascr} cd ${DIRNAME_odb_ecmascr} ftget ${DIR_myLamodb}/ECMA_LAM.tar ${DIRNAME_odb_ecmascr}.tar tar -xvf ${DIRNAME_odb_ecmascr}.tar \mv ECMA.dd ECMASCR.dd \mv ECMA.sch ECMASCR.sch \rm ${DIRNAME_odb_ecmascr}.tar \ls -l fi #end of getting personal lam odb #======================================================================= # # 2. PUT LAM-FLAG INTO GLOBAL ODB # input=output: $TMPDIR/ecma_${assimDate}.${assimType}${suff} # but output is renamed to: # $TMPDIR/ecmascr_${assimDate}.${assimType}${suff} # #======================================================================= if [ $SCRIPT_MODE -le 4 ] ; then banner LAM_FLAG #ODB settings export ODB_CMA=ECMA export IOASSIGN=${ODB_SYS}/ECMA/ECMA.IOASSIGN cd ${ODB_DATAPATH_ECMA} #get namelist sed -e "s/SYNOP_NEED/${SYNOP_NEED}/" \ -e "s/AIREP_NEED/${AIREP_NEED}/" \ -e "s/SATOB_NEED/${SATOB_NEED}/" \ -e "s/DRIBU_NEED/${DRIBU_NEED}/" \ -e "s/TEMP_NEED/${TEMP_NEED}/" \ -e "s/PILOT_NEED/${PILOT_NEED}/" \ -e "s/SATEM_NEED/${SATEM_NEED}/" \ ${DIR_namelist}/lamflag_odb.nml > NAMELIST cat NAMELIST #get and run lamflag_odb EXE_lamflag_odb=/cnrm2_a/mrpm/mrpm624/exe/cy24t1/lamflag_odb.24t1_op1.04 ftget $EXE_lamflag_odb ${TMPDIR}/LAMFLAG_ODB chmod 755 ${TMPDIR}/LAMFLAG_ODB ${TMPDIR}/LAMFLAG_ODB 1>List_exe 2>List_err \ls -l $TMPDIR cat List_exe if [ $DOLIST_odbout = "TRUE" ] ; then cat List_err fi \ls -lR ${ODB_DATAPATH_ECMA} \rm ${TMPDIR}/LAMFLAG_ODB \rm List_exe List_err NAMELIST # Rename ecma odb to ecmascr [ -d ${ODB_DATAPATH_ECMASCR} ] && rm -r ${ODB_DATAPATH_ECMASCR} mv ${ODB_DATAPATH_ECMA} ${ODB_DATAPATH_ECMASCR} cd ${ODB_DATAPATH_ECMASCR} mv ECMA.dd ECMASCR.dd mv ECMA.sch ECMASCR.sch fi #end of lam data selection #=================================================================== # # 3. SELECT GLOBAL-ODB DATA INTO LAM-ODB # input : $TMPDIR/ecmascr_${assimDate}.${assimType}${suff} # output: $TMPDIR/ecma_${assimDate}.${assimType}${suff} # #=================================================================== #------------------------------------------------------- # Check number of pools #------------------------------------------------------- np_init=`head -5 ${ODB_DATAPATH_ECMASCR}/ECMASCR.dd | tail -1` na=$np_init # indique le nb de pool initial let zjedi=${NBPROC}%${na} if [ $zjedi -ne 0 ] ; then echo "ERROR!!!" echo "Shuffle: inconsistency in the number of pools!!" echo " input pool nb: " $na echo " output pool nb: " $NBPROC exit fi if [ $na -gt $NBPROC ] ; then echo "ERROR!!!" echo "Shuffle: inp pool nb > output pool nb!!" echo " input pool nb: " $na echo " output pool nb: " $NBPROC exit fi let nb=${NBPROC}/${na} #------------------------------------------------ # If input LAM already exits and it has the same # pool nb as the output, only a renaming will be # done #------------------------------------------------ if [ $SCRIPT_MODE -eq 5 -a $nb -eq 1 ] ; then cd $TMPDIR mv ${DIRNAME_odb_ecmascr} ${DIRNAME_odb_ecma} cd ${DIRNAME_odb_ecma} \mv ECMASCR.dd ECMA.dd \mv ECMASCR.sch ECMA.sch #----------------------------------------------- # Otherwise shuffle will be run #---------------------------------------------- else # export VPP_SIGNAL=4 ODB_TRACE_PROC=-1 export ODB_TRACE_FILE=List_odb #EXE_shuffle=${WORKDIR}/EXEC/transfodb.${cycle}${version}${bf}${numero} EXE_shuffle=/cnrm2/mrpa/mrpa660/EXEC_usuel/transfodb.24t1_op1.04.red FILE_ioassign=${ODB_DATAPATH_ECMASCR}/ioassign cat ${ODB_SYS}/ECMASCR/ECMASCR.IOASSIGN > ${FILE_ioassign} cat ${ODB_SYS}/ECMA/ECMA.IOASSIGN >> ${FILE_ioassign} export IOASSIGN=${FILE_ioassign} #create ECMA dir [ -d ${ODB_DATAPATH_ECMA} ] && \rm -r ${ODB_DATAPATH_ECMA} \mkdir ${ODB_DATAPATH_ECMA} #Run SHUFFLE cd ${ODB_DATAPATH_ECMASCR} case ${assimType} in 3d) nbslot=1 ;; 4d) nbslot=7 ;; esac left_margin=-180 right_margin=180 rm shuffle 2>/dev/null ftget ${EXE_shuffle} shuffle chmod 755 shuffle shuffle -iECMASCR -oECMA -a$na -b$nb -B${assimDate} -L$left_margin -R$right_margin -T${nbslot} 1>List_exe 2>List_err \rm shuffle mv ECMA.* ${ODB_DATAPATH_ECMA} if [ $DOLIST_odbout = "TRUE" ] ; then echo "\n LISTING " cat List_exe cat List_err fi \rm List_exe ioassign fi #====================================== # 4. Save the created lamodb if needed #====================================== if [ SAVE_lamodb = "TRUE" ] ; then cd $TMPDIR cd ${DIRNAME_odb_ecma} tar -cvf ECMA_LAM.tar ./* ftput ECMA_LAM.tar ${DIR_saveLamodb}/ECMA_LAM.tar \rm ECMA_LAM.tar fi #======================================= # 5. Put the created lamodb into workdir #======================================= cd $TMPDIR [ -d ${WORKDIR}/DATA/${expName}/${DIRNAME_odb_ecma} ] && rm -r ${WORKDIR}/DATA/${expName}/${DIRNAME_odb_ecma} mkdir -p ${WORKDIR}/DATA/${expName}/${DIRNAME_odb_ecma} cp -R ${DIRNAME_odb_ecma}/* ${WORKDIR}/DATA/${expName}/${DIRNAME_odb_ecma}/ ls -l ${WORKDIR}/DATA/${expName}/${DIRNAME_odb_ecma}/ #===================================================== # relance automatique #===================================================== exit