wiki:IPSLCM6/calving

Version 9 (modified by oboucher, 3 years ago) (diff)

--

Conservation de l'évaporation : où est l'erreur avec le VLR ?

Exemple avec le MR025 - script cdo

Expérience : /ccc/cont003/home/gencmip6/oboucher/IPSLCM6.2/modipsl/config/IPSLCM6/CM61-MR025-pd-04

Sorties : /ccc/scratch/cont003/gencmip6/oboucher/IGCM_OUT/IPSLCM6/TEST/pdControl/CM61-MR025-pd-04/

Détail : 1 mois de simu

Script cdo : on pondère par maskutil_T (eORCA025.1) et l'aire des mailles pour l'océan. On pondère par l'aire des mailles et pourc_oce+pourc_sic pour l'atmosphère (moyenne mensuelle mais la somme des deux est un invariant).

exp="CM61-MR025-pd-04"
yr1=1850
yr2=1850
dir=/ccc/scratch/cont003/gencmip6/oboucher/IGCM_OUT/IPSLCM6/TEST/pdControl/${exp}
fileatm=${dir}/ATM/Output/MO/${exp}_${yr1}0101_${yr2}0131_1M_histmth.nc
fileevap1=${dir}/CPL/Output/MO/${exp}_${yr1}0101_${yr2}0131_COTOTEVA.nc
fileevap2=${dir}/CPL/Output/MO/${exp}_${yr1}0101_${yr2}0131_OTotEvap.nc
filerain1=${dir}/CPL/Output/MO/${exp}_${yr1}0101_${yr2}0131_COTOTRAI.nc
filerain2=${dir}/CPL/Output/MO/${exp}_${yr1}0101_${yr2}0131_OTotRain.nc
filesnow1=${dir}/CPL/Output/MO/${exp}_${yr1}0101_${yr2}0131_COTOTSNO.nc
filesnow2=${dir}/CPL/Output/MO/${exp}_${yr1}0101_${yr2}0131_OTotSnow.nc
fileoce=${dir}/OCE/Output/MO/${exp}_${yr1}0101_${yr2}0131_1M_grid_T.nc
maskoce=/ccc/work/cont003/igcmg/igcmg/IGCM/OCE/NEMO/eORCA025.1/eORCA025.1_coordinates_mask.nc

sumevap1=`cdo outputf,%12.10g,10 -divc,1.e9 -fldsum -mul -seltimestep,1/10 -selname,COTOTEVA ${fileevap1} -seltimestep,1 -expr,'toto=aire/100.*(pourc_oce+pourc_sic)' ${fileatm}`
sumevap2=`cdo outputf,%12.10g,10 -divc,1.e9 -fldsum -mul -mul -seltimestep,1/10 -selname,OTotEvap ${fileevap2} -selvar,maskutil_T ${maskoce} -gridarea ${fileoce}`
sumrain1=`cdo outputf,%12.10g,10 -divc,1.e9 -fldsum -mul -seltimestep,1/10 -selname,COTOTRAI ${filerain1} -seltimestep,1 -expr,'toto=aire/100.*(pourc_oce+pourc_sic)' ${fileatm}`
sumrain2=`cdo outputf,%12.10g,10 -divc,1.e9 -fldsum -mul -mul -seltimestep,1/10 -selname,OTotRain ${filerain2} -selvar,maskutil_T ${maskoce} -gridarea ${fileoce}`
sumsnow1=`cdo outputf,%12.10g,10 -divc,1.e9 -fldsum -mul -seltimestep,1/10 -selname,COTOTSNO ${filesnow1} -seltimestep,1 -expr,'toto=aire/100.*(pourc_oce+pourc_sic)' ${fileatm}`
sumsnow2=`cdo outputf,%12.10g,10 -divc,1.e9 -fldsum -mul -mul -seltimestep,1/10 -selname,OTotSnow ${filesnow2} -selvar,maskutil_T ${maskoce} -gridarea ${fileoce}`

echo 'evap in=' $sumevap1
echo 'evap out=' $sumevap2
echo 'rain in=' $sumrain1
echo 'rain out=' $sumrain2
echo 'snow in=' $sumsnow1
echo 'snow out=' $sumsnow2

Résultats :

evap in= 16.58377264 16.5842436 16.73348733 16.70182978 16.66627324 16.63719809 16.59929387 16.55878592 16.52697635 16.4860888
evap out= 16.58377268 16.58424364 16.73348737 16.70182981 16.66627328 16.63719813 16.59929391 16.55878595 16.52697638 16.48608884
rain in= 12.76418216 11.79569265 11.90206466 12.29730812 12.41094174 12.47357032 12.53198387 12.55976865 12.5649098 12.58444113
rain out= 12.76418217 11.79569266 11.90206466 12.29730811 12.41094173 12.47357031 12.53198387 12.55976866 12.56490981 12.58444114
snow in= 0.6307305996 0.613739933 0.6188579544 0.6443643258 0.6604737915 0.6693078788 0.6729603416 0.6815849762 0.684608096 0.6879445765
snow out= 0.6307305919 0.6137399242 0.6188579491 0.6443643249 0.6604737919 0.6693078792 0.672960342 0.6815849766 0.6846080966 0.6879445774

