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: