#!/bin/bash -l
# OPE1 — chuỗi xử lý MỘT ngày khởi tạo, sao đúng logic của /home/tanpv/Data/QG.25.196/PrePro.
#
# Bảy nhóm được xử lý rồi ghép thành EC_all_<date>.nc với đủ 40 biến. Mọi bước, mọi
# hệ số đổi đơn vị và mọi phép dịch thời gian đều lấy nguyên từ các script gốc; chỗ
# duy nhất khác là vòng lặp 20 năm được thay bằng một ngày truyền vào.
#
# Các quy ước thời gian, ghi lại vì chúng không hiển nhiên:
#   * Srf_daily, H_thick, IVT, T_lapse_rate, W_plev  ->  shifttime +24 giờ
#   * Tx_tm                                          ->  shifttime +9 giờ
#   * Srf_24hour                                     ->  KHÔNG dịch (đã lấy hiệu
#     hai bước liên tiếp nên nhãn thời gian đã đúng ngày)
#   * tất cả đều invertlat và cắt còn 46 bước
#
# Cách dùng:  ./ope1_process.sh 2026-08-29 [gốc_EC] [gốc_ra]

set -euo pipefail
INIT="${1:?cần ngày khởi tạo YYYY-MM-DD}"
SRC="${2:-/home/tanpv/Data/QG.25.196/EC_RT}"
DST="${3:-/home/tanpv/Data/QG.25.196/EC_RT_Proc}"
YEAR="${INIT%%-*}"
PRE=/home/tanpv/Data/QG.25.196/PrePro
export PATH=/home/hapt/miniconda3/bin:/work/apps/intel_2016/nco/4.6.1/bin:$PATH
PY=/home/tanpv/.conda/envs/ehd/bin/python
W=$(mktemp -d); trap 'rm -rf "$W"' EXIT
for d in Srf_daily_ave Srf_24hour Tx_tm H_thick IVT T_lapse_rate W_plev Combined; do
    mkdir -p "${DST}/${d}/${YEAR}"
done
IN () { echo "${SRC}/$1/${YEAR}/$2_${INIT}.nc"; }
OUT () { echo "${DST}/$1/${YEAR}/$2_${INIT}.nc"; }

echo "[1/8] Srf_daily_ave"
F=$(IN Srf_daily_ave Srf_daily_cf)
cdo -s -L -selvar,t2m,d2m,skt,st20,st100 "$F" "$W/a.nc"
cdo -s -L -selvar,cape,tcw,tcc,sm20,sm100 "$F" "$W/b.nc"
cdo -s -L -b F32 -expr,'t2m=t2m-273.15;d2m=d2m-273.15;skt=skt-273.15;st20=st20-273.15;st100=st100-273.15;dtd2m=t2m-d2m' "$W/a.nc" "$W/a2.nc"
cdo -s -L -b F32 -expr,'cape=cape*1.0;tcw=tcw*1.0;tcc=tcc*1.0;sm20=sm20*1.0;sm100=sm100*1.0' "$W/b.nc" "$W/b2.nc"
cdo -s -O merge "$W/b2.nc" "$W/a2.nc" "$W/m.nc"
ncatted -a units,t2m,m,c,"C" -a units,d2m,m,c,"C" -a units,skt,m,c,"C" -a units,st20,m,c,"C" -a units,st100,m,c,"C" -a units,dtd2m,m,c,"C" "$W/m.nc"
cdo -s invertlat "$W/m.nc" "$W/i.nc"
cdo -s fillmiss "$W/i.nc" "$W/f.nc"
cdo -s -O shifttime,24hour "$W/f.nc" "$(OUT Srf_daily_ave Srf_daily_cf)"

echo "[2/8] Srf_24hour"
F=$(IN Srf_24hour Srf_24hour_cf)
cdo -s -L -selvar,sshf,slhf,ssrd,strd,ssr,str,ttr,cp,tp "$F" "$W/ac.nc"
cdo -s -f nc -b F32 sub -seltimestep,2/47 "$W/ac.nc" -seltimestep,1/46 "$W/ac.nc" "$W/acd.nc"
cdo -s -f nc -expr,'sshf=-sshf/86400; slhf=-slhf/86400; ssrd=ssrd/86400; strd=strd/86400; ssr=ssr/86400; str=str/86400; ttr=-ttr/86400; cp=cp; tp=tp' "$W/acd.nc" "$W/u.nc"
cdo -s -f nc -expr,'sshf=sshf; slhf=slhf; ssrd=ssrd; strd=strd; ssr=ssr; str=str; ttr=ttr; cp=cp; tp=tp; srn=ssr+str; bowen=sshf/slhf' "$W/u.nc" "$W/fx.nc"
cdo -s -L -selvar,msl,u10,v10 "$F" "$W/inst.nc"
cdo -s -L -b F32 -expr,'msl=msl/100;u10=u10;v10=v10;uv10=sqrt(u10*u10+v10*v10)' "$W/inst.nc" "$W/inst2.nc"
cdo -s -O seltimestep,1/46 "$W/inst2.nc" "$W/inst3.nc"
cdo -s -O merge "$W/fx.nc" "$W/inst3.nc" "$W/mg.nc"
ncatted -a units,sshf,m,c,"W m-2" -a units,slhf,m,c,"W m-2" -a units,ssrd,m,c,"W m-2" -a units,strd,m,c,"W m-2" -a units,ssr,m,c,"W m-2" "$W/mg.nc"
ncatted -a units,str,m,c,"W m-2" -a units,ttr,m,c,"W m-2" -a units,cp,m,c,"mm" -a units,tp,m,c,"mm" -a units,msl,m,c,"hPa" "$W/mg.nc"
ncatted -a units,srn,m,c,"W m-2" -a units,bowen,m,c,"-" "$W/mg.nc"
cdo -s invertlat "$W/mg.nc" "$(OUT Srf_24hour Srf_24hour_cf)"

