Ingos Page
Show File [ analyse_eddies.sh : text/x-shellscript ] ...
    1: #!/bin/bash
    2: #
    3: # Auswertung der Zirkulation auf dem Aquaplaneten mit PUMA
    4: # im Vergleich mit der Reanalyse
    5: # I.Kirchner, Nov/2019
    6: # Version 25/Nov/2019
    7: 
    8: # ==============================================================================
    9: # (A) Vorbereitung der Arbeitsumgebung
   10: #
   11: echo "Starte Auswertung ...."
   12: echo
   13: 
   14: # Einbinden der notwendigen Module
   15: export MODULE_VERSION=4.1.2
   16: export MODULEPATH=/net/opt/system/modules/modulefiles_ifm_stretch:\
   17: /net/opt/system/modules/$MODULE_VERSION/modulefiles
   18: . /net/opt/system/modules/4.1.2/init/profile.sh
   19: module load cdo/1.9.6
   20: 
   21: # dieses Plotprogramm wird verwendet
   22: PE=/daten/vast/arch/vast-git/vastnet/plot_engine/bin/plot_engine
   23: echo "... use PlotEngine :: $(${PE} --version)"
   24: 
   25: # ==============================================================================
   26: # (B) Definition aller notwendigen Shell-Funktionen
   27: 
   28: # erstes Jahr wird nicht mit benutzt
   29: SelTime(){
   30:     INP=${1}
   31:     OUT=${2}
   32:     SYR=${3:-1}
   33:     YEARS='-selyear'
   34:     FIRST=no
   35:     for YY in $(cdo -s -showyear $INP)
   36:     do
   37:         case ${FIRST} in
   38:             no )[ $YY -gt $SYR ] && FIRST=yes
   39:                 ;;
   40:             * ) YEARS="${YEARS},${YY}" ;;
   41:         esac
   42:     done
   43:     cdo -s ${YEARS} ${INP} ${OUT} && echo "... select years OK"
   44: }
   45: 
   46: SelTimeDJF(){
   47:     INP=${1}
   48:     OUT=${2}
   49:     SYR=${3:-1}
   50:     YEARS='-selyear'
   51:     FIRST=no
   52:     for YY in $(cdo -s -showyear $INP)
   53:     do
   54:         case ${FIRST} in
   55:             no )[ $YY -gt $SYR ] && FIRST=yes
   56:                 ;;
   57:             * ) YEARS="${YEARS},${YY}" ;;
   58:         esac
   59:     done
   60:     cdo -s -selmon,12,1,2 ${YEARS} ${INP} ${OUT} && echo "... select years OK"
   61: }
   62: 
   63: # Aufspaltung in Grundzustand und Eddies
   64: SplitCirc(){
   65:     FILE=${1}
   66:     RES=${2:-split}
   67:     # speichere Gitterinformation
   68:     cdo -s -griddes ${FILE} > $$.gitter
   69:     cdo -f nc4 -s -zonmean ${FILE} ${RES}_zm && echo '... zonalmean OK'
   70:     cdo -f nc4 -s -sub     ${FILE} -enlarge,$$.gitter ${RES}_zm ${RES}_ed && \
   71:         echo '... eddies OK'
   72:     rm -f $$.gitter
   73: }
   74: # Renoldsche Zerlegung in alle 4 Komponenten
   75: SplitCirc4Terms(){
   76:     FILE=${1}
   77:     RES=${2:-split}
   78:     # speichere Gitterinformation
   79:     cdo -s -griddes ${FILE} > $$.gitter
   80:     cdo -f nc4 -s -zonmean ${FILE} $$.zm && echo '... zonalmean OK'
   81:     cdo -f nc4 -s -sub     ${FILE} -enlarge,$$.gitter $$.zm $$.ed && \
   82:         echo '... eddies OK'
   83:     # Analyse des Grundzustandes
   84:     cdo -f nc4 -s -timmean $$.zm ${RES}_zmtm && echo '... zm tmean OK'
   85:     cdo -f nc4 -s -timstd  $$.zm ${RES}_zmts && echo '... zm tstd OK'
   86:     cdo -f nc4 -s -sub $$.zm ${RES}_zmtm ${RES}_zmta && echo '.. zm tano OK'
   87:     # Analyse der Eddies
   88:     cdo -f nc4 -s -timmean $$.ed ${RES}_edtm && echo '.. ed tmean OK'
   89:     cdo -f nc4 -s -timstd  $$.ed ${RES}_edts && echo '.. ed tstd OK'
   90:     cdo -f nc4 -s -sub $$.ed ${RES}_edtm ${RES}_edta && echo '... ed tano OK'
   91:     rm -f $$.gitter $$.zm $$.ed
   92: }
   93: 
   94: 
   95: # Abschätzung der kinetischen Energie
   96: KinEn(){
   97:     U=${1}
   98:     V=${2}
   99:     RES=${3:-kinen}
  100:     cdo -s -divc,2.0 -add -mul $U $U -mul $V $V $RES && \
  101:         echo '... kinetische Energie OK'
  102: }
  103: 
  104: # Abschätzung der meridionalen Transporte
  105: MerTran(){
  106:     V=${1}
  107:     X=${2}
  108:     RES=${3:-mt}
  109:     cdo -s -mul $V $X $RES && echo '... meridionaler Transport OK'
  110: }
  111: 
  112: # Ansteuerung der einzelnen Arbeitsschritte
  113: WorkFlowSteps(){
  114:     while [ "$1" ]
  115:     do
  116:         echo "Running Workflowstep ... $1"
  117:         echo
  118:         case "$1" in
  119:             # im Schritt 2 muss zwischen Experimentdaten und Reanalysen unterschieden werden
  120:             # bei Experimentdaten wird das erste Experimentjahr nicht verwendet
  121:             1 )
  122:                 # Schritt 1 : Zeitraum auswählen, notwenig bei Modelldaten
  123:                 SelTime ${DATA_TA} $$.ta $SKIP_YEARS
  124:                 SelTime ${DATA_UA} $$.ua $SKIP_YEARS
  125:                 SelTime ${DATA_VA} $$.va $SKIP_YEARS
  126:                 ;;
  127:             1e )
  128:                 # Schritt 1 : Zeitraum auswählen, notwenig bei Modelldaten
  129:                 SelTimeDJF ${DATA_TA} $$.ta $SKIP_YEARS
  130:                 SelTimeDJF ${DATA_UA} $$.ua $SKIP_YEARS
  131:                 SelTimeDJF ${DATA_VA} $$.va $SKIP_YEARS
  132:                 ;;
  133:             2a)
  134:                 # Schritt 2 : Aufspaltung der Basisdaten in Zonalmittel und Eddies
  135:                 SplitCirc $$.ta ${DATA}ta
  136:                 SplitCirc $$.ua ${DATA}ua
  137:                 SplitCirc $$.va ${DATA}va
  138:                 rm -f $$.[tuv]a
  139:                 ;;
  140:             2b )
  141:                 # Schritt 2 : Benutze die direkten Eingangsdaten zur Aufspaltung
  142:                 SplitCirc ${DATA_TA} ${DATA}ta
  143:                 SplitCirc ${DATA_UA} ${DATA}ua
  144:                 SplitCirc ${DATA_VA} ${DATA}va
  145:                 ;;
  146:             2c)
  147:                 # Schritt 2 : Aufspaltung der Basisdaten in Zonalmittel und Eddies
  148:                 SplitCirc4Terms $$.ta ${DATA}ta
  149:                 SplitCirc4Terms $$.ua ${DATA}ua
  150:                 SplitCirc4Terms $$.va ${DATA}va
  151:                 rm -f $$.[tuv]a
  152:                 ;;
  153:             2d )
  154:                 # Schritt 2 : Benutze die direkten Eingangsdaten zur Aufspaltung
  155:                 SplitCirc4Terms ${DATA_TA} ${DATA}ta
  156:                 SplitCirc4Terms ${DATA_UA} ${DATA}ua
  157:                 SplitCirc4Terms ${DATA_VA} ${DATA}va
  158:                 ;;
  159: 
  160:             # die folgenden Schritte sind vom Datensatz unabhängig
  161:             3 )
  162:                 # Schritt 3 : Berechne kombinierte Größen
  163:                 for TYPE in zm ed
  164:                 do
  165:                     echo "... Berechnung fuer $TYPE"
  166:                     KinEn   ${DATA}ua_${TYPE} ${DATA}va_${TYPE} ${DATA}kinen_${TYPE}
  167:                     MerTran ${DATA}va_${TYPE} ${DATA}ta_${TYPE} ${DATA}mt_VT_${TYPE}
  168:                     MerTran ${DATA}va_${TYPE} ${DATA}ua_${TYPE} ${DATA}mt_VU_${TYPE}
  169:                 done
  170:                 ;;
  171:             3c )
  172:                 # Schritt 3 : Berechne kombinierte Größen jetzt stationär/transient
  173:                 for TYPE in zmtm zmta edtm edta
  174:                 do
  175:                     echo "... Berechnung fuer $TYPE"
  176:                     KinEn   ${DATA}ua_${TYPE} ${DATA}va_${TYPE} ${DATA}kinen_${TYPE}
  177:                     MerTran ${DATA}va_${TYPE} ${DATA}ta_${TYPE} ${DATA}mt_VT_${TYPE}
  178:                     MerTran ${DATA}va_${TYPE} ${DATA}ua_${TYPE} ${DATA}mt_VU_${TYPE}
  179:                 done
  180:                 ;;
  181:             4 )
  182:                 # Schritt 4 : zeitliche Mittel bilden
  183:                 for FILE in ${DATA}kinen_?? ${DATA}mt_??_?? ${DATA}??_??
  184:                 do
  185:                     cdo -s timmean ${FILE} ${FILE}_mean && \
  186:                         echo "... Zeitmittel $FILE OK"
  187:                 done
  188:                 ;;
  189:             5 )
  190:                 # Schritt 5 : Zonalmittel der Eddies
  191:                 for FILE in ${DATA}*_ed_mean
  192:                 do
  193:                     cdo -s zonmean ${FILE} ${FILE}_zm && \
  194:                         echo "... Zonalmittel $FILE OK"
  195:                 done
  196:                 ;;
  197:             5c )
  198:                 # Schritt 5 : zeitliche und zonale Mittel der Eddies
  199:                 # Standardabweichung der transienten Anteile
  200:                 for FILE in \
  201:                     ${DATA}kinen_edta ${DATA}mt_VT_edta ${DATA}mt_VU_edta \
  202:                     ${DATA}kinen_zmta ${DATA}mt_VT_zmta ${DATA}mt_VU_zmta
  203:                 do
  204:                     cdo -s timmean ${FILE} ${FILE}_tm && echo "... Zeitmittel $FILE OK"
  205:                     cdo -s timstd  ${FILE} ${FILE}_ts && echo "... Varianz $FILE OK"
  206:                 done
  207:                 # Zonalmittel
  208:                 for FILE in \
  209:                     ${DATA}*_edtm    ${DATA}??_edts \
  210:                     ${DATA}*_edta_tm ${DATA}*_edta_ts
  211:                 do
  212:                     cdo -s zonmean ${FILE} ${FILE}_zm && \
  213:                         echo "... Zonalmittel $FILE OK"
  214:                 done
  215:                 ;;
  216:             # die folgenden Schritte erzeugen die Abbildungen
  217:             # es gibt zwei Arten :
  218:             #   long-lat Plots für 6 Schichten
  219:             #   lat-lev Plots
  220:             6 )
  221:                 # Schritt 6 : Plotten der Lon-Lat-Bilder
  222:                 PYCODE='--pycode main:cbar:l:True=pict:type:s:geomap=geomap:type:s:shaded='
  223:                 for FILE in ${DATA}*_ed_mean
  224:                 do
  225:                     for LEVEL in 100000 85000 50000 20000 10000 5000
  226:                     do
  227:                         PREF=$(echo $FILE | sed -e "s=${DATA}==")_${LEVEL}
  228:                         ADD_SPECI="data:levelidx:f:${LEVEL}="
  229:                         ${PE} -v 0 -W ${PYCODE}${ADD_SPECI}${DRAW_COAST} \
  230:                               -i ${FILE} -t "${LABEL} / $FILE" \
  231:                               -p plots_${LABEL}/${PREF} && \
  232:                             echo "... plotten $PREF OK"
  233:                     done
  234:                 done
  235:                 ;;
  236:             6c )
  237:                 # Schritt 6 : Plotten der Lon-Lat-Bilder
  238:                 PYCODE='--pycode main:cbar:l:True=pict:type:s:geomap=geomap:type:s:shaded='
  239:                 for FILE in ${DATA}*_edtm ${DATA}*_edta_tm ${DATA}*_edta_ts
  240:                 do
  241:                     for LEVEL in 100000 85000 50000 20000 10000 5000
  242:                     do
  243:                         PREF=$(echo $FILE | sed -e "s=${DATA}==")_${LEVEL}
  244:                         ADD_SPECI="data:levelidx:f:${LEVEL}="
  245:                         ${PE} -v 0 -W ${PYCODE}${ADD_SPECI}${DRAW_COAST} \
  246:                               -i ${FILE} -t "${LABEL} / $FILE" \
  247:                               -p plots_${LABEL}/${PREF} && \
  248:                             echo "... plotten $PREF OK"
  249:                     done
  250:                 done
  251:                 ;;
  252:             7 )
  253:                 # Schritt 7 : Plotten der Crosssections
  254:                 PYCODE='--pycode main:cbar:l:True=yaxis:log:l:True='
  255:                 for FILE in ${DATA}*_ed_mean_zm ${DATA}*_zm_mean
  256:                 do
  257:                     PREF=$(echo $FILE | sed -e "s=${DATA}==")
  258:                     ${PE} -v 0 -W ${PYCODE} -i ${FILE} \
  259:                           -t "${LABEL} / $FILE" \
  260:                           -p plots_${LABEL}/${PREF} && \
  261:                         echo "... plotten $PREF OK"
  262:                 done
  263:                 ;;
  264:             7c )
  265:                 # Schritt 7 : Plotten der Crosssections
  266:                 PYCODE='--pycode main:cbar:l:True=yaxis:log:l:True='
  267:                 for FILE in \
  268:                     ${DATA}*_zmtm ${DATA}??_zmts \
  269:                     ${DATA}*_????_zm ${DATA}*_????_tm_zm \
  270:                     ${DATA}*_zmta_tm
  271:                 do
  272:                     PREF=$(echo $FILE | sed -e "s=${DATA}==")
  273:                     ${PE} -v 0 -W ${PYCODE} -i ${FILE} \
  274:                           -t "${LABEL} / $FILE" \
  275:                           -p plots_${LABEL}/${PREF} && \
  276:                         echo "... plotten $PREF OK"
  277:                 done
  278:                 ;;
  279:         esac
  280:         shift
  281:     done
  282: }
  283: 
  284: # ==============================================================================
  285: # (C) Hauptprogrammteil
  286: 
  287: # die Daten müssen vorher bereitgestellt werden, es sind
  288: # Gitterpunktsfelder mit np320 und in N->S Ausrichtung notwendig
  289: # wegen der hohen räumllichen Auflösung werden vorerst
  290: # sets mit je 5 Wintern bearbeitet, das ergibt bereits
  291: # Dateigrößen von ca. 10 GB
  292: 
  293: # zusätzliche Funktionen für die Analyse der ERA5 Daten
  294: Era5Step1(){
  295:     for SET in 1 2 3 4
  296:     do
  297:         LABEL=set${SET}
  298: 
  299:         DATA=data_${LABEL}/${LABEL}.
  300:         mkdir -p data_${LABEL}
  301: 
  302:         DATA_TA=${ERA5_BASE}-ta-DAY/ta-set${SET}.nc
  303:         DATA_UA=${ERA5_BASE}-ua-DAY-dkrz/ua-set${SET}.nc
  304:         DATA_VA=${ERA5_BASE}-va-DAY-dkrz/va-set${SET}.nc
  305:         
  306:         WorkFlowSteps 2b 3
  307:     done
  308: }
  309: 
  310: Era5Step2(){
  311:     DATA=data_${LABEL}/${LABEL}.
  312:     mkdir -p data_${LABEL}
  313: 
  314:     for TYPE in kinen_ed kinen_zm mt_VT_ed mt_VT_zm mt_VU_ed mt_VU_zm \
  315:                          ta_ed ta_zm ua_ed ua_zm va_ed va_zm
  316:     do
  317:         cdo -s -divc,1715 -add \
  318:             -add \
  319:             -timsum data_set1/set1.${TYPE} -timsum data_set2/set2.${TYPE} \
  320:             -add \
  321:             -timsum data_set3/set3.${TYPE} -timsum data_set4/set4.${TYPE} \
  322:             ${DATA}${TYPE}_mean && echo "... $DATA  $TYPE ... OK"
  323:     done
  324: }
  325: 
  326: # ==============================================================================
  327: ERA5_BASE=/daten/erafive/work/ingokir/DatenDiagnoseKurs/CIRC-
  328: AnalyseEra5A(){
  329:     # ab hier folgt der Hauptprogrammteil für ERA5 Daten
  330:     
  331:     # erst die Zeitsegmente erstellen, dann eddies, dann zeitmittel
  332:     # zeitmittel zusammenfügen
  333:     # setweise analyse
  334:     
  335:     Era5Step1
  336:     
  337:     # jetzt sind die Sets zu mergen
  338:     LABEL=era5djf2
  339:     DATA=data_${LABEL}/${LABEL}.
  340:     Era5Step2
  341:     
  342:     # jetzt folgte der abschließende Teil der Analyse
  343:     DRAW_COAST='geomap:showcoast:l:True='
  344:     WorkFlowSteps 5 6 7
  345: }
  346: 
  347: AnalyseEra5B(){
  348:     # era5 mit kompletter Zeitserie
  349:     LABEL="era5_eddies"
  350:     DATA=data_${LABEL}/${LABEL}.
  351:     mkdir -p data_${LABEL}
  352:     
  353:     # die Pfade zu den Ausgangsdaten entsprechen der VAST Nomenklatur
  354:     DATA_TA=${ERA5_BASE}-ta-DAY/ta-djf-sn.nc
  355:     DATA_UA=${ERA5_BASE}-ua-DAY-dkrz/ua-djf-sn.nc
  356:     DATA_VA=${ERA5_BASE}-va-DAY-dkrz/va-djf-sn.nc
  357:     DRAW_COAST='geomap:showcoast:l:True='
  358:     WorkFlowSteps 2d 3c 5c 6c 7c
  359: }
  360: #AnalyseEra5B
  361: 
  362: # ==============================================================================
  363: # Hauptprogrammteil für PUMA
  364: 
  365: # jetzt werden die PUMA Experimente ausgewertet
  366: VAST_BASE=/daten/vast/work/tmp/daemon-wekuw.poincare.vast/finished
  367: VAST_INFIX=ANALYSIS/daily/3d
  368: 
  369: AnalysePUMA(){
  370:     # die benutzen EXP_IDs sind abhängig von dem jeweiligen VAST Experiment
  371:     for EXP in ref b5l b10l
  372:     do
  373:         LABEL="puma_eddies_$EXP"
  374:         echo "... PUMA Experiment $LABEL ..."
  375:         case $EXP in
  376:             ref  ) EXP_ID=20191122-01574408380117070185 ;;
  377:             b5l  ) EXP_ID=20191124-01574587956136105007 ;;
  378:             b10l ) EXP_ID=20191124-01574588023102073133 ;;
  379:         esac
  380:         EXP_BASE=${VAST_BASE}/${EXP_ID}/${VAST_INFIX}
  381:     
  382:         DATA=data_${LABEL}/${LABEL}.
  383:         mkdir -p data_${LABEL}
  384:     
  385:         # die Pfade zu den Ausgangsdaten entsprechen der VAST Nomenklatur
  386:         DATA_TA=${EXP_BASE}/code_130
  387:         DATA_UA=${EXP_BASE}/code_131
  388:         DATA_VA=${EXP_BASE}/code_132
  389:         DRAW_COAST=
  390:         WorkFlowSteps 1 2c 3c 5c 6c 7c
  391:     done
  392: }
  393: #AnalysePUMA
  394: 
  395: AnalyseOthers(){
  396:     # die benutzen EXP_IDs sind abhängig von dem jeweiligen VAST Experiment
  397:     for EXP in plasim e5csst e5amip mpiesm
  398:     do
  399:         LABEL="others_eddies_$EXP"
  400:         echo "... Other Experiment $LABEL ..."
  401:         case $EXP in
  402:             plasim  ) EXP_ID=20191124-01574621669037020164
  403:                       VAST_INFIX=ANALYSIS/atm/daily/3d
  404:                       SKIP_YEARS=10
  405:                       ;;
  406:             e5csst  ) EXP_ID=20191124-01574621795153164083
  407:                       VAST_INFIX=ANALYSIS/daily/3d
  408:                       SKIP_YEARS=3
  409:                       ;;
  410:             e5amip  ) EXP_ID=20191124-01574622099110199152
  411:                       VAST_INFIX=ANALYSIS/daily/3d
  412:                       SKIP_YEARS=3
  413:                       ;;
  414:             mpiesm )  SKIP_YEARS=2
  415:                       ;;
  416:         esac
  417:         case $EXP in
  418:             mpiesm )   EXP_BASE=/home/ingokir/work/analyse-kurs/bsp-circulation-puma-era5/input_mpiesm ;;
  419:             * )        EXP_BASE=${VAST_BASE}/${EXP_ID}/${VAST_INFIX} ;;
  420:         esac
  421: 
  422:         DATA=data_${LABEL}/${LABEL}.
  423:         mkdir -p data_${LABEL}
  424:     
  425:         # die Pfade zu den Ausgangsdaten entsprechen der VAST Nomenklatur
  426:         DATA_TA=${EXP_BASE}/code_130
  427:         DATA_UA=${EXP_BASE}/code_131
  428:         DATA_VA=${EXP_BASE}/code_132
  429:         DRAW_COAST='geomap:showcoast:l:True='
  430:         WorkFlowSteps 1e 2c 3c 5c 6c 7c
  431:     done
  432: }
  433: #AnalyseOthers
  434: 
  435: # ==============================================================================
  436: # EndOfScript
  437: 

Ansprechpartner : Dr. I. Kirchner [e-mail] IfM Zi. 184
Lehre und Projekte / Homepage