Les écarts sont très faibles. Attention ça ne marche pas si on prend le tmaskutil de eORCA025.4.

Exemple avec le VLR - script python

Expérience : /ccc/work/cont003/ra5424/p25khod/IPSLCM6.5_work_15DEC/modipsl/config/IPSLCM6/CM65-VLR-pd-tn-01-test

Fichier poids: /ccc/work/cont003/gencmip6/lebasn/INPUT/VLR/IPSLCM6_9695_ORCA2.3/grids_ORCA2.3xLMD9695_MOSAIX_v1.nc

Sorties : /ccc/store/cont003/gencmip6/p25khod/IGCM_OUT/IPSLCM6/DEVT/pdControl/CM65-VLR-pd-tn-01-test

Détails : 12 mois de simu, 18500101_18501231, cpl_old_calving=no, bug fixé dans LMDZ pour le calcul du flux cumulé par bande de latitude

Problème : le flux de évap qui repart du coupleur diffère un peu trop du flux de évap qui arrive, alors que les flux de pluie et neige sont très bien conservés

Fichier d'aires NEMO : ceux du fichier de sortie grid_T de NEMO

Fichier masque NEMO : /ccc/cont003/home/lmd/oboucher/BILAN_EAU/maskutil_T.nc

Diagnostic 1 - script python

import xarray as xr
import numpy as np

exp="CM65-VLR-pd-tn-01-test"
dir="/ccc/store/cont003/gencmip6/p25khod/IGCM_OUT/IPSLCM6/DEVT/pdControl/"+exp+"/"

file_atm=dir+"ATM/Output/MO/"+exp+"_18500101_18501231_1M_histmth.nc"

file_calving_1=dir+"CPL/Output/MO/"+exp+"_18500101_18501231_COCALVIN.nc"
file_calving_2=dir+"CPL/Output/MO/"+exp+"_18500101_18501231_OCalving.nc"

file_evap_1=dir+"CPL/Output/MO/"+exp+"_18500101_18501231_COTOTEVA.nc"
file_evap_2=dir+"CPL/Output/MO/"+exp+"_18500101_18501231_OTotEvap.nc"

file_rain_1=dir+"CPL/Output/MO/"+exp+"_18500101_18501231_COTOTRAI.nc"
file_rain_2=dir+"CPL/Output/MO/"+exp+"_18500101_18501231_OTotRain.nc"

file_snow_1=dir+"CPL/Output/MO/"+exp+"_18500101_18501231_COTOTSNO.nc"
file_snow_2=dir+"CPL/Output/MO/"+exp+"_18500101_18501231_OTotSnow.nc"

fileoce=dir+"OCE/Output/MO/"+exp+"_18500101_18501231_1M_grid_T.nc"
maskoce="/ccc/cont003/home/lmd/oboucher/BILAN_EAU/maskutil_T.nc"

#--ouverture des xarray
xr_atm=xr.open_dataset(file_atm)
xr_calving_1=xr.open_dataset(file_calving_1)
xr_calving_2=xr.open_dataset(file_calving_2)
xr_evap_1=xr.open_dataset(file_evap_1)
xr_evap_2=xr.open_dataset(file_evap_2)
xr_rain_1=xr.open_dataset(file_rain_1)
xr_rain_2=xr.open_dataset(file_rain_2)
xr_snow_1=xr.open_dataset(file_snow_1)
xr_snow_2=xr.open_dataset(file_snow_2)
xr_ocean=xr.open_dataset(fileoce)
xr_mask=xr.open_dataset(maskoce)

#--extraction des array numpy - conversion en longdouble pour les sommes
atm_aire0=np.longdouble(xr_atm['aire'].values)
atm_oce=np.longdouble(xr_atm['pourc_oce'].values)
atm_sic=np.longdouble(xr_atm['pourc_sic'].values)

wbilo_oce=np.longdouble(xr_atm['wbilo_oce'].values)
wbilo_sic=np.longdouble(xr_atm['wbilo_sic'].values)

atm_aire=atm_aire0*(atm_oce+atm_sic)/100.

calving_1=np.longdouble(xr_calving_1['COCALVIN'].values)
calving_2=np.longdouble(xr_calving_2['OCalving'].values)

evap_1=np.longdouble(xr_evap_1['COTOTEVA'].values)
evap_2=np.longdouble(xr_evap_2['OTotEvap'].values)