echo "[3/8] Tx_tm"
F=$(IN Tx_tm Tx_tm_6hours_cf)
cdo -s -O timselmax,4 -selvar,mx2t6 "$F" "$W/tx.nc"
cdo -s -O timselmin,4 -selvar,mn2t6 "$F" "$W/tm.nc"
cdo -s -O merge "$W/tx.nc" "$W/tm.nc" "$W/txm.nc"
cdo -s -O expr,'mx2t6=mx2t6-273.15; mn2t6=mn2t6-273.15' "$W/txm.nc" "$W/txm2.nc"
ncatted -a units,mx2t6,m,c,"C" -a units,mn2t6,m,c,"C" "$W/txm2.nc"
cdo -s -O shifttime,9hour "$W/txm2.nc" "$W/txm3.nc"
cdo -s -O invertlat "$W/txm3.nc" "$(OUT Tx_tm Tx_tm_cf)"

echo "[4/8] H_thick"
sed -e "s|Inp_file|$(IN H_plev H_plev_cf)|g" -e "s|Out_file|$W/h.nc|g" \
    "$PRE/calc_H_thickness.py" > "$W/calc_H.py"
$PY "$W/calc_H.py" > /dev/null
cdo -s invertlat "$W/h.nc" "$W/h2.nc"
cdo -s -O shifttime,24hour "$W/h2.nc" "$W/h3.nc"
cdo -s -O seltimestep,1/46 "$W/h3.nc" "$(OUT H_thick H_thick)"

echo "[5/8] IVT"
sed -e "s|Inp_file|$(IN QUV_plev pquv_cf)|g" -e "s|Out_file|$W/iv.nc|g" \
    "$PRE/calc_IVT.py" > "$W/calc_IVT.py"
$PY "$W/calc_IVT.py" > /dev/null
cdo -s -O invertlat "$W/iv.nc" "$W/iv2.nc"
cdo -s -O shifttime,24hour "$W/iv2.nc" "$W/iv3.nc"
cdo -s -O seltimestep,1/46 "$W/iv3.nc" "$(OUT IVT ivt)"

echo "[6/8] T_lapse_rate"
F=$(IN T_plev T_plev_cf)
mk () {  # mk <trên> <dưới> <tên biến> <ra>
    cdo -s -O -b F32 -sub -sellevel,$1 -selname,t "$F" -sellevel,$2 -selname,t "$F" "$W/t4.nc"
    cdo -s chname,t,$3 "$W/t4.nc" "$W/t5.nc"
    ncwa -O -a level "$W/t5.nc" "$W/t4.nc"
    ncks -O -x -v level "$W/t4.nc" "$4"
}
mk 850 500 dt_850_500 "$W/d1.nc"
mk 925 850 dt_925_850 "$W/d2.nc"
mk 700 500 dt_700_500 "$W/d3.nc"
cdo -s -O merge "$W/d1.nc" "$W/d2.nc" "$W/d3.nc" "$W/dm.nc"
cdo -s -O seltimestep,1/46 "$W/dm.nc" "$W/dm2.nc"
cdo -s -O shifttime,24hour "$W/dm2.nc" "$W/dm3.nc"
cdo -s -O invertlat "$W/dm3.nc" "$(OUT T_lapse_rate T_lapse_rate)"
ncatted -a units,dt_850_500,m,c,"C" -a units,dt_925_850,m,c,"C" -a units,dt_700_500,m,c,"C" "$(OUT T_lapse_rate T_lapse_rate)"

echo "[7/8] W_plev"
cdo -s -O -b F32 invertlat "$(IN W_plev W_plev_cf)" "$W/w1.nc"
cdo -s -O seltimestep,1/46 "$W/w1.nc" "$W/w2.nc"
cdo -s -O shifttime,24hour "$W/w2.nc" "$(OUT W_plev W_plev_cf)"

echo "[8/8] ghép thành EC_all"
ALL="${DST}/Combined/${YEAR}/EC_all_${INIT}.nc"
cdo -s -O merge \
    "$(OUT Srf_daily_ave Srf_daily_cf)" "$(OUT Srf_24hour Srf_24hour_cf)" \
    "$(OUT H_thick H_thick)" "$(OUT IVT ivt)" \
    "$(OUT T_lapse_rate T_lapse_rate)" "$(OUT W_plev W_plev_cf)" \
    "$(OUT Tx_tm Tx_tm_cf)" "$ALL"
echo "[xong] $ALL  ntime=$(cdo -s ntime "$ALL")  nvar=$(cdo -s showname "$ALL" | wc -w)"
