clm5/tools/contrib/SpinupStability_SP_v9.ncl
2024-05-09 15:14:01 +08:00

679 lines
26 KiB
Plaintext

; NCL script
; SpinupStability_SP_v9.ncl
; Script to examine stability of SP spinup simulation.
; This version operates on either monthly mean or multi-annual mean multi-variable history files
; Keith Oleson, Sep 2018
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "~oleson/lnd_diag/run/contributed.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl"
begin
print ("=========================================")
print ("Start Time: "+systemfunc("date") )
print ("=========================================")
;=======================================================================;
; This script produces a page of plots of various variables that are evaluated
; as to whether they are spunup or not. A summary of variables in equilibrium
; and/or in disequilibrium is also produced to standard out. The postscript output
; is $caseid_spinup.ps in the pwd.
; The variables examined are FSH,EFLX_LH_TOT,FPSN,TWS,H2OSOI,TSOI.
; The percentage of land area in TSOI disequilibrium is also examined.
; Thresholds are defined below (i.e., global_thresh_*) and can be changed for individual
; variables.
; To run this script, just enter in your case name and username below.
; AND set the annual_hist flag to "True" if your case has annual mean history files or set
; annual_hist flag to "False" if your case has monthly mean history files.
; The script ; assumes that your history files are in /glade/scratch/$username/archive/$caseid/lnd/hist
;=======================================================================;
caseid = "cesm20exp10j_1deg_CPLHST_nndep_1850pAD"
username = "oleson"
annual_hist = "False"
cplot = "Global"
subper = 20
h2osoi_layer = 8 ; Desired soil layer (layer 8 is about 1m)
tsoi_layer = 10 ; Desired soil layer (layer 10 is about 3m)
do_plot = "True"
;=======================================================================;
data_dir = "/glade/scratch/"+username+"/archive/"+caseid+"/lnd/hist/"
; Thresholds
glob_thresh_fsh = 0.02 ; global threshold for FSH equilibrium (delta W m-2 / yr)
glob_thresh_lh = 0.02 ; global threshold for EFLX_LH_TOT equilibrium (delta W m-2 / yr)
glob_thresh_gpp = 0.02 ; global threshold for FPSN equilibrium (delta PgC / yr)
glob_thresh_tws = 0.001 ; global threshold for TWS equilibrium (delta m / yr)
glob_thresh_h2osoi = 0.01 ; global threshold for H2OSOI equilibrium (delta mm mm-3 / yr)
glob_thresh_tsoi = 0.02 ; global threshold for TSOI equilibrium (delta K / yr)
glob_thresh_area = 3.0 ; global threshold percent area with TWS disequilibrium gt 0.01 m
tws_thresh = 0.001 ; disequilibrium threshold for individual gridcells (m)
if (annual_hist .eq. "True") then
fls = systemfunc("ls " + data_dir + caseid+".clm2.h0.*-*-*-*"+".nc")
else
fls = systemfunc("ls " + data_dir + caseid+".clm2.h0.*-*"+".nc")
end if
flsdims = dimsizes(fls)
if (annual_hist .eq. "True") then
lstfile = addfile(fls(flsdims-1),"r")
else
lstfile = addfile(fls(flsdims-12),"r") ;last month (DEC) of any year has mdate for next year
;so grab JAN of last year
end if
if (annual_hist .eq. "True") then
lstyrdim = dimsizes(lstfile->mcdate)
mcdate_lst = lstfile->mcdate(lstyrdim-1)
else
mcdate_lst = lstfile->mcdate
end if
lstyr = toint(mcdate_lst)/10000
fstfile = addfile(fls(0),"r")
if (annual_hist .eq. "True") then
mcdate_fst = fstfile->mcdate(0)
else
mcdate_fst = fstfile->mcdate
end if
fstyr = toint(mcdate_fst)/10000
yearplt = ispan(fstyr,lstyr,subper)
yearpltrev = yearplt(::-1)
year = ispan(fstyr,lstyr,subper) - fstyr
nyrs = dimsizes(year)
if (subper .eq. 1) then
yearpltmid = ispan(fstyr+subper/2,yearplt(nyrs-2),subper)
else
yearpltmid = ispan(fstyr+subper/2,yearplt(nyrs-1),subper)
end if
; Build an array of monthly indices
monstr = new(nyrs*12,"integer")
do i = 0,nyrs-1
monstr(i*12:i*12+11) = ispan(year(i)*12,year(i)*12+11,1)
end do
; Add the data files together
if (annual_hist .eq. "True") then
data = addfiles(fls, "r")
ListSetType (data, "cat")
else
data = addfiles(fls(monstr), "r")
end if
; Convert to annual means
if (annual_hist .eq. "True") then
fsh = data[:]->FSH(year,:,:)
lh = data[:]->EFLX_LH_TOT(year,:,:)
gpp = data[:]->FPSN(year,:,:)
tws = data[:]->TWS(year,:,:)
h2osoi = data[:]->H2OSOI(year,h2osoi_layer-1,:,:)
tsoi = data[:]->TSOI(year,tsoi_layer-1,:,:)
else
fsh = month_to_annual(data[:]->FSH,1)
if (isfilevar(data[0],"EFLX_LH_TOT")) then
lh = month_to_annual(data[:]->EFLX_LH_TOT,1)
else
tmp1 = data[:]->FCTR
tmp2 = data[:]->FCEV
tmp3 = data[:]->FGEV
tot = tmp1+tmp2+tmp3
copy_VarCoords(tmp1,tot)
lh = month_to_annual(tot,1)
delete(tmp1)
delete(tmp2)
delete(tmp3)
delete(tot)
end if
gpp = month_to_annual(data[:]->FPSN,1)
if (isfilevar(data[0],"TWS")) then
tws = month_to_annual(data[:]->TWS,1)
else
tmp1 = data[:]->H2OCAN
tmp2 = data[:]->H2OSNO
tmp3 = data[:]->WA
tmp4 = data[:]->SOILLIQ
tmp4s = dim_sum_n(tmp4,1)
tmp5 = data[:]->SOILICE
tmp5s = dim_sum_n(tmp5,1)
tot = tmp1+tmp2+tmp3+tmp4s+tmp5s
copy_VarCoords(tmp1,tot)
tws = month_to_annual(tot,1)
delete(tmp1)
delete(tmp2)
delete(tmp3)
delete(tmp4)
delete(tmp4s)
delete(tmp5)
delete(tmp5s)
end if
h2osoi = month_to_annual(data[:]->H2OSOI(:,h2osoi_layer-1,:,:),1)
tsoi = month_to_annual(data[:]->TSOI(:,tsoi_layer-1,:,:),1)
end if
lat = data[0]->lat
nlat = dimsizes(lat)
lon = data[0]->lon
nlon = dimsizes(lon)
landfrac = data[0]->landfrac
area = data[0]->area
; nbedrock = data[0]->nbedrock
aream = area*1.e6
landarea = landfrac*aream
gtoPg = 1e-15
secinyr = 60.*60.*24.*365.
umoleCO2tomoleCO2 = 1./1.e6
moleCO2togCO2 = 44./1.
gCO2togC = 12./44.
; FSH
if (isfilevar(data[0],"FSH")) then
areasum = sum(area*landfrac)
areaL = area*landfrac
landareaL = conform_dims(dimsizes(fsh),areaL,(/1,2/)) ; conforming dimensions of areaL to tlai
fsh_glob = dim_sum_n(fsh*landareaL/areasum,(/1,2/)) ; weighted global fsh (W m-2)
fsh_glob!0 = "year"
fsh_glob&year = yearplt
fsh_glob_del = new(nyrs-1,"float")
do i = 0,nyrs-2
fsh_glob_del(i) = (fsh_glob(i+1) - fsh_glob(i))/subper
end do
fsh_glob_del!0 = "year"
fsh_glob_del&year = yearpltmid
indx = where(abs(fsh_glob_del) .lt. glob_thresh_fsh,1,0)
if (all(indx .eq. 1)) then
fsh_glob_equil = yearplt(0)
else
if (.not.(all(indx .eq. 0)) .and. indx(dimsizes(indx)-1) .ne. 0) then
indxrev = indx(::-1)
do i = 0,dimsizes(indxrev)-1
if (indxrev(i) .eq. 0) then
fsh_glob_equil = yearpltrev(i-1)
break
end if
end do
delete(indxrev)
else
fsh_glob_equil = -999
end if
end if
fsh_glob_equil@_FillValue = -999
delete(indx)
else
fsh_glob_equil = new(1,typeof(yearplt),-999)
fsh_glob_equil = -999
fsh_glob = new(dimsizes(dim_sum_n(fsh,(/1,2/))),typeof(fsh),-999)
fsh_glob = -999
fsh_glob_del = new(nyrs-1,"float",-999.)
fsh_glob_del = -999.
end if
; EFLX_LH_TOT
; if (isfilevar(data[0],"EFLX_LH_TOT")) then
lh_glob = dim_sum_n(lh*landareaL/areasum,(/1,2/)) ; weighted global lh (W m-2)
lh_glob!0 = "year"
lh_glob&year = yearplt
lh_glob_del = new(nyrs-1,"float")
do i = 0,nyrs-2
lh_glob_del(i) = (lh_glob(i+1) - lh_glob(i))/subper
end do
lh_glob_del!0 = "year"
lh_glob_del&year = yearpltmid
indx = where(abs(lh_glob_del) .lt. glob_thresh_lh,1,0)
if (all(indx .eq. 1)) then
lh_glob_equil = yearplt(0)
else
if (.not.(all(indx .eq. 0)) .and. indx(dimsizes(indx)-1) .ne. 0) then
indxrev = indx(::-1)
do i = 0,dimsizes(indxrev)-1
if (indxrev(i) .eq. 0) then
lh_glob_equil = yearpltrev(i-1)
break
end if
end do
delete(indxrev)
else
lh_glob_equil = -999
end if
end if
lh_glob_equil@_FillValue = -999
delete(indx)
; else
; lh_glob_equil = new(1,typeof(yearplt),-999)
; lh_glob_equil = -999
; lh_glob = new(dimsizes(dim_sum_n(lh,(/1,2/))),typeof(lh),-999)
; lh_glob = -999
; lh_glob_del = new(nyrs-1,"float",-999.)
; lh_glob_del = -999.
; end if
; GPP
landareaC = conform_dims(dimsizes(gpp),landarea,(/1,2/)) ; conforming dimensions of landarea to gpp
gpp_area = gpp*landareaC ; correcting gpp for total land area
gpp_pg = gpp_area*gtoPg*secinyr*umoleCO2tomoleCO2*moleCO2togCO2*gCO2togC ; umole CO2/s->Pg Carbon
gpp_glob = dim_sum_n(gpp_pg, (/1,2/)) ; sums over all latitudes
gpp_glob!0 = "year"
gpp_glob&year = yearplt
gpp_glob_del = new(nyrs-1,"float")
do i = 0,nyrs-2
gpp_glob_del(i) = (gpp_glob(i+1) - gpp_glob(i))/subper
end do
gpp_glob_del!0 = "year"
gpp_glob_del&year = yearpltmid
indx = where(abs(gpp_glob_del) .lt. glob_thresh_gpp,1,0)
if (all(indx .eq. 1)) then
gpp_glob_equil = yearplt(0)
else
if (.not.(all(indx .eq. 0)) .and. indx(dimsizes(indx)-1) .ne. 0) then
indxrev = indx(::-1)
do i = 0,dimsizes(indxrev)-1
if (indxrev(i) .eq. 0) then
gpp_glob_equil = yearpltrev(i-1)
break
end if
end do
delete(indxrev)
else
gpp_glob_equil = -999
end if
end if
gpp_glob_equil@_FillValue = -999
delete(indx)
; TWS
tws_glob = (dim_sum_n(tws*landareaL/areasum,(/1,2/)))/1.e3 ; weighted global tws (meters)
tws_glob!0 = "year"
tws_glob&year = yearplt
tws_glob_del = new(nyrs-1,"float")
do i = 0,nyrs-2
tws_glob_del(i) = (tws_glob(i+1) - tws_glob(i))/subper
end do
tws_glob_del!0 = "year"
tws_glob_del&year = yearpltmid
indx = where(abs(tws_glob_del) .lt. glob_thresh_tws,1,0)
if (all(indx .eq. 1)) then
tws_glob_equil = yearplt(0)
else
if (.not.(all(indx .eq. 0)) .and. indx(dimsizes(indx)-1) .ne. 0) then
indxrev = indx(::-1)
do i = 0,dimsizes(indxrev)-1
if (indxrev(i) .eq. 0) then
tws_glob_equil = yearpltrev(i-1)
break
end if
end do
delete(indxrev)
else
tws_glob_equil = -999
end if
end if
tws_glob_equil@_FillValue = -999
delete(indx)
; H2OSOI
if (isfilevar(data[0],"H2OSOI")) then
h2osoi_glob = dim_sum_n(h2osoi*landareaL/areasum,(/1,2/)) ; weighted global h2osoi (mm)
h2osoi_glob!0 = "year"
h2osoi_glob&year = yearplt
h2osoi_glob_del = new(nyrs-1,"float")
do i = 0,nyrs-2
h2osoi_glob_del(i) = (h2osoi_glob(i+1) - h2osoi_glob(i))/subper
end do
h2osoi_glob_del!0 = "year"
h2osoi_glob_del&year = yearpltmid
indx = where(abs(h2osoi_glob_del) .lt. glob_thresh_h2osoi,1,0)
if (all(indx .eq. 1)) then
h2osoi_glob_equil = yearplt(0)
else
if (.not.(all(indx .eq. 0)) .and. indx(dimsizes(indx)-1) .ne. 0) then
indxrev = indx(::-1)
do i = 0,dimsizes(indxrev)-1
if (indxrev(i) .eq. 0) then
h2osoi_glob_equil = yearpltrev(i-1)
break
end if
end do
delete(indxrev)
else
h2osoi_glob_equil = -999
end if
end if
h2osoi_glob_equil@_FillValue = -999
delete(indx)
else
h2osoi_glob_equil = -999
h2osoi_glob_equil = new(1,typeof(yearplt),-999)
h2osoi_glob_equil = -999
h2osoi_glob = new(dimsizes(dim_sum_n(h2osoi,(/1,2/))),typeof(h2osoi),-999)
h2osoi_glob = -999
h2osoi_glob_del = new(nyrs-1,"float",-999.)
h2osoi_glob_del = -999.
end if
; TSOI
if (isfilevar(data[0],"TSOI")) then
tsoi_glob = dim_sum_n(tsoi*landareaL/areasum,(/1,2/)) ; weighted global tsoi (mm)
tsoi_glob!0 = "year"
tsoi_glob&year = yearplt
tsoi_glob_del = new(nyrs-1,"float")
do i = 0,nyrs-2
tsoi_glob_del(i) = (tsoi_glob(i+1) - tsoi_glob(i))/subper
end do
tsoi_glob_del!0 = "year"
tsoi_glob_del&year = yearpltmid
indx = where(abs(tsoi_glob_del) .lt. glob_thresh_tsoi,1,0)
if (all(indx .eq. 1)) then
tsoi_glob_equil = yearplt(0)
else
if (.not.(all(indx .eq. 0)) .and. indx(dimsizes(indx)-1) .ne. 0) then
indxrev = indx(::-1)
do i = 0,dimsizes(indxrev)-1
if (indxrev(i) .eq. 0) then
tsoi_glob_equil = yearpltrev(i-1)
break
end if
end do
delete(indxrev)
else
tsoi_glob_equil = -999
end if
end if
tsoi_glob_equil@_FillValue = -999
delete(indx)
else
h2osno_glob_equil = -999
h2osno_glob_equil = new(1,typeof(yearplt),-999)
h2osno_glob_equil = -999
h2osno_glob = new(dimsizes(dim_sum_n(h2osno,(/1,2/))),typeof(h2osno),-999)
h2osno_glob = -999
h2osno_glob_del = new(nyrs-1,"float",-999.)
h2osno_glob_del = -999.
end if
; Land area not in TWS equilibrium
landarea_noequil = new((/nyrs-1,nlat,nlon/),"float")
do i = 0,nyrs-2
landarea_noequil(i,:,:) = where(abs(tws(i+1,:,:)/1.e3 - tws(i,:,:)/1.e3)/subper .gt. tws_thresh, landarea, 0.)
end do
perc_landarea_noequil = 100.*(dim_sum_n(landarea_noequil,(/1,2/))/sum(landarea))
indx = where(abs(perc_landarea_noequil) .lt. glob_thresh_area,1,0)
if (all(indx .eq. 1)) then
perc_landarea_glob_noequil = yearplt(0)
else
if (.not.(all(indx .eq. 0)) .and. indx(dimsizes(indx)-1) .ne. 0) then
indxrev = indx(::-1)
do i = 0,dimsizes(indxrev)-1
if (indxrev(i) .eq. 0) then
perc_landarea_glob_noequil = yearpltrev(i-1)
break
end if
end do
delete(indxrev)
else
perc_landarea_glob_noequil = -999
end if
end if
perc_landarea_glob_noequil@_FillValue = -999
delete(indx)
tws_1_map = where(landarea_noequil(nyrs-2,:,:) .ne. 0.,(tws(nyrs-1,:,:)/1.e3-tws(nyrs-2,:,:)/1.e3)/subper,tws@_FillValue)
tws_1_map!0 = "lat"
tws_1_map&lat = lat
tws_1_map!1 = "lon"
tws_1_map&lon = lon
tws_2_map = where(landarea_noequil(nyrs-3,:,:) .ne. 0.,(tws(nyrs-2,:,:)/1.e3-tws(nyrs-3,:,:)/1.e3)/subper,tws@_FillValue)
copy_VarCoords(tws_1_map,tws_2_map)
;===============================Plotting====================================;
if (do_plot .eq. "True") then
; wks_type = "png"
; wks_type@wkWidth = 2500
; wks_type@wkHeight = 2500
; wks_type = "x11"
wks_type = "ps"
; wks_type = "pdf"
wks = gsn_open_wks (wks_type, caseid+"_SP_Spinup")
gsn_define_colormap(wks, "ViBlGrWhYeOrRe")
plot = new(13,"graphic")
resP = True
; resP@gsnMaximize = True
resP@gsnPaperOrientation = "portrait"
resP@gsnFrame = False
resP@gsnDraw = True
resP@txString = caseid + " Annual Mean "
resP@gsnPanelXWhiteSpacePercent = 2.
resP@gsnPanelCenter = False
; resP@gsnPanelDebug = True
res = True
res@gsnFrame = False
res@gsnDraw = False
res@xyLineThicknessF = 2
polyres1 = True
polyres1@gsLineDashPattern = 16
polyres2 = True
polyres2@gsLineDashPattern = 2
res@tiXAxisString = " "
res@tiYAxisString = "W m~S~-2~N~"
res@tiMainString = "FSH"
plot(0) = gsn_csm_xy(wks,yearplt,fsh_glob,res)
res@tiYAxisString = "W m~S~-2~N~"
res@tiMainString = "Delta FSH " + "EqYr: "+fsh_glob_equil
res@trYMaxF = 0.2
res@trYMinF = -0.2
plot(1) = gsn_csm_xy(wks,yearpltmid,fsh_glob_del,res)
prim1 = gsn_add_polyline(wks,plot(1),(/0.,yearpltmid(nyrs-2)/),(/0.,0./),polyres1)
prim2 = gsn_add_polyline(wks,plot(1),(/0.,yearpltmid(nyrs-2)/),(/-glob_thresh_fsh,-glob_thresh_fsh/),polyres2)
prim3 = gsn_add_polyline(wks,plot(1),(/0.,yearpltmid(nyrs-2)/),(/glob_thresh_fsh,glob_thresh_fsh/),polyres2)
delete(res@trYMaxF)
delete(res@trYMinF)
res@tiYAxisString = "W m~S~-2~N~"
res@tiMainString = "EFLX_LH_TOT"
plot(2) = gsn_csm_xy(wks,yearplt,lh_glob,res)
res@tiYAxisString = "W m~S~-2~N~"
res@tiMainString = "Delta EFLX_LH_TOT " + "EqYr: "+lh_glob_equil
res@trYMaxF = 0.2
res@trYMinF = -0.2
plot(3) = gsn_csm_xy(wks,yearpltmid,lh_glob_del,res)
prim4 = gsn_add_polyline(wks,plot(3),(/0.,yearpltmid(nyrs-2)/),(/0.,0./),polyres1)
prim5 = gsn_add_polyline(wks,plot(3),(/0.,yearpltmid(nyrs-2)/),(/-glob_thresh_lh,-glob_thresh_lh/),polyres2)
prim6 = gsn_add_polyline(wks,plot(3),(/0.,yearpltmid(nyrs-2)/),(/glob_thresh_lh,glob_thresh_lh/),polyres2)
delete(res@trYMaxF)
delete(res@trYMinF)
res@tiYAxisString = "Pg C yr~S~-1~N~"
res@tiMainString = "GPP"
plot(4) = gsn_csm_xy(wks,yearplt,gpp_glob,res)
res@tiYAxisString = "Pg C yr~S~-1~N~"
res@tiXAxisString = "Spinup Year"
res@tiMainString = "Delta GPP " + "EqYr: "+gpp_glob_equil
res@trYMaxF = 0.2
res@trYMinF = -0.2
plot(5) = gsn_csm_xy(wks,yearpltmid,gpp_glob_del,res)
prim7 = gsn_add_polyline(wks,plot(5),(/0.,yearpltmid(nyrs-2)/),(/0.,0./),polyres1)
prim8 = gsn_add_polyline(wks,plot(5),(/0.,yearpltmid(nyrs-2)/),(/-glob_thresh_gpp,-glob_thresh_gpp/),polyres2)
prim9 = gsn_add_polyline(wks,plot(5),(/0.,yearpltmid(nyrs-2)/),(/glob_thresh_gpp,glob_thresh_gpp/),polyres2)
delete(res@trYMaxF)
delete(res@trYMinF)
res@tiYAxisString = "m"
res@tiMainString = "TWS"
plot(6) = gsn_csm_xy(wks,yearplt,tws_glob,res)
res@tiYAxisString = "m"
res@tiMainString = "Delta TWS " + "EqYr: "+tws_glob_equil
res@trYMaxF = 0.05
res@trYMinF = -0.05
plot(7) = gsn_csm_xy(wks,yearpltmid,tws_glob_del,res)
prim10 = gsn_add_polyline(wks,plot(7),(/0.,yearpltmid(nyrs-2)/),(/0.,0./),polyres1)
prim11 = gsn_add_polyline(wks,plot(7),(/0.,yearpltmid(nyrs-2)/),(/-glob_thresh_tws,-glob_thresh_tws/),polyres2)
prim12 = gsn_add_polyline(wks,plot(7),(/0.,yearpltmid(nyrs-2)/),(/glob_thresh_tws,glob_thresh_tws/),polyres2)
delete(res@trYMaxF)
delete(res@trYMinF)
res@tiYAxisString = "mm~S~3~N~ mm~S~3~N~"
res@tiMainString = "H2OSOI (layer "+h2osoi_layer+")"
plot(8) = gsn_csm_xy(wks,yearplt,h2osoi_glob,res)
res@tiYAxisString = "mm~S~3~N~ mm~S~3~N~"
res@tiXAxisString = "Spinup Year"
res@tiMainString = "Delta H2OSOI " + "EqYr: "+h2osoi_glob_equil
res@trYMaxF = 0.2
res@trYMinF = -0.2
plot(9) = gsn_csm_xy(wks,yearpltmid,h2osoi_glob_del,res)
prim13 = gsn_add_polyline(wks,plot(9),(/0.,yearpltmid(nyrs-2)/),(/0.,0./),polyres1)
prim14 = gsn_add_polyline(wks,plot(9),(/0.,yearpltmid(nyrs-2)/),(/-glob_thresh_h2osoi,-glob_thresh_h2osoi/),polyres2)
prim15 = gsn_add_polyline(wks,plot(9),(/0.,yearpltmid(nyrs-2)/),(/glob_thresh_h2osoi,glob_thresh_h2osoi/),polyres2)
delete(res@trYMaxF)
delete(res@trYMinF)
res@tiYAxisString = "K"
res@tiMainString = "TSOI (layer "+tsoi_layer+")"
plot(10) = gsn_csm_xy(wks,yearplt,tsoi_glob,res)
res@tiYAxisString = "K"
res@tiXAxisString = "Spinup Year"
res@tiMainString = "Delta TSOI " + "EqYr: "+tsoi_glob_equil
res@trYMaxF = 0.2
res@trYMinF = -0.2
plot(11) = gsn_csm_xy(wks,yearpltmid,tsoi_glob_del,res)
prim16 = gsn_add_polyline(wks,plot(11),(/0.,yearpltmid(nyrs-2)/),(/0.,0./),polyres1)
prim17 = gsn_add_polyline(wks,plot(11),(/0.,yearpltmid(nyrs-2)/),(/-glob_thresh_tsoi,-glob_thresh_tsoi/),polyres2)
prim18 = gsn_add_polyline(wks,plot(11),(/0.,yearpltmid(nyrs-2)/),(/glob_thresh_tsoi,glob_thresh_tsoi/),polyres2)
res@tiYAxisString = "%"
res@tiMainString = "% Land Area in TWS Disequil " + "EqYr: "+perc_landarea_glob_noequil
res@trYMaxF = 80.0
res@trYMinF = 0.0
plot(12) = gsn_csm_xy(wks,yearpltmid,perc_landarea_noequil,res)
prim19 = gsn_add_polyline(wks,plot(12),(/0.,yearpltmid(nyrs-2)/),(/glob_thresh_area,glob_thresh_area/),polyres2)
gsn_panel(wks,plot,(/4,4/),resP)
delete(plot)
resc = True ; turn on plotting options
resc@gsnSpreadColors = True ; spans all colors in colormap
resc@cnFillMode = "RasterFill" ; raster mode
resc@cnFillOn = True ; turn on color fill
resc@cnLinesOn = False ; turn off contour lines
resc@cnLineLabelsOn = False ; turn off contour line labels
resc@cnLevelSelectionMode = "ExplicitLevels"
resc@mpProjection = "robinson" ; Robinson grid projection
if (cplot .eq. "Arctic") then
resc@mpLimitMode = "LatLon"
resc@mpMinLatF = 50.
resc@mpMaxLatF = 85.
resc@mpMinLonF = -180.
resc@mpMaxLonF = -95.
resc@gsnAddCyclic = False
resc@mpProjection = "CylindricalEquidistant"
end if
resc@gsnDraw = True
resc@gsnFrame = False
resc@lbAutoManage = False
resc@lbLabelFontHeightF = 0.010
resc@txFontHeightF = 0.008
resc@cnLevels = (/-0.005,-0.004,-0.003,-0.002,-0.001,0.0,0.001,0.002,0.003,0.004,0.005/)
resc@gsnLeftString = "m"
resc@gsnRightString = ""
resc@vpXF = 0.30 ; position and sizes
resc@vpYF = 0.28 ; for XY plot
resc@vpWidthF = 0.30
resc@vpHeightF = 0.30
resc@gsnCenterString = "TWS Disequil Yr " + yearplt(nyrs-1) + " - " + yearplt(nyrs-2)
plot = gsn_csm_contour_map(wks,tws_1_map,resc)
resc@vpXF = 0.65 ; position and sizes
resc@vpYF = 0.28 ; for XY plot
resc@vpWidthF = 0.30
resc@vpHeightF = 0.30
resc@gsnCenterString = "TWS Disequil Yr " + yearplt(nyrs-2) + " - " + yearplt(nyrs-3)
plot = gsn_csm_contour_map(wks,tws_2_map,resc)
frame(wks)
end if ; end do_plot
; Equilibrium summary
print((/"======================================================================="/))
print((/"======================================================================="/))
print((/"EQUILIBRIUM SUMMARY"/))
print((/"======================================================================="/))
if (.not.(ismissing(fsh_glob_equil))) then
print((/"FSH is in equilibrium. Eq. Yr. = "+fsh_glob_equil/))
else
print((/"FATAL: FSH is NOT in equilibrium"/))
end if
if (.not.(ismissing(lh_glob_equil))) then
print((/"EFLX_LH_TOT is in equilibrium. Eq. Yr. = "+lh_glob_equil/))
else
print((/"FATAL: EFLX_LH_TOT is NOT in equilibrium"/))
end if
if (.not.(ismissing(gpp_glob_equil))) then
print((/"GPP is in equilibrium. Eq. Yr. = "+gpp_glob_equil/))
else
print((/"FATAL: GPP is NOT in equilibrium"/))
end if
if (.not.(ismissing(tws_glob_equil))) then
print((/"TWS is in equilibrium. Eq. Yr. = "+tws_glob_equil/))
else
print((/"WARNING: TWS is NOT in equilibrium or is missing"/))
end if
if (.not.(ismissing(h2osoi_glob_equil))) then
print((/"H2OSOI is in equilibrium. Eq. Yr. = "+h2osoi_glob_equil/))
else
print((/"FATAL: H2OSOI is NOT in equilibrium"/))
end if
if (.not.(ismissing(tsoi_glob_equil))) then
print((/"TSOI is in equilibrium. Eq. Yr. = "+tsoi_glob_equil/))
else
print((/"FATAL: TSOI is NOT in equilibrium"/))
end if
if (.not.(ismissing(perc_landarea_glob_noequil))) then
print((/"At least "+(100.-glob_thresh_area)+" percent of the land surface is in TWS equilibrium. Eq. Yr. = "+perc_landarea_glob_noequil/))
print((/"Percent of the land surface not in equilibrium ("+sprintf("%6.2f",perc_landarea_noequil(nyrs-2))+"% )"/))
else
print((/"FATAL: Not enough of the land surface is in equilibrium ("+sprintf("%6.2f",perc_landarea_noequil(nyrs-2))+"% > "+sprintf("%6.2f",glob_thresh_area)+"%)"/))
end if
if (.not.(ismissing(fsh_glob_equil)) .and. \
.not.(ismissing(lh_glob_equil)) .and. \
.not.(ismissing(gpp_glob_equil)) .and. \
.not.(ismissing(tws_glob_equil)) .and. \
.not.(ismissing(h2osoi_glob_equil)) .and. \
.not.(ismissing(tsoi_glob_equil)) .and. \
.not.(ismissing(perc_landarea_glob_noequil))) then
print((/"Congratulations! Your simulation is in equilibrium"/))
else
print((/"FATAL: Your simulation is not in equilibrium, 8 hours have been deducted from your PTO bank, try again"/))
end if
print((/"======================================================================="/))
print ("=========================================")
print ("Finish Time: "+systemfunc("date") )
print ("=========================================")
print ("Successfully ran the script")
end