rain_1=np.longdouble(xr_rain_1['COTOTRAI'].values)
rain_2=np.longdouble(xr_rain_2['OTotRain'].values)

snow_1=np.longdouble(xr_snow_1['COTOTSNO'].values)
snow_2=np.longdouble(xr_snow_2['OTotSnow'].values)

oce_area=np.longdouble(xr_ocean['area'].values)

mask=np.longdouble(xr_mask['maskutil_T'][:,:].values)

#--totaux sur la grille - conversion en Sv
tot_calving_1=np.sum(calving_1,axis=(1,2))/1.e9
tot_calving_2=np.sum(calving_2*oce_area*mask,axis=(1,2))/1.e9
print('calving in  Sv =',tot_calving_1[0:10])
print('calving out Sv =',tot_calving_2[0:10])

Résultats pour le calving :

('calving in  Sv =', array([ 0.0,  0.025110938,  0.07871894,  0.060956317,  0.066686016,
        0.032709929,  0.049833877,  0.033137503,  0.032376687,  0.059238586], dtype=float128))
('calving out Sv =', array([ 0.0,  0.025110938,  0.07871894,  0.060956317,  0.066686016,
        0.032709929,  0.049833878,  0.033137503,  0.032376687,  0.059238586], dtype=float128))

Tout va bien, c'est la même chose en input et en output

tot_evap_1=np.sum(evap_1*atm_aire[0,:,:],axis=(1,2))/1.e9
tot_evap_2=np.sum(evap_2*oce_area*mask,axis=(1,2))/1.e9
tot_rain_1=np.sum(rain_1*atm_aire[0,:,:],axis=(1,2))/1.e9
tot_rain_2=np.sum(rain_2*oce_area*mask,axis=(1,2))/1.e9
tot_snow_1=np.sum(snow_1*atm_aire[0,:,:],axis=(1,2))/1.e9
tot_snow_2=np.sum(snow_2*oce_area*mask,axis=(1,2))/1.e9

print('oceanic area from grid_T file')
print('rain in  Sv =',tot_rain_1[0:10])
print('rain out Sv =',tot_rain_2[0:10])
print('rain diff mSv=',(tot_rain_1[1:10]-tot_rain_2[1:10])*1000.)
print('snow in  Sv =',tot_snow_1[0:10])
print('snow out Sv =',tot_snow_2[0:10])
print('snow diff mSv=',(tot_snow_1[1:10]-tot_snow_2[1:10])*1000.)
print('evap in  Sv =',tot_evap_1[0:10])
print('evap out Sv =',tot_evap_2[0:10])
print('evap diff mSv=',(tot_evap_1[1:10]-tot_evap_2[1:10])*1000.)

Résultats :

('rain in  Sv =', array([ 0.0,  3.4585411,  8.8186534,  11.318086,  11.570535,  11.836867,
        11.357751,  11.295551,  11.242278,  11.49349], dtype=float128))
('rain out Sv =', array([ 0.0,  3.4585411,  8.8186534,  11.317966,  11.570457,  11.836863,
        11.35775,  11.295479,  11.242256,  11.493486], dtype=float128))
('rain diff mSv=', array([-3.9859023e-08,  4.4476907e-05,  0.11972505,  0.078397034,
        0.0045189078,  0.0016220226,  0.071562863,  0.022124081,
        0.0034941963], dtype=float128))
('snow in  Sv =', array([ 0.0,  0.43405517,  0.48368972,  0.41251261,  0.36736733,
        0.39909007,  0.46146092,  0.3871201,  0.33174664,  0.45059974], dtype=float128))
('snow out Sv =', array([ 0.0,  0.43405517,  0.48368972,  0.41251261,  0.36736733,
        0.39909007,  0.46146092,  0.38712011,  0.33174664,  0.45059974], dtype=float128))
('snow diff mSv=', array([-5.991792e-07, -2.3985875e-07,  4.5716792e-07,  3.592597e-07,
        1.0149842e-08, -1.356738e-08, -3.040086e-07,  3.1490164e-07,
       -3.3566433e-07], dtype=float128))
('evap in  Sv =', array([ 0.0,  12.638699,  12.227281,  13.689618,  14.567473,  14.940661,
        14.904491,  14.177904,  13.691065,  13.653616], dtype=float128))
('evap out Sv =', array([ 0.0,  12.638585,  12.226845,  13.689247,  14.566987,  14.940099,
        14.903804,  14.177131,  13.690155,  13.652478], dtype=float128))
('evap diff mSv=', array([ 0.11373978,  0.43656301,  0.37129745,  0.48537692,  0.5611987,
        0.68672948,  0.77286054,  0.91008484,  1.1375948], dtype=float128))

Snow est très bien conservé, Rain pas trop mal (<0.1 mSv) mais ce n'est pas le cas de Evap avec des différences jusqu'à 1 mSv.