From ff709c72dcb65cb54dfa982fecda2a62a60bc562 Mon Sep 17 00:00:00 2001 From: Claire Carouge Date: Tue, 28 Nov 2023 15:20:59 +1100 Subject: [PATCH 01/85] write review guidelines - Fixes #186 --- documentation/docs/assets/request_review.png | Bin 0 -> 40144 bytes .../contribution/resources/how_to.md | 7 +++++ .../contribution/review_guide.md | 26 ++++++++++++++++-- 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 documentation/docs/assets/request_review.png diff --git a/documentation/docs/assets/request_review.png b/documentation/docs/assets/request_review.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d84ee685325f239c58009b437573cf13be481c GIT binary patch literal 40144 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�AKGL`0dw`D ztrw+3P%Oq}#v0ce;>@U0I*y;;ESZKnk53Q4!J&?~b{>ok(Z|ETjoc3}WhY1=kizJZ zO!JM9ADH@bA6q240mV=WZ)pyrWPdZA;D{QpvNnK%m&wcys6liT^$~eDV1^v40Lz`Y)?cUl2T8)BZ&^IeQ$KsApU6HoZkz zKWfoq^&S<1_k-m* zq{^y5;bzlOV1R>%llqEflX^pnBxDeAfA3;hr}u;0K~>;4+paI+Q)3qgp$U-000vob z>Y=QxtscR1Aa3bx9Pup)Ca^)6NE`mGfh5Ig0IFyBi|V&ScC9#+mOc_FX9qqXedLh*AQAb&DYV>wFYG-@DkSn`SbB0Na5IwI%q2V!M| zDD5rXI9&9D5R+4mM1yiE3AZ9K7;T-Oy~)own0waRM^^px$sd$|tjmKRI$Ha&>#%@i zk>}Sxc6FiIGxxaEb9KZF*<;0P-YWC*r0FpY!|^LCvv6IDyLnu_0B1ZjHn#-oiqhHZ-6l{*{kFzG~3T-*UAj;7>(Hjagco=<~lO^WaKz?k%-)hxc;umM-4}- z#;$(R{V^~$y@Z@7o6`R+wNXQLmf+CRVfY^Uid=BniAyTOV%cD3ULaaJekL0OVk;kulfmcQV#gZvlaF+@txnY$y%`=d6CkYXh2|RpC5Y#R z{rzx3hs_|TWN=iT4?T11y;rlL*Y-)}=6G*rd|KLfw4q;K8j#K?LF42MpZOF>jl!K- zVP@qZxa}+iGYIGeUs=gx*-n561_jh~=-->9>&?%b%1OAYo zw*^M^b!|k&)eO);+nOp=dEl$}clO&SxgS02eOU%AYs}3FR{-uSdy;#-0at?+S5^w( zL2;h-Q@-EPbOCAxkG}Wj zT1b7r$nja6LSm{zz5a;6qe&+$kWV&|=^{i?;KA;0YbGUk2s(nru}kkaJ6y>|rxh*I zl>52I&E1Vhsv?atPV0nef4s1>5Yk`d4~%SVr5+hc2ENtrDy=UpRLK$bStfIVYdcQ; z=9(xI#)2vLDg8H_laCyuN3El+R$4*ciMcSqkHRS2afE`ea`{~N*t_a|Ew9M|#`&LI zf_hX>v1mH}f&-$3-(cq-a%_3S-s|Sv@oO)M1ctIo!wP6U4z)5b8%i+pW9zZ8vHg%mT-1)*@~zfNib*7=);)Ne*;A^ zI$zi0_XT4Ro8SBp8wNnYgJrpgTq{179p0ELV&~`Q5#&cuOfj@oYhhHOhJ+8@#}7Ar zTayKnTecAJm)vi@0MNjq=fw+n?qUkC{=!+Dfy=okeo8ysHO^{^7~rrRWy5@|&0l4% z65V?;!Y&43u^-JH#;*nQanYle*cBuU-+zP*=#rbm_Id>t^J9T_<(_cZw+I0S7A@Pi z8;g64E2*PRm>-Iw@UwMpx~;-eZpYfiHg9gCh#fyv9%f$?TB6GHu5oX)K(-eo+cJFq zq&P2rkQyYw`)YVKoCSom?oBjmGJ8T=75j%Do7$1PVhkz@y}0b>%?hRE%VX0TFVDw?Pk#vW`kU_15CVB;_%GXmNuOL|Tnb4$wHp&8}_|T7Eh$a_`@IXN^6V7RJgE7L#yFi42B&oA&A1QBSxw zLz1HmThCsk-(=!Oz0DkG5z@`cn4RTLFBs+O*yORyq>Q5_a|~rq$jni>o_B!GHB`|{LgT*ZRoT_sE2RVYbw?3@v$wR6gGI3v1`2Y0dBIkxn4C z!orQ9jc+j#5w0oO48$)Q_Sx3P#LULmy9*UAQ;k~T5%FhlDva8xTmbnmJcrM>7{DUM z=ykb*nZLX-8st-9?#l^W4QwL(${HZhHf%S~yITozl=c=A@_jRo0?6Ti*U7!$GTf8d ztWKLR*~wB@2acRw&=ffH9}qgK>udQO8l@+AU85hc_|*i#ySR81Ww8kAvU3tI78TNY z`!7ZjU9XgZshkS)1L{TKq`lDUL1M>9n3icpPC;5n5V1Aq%PBf+|dhWR6Pl{b#9XN85=2#8vrTH42y zrO22Z_Y8vY4Sl=S+;(qQ{fVfGiZ=WnZsH8xYRDOI-IqQUxsJ7l5U%*xPI+hjfsc!c zDQ%^?*cpn~TFF8%Mi+Df5DelPE?8RAuPcUAtX>))Z%RZshKY4r2xq|?UU~|?bTG6E zP-vGSgu-@Y;!^&`)ljoBE-JiYHKNw?7#V_}F@sn=wb`vZHV(p)DH4HU+t<|d4IS47 z9${FD9o~vzCX)MtrOVf@qUKySb5uv8H(WQ~4f%p1IVvHutKk?`Sb|`!vFWVB0F2DC z*0aPpI=^Q4(t<(*JG<`fiSu*k?B4;b*vZBXpZ83r)G5pwQnlp+Ai_t;+gq9jY{a@J zbr)o~m=E>qg{>)|`n621)SR_KG;*6o0ZitW%fdN=#?j?$`NRXqI_dKMn?DODtj34- zU#E(7s^{$-5E<-*TMmvva>~2AnwG(L=ZlY-NRf~SS+A%-D6Dxh4`>~BEMQSZ7;U7= zs)1Gh9ovSg0KSNOmLJ0(5K+kYkW(m5a2PRfn^S`X13i%;U@Q;o_1m{coXF$iy;PWvt z)`{S5n~91X5c`Oj0AV>SLH!lUNg-){@4Cnqyy%-C54-ox_XC4wKlec^`E*08a`%U6 zB=wKWz!aI%`hC`=sk5!(ejUTN>19ryJI;XJZbpHHHrE~EVKI8x49 zp%06}oTh-lk!!Eh+vwPAp`jsKMo!ez;x}XHDe~e_j_tNV*E5sr&hC@t^~U;om$_?N zq2w2~>FE#7IoS?DAcvKfbVE0^p>k1pcuem5D}a7zJBoCsB1n`>E!`KI__k7>R2O+A zF8f^8n!$Y&Y~35HViwB`ZW-3zaILoz%>uc+30xc#oSKLU&=C6%K@3BY;uLjaCgtQs za2-#$Mjw=ULD2%*bZ;GHpJ=MP>}{Izf#t4IOj)@F*a+q4=pE=a*aQ|-GM&7X^4Q+m zBKBvgGC;@9+CR%KMHkKj9Btv79SWMtapqTSZf+9&;IAU-P@fJbeCX;5DsOnm$0xS# zButYFaz!pSaOs|&`92w70Rg8IPGt>`>6Q(wddNDG@w25Fz_-`cAl`h*mh`?pR4$@d z5`6bgnc{Hf&!HXZs^4Vne68)yN{EuWZlPDAdV;CW1+5>X44COqxIvD6$T+Bc)1Izd z2tIL5QfNSV@tZ0{X9@P#);K<|=X7@N^&?-}Irtxw&>xW|>vsYnbsaN%ok#T?HdLN4 zz2#z2tqC#^XyD^Er-hu7fYKO>f|6i>+QDP7&cLQVtvh$6q-icHG*SMT#jC2G+HBq| zDzr{%q&CguI5z-(+sfv4D5qU3&!>yTos*kWH?4kfe0WvZ48sPk&?{&LZ=m@M@Hq75 zp%56EP{3@UUeUIeITr8dzPr_w2(f-nTdyQxn3;R)%1XnMP-Q+ia?(Yq{z)qQ#y3f> z6PU{ETF=LB2nhax1le#mOp))n@=Txq16Ua5l2QJoY#&}p0!>#1u$^+5NZc}=_Dv*j z-J>4H4;lgK)?s;Nmshcn*D9ws*;&uU&#Ve$BZx!jy2=};(MO#`E1RrYx^~j zQmwUrOMI%gKJCAJ@;f4|d-Q6CBN3o!Jm*lckyk@~mf#5cV%+ZX z$8I@?utw81^4#Yc`62v_7EVq|txae#>-}_T^3YGDEpH9f_?t0O5FsZE4o-gJu@NYZ zjj9=od)?B!#^%%`#Lw9COc-UihV$6t`6K76UIMd_a}poo3y0 zcx=e(0L{$^6rY35d<1ab zh4?(`P4mvAqnqKknAetqPapXz2?uEznqG1TH6Rlo9Lc`Bl|qi3`!_;}-{Y^mB=;3> zE9uoG{GXHLxhc!M9n@@LPc8VLVZv^J#JJpl1?-WF91tJ&TPrY6&EUV}D~@JWplrT5w86``;cEQpM*9a-V3(et&h$>_ zFunrYiiZD_)A$+dx5YEv`qELYCN=U2A>v<%j8Jgr0Ve`5P{#{;s+z%eQ2dV-W0!(5 zY*RN>w*>yL@X6n0K!%byDTN9Co4yPMMSq0O%f+X#iSF<6{;erNCyh+m#(WbDV+_R^ z{8ja6LdXE|tL8!y8G)sYv9YWRsp3LUgQ`(rliT+DWt424#vGZQ2UVf&MH03XKKA5{ z+CEp0#TorMbi>To(-}6QFwg*e&%En2hVc22?%){VS2)6k{(|rTqIQj7xxQ_H4$jCy)0PwQ|(Yi<-e$gdJ-&pQM3JWU2P zCPT8AJx_Wf@~y}$!P)B{%Kw21#>HXw1uE`?gT@~B-S(Wv%4=TTXYavQFj8Z8Be010 z{b%@H)t~K9c5`rE8|U-E6UT!}a`g6SIiD$$zB`qgjx#p>n6-xuh0_3#?_XZN8#jV- zkULe4i2w7vFr4QO%LX=6-aiYCpANBb92E?n$R*9+|J*A?lmWN!9E4%3BRF}D-rLip z9Yq!9b@V{Xk#GF8flo`Y{<=&HpV8j<-y(cR@%JYb_}-s>%K0=()*bd&)15^hGTM`% ze;e~WIQ<)8(#L^5mW==L>USLIjt}n|pKCn7>pPaeMEL8$!LpWRABV5*Pnd*VD3O}$ z{*4j*^E*CfQTbyDWl(Xgc!fY)_8M|#e=pGzSSSGc9G7 zL1lb7Vm4uzm?L<*Cs8CkqEGb#mz|M|8E^$ED4jP~+D0bK%+hl3_ZEY^j^_(sQuR_XYs;;{WRTzk`?}1Nnt1~;q-oRR5k>YR4(+9 z|MIKr@uD;ta8o2SJUp%wi%$(&aZnSyJvFUgyKn8!5`j0rPcj@VH*S=*wl45F-?MbS zh~!eMn=fm9a6m*6^11lsda^v6v$MI`cfs6DMF%lA`2voBUQh~uC+NgOvOBo{vnMb7 z9rPRTzxcia?kr)Mb@oJ_kES|Y&2TzG;M&mz5gw)KNa&bb&l~hyrnk-y9NB1?nH4cf zf#pJF2Pv&a{%6nxYQrJEX)E=JnTaV;qeSO!WACY2>puWxW|u{vZ#)-SKV}6ZtZ!^| zChm^EIi)cj8at@~DaD<9?WFBXe{7g3hLZ!W%Mt?n+9ikSs$x4jsBpJRcB)hr6RR)_ zR5V`CzQNY{X8iQbr!TWsPkxE~H6zfSoTBu9gPBRuI(je0)Otw;ESas-HPEo=P+A~l z^NN>Cg?#b39j9~dwdcCK@Dvb3#A0u+90eCu*)ROLg@U)uy#IWb{%Ex^Ec0xaWc*US z86-Lp{;kd|4;(hw^5KK-aRW%O@&`WDXKi4{BpG-P8=j%`lD<*ozbZDfuo&>)=(*cy z&S;kW7GG7xUcY%>BoE+zw;Mk>GIgrHZ1=Y#CY%6WdCky}(C2`M8k-Wf$fO0w8#76Y z+)J42)R!iN)GaM7kM4rR`!dG4UjqM@jhq*PoxLDry?!QAd6S5j&qDL7x#@bsB>B;l`;F->q#OUEaw>4smPFbq}OtX0J&N}#en%LaEgzY8UE%*!VLWd=yRII>He!kCU zvQVT7&k~d@onRIah9&nC74oE`Gp?AG`+#!a>f7A-oj81aWIP?A+$60ZCg=Gs3Q!0-AVXp<@wSM={Xuvd)f99Q1yONiiUy{8hd5+W3NU4 z<2=>up4AqfVYJXYm;tr(^OdI3|8C8boqtWQoNMXEdaIYN4NkI}+MP|cSz0lvil z8BoxQLA}8L`mYtQ3jX`uR(5bS-BjH+YaNOEwXbD-YNnDjbfDrH?=G}Am|e~j3&K4X zUcZ}RW}LH$EHZXXJ9{&d#MA=5SJ%Kr!b}{=TR*)f7%IBg;~JSLKl_iO27O|8Pgqws zNH2)gwz~jrK_)6VLY278(3^YrqO;IP{+TqMq&r-t$0 z_2D+cl-gdvK|0`Kev0DMl}?u*_2A(b_?=Wr2;v6_BAmZAqH2*vryruos{UwOUBX`@ zAD~sTVAZ5^1u7v{`1tArXa5du*j6wu2V+6WN0Z-w$^tRI(@H2{678JMD!kdHYkl z;l_2zIMBrw8`s&dVby3fUQ->Zkc6|cM?U%BY@;2C{}^k36r)4|+oHaj5|fj@mvb%h zU2bcdw(Ed^md*SuERJL=E^N^cMHmVAGZG~4)l4F6}8S-rsFo2rG4N<2GDznX9`9PynKRcr;=DI!1XsF$%mgdDp16V zNdYR}BEdsr+lpjFaLG@&P-Tvy|8U?~Sch^bZ{V_6hV zbRuWBptrV3MCH8PZ>M2JtYyB(*C@uZUM1auIj=>>f@p+UjVoB5wTiNMUJ@jaXYVb( zM!1qc=w7ZfFdIaS877|ovP8iNPURS3+t6X=3f9*6U&S}@hTI&Ia_e#0{@>*`iWE86 z36i^ZSA6*)%xae9CS&!fTIr2puKT$f`k5>H^ZGgAI>ne01u2zQ63x{S(2VDYdG|jz zr}P3AS&{fpShH_+A8+-3QY6uGe$h+%Q(2ANY$6p2JPw%&LRD#bT;*vLSxd=o^|I5t z*Heso0(Nz2JS8~muj2?A7)x!wo#Ynjx}(U148#_xM|%|^Y|~t4Jh87k9k&1ljwfbI=y>;w!iLFR;rqmH`M$xTfI$$Y{^er3{F`D z23`hi-%*G{^vZ*X;8j%Q#xWTldRVRf_@h{=1S_en<1`DnPc@zX<+ZAju>S)S+Kxx* zt}0(gTb3z)%yDzqegY*F?3<(6pe3+&vXK`2O0973$!Mlqb|?NzD;Z$_e~EEKX|UMg zqfFtzqU#xZU!w3qVe&7_D~LK;3p?i|IY#nc=lK%vf6`J8)SX_1frmHL_P#EI5RYkD zDuzNHEAKCHrB57-r+YsQ(+3E-yLv%m;~f{{qUYfFXAH~~hQ@mw?>*6&t#FA%rkCDx zR8ky2a*rbaH|-4;Tg4wOxoRn`zi`_g35&gq@$62IMc4xnk+c~7Y)Gf}r#SXMH@vho z<-q*3)d0(r)}AGdglU0&cHmAMLWtd#x38$tDnj)zeNFln3csZyY~)^%N7mGQ)1`ds zh_KuAFH^>)fT0AQ@mD;iG5@wIZMaa|ogsV}KnQTE4bt|`M-!IF;+jI3P&cO#dyjml zuU1R2_Y|;T$if7|+g+<4kfYz~7 zt>{w-xE?TvLXx}g&Z~rKM*~9x%){Nxl{As_T6WM8m4J_wCP$ol;w2oeK@M+^@pOJ0 zbo{p@)>kh$ukYWW=zFS4UyU0&sS~bP$^TZ@DBUMjWu$xQF(d{jp9T~3dHRHl7sA@U z7y+H4V>|B>RN6=g`ELLFv}oENJezWpaxG1q=>czMzCc(Kp@toTm^CQ$+FKvv5GuoQ zW%OQGUSMjF{y+Xg2F`yb3hxqwwrhjr;76bujijy9Ibr7A={w9tr)9kwPviOj3N&w; zw>94D(==}H<+fy6e0{h;--%DB*Ub-|)#5Y5!r4VVc-j1g#>?lEE8WmHQohU1(k)&E zCAUE2h}2pDD811EA<5)5G{tD3&01k9S2tJ6V$G*Rovx>rAx4bOrnNYxfj4<5r5uA+r*(gR{&}wsK>OdrnwYRCP$tR5pS^ZZd9?L?2 zD@fz0|* z^M(UALTZQ2Sg&M-Vt4Rwpe0es$g^kDIWC^Hi~xLJ|9BnPam?ZL! z?n{R6nisRYcB3t!M4$5BpO_LqLQ2yt)_N!1FFoO=C$=zsaYIHME8=a zHB5jHk|ydL;}d~M9fXaQWDk62t})q)ucaOEV+s|`P=nV>d;XKVeno_%KkelQWOhB6 z3xxvqTTn%To-42_&evPNFGqH0wn+h@22kY)(;klGF)Z=qf-(kNYyB@@zBo@Z)(-Z4 z0QHN6kWpse5Yl;{cxTDonb~~F6;@K1Ve2){^j`agx`*^lXfgA6o6mQmpVj^zAJUZR zdtKjuae_p4-s>sg(4f0~00DZ>z*4Bkh}$AkzZZ$!q)-kG2tyfXLt;ti*$K)B4&U7q)R;Zy@)V%=TNie186jJF2!8iU%!t2wpG>bF{2h*a9^5! zpi|6vX+Dg9GhN6&t&gPYUk;zJoZ};KGzdjfwkJ#ctUyRKT~a>)R1^1>G^8 z|9d_1hld}h_Zdc8!G4rR$OLe~ZMniQJ+A0ey>j9(5%Zzsa))ani+zbswG30krt=;2xy_=M+~XLS8pSor3>ZiG7c`lg!7_I) zdn!CzIk+9Y7~~LX0-$M|Fwe~)Tc<1g#6~W0`Dj*vTn4MU)!R(q_%GJO2lrnR7Z#Md zHZ*iYGU0~}gCoBmeF;1y@^!9kV$_bUN^7jSFI+h6#)KUXKE=h4GBCpjDbM4fs(B;PbSD@ibSRxmF#}jH1WCO5<&dsJ ztm0O*CBN>m>Q?tM&pmGT^4&{v&W|QyNHTVm%jgO^6?&V~dE(0e{mu72Gf{l-c@b-u zKi-?ML9~S{-ix(ivml`Rzx)Oh)d!mCf9btB!k#TO?x3md-D~ zFj{`Hd9>wLB@&W8U!8!T;Vq*ebY;e|z2ddO0a(RV6pX7u{opjl_Z_(Zj;>!(=;6K4 zV*p!!jQX>!WWS#lAJ_FsuL$lX$g!CD>B2$gP2*vbaFZ zBYHl~B_co-%q+0iuTW>~(;H@!M%+XNW;XnTVF zXf$>0SY~$aPNX`w>TngOcP=g_@T~P=*-n$(`83Izb~Nfsy}6EdfMfv4&Yz1!Q$-Al z{H{@i53nBAbf*+CL2|Nbz+c7Q8@SSoS9R2s7or^q9}i>r#F_Xcs24u`G-B@*5+9`c zcl>n`;ARo<8&|DD&&+jUmG4TtFWsd1FAJ&pNTWFyx;G9XD^}~`JDkq@{d6)=Btd7C zVV;6Lq2Qr_=l+>ghp7Vod#$&ZY(l$j@SB-Z;ZhsXs&p39qp#WP}6j zOndb^uF-I%SHDQ=0ig5fekZr2$Bz*>ca8+P`09k+IjUBw$5X#u$gr7K$pRw$u|52K zAg$iT&2OU;)PB2dSzsUlNc^71@`<8~PD7qMRRGWHW5Ccf^bX8Wnl3b#E$M702t~YY=pzQyhBk`>J@X+!5C|Ie(@rRLBMd*8Lqd z{GBr)V4ljQX0%gekz* z$Kl$I%?u>6gk?a+>rx$TV2ukPs*wY5pnr3)@{#ymt}f@?mf{7}JN};Zk3F1J+^m2Q zz_`j?IWKZi?U4T>4pvQJvIqv!QYCUiHM*g<_ia70QHpLUFI2&SYDOxpAai$I_m2R2 zV5?h5`O4fY3oR`YoS`X3utNbDeEI(Ft{*&ePFN5ZqA{eOo)F@OAK{PXIRDD%8tdZW zhMS9IDks#%CCvGQV=t+D^n?!%j@2$wCp-V)SYU;JbvjX-V-pXHy@W8K(?R(`#>8)X zq;!n!+!+J+<(hWl;7pHwZEJtrc0+9NQ zv0>*j@4>_31@ra=UY;&S!6S?%0i?nz2HnfDJk7P^lS;jFL+a=)Oz%*;ykZ^hgZr-0 zp4-gP`JAO;{@U>Li&EC6TkxcFUpvx3^i9aXkap#!(`Dplq#Mz`o_?0HVJ`Z&=;5qo ztebI?(vfmNjnsPEPa*|Zo5=<|4NA%Vo%{RLah;w8uI%33to6##R_xMCyGDEScljmd zR8-@mY`)+d9ar$D-oCBJeOl%#fF#+$1-W(P&g)>`6m|)E^}>AOqP)>$n$hN2Ma;#r zO4rs)pA=3&aMJ`ZYqK4%2ywAdGKw@${``c0yYb|g+aRf{aD&aX&4VC|&*~c8ug@jl zorkyZts9#`ZNFZq)qZA7VL7vmj7nuuZsih!9BLHy03HLULI#yZuJ$mwu4?zJy!q;h z>|IXJXW5whO8HKxp{h3}Qw8d>2HvL8HHI%8Ui4Q{E70L$!gvYBdyOKSQ=4x^6j(2D zkw3C?zc+qzrGAu3KXK}a*-CujiG6Nxv05nlkM^?$?@HFdJl&vv4Q6eIL0{c>{o)Yc zV*U1P(BcrdApzwM&F2mo4L^Y>Y4lwB;!}sPGvZ+wo&zGgkQDvS*32qCdLb5mIP@DZ zjC1QkBLdHEj%H7SAh*g5cRdHLh#nB|-TA)l!`AO(&7w1}T}mX0In;2=R*`H<*!Onsg8YIrsVH1v(uJNK!G{pQSnKHmZ9!Igzn|V;bJ>LepBcxmTr6GL`Wv#!q(yw>lb_zX+e&Yul zrQB{Xdk9HbTl?ch3Vql(359=wiJ-`P{Ij~KQ+<2}jaajjB=MS} z64VbfxuY*1JUNYbo$D6!t1}lr9}HW&)eHG&I_{PmpLfWX?V|HUUda7a6ezGy{bMb$HBc`?#HLy5 z9LU~)Jw6=Lg)uGv!LLxcvmTSwWeR5kjXR2rO#|9LGVOMX68NmTyc;Q*N4N5N63pl1 zh!83j<{aJb|I!k&HzK}qy$lq}3Pe9Yz58Mv-juVuW84~o>8oqt{eW?I8wdSL8oJ|m zbz8XyE)Mq&O#rdRM)=AqA5 z*W46h4o?eh-!qhz@bw!CI*d1B_9KMQ>?>NO|J&BS&^9cGYxO~_AZD-O`8nGA>g0xU zYE|^gq%9kVHx()lWMyjg@x0%XB4rH(EVXE7Xw0|3934(#eZ+;$1KZ8?_YP}zGe*6K+l4jBSqsKL(^F*~#d4d_Sy?cZ)ffHf!K1D$i8r2)ldjOHVCpK#B4 z>-6=#hZA^>)`eqMQv7cPH+he&Gn+qaK0>||?DAt60*Kb9i_{ZpN^}Q)c871RUrgL+ zpT_($PUCW%*XoHNWnO9L*cp&rx?!GA-=8itj*=ntyj^h@uk7@wE>t(`8^ii#y>awm zx3GxYCsN==$!Dul{uk4aCJ4*PsUjp*r|W*%E2$?RGxP2T0-GI%SLrjTX@s|LxGfdm z5@YepY}%v4eDn}2Cxl?4HWEJ>a3f^9ZsakT_n}3wzXrO^LN4~D3!1>XN9X(TF^Nfa zDW(k%ay}jn#Rg3dfe@KAQo)N$RX5Jm%JWOQo!kLvcTs+!{uJ!Ou^C?Q5s(Rx*>9ij z#Z^pRi@4n}^r1mIe8kFRyji^QYrv7uV3iOgxc;#{nIAa;nq_0Ly*{)`ye|Yr*llqc z0OfyNqnZ`T3f(GrA5l846R4Exq>m+G~cTZEWr%+lFTRY0LhzB0l@I^XXna?-C`=aECVWY3MJXz0^$)^yV@B`O3a zE`=m%>{VGxc>>z_8p!>K1KA3sH-bH|I(16iVXjfYmlxDObd^Vm%VGy+rN&C-W$!jG zaGX1YqQ(kKPT|;dM|n1=oF0_4;y6xSC@{h&&s_lP0qziCW-*LwQU4EgRAB`T0 z8RsIYsG_G-Gul5pWFzEwY6KlAaIuh&)Mi!q^mHDzTLtyi*6Z8eNh=TcKF~QBjoEsJ z8-DR3k$4Lk9l>e$&tzNMmjHUetX*XXR{L_K;QNm`#xqdo1V$8EsfG z(k6Us50z&BdB^p&W)Ca<+}_~xUU%}Dq5rhMzl~odE9heqnWF2;&$ZDTN@yyv_D0jG zE{bA*UOl;HHW$db(G>xrs{7!z`Id`e84rY0y6?*qjz(Q0_68hkX$Xz@Nqz@l}DzZac;J7S3YJv+@M_ij0q!{jefjKGMtI?y48;2YX~QL*xax% zBD%l4q5DL^@);cD)B^-uRjW8{6o{u^FUpg7-@h1!CWkL98}ZWKuDr&{f~ z%T(_;EMe)H!faxLYJqZ=9FvP9kkf>tOAhJ$drTd4_YhA*#u%PX{Iy%6Iv%6k)~#O{ zIcj%cHpn>SQ_o`_oyEX+n&dMi+maFWoNGb#98^6LR9P^1(#Z?up>A*aHwSK{Y$@kh zD*z-J=}KFlpLs)1(#x}2Qfoe?nfaRgZD`G?_6A4M%<2;Cf@Ed*tDTj|-dK(9l?KD|!6+4+=#PnOC%7t-tb`Q)8+hD8jrhc<&%>W?V=ytP(jDM?z54o9Cm zorjN?XUwV?f)E2@q>r0ur!g9gs6OC!UEZ?zt~FY3ziII}J%4^{0rhCWT7 zh-?0!`(IH+Ti=4(6$WNQV6h0-yO56W$!pgFX|9E%rerY~G!kbg;U$Q2%=T7@MN9KG zH0=I!f>Th3dUME4KCIfaK+a1$2)7(sW#53OZ+ctz#e z7s(v1jJEGO9=fns5&l;IUS5xV%66uvKc3>a?b5?=5Fx~ycX3~7`E}7#eSX1v&JhrJ zg0drH5(T(CYK9Q%VI;Ey94hMX%N^6Mc3@Udu=Ta=Y93E0tlTjCW25{=Zn?UYyOXEs zJjH}whx3VL!m-sWm>2@ySIlI}bKPqDOSvzDv%2>GSfX})R&x#;zGa~J%=RzVn?vUQ zg?C+{0FV|8z_meadRx&F6(qZmc19n`pxvBHjmabVht!q&8jc-B%|NSBi)vAL0G}Oi z`ZjMo(;nBR!iT^+|H&b#Ah>cGIv#%*xs~d8r3b zT7Ltg4jjI9oDfRoaCqK`Xf#+MV#7K@;9LImEoWl)wYrlC&tTUZ&n@ZD_9ZEe_oFv; z;&G(Z6(>JfOZF5dOj;k#6C95tXk-(2QRu#q!i=rboz!@=C&WBG#RIZ90K5_HU9mzd z4Iadzf%Jo3rXCv9B?ZHMD@!m{h}*QrmyYNGQZPKoh`9Ewpg*#2{wFPh?#kQWYoppM z$q(gs`nzyTr^LkIhOT8VX_Jd>7A~P_`?nPeppEI=$7n6@v{8dnA78S;zp+&o0ZuXt zM9R9xBR3vOtPPC6E~}% zh0=!RXu?mKuM?@anCSSl&%)!_x2FEobiQ<~#>LdV0LJqTk9IT)=h`m`{hJP;k0zO7 z)b%sIRGxU$-y&P6>A05Ugt~JSRk0_gL!6^yC*ueqWGHC=F*1B`5+A^G(j5DrR4)WS zvV0U86ym`CDEvktm0w?nDV>J(Tvhtp{VV3Wl%8BvT05#gux;Ot#C57-XEE)?cg1YY z{yvg1b{kpF<|wYXZ_3;ANe}7s-QoIZv4bCG50bHmv)X@-{%FS@xhHAWH;ws?dIbv= zgW~;1lL;XQ{yY zHu>UJq?$xHA+-3d5e~z-Hu%0TzF#QJ3I2F9llpEDi^|2~_3@jT;x`rPH_>iKyaSi> z^1ntDoCFY*A$O(%DeD%7GziH%nux<9zDhr<`E}KTonN$BfJuEmbN##fhzNfyZ;Lc8 zdIUL=qikOV1EY7s1Ah4Z{&Fl>{DLb>LN@Uouz7x3n@`9Xo)lo~c1J3E%8J6~>Jg** zBj1iE<|tLx4wQ?W8p>`H%-wOn5FSsjo=+Rm4?W&BFbHpPEuiUJ9EwPhRqt z!Jty#kHPpdTbY)<6O~F2b-JYdh>6OL=xuLtJ=(N>-hK@pHsUe=+i_ekxIw|;)sXr! zNngxPA$qal(*tJiV`hug*RA^krAw5zkdBvlK1+x%I~x&l+OHib{J5-p>O_@_ zGB8k4!?Vu_;Zkv7iEdg)W2r4p&3n{1F87F%(>_Q9F=M?y41xiXgrHkRg!;X9!dHEn8;GV;Ho^qcv$V$_mwex04Z;WdFCO=VZgklaLdX%0y&2% zo(k_4HVt{y(EK|_=>GEGgk@g5kYVun>3($!*G>RKkA?C;p3jExqfs$> zYtr^laRSc;zHE2Xxk|MRO+Q1ef8MPV3(FN0@7m!EdG&rrvBOy~@zVT^ocJ3a(hH7* z1`(LWkSYCq&c&}D;^d+Q%9D#BoFwW+#>mCwunk-9laUNTDY0NcO|a|a58ZD>po{2Q z%ARJRNrH{jLm-+Fo1O>oV=>_(3^CWJ%_fK*J*iBO(Pig>63A%y!#VObpfcEPa?$H8 z+VpS;6*fX>!FtS(q%Y_kxNzg>KojG?Hw{{G`aeBgXE+?p8Wm-U-dRLjb+stb`wFYq zwc*oQU4jULh}CSEHVg=zah$TF-+4(KKl#7YGj;H5 zVmyadwj`w)UPq+7hlQ{+l;Lp8Yt$8f-S_#~^Rf0C0_gcV3A|?~^@0L4?jUSRwB|_` zJ$|FR_S!Js9^w^5za~8kB3}pj6EX8K+0L>XmPB$@!P2<^fSA2_kVC8MgB0+rp%oco z;A1+Pj?BIa#z`6d=99a0{JAuIo?ZlXUZ~_bn$8%1ao$b9XU}pG$3W}xLGhCRC{W*K zBB$I^pZbhR6IbL$yHi2r4n!%&U(9FvF4tWGz+FxCj4JUTD4=j7MaZE0Ivqw%QEtuO7GSg z*Rex5cO2(~LlDOj(MkSRw=@Yfvp)p=USfdUaVUs&xFB(`K>wNM8-^WIcuf$~tgrWq zJe%2(-COA|q;`kgi9Nj`N9V0(mvgJ{FdNk2V9y0>3DS zqlP=qAn7)(5eJ8YN>fe6WbBaQ`raoS?3eBg-s|qR&3C%GFe-K}i?2Sp$i`&eKU}p- z4;i+k4tz2rxn2E4_o1{)9Fz{_{%-pn{oAw z;zT@l?gSOcWM;&+6w}KFf1&YTucan)=Tp~xtH9v(u+g~eQt`6AZsLf5bOfiu&Tq2A zZ@V)D4~IpZ$@;M6lc#8W4@_li9KwQ-$du&pLSv`Msn2ghxd`#;1hnc^x&1hVoe&b%-kst_99hQ?9rzG@U8cJJ;KvOYewFK_v4();x#d&ouZn^(i=ogUG&dDQa%qsmT$ z-BP!-nZ_CJV6ZETC(lO~Ya#=X6$bXi!>R9H!9n-D((&IVO*aza!9UOXQ!JjjPVGV! z<3`W7TO`*(*j z+$i_y$kaf$r(dQ|teRy9_PGcEvNZff%;drtLK{j3&d)R$~bg8n_5)bi_C47$qL=VdfsiV04+bf@t+I;wBmZeF_k^q&J>@?KXYEPidCjd>Uc} zOg(M2yT`4T7Y}_snwz+*)(f+khYsr#IsIz$F(NN9#Ri<=7=?7mFO~$uuOU|o4kRZA zTiEY6`0pQdF>;}&`^6Jp&a-MCNhlfssW?+sUe1f8`HS^nK(+ip}VpQ2(H{^O5 zV0L=DhIghy$|8PfEn9x8S0j57c_)vYn6fN%R+cD5;~&i>J1A}PL`Gmb(b~plk=E+Xcn+s4H2$|wFN+DEt3hdeGkC(%_Ql4F;@OCS7URwmPCdU^b|KPdj`Z*9vrB}A z26-kECrZLR))pP`*OfFOB8)^_+FkD_PbFUoMj%yys7XW&oP|N(cr7G6D1c*B{$|uA z{%GHa?1G_p^W?mLd!%~%1d+KN^!}|&c$SW**E(N2FX;uhEh|LG4B%1!Xtv|4E+x^NzdChA z_NA!1W3iO;c4<@maNZ|8dfZ9f`Re3g{6I&U363nV<`{j}i`-XMZ3@duaucQ|%|Wd% zmz-OgD9$teu&qV)loeffeq0&&p9sKK?skc!(Hh(u-1Iy8^SjFP&j~b_%f7g9m<>Y7 zh#LmQz`7C}XgZ`muqo_eZeTqyui;odB^!-dwWhvUi!3| z9LRNTI@G(u52M^T)8sW!&z>aA>ht|8>5=ys6DV=P_JJPB@4CX{iY{$?hH<=-8>7tk zOW6JjysF}wwa#Ac<(9fk2wbEwXp&3^+{qoktEJQ8UrpUTH0GfL50b32=Kg+Anf2rd zn9T(p#0wVWrLjnY(ffxfB@11p0ZN3`2y~-9DhpR+hh81gFjh0H9&wIBb~nibdu&xD z#d?&O!D&wa(|!isR3S!1fKyNi`wx>GshJdFIv%qM(Lv;Wi5p`x!NOXP&&6yw=iAZ= z-v9*hzprrkYkk5T7}W^zZMW#D3y`JiOxBX7w1tN4-DLRT!d#x*RK*d(+yXnQq4(p9 zvYDk%qV{Q2_x8xn^&BSY#g*%G9Xo_uN zx-e#Rv#w~k96H>k(Hu?jrRHluZ{q|(9G-fl&)`rPN7Cu-^h$z7huiI};oD9a=aVmP z0Idx2wO}#iGgTnOORbRat}4S*u_37*4rCypae}9q`G&wF751&UKEH%rJkTccrLTqH z{9gt5nlgIP%cOb5v$Q#EOZyBQZNz^mTS<*4Ngt*44~;=4uuq8)U{YvOdivQ@m#1el z;P#4h(h^Q*YQ_<|fzB@7{40GllA_=DVvc zs=wHSt!4aY~$gjV+I7!~KC^xxBJsKk5<94&S`-5pUp@VXOYt;LqAbg6m6t{f` zWJX_*O!$1VyQ7`J?fz|qevevAJ zEk3S2wcx2LTxwj*_ymq8x6DCsNOEcy z@gGOvGZo+d!Ghn+iLqGu>URXb(aPr}F9h$aQugC|4er>|FnVBrNBQJ|gE{->Q;s_# z>r}BrP>cwDpcx|aCB9%B(_hZOhHGLpc7JTb!Nsx=?9&$*o9CJ;Zl%{GgCJDAUwIRu zazMwIHMQ^(3_Cl4lQE;-Nj!8tEu#9xl75g7JWujr+^Nj@MWn*Tv|I6>`3N>xW7&|Q z#YqR2TL-zvQA+MN%@@CadhoGPKgR8vH#OA_|BnBx&D~DG%CTf4GgYd<;;GQibdX$- zu-jH?ant1npkM3nnJp=WYhttFp9pSr4%Xric(^ljZ`MOgQ}&Gc!)n6IQB$F+cOI^t z;=qwhIRx`UIfMI8M2k6$*&&w^&e*LS(|jZ!d7r&k1yo^7!)?csv#X-Xp$Y@z4W|W@p3_S(Cb!~qq`W~l5~17 z#RjP*rHbIZbY8Dm-SdS_hwNeFt$bwpzSsAb4=nmy%jk?MeIDWeH+6^-`S59FysPNX4_3c@T^xQ)ifpt*|O4LP}P{C_%Dj)?F( zE}WIxbfUKqeXt>ixltbdWQP6?WS)+v2cejD2?euluZ6nO^W`u;gcw`KLap*wmwVz@ zCq?!$|E`4yx#JFZ{z`alY|l#kDpo{LVB*~Ap=ZnODo&@HUYYW;rOa%9UL_h9I%Oi- z$6zvMo_(-&aYFYf@{e7pKve#Mbs%z}j5r~nnNXIhP%J!~))2+~xK|W$D8~$419{Tw@OIU~w+pk6?o4UV#4pE!|B(F7w1^O?HSxeV-r!^c zb9&MD7fXKLqzy&Kxbk4QLDyyrZ3$xuEx0L!3~&~dt0gM(^!;nnim1{J9)Upb&Gr%O z-o*WXZ;0=J!B0FjoURuJoio4?=Ygxf4)3)sIyO6|h`aj+s6$RV;en@;g*gxrOg!)J}-mAX|* zby1nC2rg`ixw2SN3LRt8}zKEmDe_U*tMwXVN3Cm$d5 zb;iPxuwukWT@vlue54-?C-2o9CDCPsl~+dgaF(I&*&lMv-623~Zwwqo48yCFRj`yo zFVGhiNw#<4{@>hkQ)Wjv5$5%2M)?3&UrSJYtRp79w&vAM{iS&Ri0sCiS0DXL=^Sb< z;l??dCF$$UgT-E={D|_^AH^KNp0w$qXGVpH|kT^Iw_DYij5A;OE?(xH~2@w^SQ~VIj+|FCf@Kcf2Qbf{O`#*#v?ISQxk0t=b?Kl zpa*-*6;^LzC9vcMk3*XY_aAB8s}w>MruZkf&G9k7ER{#MSAl;t>p>bvk778HmR351 z!X#I_8N=71mrJ_dAqpVapmAAgjj75L9Ud2x{MMXLVPk4qgn>PipH#uS7(L`AR{uBR z>5(WeYsPhqKp)Gy+e(tQpT4nPGg9_J+!r2~f>Oo@W+B8y7BWyWK)uQ)c&7Fr_>Y!# z`oUp=yoAAHEC$;MsB~Vh83X(m`=`2#n@>rBmxh%@`%!EGA>u1t)0=hIh=GaK00Lh{ y0KsoHU=?gS-VoB-rta^zwi)4Ihvq{)wHj5M(EkAai^=Bz literal 0 HcmV?d00001 diff --git a/documentation/docs/developer_guide/contribution/resources/how_to.md b/documentation/docs/developer_guide/contribution/resources/how_to.md index 84a3e7c49..f9d5a09e8 100644 --- a/documentation/docs/developer_guide/contribution/resources/how_to.md +++ b/documentation/docs/developer_guide/contribution/resources/how_to.md @@ -81,4 +81,11 @@ Once you push at least one commit to a new branch, you can create a pull request ![how describe pr](../../../assets/describe_pr.png){ width="90%", align=right } +## Ask a review + +To ask for a review, on the pull request screen, click on the Reviewers menu or its cog icon and choose the `CABLE-LSM/reviewers` team: +
+ ![how request review](../../../assets/request_review.png){ width="90%", align=right } +
+ [CABLE-repo]: https://github.com/CABLE-LSM/CABLE diff --git a/documentation/docs/developer_guide/contribution/review_guide.md b/documentation/docs/developer_guide/contribution/review_guide.md index 9744cbeab..2ab8258eb 100644 --- a/documentation/docs/developer_guide/contribution/review_guide.md +++ b/documentation/docs/developer_guide/contribution/review_guide.md @@ -1,5 +1,27 @@ # Review guidelines -!!! note "Available soon" +All contributions to the CABLE land surface model will be reviewed before inclusion in the model. The review process is intended to check: - The documentation is still a work in progress. This section will be made available soon. +- [the coding standards][coding-standards] have been applied +- the documentation is understandable and follows at least the [minimum requirements][doc-min-req] +- [the required test results][tests-req] are provided +- the proposed changes address the problem explained in the issue and only this problem +- the proposed changes are correct +- the implementation of the changes follows the design of the CABLE model and will be maintainable + +Once you have finished the implementation of your changes, please make sure the description of the pull request is up-to-date. Ensure all the required test results are either linked to in comments or copied in. If you have performed tests beyond the required tests, make sure these tests and their results are described in comments in your pull request. + +Once you are ready, [ask for a review by `CABLE-LSM/reviewers`][how-review]. If you want a specific individual who isn't part of the reviewers team to review your pull request, you can use the same process. However, a following review from the reviewers team will be necessary to accept the changes. + +## Review process + +The reviewers team will try and reply to review requests quickly. If you think your review request has been lost, please ask for an update as a comment on your pull request and mention your reviewer (with @). + +The review is likely to be an iterative process between the reviewer and the reviewee. As such, it would be appreciated if the reviewee is responsive once the review process starts. Make sure to keep discussions polite and courteous. Reviewees can reject suggestions from reviewers but the reasoning has to be explained and the rejection has to be agreed to by the reviewer. + +Once a reviewer has given you a written agreement the pull request is ready to be merged, you can merge it. We prefer if the author of the code changes merges the pull request as that leaves them a last chance to change their mind if they discover a reason not to go ahead with the changes. However, the admins team will periodically merge any approved pull request that has not been merged. + +[coding-standards]: ../other_resources/coding_standards.md +[doc-min-req]: ../documentation_guidelines/index.md +[tests-req]: testing.md +[how-review]: resources/how_to.md#ask-a-review From 8ff8a986a97e4e3d883eb0ce2c3453110e28da9f Mon Sep 17 00:00:00 2001 From: Matthias Cuntz Date: Tue, 12 Mar 2024 14:13:44 +0100 Subject: [PATCH 02/85] Remove 'Nonconforming tab character' --- src/offline/CASAONLY_LUC.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/offline/CASAONLY_LUC.F90 b/src/offline/CASAONLY_LUC.F90 index 3772ee147..62103fba6 100644 --- a/src/offline/CASAONLY_LUC.F90 +++ b/src/offline/CASAONLY_LUC.F90 @@ -278,7 +278,7 @@ SUBROUTINE CASAONLY_LUC( dels,kstart,kend,veg,soil,casabiome,casapool, & .FALSE. , .TRUE. , count_sum_casa) CALL WRITE_CASA_OUTPUT_NC ( veg, casamet, sum_casapool, casabal, sum_casaflux, & - .TRUE., ctime, ( idoy.EQ.mdyear .AND. YYYY .EQ. & + .TRUE., ctime, ( idoy.EQ.mdyear .AND. YYYY .EQ. & cable_user%YearEnd ) ) count_sum_casa = 0 CALL zero_sum_casa(sum_casapool, sum_casaflux) From 77fa6600364ca1bb88ccaf4bee4452c4a45104b8 Mon Sep 17 00:00:00 2001 From: Matthias Cuntz Date: Tue, 12 Mar 2024 14:14:03 +0100 Subject: [PATCH 03/85] Remove 'Nonconforming tab character' --- src/offline/cable_LUC_EXPT.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/offline/cable_LUC_EXPT.F90 b/src/offline/cable_LUC_EXPT.F90 index d4059781a..c4229b467 100644 --- a/src/offline/cable_LUC_EXPT.F90 +++ b/src/offline/cable_LUC_EXPT.F90 @@ -15,7 +15,7 @@ MODULE CABLE_LUC_EXPT END TYPE LUC_INPUT_TYPE TYPE LUC_EXPT_TYPE - CHARACTER(len=200):: TransitionFilePath,ClimateFile, Run + CHARACTER(len=200):: TransitionFilePath,ClimateFile, Run LOGICAL :: DirectRead, READrst, WRITErst LOGICAL, ALLOCATABLE :: prim_only(:) LOGICAL, ALLOCATABLE :: ptos(:), ptog(:), stog(:), gtos(:) From 563906f5a917f30023032593d2aaeb766db2c67d Mon Sep 17 00:00:00 2001 From: Matthias Cuntz Date: Tue, 12 Mar 2024 14:15:59 +0100 Subject: [PATCH 04/85] Remove 'Nonconforming tab character' and 'continued character constant' --- src/offline/cable_output.F90 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/offline/cable_output.F90 b/src/offline/cable_output.F90 index 7845f95a6..62014905b 100644 --- a/src/offline/cable_output.F90 +++ b/src/offline/cable_output.F90 @@ -877,8 +877,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) IF(output%casa) THEN CALL define_ovar(ncid_out, ovid%NBP, 'NBP', 'umol/m^2/s', & - 'Net Biosphere Production & - (uptake +ve)', patchout%NBP, & + 'Net Biosphere Production (uptake +ve)', patchout%NBP, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%NBP(mp)) out%NBP = 0.0 ! initialise @@ -1486,7 +1485,7 @@ SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ss TYPE(casa_flux), INTENT(IN) :: casaflux ! casa fluxes TYPE(casa_pool), INTENT(IN) :: casapool ! casa fluxes TYPE(balances_type), INTENT(INOUT) :: bal - TYPE (casa_met), INTENT(IN) :: casamet + TYPE(casa_met), INTENT(IN) :: casamet REAL(r_2), DIMENSION(1) :: timetemp ! temporary variable for storing time ! value From ec743530059744e9b995517905f5efa44c7c1a5e Mon Sep 17 00:00:00 2001 From: Matthias Cuntz Date: Tue, 12 Mar 2024 14:16:08 +0100 Subject: [PATCH 05/85] Remove 'Nonconforming tab character' and 'continued character constant' --- src/offline/cable_driver.F90 | 427 +++++++++++++++++------------------ 1 file changed, 210 insertions(+), 217 deletions(-) diff --git a/src/offline/cable_driver.F90 b/src/offline/cable_driver.F90 index c7f040a39..c16038859 100644 --- a/src/offline/cable_driver.F90 +++ b/src/offline/cable_driver.F90 @@ -13,62 +13,62 @@ ! Contact: Bernard.Pak@csiro.au ! ! History: Since 1.4b, capability to run global offline (ncciy = YEAR), -! inclusion of call to CASA-CNP (icycle>0) -! exclusion of call to cbm (icycle>10) -! soil_snow_type now ssnow (instead of ssoil) +! inclusion of call to CASA-CNP (icycle>0) +! exclusion of call to cbm (icycle>10) +! soil_snow_type now ssnow (instead of ssoil) ! ! ! ========================================untitled====================================== -! Uses: cable_def_types_mod -! cable_IO_vars_module -! cable_common_module -! cable_input_module -! cable_output_module -! cable_cbm_module -! casadimension -! casavariable +! Uses: cable_def_types_mod +! cable_IO_vars_module +! cable_common_module +! cable_input_module +! cable_output_module +! cable_cbm_module +! casadimension +! casavariable ! ! CALLs: open_met_file -! load_parameters -! open_output_file -! get_met_data -! casa_feedback -! cbm -! bgcdriver -! sumcflux -! write_output -! casa_poolout -! casa_fluxout -! create_restart -! close_met_file -! close_output_file -! prepareFiles +! load_parameters +! open_output_file +! get_met_data +! casa_feedback +! cbm +! bgcdriver +! sumcflux +! write_output +! casa_poolout +! casa_fluxout +! create_restart +! close_met_file +! close_output_file +! prepareFiles ! ! -! input file: [SiteName].nc -! poolcnpIn[SiteName].csv -- for CASA-CNP only -! gridinfo_CSIRO_1x1.nc -! def_veg_params.txt -! def_soil_params.txt -- nearly redundant, can be switched on -! restart_in.nc -- not strictly required +! input file: [SiteName].nc +! poolcnpIn[SiteName].csv -- for CASA-CNP only +! gridinfo_CSIRO_1x1.nc +! def_veg_params.txt +! def_soil_params.txt -- nearly redundant, can be switched on +! restart_in.nc -- not strictly required ! ! output file: log_cable.txt -! out_cable.nc -! restart_out.nc -! poolcnpOut.csv -- from CASA-CNP +! out_cable.nc +! restart_out.nc +! poolcnpOut.csv -- from CASA-CNP !============================================================================== PROGRAM cable_offline_driver USE cable_def_types_mod - USE cable_IO_vars_module, ONLY: logn,gswpfile,ncciy,leaps, & - verbose, fixedCO2,output,check,patchout, & + USE cable_IO_vars_module, ONLY: logn,gswpfile,ncciy,leaps, & + verbose, fixedCO2,output,check,patchout, & patch_type,landpt,soilparmnew,& defaultLAI, sdoy, smoy, syear, timeunits, exists, calendar USE casa_ncdf_module, ONLY: is_casa_time USE cable_common_module, ONLY: ktau_gl, kend_gl, knode_gl, cable_user, & - cable_runtime, filename, myhome, & - redistrb, wiltParam, satuParam, CurYear, & - IS_LEAPYEAR, calcsoilalbedo, & + cable_runtime, filename, myhome, & + redistrb, wiltParam, satuParam, CurYear, & + IS_LEAPYEAR, calcsoilalbedo, & kwidth_gl, gw_params USE cable_namelist_util, ONLY : get_namelist_file_name,& @@ -79,17 +79,17 @@ PROGRAM cable_offline_driver USE cable_phys_constants_mod, ONLY : CEMSOIL => EMSOIL USE cable_phys_constants_mod, ONLY : CSBOLTZ => SBOLTZ - USE cable_input_module, ONLY: open_met_file,load_parameters, & - get_met_data,close_met_file, & - ncid_rain, & - ncid_snow, & - ncid_lw, & - ncid_sw, & - ncid_ps, & - ncid_qa, & - ncid_ta, & + USE cable_input_module, ONLY: open_met_file,load_parameters, & + get_met_data,close_met_file, & + ncid_rain, & + ncid_snow, & + ncid_lw, & + ncid_sw, & + ncid_ps, & + ncid_qa, & + ncid_ta, & ncid_wd,ncid_mask - USE cable_output_module, ONLY: create_restart,open_output_file, & + USE cable_output_module, ONLY: create_restart,open_output_file, & write_output,close_output_file USE cable_write_module, ONLY: nullify_write USE cable_IO_vars_module, ONLY: timeunits,calendar @@ -98,22 +98,22 @@ PROGRAM cable_offline_driver USE cable_climate_mod ! modules related to CASA-CNP - USE casadimension, ONLY: icycle - USE casavariable, ONLY: casafile, casa_biome, casa_pool, casa_flux, & + USE casadimension, ONLY: icycle + USE casavariable, ONLY: casafile, casa_biome, casa_pool, casa_flux, & !mpidiff casa_met, casa_balance, zero_sum_casa, update_sum_casa - USE phenvariable, ONLY: phen_variable + USE phenvariable, ONLY: phen_variable ! vh_js ! ! modules related to POP - USE POP_Types, ONLY: POP_TYPE + USE POP_Types, ONLY: POP_TYPE USE POPLUC_Types, ONLY : POPLUC_Type USE POPLUC_Module, ONLY: WRITE_LUC_OUTPUT_NC, WRITE_LUC_OUTPUT_GRID_NC, & POP_LUC_CASA_transfer, WRITE_LUC_RESTART_NC, POPLUC_set_patchfrac - USE POP_Constants, ONLY: HEIGHT_BINS, NCOHORT_MAX + USE POP_Constants, ONLY: HEIGHT_BINS, NCOHORT_MAX ! PLUME-MIP only - USE CABLE_PLUME_MIP, ONLY: PLUME_MIP_TYPE, PLUME_MIP_GET_MET,& + USE CABLE_PLUME_MIP, ONLY: PLUME_MIP_TYPE, PLUME_MIP_GET_MET,& PLUME_MIP_INIT USE CABLE_CRU, ONLY: CRU_TYPE, CRU_GET_SUBDIURNAL_MET, CRU_INIT @@ -140,99 +140,99 @@ PROGRAM cable_offline_driver ! defaults to using cable.nml if no file specified ! timing variables - INTEGER, PARAMETER :: kstart = 1 ! start of simulation - INTEGER, PARAMETER :: mloop = 30 ! CASA-CNP PreSpinup loops + INTEGER, PARAMETER :: kstart = 1 ! start of simulation + INTEGER, PARAMETER :: mloop = 30 ! CASA-CNP PreSpinup loops INTEGER :: LALLOC ! allocation coefficient for passing to spincasa - INTEGER :: & - ktau, & ! increment equates to timestep, resets if spinning up + INTEGER :: & + ktau, & ! increment equates to timestep, resets if spinning up ktau_tot, & ! NO reset when spinning up, total timesteps by model - kend, & ! no. of time steps in run - !CLN kstart = 1, & ! timestep to start at + kend, & ! no. of time steps in run + !CLN kstart = 1, & ! timestep to start at koffset = 0, & ! timestep to start at koffset_met = 0, & !offfset for site met data ('site' only) - ktauday, & ! day counter for CASA-CNP - idoy, & ! day of year (1:365) counter for CASA-CNP - nyear, & ! year counter for CASA-CNP - casa_it, & ! number of calls to CASA-CNP - YYYY, & ! - RYEAR, & ! - RRRR, & ! - NRRRR, & ! - ctime, & ! day count for casacnp - LOY, & ! days in year + ktauday, & ! day counter for CASA-CNP + idoy, & ! day of year (1:365) counter for CASA-CNP + nyear, & ! year counter for CASA-CNP + casa_it, & ! number of calls to CASA-CNP + YYYY, & ! + RYEAR, & ! + RRRR, & ! + NRRRR, & ! + ctime, & ! day count for casacnp + LOY, & ! days in year count_sum_casa, & ! number of time steps over which casa pools & !and fluxes are aggregated (for output) wlogn = 10001 - REAL :: dels ! time step size in seconds + REAL :: dels ! time step size in seconds INTEGER,DIMENSION(:,:),ALLOCATABLE :: GSWP_MID - CHARACTER :: dum*9, str1*9, str2*9, str3*9 + CHARACTER :: dum*9, str1*9, str2*9, str3*9 ! CABLE variables - TYPE (met_type) :: met ! met input variables - TYPE (air_type) :: air ! air property variables - TYPE (canopy_type) :: canopy ! vegetation variables - TYPE (radiation_type) :: rad ! radiation variables + TYPE (met_type) :: met ! met input variables + TYPE (air_type) :: air ! air property variables + TYPE (canopy_type) :: canopy ! vegetation variables + TYPE (radiation_type) :: rad ! radiation variables TYPE (roughness_type) :: rough ! roughness varibles - TYPE (balances_type) :: bal ! energy and water balance variables + TYPE (balances_type) :: bal ! energy and water balance variables TYPE (soil_snow_type) :: ssnow ! soil and snow variables !mpidiff - TYPE (climate_type) :: climate ! climate variables + TYPE (climate_type) :: climate ! climate variables ! CABLE parameters TYPE (soil_parameter_type) :: soil ! soil parameters TYPE (veg_parameter_type) :: veg ! vegetation parameters - TYPE (sum_flux_type) :: sum_flux ! cumulative flux variables - TYPE (bgc_pool_type) :: bgc ! carbon pool variables + TYPE (sum_flux_type) :: sum_flux ! cumulative flux variables + TYPE (bgc_pool_type) :: bgc ! carbon pool variables ! CASA-CNP variables - TYPE (casa_biome) :: casabiome - TYPE (casa_pool) :: casapool - TYPE (casa_flux) :: casaflux - TYPE (casa_pool) :: sum_casapool - TYPE (casa_flux) :: sum_casaflux - TYPE (casa_met) :: casamet - TYPE (casa_balance) :: casabal - TYPE (phen_variable) :: phen + TYPE (casa_biome) :: casabiome + TYPE (casa_pool) :: casapool + TYPE (casa_flux) :: casaflux + TYPE (casa_pool) :: sum_casapool + TYPE (casa_flux) :: sum_casaflux + TYPE (casa_met) :: casamet + TYPE (casa_balance) :: casabal + TYPE (phen_variable) :: phen ! vh_js ! - TYPE (POP_TYPE) :: POP + TYPE (POP_TYPE) :: POP TYPE(POPLUC_TYPE) :: POPLUC TYPE (PLUME_MIP_TYPE) :: PLUME TYPE (CRU_TYPE) :: CRU TYPE (site_TYPE) :: site TYPE (LUC_EXPT_TYPE) :: LUC_EXPT TYPE (landuse_mp) :: lucmp - CHARACTER :: cyear*4 - CHARACTER :: ncfile*99 + CHARACTER :: cyear*4 + CHARACTER :: ncfile*99 ! declare vars for switches (default .FALSE.) etc declared thru namelist - LOGICAL, SAVE :: & - vegparmnew = .FALSE., & ! using new format input file (BP dec 2007) - spinup = .FALSE., & ! model spinup to soil state equilibrium? - spinConv = .FALSE., & ! has spinup converged? - spincasa = .FALSE., & ! TRUE: CASA-CNP Will spin mloop times, + LOGICAL, SAVE :: & + vegparmnew = .FALSE., & ! using new format input file (BP dec 2007) + spinup = .FALSE., & ! model spinup to soil state equilibrium? + spinConv = .FALSE., & ! has spinup converged? + spincasa = .FALSE., & ! TRUE: CASA-CNP Will spin mloop times, ! FALSE: no spin up - l_casacnp = .FALSE., & ! using CASA-CNP with CABLE - l_landuse = .FALSE., & ! using CASA-CNP with CABLE - l_laiFeedbk = .FALSE., & ! using prognostic LAI - l_vcmaxFeedbk = .FALSE., & ! using prognostic Vcmax - CASAONLY = .FALSE., & ! ONLY Run CASA-CNP - CALL1 = .TRUE., & + l_casacnp = .FALSE., & ! using CASA-CNP with CABLE + l_landuse = .FALSE., & ! using CASA-CNP with CABLE + l_laiFeedbk = .FALSE., & ! using prognostic LAI + l_vcmaxFeedbk = .FALSE., & ! using prognostic Vcmax + CASAONLY = .FALSE., & ! ONLY Run CASA-CNP + CALL1 = .TRUE., & SPINon= .TRUE. - REAL :: & - delsoilM, & ! allowed variation in soil moisture for spin up - delsoilT ! allowed variation in soil temperature for spin up + REAL :: & + delsoilM, & ! allowed variation in soil moisture for spin up + delsoilT ! allowed variation in soil temperature for spin up INTEGER :: Metyear, Y, LOYtmp REAL :: delgwM = 1e-4 ! temporary storage for soil moisture/temp. in spin up mode REAL, ALLOCATABLE, DIMENSION(:,:) :: & - soilMtemp, & + soilMtemp, & soilTtemp REAL, ALLOCATABLE, DIMENSION(:) :: GWtemp @@ -241,33 +241,33 @@ PROGRAM cable_offline_driver REAL:: etime ! Declare the type of etime(), For receiving user and system time, total time REAL, allocatable :: heat_cap_lower_limit(:,:) ! switches etc defined thru namelist (by default cable.nml) - NAMELIST/CABLE/ & - filename, & ! TYPE, containing input filenames - vegparmnew, & ! use new soil param. method - soilparmnew, & ! use new soil param. method - calcsoilalbedo, & ! albedo considers soil color Ticket #27 - spinup, & ! spinup model (soil) to steady state + NAMELIST/CABLE/ & + filename, & ! TYPE, containing input filenames + vegparmnew, & ! use new soil param. method + soilparmnew, & ! use new soil param. method + calcsoilalbedo, & ! albedo considers soil color Ticket #27 + spinup, & ! spinup model (soil) to steady state delsoilM,delsoilT,& ! delgwM, & - output, & - patchout, & - check, & - verbose, & - leaps, & - logn, & - fixedCO2, & - spincasa, & - l_casacnp, & + output, & + patchout, & + check, & + verbose, & + leaps, & + logn, & + fixedCO2, & + spincasa, & + l_casacnp, & l_landuse, & - l_laiFeedbk, & - l_vcmaxFeedbk, & - icycle, & - casafile, & - ncciy, & - gswpfile, & - redistrb, & - wiltParam, & - satuParam, & + l_laiFeedbk, & + l_vcmaxFeedbk, & + icycle, & + casafile, & + ncciy, & + gswpfile, & + redistrb, & + wiltParam, & + satuParam, & cable_user, & ! additional USER switches gw_params @@ -276,11 +276,11 @@ PROGRAM cable_offline_driver ! Vars for standard for quasi-bitwise reproducability b/n runs ! Check triggered by cable_user%consistency_check = .TRUE. in cable.nml - CHARACTER(len=30), PARAMETER :: & - Ftrunk_sumbal = ".trunk_sumbal", & + CHARACTER(len=30), PARAMETER :: & + Ftrunk_sumbal = ".trunk_sumbal", & Fnew_sumbal = "new_sumbal" - DOUBLE PRECISION :: & + DOUBLE PRECISION :: & trunk_sumbal = 0.0, & ! new_sumbal = 0.0, & new_sumfpn = 0.0, & @@ -315,7 +315,7 @@ PROGRAM cable_offline_driver WRITE(*,*) "THE NAME LIST IS ",CABLE_NAMELIST ! Open, read and close the namelist file. OPEN( 10, FILE = CABLE_NAMELIST ) - READ( 10, NML=CABLE ) !where NML=CABLE defined above + READ( 10, NML=CABLE ) !where NML=CABLE defined above CLOSE(10) ! Open, read and close the consistency check file. @@ -344,13 +344,11 @@ PROGRAM cable_offline_driver ELSEIF ( CABLE_USER%YearStart.EQ.0 .AND. ncciy.EQ.0) THEN PRINT*, 'undefined start year for gswp met: ' PRINT*, 'enter value for ncciy or' - PRINT*, '(CABLE_USER%YearStart and CABLE_USER%YearEnd) & - in cable.nml' + PRINT*, '(CABLE_USER%YearStart and CABLE_USER%YearEnd) in cable.nml' WRITE(logn,*) 'undefined start year for gswp met: ' WRITE(logn,*) 'enter value for ncciy or' - WRITE(logn,*) '(CABLE_USER%YearStart and CABLE_USER%YearEnd) & - in cable.nml' + WRITE(logn,*) '(CABLE_USER%YearStart and CABLE_USER%YearEnd) in cable.nml' STOP ENDIF @@ -359,16 +357,16 @@ PROGRAM cable_offline_driver CurYear = CABLE_USER%YearStart IF ( icycle .GE. 11 ) THEN - icycle = icycle - 10 - CASAONLY = .TRUE. - CABLE_USER%CASA_DUMP_READ = .TRUE. + icycle = icycle - 10 + CASAONLY = .TRUE. + CABLE_USER%CASA_DUMP_READ = .TRUE. CABLE_USER%CASA_DUMP_WRITE = .FALSE. ELSEIF ( icycle .EQ. 0 ) THEN - CABLE_USER%CASA_DUMP_READ = .FALSE. - spincasa = .FALSE. + CABLE_USER%CASA_DUMP_READ = .FALSE. + spincasa = .FALSE. ! vh_js ! - CABLE_USER%CALL_POP = .FALSE. + CABLE_USER%CALL_POP = .FALSE. ENDIF ! vh_js ! @@ -386,11 +384,11 @@ PROGRAM cable_offline_driver ENDIF !$ IF ( .NOT. spinup ) THEN -!$ IF ( spincasa ) THEN -!$ spincasa = .FALSE. -!$ WRITE(*,*) "spinup == .FALSE. -> spincasa set to .F." -!$ WRITE(logn,*)"spinup == .FALSE. -> spincasa set to .F." -!$ ENDIF +!$ IF ( spincasa ) THEN +!$ spincasa = .FALSE. +!$ WRITE(*,*) "spinup == .FALSE. -> spincasa set to .F." +!$ WRITE(logn,*)"spinup == .FALSE. -> spincasa set to .F." +!$ ENDIF !$ ENDIF !$ @@ -400,13 +398,13 @@ PROGRAM cable_offline_driver cable_user%MetType = 'gswp' ENDIF - IF( l_casacnp .AND. ( icycle == 0 .OR. icycle > 3 ) ) & + IF( l_casacnp .AND. ( icycle == 0 .OR. icycle > 3 ) ) & STOP 'icycle must be 1 to 3 when using casaCNP' - !IF( ( l_laiFeedbk .OR. l_vcmaxFeedbk ) ) & + !IF( ( l_laiFeedbk .OR. l_vcmaxFeedbk ) ) & ! STOP 'casaCNP required to get prognostic LAI or Vcmax' - IF( l_vcmaxFeedbk .AND. icycle < 1 ) & + IF( l_vcmaxFeedbk .AND. icycle < 1 ) & STOP 'icycle must be 2 to 3 to get prognostic Vcmax' - IF( icycle > 0 .AND. ( .NOT. soilparmnew ) ) & + IF( icycle > 0 .AND. ( .NOT. soilparmnew ) ) & STOP 'casaCNP must use new soil parameters' NRRRR = MERGE(MAX(CABLE_USER%CASA_NREP,1), 1, CASAONLY) @@ -505,7 +503,7 @@ PROGRAM cable_offline_driver ncid_qa = GSWP_MID(6,YYYY) ncid_ta = GSWP_MID(7,YYYY) ncid_wd = GSWP_MID(8,YYYY) - kend = ktauday * LOY + kend = ktauday * LOY ENDIF ELSE IF ( TRIM(cable_user%MetType) .EQ. 'plum' ) THEN @@ -517,7 +515,7 @@ PROGRAM cable_offline_driver - dels = PLUME%dt + dels = PLUME%dt koffset = 0 leaps = PLUME%LeapYears @@ -527,8 +525,7 @@ PROGRAM cable_offline_driver str2 = ADJUSTL(str2) WRITE(str3,'(i2)') 1 str3 = ADJUSTL(str3) - timeunits="seconds since "//TRIM(str1)//"-"//TRIM(str2)//"-"//TRIM(str3)//" & - 00:00" + timeunits="seconds since "//TRIM(str1)//"-"//TRIM(str2)//"-"//TRIM(str3)//"00:00" ENDIF IF ( .NOT. PLUME%LeapYears ) LOY = 365 kend = NINT(24.0*3600.0/dels) * LOY @@ -539,7 +536,7 @@ PROGRAM cable_offline_driver CALL CPU_TIME(etime) CALL CRU_INIT( CRU ) - dels = CRU%dtsecs + dels = CRU%dtsecs koffset = 0 leaps = .FALSE. ! No leap years in CRU-NCEP exists%Snowf = .FALSE. ! No snow in CRU-NCEP, so ensure it will @@ -551,8 +548,7 @@ PROGRAM cable_offline_driver str2 = ADJUSTL(str2) WRITE(str3,'(i2)') 1 str3 = ADJUSTL(str3) - timeunits="seconds since "//TRIM(str1)//"-"//TRIM(str2)//"-"//TRIM(str3)//" & - 00:00" + timeunits="seconds since "//TRIM(str1)//"-"//TRIM(str2)//"-"//TRIM(str3)//"00:00" calendar = "noleap" ENDIF @@ -570,8 +566,7 @@ PROGRAM cable_offline_driver str2 = ADJUSTL(str2) WRITE(str3,'(i2)') 1 str3 = ADJUSTL(str3) - timeunits="seconds since "//TRIM(str1)//"-"//TRIM(str2)//"-"//TRIM(str3)//" & - 00:00" + timeunits="seconds since "//TRIM(str1)//"-"//TRIM(str2)//"-"//TRIM(str3)//"00:00" calendar = 'standard' ENDIF @@ -613,11 +608,11 @@ PROGRAM cable_offline_driver CALL LUC_EXPT_INIT (LUC_EXPT) ENDIF ! vh_js ! - CALL load_parameters( met, air, ssnow, veg,climate,bgc, & - soil, canopy, rough, rad, sum_flux, & - bal, logn, vegparmnew, casabiome, casapool, & + CALL load_parameters( met, air, ssnow, veg,climate,bgc, & + soil, canopy, rough, rad, sum_flux, & + bal, logn, vegparmnew, casabiome, casapool, & casaflux, sum_casapool, sum_casaflux, & - casamet, casabal, phen, POP, spinup, & + casamet, casabal, phen, POP, spinup, & CEMSOIL, CTFRZ, LUC_EXPT, POPLUC ) IF ( CABLE_USER%POPLUC .AND. TRIM(CABLE_USER%POPLUC_RunType) .EQ. 'static') & @@ -658,7 +653,7 @@ PROGRAM cable_offline_driver CALL READ_CLIMATE_RESTART_NC (climate, ktauday) spinConv = .FALSE. ! initialise spinup convergence variable - IF (.NOT.spinup) spinConv=.TRUE. + IF (.NOT.spinup) spinConv=.TRUE. IF( icycle>0 .AND. spincasa) THEN PRINT *, 'EXT spincasacnp enabled with mloop= ', mloop CALL spincasacnp(dels,kstart,kend,mloop,veg,soil,casabiome,casapool, & @@ -712,7 +707,7 @@ PROGRAM cable_offline_driver IF ( idoy .EQ. 0 ) idoy = LOY ! needed for CASA-CNP - nyear =INT((kend+koffset)/(LOY*ktauday)) + nyear =INT((kend+koffset)/(LOY*ktauday)) ! Get met data and LAI, set time variables. ! Rainfall input may be augmented for spinup purposes: @@ -732,12 +727,12 @@ PROGRAM cable_offline_driver ENDIF ELSE IF (TRIM(cable_user%MetType) .EQ. 'site') & - CALL get_met_data( spinup, spinConv, met, soil, & - rad, veg, kend, dels, CTFRZ, ktau+koffset_met, & + CALL get_met_data( spinup, spinConv, met, soil, & + rad, veg, kend, dels, CTFRZ, ktau+koffset_met, & kstart+koffset_met ) IF (TRIM(cable_user%MetType) .EQ. '') & - CALL get_met_data( spinup, spinConv, met, soil, & - rad, veg, kend, dels, CTFRZ, ktau+koffset, & + CALL get_met_data( spinup, spinConv, met, soil, & + rad, veg, kend, dels, CTFRZ, ktau+koffset, & kstart+koffset ) IF (TRIM(cable_user%MetType) .EQ. 'site' ) THEN @@ -782,7 +777,7 @@ PROGRAM cable_offline_driver IF ( .NOT. CASAONLY ) THEN ! Feedback prognostic vcmax and daily LAI from casaCNP to CABLE - IF (l_vcmaxFeedbk) CALL casa_feedback( ktau, veg, casabiome, & + IF (l_vcmaxFeedbk) CALL casa_feedback( ktau, veg, casabiome, & casapool, casamet ) IF (l_laiFeedbk.AND.icycle>0) veg%vlai(:) = casamet%glai(:) @@ -807,9 +802,9 @@ PROGRAM cable_offline_driver ELSE IF ( IS_CASA_TIME("dread", yyyy, ktau, kstart, & - koffset, kend, ktauday, logn) ) THEN ! CLN READ FROM FILE INSTEAD ! + koffset, kend, ktauday, logn) ) THEN ! CLN READ FROM FILE INSTEAD ! WRITE(CYEAR,FMT="(I4)")CurYear + INT((ktau-kstart+koffset)/(LOY*ktauday)) - ncfile = TRIM(casafile%c2cdumppath)//'c2c_'//CYEAR//'_dump.nc' + ncfile = TRIM(casafile%c2cdumppath)//'c2c_'//CYEAR//'_dump.nc' casa_it = NINT( REAL(ktau / ktauday) ) CALL read_casa_dump( ncfile, casamet, casaflux,phen, climate, casa_it, kend, .FALSE. ) @@ -817,13 +812,13 @@ PROGRAM cable_offline_driver !jhan this is insufficient testing. condition for !spinup=.false. & we want CASA_dump.nc (spinConv=.true.) - IF(icycle >0 .OR. CABLE_USER%CASA_DUMP_WRITE ) THEN + IF(icycle >0 .OR. CABLE_USER%CASA_DUMP_WRITE ) THEN ! vh_js ! - CALL bgcdriver( ktau, kstart, kend, dels, met, & - ssnow, canopy, veg, soil, climate, casabiome, & - casapool, casaflux, casamet, casabal, & - phen, pop, spinConv, spinup, ktauday, idoy, loy, & + CALL bgcdriver( ktau, kstart, kend, dels, met, & + ssnow, canopy, veg, soil, climate, casabiome, & + casapool, casaflux, casamet, casabal, & + phen, pop, spinConv, spinup, ktauday, idoy, loy, & CABLE_USER%CASA_DUMP_READ, CABLE_USER%CASA_DUMP_WRITE, & LALLOC ) @@ -869,7 +864,7 @@ PROGRAM cable_offline_driver CALL update_sum_casa(sum_casapool, sum_casaflux, casapool, casaflux, & .FALSE. , .TRUE. , count_sum_casa) CALL WRITE_CASA_OUTPUT_NC (veg, casamet, sum_casapool, casabal, sum_casaflux, & - CASAONLY, ctime, ( ktau.EQ.kend .AND. YYYY .EQ. & + CASAONLY, ctime, ( ktau.EQ.kend .AND. YYYY .EQ. & cable_user%YearEnd.AND. RRRR .EQ.NRRRR ) ) !mpidiff count_sum_casa = 0 @@ -949,43 +944,41 @@ PROGRAM cable_offline_driver IF (ktau == kend) PRINT*, "time-space-averaged energy & water balances" IF (ktau == kend) PRINT*,"Ebal_tot[Wm-2], Wbal_tot[mm per timestep]", & SUM(bal%ebal_tot)/mp/count_bal, SUM(bal%wbal_tot)/mp/count_bal - IF (ktau == kend) PRINT*, "time-space-averaged latent heat and & - net photosynthesis" + IF (ktau == kend) PRINT*, "time-space-averaged latent heat and net photosynthesis" IF (ktau == kend) PRINT*, "sum_fe[Wm-2], sum_fpn[umol/m2/s]", & new_sumfe/count_bal, new_sumfpn/count_bal IF (ktau == kend) WRITE(logn,*) IF (ktau == kend) WRITE(logn,*), "time-space-averaged energy & water balances" IF (ktau == kend) WRITE(logn,*),"Ebal_tot[Wm-2], Wbal_tot[mm per timestep]", & SUM(bal%ebal_tot)/mp/count_bal, SUM(bal%wbal_tot)/mp/count_bal - IF (ktau == kend) WRITE(logn,*), "time-space-averaged latent heat and & - net photosynthesis" + IF (ktau == kend) WRITE(logn,*), "time-space-averaged latent heat and net photosynthesis" IF (ktau == kend) WRITE(logn,*), "sum_fe[Wm-2], sum_fpn[umol/m2/s]", & new_sumfe/count_bal, new_sumfpn/count_bal ! vh ! commented code below detects Nans in evaporation flux and stops if there are any. -!$ do kk=1,mp -!$ if( canopy%fe(kk).NE.( canopy%fe(kk))) THEN -!$ write(*,*) 'fe nan', kk, ktau,met%qv(kk), met%precip(kk),met%precip_sn(kk), & -!$ met%fld(kk), met%fsd(kk,:), met%tk(kk), met%ua(kk), ssnow%potev(kk), met%pmb(kk), & -!$ canopy%ga(kk), ssnow%tgg(kk,:), canopy%fwsoil(kk) +!$ do kk=1,mp +!$ if( canopy%fe(kk).NE.( canopy%fe(kk))) THEN +!$ write(*,*) 'fe nan', kk, ktau,met%qv(kk), met%precip(kk),met%precip_sn(kk), & +!$ met%fld(kk), met%fsd(kk,:), met%tk(kk), met%ua(kk), ssnow%potev(kk), met%pmb(kk), & +!$ canopy%ga(kk), ssnow%tgg(kk,:), canopy%fwsoil(kk) !$ !$ -!$ stop -!$ endif -!$ if ( casaflux%cnpp(kk).NE. casaflux%cnpp(kk)) then -!$ write(*,*) 'npp nan', kk, ktau, casaflux%cnpp(kk) -!$ stop +!$ stop +!$ endif +!$ if ( casaflux%cnpp(kk).NE. casaflux%cnpp(kk)) then +!$ write(*,*) 'npp nan', kk, ktau, casaflux%cnpp(kk) +!$ stop !$ -!$ endif +!$ endif !$ !$ -!$ !if (canopy%fwsoil(kk).eq.0.0) then -!$ ! write(*,*) 'zero fwsoil', ktau, canopy%fpn(kk) -!$ !endif +!$ !if (canopy%fwsoil(kk).eq.0.0) then +!$ ! write(*,*) 'zero fwsoil', ktau, canopy%fpn(kk) +!$ !endif !$ !$ -!$ enddo +!$ enddo IF( ktau == kend ) THEN nkend = nkend+1 @@ -1032,20 +1025,20 @@ PROGRAM cable_offline_driver ! Write to screen and log file: WRITE(*,'(A18,I3,A24)') ' Spinning up: run ',INT(ktau_tot/kend),& ' of data set complete...' - WRITE(logn,'(A18,I3,A24)') ' Spinning up: run ', & + WRITE(logn,'(A18,I3,A24)') ' Spinning up: run ', & INT(ktau_tot/kend), ' of data set complete...' ! IF not 1st run through whole dataset: -!$ IF( MOD( ktau_tot, kend ) .EQ. 0 .AND. ktau_Tot .GT. kend .AND. & -!$ YYYY.EQ. CABLE_USER%YearEnd .OR. ( NRRRR .GT. 1 .AND. & -!$ RRRR.EQ. NRRRR) ) THEN +!$ IF( MOD( ktau_tot, kend ) .EQ. 0 .AND. ktau_Tot .GT. kend .AND. & +!$ YYYY.EQ. CABLE_USER%YearEnd .OR. ( NRRRR .GT. 1 .AND. & +!$ RRRR.EQ. NRRRR) ) THEN IF( MOD( ktau_tot, kend ) .EQ. 0 .AND. ktau_Tot .GT. kend .AND. & YYYY.EQ. CABLE_USER%YearEnd ) THEN ! evaluate spinup - IF( ANY( ABS(ssnow%wb-soilMtemp)>delsoilM).OR. & + IF( ANY( ABS(ssnow%wb-soilMtemp)>delsoilM).OR. & ANY( ABS(ssnow%tgg-soilTtemp)>delsoilT) .OR. & MAXVAL(ABS(ssnow%GWwb-GWtemp),dim=1) > delgwM) THEN @@ -1064,13 +1057,13 @@ PROGRAM cable_offline_driver spinConv = .TRUE. ! Write to screen and log file: WRITE(*,'(A33)') ' Spinup has converged - final run' - WRITE(logn,'(A52)') & + WRITE(logn,'(A52)') & ' Spinup has converged - final run - writing all data' - WRITE(logn,'(A37,F8.5,A28)') & - ' Criteria: Change in soil moisture < ', & + WRITE(logn,'(A37,F8.5,A28)') & + ' Criteria: Change in soil moisture < ', & delsoilM, ' in any layer over whole run' - WRITE(logn,'(A40,F8.5,A28)' ) & - ' Change in soil temperature < ', & + WRITE(logn,'(A40,F8.5,A28)' ) & + ' Change in soil temperature < ', & delsoilT, ' in any layer over whole run' END IF @@ -1162,8 +1155,8 @@ PROGRAM cable_offline_driver IF ( SpinConv .AND. .NOT. CASAONLY ) THEN ! Close output file and deallocate main variables: - CALL close_output_file( bal, air, bgc, canopy, met, & - rad, rough, soil, ssnow, & + CALL close_output_file( bal, air, bgc, canopy, met, & + rad, rough, soil, ssnow, & sum_flux, veg ) ENDIF @@ -1181,7 +1174,7 @@ PROGRAM cable_offline_driver IF (icycle > 0.and. .not.l_landuse) THEN - !CALL casa_poolout( ktau, veg, soil, casabiome, & + !CALL casa_poolout( ktau, veg, soil, casabiome, & ! casapool, casaflux, casamet, casabal, phen ) CALL write_casa_restart_nc ( casamet, casapool,casaflux,phen, CASAONLY ) @@ -1240,7 +1233,7 @@ PROGRAM cable_offline_driver IF ( .NOT. CASAONLY.and. .not. l_landuse ) THEN ! Write restart file if requested: - IF(output%restart) & + IF(output%restart) & CALL create_restart( logn, dels, ktau, soil, veg, ssnow, & canopy, rough, rad, bgc, bal, met ) !mpidiff @@ -1273,7 +1266,7 @@ SUBROUTINE prepareFiles(ncciy) INTEGER, INTENT(IN) :: ncciy WRITE(logn,*) 'CABLE offline global run using gswp forcing for ', ncciy - PRINT *, 'CABLE offline global run using gswp forcing for ', ncciy + PRINT *, 'CABLE offline global run using gswp forcing for ', ncciy CALL renameFiles(logn,gswpfile%rainf,ncciy,'rainf') CALL renameFiles(logn,gswpfile%snowf,ncciy,'snowf') @@ -1293,7 +1286,7 @@ SUBROUTINE renameFiles(logn,inFile,ncciy,inName) INTEGER, INTENT(IN) :: logn,ncciy INTEGER:: nn CHARACTER(LEN=200), INTENT(INOUT) :: inFile - CHARACTER(LEN=*), INTENT(IN) :: inName + CHARACTER(LEN=*), INTENT(IN) :: inName INTEGER :: idummy nn = INDEX(inFile,'19') From a30cbd30087952ed891d415833ff6810dc41848b Mon Sep 17 00:00:00 2001 From: Matthias Cuntz Date: Tue, 12 Mar 2024 14:18:24 +0100 Subject: [PATCH 06/85] Removed 'extra tokens at end of #ifndef directive' --- src/science/casa-cnp/casa_cnp.F90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/science/casa-cnp/casa_cnp.F90 b/src/science/casa-cnp/casa_cnp.F90 index 604f0ca5f..b6e674e54 100644 --- a/src/science/casa-cnp/casa_cnp.F90 +++ b/src/science/casa-cnp/casa_cnp.F90 @@ -1023,9 +1023,10 @@ SUBROUTINE casa_delplant(veg,casabiome,casapool,casaflux,casamet, & ENDIF casapool%dNplantdt(npt,wood) = 0.0 -# ifndef ESM15 ! offline/trunk uses this condition +#ifndef ESM15 + ! offline/trunk uses this condition IF (casamet%lnonwood(npt)==0) & -# endif +#endif casapool%dNplantdt(npt,wood) = - casaflux%kplant(npt,wood) & * casapool%Nplant(npt,wood) & * casabiome%ftransNPtoL(veg%iveg(npt),wood) From 7b8d0e300f1ab319f4289a5571c783fc2b8f4cab Mon Sep 17 00:00:00 2001 From: Matthias Cuntz Date: Tue, 12 Mar 2024 14:19:57 +0100 Subject: [PATCH 07/85] Name 'mland' was an ambiguous reference --- src/science/landuse/landuse3.F90 | 456 +++++++++++++++---------------- 1 file changed, 227 insertions(+), 229 deletions(-) diff --git a/src/science/landuse/landuse3.F90 b/src/science/landuse/landuse3.F90 index 8d6288488..faccd6a58 100644 --- a/src/science/landuse/landuse3.F90 +++ b/src/science/landuse/landuse3.F90 @@ -22,13 +22,13 @@ MODULE landuse_variable ! let's say we have a variable named `var`, then: ! ! - `luc%var_x(mland,mvmax)` contains data before land-use change, - ! indexed on the number of land points (`mland`) and the maximum number of + ! indexed on the number of land points (`mland`) and the maximum number of ! plant functional types (`mvmax`). ! - `luc%var_y(mland,mvmax)` contains data after land-use change, indexed - ! on the number of land points (`mland`) and the maximum number of + ! on the number of land points (`mland`) and the maximum number of ! plant functional types (`mvmax`). - ! - `lucmp%var(mp)` contains the variable data, indexed on the number of - ! vegetation patches (`mp`). + ! - `lucmp%var(mp)` contains the variable data, indexed on the number of + ! vegetation patches (`mp`). ! ! The land-use change for each variable is applied in the form of a ! transformation matrix `T`, such that: @@ -44,11 +44,11 @@ MODULE landuse_variable ! 3. Write the value of `luc%var_x` into `luc%var_y` ! 4. Update the value of `mp` and write `luc%var_y` to `lucmp%var` ! - ! **WARNING:** + ! **WARNING:** ! ! * There are external procedures in this file that should be ! moved to the `CONTAINS` clause of this module. - ! * Any variables added to CABLE/CASA restart files must be reproduced here + ! * Any variables added to CABLE/CASA restart files must be reproduced here ! in both "landuse_mland" and "landuse_mp". ! TYPE landuse_mland @@ -179,7 +179,7 @@ MODULE landuse_variable REAL(r_2), DIMENSION(:,:,:), ALLOCATABLE :: cwoodprod_y REAL(r_2), DIMENSION(:,:,:), ALLOCATABLE :: nplant_y REAL(r_2), DIMENSION(:,:,:), ALLOCATABLE :: nlitter_y - REAL(r_2), DIMENSION(:,:,:), ALLOCATABLE :: nsoil_y + REAL(r_2), DIMENSION(:,:,:), ALLOCATABLE :: nsoil_y REAL(r_2), DIMENSION(:,:), ALLOCATABLE :: nsoilmin_y REAL(r_2), DIMENSION(:,:,:), ALLOCATABLE :: nwoodprod_y REAL(r_2), DIMENSION(:,:,:), ALLOCATABLE :: pplant_y @@ -192,14 +192,14 @@ MODULE landuse_variable ! landuse data REAL(r_2), DIMENSION(:,:), ALLOCATABLE :: pftfrac - REAL(r_2), DIMENSION(:,:), ALLOCATABLE :: fharvw - REAL(r_2), DIMENSION(:,:,:), ALLOCATABLE :: xluh2cable + REAL(r_2), DIMENSION(:,:), ALLOCATABLE :: fharvw + REAL(r_2), DIMENSION(:,:,:), ALLOCATABLE :: xluh2cable REAL(r_2), DIMENSION(:,:,:), ALLOCATABLE :: atransit END TYPE landuse_mland TYPE landuse_mp !! Variables indexed along the vegetation patches. - + ! generic patch properties integer, dimension(:), allocatable :: iveg,isoil,soilorder,phase,isflag !(mp) integer, dimension(:), allocatable :: doyphase3 !(mp) @@ -221,7 +221,7 @@ MODULE landuse_variable real(r_2), dimension(:,:), allocatable :: cplantx, csoilx !float(mp,plant_carbon_pools/soil_carbon_pools) ! biogeochemical variables - real(r_2), dimension(:), allocatable :: sumcbal,sumnbal,sumpbal !float(mp) + real(r_2), dimension(:), allocatable :: sumcbal,sumnbal,sumpbal !float(mp) real(r_2), dimension(:), allocatable :: clabile,nsoilmin,psoillab,psoilsorb,psoilocc !float(mp) real(r_2), dimension(:,:), allocatable :: cplant,nplant,pplant !float(mp,mplant) real(r_2), dimension(:,:), allocatable :: clitter,nlitter,plitter !float(mp,mlitter) @@ -229,164 +229,164 @@ MODULE landuse_variable real(r_2), dimension(:,:), allocatable :: cwoodprod,nwoodprod,pwoodprod !float(mp,mwood) END TYPE landuse_mp - + CONTAINS - SUBROUTINE landuse_allocate_mland(mland,luc) - !! Allocates the `luc%%var(mland,mvmax)` variables + SUBROUTINE landuse_allocate_mland(imland,luc) + !! Allocates the `luc%%var(imland,mvmax)` variables !! !! **WARNING:** Need to use a separate ALLOCATE call for each array use landuse_constant IMPLICIT NONE TYPE(landuse_mland), INTENT(INOUT) :: luc - integer mland + integer imland ! patch-genric variables - ALLOCATE(luc%iveg_x(mland,mvmax), & - luc%isoil_x(mland,mvmax), & - luc%soilorder_x(mland,mvmax), & - luc%phase_x(mland,mvmax), & - luc%phen_x(mland,mvmax), & - luc%aphen_x(mland,mvmax), & - luc%doyphase3_x(mland,mvmax), & - luc%frac_sapwood_x(mland,mvmax), & - luc%sapwood_area_x(mland,mvmax), & - luc%isflag_x(mland,mvmax), & - luc%patchfrac_x(mland,mvmax), & - luc%lai_x(mland,mvmax), & - luc%sla_x(mland,mvmax)) - - ALLOCATE(luc%iveg_y(mland,mvmax), & - luc%isoil_y(mland,mvmax), & - luc%soilorder_y(mland,mvmax), & - luc%phase_y(mland,mvmax), & - luc%phen_y(mland,mvmax), & - luc%aphen_y(mland,mvmax), & - luc%doyphase3_y(mland,mvmax), & - luc%frac_sapwood_y(mland,mvmax), & - luc%sapwood_area_y(mland,mvmax), & - luc%isflag_y(mland,mvmax), & - luc%patchfrac_y(mland,mvmax), & - luc%lai_y(mland,mvmax), & - luc%sla_y(mland,mvmax)) + ALLOCATE(luc%iveg_x(imland,mvmax), & + luc%isoil_x(imland,mvmax), & + luc%soilorder_x(imland,mvmax), & + luc%phase_x(imland,mvmax), & + luc%phen_x(imland,mvmax), & + luc%aphen_x(imland,mvmax), & + luc%doyphase3_x(imland,mvmax), & + luc%frac_sapwood_x(imland,mvmax), & + luc%sapwood_area_x(imland,mvmax), & + luc%isflag_x(imland,mvmax), & + luc%patchfrac_x(imland,mvmax), & + luc%lai_x(imland,mvmax), & + luc%sla_x(imland,mvmax)) + + ALLOCATE(luc%iveg_y(imland,mvmax), & + luc%isoil_y(imland,mvmax), & + luc%soilorder_y(imland,mvmax), & + luc%phase_y(imland,mvmax), & + luc%phen_y(imland,mvmax), & + luc%aphen_y(imland,mvmax), & + luc%doyphase3_y(imland,mvmax), & + luc%frac_sapwood_y(imland,mvmax), & + luc%sapwood_area_y(imland,mvmax), & + luc%isflag_y(imland,mvmax), & + luc%patchfrac_y(imland,mvmax), & + luc%lai_y(imland,mvmax), & + luc%sla_y(imland,mvmax)) ! biophysical - ALLOCATE(luc%albsoilsn_x(mland,mvmax,nrb), & - luc%albedo_x(mland,mvmax,nrb), & - luc%albsoil_x(mland,mvmax,nrb), & - luc%dgdtg_x(mland,mvmax), & - luc%gammzz_x(mland,mvmax,ms), & - luc%tgg_x(mland,mvmax,ms), & - luc%wb_x(mland,mvmax,ms), & - luc%wbice_x(mland,mvmax,ms), & - luc%tggsn_x(mland,mvmax,msn), & - luc%ssdn_x(mland,mvmax,msn), & - luc%smass_x(mland,mvmax,msn), & - luc%sdepth_x(mland,mvmax,msn), & - luc%tss_x(mland,mvmax), & - luc%rtsoil_x(mland,mvmax), & - luc%runoff_x(mland,mvmax), & - luc%rnof1_x(mland,mvmax), & - luc%rnof2_x(mland,mvmax), & - luc%ssdnn_x(mland,mvmax), & - luc%snowd_x(mland,mvmax), & - luc%snage_x(mland,mvmax), & - luc%osnowd_x(mland,mvmax), & - luc%cansto_x(mland,mvmax), & - luc%ghflux_x(mland,mvmax), & - luc%sghflux_x(mland,mvmax), & - luc%ga_x(mland,mvmax), & - luc%fev_x(mland,mvmax), & - luc%fes_x(mland,mvmax), & - luc%fhs_x(mland,mvmax), & - luc%wbtot0_x(mland,mvmax), & - luc%osnowd0_x(mland,mvmax), & - luc%trad_x(mland,mvmax), & - luc%GWwb_x(mland,mvmax), & - luc%cplantx_x(mland,mvmax,ncp), & - luc%csoilx_x(mland,mvmax,ncs)) - - ALLOCATE(luc%albsoilsn_y(mland,mvmax,nrb), & - luc%albedo_y(mland,mvmax,nrb), & - luc%albsoil_y(mland,mvmax,nrb), & - luc%dgdtg_y(mland,mvmax), & - luc%gammzz_y(mland,mvmax,ms), & - luc%tgg_y(mland,mvmax,ms), & - luc%wb_y(mland,mvmax,ms), & - luc%wbice_y(mland,mvmax,ms), & - luc%tggsn_y(mland,mvmax,msn), & - luc%ssdn_y(mland,mvmax,msn), & - luc%smass_y(mland,mvmax,msn), & - luc%sdepth_y(mland,mvmax,msn), & - luc%tss_y(mland,mvmax), & - luc%rtsoil_y(mland,mvmax), & - luc%runoff_y(mland,mvmax), & - luc%rnof1_y(mland,mvmax), & - luc%rnof2_y(mland,mvmax), & - luc%ssdnn_y(mland,mvmax), & - luc%snowd_y(mland,mvmax), & - luc%snage_y(mland,mvmax), & - luc%osnowd_y(mland,mvmax), & - luc%cansto_y(mland,mvmax), & - luc%ghflux_y(mland,mvmax), & - luc%sghflux_y(mland,mvmax), & - luc%ga_y(mland,mvmax), & - luc%fev_y(mland,mvmax), & - luc%fes_y(mland,mvmax), & - luc%fhs_y(mland,mvmax), & - luc%wbtot0_y(mland,mvmax), & - luc%osnowd0_y(mland,mvmax), & - luc%trad_y(mland,mvmax), & - luc%GWwb_y(mland,mvmax), & - luc%cplantx_y(mland,mvmax,ncp), & - luc%csoilx_y(mland,mvmax,ncs)) + ALLOCATE(luc%albsoilsn_x(imland,mvmax,nrb), & + luc%albedo_x(imland,mvmax,nrb), & + luc%albsoil_x(imland,mvmax,nrb), & + luc%dgdtg_x(imland,mvmax), & + luc%gammzz_x(imland,mvmax,ms), & + luc%tgg_x(imland,mvmax,ms), & + luc%wb_x(imland,mvmax,ms), & + luc%wbice_x(imland,mvmax,ms), & + luc%tggsn_x(imland,mvmax,msn), & + luc%ssdn_x(imland,mvmax,msn), & + luc%smass_x(imland,mvmax,msn), & + luc%sdepth_x(imland,mvmax,msn), & + luc%tss_x(imland,mvmax), & + luc%rtsoil_x(imland,mvmax), & + luc%runoff_x(imland,mvmax), & + luc%rnof1_x(imland,mvmax), & + luc%rnof2_x(imland,mvmax), & + luc%ssdnn_x(imland,mvmax), & + luc%snowd_x(imland,mvmax), & + luc%snage_x(imland,mvmax), & + luc%osnowd_x(imland,mvmax), & + luc%cansto_x(imland,mvmax), & + luc%ghflux_x(imland,mvmax), & + luc%sghflux_x(imland,mvmax), & + luc%ga_x(imland,mvmax), & + luc%fev_x(imland,mvmax), & + luc%fes_x(imland,mvmax), & + luc%fhs_x(imland,mvmax), & + luc%wbtot0_x(imland,mvmax), & + luc%osnowd0_x(imland,mvmax), & + luc%trad_x(imland,mvmax), & + luc%GWwb_x(imland,mvmax), & + luc%cplantx_x(imland,mvmax,ncp), & + luc%csoilx_x(imland,mvmax,ncs)) + + ALLOCATE(luc%albsoilsn_y(imland,mvmax,nrb), & + luc%albedo_y(imland,mvmax,nrb), & + luc%albsoil_y(imland,mvmax,nrb), & + luc%dgdtg_y(imland,mvmax), & + luc%gammzz_y(imland,mvmax,ms), & + luc%tgg_y(imland,mvmax,ms), & + luc%wb_y(imland,mvmax,ms), & + luc%wbice_y(imland,mvmax,ms), & + luc%tggsn_y(imland,mvmax,msn), & + luc%ssdn_y(imland,mvmax,msn), & + luc%smass_y(imland,mvmax,msn), & + luc%sdepth_y(imland,mvmax,msn), & + luc%tss_y(imland,mvmax), & + luc%rtsoil_y(imland,mvmax), & + luc%runoff_y(imland,mvmax), & + luc%rnof1_y(imland,mvmax), & + luc%rnof2_y(imland,mvmax), & + luc%ssdnn_y(imland,mvmax), & + luc%snowd_y(imland,mvmax), & + luc%snage_y(imland,mvmax), & + luc%osnowd_y(imland,mvmax), & + luc%cansto_y(imland,mvmax), & + luc%ghflux_y(imland,mvmax), & + luc%sghflux_y(imland,mvmax), & + luc%ga_y(imland,mvmax), & + luc%fev_y(imland,mvmax), & + luc%fes_y(imland,mvmax), & + luc%fhs_y(imland,mvmax), & + luc%wbtot0_y(imland,mvmax), & + luc%osnowd0_y(imland,mvmax), & + luc%trad_y(imland,mvmax), & + luc%GWwb_y(imland,mvmax), & + luc%cplantx_y(imland,mvmax,ncp), & + luc%csoilx_y(imland,mvmax,ncs)) ! biogeochemical variables - ALLOCATE(luc%cplant_x(mland,mvmax,mplant), & - luc%nplant_x(mland,mvmax,mplant), & - luc%pplant_x(mland,mvmax,mplant), & - luc%clitter_x(mland,mvmax,mlitter), & - luc%nlitter_x(mland,mvmax,mlitter), & - luc%plitter_x(mland,mvmax,mlitter), & - luc%csoil_x(mland,mvmax,msoil), & - luc%nsoil_x(mland,mvmax,msoil), & - luc%psoil_x(mland,mvmax,msoil), & - luc%clabile_x(mland,mvmax), & - luc%nsoilmin_x(mland,mvmax), & - luc%psoillab_x(mland,mvmax), & - luc%psoilsorb_x(mland,mvmax), & - luc%psoilocc_x(mland,mvmax), & - luc%cwoodprod_x(mland,mvmax,mwood), & - luc%nwoodprod_x(mland,mvmax,mwood), & - luc%pwoodprod_x(mland,mvmax,mwood), & - luc%cplant_y(mland,mvmax,mplant), & - luc%nplant_y(mland,mvmax,mplant), & - luc%pplant_y(mland,mvmax,mplant), & - luc%clitter_y(mland,mvmax,mlitter), & - luc%nlitter_y(mland,mvmax,mlitter), & - luc%plitter_y(mland,mvmax,mlitter), & - luc%csoil_y(mland,mvmax,msoil), & - luc%nsoil_y(mland,mvmax,msoil), & - luc%psoil_y(mland,mvmax,msoil), & - luc%clabile_y(mland,mvmax), & - luc%nsoilmin_y(mland,mvmax), & - luc%psoillab_y(mland,mvmax), & - luc%psoilsorb_y(mland,mvmax), & - luc%psoilocc_y(mland,mvmax), & - luc%cwoodprod_y(mland,mvmax,mwood), & - luc%nwoodprod_y(mland,mvmax,mwood), & - luc%pwoodprod_y(mland,mvmax,mwood)) + ALLOCATE(luc%cplant_x(imland,mvmax,mplant), & + luc%nplant_x(imland,mvmax,mplant), & + luc%pplant_x(imland,mvmax,mplant), & + luc%clitter_x(imland,mvmax,mlitter), & + luc%nlitter_x(imland,mvmax,mlitter), & + luc%plitter_x(imland,mvmax,mlitter), & + luc%csoil_x(imland,mvmax,msoil), & + luc%nsoil_x(imland,mvmax,msoil), & + luc%psoil_x(imland,mvmax,msoil), & + luc%clabile_x(imland,mvmax), & + luc%nsoilmin_x(imland,mvmax), & + luc%psoillab_x(imland,mvmax), & + luc%psoilsorb_x(imland,mvmax), & + luc%psoilocc_x(imland,mvmax), & + luc%cwoodprod_x(imland,mvmax,mwood), & + luc%nwoodprod_x(imland,mvmax,mwood), & + luc%pwoodprod_x(imland,mvmax,mwood), & + luc%cplant_y(imland,mvmax,mplant), & + luc%nplant_y(imland,mvmax,mplant), & + luc%pplant_y(imland,mvmax,mplant), & + luc%clitter_y(imland,mvmax,mlitter), & + luc%nlitter_y(imland,mvmax,mlitter), & + luc%plitter_y(imland,mvmax,mlitter), & + luc%csoil_y(imland,mvmax,msoil), & + luc%nsoil_y(imland,mvmax,msoil), & + luc%psoil_y(imland,mvmax,msoil), & + luc%clabile_y(imland,mvmax), & + luc%nsoilmin_y(imland,mvmax), & + luc%psoillab_y(imland,mvmax), & + luc%psoilsorb_y(imland,mvmax), & + luc%psoilocc_y(imland,mvmax), & + luc%cwoodprod_y(imland,mvmax,mwood), & + luc%nwoodprod_y(imland,mvmax,mwood), & + luc%pwoodprod_y(imland,mvmax,mwood)) ! land-use variables - ALLOCATE(luc%pftfrac(mland,mvtype), & - luc%fharvw(mland,mharvw), & - luc%xluh2cable(mland,mvmax,mstate), & - luc%atransit(mland,mvmax,mvmax)) - - ! luc%phen_y(mland,mvmax), & - ! luc%aphen_y(mland,mvmax), & - ! luc%doyphase3_y(mland,mvmax), & - ! luc%frac_sapwood_y(mland,mvmax), & - ! luc%sapwood_area_y(mland,mvmax)) + ALLOCATE(luc%pftfrac(imland,mvtype), & + luc%fharvw(imland,mharvw), & + luc%xluh2cable(imland,mvmax,mstate), & + luc%atransit(imland,mvmax,mvmax)) + + ! luc%phen_y(imland,mvmax), & + ! luc%aphen_y(imland,mvmax), & + ! luc%doyphase3_y(imland,mvmax), & + ! luc%frac_sapwood_y(imland,mvmax), & + ! luc%sapwood_area_y(imland,mvmax)) ! Initialize temporary variables ! patch-genric variables luc%iveg_x = -1; luc%isoil_x=-1; luc%soilorder_x=-1; luc%phase_x=0; luc%isflag_x=0 @@ -639,7 +639,7 @@ SUBROUTINE landuse_allocate_mp(mpx,ms,msn,nrb,mplant,mlitter,msoil,mwood,ncp,ncs allocate(lucmp%gammzz(mpx,ms)) !double(mp,soil) allocate(lucmp%tgg(mpx,ms),lucmp%wb(mpx,ms),lucmp%wbice(mpx,ms)) !float(mp,soil) allocate(lucmp%tggsn(mpx,msn),lucmp%ssdn(mpx,msn),lucmp%smass(mpx,msn),lucmp%sdepth(mpx,msn)) !float(mp,snow) - + allocate(lucmp%tss(mpx),lucmp%rtsoil(mpx),lucmp%runoff(mpx),lucmp%rnof1(mpx),lucmp%rnof2(mpx), & lucmp%ssdnn(mpx),lucmp%snowd(mpx),lucmp%snage(mpx),lucmp%osnowd(mpx), & lucmp%cansto(mpx),lucmp%ghflux(mpx),lucmp%sghflux(mpx),lucmp%ga(mpx), & @@ -647,7 +647,7 @@ SUBROUTINE landuse_allocate_mp(mpx,ms,msn,nrb,mplant,mlitter,msoil,mwood,ncp,ncs lucmp%trad(mpx),lucmp%GWwb(mpx)) !float(mp) allocate(lucmp%cplantx(mpx,ncp), lucmp%csoilx(mpx,ncs)) !float(mp,ncp/ncs) - ! biogeochemical variables + ! biogeochemical variables allocate(lucmp%sumcbal(mpx),lucmp%sumnbal(mpx),lucmp%sumpbal(mpx)) allocate(lucmp%clabile(mpx)) allocate(lucmp%cplant(mpx,mplant),lucmp%nplant(mpx,mplant),lucmp%pplant(mpx,mplant)) @@ -669,7 +669,7 @@ SUBROUTINE landuse_allocate_mp(mpx,ms,msn,nrb,mplant,mlitter,msoil,mwood,ncp,ncs lucmp%gammzz(:,:)=0.0 !double(mp,soil) lucmp%tgg(:,:)=0.0;lucmp%wb(:,:)=0.0; lucmp%wbice(:,:)=0.0 !float(mp,soil) lucmp%tggsn(:,:)=0.0; lucmp%ssdn(:,:)=0.0; lucmp%smass(:,:)=0.0; lucmp%sdepth(:,:)=0.0 !float(mp,snow) - + lucmp%tss(:)=0.0; lucmp%rtsoil(:)=0.0; lucmp%runoff(:)=0.0; lucmp%rnof1(:)=0.0; lucmp%rnof2(:)=0.0 lucmp%ssdnn(:)=0.0; lucmp%snowd(:)=0.0; lucmp%snage(:)=0.0; lucmp%osnowd(:)=0.0 lucmp%cansto(:)=0.0; lucmp%ghflux(:)=0.0; lucmp%sghflux(:)=0.0; lucmp%ga(:)=0.0 @@ -708,7 +708,7 @@ SUBROUTINE landuse_deallocate_mp(mpx,ms,msn,nrb,mplant,mlitter,msoil,mwood,lucmp deallocate(lucmp%gammzz) !double(mp,soil) deallocate(lucmp%tgg,lucmp%wb,lucmp%wbice) !float(mp,soil) deallocate(lucmp%tggsn,lucmp%ssdn,lucmp%smass,lucmp%sdepth) !float(mp,snow) - + deallocate(lucmp%tss,lucmp%rtsoil,lucmp%runoff,lucmp%rnof1,lucmp%rnof2, & lucmp%ssdnn,lucmp%snowd,lucmp%snage,lucmp%osnowd, & lucmp%cansto,lucmp%ghflux,lucmp%sghflux,lucmp%ga, & @@ -735,7 +735,7 @@ subroutine landuse_driver(mlon,mlat,landmask,arealand,ssnow,soil,veg,bal,canopy, phen,casapool,casabal,casamet,casabiome,casaflux,bgc,rad, & cstart,cend,nap,lucmp) !! Main driver for the land-use change - ! + ! USE cable_IO_vars_module, ONLY: mask,patch,landpt, latitude, longitude USE cable_def_types_mod, ONLY: mp,mvtype,mstype,mland,r_2,ms,msn,nrb,ncp,ncs, & soil_parameter_type, soil_snow_type, veg_parameter_type, & @@ -774,9 +774,9 @@ subroutine landuse_driver(mlon,mlat,landmask,arealand,ssnow,soil,veg,bal,canopy, integer ncid,ok,xID,yID,varID,i,j,m,mpx print *, 'calling allocate mp: landuse' - call landuse_allocate_mp(mp,ms,msn,nrb,mplant,mlitter,msoil,mwood,ncp,ncs,lucmp) + call landuse_allocate_mp(mp,ms,msn,nrb,mplant,mlitter,msoil,mwood,ncp,ncs,lucmp) print *, 'calling allocate mland: landuse' - call landuse_allocate_mland(mland,luc) !setup "varx(mland,:)" + call landuse_allocate_mland(mland,luc) !setup "varx(mland,:)" print *, 'exiting allocating mland: landuse' ! get the mapping matrix from state to plant functional type @@ -788,27 +788,27 @@ subroutine landuse_driver(mlon,mlat,landmask,arealand,ssnow,soil,veg,bal,canopy, do p=1,mp ! print *, 'p', p, veg%iveg(p),soil%isoilm(p),ssnow%isflag(p) lucmp%iveg(p) = veg%iveg(p) - lucmp%isoil(p) = soil%isoilm(p) - lucmp%soilorder(p) = casamet%isorder(p) + lucmp%isoil(p) = soil%isoilm(p) + lucmp%soilorder(p) = casamet%isorder(p) lucmp%isflag(p) = ssnow%isflag(p) - enddo + enddo ! print *, 'point A: landuse' ! ! ! print *, 'patchfraC',size(patch%frac) ! print *, 'veglai= ',size(veg%vlai) -! print *, 'landuse: casabiome:sla', size(casabiome%sla), casabiome%sla(:) +! print *, 'landuse: casabiome:sla', size(casabiome%sla), casabiome%sla(:) do p=1,mp ! print *, 'landuse b', p, veg%iveg(p),veg%vlai(p),patch(p)%frac lucmp%patchfrac(p) = patch(p)%frac ! maybe we should create another variable for "primary%patch" lucmp%lai(p) = veg%vlai(p) - lucmp%sla(p) = casabiome%sla(veg%iveg(p)) + lucmp%sla(p) = casabiome%sla(veg%iveg(p)) enddo ! print *, 'point b: landuse' - ! biophysical variables + ! biophysical variables do p=1,mp lucmp%albsoilsn(p,:) = ssnow%albsoilsn(p,:) lucmp%albedo(p,:) = rad%albedo(p,:) @@ -840,7 +840,7 @@ subroutine landuse_driver(mlon,mlat,landmask,arealand,ssnow,soil,veg,bal,canopy, lucmp%dgdtg(:) = canopy%dgdtg(:) lucmp%fev(:) = canopy%fev(:) lucmp%fes(:) = canopy%fes(:) - lucmp%fhs(:) = canopy%fhs(:) + lucmp%fhs(:) = canopy%fhs(:) lucmp%wbtot0(:) = bal%wbtot0(:) lucmp%osnowd0(:) = bal%osnowd0(:) lucmp%trad(:) = rad%trad(:) @@ -849,7 +849,7 @@ subroutine landuse_driver(mlon,mlat,landmask,arealand,ssnow,soil,veg,bal,canopy, lucmp%csoilx(:,:) = bgc%csoil(:,:) ! print *, 'point E: landuse' - ! biogeochemical variables + ! biogeochemical variables do m=1,mland do np=cstart(m),cend(m) ivt = lucmp%iveg(np) @@ -860,8 +860,8 @@ subroutine landuse_driver(mlon,mlat,landmask,arealand,ssnow,soil,veg,bal,canopy, enddo print *, 'point F: landuse' - if(icycle>0) then - do p=1,mp + if(icycle>0) then + do p=1,mp ! print *, 'landuse F: ', p, phen%phase(p),phen%doyphase(p,3),phen%phen(p),phen%aphen(p) ! print *, 'landuse F2: ', casaflux%frac_sapwood(p),casaflux%sapwood_area(p) ! print *, 'landuse F3: ', casapool%clabile(p),casapool%cplant(p,:),casapool%clitter(p,:),casapool%csoil(p,:), & @@ -884,7 +884,7 @@ subroutine landuse_driver(mlon,mlat,landmask,arealand,ssnow,soil,veg,bal,canopy, endif ! print *, 'point G: landuse' if(icycle>1) then - do p=1,mp + do p=1,mp lucmp%nplant(p,:) = casapool%nplant(p,:) lucmp%nlitter(p,:) = casapool%nlitter(p,:) lucmp%nsoil(p,:) = casapool%nsoil(p,:) @@ -895,7 +895,7 @@ subroutine landuse_driver(mlon,mlat,landmask,arealand,ssnow,soil,veg,bal,canopy, endif ! print *, 'point H: landuse' if(icycle >2) then - do p=1,mp + do p=1,mp lucmp%pplant(p,:) = casapool%pplant(p,:) lucmp%plitter(p,:) = casapool%plitter(p,:) lucmp%psoil(p,:) = casapool%psoil(p,:) @@ -906,7 +906,7 @@ subroutine landuse_driver(mlon,mlat,landmask,arealand,ssnow,soil,veg,bal,canopy, lucmp%sumpbal(p) = casabal%sumpbal(p) enddo endif - + ! assign variables var(mp,:) to luc%var_x(mland,mvmax,:) ! print *, 'calling mp2land: landuse' call landuse_mp2land(luc,lucmp,mp,cstart,cend) @@ -947,14 +947,14 @@ subroutine landuse_driver(mlon,mlat,landmask,arealand,ssnow,soil,veg,bal,canopy, ! allocate "lucmp" with "mpx" ! print *, 'calling allocate mp: landuse' call landuse_allocate_mp(mpx,ms,msn,nrb,mplant,mlitter,msoil,mwood,ncp,ncs,lucmp) - + ! assign lucmp%lat lucmp%lon do p=1,mland do q=cstart(p),cend(p) lucmp%lat(q) = latitude(p) lucmp%lon(q) = longitude(p) enddo - enddo + enddo ! print *, 'calling land2mpx: landuse' call landuse_land2mpx(luc,lucmp,mpx) @@ -973,8 +973,6 @@ SUBROUTINE landuse_mp2land(luc,lucmp,mp,cstart,cend) !! Assigns `lucmp%var(mp)` to `luc%var_x(mland,mvmax)` ! use landuse_variable - USE cable_def_types_mod, ONLY: mvtype,mstype,mland,r_2,ms,msn,nrb,ncp,ncs - USE casadimension, ONLY: icycle,mplant,mlitter,msoil,mwood,mso IMPLICIT NONE integer mp type(landuse_mland) :: luc @@ -995,11 +993,11 @@ SUBROUTINE landuse_mp2land(luc,lucmp,mp,cstart,cend) print *, 'stop!' endif - ! patch-genric variables + ! patch-genric variables luc%isoil_x(g,ivt) = lucmp%isoil(np) - luc%soilorder_x(g,ivt) = lucmp%soilorder(np) + luc%soilorder_x(g,ivt) = lucmp%soilorder(np) luc%phase_x(g,ivt) = lucmp%phase(np) - + luc%doyphase3_x(g,ivt) = lucmp%doyphase3(np) luc%phen_x(g,ivt) = lucmp%phen(np) luc%aphen_x(g,ivt) = lucmp%aphen(np) @@ -1007,16 +1005,16 @@ SUBROUTINE landuse_mp2land(luc,lucmp,mp,cstart,cend) luc%sapwood_area_x(g,ivt)= lucmp%sapwood_area(np) luc%isflag_x(g,ivt) = lucmp%isflag(np) - luc%patchfrac_x(g,ivt) = lucmp%patchfrac(np) + luc%patchfrac_x(g,ivt) = lucmp%patchfrac(np) luc%lai_x(g,ivt) = lucmp%lai(np) - luc%sla_x(g,ivt) = lucmp%sla(np) - + luc%sla_x(g,ivt) = lucmp%sla(np) + ! biophysical variables do i=1,nrb luc%albsoilsn_x(g,ivt,i) = lucmp%albsoilsn(np,i) luc%albedo_x(g,ivt,i) = lucmp%albedo(np,i) luc%albsoil_x(g,ivt,i) = lucmp%albsoil(np,i) - enddo + enddo luc%dgdtg_x(g,ivt) = lucmp%dgdtg(np) @@ -1051,7 +1049,7 @@ SUBROUTINE landuse_mp2land(luc,lucmp,mp,cstart,cend) luc%fes_x(g,ivt) = lucmp%fes(np) luc%fhs_x(g,ivt) = lucmp%fhs(np) luc%wbtot0_x(g,ivt) = lucmp%wbtot0(np) - luc%osnowd0_x(g,ivt) = lucmp%osnowd0(np) + luc%osnowd0_x(g,ivt) = lucmp%osnowd0(np) luc%trad_x(g,ivt) = lucmp%trad(np) luc%GWwb_x(g,ivt) = lucmp%GWwb(np) @@ -1085,19 +1083,19 @@ SUBROUTINE landuse_mp2land(luc,lucmp,mp,cstart,cend) luc%psoilocc_x(g,ivt) = lucmp%psoilocc(np) luc%pwoodprod_x(g,ivt,:) = lucmp%pwoodprod(np,:) END IF - + enddo enddo - + ! patch-genric variables luc%isoil_y = luc%isoil_x luc%soilorder_y = luc%soilorder_x - luc%phase_y = luc%phase_x - luc%isflag_y = luc%isflag_x - luc%patchfrac_y = luc%patchfrac_x - luc%lai_y = luc%lai_x + luc%phase_y = luc%phase_x + luc%isflag_y = luc%isflag_x + luc%patchfrac_y = luc%patchfrac_x + luc%lai_y = luc%lai_x luc%sla_y = luc%sla_x - + luc%doyphase3_y = luc%doyphase3_x luc%phen_y = luc%phen_x luc%aphen_y = luc%aphen_x @@ -1106,39 +1104,39 @@ SUBROUTINE landuse_mp2land(luc,lucmp,mp,cstart,cend) ! biophysical variables luc%albsoilsn_y = luc%albsoilsn_x - luc%albedo_y = luc%albedo_x + luc%albedo_y = luc%albedo_x luc%albsoil_y = luc%albsoil_x - luc%dgdtg_y = luc%dgdtg_x + luc%dgdtg_y = luc%dgdtg_x luc%gammzz_y = luc%gammzz_x - luc%tgg_y = luc%tgg_x + luc%tgg_y = luc%tgg_x luc%wb_y = luc%wb_x - luc%wbice_y = luc%wbice_x + luc%wbice_y = luc%wbice_x luc%tggsn_y = luc%tggsn_x - luc%ssdn_y = luc%ssdn_x + luc%ssdn_y = luc%ssdn_x luc%smass_y = luc%smass_x luc%sdepth_y = luc%sdepth_x luc%tss_y = luc%tss_x - luc%rtsoil_y = luc%rtsoil_x + luc%rtsoil_y = luc%rtsoil_x luc%runoff_y = luc%runoff_x luc%rnof1_y = luc%rnof1_x luc%rnof2_y = luc%rnof2_x - luc%ssdnn_y = luc%ssdnn_x - luc%snowd_y = luc%snowd_x + luc%ssdnn_y = luc%ssdnn_x + luc%snowd_y = luc%snowd_x luc%snage_y = luc%snage_x - luc%osnowd_y = luc%osnowd_x + luc%osnowd_y = luc%osnowd_x luc%cansto_y = luc%cansto_x luc%ghflux_y = luc%ghflux_x luc%sghflux_y = luc%sghflux_x - luc%ga_y = luc%ga_x + luc%ga_y = luc%ga_x luc%fev_y = luc%fev_x luc%fes_y = luc%fes_x - luc%fhs_y = luc%fhs_x + luc%fhs_y = luc%fhs_x luc%wbtot0_y = luc%wbtot0_x - luc%osnowd0_y = luc%osnowd0_x + luc%osnowd0_y = luc%osnowd0_x luc%trad_y = luc%trad_x - luc%GWwb_y = luc%GWwb_x + luc%GWwb_y = luc%GWwb_x luc%cplantx_y = luc%cplantx_x - luc%csoilx_y = luc%csoilx_x + luc%csoilx_y = luc%csoilx_x ! biogeochemical variables luc%clabile_y = luc%clabile_x @@ -1165,7 +1163,7 @@ SUBROUTINE landuse_mp2land(luc,lucmp,mp,cstart,cend) END IF END SUBROUTINE landuse_mp2land - + SUBROUTINE landuse_transitx(luc,casabiome) !*## Purpose ! @@ -1227,8 +1225,8 @@ SUBROUTINE landuse_transitx(luc,casabiome) do d=1,mvmax if(luc%cplant_x(p,d,leaf) > 0.001) then ! calculate the fraction of litter or root litter into metabolic litter pool - ! this could be replaced with a call to a subroutine - ! if same calculations in casa_cnp.F90 are isolated into a + ! this could be replaced with a call to a subroutine + ! if same calculations in casa_cnp.F90 are isolated into a ! separate subroutine ! ivt=mvtype @@ -1247,17 +1245,17 @@ SUBROUTINE landuse_transitx(luc,casabiome) enddo ! compute the transition matrix relating to primary forest harvest - delfwhpri(1:mvmax) = 0.0; afwhpri(1:mvmax,1:mvmax) = 0.0 + delfwhpri(1:mvmax) = 0.0; afwhpri(1:mvmax,1:mvmax) = 0.0 if(luc%fharvw(p,1) >0.0) then - ! calculate the transition matrix for primary land + ! calculate the transition matrix for primary land do d=1,mvtype if(d<11.or.d>13) then delfwhpri(d) = luc%fharvw(p,1) * luc%xluh2cable(p,d,1) ! donor (positive) else delfwhpri(d) = -luc%fharvw(p,1) * luc%xluh2cable(p,r,3) ! receiver (negative) - endif + endif enddo ! of "d" - call landuse_redistribution(p,mvmax,delfwhpri,afwhpri) + call landuse_redistribution(p,mvmax,delfwhpri,afwhpri) endif transitx(1:mvmax,1:mvmax) = luc%atransit(p,1:mvmax,1:mvmax)+afwhpri(1:mvmax,1:mvmax) @@ -1299,7 +1297,7 @@ SUBROUTINE landuse_transitx(luc,casabiome) !move the donor wood to receiver wood product pool including labile C dcwoodprod(p,r,1) = dcwoodprod(p,r,1) + transitx(r,d) & - *(luc%cplant_x(p,d,wood)*fwoodprod(1) + luc%cwoodprod_x(p,d,1)) + *(luc%cplant_x(p,d,wood)*fwoodprod(1) + luc%cwoodprod_x(p,d,1)) dcwoodprod(p,r,2) = dcwoodprod(p,r,2) + transitx(r,d) & *(luc%cplant_x(p,d,wood)*fwoodprod(2) + luc%cwoodprod_x(p,d,2)) @@ -1521,7 +1519,7 @@ SUBROUTINE landuse_transitx(luc,casabiome) luc%fes_y(p,d) = avgpatchr2(d,luc%patchfrac_x(p,d),transitx(1:mvmax,1:mvmax),luc%fes_x(p,1:mvmax)) luc%fhs_y(p,d) = avgpatchr2(d,luc%patchfrac_x(p,d),transitx(1:mvmax,1:mvmax),luc%fhs_x(p,1:mvmax)) luc%wbtot0_y(p,d) = avgpatchr2(d,luc%patchfrac_x(p,d),transitx(1:mvmax,1:mvmax),luc%wbtot0_x(p,1:mvmax)) - luc%osnowd0_y(p,d) = avgpatchr2(d,luc%patchfrac_x(p,d),transitx(1:mvmax,1:mvmax),luc%osnowd0_x(p,1:mvmax)) + luc%osnowd0_y(p,d) = avgpatchr2(d,luc%patchfrac_x(p,d),transitx(1:mvmax,1:mvmax),luc%osnowd0_x(p,1:mvmax)) luc%trad_y(p,d) = avgpatchr2(d,luc%patchfrac_x(p,d),transitx(1:mvmax,1:mvmax),luc%trad_x(p,1:mvmax)) luc%GWwb_y(p,d) = avgpatchr2(d,luc%patchfrac_x(p,d),transitx(1:mvmax,1:mvmax),luc%GWwb_x(p,1:mvmax)) @@ -1583,7 +1581,7 @@ function avgpatchr2(q,areax,x2y,x) result(avgr2) delareax = delareax - x2y(k1,q) endif enddo - + do k2=1,mvmax if(k2/=q) then xgain = xgain +x2y(q,k2) * x(k2) @@ -1607,7 +1605,7 @@ function dominantx(xmin,xmax,fracx,xk) result(dominantint) dominantint = min(xmax,max(xmin,xk(1))) fracxmax = fracx(1) - do k=2,mvmax + do k=2,mvmax if(fracx(k)>fracxmax) then fracxmax = fracx(k) dominantint = xk(k) @@ -1655,12 +1653,12 @@ SUBROUTINE landuse_redistribution(p,mvmax,delfracx,atransx) temp = delx(i) itemp = ivt(i) delx(i) = delx(i+1) - ivt(i) = ivt(i+1) + ivt(i) = ivt(i+1) delx(i+1) = temp ivt(i+1) = itemp endif enddo - enddo + enddo ! determine number of negative (receive) and positives (donor) ndonor=0;nreceive=0 @@ -1677,7 +1675,7 @@ SUBROUTINE landuse_redistribution(p,mvmax,delfracx,atransx) receive(j) = delx(i) ivtreceive(j) = ivt(i) enddo - + ! donor to receive do i=1,ndonor if(donor(i) > 0.0) then @@ -1687,8 +1685,8 @@ SUBROUTINE landuse_redistribution(p,mvmax,delfracx,atransx) vj = ivtreceive(j) if(donor(i)>=-receive(j)) then atransx(vj,vi) = atransx(vj,vi) - receive(j) - donor(i) = donor(i) + receive(j) - receive(j) = 0.0 + donor(i) = donor(i) + receive(j) + receive(j) = 0.0 else atransx(vj,vi) = atransx(vj,vi) + donor(i) receive(j) = receive(j) + donor(i) @@ -1717,7 +1715,7 @@ SUBROUTINE landuse_redistribution(p,mvmax,delfracx,atransx) END SUBROUTINE landuse_redistribution - SUBROUTINE landuse_update_mland(luc) + SUBROUTINE landuse_update_mland(luc) !! Assigns `luc%var_y` to `luc%var_x` USE landuse_variable, ONLY: landuse_mland IMPLICIT NONE @@ -1898,7 +1896,7 @@ SUBROUTINE landuse_land2mpx(luc,lucmp,mpx) enddo ! end of "p" print *, 'npnew npold', npnew,npold - + END SUBROUTINE landuse_land2mpx SUBROUTINE landuse_checks(mlon,mlat,landmask,luc) @@ -1913,7 +1911,7 @@ SUBROUTINE landuse_checks(mlon,mlat,landmask,luc) real, parameter :: xunit = 1.0e-15 TYPE(landuse_mland) :: luc integer, dimension(mlon,mlat) :: landmask - real(r_2), dimension(mvmax) :: areapft + real(r_2), dimension(mvmax) :: areapft real(r_2), dimension(mvmax) :: cpland,npland,ppland real(r_2), dimension(mvmax) :: clland,nlland,plland real(r_2), dimension(mvmax) :: csland,nsland,psland @@ -1944,7 +1942,7 @@ SUBROUTINE landuse_checks(mlon,mlat,landmask,luc) csland(v) = csland(v) + luc%patchfrac_y(n,v) * sum(luc%csoil_y(n,v,1:3)) nsland(v) = nsland(v) + luc%patchfrac_y(n,v) * sum(luc%nsoil_y(n,v,1:3)) psland(v) = psland(v) + luc%patchfrac_y(n,v) * sum(luc%psoil_y(n,v,1:3)) - + clabland(v) = clabland(v) + luc%patchfrac_y(n,v) * luc%clabile_y(n,v) nsminland(v) = nsminland(v) + luc%patchfrac_y(n,v) * luc%nsoilmin_y(n,v) pslabland(v) = pslabland(v) + luc%patchfrac_y(n,v) * luc%psoillab_y(n,v) @@ -1970,5 +1968,5 @@ SUBROUTINE landuse_checks(mlon,mlat,landmask,luc) 201 format(i3,2x,20(f10.5,2x)) 202 format(20(f10.5,2x)) - + END SUBROUTINE landuse_checks From b1744604b1c69db5ee8430a99d3e36607f17b850 Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Tue, 23 Jan 2024 11:18:02 +1100 Subject: [PATCH 08/85] Use find_package to link against MPI libraries This is done so that: 1. We can create separate targets for the serial and MPI executable and only link against the MPI libraries when needed without relying on the MPI compiler wrapper. This lets us compile all executables (serial and parallel) with a single invocation of CMake. 2. We can use object libraries to compile the object files common to both serial and MPI builds. This saves compiling these object files for each executable (serial and MPI), reducing compilation time. Note: since compiler flags are the same across all targets, this change applies the flags globally to all targets in the current directory and below via [`add_compile_options`][add_compile_options]. [add_compile_options]: https://cmake.org/cmake/help/latest/command/add_compile_options.html --- CMakeLists.txt | 78 +++++++++---------- build.bash | 8 +- .../other_resources/build_system.md | 2 +- documentation/docs/user_guide/installation.md | 10 +-- 4 files changed, 46 insertions(+), 52 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ad264b09e..ec0b04e56 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,31 +9,26 @@ project( option(CABLE_MPI "Build the MPI executable" OFF) # third party libs +if(CABLE_MPI) + find_package(MPI REQUIRED COMPONENTS Fortran) +endif() find_package(PkgConfig REQUIRED) pkg_check_modules(NETCDF REQUIRED IMPORTED_TARGET "netcdf-fortran") -set(CABLE_INTEL_Fortran_FLAGS -fp-model precise) -set(CABLE_INTEL_Fortran_FLAGS_DEBUG -O0 -g -traceback -fpe0) -set(CABLE_INTEL_Fortran_FLAGS_RELEASE -O2) - -# CMake $<...> syntax is explained here: -# https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html#introduction -set(CABLE_EXE_NAME "$,cable-mpi,cable>") +set(CABLE_Intel_Fortran_FLAGS -fp-model precise) +set(CABLE_Intel_Fortran_FLAGS_DEBUG -O0 -g -traceback -fpe0) +set(CABLE_Intel_Fortran_FLAGS_RELEASE -O2) +if(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") + add_compile_options( + ${CABLE_Intel_Fortran_FLAGS} + "$<$:${CABLE_Intel_Fortran_FLAGS_RELEASE}>" + "$<$:${CABLE_Intel_Fortran_FLAGS_DEBUG}>" + ) +endif() -set( - CABLE_SRCS_SERIAL - src/offline/cable_driver.F90 -) -set( - CABLE_SRCS_MPI - src/offline/cable_mpidrv.F90 - src/offline/cable_mpicommon.F90 - src/offline/cable_mpimaster.F90 - src/offline/cable_mpiworker.F90 - src/science/pop/pop_mpi.F90 -) -set( - CABLE_SRCS_COMMON +add_library( + cable_common_objlib + OBJECT src/science/casa-cnp/bgcdriver.F90 src/science/casa-cnp/biogeochem_casa.F90 src/offline/cable_abort.F90 @@ -143,29 +138,26 @@ set( src/science/roughness/roughnessHGT_effLAI_cbl.F90 src/offline/spincasacnp.F90 ) -set( - CABLE_SRCS - "$,${CABLE_SRCS_MPI},${CABLE_SRCS_SERIAL}>" - ${CABLE_SRCS_COMMON} -) - -add_executable(cable ${CABLE_SRCS}) +target_link_libraries(cable_common_objlib PRIVATE PkgConfig::NETCDF) -set_target_properties(cable PROPERTIES OUTPUT_NAME ${CABLE_EXE_NAME}) - -if(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") - target_compile_options( - cable - PRIVATE - ${CABLE_INTEL_Fortran_FLAGS} - "$<$:${CABLE_INTEL_Fortran_FLAGS_RELEASE}>" - "$<$:${CABLE_INTEL_Fortran_FLAGS_DEBUG}>" - ) -endif() - -target_link_libraries( +add_executable( cable - PkgConfig::NETCDF + src/offline/cable_driver.F90 + "$" ) - +target_link_libraries(cable PRIVATE PkgConfig::NETCDF) install(TARGETS cable RUNTIME) + +if(CABLE_MPI) + add_executable( + cable-mpi + src/offline/cable_mpidrv.F90 + src/offline/cable_mpicommon.F90 + src/offline/cable_mpimaster.F90 + src/offline/cable_mpiworker.F90 + src/science/pop/pop_mpi.F90 + "$" + ) + target_link_libraries(cable-mpi PRIVATE PkgConfig::NETCDF MPI::MPI_Fortran) + install(TARGETS cable-mpi RUNTIME) +endif() diff --git a/build.bash b/build.bash index b0e32fa2c..e1f1db31a 100755 --- a/build.bash +++ b/build.bash @@ -46,7 +46,6 @@ while [ $# -gt 0 ]; do --mpi) mpi=1 cmake_args+=(-DCABLE_MPI="ON") - cmake_args+=(-DCMAKE_Fortran_COMPILER="mpif90") ;; -h|--help) show_help @@ -68,9 +67,16 @@ if hostname -f | grep gadi.nci.org.au > /dev/null; then # This is required so that the netcdf-fortran library is discoverable by # pkg-config: prepend_path PKG_CONFIG_PATH "${NETCDF_BASE}/lib/Intel/pkgconfig" + if [[ -n $mpi ]]; then module add intel-mpi/2019.5.281 fi + + if module is-loaded openmpi; then + # This is required so that the openmpi MPI libraries are discoverable + # via CMake's `find_package` mechanism: + prepend_path CMAKE_PREFIX_PATH "${OPENMPI_BASE}/include/Intel" + fi fi export CMAKE_BUILD_PARALLEL_LEVEL="${CMAKE_BUILD_PARALLEL_LEVEL:=$nproc_default}" diff --git a/documentation/docs/developer_guide/other_resources/build_system.md b/documentation/docs/developer_guide/other_resources/build_system.md index b0405ca9c..36b4bd631 100644 --- a/documentation/docs/developer_guide/other_resources/build_system.md +++ b/documentation/docs/developer_guide/other_resources/build_system.md @@ -11,7 +11,7 @@ Source files can be added easily by adding to the list of source files in [CMake ## Setting compiler flags -The recommended compiler flags for debug and release builds are set in the [CMakeLists.txt][CMakeLists.txt] file via [`target_compile_options`](https://cmake.org/cmake/help/latest/command/target_compile_options.html). These can be modified if required. +The recommended compiler flags for debug and release builds for each compiler are set in the [CMakeLists.txt][CMakeLists.txt] file via the `CABLE__Fortran_FLAGS*` variables. These can be modified if required. ???+ warning Compiler flags should be guarded by a check on the compiler ID as they are generally compiler specific. See [`CMAKE__COMPILER_ID`](https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html) for a list of supported compiler IDs. diff --git a/documentation/docs/user_guide/installation.md b/documentation/docs/user_guide/installation.md index 6ddaa2c52..f4b637b4d 100644 --- a/documentation/docs/user_guide/installation.md +++ b/documentation/docs/user_guide/installation.md @@ -13,13 +13,13 @@ To install CABLE you need to have the following already installed on your system ``` mermaid graph TD - + A(Clone CABLE with git):::UserAction -->|Serial?| B(Run `./build.bash`):::UserAction; B --> D[load modules and invoke `cmake`]; D -->|Serial?| E; E[executable `cable`]:::Output; A -->|Parallel?| C(Run `./build.bash --mpi`):::UserAction; - C --> D; + C --> D; D -->|Parallel?| F; F[executable `cable-mpi`]:::Output; click A "#getting-the-cable-source-code" @@ -84,7 +84,6 @@ CABLE can be built using the BASH script [build.bash][build.bash] in the project ???+ tip "Build on other HPC" Gadi specific configuration is guarded by a check on the current hostname (see [here][build.bash-hostname-check]). This may be of use as a template for building CABLE on another Linux/HPC system. For advice on issues relating to porting to other HPC systems, please get in touch with ACCESS-NRI either via GitHub or the [ACCESS-Hive Forum][hive-forum-cable]. - Executables are built in the `/build` directory. Once built successfully, they are then installed in the `/bin` directory. To build the serial model execute: @@ -95,12 +94,9 @@ To build the parallel model execute the same build script but with the `--mpi` f ./build.bash --mpi -???+ warning - If you need to switch between a serial compilation and a parallel compilation, you need to completely [clean the previous build][clean-build] first. - ### Cleaning the build -From time to time, it might be useful to clean a previous build completely and restart the build from scratch. This is required when switching between serial and parallel builds. +From time to time, it might be useful to clean a previous build completely and restart the build from scratch. To clean the previous build prior to compiling, specify the `--clean` flag to `build.bash`. From c0ce0e46e832c3a3468a7f1853aa05c792beae68 Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Fri, 2 Feb 2024 13:53:46 +1100 Subject: [PATCH 09/85] List source files in alphabetical order --- CMakeLists.txt | 114 +++++++++--------- .../other_resources/build_system.md | 2 +- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ec0b04e56..526cfc720 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,114 +29,114 @@ endif() add_library( cable_common_objlib OBJECT - src/science/casa-cnp/bgcdriver.F90 - src/science/casa-cnp/biogeochem_casa.F90 src/offline/cable_abort.F90 - src/science/misc/cable_air.F90 - src/science/canopy/cable_canopy.F90 - src/science/misc/cable_carbon.F90 src/offline/cable_checks.F90 - src/science/misc/cable_climate.F90 - src/util/cable_climate_type_mod.F90 - src/util/cable_common.F90 src/offline/cable_cru_TRENDY.F90 src/offline/cable_define_types.F90 - src/science/gw_hydro/cable_gw_hydro.F90 src/offline/cable_initialise.F90 src/offline/cable_input.F90 src/offline/cable_iovars.F90 src/offline/cable_LUC_EXPT.F90 - src/params/cable_maths_constants_mod.F90 src/offline/cable_metutils.F90 src/offline/cable_namelist_input.F90 - src/params/cable_other_constants_mod.F90 src/offline/cable_output.F90 src/offline/cable_parameters.F90 src/offline/cable_pft_params.F90 src/offline/cable_phenology.F90 - src/params/cable_photo_constants_mod.F90 - src/params/cable_phys_constants_mod.F90 src/offline/cable_plume_mip.F90 - src/science/gw_hydro/cable_psm.F90 src/offline/cable_read.F90 - src/science/roughness/cable_roughness.F90 - src/util/cable_runtime_opts_mod.F90 src/offline/cable_site.F90 - src/science/sli/cable_sli_main.F90 - src/science/sli/cable_sli_numbers.F90 - src/science/sli/cable_sli_roots.F90 - src/science/sli/cable_sli_solve.F90 - src/science/sli/cable_sli_utils.F90 src/offline/cable_soil_params.F90 src/offline/cable_weathergenerator.F90 src/offline/cable_write.F90 src/offline/casa_cable.F90 + src/offline/casa_ncdf.F90 + src/offline/casa_offline_inout.F90 + src/offline/CASAONLY_LUC.F90 + src/offline/cbl_model_driver_offline.F90 + src/offline/landuse_inout.F90 + src/offline/spincasacnp.F90 + src/params/cable_maths_constants_mod.F90 + src/params/cable_other_constants_mod.F90 + src/params/cable_photo_constants_mod.F90 + src/params/cable_phys_constants_mod.F90 + src/params/grid_constants_cbl.F90 + src/science/albedo/cbl_albedo.F90 + src/science/albedo/cbl_snow_albedo.F90 + src/science/albedo/cbl_soilColour_albedo.F90 + src/science/canopy/cable_canopy.F90 + src/science/canopy/cbl_dryLeaf.F90 + src/science/canopy/cbl_friction_vel.F90 + src/science/canopy/cbl_fwsoil.F90 + src/science/canopy/cbl_latent_heat.F90 + src/science/canopy/cbl_photosynthesis.F90 + src/science/canopy/cbl_pot_evap_snow.F90 + src/science/canopy/cbl_qsat.F90 + src/science/canopy/cbl_SurfaceWetness.F90 + src/science/canopy/cbl_wetleaf.F90 + src/science/canopy/cbl_within_canopy.F90 + src/science/canopy/cbl_zetar.F90 + src/science/casa-cnp/bgcdriver.F90 + src/science/casa-cnp/biogeochem_casa.F90 src/science/casa-cnp/casa_cnp.F90 src/science/casa-cnp/casa_dimension.F90 src/science/casa-cnp/casa_feedback.F90 src/science/casa-cnp/casa_inout.F90 - src/offline/casa_ncdf.F90 - src/offline/casa_offline_inout.F90 - src/offline/CASAONLY_LUC.F90 src/science/casa-cnp/casa_param.F90 src/science/casa-cnp/casa_phenology.F90 src/science/casa-cnp/casa_readbiome.F90 src/science/casa-cnp/casa_rplant.F90 src/science/casa-cnp/casa_sumcflux.F90 src/science/casa-cnp/casa_variable.F90 - src/science/albedo/cbl_albedo.F90 + src/science/gw_hydro/cable_gw_hydro.F90 + src/science/gw_hydro/cable_psm.F90 + src/science/landuse/landuse3.F90 + src/science/landuse/landuse_constant.F90 + src/science/misc/cable_air.F90 + src/science/misc/cable_carbon.F90 + src/science/misc/cable_climate.F90 + src/science/pop/pop_constants.F90 + src/science/pop/pop_def.F90 + src/science/pop/POP.F90 + src/science/pop/pop_io.F90 + src/science/pop/POPLUC.F90 + src/science/pop/pop_types.F90 + src/science/radiation/cbl_init_radiation.F90 + src/science/radiation/cbl_radiation.F90 + src/science/radiation/cbl_rhoch.F90 + src/science/radiation/cbl_sinbet.F90 + src/science/radiation/cbl_spitter.F90 + src/science/roughness/cable_roughness.F90 + src/science/roughness/roughnessHGT_effLAI_cbl.F90 + src/science/sli/cable_sli_main.F90 + src/science/sli/cable_sli_numbers.F90 + src/science/sli/cable_sli_roots.F90 + src/science/sli/cable_sli_solve.F90 + src/science/sli/cable_sli_utils.F90 src/science/soilsnow/cbl_conductivity.F90 - src/science/canopy/cbl_dryLeaf.F90 - src/science/canopy/cbl_friction_vel.F90 - src/science/canopy/cbl_fwsoil.F90 src/science/soilsnow/cbl_GW.F90 src/science/soilsnow/cbl_hyd_redistrib.F90 - src/science/radiation/cbl_init_radiation.F90 - src/science/canopy/cbl_latent_heat.F90 - src/offline/cbl_model_driver_offline.F90 src/science/soilsnow/cbl_Oldconductivity.F90 - src/science/canopy/cbl_photosynthesis.F90 - src/science/canopy/cbl_pot_evap_snow.F90 - src/science/canopy/cbl_qsat.F90 - src/science/radiation/cbl_radiation.F90 src/science/soilsnow/cbl_remove_trans.F90 - src/science/radiation/cbl_rhoch.F90 - src/science/radiation/cbl_sinbet.F90 src/science/soilsnow/cbl_smoisturev.F90 src/science/soilsnow/cbl_snowAccum.F90 src/science/soilsnow/cbl_snow_aging.F90 - src/science/albedo/cbl_snow_albedo.F90 src/science/soilsnow/cbl_snowCheck.F90 src/science/soilsnow/cbl_snowDensity.F90 src/science/soilsnow/cbl_snowl_adjust.F90 src/science/soilsnow/cbl_snowMelt.F90 - src/science/albedo/cbl_soilColour_albedo.F90 src/science/soilsnow/cbl_soilfreeze.F90 src/science/soilsnow/cbl_soilsnow_data.F90 src/science/soilsnow/cbl_soilsnow_init_special.F90 src/science/soilsnow/cbl_soilsnow_main.F90 - src/science/radiation/cbl_spitter.F90 src/science/soilsnow/cbl_stempv.F90 - src/science/canopy/cbl_SurfaceWetness.F90 src/science/soilsnow/cbl_surfbv.F90 src/science/soilsnow/cbl_thermal.F90 src/science/soilsnow/cbl_trimb.F90 - src/science/canopy/cbl_wetleaf.F90 - src/science/canopy/cbl_within_canopy.F90 - src/science/canopy/cbl_zetar.F90 - src/params/grid_constants_cbl.F90 - src/science/landuse/landuse3.F90 - src/science/landuse/landuse_constant.F90 - src/offline/landuse_inout.F90 + src/util/cable_climate_type_mod.F90 + src/util/cable_common.F90 + src/util/cable_runtime_opts_mod.F90 src/util/masks_cbl.F90 - src/science/pop/pop_constants.F90 - src/science/pop/pop_def.F90 - src/science/pop/pop_io.F90 - src/science/pop/POPLUC.F90 - src/science/pop/POP.F90 - src/science/pop/pop_types.F90 - src/science/roughness/roughnessHGT_effLAI_cbl.F90 - src/offline/spincasacnp.F90 ) target_link_libraries(cable_common_objlib PRIVATE PkgConfig::NETCDF) @@ -151,8 +151,8 @@ install(TARGETS cable RUNTIME) if(CABLE_MPI) add_executable( cable-mpi - src/offline/cable_mpidrv.F90 src/offline/cable_mpicommon.F90 + src/offline/cable_mpidrv.F90 src/offline/cable_mpimaster.F90 src/offline/cable_mpiworker.F90 src/science/pop/pop_mpi.F90 diff --git a/documentation/docs/developer_guide/other_resources/build_system.md b/documentation/docs/developer_guide/other_resources/build_system.md index 36b4bd631..473fca61a 100644 --- a/documentation/docs/developer_guide/other_resources/build_system.md +++ b/documentation/docs/developer_guide/other_resources/build_system.md @@ -7,7 +7,7 @@ For CABLE offline applications, the underlying build system is [CMake](https://c ## Adding source files -Source files can be added easily by adding to the list of source files in [CMakeLists.txt][CMakeLists.txt]. +Source files can be added easily by adding to the list of source files in [CMakeLists.txt][CMakeLists.txt]. We recommend keeping the list sorted in alphabetical order when adding new source files. ## Setting compiler flags From 0369c4eea03dfbf2bbcb6be50d0c0a23a1b7d460 Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Mon, 4 Mar 2024 16:11:25 +1100 Subject: [PATCH 10/85] Portability fixes and improvements to build.bash --- build.bash | 14 +++++++------- documentation/docs/user_guide/installation.md | 4 ---- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/build.bash b/build.bash index e1f1db31a..b6b4d8c1d 100755 --- a/build.bash +++ b/build.bash @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash nproc_default=4 @@ -14,6 +14,8 @@ options below will be passed to CMake when generating the build system. Options: --clean Delete build directory before invoking CMake. --mpi Compile MPI executable. + -j Specify the number of parallel jobs in the compilation. By + default this value is set to $nproc_default. -h, --help Show this screen. Enabling debug mode: @@ -26,12 +28,6 @@ Enabling verbose output from Makefile builds: To enable more verbose output from Makefile builds, specify the CMake option -DCMAKE_VERBOSE_MAKEFILE=ON when invoking $script_name. -Parallel compilation: - - By default, the number of parallel jobs used in the compilation is - $nproc_default. This value can be overwritten by setting the environment - variable CMAKE_BUILD_PARALLEL_LEVEL. - EOF } @@ -47,6 +43,10 @@ while [ $# -gt 0 ]; do mpi=1 cmake_args+=(-DCABLE_MPI="ON") ;; + -j) + CMAKE_BUILD_PARALLEL_LEVEL=$2 + shift + ;; -h|--help) show_help exit diff --git a/documentation/docs/user_guide/installation.md b/documentation/docs/user_guide/installation.md index f4b637b4d..6c205269b 100644 --- a/documentation/docs/user_guide/installation.md +++ b/documentation/docs/user_guide/installation.md @@ -110,10 +110,6 @@ The release build is default. To enable debug mode, specify the CMake option `-D To enable more verbose output from Makefile builds, specify the CMake option `-DCMAKE_VERBOSE_MAKEFILE=ON` when invoking `build.bash`. -### Parallel compilation - -By default, the compilation is done in parallel. The number of parallel jobs can be overwritten by setting the environment variable [`CMAKE_BUILD_PARALLEL_LEVEL`](https://cmake.org/cmake/help/latest/envvar/CMAKE_BUILD_PARALLEL_LEVEL.html). - ???+ tip Run `./build.bash --help` for information on supported options. From 93ac1656e6721256de4b940344c7d03b628b02da Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Mon, 4 Mar 2024 15:58:38 +1100 Subject: [PATCH 11/85] Add --compiler flag and GNU compiler support Flags for release and debug configurations for the GNU compiler were taken from build.ksh (CABLE-POP_TRENDY branch). --- CMakeLists.txt | 11 +++++++++++ build.bash | 27 ++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 526cfc720..d980cd603 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,17 @@ if(CMAKE_Fortran_COMPILER_ID MATCHES "Intel") ) endif() +set(CABLE_GNU_Fortran_FLAGS -cpp -ffree-form -ffixed-line-length-132) +set(CABLE_GNU_Fortran_FLAGS_DEBUG -O -g -pedantic-errors -Wall -W -Wno-maybe-uninitialized -fbacktrace -ffpe-trap=zero,overflow,underflow -finit-real=nan) +set(CABLE_GNU_Fortran_FLAGS_RELEASE -O3 -Wno-aggressive-loop-optimizations) +if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU") + add_compile_options( + ${CABLE_GNU_Fortran_FLAGS} + "$<$:${CABLE_GNU_Fortran_FLAGS_RELEASE}>" + "$<$:${CABLE_GNU_Fortran_FLAGS_DEBUG}>" + ) +endif() + add_library( cable_common_objlib OBJECT diff --git a/build.bash b/build.bash index b6b4d8c1d..7ee4cd7fd 100755 --- a/build.bash +++ b/build.bash @@ -14,6 +14,8 @@ options below will be passed to CMake when generating the build system. Options: --clean Delete build directory before invoking CMake. --mpi Compile MPI executable. + --compiler + Specify the compiler to use. -j Specify the number of parallel jobs in the compilation. By default this value is set to $nproc_default. -h, --help Show this screen. @@ -43,6 +45,10 @@ while [ $# -gt 0 ]; do mpi=1 cmake_args+=(-DCABLE_MPI="ON") ;; + --compiler) + compiler=$2 + shift + ;; -j) CMAKE_BUILD_PARALLEL_LEVEL=$2 shift @@ -59,14 +65,29 @@ while [ $# -gt 0 ]; do done if hostname -f | grep gadi.nci.org.au > /dev/null; then + : "${compiler:=intel}" + . /etc/bashrc module purge module add cmake/3.24.2 - module add intel-compiler/2019.5.281 module add netcdf/4.6.3 + case ${compiler} in + intel) + module add intel-compiler/2019.5.281 + compiler_lib_install_dir=Intel + ;; + gnu) + module add gcc/13.2.0 + compiler_lib_install_dir=GNU + ;; + ?*) + echo -e "\nError: compiler ${compiler} is not supported.\n" + exit 1 + esac + # This is required so that the netcdf-fortran library is discoverable by # pkg-config: - prepend_path PKG_CONFIG_PATH "${NETCDF_BASE}/lib/Intel/pkgconfig" + prepend_path PKG_CONFIG_PATH "${NETCDF_BASE}/lib/${compiler_lib_install_dir}/pkgconfig" if [[ -n $mpi ]]; then module add intel-mpi/2019.5.281 @@ -75,7 +96,7 @@ if hostname -f | grep gadi.nci.org.au > /dev/null; then if module is-loaded openmpi; then # This is required so that the openmpi MPI libraries are discoverable # via CMake's `find_package` mechanism: - prepend_path CMAKE_PREFIX_PATH "${OPENMPI_BASE}/include/Intel" + prepend_path CMAKE_PREFIX_PATH "${OPENMPI_BASE}/include/${compiler_lib_install_dir}" fi fi From 29d8b26a78932a54530837e89f01e88d33efdbb2 Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Wed, 13 Mar 2024 10:56:09 +1100 Subject: [PATCH 12/85] Add Matthias's configuration for example --- build.bash | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/build.bash b/build.bash index 7ee4cd7fd..37b685db7 100755 --- a/build.bash +++ b/build.bash @@ -98,6 +98,21 @@ if hostname -f | grep gadi.nci.org.au > /dev/null; then # via CMake's `find_package` mechanism: prepend_path CMAKE_PREFIX_PATH "${OPENMPI_BASE}/include/${compiler_lib_install_dir}" fi + +elif hostname -f | grep -E '(mc16|mcmini)' > /dev/null; then + : "${compiler:=gnu}" + + case ${compiler} in + gnu) + export PKG_CONFIG_PATH=/usr/local/netcdf-fortran-4.6.1-gfortran/lib/pkgconfig:${PKG_CONFIG_PATH} + export PKG_CONFIG_PATH=${HOMEBREW_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH} + cmake_args+=(-DCMAKE_Fortran_COMPILER=gfortran) + ;; + ?*) + echo -e "\nError: compiler ${compiler} is not supported.\n" + exit 1 + ;; + esac fi export CMAKE_BUILD_PARALLEL_LEVEL="${CMAKE_BUILD_PARALLEL_LEVEL:=$nproc_default}" From ba007d5af0ffdb8fdcad9d4bf63a5795f484477f Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh Date: Sun, 17 Mar 2024 19:32:41 +1100 Subject: [PATCH 13/85] Introduce SUBROUTINE GWspatialParameters --- src/offline/cable_define_types.F90 | 55 ++- src/offline/cable_parameters.F90 | 675 ++++++++++++++++++++++++++++- 2 files changed, 720 insertions(+), 10 deletions(-) diff --git a/src/offline/cable_define_types.F90 b/src/offline/cable_define_types.F90 index e9acd7c49..46f8977d9 100644 --- a/src/offline/cable_define_types.F90 +++ b/src/offline/cable_define_types.F90 @@ -38,12 +38,14 @@ MODULE cable_def_types_mod INTEGER :: mp, & ! # total no of patches/tiles mvtype,& ! total # vegetation types, from input #ifdef UM_BUILD - mstype=9,& ! total # soil types, needs to de defined atCompile TimeForNow + mstype=9,& ! total # soil types, needs to be defined at compile time for now #else mstype,& ! total # soil types, from input #endif - mland ! # land grid cells - + mland,& ! ! # land grid cells + mpatch !number of patches ! mpatch added by rk4417 - phase2 + !allows for setting this to a const value + INTEGER, PARAMETER :: & i_d = KIND(9), & #ifdef UM_BUILD @@ -164,6 +166,13 @@ MODULE cable_def_types_mod swilt_vec ! wilting point (hk = 0.02 mm/day) REAL(r_2), DIMENSION(:), POINTER :: & + hkrz,&! rate hyds changes with depth + zdepth,&! depth [m] where hkrz has zero impact + srf_frac_ma,&! fraction of surface with macropores + edepth_ma,&! e fold depth macropore fraction + qhz_max,&! maximum base flow when fully sat + qhz_efold,&! base flow efold rate dep on wtd, from drain-dens and param +! block above inserted by rk4417 - phase2 drain_dens,&! drainage density ( mean dist to rivers/streams ) elev, & !elevation above sea level elev_std, & !elevation above sea level @@ -308,7 +317,15 @@ MODULE cable_def_types_mod wmliq, & !water mass [mm] liq wmice, & !water mass [mm] ice wmtot, & !water mass [mm] liq+ice ->total - qhlev + qhlev, & + smp_hys, & !soil swc props dynamic from hysteresis ! from here to end added by rk4417 - phase2 + wb_hys, & + sucs_hys,& + ssat_hys,& + watr_hys,& + hys_fac, & + wbliq_old + ! Additional SLI variables: REAL(r_2), DIMENSION(:,:), POINTER :: S ! moisture content relative to sat value (edit vh 23/01/08) REAL(r_2), DIMENSION(:,:), POINTER :: Tsoil ! Tsoil (deg C) @@ -872,6 +889,12 @@ SUBROUTINE alloc_soil_parameter_type(var, mp) ALLOCATE( var%rhosoil_vec(mp,ms) ) ALLOCATE( var%drain_dens(mp) ) + ALLOCATE( var%hkrz(mp) ) ! block inserted by rk4417 - phase2 + ALLOCATE( var%zdepth(mp) ) + ALLOCATE( var%srf_frac_ma(mp) ) + ALLOCATE( var%edepth_ma(mp) ) + ALLOCATE( var%qhz_max(mp) ) + ALLOCATE( var%qhz_efold(mp) ) ! end - rk4417 - phase ALLOCATE( var%elev(mp) ) ALLOCATE( var%elev_std(mp) ) ALLOCATE( var%slope(mp) ) @@ -1001,7 +1024,15 @@ SUBROUTINE alloc_soil_snow_type(var, mp) ALLOCATE( var%wmliq(mp,ms) ) ALLOCATE( var%wmice(mp,ms) ) ALLOCATE( var%wmtot(mp,ms) ) - + ALLOCATE(var % smp_hys(mp,ms) ) !1 ! from here to end added by rk4417 - phase2 + ALLOCATE(var % wb_hys(mp,ms) ) !2 + ALLOCATE(var % ssat_hys(mp,ms) ) !3 + ALLOCATE(var % watr_hys(mp,ms) ) !4 + ALLOCATE(var % hys_fac(mp,ms) ) !5 + ALLOCATE(var % sucs_hys(mp,ms) ) !5 + ALLOCATE(var % wbliq_old(mp,ms) ) + + ! Allocate variables for SLI soil model: !IF(cable_user%SOIL_STRUC=='sli') THEN ALLOCATE ( var % S(mp,ms) ) @@ -1504,6 +1535,13 @@ SUBROUTINE dealloc_soil_parameter_type(var) DEALLOCATE( var%elev_std ) DEALLOCATE( var%slope ) DEALLOCATE( var%slope_std ) +! DEALLOCATE( var%drain_dens ) ! block inserted by rk4417 - phase2 + DEALLOCATE( var%hkrz ) + DEALLOCATE( var%zdepth ) + DEALLOCATE( var%srf_frac_ma ) + DEALLOCATE( var%edepth_ma ) + DEALLOCATE( var%qhz_max ) + DEALLOCATE( var%qhz_efold ) ! end - rk4417 - phase ! Deallocate variables for SLI soil model: !IF(cable_user%SOIL_STRUC=='sli') THEN DEALLOCATE ( var % nhorizons) @@ -1627,6 +1665,13 @@ SUBROUTINE dealloc_soil_snow_type(var) DEALLOCATE( var%wmliq ) DEALLOCATE( var%wmice ) DEALLOCATE( var%wmtot ) + DEALLOCATE(var % smp_hys ) ! block inserted by rk4417 - phase2 + DEALLOCATE(var % wb_hys ) + DEALLOCATE(var % ssat_hys ) + DEALLOCATE(var % watr_hys ) + DEALLOCATE(var % hys_fac ) + DEALLOCATE(var % sucs_hys ) + DEALLOCATE(var % wbliq_old ) ! end - rk4417 - phase !IF(cable_user%SOIL_STRUC=='sli') THEN DEALLOCATE ( var % S ) diff --git a/src/offline/cable_parameters.F90 b/src/offline/cable_parameters.F90 index bf617dd83..534f73d43 100644 --- a/src/offline/cable_parameters.F90 +++ b/src/offline/cable_parameters.F90 @@ -125,6 +125,15 @@ MODULE cable_param_module ! vars intro for Ticket #27 INTEGER, DIMENSION(:, :), ALLOCATABLE :: inSoilColor + INTERFACE get_gw_data ! rk4417 - phase2 + MODULE PROCEDURE get_gw_2d_var_constdef + MODULE PROCEDURE get_gw_3d_var_constdef + MODULE PROCEDURE get_gw_4d_var_constdef + MODULE PROCEDURE get_gw_2d_var + MODULE PROCEDURE get_gw_3d_var + MODULE PROCEDURE get_gw_4d_var + END INTERFACE + CONTAINS SUBROUTINE get_default_params(logn, vegparmnew, LUC_EXPT) @@ -980,10 +989,6 @@ END SUBROUTINE get_land_index !============================================================================= - - - - SUBROUTINE countPatch(nlon, nlat, npatch) ! count the total number of active patches and ! fill the index variable 'landpt' @@ -1010,6 +1015,12 @@ SUBROUTINE countPatch(nlon, nlat, npatch) REAL :: lon2, distance, newLength INTEGER :: ii, jj, kk, tt, ncount +! mpatch setting below introduced by rk4417 - phase2 + !set mpatch, the publically available number of patches + mpatch = npatch ! MMY@13April it makes sense. mpatch is set in cable_define_types_mod + ! as a public variable and is used in subroutine GWspatialParameters + ! and in get_gw_data + ! range of longitudes from input file (inLon) should be -180 to 180, ! and longitude(:) has already been converted to -180 to 180 for CABLE. landpt(:)%ilon = -999 @@ -1092,6 +1103,11 @@ SUBROUTINE countPatch(nlon, nlat, npatch) ! Set the maximum number of active patches to that read from met file: max_vegpatches = MAXVAL(landpt(:)%nap) + +! mpatch setting below introduced by rk4417 - phase2 + mpatch = max_vegpatches ! MMY@13April keep this line, it is an update of mpatch to consider + ! force_npatches_as's change on mpatch + !CLN IF (max_vegpatches /= nmetpatches) THEN IF (max_vegpatches /= nmetpatches .AND. npatch == 1) THEN PRINT *, 'Error! Met file claiming to have more active patches than' @@ -2740,11 +2756,660 @@ SUBROUTINE init_veg_from_vegin(ifmp,fmp, veg, soil_zse ) veg%froot(:, is) = veg%froot(:, is)-veg%froot(:,is-1) END DO + END SUBROUTINE init_veg_from_vegin +! SUBROUTINE GWspatialParameters added by rk4417 - phase2 + SUBROUTINE GWspatialParameters(logn,soil,ssnow) + ! MMY this subrountine aims to set up GW-scheme parameters + ! MMY change filename%gw_elev to filename%type and change ncid_elev to ncid + ! Read in spatially-specific groundwater parameters from filename%type + USE netcdf + use cable_common_module, only : filename,cable_user,gw_params - END SUBROUTINE init_veg_from_vegin + IMPLICIT NONE + INTEGER, INTENT(IN) :: logn ! log file unit number + TYPE (soil_parameter_type), INTENT(INOUT) :: soil + TYPE (soil_snow_type), INTENT(INOUT) :: ssnow + + ! local variables + INTEGER :: ncid, ok, ok2, file_status + INTEGER :: lon_id,lat_id,tile_id,layer_id + INTEGER :: klev,ii, jj, kk,e,i,j,k, n + INTEGER :: nlon,nlat,npatch,nhorz + REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: inGW4dtmp + REAL, ALLOCATABLE, DIMENSION(:,:,:) :: inGW3dtmp + REAL, ALLOCATABLE, DIMENSION(:,:) :: inGWtmp + + ! _____________ MMY@Feb2023 ____________ + ! MMY : add for hkrz + REAL(r_2), DIMENSION(mp,ms) :: soil_depth + +! SELECT CASE block below inserted to fix bug of uninitialized soil%zse here in MMY code - rk4417 - phase2 +! SELECT CASE block copied from SUBROUTINE write_default_params which is called after SUBROUTINE GWspatialParameters - rk4417 - phase2 + + ! parameters that are not spatially dependent + SELECT CASE(ms) + + CASE(6) + soil%zse = (/.022, .058, .154, .409, 1.085, 2.872/) ! layer thickness nov03 + CASE(12) + soil%zse = (/.022, 0.0500, 0.1300 , 0.3250 , 0.3250 , 0.3000, & + 0.3000, 0.3000 , 0.3000, 0.3000, 0.7500, 1.50 /) + CASE(13) + soil%zse = (/.02, 0.0500, 0.06, 0.1300 , 0.300 , 0.300 , 0.3000, & + 0.3000, 0.3000 , 0.3000, 0.3000, 0.7500, 1.50 /) + + END SELECT + +! line below added by rk4417 - phase2 + soil%zse_vec = real(spread(soil%zse,1,mp),r_2) ! MMY@13April, this line is needed since zec_vec is defined in UM/init/cable_um_init_subrs.F90, + ! but it isn't used in offline CABLE + + + soil_depth(:,1) = soil%zse_vec(:,1) + do klev=2,ms + soil_depth(:,klev) = soil_depth(:,klev-1) + soil%zse_vec(:,klev) + end do + + !! MMY : move from subroutine derived_parameters to here + !! since derived_parameters is now an option but compulsory + !soil%zshh(1) = 0.5 * soil%zse(1) ! distance between consecutive layer + !! midpoints: + !soil%zshh(ms + 1) = 0.5 * soil%zse(ms) + !soil%zshh(2:ms) = 0.5 * (soil%zse(1:ms-1) + soil%zse(2:ms)) + !print *, "MMY testing soil%zshh", soil%zshh + !! ______________________________________ + + !MD Aquifer properties + + !open type file ! MMY + + file_status = NF90_OPEN(trim(filename%type),NF90_NOWRITE,ncid) + + IF( NF90_INQ_DIMID(ncid,'longitude',lon_id) .eq. nf90_noerr) THEN + IF (NF90_INQUIRE_DIMENSION(ncid,lon_id,LEN=nlon) .ne. nf90_noerr) nlon = xdimsize + ELSE + nlon = -1 + ENDIF + + IF( NF90_INQ_DIMID(ncid,'latitude',lat_id) .eq. nf90_noerr) THEN + IF (NF90_INQUIRE_DIMENSION(ncid,lat_id,LEN=nlat) .ne. nf90_noerr) nlat = ydimsize + ELSE + nlat = -1 + ENDIF + + !Have not used tiling yet, will be the future :-) + IF( NF90_INQ_DIMID(ncid,'num_tiles',tile_id) .eq. nf90_noerr) THEN + IF ( NF90_INQUIRE_DIMENSION(ncid,tile_id,LEN=npatch) .ne. nf90_noerr) npatch=1 + ELSE + npatch=-1 + ENDIF + + IF( NF90_INQ_DIMID(ncid,'nhorz',layer_id) .eq. nf90_noerr) THEN + IF ( NF90_INQUIRE_DIMENSION(ncid,layer_id,LEN=nhorz) .ne. nf90_noerr) nhorz=1 + ELSE + nhorz=ms + ENDIF + + IF ((nlon*nlat*npatch*nhorz .ne. xdimsize*ydimsize*ms*mpatch) .and. & + xdimsize*ydimsize .ne. 1) THEN + WRITE(logn,*) 'Errors reading the dimensions from '//filename%type + + IF (nlon .lt. 0 .or. nlon .ne. xdimsize) & + WRITE(logn,*) 'nlon: found ',nlon,' need to have ',xdimsize,' to match forcing.' + IF (nlat .lt. 0 .or. nlat .ne. ydimsize) & + WRITE(logn,*) 'nlat: found ',nlat,' need to have ',ydimsize,' to match forcing.' + IF (nhorz .lt. 0 .or. nhorz .ne. ms) & + WRITE(logn,*) 'nhorz: found ',nhorz,' need to have ',ms,' to match forcing.' + IF (npatch .lt. 0) & + WRITE(logn,*) 'npatch: found ',npatch,' need to have ',mpatch,' to match forcing.' + + WRITE(logn,*) 'Setting dims to forcing file values, CHECK THE OUTPUT!' + !amu561: code should probably stop here instead of re-writing + !dimensions? + nlon=xdimsize; nlat=ydimsize; npatch=mpatch; nhorz=ms + ENDIF + + allocate(inGWtmp(nlon,nlat)) + allocate(inGW3dtmp(nlon,nlat,ms)) + allocate(inGW4dtmp(nlon,nlat,ms,mpatch)) + + ! MMY @Oct2022 give read-in value to non-vec parameters + do e=1,mland + soil%silt(landpt(e)%cstart:landpt(e)%cend) = & + insilt(landpt(e)%ilon, landpt(e)%ilat) + soil%sand(landpt(e)%cstart:landpt(e)%cend) = & + insand(landpt(e)%ilon, landpt(e)%ilat) + soil%clay(landpt(e)%cstart:landpt(e)%cend) = & + inclay(landpt(e)%ilon, landpt(e)%ilat) + soil%swilt(landpt(e)%cstart:landpt(e)%cend) = & + inswilt(landpt(e)%ilon, landpt(e)%ilat) + soil%sfc(landpt(e)%cstart:landpt(e)%cend) = & + insfc(landpt(e)%ilon, landpt(e)%ilat) + soil%ssat(landpt(e)%cstart:landpt(e)%cend) = & + inssat(landpt(e)%ilon, landpt(e)%ilat) + soil%bch(landpt(e)%cstart:landpt(e)%cend) = & + inbch(landpt(e)%ilon, landpt(e)%ilat) + soil%hyds(landpt(e)%cstart:landpt(e)%cend) = & + inhyds(landpt(e)%ilon, landpt(e)%ilat) + soil%sucs(landpt(e)%cstart:landpt(e)%cend) = & + -1.* ABS(insucs(landpt(e)%ilon, landpt(e)%ilat)) !ensure negative + soil%rhosoil(landpt(e)%cstart:landpt(e)%cend) = & + inrhosoil(landpt(e)%ilon, landpt(e)%ilat) + soil%css(landpt(e)%cstart:landpt(e)%cend) = & + incss(landpt(e)%ilon, landpt(e)%ilat) + soil%cnsd(landpt(e)%cstart:landpt(e)%cend) = & + incnsd(landpt(e)%ilon, landpt(e)%ilat) + ! 26 + ! soil%GWrhosoil_vec(landpt(e)%cstart:landpt(e)%cend) = & ! MMY not used + ! REAL(inGWrhosoil(landpt(e)%ilon, landpt(e)%ilat),r_2) + end do + + IF (cable_user%gw_model) then + + !1 + soil%elev(:) = get_gw_data(ncid,file_status,'elevation',50.0,nlon,nlat) + !2 + soil%elev_std(:) = get_gw_data(ncid,file_status,'elevation_std',25.0,nlon,nlat) + !3 + soil%slope(:) = get_gw_data(ncid,file_status,'slope',0.08,nlon,nlat) + !4 + soil%slope_std(:) = get_gw_data(ncid,file_status,'slope_std',0.03,nlon,nlat) + !5 + soil%sand_vec(:,:)= get_gw_data(ncid,file_status,'sand_vec',insand(:,:),nlon,nlat,ms) + !6 + soil%silt_vec(:,:)= get_gw_data(ncid,file_status,'silt_vec',insilt(:,:),nlon,nlat,ms) + !7 + soil%clay_vec(:,:)= get_gw_data(ncid,file_status,'clay_vec',inclay(:,:),nlon,nlat,ms) + !8 + soil%org_vec(:,:) = get_gw_data(ncid,file_status,'organic',0.0, nlon,nlat,ms) ! MMY can I really set organic as 0.0 + !9 + soil%rhosoil_vec(:,:) = get_gw_data(ncid,file_status,'rhosoil_vec',inrhosoil(:,:),nlon,nlat,ms) + !10 + soil%ssat_vec(:,:) = get_gw_data(ncid,file_status,'ssat_vec',inssat(:,:),nlon,nlat,ms) + !11 + inGWtmp(:,:) = 0.66*inssat(:,:) + soil%sfc_vec(:,:) = get_gw_data(ncid,file_status,'sfc_vec',inGWtmp(:,:),nlon,nlat,ms) + !12 + inGWtmp(:,:) = 0.15*inssat(:,:) + soil%swilt_vec(:,:) = get_gw_data(ncid,file_status,'swilt_vec',inGWtmp(:,:),nlon,nlat,ms) + !13 + inGWtmp(:,:) = 0.01*inssat(:,:) + soil%watr(:,:) = get_gw_data(ncid,file_status,'watr',inGWtmp(:,:),nlon,nlat,ms) + !14 + inGWtmp(:,:) = 1000.0*inhyds(:,:) + soil%hyds_vec(:,:) = get_gw_data(ncid,file_status,'hyds_vec',inGWtmp(:,:),nlon,nlat,ms) + !15 + inGWtmp(:,:) = abs(insucs(:,:)) ! MMY sucs -> all positive + soil%sucs_vec(:,:) = get_gw_data(ncid,file_status,'sucs_vec',inGWtmp(:,:),nlon,nlat,ms) + soil%sucs_vec(:,:) = 1000._r_2*abs(soil%sucs_vec(:,:)) ! MMY units: m -> mm + !16 + soil%bch_vec(:,:) = get_gw_data(ncid,file_status,'bch_vec',inbch(:,:),nlon,nlat,ms) + !17 + soil%css_vec(:,:) = get_gw_data(ncid,file_status,'css_vec',incss(:,:),nlon,nlat,ms) + !18 + soil%cnsd_vec(:,:) = get_gw_data(ncid,file_status,'cnsd_vec',incnsd(:,:),nlon,nlat,ms) + !19 + soil%GWdz(:) = get_gw_data(ncid,file_status,'dtb',25.0,nlon,nlat) + where(soil%GWdz(:) .lt. 5.0) soil%GWdz(:) = 5.0 + where(soil%GWdz(:) .gt. 50.0) soil%GWdz(:) = 50.0 + + ! ??????????? MMY ??????????? + !add last layer to aquifer + !should have zero head at top of aquifer, however this can be well below + !the soil column, so reading below we can treat top part of whenm dry + !as unsat flow + ! ??????????????????????????? + ! 20 + soil%drain_dens(:) = get_gw_data(ncid,file_status,'drainage_density',0.0008,nlon,nlat) + where( soil%drain_dens(:) .lt. 1.0e-6) soil%drain_dens(:)=1.0e-6 + where( soil%drain_dens(:) .gt. 0.02 ) soil%drain_dens(:)=0.02 + ! 21 + soil%GWhyds_vec(:) = get_gw_data(ncid,file_status,'permeability',1.0e-6,nlon,nlat) + soil%GWhyds_vec(:) = 1000._r_2 * soil%GWhyds_vec(:) + ! 22 + soil%GWssat_vec(:) = get_gw_data(ncid,file_status,'Sy',inssat(:,:),nlon,nlat) + soil%GWssat_vec(:) = max(0.23_r_2,soil%GWssat_vec(:)) + ! 23 + soil%GWsucs_vec(:) = soil%sucs_vec(:,ms) + ! 24 + soil%GWbch_vec(:) = soil%bch_vec(:,ms) + ! 25 + soil%GWwatr(:) = 0.0 + + if (file_status .eq. nf90_noerr) file_status = nf90_close(ncid) + ! ???????????????? MMY should we keep below ???????????????? + !set the default IC for hysteresis state + ssnow%smp_hys(:,:) = -soil%sucs_vec(:,:) + ssnow%hys_fac(:,:) = 1.0 + ssnow%watr_hys(:,:) = soil%watr(:,:) + ssnow%ssat_hys(:,:) = soil%ssat_vec(:,:) + ! ?????????????????????????????????????????????????????????? + + ELSE !gw_model=false + ! MMY for gw_model=false, CABLE should only read what exists in standard gridinfo + DO e=1,mland + soil%elev(landpt(e)%cstart:landpt(e)%cend) = 50.0 + soil%elev_std(landpt(e)%cstart:landpt(e)%cend) =25 + soil%slope(landpt(e)%cstart:landpt(e)%cend) =0.08 + soil%slope_std(landpt(e)%cstart:landpt(e)%cend) =0.03 + soil%GWdz(landpt(e)%cstart:landpt(e)%cend) =25.0 + soil%drain_dens(landpt(e)%cstart:landpt(e)%cend) =0.008 + soil%GWhyds_vec(landpt(e)%cstart:landpt(e)%cend) =1.0e-6 + soil%GWssat_vec(landpt(e)%cstart:landpt(e)%cend) =0.23 + soil%GWwatr(landpt(e)%cstart:landpt(e)%cend) =0.0 + soil%GWsucs_vec(landpt(e)%cstart:landpt(e)%cend) = & + insucs(landpt(e)%ilon, landpt(e)%ilat) ! MMY add GWsucs_vec here + soil%GWbch_vec(landpt(e)%cstart:landpt(e)%cend) = & + inbch(landpt(e)%ilon, landpt(e)%ilat) ! MMY add GWbch_vec here + soil%org_vec(landpt(e)%cstart:landpt(e)%cend,:) = 0.0 ! MMY standard CABLE gridinfo doesn't have organic + soil%watr(landpt(e)%cstart:landpt(e)%cend,:) = 0.0 ! MMY standard CABLE gridinfo doesn't have watr + + DO klev=1,ms + !layered_in_soils(landpt(e)%cstart:landpt(e)%cend,klev,1) =& + soil%sand_vec(landpt(e)%cstart:landpt(e)%cend,klev) = & + insand(landpt(e)%ilon,landpt(e)%ilat) + soil%silt_vec(landpt(e)%cstart:landpt(e)%cend,klev) = & + insilt(landpt(e)%ilon,landpt(e)%ilat) + soil%clay_vec(landpt(e)%cstart:landpt(e)%cend,klev) = & + inclay(landpt(e)%ilon,landpt(e)%ilat) + soil%ssat_vec(landpt(e)%cstart:landpt(e)%cend,klev) =& + inssat(landpt(e)%ilon,landpt(e)%ilat) + soil%sfc_vec(landpt(e)%cstart:landpt(e)%cend,klev) =& + insfc(landpt(e)%ilon,landpt(e)%ilat) + soil%swilt_vec(landpt(e)%cstart:landpt(e)%cend,klev) =& + inswilt(landpt(e)%ilon,landpt(e)%ilat) + soil%hyds_vec(landpt(e)%cstart:landpt(e)%cend,klev) =& + inhyds(landpt(e)%ilon,landpt(e)%ilat) + soil%sucs_vec(landpt(e)%cstart:landpt(e)%cend,klev) =& + insucs(landpt(e)%ilon,landpt(e)%ilat) + soil%bch_vec(landpt(e)%cstart:landpt(e)%cend,klev) =& + inbch(landpt(e)%ilon,landpt(e)%ilat) + soil%rhosoil_vec(landpt(e)%cstart:landpt(e)%cend,klev) =& + inrhosoil(landpt(e)%ilon,landpt(e)%ilat) + soil%cnsd_vec(landpt(e)%cstart:landpt(e)%cend,klev) =& + incnsd(landpt(e)%ilon,landpt(e)%ilat) + soil%css_vec(landpt(e)%cstart:landpt(e)%cend,klev) =& + incss(landpt(e)%ilon,landpt(e)%ilat) + end do + end do + end if + ! _______ MMY @Oct2022 taken from write_default_params _______ + soil%elev = max(0.0,min(1.0e10,soil%elev)) + soil%slope = max(0.000001,min(0.9,soil%slope)) + soil%slope_std = max(0.0005,min(0.01,soil%slope_std)) + soil%GWdz = max(7.0,min(150.0,soil%GWdz)) + soil%drain_dens = max(1.0e-8,min(0.01,soil%drain_dens)) + ! ____________________________________________________________ + + ! ????????? MMY move from derived_parameters, but should it be here ????????? +! print *,'MMY-phase 2 check, soil_depth(:,klev)', soil_depth(:,klev) +! print *,'MMY-phase 2 check, soil%zdepth(:)', soil%zdepth(:) +! print *,'MMY-phase 2 check, soil%hkrz(:)', soil%hkrz(:) +! print *,'MMY-phase 2 check, soil%hyds_vec(:,klev)', soil%hyds_vec(:,klev) + +! 2 lines below inserted to fix bug of uninitialized soil%hkrz(:) and soil%zdepth(:) here in MMY code - rk4417 - phase2 +! 2 lines below copied from SUBROUTINE derived_parameters which is called after SUBROUTINE GWspatialParameters - rk4417 - phase2 + + soil%hkrz(:) = real(gw_params%hkrz,r_2) + soil%zdepth(:) = real(gw_params%zdepth,r_2) + + DO klev=1,ms + soil%hyds_vec(:,klev) = soil%hyds_vec(:,klev)*exp(-soil%hkrz(:)*(soil_depth(:,klev)-soil%zdepth(:))) + END DO + ! ??????????????????????????????????????????????????????????????????????????? + !removed gw_soils for now + + END SUBROUTINE GWspatialParameters + +! below to the end of the module added by rk4417 - phase2 + + function get_gw_2d_var_constdef(ncfile_id,try_it,varname,default_const,nlon,nlat) result(data_vec) + use netcdf + use cable_def_types_mod, only : r_2,mp + real, intent(in) :: default_const + integer, intent(in) :: try_it,nlon,nlat + character(len=*), intent(in) :: varname + integer, intent(in) :: ncfile_id + real(r_2), dimension(mp) :: data_vec + + real, dimension(nlon,nlat) :: GW2d_data + real, dimension(nlon,nlat) :: default_data + integer :: i,j,k,n + integer :: varid + integer :: varinq_status,varget_status + + print *, "MMY in get_gw_2d_var_constdef" ! MMY add to test whether get_gw_2d_var_constdef is necessary + default_data(:,:) = default_const + + if (.not.cable_user%gw_model) then + + GW2d_data(:,:) = default_data(:,:) + + else + + if (try_it .ne. nf90_noerr) then + varinq_status = try_it + varget_status = try_it + else + + varinq_status = nf90_inq_varid(ncfile_id,trim(varname),varid) + varget_status = varinq_status + + if (varinq_status .eq. nf90_noerr) then + varget_status = nf90_get_var(ncfile_id,varid,GW2d_data) + endif + + end if + + if (try_it.ne. nf90_noerr .or. varget_status .ne. nf90_noerr) then + GW2d_data(:,:) = default_data(:,:) + end if + end if + + do i=1,mland + data_vec(landpt(i)%cstart:landpt(i)%cend) = & + real(GW2d_data(landpt(i)%ilon,landpt(i)%ilat),r_2) + end do + + return + + end function + + function get_gw_2d_var(ncfile_id,try_it,varname,default_data,nlon,nlat) result(data_vec) + use netcdf + use cable_def_types_mod, only : r_2,mp + real, dimension(:,:), intent(in) :: default_data + integer, intent(in) :: try_it,nlon,nlat + character(len=*), intent(in) :: varname + integer, intent(in) :: ncfile_id + real(r_2), dimension(mp) :: data_vec + + real, dimension(nlon,nlat) :: GW2d_data + integer :: i,j,k,n + integer :: varid + integer :: varinq_status,varget_status + + if (.not.cable_user%gw_model) then + + GW2d_data(:,:) = default_data(:,:) + + else + + if (try_it .ne. nf90_noerr) then + varinq_status = try_it + varget_status = try_it + else + + varinq_status = nf90_inq_varid(ncfile_id,trim(varname),varid) + varget_status = varinq_status + + if (varinq_status .eq. nf90_noerr) then + varget_status = nf90_get_var(ncfile_id,varid,GW2d_data) + endif + + end if + + if (try_it.ne. nf90_noerr .or. varget_status .ne. nf90_noerr) then + GW2d_data(:,:) = default_data(:,:) + end if + end if + + do i=1,mland + data_vec(landpt(i)%cstart:landpt(i)%cend) = & + real(GW2d_data(landpt(i)%ilon,landpt(i)%ilat),r_2) + end do + + return + + end function + + function get_gw_3d_var_constdef(ncfile_id,try_it,varname,default_const,nlon,nlat,ms) result(data_vec) + use netcdf + use cable_def_types_mod, only : r_2,mp + real, intent(in) :: default_const + integer, intent(in) :: try_it,nlon,nlat,ms + character(len=*), intent(in) :: varname + integer, intent(in) :: ncfile_id + real(r_2), dimension(mp,ms) :: data_vec + + real, dimension(nlon,nlat,ms) :: GW3d_data + integer :: i,j,k,n + integer :: varid + integer :: varinq_status,varget_status + real, dimension(nlon,nlat) :: default_data + + default_data(:,:) = default_const + + if (.not. cable_user%gw_model) then + do k=1,ms + GW3d_data(:,:,k) = default_data(:,:) + end do + + else + if (try_it .ne. nf90_noerr) then + varinq_status = try_it + varget_status = try_it + else + + varinq_status = nf90_inq_varid(ncfile_id,trim(varname),varid) + varget_status = varinq_status + if (varinq_status .eq. nf90_noerr) then + varget_status = nf90_get_var(ncfile_id,varid,GW3d_data) + endif + + end if + + if (try_it.ne. nf90_noerr .or. varget_status .ne. nf90_noerr) then + do k=1,ms + GW3d_data(:,:,k) = default_data(:,:) + end do + end if + + + end if + + do i=1,mland + do k=1,ms + data_vec(landpt(i)%cstart:landpt(i)%cend,k) = & + real(GW3d_data(landpt(i)%ilon,landpt(i)%ilat,k),r_2) + end do + end do + + return + + end function + + function get_gw_3d_var(ncfile_id,try_it,varname,default_data,nlon,nlat,ms) result(data_vec) + use netcdf + use cable_def_types_mod, only : r_2,mp + real, dimension(:,:), intent(in) :: default_data + integer, intent(in) :: try_it,nlon,nlat,ms + character(len=*), intent(in) :: varname + integer, intent(in) :: ncfile_id + real(r_2), dimension(mp,ms) :: data_vec + + real, dimension(nlon,nlat,ms) :: GW3d_data + integer :: i,j,k,n + integer :: varid + integer :: varinq_status,varget_status + + if (.not. cable_user%gw_model) then + do k=1,ms + GW3d_data(:,:,k) = default_data(:,:) + end do + + else + if (try_it .ne. nf90_noerr) then + varinq_status = try_it + varget_status = try_it + else + + varinq_status = nf90_inq_varid(ncfile_id,trim(varname),varid) + varget_status = varinq_status + + if (varinq_status .eq. nf90_noerr) then + varget_status = nf90_get_var(ncfile_id,varid,GW3d_data) + endif + + end if + + if (try_it.ne. nf90_noerr .or. varget_status .ne. nf90_noerr) then + do k=1,ms + GW3d_data(:,:,k) = default_data(:,:) + end do + end if + + + end if + + do i=1,mland + do k=1,ms + data_vec(landpt(i)%cstart:landpt(i)%cend,k) = & + real(GW3d_data(landpt(i)%ilon,landpt(i)%ilat,k),r_2) + end do + end do + + return + + end function + + function get_gw_4d_var_constdef(ncfile_id,try_it,varname,default_const,nlon,nlat,ms,npatch) result(data_vec) + use netcdf + use cable_def_types_mod, only : r_2,mp + real, intent(in) :: default_const + integer, intent(in) :: try_it,nlon,nlat,ms,npatch + character(len=*), intent(in) :: varname + integer, intent(in) :: ncfile_id + real(r_2), dimension(mp,ms,mpatch) :: data_vec + + integer :: i,j,k,n + integer :: varid + integer :: varinq_status,varget_status + real, dimension(nlon,nlat,ms,mpatch) :: GW4d_data + real, dimension(nlon,nlat,ms) :: GW3d_data + real, dimension(nlon,nlat) :: default_data + + default_data(:,:) = default_const + + if (.not.cable_user%gw_model) then + do k=1,ms + do n=1,npatch + GW4d_data(:,:,k,n) = default_data(:,:) + end do + end do + else + if (try_it .ne. nf90_noerr) then + varinq_status = try_it + varget_status = try_it + else + + varinq_status = nf90_inq_varid(ncfile_id,trim(varname),varid) + varget_status = varinq_status + + if (varinq_status .eq. nf90_noerr) then + if (mpatch .gt. 1) then + varget_status = nf90_get_var(ncfile_id,varid,GW4d_data) + else + varget_status = nf90_get_var(ncfile_id,varid,GW3d_data) + GW4d_data(:,:,:,1) = GW3d_data(:,:,:) + end if + endif + + end if + + if (try_it.ne. nf90_noerr .or. varget_status .ne. nf90_noerr) then + do k=1,ms + do n=1,mpatch + GW4d_data(:,:,k,n) = default_data(:,:) + end do + end do + end if + + + end if + + do i=1,mland + do k=1,ms + do j=1,mpatch + data_vec(landpt(i)%cstart:landpt(i)%cend,k,j) = & + real(GW4d_data(landpt(i)%ilon,landpt(i)%ilat,k,j),r_2) + end do + end do + end do + + return + + end function + + function get_gw_4d_var(ncfile_id,try_it,varname,default_data,nlon,nlat,ms,npatch) result(data_vec) + use netcdf + use cable_def_types_mod, only : r_2,mp + real, dimension(:,:), intent(in) :: default_data + integer, intent(in) :: try_it,nlon,nlat,ms,npatch + character(len=*), intent(in) :: varname + integer, intent(in) :: ncfile_id + real(r_2), dimension(mp,ms,mpatch) :: data_vec + + integer :: i,j,k,n + integer :: varid + integer :: varinq_status,varget_status + real, dimension(nlon,nlat,ms,mpatch) :: GW4d_data + real, dimension(nlon,nlat,ms) :: GW3d_data + + + if (.not.cable_user%gw_model) then + do k=1,ms + do n=1,npatch + GW4d_data(:,:,k,n) = default_data(:,:) + end do + end do + else + if (try_it .ne. nf90_noerr) then + varinq_status = try_it + varget_status = try_it + else + + varinq_status = nf90_inq_varid(ncfile_id,trim(varname),varid) + varget_status = varinq_status + + if (varinq_status .eq. nf90_noerr) then + if (mpatch .gt. 1) then + varget_status = nf90_get_var(ncfile_id,varid,GW4d_data) + else + varget_status = nf90_get_var(ncfile_id,varid,GW3d_data) + GW4d_data(:,:,:,1) = GW3d_data(:,:,:) + end if + + endif + + end if + + if (try_it.ne. nf90_noerr .or. varget_status .ne. nf90_noerr) then + do k=1,ms + do n=1,mpatch + GW4d_data(:,:,k,n) = default_data(:,:) + end do + end do + end if + + + end if + + do i=1,mland + do k=1,ms + do j=1,mpatch + data_vec(landpt(i)%cstart:landpt(i)%cend,k,j) = & + real(GW4d_data(landpt(i)%ilon,landpt(i)%ilat,k,j),r_2) + end do + end do + end do + + return + + end function END MODULE cable_param_module From 281a6216f395fecc65a5e823ebedf6ae4198f748 Mon Sep 17 00:00:00 2001 From: Sean Bryan <39685865+SeanBryan51@users.noreply.github.com> Date: Tue, 19 Mar 2024 12:35:17 +1100 Subject: [PATCH 14/85] Add model build CI for CABLE offline (#223) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Making CABLE available as a [spack](https://spack.io/) package allows us to test the model compiles successfully inside a continuous integration (CI) environment which gets triggered automatically on a pull request. This change adds the model build CI workflow developed by the ACCESS-NRI release team to compile CABLE offline via spack (see [build-ci](https://github.com/ACCESS-NRI/build-ci) for more details). This workflow compiles CABLE using the intel compiler. The CI for other compilers will follow after this pull request. Fixes #202 ---- 📚 Documentation preview 📚: https://cable--223.org.readthedocs.build/en/223/ --- .github/workflows/model-build-test-ci.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/workflows/model-build-test-ci.yml diff --git a/.github/workflows/model-build-test-ci.yml b/.github/workflows/model-build-test-ci.yml new file mode 100644 index 000000000..f53802e9d --- /dev/null +++ b/.github/workflows/model-build-test-ci.yml @@ -0,0 +1,15 @@ +name: Test model build + +on: + workflow_dispatch: + pull_request: + push: + branches: + - "master" + +jobs: + build: + name: Build ${{ github.repository }} via spack + uses: access-nri/build-ci/.github/workflows/model-1-build.yml@983fb50caaf0fe7e93bb3b13e09e81a7b846f7d1 + permissions: + packages: read \ No newline at end of file From fba0e4a30e02a374679e39b0478a35e012dccf55 Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh Date: Sun, 7 Apr 2024 21:14:31 +1000 Subject: [PATCH 15/85] Replace cable_gw_hydro.F90 with its new version --- src/offline/cable_define_types.F90 | 18 +- src/offline/cable_parameters.F90 | 574 +++++- src/science/gw_hydro/cable_gw_hydro.F90 | 2333 ++++++++++++++--------- src/science/soilsnow/cbl_thermal.F90 | 12 +- src/util/cable_common.F90 | 67 +- 5 files changed, 2006 insertions(+), 998 deletions(-) diff --git a/src/offline/cable_define_types.F90 b/src/offline/cable_define_types.F90 index 46f8977d9..9d0187475 100644 --- a/src/offline/cable_define_types.F90 +++ b/src/offline/cable_define_types.F90 @@ -162,6 +162,8 @@ MODULE cable_def_types_mod rhosoil_vec,& !soil density [kg/m3] ssat_vec, & !volumetric water content at saturation [mm3/mm3] watr, & !residual water content of the soil [mm3/mm3] + smpc_vec, & ! Hutson Cass SWC potential cutoff ! 2 lines inserted by rk4417 - phase2 + wbc_vec, & ! Hutson Cass SWC volumetric water cutoff sfc_vec, & !field capcacity (hk = 1 mm/day) swilt_vec ! wilting point (hk = 0.02 mm/day) @@ -187,6 +189,8 @@ MODULE cable_def_types_mod GWssat_vec, & !saturated water content of the aquifer [mm3/mm3] GWwatr, & !residual water content of the aquifer [mm3/mm3] GWz, & !node depth of the aquifer [m] + smpc_GW, & ! Hutson Cass SWC potential cutoff ! 2 lines inserted by rk4417 - phase2 + wbc_GW, & ! Hutson Cass SWC volumetric water cutoff GWdz, & !thickness of the aquifer [m] GWrhosoil_vec !density of the aquifer substrate [kg/m3] @@ -240,7 +244,7 @@ MODULE cable_def_types_mod owetfac, & ! surface wetness fact. at previous time step t_snwlr, & ! top snow layer depth in 3 layer snowpack tggav, & ! mean soil temperature in K - otgg, & ! soil temperature in K +! otgg, & ! soil temperature in K ! moved below by rk4417 - phase2 otss, & ! surface temperature (weighted soil, snow) otss_0, & ! surface temperature (weighted soil, snow) tprecip, & @@ -267,6 +271,7 @@ MODULE cable_def_types_mod sdepth, & ! snow depth smass, & ! snow mass ssdn, & ! snow densities + otgg, & ! soil temperature in K ! moved here from above by rk4417 - phase2 tgg, & ! soil temperature in K tggsn, & ! snow temperature in K dtmlt, & ! water flux to the soil @@ -880,6 +885,10 @@ SUBROUTINE alloc_soil_parameter_type(var, mp) ALLOCATE( var%ssat_vec(mp,ms) ) ALLOCATE( var%watr(mp,ms) ) var%watr(:,:) = 0.05 + ALLOCATE( var%wbc_GW(mp) ) ! block inserted by rk4417 - phase2 + ALLOCATE( var%smpc_GW(mp) ) + ALLOCATE( var%wbc_vec(mp,ms) ) + ALLOCATE( var%smpc_vec(mp,ms) ) ! end - rk4417 - phase ALLOCATE( var%sfc_vec(mp,ms) ) ALLOCATE( var%swilt_vec(mp,ms) ) ALLOCATE( var%sand_vec(mp,ms) ) @@ -977,7 +986,8 @@ SUBROUTINE alloc_soil_snow_type(var, mp) ALLOCATE( var%t_snwlr(mp) ) ALLOCATE( var%wbfice(mp,ms) ) ALLOCATE( var%tggav(mp) ) - ALLOCATE( var%otgg(mp) ) +! ALLOCATE( var%otgg(mp) ) ! replaced by below - rk4417 - phase2 + ALLOCATE( var%otgg(mp,ms) ) ALLOCATE( var%otss(mp) ) ALLOCATE( var%otss_0(mp) ) ALLOCATE( var%tprecip(mp) ) @@ -1520,6 +1530,10 @@ SUBROUTINE dealloc_soil_parameter_type(var) DEALLOCATE( var% cnsd_vec ) DEALLOCATE( var%hyds_vec ) DEALLOCATE( var%sucs_vec ) + DEALLOCATE( var%wbc_GW ) ! block inserted by rk4417 - phase2 + DEALLOCATE( var%smpc_GW ) + DEALLOCATE( var%wbc_vec ) + DEALLOCATE( var%smpc_vec ) ! end - rk4417 - phase DEALLOCATE( var%bch_vec ) DEALLOCATE( var%ssat_vec ) DEALLOCATE( var%watr ) diff --git a/src/offline/cable_parameters.F90 b/src/offline/cable_parameters.F90 index 534f73d43..e69ead88c 100644 --- a/src/offline/cable_parameters.F90 +++ b/src/offline/cable_parameters.F90 @@ -1757,6 +1757,20 @@ SUBROUTINE write_cnp_params(veg, casaflux, casamet) END SUBROUTINE write_cnp_params !============================================================================ SUBROUTINE derived_parameters(soil, sum_flux, bal, ssnow, veg, rough) + + ! ______ MMY: derived_parameters is changed by MMY @ 13 Oct 2022 ______ + ! MMY required input sand_vec, silt_vec, clay_vec ,rhosoil_vec and org_vec + ! MMY units: soil%hyds_vec : mm/s + ! soil%sand_vec, soil%clay_vec, soil%silt_vec : fraction + ! soil%sucs_vec : mm, positive + ! soil%bch_vec : - + ! soil%watr, soil%swilt_vec, soil%sfc_vec, soil%ssat_vec: m3/m3 + ! soil%org_vec : m3/m3 + ! soil%rhosoil_vec : kg/m3 + ! soil%css: "J/kg/K" + ! soil%cnsd: "W/m/K" + ! soil%wbc_vec, soil%smpc_vec + ! Gives values to parameters that are derived from other parameters. TYPE (soil_snow_type), INTENT(INOUT) :: ssnow TYPE (veg_parameter_type), INTENT(IN) :: veg @@ -1765,122 +1779,466 @@ SUBROUTINE derived_parameters(soil, sum_flux, bal, ssnow, veg, rough) TYPE (balances_type), INTENT(INOUT) :: bal TYPE (roughness_type), INTENT(INOUT) :: rough - INTEGER :: j,i,klev ! do loop counter +! INTEGER :: j,i,klev ! do loop counter + INTEGER :: j,i,klev,k ! do loop counter ! replaces line above - rk4417 - phase2 REAL(r_2) :: temp(mp) REAL :: tmp2(mp) REAL(r_2), DIMENSION(mp,ms) :: perc_frac - REAL(r_2), DIMENSION(17) :: psi_o,psi_c - REAL(r_2), DIMENSION(mp,ms) :: psi_tmp - REAL(r_2), DIMENSION(ms) :: soil_depth + REAL(r_2), DIMENSION(17) :: psi_o,psi_c ! psi_o is not needed - rk4417 - phase2 - soil_depth(1) = REAL(soil%zse(1),r_2) - DO klev=2,ms - soil_depth(klev) = soil_depth(klev-1) + REAL(soil%zse(klev),r_2) - END DO +! REAL(r_2), DIMENSION(mp,ms) :: psi_tmp +! REAL(r_2), DIMENSION(ms) :: soil_depth + +! 2 lines above replaced by below - rk4417 - phase2 + + REAL(r_2), DIMENSION(mp,ms) :: psi_tmp, sst_tmp ! MMY add sst_tmp + REAL(r_2), DIMENSION(mp,ms) :: soil_depth ! MMY,rhosoil_temp + + REAL(r_2), DIMENSION(:,:), ALLOCATABLE :: ssat_bounded,rho_soil_bulk ! added by rk4417 - phase2 + +! line below inserted by rk4417 - phase2 + where(veg%iveg .eq. 17) soil%isoilm = 9 ! MMY@13April it says where iveg = ice, isoilm = permanent ice + +! soil_depth(1) = REAL(soil%zse(1),r_2) +! DO klev=2,ms +! soil_depth(klev) = soil_depth(klev-1) + REAL(soil%zse(klev),r_2) +! END DO + +! block above replaced by block below - rk4417 - phase2 - psi_o(1:3) = -66000._r_2 - psi_o(4) = -35000._r_2 - psi_o(5) = -83000._r_2 - psi_o(6:17) = -74000._r_2 - psi_c(1:3) = -2550000._r_2 + soil_depth(:,1) = soil%zse_vec(:,1) + do klev=2,ms + soil_depth(:,klev) = soil_depth(:,klev-1) + soil%zse_vec(:,klev) + end do + +! psi_o(1:3) = -66000._r_2 ! not needed - rk4417 - phase2 +! psi_o(4) = -35000._r_2 +! psi_o(5) = -83000._r_2 +! psi_o(6:17) = -74000._r_2 + + psi_c(1:3) = -2550000._r_2 ! used to be in the old cable_common.F90 - rk4417 - phase2 psi_c(4) = -2240000._r_2 psi_c(5) = -4280000._r_2 psi_c(6:17) = -2750000._r_2 + + ! _______ MMY@19May2023 move back since moving below will cause gw_off issue ________ ! Construct derived parameters and zero initialisations, ! regardless of where parameters and other initialisations ! have loaded from: soil%zshh(1) = 0.5 * soil%zse(1) ! distance between consecutive layer - ! midpoints: + ! midpoints: soil%zshh(ms + 1) = 0.5 * soil%zse(ms) soil%zshh(2:ms) = 0.5 * (soil%zse(1:ms-1) + soil%zse(2:ms)) !MD aquifer node depth soil%GWz = 0.5*soil%GWdz + SUM(soil%zse) !node is halfway through aquifer depth +! MMY note: GWz doesn't function, kept for later + +! IF (cable_user%GW_MODEL) THEN +! +! DO klev=1,ms +! soil%hyds_vec(:,klev) = 0.0070556*10.0**(-0.884 + 0.0153*soil%Sand_Vec(:,klev)*100.0)* & +! EXP(-gw_params%hkrz*(MAX(0.,soil_depth(klev)-gw_params%zdepth))) +! soil%sucs_vec(:,klev) = 10.0 * 10.0**(1.88 -0.0131*soil%Sand_Vec(:,klev)*100.0) +! soil%bch_vec(:,klev) = 2.91 + 0.159*soil%Clay_Vec(:,klev)*100.0 +! soil%ssat_vec(:,klev) = 0.489 - 0.00126*soil%Sand_Vec(:,klev)*100.0 +! soil%watr(:,klev) = 0.02 + 0.00018*soil%Clay_Vec(:,klev)*100.0 +! ENDDO +! !aquifer share non-organic with last layer if not found in param file +! IF (found_explicit_gw_parameters .EQV. .FALSE.) THEN +! soil%GWhyds_vec(:) = soil%hyds_vec(:,ms) +! soil%GWsucs_vec(:) = soil%sucs_vec(:,ms) +! soil%GWbch_vec(:) = soil%bch_vec(:,ms) +! soil%GWssat_vec(:) = soil%ssat_vec(:,ms) +! soil%GWwatr(:) = soil%watr(:,ms) +! ENDIF +! !include organin impact. fraction of grid cell where percolation through +! !organic macropores dominates +! soil%Org_Vec = MAX(0._r_2,soil%Org_Vec) +! soil%Org_Vec = MIN(1._r_2,soil%Org_Vec) +! DO klev=1,3 !0-23.3 cm, data really is to 30cm +! soil%hyds_vec(:,klev) = (1.-soil%Org_Vec(:,klev))*soil%hyds_vec(:,klev) + & +! soil%Org_Vec(:,klev)*gw_params%org%hyds_vec_organic +! soil%sucs_vec(:,klev) = (1.-soil%Org_Vec(:,klev))*soil%sucs_vec(:,klev) + & +! soil%Org_Vec(:,klev)*gw_params%org%sucs_vec_organic +! soil%bch_vec(:,klev) = (1.-soil%Org_Vec(:,klev))*soil%bch_vec(:,klev) +& +! soil%Org_Vec(:,klev)*gw_params%org%clappb_organic +! soil%ssat_vec(:,klev) = (1.-soil%Org_Vec(:,klev))*soil%ssat_vec(:,klev) + & +! soil%Org_Vec(:,klev)*gw_params%org%ssat_vec_organic +! soil%watr(:,klev) = (1.-soil%Org_Vec(:,klev))*soil%watr(:,klev) + & +! soil%Org_Vec(:,klev)*gw_params%org%watr_organic +! END DO +! +! !vegetation dependent field capacity (point plants get stressed) and +! !wilting point +! DO i=1,mp +! psi_tmp(i,:) = -psi_c(veg%iveg(i)) +! END DO +! soil%sfc_vec = (soil%ssat_vec-soil%watr) * (ABS(psi_tmp)/(ABS(soil%sucs_vec)))**(-1.0/soil%bch_vec)+& +! soil%watr +! DO i=1,mp +! psi_tmp(i,:) = -psi_c(veg%iveg(i)) +! END DO +! soil%swilt_vec = (soil%ssat_vec-soil%watr) * (ABS(psi_tmp)/(ABS(soil%sucs_vec)))**(-1.0/soil%bch_vec)+& +! soil%watr +! +! !set the non-vectored values to srf value +! soil%sfc(:) = REAL(soil%sfc_vec(:,1)) +! soil%swilt(:) = REAL(soil%swilt_vec(:,1)) +! +! !convert the units back to what default uses and GW only uses the +! !vectored versions +! soil%hyds = REAL(soil%hyds_vec(:,1))/1000.0 +! soil%sucs = REAL(soil%sucs_vec(:,1))/1000.0 +! soil%ssat = REAL(soil%ssat_vec(:,1)) +! soil%bch = REAL(soil%bch_vec(:,1)) +! +! DO i=1,mp +! soil%slope(i) = MIN(0.9,MAX(1e-9,soil%slope(i))) +! soil%slope_std(i) = MIN(0.9,MAX(1e-9,soil%slope_std(i))) +! END DO +! +! IF ((gw_params%MaxSatFraction .LT. -9999.9) .AND. (mp .EQ. 1)) soil%slope(:) = 0.01 +! +! ELSE +! +! soil%sfc_vec = REAL(SPREAD(soil%sfc(:),2,ms),r_2) +! soil%swilt_vec = REAL(SPREAD(soil%swilt(:),2,ms),r_2) +! !These are not used when gw_model == false +! soil%watr = 0._r_2 +! soil%GWwatr = 0._r_2 +! +! END IF +! +! +! IF ( .NOT. soilparmnew) THEN ! Q,Zhang @ 12/20/2010 +! soil%cnsd = soil%sand * 0.3 + soil%clay * 0.25 & +! + soil%silt * 0.265 ! set dry soil thermal conductivity +! ! [W/m/K] +! END IF +! +! soil%hsbh = soil%hyds*ABS(soil%sucs) * soil%bch ! difsat*etasat +! soil%ibp2 = NINT(soil%bch) + 2 +! ! Ticket #66 +! WHERE( soil%ssat > 0.) & ! Avoid divide by +! soil%pwb_min = (soil%swilt/soil%ssat)**soil%ibp2 +! soil%i2bp3 = 2 * NINT(soil%bch) + 3 +! rough%hruff = MAX(0.01, veg%hc - 1.2 * ssnow%snowd/MAX(ssnow%ssdnn, 100.)) +! rough%hruff_grmx = rough%hruff +! ! owetfac introduced by EAK apr2009 +! ssnow%owetfac = MAX(0.0, MIN(1.0, & +! (REAL(ssnow%wb(:, 1)) - soil%swilt) / & +! (soil%sfc - soil%swilt))) +! temp(:) = 0.0 +! tmp2(:) = 0.0 +! WHERE ( ssnow%wbice(:, 1) > 0. ) ! Prevents divide by zero at glaciated +! ! points where wb and wbice=0. +! temp(:) = ssnow%wbice(:, 1) / ssnow%wb(:, 1) +! tmp2(:) = REAL(temp(:)) +! ssnow%owetfac = ssnow%owetfac * (1.0 - tmp2(:)) ** 2 +! +! END WHERE +! ssnow%pudsto = 0.0 +! ssnow%pudsmx = 0.0 +! +! ! Initialise sum flux variables: +! sum_flux%sumpn = 0.0 +! sum_flux%sumrp = 0.0 +! sum_flux%sumrpw = 0.0 +! sum_flux%sumrpr = 0.0 +! sum_flux%sumrs = 0.0 +! sum_flux%sumrd = 0.0 +! sum_flux%dsumpn = 0.0 +! sum_flux%dsumrp = 0.0 +! sum_flux%dsumrd = 0.0 +! ! Initialise conservation variables: +! bal%precip_tot = 0.0 +! bal%rnoff_tot = 0.0 +! bal%evap_tot = 0.0 +! bal%wbal_tot = 0.0 +! bal%ebal_tot = 0.0 +! bal%ebal_tot_cncheck = 0.0 +! bal%drybal = 0.0 +! bal%wetbal = 0.0 +! bal%wbtot0 = 0.0 +! bal%RadbalSum = 0.0 +! DO j=1, ms +! bal%wbtot0 = bal%wbtot0 + REAL(ssnow%wb(:, j)) * soil%zse(j) & +! * 1000.0 +! END DO +! bal%osnowd0 = ssnow%osnowd +! +! ! vh_js ! comment out hide% condition +! ! IF (hide%Ticket49Bug6) THEN +! +! IF(cable_user%SOIL_STRUC=='sli') THEN +! ! Only 1 horizon by default ! +! soil%nhorizons = 1 +! soil%ishorizon = 1 +! END IF +! ! END IF + +! above commented-out portion replaced by remainder of subroutine below - rk4417 - phase2 + + IF (cable_user%GW_MODEL) then + soil%qhz_max(:) = real(gw_params%MaxHorzDrainRate,r_2) !enable distributed values + soil%hkrz(:) = real(gw_params%hkrz,r_2) + soil%zdepth(:) = real(gw_params%zdepth,r_2) - IF (cable_user%GW_MODEL) THEN + !placeholder + soil%srf_frac_ma(:) = 0._r_2 + soil%edepth_ma(:) = 0._r_2 + + soil%qhz_efold(:) = real(gw_params%EfoldHorzDrainScale,r_2)*soil%drain_dens(:)& + + real(gw_params%EfoldHorzDrainRate,r_2) - DO klev=1,ms - soil%hyds_vec(:,klev) = 0.0070556*10.0**(-0.884 + 0.0153*soil%Sand_Vec(:,klev)*100.0)* & - EXP(-gw_params%hkrz*(MAX(0.,soil_depth(klev)-gw_params%zdepth))) - soil%sucs_vec(:,klev) = 10.0 * 10.0**(1.88 -0.0131*soil%Sand_Vec(:,klev)*100.0) - soil%bch_vec(:,klev) = 2.91 + 0.159*soil%Clay_Vec(:,klev)*100.0 - soil%ssat_vec(:,klev) = 0.489 - 0.00126*soil%Sand_Vec(:,klev)*100.0 - soil%watr(:,klev) = 0.02 + 0.00018*soil%Clay_Vec(:,klev)*100.0 - ENDDO - !aquifer share non-organic with last layer if not found in param file - IF (found_explicit_gw_parameters .EQV. .FALSE.) THEN - soil%GWhyds_vec(:) = soil%hyds_vec(:,ms) - soil%GWsucs_vec(:) = soil%sucs_vec(:,ms) - soil%GWbch_vec(:) = soil%bch_vec(:,ms) - soil%GWssat_vec(:) = soil%ssat_vec(:,ms) - soil%GWwatr(:) = soil%watr(:,ms) - ENDIF !include organin impact. fraction of grid cell where percolation through !organic macropores dominates - soil%Org_Vec = MAX(0._r_2,soil%Org_Vec) - soil%Org_Vec = MIN(1._r_2,soil%Org_Vec) - DO klev=1,3 !0-23.3 cm, data really is to 30cm - soil%hyds_vec(:,klev) = (1.-soil%Org_Vec(:,klev))*soil%hyds_vec(:,klev) + & - soil%Org_Vec(:,klev)*gw_params%org%hyds_vec_organic - soil%sucs_vec(:,klev) = (1.-soil%Org_Vec(:,klev))*soil%sucs_vec(:,klev) + & - soil%Org_Vec(:,klev)*gw_params%org%sucs_vec_organic - soil%bch_vec(:,klev) = (1.-soil%Org_Vec(:,klev))*soil%bch_vec(:,klev) +& - soil%Org_Vec(:,klev)*gw_params%org%clappb_organic - soil%ssat_vec(:,klev) = (1.-soil%Org_Vec(:,klev))*soil%ssat_vec(:,klev) + & - soil%Org_Vec(:,klev)*gw_params%org%ssat_vec_organic - soil%watr(:,klev) = (1.-soil%Org_Vec(:,klev))*soil%watr(:,klev) + & - soil%Org_Vec(:,klev)*gw_params%org%watr_organic - END DO + soil%org_vec = max(0._r_2,soil%org_vec) + soil%org_vec = min(1._r_2,soil%org_vec) - !vegetation dependent field capacity (point plants get stressed) and - !wilting point - DO i=1,mp - psi_tmp(i,:) = -psi_c(veg%iveg(i)) - END DO - soil%sfc_vec = (soil%ssat_vec-soil%watr) * (ABS(psi_tmp)/(ABS(soil%sucs_vec)))**(-1.0/soil%bch_vec)+& - soil%watr - DO i=1,mp - psi_tmp(i,:) = -psi_c(veg%iveg(i)) + DO klev=1,ms + do i=1,mp + if (abs(soil%sand_vec(i,klev) + soil%clay_vec(i,klev) +& + soil%silt_vec(i,klev)-1.0) .gt. 0.1) then + soil%sand_vec(i,klev) = 0.4 + soil%clay_vec(i,klev) = 0.2 + soil%silt_vec(i,klev) = 0.4 + endif + END DO END DO - soil%swilt_vec = (soil%ssat_vec-soil%watr) * (ABS(psi_tmp)/(ABS(soil%sucs_vec)))**(-1.0/soil%bch_vec)+& - soil%watr - !set the non-vectored values to srf value - soil%sfc(:) = REAL(soil%sfc_vec(:,1)) - soil%swilt(:) = REAL(soil%swilt_vec(:,1)) + DO klev=1,ms;do i=1,mp + ! MMY use single var (uni) or two var (multi) regression from Cosby 1984 + ! MMY or use Hutson-Cass SWC + if (gw_params%cosby_univariate) then + soil%hyds_vec(i,klev) = 0.0070556*10.0**(-0.884 + 1.53*soil%sand_vec(i,klev))* & + exp(-soil%hkrz(i)*(MAX(0.,soil_depth(i,klev)-soil%zdepth(i)))) ! MMY add MAX(0.,...) + ! MMY add MAX(0.,...) for stopping hyds increase in shallow soil + ! MMY NEED to figure out the source of this equation + soil%sucs_vec(i,klev) = 10.0 * 10.0**(1.88 -1.31*soil%sand_vec(i,klev)) + soil%bch_vec(i,klev) = 2.91 + 15.9*soil%clay_vec(i,klev) + soil%ssat_vec(i,klev) = min(0.489,max(0.1, 0.489 - 0.126*soil%sand_vec(i,klev) ) ) + !forgot source but not from cosby and not for BC characteristic function + soil%watr(i,klev) = 0.02 + 0.018*soil%clay_vec(i,klev) !forgot + soil%wbc_vec(i,klev) = 0.0 + soil%smpc_vec(i,klev) = 0.0 + elseif (gw_params%cosby_multivariate) then + soil%hyds_vec(i,klev) = 0.00706*(10.0**(-0.60 + 1.26*soil%sand_vec(i,klev) + & + -0.64*soil%clay_vec(i,klev) ) )*& + exp(-soil%hkrz(i)*(MAX(0.,soil_depth(i,klev)-soil%zdepth(i)))) ! MMY add MAX(0.,...) + soil%sucs_vec(i,klev) = 10.0 * 10.0**(1.54 - 0.95*soil%sand_vec(i,klev) + & + 0.63*soil%silt_vec(i,klev) ) + soil%bch_vec(i,klev) = 3.1 + 15.4*soil%clay_vec(i,klev) - & + 0.3*soil%sand_vec(i,klev) + soil%ssat_vec(i,klev) = 0.505 - 0.142*soil%sand_vec(i,klev) - & + 0.037*soil%clay_vec(i,klev) + !forgot source but not from cosby and not for BC characteristic function + soil%watr(i,klev) = 0.02 + 0.018*soil%clay_vec(i,klev) + soil%wbc_vec(i,klev) = 0.0 + soil%smpc_vec(i,klev) = 0.0 + + elseif (gw_params%HC_SWC) THEN + ! Hutson-Cass SWC : seperate dry/wet avoid discont in derv at smp=sucs + ! pedotransfer from T. Mayra, N.J. Jarvis, Geoderma 91, 1999, + ! https://doi.org/10.1016/S0016-7061(98)00129-3 + soil%sucs_vec(i,klev) = 10.0 * 10.0** ( -4.98403 +& + 5.0922*soil%sand_vec(i,klev) + & + 15.751*soil%silt_vec(i,klev) + & + 0.124090*soil%rhosoil_vec(i,klev) - & + 16.4000*soil%org_vec(i,klev) - & + 21.76*(soil%silt_vec(i,klev)**2.0) + & + 14.382*(soil%silt_vec(i,klev)**3.0) + & + 8.0407*(soil%clay_vec(i,klev)**2.0) + & + 44.06*(soil%org_vec(i,klev)**2.0) ) + + soil%bch_vec(i,klev) = 10.0**(1.0 / (-0.84669 - & + 0.4680*soil%sand_vec(i,klev) & + +0.9246*soil%silt_vec(i,klev) & + -0.4543*soil%rhosoil_vec(i,klev) & + -0.04979*soil%org_vec(i,klev) & + +3.2947*(soil%sand_vec(i,klev)**2.0) & + -1.689*(soil%sand_vec(i,klev)**3.0) & + +11.2*(soil%org_vec(i,klev)**3.0) )) + + soil%ssat_vec(i,klev) = 0.234597 + & + 0.466142*soil%sand_vec(i,klev) + & + 0.88163*soil%silt_vec(i,klev) + & + 0.643386*soil%clay_vec(i,klev) - & + 0.3028160*soil%rhosoil_vec(i,klev) + & + 0.179762*(soil%sand_vec(i,klev)**2.0) - & + 0.03134631*(soil%silt_vec(i,klev)**2.0) + soil%hyds_vec(i,klev) = 0.00706*(10.0**(-0.60 & + +1.26*soil%sand_vec(i,klev) & + -0.64*soil%clay_vec(i,klev)))* & + exp(-soil%hkrz(i)* & + (soil_depth(i,klev)-soil%zdepth(i))) + soil%watr(i,klev) = 0.0 + if (klev .eq. 1) soil%GWwatr(i) = 0.0 + else + print *, "MMY Please choose the pedotransfer function from cosby_univariate, cosby_multivariate and HC_SWC" + end if + end do; end do + + ! MMY take soil organic material impact into consideration + if (.not.gw_params%HC_SWC) then + DO klev=1,ms !0-23.3 cm, data really is to 30cm + do i=1,mp + soil%hyds_vec(i,klev) = (1.-soil%org_vec(i,klev))*soil%hyds_vec(i,klev) + & + soil%org_vec(i,klev)*gw_params%org%hyds_organic* & + exp(-soil%hkrz(i)*(soil_depth(i,klev)-soil%zdepth(i))) + soil%sucs_vec(i,klev) = (1.-soil%org_vec(i,klev))*soil%sucs_vec(i,klev) + & + soil%org_vec(i,klev)*gw_params%org%sucs_organic + soil%bch_vec(i,klev) = (1.-soil%org_vec(i,klev))*soil%bch_vec(i,klev) +& + soil%org_vec(i,klev)*gw_params%org%bch_organic + soil%ssat_vec(i,klev) = (1.-soil%org_vec(i,klev))*soil%ssat_vec(i,klev) + & + soil%org_vec(i,klev)*gw_params%org%ssat_organic + soil%watr(i,klev) = (1.-soil%org_vec(i,klev))*soil%watr(i,klev) + & + soil%org_vec(i,klev)*gw_params%org%watr_organic + END DO + END DO + end if + + ! MMY sfc_vec (field capacity ): "The volumetric water content at field capacity is derived by assuming a + ! hydraulic conductivity of 0.1 mm day-1 (0.1 mm day-1 / 86400s = 1.157407e-06 mm/s = gw_params%sfc_vec_hk) + ! and inverting the hydraulic conductivity function" from CLM 4.5 tech note Page 85 + ! MMY swilt_vec (wilting point): vegetation dependent wilting point (point plants get stressed), inverting the water retention curve + + do klev=1,ms + do i=1,mp + if (soil%isoilm(i) .ne. 9 .and. veg%iveg(i) .le. 16) then + + psi_tmp(i,klev) = abs(psi_c(veg%iveg(i))) + + soil%swilt_vec(i,klev) = (soil%ssat_vec(i,klev)-soil%watr(i,klev)) * & + (psi_tmp(i,klev)/soil%sucs_vec(i,klev))& + **(-1.0/soil%bch_vec(i,klev))+soil%watr(i,klev) + soil%sfc_vec(i,klev) = (soil%ssat_vec(i,klev)-soil%watr(i,klev)) * & + (gw_params%sfc_vec_hk/soil%hyds_vec(i,klev)) & + **(1.0/(2.0*soil%bch_vec(i,klev)+3.0)) + & + soil%watr(i,klev) + soil%swilt_vec(i,klev) = min(0.95*soil%sfc_vec(i,klev),soil%swilt_vec(i,klev)) + + else + + soil%swilt_vec(i,klev) = soil%swilt(i) + soil%sfc_vec(i,klev) = soil%sfc(i) + + end if + end do + end do + ! MMY GW does not use non-vectored values so they are simply set as the 3rd soil layer's value rather + ! than derived here. Choosing 3rd layer since the top layer is thin and lack of representation. + soil%bch = real(soil%bch_vec(:,3)) + soil%sand = real(soil%sand_vec(:,3)) + soil%clay = real(soil%clay_vec(:,3)) + soil%silt = real(soil%silt_vec(:,3)) + soil%sfc = real(soil%sfc_vec(:,3)) + soil%swilt = real(soil%swilt_vec(:,3)) + soil%ssat = real(soil%ssat_vec(:,3)) + soil%rhosoil = real(soil%rhosoil_vec(:,3)) + !convert the units back to what default uses and GW only uses the !vectored versions - soil%hyds = REAL(soil%hyds_vec(:,1))/1000.0 - soil%sucs = REAL(soil%sucs_vec(:,1))/1000.0 - soil%ssat = REAL(soil%ssat_vec(:,1)) - soil%bch = REAL(soil%bch_vec(:,1)) - - DO i=1,mp - soil%slope(i) = MIN(0.9,MAX(1e-9,soil%slope(i))) - soil%slope_std(i) = MIN(0.9,MAX(1e-9,soil%slope_std(i))) - END DO + soil%hyds = real(soil%hyds_vec(:,3))/1000.0 ! MMY mm/s -> m/s + soil%sucs = -1.* ABS(real(soil%sucs_vec(:,3))/1000.0) ! MMY mm -> m + + ! MMY assume aquifer share soil params with last layer + soil%GWhyds_vec(:) = soil%hyds_vec(:,ms) + soil%GWsucs_vec(:) = soil%sucs_vec(:,ms) + soil%GWbch_vec(:) = soil%bch_vec(:,ms) + soil%GWssat_vec(:) = soil%ssat_vec(:,ms) + soil%GWwatr(:) = soil%watr(:,ms) + + ! MMY adjust slope and slope_std + do i=1,mp + soil%slope(i) = min(0.9,max(1e-5,soil%slope(i))) + soil%slope_std(i) = min(0.9,max(1e-5,soil%slope_std(i))) + end do - IF ((gw_params%MaxSatFraction .LT. -9999.9) .AND. (mp .EQ. 1)) soil%slope(:) = 0.01 + if ((gw_params%MaxSatFraction .lt. -9999.9) .and. (mp .eq. 1)) soil%slope(:) = 0.01 - ELSE + ELSE !not gw model - soil%sfc_vec = REAL(SPREAD(soil%sfc(:),2,ms),r_2) - soil%swilt_vec = REAL(SPREAD(soil%swilt(:),2,ms),r_2) - !These are not used when gw_model == false - soil%watr = 0._r_2 - soil%GWwatr = 0._r_2 + !These are not used when gw_model == false + soil%watr = 0._r_2 + soil%GWwatr = 0._r_2 - END IF + END IF + IF (cable_user%soil_thermal_fix) then + IF ((.not.(gw_params%cosby_univariate.or.gw_params%cosby_multivariate)) .or. .not.cable_user%gw_model) THEN + WRITE(logn,*) 'OVER WRITING CSS_VEC, RHOSOIL_VEC, CNSD_VEC read from gw_type input' + WRITE(logn,*) 'Forcing values consistant with soil_thermal_fix = true ' + WRITE(*,*) 'OVER WRITING CSS_VEC, RHOSOIL_VEC, CNSD_VEC read from gw_type input' + WRITE(*,*) 'Forcing values consistant with soil_thermal_fix = true ' + END IF - IF ( .NOT. soilparmnew) THEN ! Q,Zhang @ 12/20/2010 - soil%cnsd = soil%sand * 0.3 + soil%clay * 0.25 & - + soil%silt * 0.265 ! set dry soil thermal conductivity - ! [W/m/K] - END IF + if (allocated(ssat_bounded)) deallocate(ssat_bounded) + if (allocated(rho_soil_bulk)) deallocate(rho_soil_bulk) + + allocate(ssat_bounded(size(soil%ssat_vec,dim=1), size(soil%ssat_vec,dim=2) ) ) + ssat_bounded(:,:) = min( 0.8, max(0.1, soil%ssat_vec(:,:) ) ) + + allocate(rho_soil_bulk(size(soil%rhosoil_vec,dim=1), size(soil%rhosoil_vec,dim=2) ) ) + rho_soil_bulk(:,:) = min(2500.0, max(500.0 , (2700.0*(1.0 - ssat_bounded(:,:)) ) ) ) + + do klev=1,ms + do i=1,mp + soil%cnsd_vec(i,klev) = ( (0.135*(1.0-ssat_bounded(i,klev))) +& + (64.7/soil%rhosoil_vec(i,klev)) ) / & + (1.0 - 0.947*(1.0-ssat_bounded(i,klev))) + ! ??????????? MMY ??????????? + soil%rhosoil_vec(i,klev) = soil%rhosoil_vec(i,klev)/(1.0-soil%ssat_vec(i,klev)) + ! ??????????????????????????? + !took avg of results from A New Perspective on Soil Thermal Properties Ochsner, Horton,Tucheng + !Soil Sci Soc America 2001 + !to find what silt (1.0-sand-clay) is !simply regress to his means !in J/kg/K + soil%css_vec(i,klev) = max(910.6479*soil%silt_vec(i,klev) +& + 916.4438 * soil%clay_vec(i,klev) +& + 740.7491*soil%sand_vec(i,klev), 800.0) + ! ??????????????? MMY which eq are right ??????????????? + ! sst_tmp(i,klev) = soil%ssat_vec(i,klev) + ! sst_tmp(i,klev) = 1.0- MAX(0.15, MIN(0.85, sst_tmp(i,klev))) + ! soil%css_vec(i,klev) = (1.0-soil%org_vec(i,klev)) * & + ! (850*(1.0 - soil%sand_vec(i,klev) - soil%clay_vec(i,klev)) & + ! +865.0*soil%clay_vec(i,klev) + 750.0*soil%sand_vec(i,klev))& + ! + soil%org_vec(i,klev)*950.0 + ! soil%cnsd_vec(i,klev) = (1.0-soil%org_vec(i,klev)) * & + ! (0.135*sst_tmp(i,klev) + 0.0239/sst_tmp(i,klev) )/ & + ! (1.0 - 0.947*sst_tmp(i,klev)) & + ! + soil%org_vec(i,klev)*0.05 + ! ???????????????????????????????????????????????????????? + end do + end do + + if (allocated(ssat_bounded)) deallocate(ssat_bounded) + if (allocated(rho_soil_bulk)) deallocate(rho_soil_bulk) + + IF (cable_user%gw_model) then !organic correction? + do klev=1,ms + do i=1,mp + soil%css_vec(i,klev) = (1.-soil%org_vec(i,klev))*soil%css_vec(i,klev) + & + real(soil%org_vec(i,klev)*gw_params%org%css_organic) + soil%cnsd_vec(i,klev) = (1.-soil%org_vec(i,klev))*soil%cnsd_vec(i,klev) + & + soil%org_vec(i,klev)*gw_params%org%cnsd_organic + end do + end do + END IF + ! MMY to unify with hydraulic parameters - using 3rd layer's value + soil%rhosoil = real(soil%rhosoil_vec(:,3)) + soil%css = real(soil%css_vec(:,3)) + soil%cnsd = real(soil%cnsd_vec(:,3)) + ! _____ MMY @Oct2022 comment out as soilparmnew is default now _____ + ! ELSEIF ( .NOT. soilparmnew) THEN ! Q,Zhang @ 12/20/2010 + ! soil%cnsd = soil%sand * 0.3 + soil%clay * 0.25 + soil%silt * 0.265 + ! !set dry soil thermal conductivity [W/m/K] + ! soil%cnsd_vec = spread(soil%cnsd,2,ms) + ! ________________________________________________________________ + END IF soil%hsbh = soil%hyds*ABS(soil%sucs) * soil%bch ! difsat*etasat soil%ibp2 = NINT(soil%bch) + 2 @@ -1891,9 +2249,7 @@ SUBROUTINE derived_parameters(soil, sum_flux, bal, ssnow, veg, rough) rough%hruff = MAX(0.01, veg%hc - 1.2 * ssnow%snowd/MAX(ssnow%ssdnn, 100.)) rough%hruff_grmx = rough%hruff ! owetfac introduced by EAK apr2009 - ssnow%owetfac = MAX(0.0, MIN(1.0, & - (REAL(ssnow%wb(:, 1)) - soil%swilt) / & - (soil%sfc - soil%swilt))) + ssnow%owetfac = MAX(0.0, MIN(1.0, (REAL(ssnow%wb(:, 1)) - soil%swilt) / (soil%sfc - soil%swilt))) temp(:) = 0.0 tmp2(:) = 0.0 WHERE ( ssnow%wbice(:, 1) > 0. ) ! Prevents divide by zero at glaciated @@ -1933,7 +2289,7 @@ SUBROUTINE derived_parameters(soil, sum_flux, bal, ssnow, veg, rough) END DO bal%osnowd0 = ssnow%osnowd - ! vh_js ! comment out hide% condition + !! vh_js !! comment out hide% condition ! IF (hide%Ticket49Bug6) THEN IF(cable_user%SOIL_STRUC=='sli') THEN @@ -1943,6 +2299,54 @@ SUBROUTINE derived_parameters(soil, sum_flux, bal, ssnow, veg, rough) END IF ! END IF + where(soil%ssat_vec .gt. 0.0) + ssnow%wblf = max(0.01_r_2,ssnow%wbliq/soil%ssat_vec) + ssnow%wbfice = ssnow%wbice / soil%ssat_vec + elsewhere + ssnow%wblf =0.01 + ssnow%wbfice =0.99 + endwhere + + ! ____________________ MMY comment out as we don't use hys ___________________________ + do k=1,ms + do i=1,mp + if (ssnow%wb_hys(i,k) .lt. 0._r_2) then + ssnow%wb_hys(i,k) = ssnow%wb(i,k) + end if + ssnow%wb_hys(i,k) = max(soil%watr(i,k) ,min(soil%ssat_vec(i,k), ssnow%wb_hys(i,k))) + + if (ssnow%smp_hys(i,k) .lt. -1.0e+30_r_2) then !set to missing, calc + ssnow%smp_hys(i,k) = -soil%sucs_vec(i,k)* & + ( (ssnow%wb_hys(i,k)-ssnow%watr_hys(i,k))/& + (ssnow%ssat_hys(i,k)-ssnow%watr_hys(i,k)) )**& + (-1._r_2/soil%bch_vec(i,k) ) + end if + ssnow%smp_hys(i,k) = max(-1.0e10,min(-soil%sucs_vec(i,k),ssnow%smp_hys(i,k) )) + end do + end do + + ! MMY note that after commenting out, wb_hys and smp_hys are not defined any more + + ! if (cable_user%gw_model .and. gw_params%bc_hysteresis) then + ! do klev=1,ms + ! do i=1,mp + ! if (soil%isoilm(i) .ne. 9 .and. veg%iveg(i) .le. 16) then + + ! psi_tmp(i,klev) = abs(psi_c(veg%iveg(i))) + + ! soil%swilt_vec(i,klev) = (ssnow%ssat_hys(i,klev)-ssnow%watr_hys(i,klev)) * & + ! (psi_tmp(i,klev)/soil%sucs_vec(i,klev))& + ! **(-1.0/soil%bch_vec(i,klev))+& + ! ssnow%watr_hys(i,klev) + ! soil%sfc_vec(i,klev) = (gw_params%sfc_vec_hk/soil%hyds_vec(i,klev))& + ! **(1.0/(2.0*soil%bch_vec(i,klev)+3.0)) *& + ! (ssnow%ssat_hys(i,klev)-ssnow%watr_hys(i,klev)) + ssnow%watr_hys(i,klev) + ! end if + ! end do + ! end do + + ! end if + END SUBROUTINE derived_parameters !============================================================================ SUBROUTINE check_parameter_values(soil, veg, ssnow) diff --git a/src/science/gw_hydro/cable_gw_hydro.F90 b/src/science/gw_hydro/cable_gw_hydro.F90 index e7cf33918..ead905593 100644 --- a/src/science/gw_hydro/cable_gw_hydro.F90 +++ b/src/science/gw_hydro/cable_gw_hydro.F90 @@ -1,6 +1,6 @@ !============================================================================== ! This source code is part of the -! Australian Community Atmosphere Biosphere Land Exchange (CABLE) model. +! Austrian Community Atmosphere Biosphere Land Exchange (CABLE) model. ! This work is licensed under the CABLE Academic User Licence Agreement ! (the "Licence"). ! You may not use this file except in compliance with the Licence. @@ -41,27 +41,37 @@ MODULE cable_gw_hydro_module USE cable_common_module, ONLY : gw_params,cable_user,& cable_runtime,& - max_glacier_snowd - -!distribute these per sbr -USE cable_phys_constants_mod, ONLY : CTFRZ => TFRZ -USE cable_phys_constants_mod, ONLY : CHL => HL -USE cable_phys_constants_mod, ONLY : CHLF => HLF -USE cable_phys_constants_mod, ONLY : CHLS => HLS -USE cable_phys_constants_mod, ONLY : Cdensity_liq => density_liq -USE cable_phys_constants_mod, ONLY : Cdensity_ice => density_ice -USE cable_phys_constants_mod, ONLY : Ccgsnow => cgsnow -USE cable_phys_constants_mod, ONLY : Ccswat => cswat -USE cable_phys_constants_mod, ONLY : Ccs_rho_wat => cs_rho_wat -USE cable_phys_constants_mod, ONLY : Ccs_rho_ice => cs_rho_ice -USE cable_math_constants_mod, ONLY : CPI => PI - + max_glacier_snowd,& + psi_c ! psi_c added by rk4417 - phase2 + +! USE cbl_soil_snow_subrs_module, ONLY : trimb, snow_processes_soil_thermal ! replaced below by rk4417 - phase2 + +! line below commented out by rk4417 - phase2 +! USE cable_data_module, only: C=>PHYS ! all constants used in this module belong to PHYS + + +!distribute these per sbr ! added by rk4417 - phase2 + USE cable_phys_constants_mod, ONLY : CTFRZ => TFRZ + USE cable_phys_constants_mod, ONLY : CHL => HL + USE cable_phys_constants_mod, ONLY : CHLF => HLF + USE cable_phys_constants_mod, ONLY : CHLS => HLS ! not needed - rk4417 - phase2 + USE cable_phys_constants_mod, ONLY : Cdensity_liq => density_liq + USE cable_phys_constants_mod, ONLY : Cdensity_ice => density_ice + USE cable_phys_constants_mod, ONLY : Ccgsnow => cgsnow + USE cable_phys_constants_mod, ONLY : Ccswat => cswat + USE cable_phys_constants_mod, ONLY : Ccs_rho_wat => cs_rho_wat ! not needed - rk4417 - phase2 + USE cable_phys_constants_mod, ONLY : Ccs_rho_ice => cs_rho_ice ! not needed - rk4417 - phase2 + USE cable_phys_constants_mod, ONLY : Ccsice => csice ! inserted by rk4417 - phase2 + USE cable_math_constants_mod, ONLY : CPI => PI + IMPLICIT NONE PRIVATE !mrd561 GW params - REAL(r_2), SAVE :: smp_cor = 8.0 + +! REAL(r_2), SAVE :: smp_cor = 8.0 ! dependends on FEEDBACK - rk4417 - phase2 + REAL(r_2), PARAMETER :: sucmin = -1.0e8 ! minimum soil pressure head [mm] REAL(r_2), PARAMETER :: volwatmin = 1e-4 !min soil water [mm] REAL(r_2), PARAMETER :: wtd_uncert = 0.1 ! uncertaintiy in wtd calcultations [mm] @@ -71,176 +81,187 @@ MODULE cable_gw_hydro_module REAL(r_2), PARAMETER :: Sy_deep = 0.1 REAL(r_2), PARAMETER :: dz_deep = 50000.0 + REAL(r_2), SAVE :: den_rat=0.921 + INTEGER, PARAMETER :: wtd_iter_max = 20 ! maximum number of iterations to find the water table depth - ! ! This module contains the following subroutines that + REAL(r_2), PARAMETER :: m2mm = 1000.0 + REAL(r_2), PARAMETER :: mm2m = 0.001 + REAL(r_2), PARAMETER :: zero=0.0 + + ! This module contains the following subroutines that !are called from other modules - PUBLIC :: soil_snow_gw,calc_srf_wet_fraction,sli_hydrology,& - pore_space_relative_humidity,set_unsed_gw_vars -CONTAINS + PUBLIC :: soil_snow_gw, calc_srf_wet_fraction, sli_hydrology,& + pore_space_relative_humidity, set_unsed_gw_vars, den_rat + !,set_den_rat ! MMY@Nov2022 comment out set_den_rat +CONTAINS ! ----------------------------------------------------------------------------- - SUBROUTINE GWsoilfreeze(dels, soil, ssnow,tgg_old) - !NOTE: this is only included because gw_model uses parameters XXX_vec - !these are r_2. this breaks bitwise compatibility with trunk - !if acceptable this routine does the same thing but with r_2 soil params - ! if max_ice_frac always set to frozen_limit and tgg_tmp is always CTFRZ -IMPLICIT NONE + SUBROUTINE GWsoilfreeze(dels, soil, ssnow) + + !*## Purpose + ! Snow freezes and melts. + ! this is only included because gw_model uses parameters XXX_vec + ! these are r_2. this breaks bitwise compatibility with trunk + ! if acceptable this routine does the same thing but with r_2 soil params + ! if max_ice_frac always set to frozen_limit and tgg_tmp is always CTFRZ + ! + !## Method + ! + ! The subroutine takes a float as input, prints its value then adds 2/3, + ! prints it and returns it. + ! + ! The equation used is: + ! \[ myarg = myarg + !frac{2.}{3.} \] + ! + !## References + ! + ! The guidelines for documentation can be found in: + ! [CABLE developer guide](https://cable-lsm.github.io/CABLE/developer_guide/doc_guide/science_doc/) REAL, INTENT(IN) :: dels ! integration time step (s) TYPE(soil_snow_type), INTENT(INOUT) :: ssnow TYPE(soil_parameter_type), INTENT(INOUT) :: soil - REAL, INTENT(INOUT), DIMENSION(mp,ms) :: tgg_old - REAL(r_2), DIMENSION(mp) :: sicefreeze - REAL(r_2), DIMENSION(mp) :: sicemelt - REAL(r_2), DIMENSION(mp,ms) :: wbice_delta,avail_por + + REAL , DIMENSION(mp,ms) :: tgg_tmp !calc wb ice at approx tgg + REAL(r_2), DIMENSION(mp,ms) :: wbice_delta,avail_por,delta_ice_vol REAL(r_2), DIMENSION(mp) :: ice_mass,liq_mass,tot_mass + INTEGER :: i,j,k - REAL, DIMENSION(mp,ms) :: tgg_tmp - REAL(r_2),DIMENSION(mp,ms) :: xx,max_ice_frac,iceF,den_css !Decker and Zeng 2009 + REAL(r_2) :: Aconst,Dconst + REAL, DIMENSION(mp,ms) :: gammzz_snow + REAL(r_2),DIMENSION(mp,ms) :: xx,max_ice_frac,den_css !Decker and Zeng 2009 ! MMY iceF is useless - max_ice_frac(:,:) = 0.0 - DO k=1,ms - DO i=1,mp - IF (ssnow%tgg(i,k) .LT. CTFRZ .AND. soil%ssat_vec(i,k) .GT. 1.0e-8) THEN - max_ice_frac(i,k) = (1. - EXP(-2.*(ssnow%wb(i,k)/soil%ssat_vec(i,k))**4.0 *& - (ssnow%tgg(i,k)-CTFRZ)))/EXP(1. - ssnow%wb(i,k)/soil%ssat_vec(i,k)) - max_ice_frac(i,k) = MAX(0.4,max_ice_frac(i,k))*ssnow%wb(i,k) + max_ice_frac(:,:) = 0.0 + delta_ice_vol(:,:) = 0.0 + tgg_tmp(:,:) = ssnow%tgg(:,:) + gammzz_snow(:,:) = 0._r_2 - wbice_delta(i,k) = MAX(0.,max_ice_frac(i,k) - ssnow%wbice(i,k)) + k=1 + do i=1,mp + if (ssnow%isflag(i) .eq. 0 .and. soil%isoilm(i) .ne. 9) then + gammzz_snow(i,k) = real(Ccgsnow,r_2) * real(ssnow%snowd(i),r_2) + end if + end do - avail_por(i,k) = soil%ssat_vec(i,k) - ssnow%wbliq(i,k)+& - Cdensity_ice/Cdensity_liq*wbice_delta(i,k) - & - ssnow%wbice(i,k) + do k=1,ms + do i=1,mp - wbice_delta(i,k) = MIN(wbice_delta(i,k),avail_por(i,k)) + if ( (ssnow%tgg(i,k) .lt. CTFRZ) .and. & + (ssnow%tgg(i,k) .lt. ssnow%otgg(i,k)) ) then ! MMY freezing - max_ice_frac(i,k) = ssnow%wbice(i,k) + wbice_delta(i,k) + ssnow%otgg(i,k) = min(ssnow%otgg(i,k),CTFRZ) - ENDIF - END DO - END DO + tgg_tmp(i,k) = ssnow%tgg(i,k) + Aconst = -2.0*( (0.2+ssnow%wb(i,k)/soil%ssat_vec(i,k))**4.0 ) + Dconst = exp(1. - min(1.0,0.2+ssnow%wb(i,k)/soil%ssat_vec(i,k))) - tgg_tmp(:,:) = tgg_old(:,:) - DO k=1,ms - DO i=1,mp - IF (soil%isoilm(i) .EQ. 9) THEN - tgg_tmp(i,k) = CTFRZ - ELSE - IF (ssnow%tgg(i,k) .LE. CTFRZ) THEN - IF (tgg_old(i,k) .GT. CTFRZ) THEN - tgg_tmp(i,k) = CTFRZ - END IF - ELSE - IF (tgg_old(i,k) .LE. CTFRZ) THEN - tgg_tmp(i,k) = CTFRZ - END IF - END IF - END IF - END DO - END DO + max_ice_frac(i,k) = (1._r_2 - exp(2._r_2*(min(1.,ssnow%wb(i,k)/soil%ssat_vec(i,k))**4.0) *& + real(tgg_tmp(i,k)-CTFRZ,r_2)))/exp(1._r_2- min(1.0,ssnow%wb(i,k)/soil%ssat_vec(i,k))) + if (soil%isoilm(i) .eq. 9) max_ice_frac(i,k) = 0.85_r_2 + ! MMY maximum ice can get under current wb + max_ice_frac(i,k) = min(0.9_r_2,max_ice_frac(i,k)) - !allow more freezing for permenant glacier ice regions - DO i=1,mp - IF (soil%isoilm(i) .EQ. 9) max_ice_frac(i,:) = 0.85_r_2*ssnow%wb(i,:) - END DO + !delta_ice_vol(i,k) = max(0._r_2, ssnow%wb(i,k)*max_ice_frac(i,k) - ssnow%wbice(i,k)) ! MMY + ! MMY ssnow%wb(i,k)*max_ice_frac(i,k) here should be ice volume, thus divided by den_rat + delta_ice_vol(i,k) = max(0._r_2, ssnow%wb(i,k)*max_ice_frac(i,k)/den_rat - ssnow%wbice(i,k)) ! MMY - DO k = 1, ms - DO i=1,mp + ! MMY wbliq can be lower than watr due to condensation, but to avoid large negative water potential + ! set watr as wbliq lower boundary + !check amount of water we have + delta_ice_vol(i,k) = min((ssnow%wbliq(i,k)-soil%watr(i,k))/den_rat, & + max(0._r_2, delta_ice_vol(i,k) ) ) - ice_mass(i) = ssnow%wbice(i,k)*soil%zse_vec(i,k)*REAL(Cdensity_ice,r_2) - liq_mass(i) = ssnow%wbliq(i,k)*soil%zse_vec(i,k)*REAL(Cdensity_liq,r_2) - tot_mass(i) = liq_mass(i) + ice_mass(i) - - IF (ssnow%tgg(i,k) .LE. CTFRZ .AND. & - ssnow%tgg(i,k) .LT. tgg_tmp(i,k) .AND. & - max_ice_frac(i,k) - ssnow%wbice(i,k) > .001) THEN - - sicefreeze(i) = MIN( MAX( 0.0_r_2, ( max_ice_frac(i,k) - & - ssnow%wbice(i,k) ) ) * soil%zse_vec(i,k) * Cdensity_ice, & - ( tgg_tmp(i,k) - ssnow%tgg(i,k) ) * ssnow%gammzz(i,k) / Chlf ) - - ssnow%wbice(i,k) = MIN( ssnow%wbice(i,k) +& - sicefreeze(i)/soil%zse_vec(i,k)/Cdensity_ice,& - max_ice_frac(i,k) ) - ssnow%gammzz(i,k) = MAX(soil%heat_cap_lower_limit(i,k), & - (1.0-soil%ssat_vec(i,k))*soil%css_vec(i,k)*soil%rhosoil_vec(i,k) & - + (ssnow%wb(i,k)-ssnow%wbice(i,k)) * REAL(Ccs_rho_wat,r_2) & - + ssnow%wbice(i,k) * REAL(Ccs_rho_ice,r_2)& - )*soil%zse_vec(i,k) - - IF (k .EQ. 1 .AND. ssnow%isflag(i) .EQ. 0) THEN - ssnow%gammzz(i,k) = ssnow%gammzz(i,k) + Ccgsnow * ssnow%snowd(i) - END IF + delta_ice_vol(i,k) = min(delta_ice_vol(i,k),max(0._r_2,& + real(ssnow%otgg(i,k)-ssnow%tgg(i,k),r_2)*ssnow%gammzz(i,k)/& + (soil%zse_vec(i,k)*real(CHLF*Cdensity_ice,r_2)) ) ) - ssnow%tgg(i,k) = ssnow%tgg(i,k) + REAL(sicefreeze(i)) & - * Chlf / REAL(ssnow%gammzz(i,k) ) + elseif ((ssnow%tgg(i,k) .gt. CTFRZ) .and. & + (ssnow%tgg(i,k) .gt. ssnow%otgg(i,k)) .and. ssnow%wbice(i,k) .gt. 0.0) then ! MMY melting - ELSEIF ( ssnow%tgg(i,k) .GT. tgg_tmp(i,k) .AND. & - ssnow%wbice(i,k) .GT. max_ice_frac(i,k) ) THEN + ssnow%otgg(i,k) = CTFRZ - sicemelt(i) = MIN( ssnow%wbice(i,k) * soil%zse_vec(i,k) * Cdensity_ice, & - ( ssnow%tgg(i,k) - tgg_tmp(i,k) ) * ssnow%gammzz(i,k) / Chlf ) + delta_ice_vol(i,k) = ssnow%wbice(i,k) - ssnow%wbice(i,k) = MAX( 0.0_r_2, ssnow%wbice(i,k) - sicemelt(i) & - / (soil%zse_vec(i,k) * Cdensity_ice) ) + delta_ice_vol(i,k) = min(delta_ice_vol(i,k), max(0._r_2,& + real(ssnow%tgg(i,k)-ssnow%otgg(i,k),r_2) * ssnow%gammzz(i,k) /& + (soil%zse_vec(i,k)*real(CHLF*Cdensity_ice,r_2)) ) ) - ssnow%gammzz(i,k) =MAX(soil%heat_cap_lower_limit(i,k), & - (1.0-soil%ssat_vec(i,k))*soil%css_vec(i,k)*soil%rhosoil_vec(i,k)& - + (ssnow%wb(i,k)-ssnow%wbice(i,k)) * REAL(Ccs_rho_wat,r_2) & - + ssnow%wbice(i,k) * REAL(Ccs_rho_ice,r_2)& - )*soil%zse_vec(i,k) + endif + end do + end do - IF (k .EQ. 1 .AND. ssnow%isflag(i) .EQ. 0) THEN - ssnow%gammzz(i,k) = ssnow%gammzz(i,k) + Ccgsnow * ssnow%snowd(i) - END IF - ssnow%tgg(i,k) = ssnow%tgg(i,k) - REAL(sicemelt(i)) & - * Chlf / REAL(ssnow%gammzz(i,k)) - !if for some reason end up here - ELSEIF( tgg_tmp(i,k) .GE. CTFRZ .AND. & - ssnow%tgg(i,k) > tgg_tmp(i,k) .AND. ssnow%wbice(i,k) > 0. ) THEN - - sicemelt(i) = MIN( ssnow%wbice(i,k) * soil%zse_vec(i,k) * Cdensity_ice, & - ( ssnow%tgg(i,k) - tgg_tmp(i,k) ) * ssnow%gammzz(i,k) / Chlf ) - - ssnow%wbice(i,k) = MAX( 0.0_r_2, ssnow%wbice(i,k) - sicemelt(i) & - / (soil%zse_vec(i,k) * Cdensity_ice) ) - - ssnow%gammzz(i,k) =MAX(soil%heat_cap_lower_limit(i,k), & - (1.0-soil%ssat_vec(i,k))*soil%css_vec(i,k)*soil%rhosoil_vec(i,k)& - + (ssnow%wb(i,k)-ssnow%wbice(i,k)) * REAL(Ccs_rho_wat,r_2) & - + ssnow%wbice(i,k) * REAL(Ccs_rho_ice,r_2)& - )*soil%zse_vec(i,k) - - IF (k .EQ. 1 .AND. ssnow%isflag(i) .EQ. 0) THEN - ssnow%gammzz(i,k) = ssnow%gammzz(i,k) + Ccgsnow * ssnow%snowd(i) - END IF - ssnow%tgg(i,k) = ssnow%tgg(i,k) - REAL(sicemelt(i)) & - * Chlf / REAL(ssnow%gammzz(i,k)) + DO k = 1, ms + DO i=1,mp + + if ( (ssnow%tgg(i,k) .lt. CTFRZ) .and. & + (delta_ice_vol(i,k) .gt. 0.0) ) then + + ssnow%wbice(i,k) = ssnow%wbice(i,k) + delta_ice_vol(i,k) + ssnow%wbliq(i,k) = ssnow%wbliq(i,k) - delta_ice_vol(i,k)*den_rat + + ssnow%gammzz(i,k) = max(soil%heat_cap_lower_limit(i,k), & + (1.0-soil%ssat_vec(i,k))*soil%css_vec(i,k)*soil%rhosoil_vec(i,k) & + + ssnow%wbliq(i,k) * REAL(Ccswat*Cdensity_liq,r_2) & + + ssnow%wbice(i,k) * REAL(Ccsice*Cdensity_ice,r_2)& + )*soil%zse_vec(i,k) + gammzz_snow(i,k) + ! MMY freezing releases heat + ssnow%tgg(i,k) = ssnow%tgg(i,k) + real( delta_ice_vol(i,k)*soil%zse_vec(i,k) *& + real(CHLF*Cdensity_ice,r_2) / ssnow%gammzz(i,k) ) + + + ssnow%wb(i,k) = ssnow%wbliq(i,k) + den_rat*ssnow%wbice(i,k) + + ssnow%wmliq(i,k) = ssnow%wbliq(i,k)*soil%zse_vec(i,k)*Cdensity_liq + ssnow%wmice(i,k) = ssnow%wbice(i,k)*soil%zse_vec(i,k)*Cdensity_ice + ssnow%wmtot(i,k) = ssnow%wb(i,k) *soil%zse_vec(i,k)*Cdensity_liq + + elseif ((ssnow%tgg(i,k) .gt. CTFRZ) .and. & + delta_ice_vol(i,k) .gt. 0.0 ) then ! MMY + ! ssnow%wbice(i,k) .gt. 0.0 ) then ! MMY It's not right. + ! MMY When previous tgg > current tgg > 0, wbice won't melt + + ssnow%wbice(i,k) = ssnow%wbice(i,k) - delta_ice_vol(i,k) + ssnow%wbliq(i,k) = ssnow%wbliq(i,k) + delta_ice_vol(i,k)*den_rat + + ssnow%gammzz(i,k) = max(soil%heat_cap_lower_limit(i,k), & + (1.0-soil%ssat_vec(i,k))*soil%css_vec(i,k)*soil%rhosoil_vec(i,k) & + + ssnow%wbliq(i,k) * REAL(Ccswat*Cdensity_liq,r_2) & + + ssnow%wbice(i,k) * REAL(Ccsice*Cdensity_ice,r_2)& + )*soil%zse_vec(i,k) + gammzz_snow(i,k) + + ! MMY melting absorbs heat + ssnow%tgg(i,k) = ssnow%tgg(i,k) - real( delta_ice_vol(i,k)*soil%zse_vec(i,k) *& + real(CHLF*Cdensity_ice,r_2) / ssnow%gammzz(i,k) ) + + ssnow%wb(i,k) = ssnow%wbliq(i,k) + den_rat*ssnow%wbice(i,k) + + ssnow%wmliq(i,k) = ssnow%wbliq(i,k)*soil%zse_vec(i,k)*Cdensity_liq + ssnow%wmice(i,k) = ssnow%wbice(i,k)*soil%zse_vec(i,k)*Cdensity_ice + ssnow%wmtot(i,k) = ssnow%wb(i,k) *soil%zse_vec(i,k)*Cdensity_liq END IF - !update the liq and ice volume and mass - ice_mass(i) = ssnow%wbice(i,k)*soil%zse_vec(i,k)*REAL(Cdensity_ice,r_2) - liq_mass(i) = tot_mass(i) - ice_mass(i) - ssnow%wbliq(i,k) = liq_mass(i) / soil%zse_vec(i,k)/REAL(Cdensity_liq,r_2) - ssnow%wbice(i,k) = ice_mass(i) / soil%zse_vec(i,k)/REAL(Cdensity_ice,r_2) - ssnow%wb(i,k) = ssnow%wbliq(i,k) + ssnow%wbice(i,k) - END DO - END DO + + END DO + END DO END SUBROUTINE GWsoilfreeze - ! ---------------------------------------------------------------------------- + ! ----------------------------------------------------------------------------- ! - ! ---------------------------------------------------------------------------- + !! ----------------------------------------------------------------------------- ! SUBROUTINE remove_transGW(dels, soil, ssnow, canopy, veg) + + !*## Purpose + ! + !NOTE: this is only included because gw_model uses parameters XXX_vec !these are r_2. this breaks bitwise compatibility with trunk !if acceptable this routine does the same thing but with r_2 soil params @@ -252,7 +273,7 @@ SUBROUTINE remove_transGW(dels, soil, ssnow, canopy, veg) TYPE(soil_parameter_type), INTENT(INOUT) :: soil TYPE(veg_parameter_type), INTENT(INOUT) :: veg REAL(r_2), DIMENSION(mp,0:ms+1) :: diff - REAL(r_2), DIMENSION(mp) :: xx,xxd,evap_cur + REAL(r_2), DIMENSION(mp) :: xx,xxd REAL(r_2), DIMENSION(mp,ms) :: zse_mp_mm INTEGER :: k,i @@ -274,7 +295,7 @@ SUBROUTINE remove_transGW(dels, soil, ssnow, canopy, veg) IF (canopy%fevc(i) .GT. 0._r_2) THEN - xx(i) = canopy%fevc(i) * dels / Chl * veg%froot(i,k) + diff(i,k-1) + xx(i) = canopy%fevc(i) * dels / CHL * veg%froot(i,k) + diff(i,k-1) diff(i,k) = MAX(0._r_2,ssnow%wbliq(i,k)-soil%swilt_vec(i,k)) & * zse_mp_mm(i,k) xxd(i) = xx(i) - diff(i,k) @@ -300,7 +321,7 @@ SUBROUTINE remove_transGW(dels, soil, ssnow, canopy, veg) canopy%fevc = 0.0_r_2 END WHERE DO k = 1,ms - ssnow%wbliq(:,k) = ssnow%wbliq(:,k) - ssnow%evapfbl(:,k)/zse_mp_mm(:,k) + ssnow%wbliq(:,k) = ssnow%wbliq(:,k) - ssnow%evapfbl(:,k)/(soil%zse_vec(:,k)*m2mm) ENDDO ENDIF @@ -309,7 +330,7 @@ SUBROUTINE remove_transGW(dels, soil, ssnow, canopy, veg) DO i=1,mp ssnow%wmliq(i,k) = ssnow%wbliq(i,k)*zse_mp_mm(i,k)!mass ssnow%wmtot(i,k) = ssnow%wmliq(i,k) + ssnow%wmice(i,k) !mass - ssnow%wb(i,k) = ssnow%wbliq(i,k) + ssnow%wbice(i,k) !volume + ssnow%wb(i,k) = ssnow%wbliq(i,k) + den_rat * ssnow%wbice(i,k) !volume ! MMY END DO END DO @@ -317,16 +338,19 @@ SUBROUTINE remove_transGW(dels, soil, ssnow, canopy, veg) END SUBROUTINE remove_transGW -!============================================================================== +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -! MD GW code from here on ! +!!!!!!!!!!!!!!MD GW code from here on!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !---------------------------------------------------------------------- -!============================================================================== +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !------------------------------------------------------------------------- SUBROUTINE ovrlndflx (dels, ssnow, soil,veg, canopy,sli_call ) + !* Calculate surface runoff + USE cable_common_module, ONLY : gw_params,cable_user - + !*## Purpose + ! Calculate IMPLICIT NONE REAL, INTENT(IN) :: dels ! integration time step (s) TYPE(soil_snow_type), INTENT(INOUT) :: ssnow ! soil+snow variables @@ -361,17 +385,19 @@ SUBROUTINE ovrlndflx (dels, ssnow, soil,veg, canopy,sli_call ) END IF !amount of ice in surface layer DO i = 1,mp - efpor(i) = MAX(0.001_r_2, soil%ssat_vec(i,1) - ssnow%wbice(i,1)) - icemass = ssnow%wbice(i,1) * dzmm - liqmass = (ssnow%wb(i,1)-ssnow%wbice(i,1)) * dzmm + efpor(i) = max(0.01_r_2, soil%ssat_vec(i,1) - den_rat*ssnow%wbice(i,1)) + icemass = ssnow%wmice(i,1) + liqmass = ssnow%wmliq(i,1) + totmass = MAX(liqmass+icemass,REAL(1e-2,r_2)) - icef(i) = MAX(0._r_2,MIN(1._r_2,gw_params%IceBeta*icemass / totmass)) + icef(i) = max(0._r_2,min(1._r_2,icemass / totmass)) END DO !sat fraction assuming topo controlled subgrid soil moisture distribution !called from cable_canopy for srf wet fraction alrady - !call saturated_fraction(ssnow,soil,veg) + call saturated_fraction(ssnow,soil,veg) ! give ssnow%satfrac value before it is used + !srf frozen fraction. should be based on topography DO i = 1,mp fice = (EXP(-gw_params%IceAlpha*(1._r_2-icef(i)))-EXP(-gw_params%IceAlpha))/(1._r_2-EXP(-gw_params%IceAlpha)) @@ -382,9 +408,16 @@ SUBROUTINE ovrlndflx (dels, ssnow, soil,veg, canopy,sli_call ) DO i=1,mp tmpa = ssnow%wbliq(i,1) / efpor(i) tmpb = MAX( (tmpa-satfrac_liqice(i))/MAX(0.01_r_2,(1._r_2-satfrac_liqice(i))), 0._r_2) - tmpa = -2._r_2*soil%bch_vec(i,1)*soil%sucs_vec(i,1)/dzmm + tmpa = -2._r_2*soil%bch_vec(i,1)*soil%sucs_vec(i,1)/soil%zse_vec(i,1)/1000._r_2 qinmax = (1._r_2 + tmpa*(tmpb-1._r_2))*soil%hyds_vec(i,1)*EXP(-gw_params%hkrz*(0.5*dzmm/1000.0_r_2-gw_params%zdepth)) - + ! qinmax = (1._r_2 + tmpa*(tmpb-1._r_2))*soil%hyds_vec(i,1) ! MMY@23Apr2023, keep this commented line and the line above + ! *EXP(-gw_params%hkrz*(0.5*dzmm/1000.0_r_2-gw_params%zdepth)) + ! should be in the eq if considering hk changes with soil depth + ! However, *EXP(-gw_params%hkrz*(0.5*dzmm/1000.0_r_2-gw_params%zdepth)) may only + ! make sense when soil properties are uniform in NO-GW codes. + ! In CABLE-GW soil properties vary with depth, EXP(-gw_params%hkrz*(0.5*dzmm/ + ! 1000.0_r_2-gw_params%zdepth)) complicates things. I think it should be + ! removed everywhere. ssnow%rnof1(i) = satfrac_liqice(i) * ssnow%fwtop(i) + & (1._r_2-satfrac_liqice(i))*MAX((ssnow%fwtop(i)-qinmax) , 0._r_2) @@ -403,7 +436,9 @@ SUBROUTINE ovrlndflx (dels, ssnow, soil,veg, canopy,sli_call ) !--- glacier formation rnof5= 0. - IF (sli_call .OR. cable_runtime%UM) THEN +!$ IF (sli_call .OR. cable_runtime%UM) THEN +! added by rk4417 to conform with MMY modifications + IF (sli_call .OR. cable_runtime%UM .OR. cable_user%gw_model) THEN ! FEEDBACK (MMY asks: why cable_user%gw_model=True doesn't need to consider snow melting) --rk4417 nglacier = 0 ELSE nglacier = 2 @@ -418,7 +453,7 @@ SUBROUTINE ovrlndflx (dels, ssnow, soil,veg, canopy,sli_call ) !---- change local tg to account for energy - clearly not best method WHERE( ssnow%isflag == 0 ) smasstot = 0.0 - ssnow%tgg(:,1) = ssnow%tgg(:,1) - rnof5 * Chlf & + ssnow%tgg(:,1) = ssnow%tgg(:,1) - rnof5 * CHLF & / REAL( ssnow%gammzz(:,1) ) ssnow%snowd = ssnow%snowd - rnof5 ELSEWHERE @@ -447,138 +482,107 @@ SUBROUTINE ovrlndflx (dels, ssnow, soil,veg, canopy,sli_call ) END SUBROUTINE ovrlndflx - - - -!============================================================================== - SUBROUTINE simple_wtd(ssnow, soil, veg) - !This was only for testing purposes - IMPLICIT NONE - TYPE (soil_snow_type), INTENT(INOUT) :: ssnow ! soil and snow variables - TYPE (soil_parameter_type), INTENT(INOUT) :: soil ! soil parameters - TYPE (veg_parameter_type), INTENT(INOUT) :: veg - - REAL(r_2), DIMENSION(mp) :: fz, wmean,ztot - REAL(r_2), DIMENSION(mp,ms) :: stot - INTEGER :: k,i - - DO i=1,mp - wmean(i) = 0._r_2 - fz(i) = 5._r_2 - ztot(i) = 0._r_2 - stot(i,:) = (ssnow%wb(i,:)-soil%watr(i,:)) / (soil%ssat_vec(i,:)-soil%watr(i,:)) - END DO - DO k = 1, ms - DO i=1,mp - wmean(i) = wmean(i) + stot(i,k)*soil%zse(k)*1000._r_2 - ztot(i) = ztot(i) + soil%zse(k)*1000._r_2 - END DO - END DO - - DO i=1,mp - wmean(i) = wmean(i) + ssnow%GWwb(i)/soil%GWssat_vec(i) * soil%GWdz(i)*1000._r_2 - ztot(i) = ztot(i) + soil%GWdz(i)*1000._r_2 - - ssnow%wtd(i) = MIN(200000._r_2, fz(i) * (ztot(i) - wmean(i))) - END DO - - END SUBROUTINE simple_wtd -!============================================================================== - - -!============================================================================== - - !---------------------------------------------------------------------- - ! SUBROUTINE iterative_wtd + + SUBROUTINE iterative_wtd (ssnow, soil, veg, include_aquifer) ! + !*## Purpose ! Iteratively calcs the water table depth by equating the mass of water in the ! soil column to the mass of a hydrostatic column inegrated from the surface to the ! water table depth - ! - SUBROUTINE iterative_wtd (ssnow, soil, veg, include_aquifer) + ! ChatGPT: "The water table depth in soil can be calculated iteratively by equating the mass of water in the soil + ! column to the mass of a hydrostatic column integrated from the surface to the water table depth. This + ! method is based on the assumption that the water in the soil column is in hydrostatic equilibrium, + ! which means that the pressure of the water at any point in the column is equal to the weight of the water + ! above that point. + ! The iterative process involves starting with an initial estimate of the water table depth and then + ! calculating the mass of water in the soil column using that depth. This mass is then compared to the + ! mass of the hydrostatic column integrated from the surface to the estimated water table depth. If the + ! two masses are not equal, the estimated water table depth is adjusted and the process is repeated until + ! convergence is achieved. + ! The calculation of the mass of the hydrostatic column requires knowledge of the soil properties, such as + ! porosity and permeability, as well as the water content of the soil. These parameters can be obtained through + ! laboratory testing or estimated from field observations. + ! Once the water table depth is determined, it can be used to assess the groundwater availability and potential + ! impacts on nearby structures or ecosystems." + ! Method: + ! I cannot find where this subroutine come from. It is not from CLM5 or CLM4.5. It also looks not from SIMGM model in Niu et al 2007 + IMPLICIT NONE TYPE (soil_snow_type), INTENT(INOUT) :: ssnow ! soil and snow variables TYPE (soil_parameter_type), INTENT(INOUT) :: soil ! soil parameters TYPE (veg_parameter_type), INTENT(INOUT) :: veg LOGICAL, INTENT(IN) :: include_aquifer !use GWwb or only wb to find wtd? - - !Local vars - REAL(r_2), DIMENSION(mp,ms) :: dzmm_mp,tmp_def - REAL(r_2), DIMENSION(0:ms) :: zimm - REAL(r_2), DIMENSION(ms) :: zmm - REAL(r_2), DIMENSION(mp) :: GWzimm,temp REAL(r_2), DIMENSION(mp) :: def,defc,total_depth_column - REAL(r_2) :: deffunc,tempa,tempb,derv,calc,tmpc - REAL(r_2), DIMENSION(mp) :: invB,Nsucs_vec !inverse of C&H B,Nsucs_vec - INTEGER :: k,i,wttd,jlp - - !make code cleaner define these here - invB = 1._r_2/soil%bch_vec(:,ms) !1 over C&H B - Nsucs_vec = soil%sucs_vec(:,ms) !psi_saturated mm - dzmm_mp = REAL(SPREAD((soil%zse(:)) * 1000.0,1,mp),r_2) !layer thickness mm - zimm(0) = 0.0_r_2 !depth of layer interfaces mm - - !total depth of soil column - DO k=1,ms - zimm(k) = zimm(k-1) + soil%zse(k)*1000._r_2 - END DO + REAL(r_2), DIMENSION(mp) :: lam,Nsucs_vec !inverse of C&H B,Nsucs_vec + INTEGER :: k,i,jlp - def(:) = 0._r_2 + lam(:) = 1._r_2/soil%bch_vec(:,ms) !1 over C&H B ! replaced block above as per MMY -- rk4417 + Nsucs_vec(:) = abs(soil%sucs_vec(:,ms)) !psi_saturated mm + ! MMY@23Apr2023, add aquifer thickness to the total depth and calcuate aquifer water content IF (include_aquifer) THEN !do we include the aquifer in the calculation of wtd? DO i=1,mp - total_depth_column(i) = zimm(ms) + soil%GWdz(i)*1000._r_2 - def(i) = def(i) + MAX(0._r_2,soil%GWssat_vec(i)-ssnow%GWwb(i))*soil%GWdz(i)*1000._r_2 + total_depth_column(i) = soil%GWdz(i)*m2mm + def(i) = max(0._r_2,soil%GWssat_vec(i)-ssnow%GWwb(i))*soil%GWdz(i)*m2mm END DO - + + ELSE + def(:) = 0._r_2 + total_depth_column(:) = 0._r_2 END IF + !total depth of soil column + do k=1,ms + do i=1,mp + total_depth_column(i) = total_depth_column(i) + soil%zse_vec(i,k)*m2mm + end do + end do + !comute the total mass away from full saturation DO k=1,ms DO i=1,mp def(i) = def(i) + & - MAX(0._r_2,(soil%ssat_vec(i,k)-(ssnow%wbliq(i,k)+ssnow%wbice(i,k)))*dzmm_mp(i,k)) + max(0._r_2,(soil%ssat_vec(i,k)-(ssnow%wbliq(i,k)+den_rat*ssnow%wbice(i,k)))*soil%zse_vec(i,k)*m2mm) END DO !mp END DO !ms !find the deficit if the water table is at the bottom of the soil column DO i=1,mp - defc(i) = (soil%ssat_vec(i,ms))*(total_depth_column(i)+Nsucs_vec(i)/(1._r_2-invB(i))* & - (1._r_2-((Nsucs_vec(i)+total_depth_column(i))/Nsucs_vec(i))**(1._r_2-invB(i)))) + defc(i) = (soil%ssat_vec(i,ms))*(total_depth_column(i)+Nsucs_vec(i)/(1._r_2-lam(i))* & + (1._r_2-((Nsucs_vec(i)+total_depth_column(i))/Nsucs_vec(i))**(1._r_2-lam(i)))) defc(i) = MAX(0.1_r_2,defc(i)) - - !initial guess at wtd - ssnow%wtd(:) = total_depth_column(:)*def(:)/defc(:) END DO - + + !initial guess at wtd ! taken out of do loop as per MMY -- rk4417 + ssnow%wtd(:) = total_depth_column(:)*def(:)/defc(:) !use newtons method to solve for wtd, note this assumes homogenous column but !that is ok DO i=1,mp IF ((soil%isoilm(i) .NE. 9) .AND. (veg%iveg(i) .NE. 16)) THEN - IF (defc(i) > def(i)) THEN !iterate tfor wtd + IF (defc(i) > def(i)) THEN !iterate tfor wtd ! MMY@23Apr2023 if soil deficit lower than total soil deficit jlp=0 mainloop: DO tempa = 1.0_r_2 - tempb = (1._r_2+ssnow%wtd(i)/Nsucs_vec(i))**(-invB(i)) + tempb = (1._r_2+ssnow%wtd(i)/Nsucs_vec(i))**(-lam(i)) derv = (soil%ssat_vec(i,ms))*(tempa-tempb) + & soil%ssat_vec(i,ms) IF (ABS(derv) .LT. REAL(1e-8,r_2)) derv = SIGN(REAL(1e-8,r_2),derv) tempa = 1.0_r_2 - tempb = (1._r_2+ssnow%wtd(i)/Nsucs_vec(i))**(1._r_2-invB(i)) + tempb = (1._r_2+ssnow%wtd(i)/Nsucs_vec(i))**(1._r_2-lam(i)) deffunc = (soil%ssat_vec(i,ms))*(ssnow%wtd(i) +& - Nsucs_vec(i)/(1-invB(i))* & + Nsucs_vec(i)/(1-lam(i))* & (tempa-tempb)) - def(i) calc = ssnow%wtd(i) - deffunc/derv @@ -600,22 +604,21 @@ SUBROUTINE iterative_wtd (ssnow, soil, veg, include_aquifer) END DO mainloop !defc .gt. def - ELSEIF (defc(i) .LT. def(i)) THEN + ELSEIF (defc(i) .LT. def(i)) THEN ! MMY@23Apr2023 if soil deficit larger than total soil deficit jlp=0 mainloop2: DO tmpc = Nsucs_vec(i)+ssnow%wtd(i)-total_depth_column(i) - tempa = (ABS(tmpc/Nsucs_vec(i)))**(-invB(i)) - tempb = (1._r_2+ssnow%wtd(i)/Nsucs_vec(i))**(-invB(i)) + tempa = (abs(tmpc/Nsucs_vec(i)))**(-lam(i)) + tempb = (1._r_2+ssnow%wtd(i)/Nsucs_vec(i))**(-lam(i)) derv = (soil%ssat_vec(i,ms))*(tempa-tempb) IF (ABS(derv) .LT. REAL(1e-8,r_2)) derv = SIGN(REAL(1e-8,r_2),derv) - - tempa = (ABS((Nsucs_vec(i)+ssnow%wtd(i)-total_depth_column(i))/Nsucs_vec(i)))**(1._r_2-invB(i)) - tempb = (1._r_2+ssnow%wtd(i)/Nsucs_vec(i))**(1._r_2-invB(i)) + tempa = (abs((Nsucs_vec(i)+ssnow%wtd(i)-total_depth_column(i))/Nsucs_vec(i)))**(1._r_2-lam(i)) + tempb = (1._r_2+ssnow%wtd(i)/Nsucs_vec(i))**(1._r_2-lam(i)) deffunc = (soil%ssat_vec(i,ms))*(total_depth_column(i) +& - Nsucs_vec(i)/(1._r_2-invB(i))*(tempa-tempb))-def(i) + Nsucs_vec(i)/(1._r_2-lam(i))*(tempa-tempb))-def(i) calc = ssnow%wtd(i) - deffunc/derv IF ((ABS(calc-ssnow%wtd(i))) .LE. wtd_uncert) THEN @@ -655,16 +658,19 @@ SUBROUTINE iterative_wtd (ssnow, soil, veg, include_aquifer) END SUBROUTINE iterative_wtd - !------------------------------------------------------------------------- - ! SUBROUTINE smoistgw (fwtop,dt,ktau,ssnow,soil,prin) - ! solves the modified richards equation (Zeng and Decker 2009) to find - ! vertical mocement of soil water. Bottom boundary condition is determined - ! using a single layer groundwater module - ! - SUBROUTINE smoistgw (dels,ktau,ssnow,soil,veg,canopy) - USE cable_common_module -USE trimb_mod, ONLY : trimb + SUBROUTINE smoistgw (dels,ktau,ssnow,soil,veg,canopy) + + !* Solve the modified Richards equation + ! [Zeng and Decker 2009](https://doi.org/10.1175/2008JHM1011.1) + ! to find vertical movement of soil water. The modified Richards equation considers + ! soil moisture distribution at hydrostatic equilibrium to avoid the truncation + ! errors due to finite grid spacing used in the partial differential equation. + ! Bottom boundary condition is determined using a single-layer groundwater module. + + USE cable_common_module + USE trimb_mod, ONLY : trimb ! inserted by rk4417 - phase2 + IMPLICIT NONE REAL, INTENT(IN) :: dels ! time step size (s) @@ -693,33 +699,30 @@ SUBROUTINE smoistgw (dels,ktau,ssnow,soil,veg,canopy) REAL(r_2), DIMENSION(mp) :: dqodw0 REAL(r_2), DIMENSION(mp) :: dqodw1,dqodw2 REAL(r_2), DIMENSION(mp) :: s1,s2,tmpi,temp0,voleq1,tempi - REAL(r_2), DIMENSION(ms) :: dzmm - REAL(r_2), DIMENSION(mp,ms) :: dzmm_mp - REAL(r_2), DIMENSION(0:ms+1) :: zimm - REAL(r_2), DIMENSION(ms) :: zmm - REAL(r_2), DIMENSION(mp) :: GWzimm,xs,zaq,s_mid,GWdzmm + + REAL(r_2), DIMENSION(mp,0:ms+1) :: zimm + REAL(r_2), DIMENSION(mp,ms) :: zmm + + REAL(r_2), DIMENSION(mp) :: GWzimm,xs,zaq,s_mid REAL(r_2), DIMENSION(mp) :: xs1,GWmsliq!xsi !mass (mm) of liquid over/under saturation, mass of aquifer water REAL(r_2) :: xsi REAL(r_2), DIMENSION(mp,ms+1) :: del_wb !MD DEBUG VARS INTEGER :: imp,ims,k_drain - !make code cleaner define these here - dzmm(:) = 1000.0_r_2 * REAL(soil%zse(:),r_2) - DO i=1,mp - dzmm_mp(i,:) = dzmm(:) - END DO - - zimm(0) = 0._r_2 + zimm(:,0) = 0._r_2 + ! MMY@23Apr2023 calcuate soil layer boundary DO k=1,ms - zimm(k) = zimm(k-1) + dzmm(k) + zimm(:,k) = zimm(:,k-1) + soil%zse_vec(:,k)*m2mm END DO - zmm(1:ms) = zimm(0:(ms-1)) + 0.5_r_2*dzmm(1:ms) + + ! MMY@23Apr2023 calcuate the middle point of each soil layer + zmm(:,1:ms) = zimm(:,1:ms) - 0.5*soil%zse_vec(:,1:ms)*m2mm DO i=1,mp - GWdzmm(i) = REAL(soil%GWdz(i),r_2)*1000._r_2 - GWzimm(i) = zimm(ms)+GWdzmm(i) - zaq(i) = zimm(ms) + 0.5_r_2*GWdzmm(i) + ! MMY@23Apr2023 calcuate the bottom boundary of aquifer and the middle point of the aquifer + GWzimm(i) = zimm(i,ms)+soil%GWdz(i)*m2mm + zaq(i) = zimm(i,ms) + 0.5_r_2*soil%GWdz(i)*m2mm END DO ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -734,17 +737,20 @@ SUBROUTINE smoistgw (dels,ktau,ssnow,soil,veg,canopy) END DO END DO - !equilibrium water content - CALL calc_equilibrium_water_content(ssnow,soil) - - CALL calc_soil_hydraulic_props(ssnow,soil,veg) + !> soil hydraulic state/props + CALL calc_soil_hydraulic_props(ssnow,soil,veg) + + !> equilibrium water content + CALL calc_equilibrium_water_content(ssnow,soil) - CALL subsurface_drainage(ssnow,soil,veg,dzmm) + !> calculate the subsurface runoff + CALL subsurface_drainage(ssnow,soil,veg) + !* Calculate soil moisture for soil column and aquifer k = 1 !top soil layer DO i=1,mp qin(i) = ssnow%sinfil(i) - den(i) = (zmm(k+1)-zmm(k)) + den(i) = 0.5*(soil%zse_vec(i,k)+soil%zse_vec(i,k+1) )*m2mm dne(i) = (ssnow%zq(i,k+1)-ssnow%zq(i,k)) num(i) = (ssnow%smp(i,k+1)-ssnow%smp(i,k)) - dne(i) qout(i) = -ssnow%hk(i,k)*num(i)/den(i) @@ -752,18 +758,19 @@ SUBROUTINE smoistgw (dels,ktau,ssnow,soil,veg,canopy) dqodw2(i) = -( ssnow%hk(i,k)*ssnow%dsmpdw(i,k+1) + num(i)*ssnow%dhkdw(i,k))/den(i) rt(i,k) = qin(i) - qout(i) at(i,k) = 0._r_2 - bt(i,k) = dzmm(k)/dels + dqodw1(i) + bt(i,k) = m2mm*soil%zse_vec(i,k)/dels + dqodw1(i) ct(i,k) = dqodw2(i) END DO DO k = 2, ms - 1 !middle soil layers DO i=1,mp - den(i) = (zmm(k) - zmm(k-1)) + + den(i) = 0.5*(soil%zse_vec(i,k)+soil%zse_vec(i,k-1) )*m2mm dne(i) = (ssnow%zq(i,k)-ssnow%zq(i,k-1)) num(i) = (ssnow%smp(i,k)-ssnow%smp(i,k-1)) - dne(i) qin(i) = -ssnow%hk(i,k-1)*num(i)/den(i) dqidw0(i) = -(-ssnow%hk(i,k-1)*ssnow%dsmpdw(i,k-1) + num(i)*ssnow%dhkdw(i,k-1))/den(i) dqidw1(i) = -( ssnow%hk(i,k-1)*ssnow%dsmpdw(i,k) + num(i)*ssnow%dhkdw(i,k-1))/den(i) - den(i) = (zmm(k+1)-zmm(k)) + den(i) = 0.5*(soil%zse_vec(i,k)+soil%zse_vec(i,k+1) )*m2mm dne(i) = (ssnow%zq(i,k+1)-ssnow%zq(i,k)) num(i) = (ssnow%smp(i,k+1)-ssnow%smp(i,k)) - dne(i) qout(i) = -ssnow%hk(i,k)*num(i)/den(i) @@ -771,20 +778,22 @@ SUBROUTINE smoistgw (dels,ktau,ssnow,soil,veg,canopy) dqodw2(i) = -( ssnow%hk(i,k)*ssnow%dsmpdw(i,k+1) + num(i)*ssnow%dhkdw(i,k))/den(i) rt(i,k) = qin(i) - qout(i) at(i,k) = -dqidw0(i) - bt(i,k) = dzmm(k)/dels - dqidw1(i) + dqodw1(i) + bt(i,k) = m2mm*soil%zse_vec(i,k)/dels - dqidw1(i) + dqodw1(i) + ! MMY ??? why the sign od bt is different to CLM5's ct(i,k) = dqodw2(i) END DO END DO k = ms !Bottom soil layer DO i=1,mp - den(i) = (zmm(k) - zmm(k-1)) + + den(i) = 0.5*(soil%zse_vec(i,k)+soil%zse_vec(i,k-1) )*m2mm dne(i) = (ssnow%zq(i,k)-ssnow%zq(i,k-1)) num(i) = (ssnow%smp(i,k)-ssnow%smp(i,k-1)) - dne(i) qin(i) = -ssnow%hk(i,k-1)*num(i)/den(i) dqidw0(i) = -(-ssnow%hk(i,k-1)*ssnow%dsmpdw(i,k-1) + num(i)*ssnow%dhkdw(i,k-1))/den(i) dqidw1(i) = -( ssnow%hk(i,k-1)*ssnow%dsmpdw(i,k) + num(i)*ssnow%dhkdw(i,k-1))/den(i) - den(i) = zaq(i) - zmm(k) + den(i) = zaq(i) - zmm(i,k) dne(i) = (ssnow%GWzq(i)-ssnow%zq(i,k)) num(i) = (ssnow%GWsmp(i)-ssnow%smp(i,k)) - dne(i) qout(i) = 0._r_2 @@ -792,32 +801,32 @@ SUBROUTINE smoistgw (dels,ktau,ssnow,soil,veg,canopy) dqodw2(i) = 0._r_2 rt(i,k) = qin(i) - qout(i) at(i,k) = -dqidw0(i) - bt(i,k) = dzmm(k)/dels - dqidw1(i) + dqodw1(i) + bt(i,k) = m2mm*soil%zse_vec(i,k)/dels - dqidw1(i) + dqodw1(i) ct(i,k) = dqodw2(i) END DO - CALL aquifer_recharge(dels,ssnow,soil,veg,zaq,zmm,dzmm) + CALL aquifer_recharge(dels,ssnow,soil,veg) - CALL trimb(at,bt,ct,rt,ms) !use the defulat cable tridiag solution + CALL trimb(at,bt,ct,rt,ms) !use the default cable tridiag solution DO k=1,ms DO i=1,mp - ssnow%wbliq(i,k) = ssnow%wbliq(i,k) + rt(i,k) - ssnow%qhlev(i,k)*dels/dzmm(k) !volutermic liquid + ssnow%wbliq(i,k) = ssnow%wbliq(i,k) + rt(i,k) - ssnow%qhlev(i,k)*dels/(m2mm*soil%zse_vec(i,k)) !volutermic liquid END DO END DO DO i=1,mp - ssnow%wbliq(i,ms) = ssnow%wbliq(i,ms) - ssnow%Qrecharge(i)*dels/dzmm(ms) + ssnow%wbliq(i,ms) = ssnow%wbliq(i,ms) - ssnow%Qrecharge(i)*dels/(m2mm*soil%zse_vec(i,ms)) END DO DO i=1,mp - ssnow%GWwb(i) = ssnow%GWwb(i) + (ssnow%Qrecharge(i)-ssnow%qhlev(i,ms+1))*dels/GWdzmm(i) + ssnow%GWwb(i) = ssnow%GWwb(i) + (ssnow%Qrecharge(i)-ssnow%qhlev(i,ms+1))*dels/(m2mm*soil%GWdz(i)) END DO !determine the available pore space !volumetric DO k=1,ms DO i=1,mp - eff_por(i,k) = MAX(0._r_2, soil%ssat_vec(i,k) - ssnow%wbice(i,k) ) + eff_por(i,k) = max(0._r_2, soil%ssat_vec(i,k) - den_rat * ssnow%wbice(i,k) ) END DO END DO @@ -825,24 +834,24 @@ SUBROUTINE smoistgw (dels,ktau,ssnow,soil,veg,canopy) xsi = 0._r_2 IF (ssnow%GWwb(i) .GT. soil%GWssat_vec(i)) THEN - xsi = (ssnow%GWwb(i) - soil%GWssat_vec(i))*GWdzmm(i) + xsi = (ssnow%GWwb(i) - soil%GWssat_vec(i))*m2mm*soil%GWdz(i) ssnow%GWwb(i) = soil%GWssat_vec(i) END IF DO k=1,ms IF (ssnow%wbliq(i,k) .GT. eff_por(i,k)) THEN - xsi = xsi + (ssnow%wbliq(i,k) - eff_por(i,k))*dzmm(k) + xsi = xsi + (ssnow%wbliq(i,k) - eff_por(i,k))*(m2mm*soil%zse_vec(i,k)) ssnow%wbliq(i,k) = eff_por(i,k) END IF END DO DO k = ms,1,-1 !loop from bottom to top adding extra water to each layer IF (xsi .GT. 0._r_2) THEN - IF (xsi .LT. (eff_por(i,k)-ssnow%wbliq(i,k))*dzmm(k)) THEN - ssnow%wbliq(i,k) = ssnow%wbliq(i,k) + xsi/dzmm(k) + if (xsi .lt. (eff_por(i,k)-ssnow%wbliq(i,k))*(m2mm*soil%zse_vec(i,k))) then + ssnow%wbliq(i,k) = ssnow%wbliq(i,k) + xsi/(m2mm*soil%zse_vec(i,k)) xsi = 0._r_2 ELSE - xsi = xsi - (eff_por(i,k) - ssnow%wbliq(i,k))*dzmm(k) + xsi = xsi - (eff_por(i,k) - ssnow%wbliq(i,k))*(m2mm*soil%zse_vec(i,k)) ssnow%wbliq(i,k) = eff_por(i,k) END IF END IF @@ -853,23 +862,30 @@ SUBROUTINE smoistgw (dels,ktau,ssnow,soil,veg,canopy) xsi = 0._r_2 END IF + ! MMY use watr to replace volwatmin to avoid questionable smp or hk (when wbliq Soil is too dry, aquifer extracts water from lateral drainage, found in SUBROUTINE smoistgw" + ! MMY@23Apr2023, it's an alarm for doubtful low aquifer moisture END IF END DO @@ -879,14 +895,15 @@ SUBROUTINE smoistgw (dels,ktau,ssnow,soil,veg,canopy) !update mass variables ssnow%wmliq(i,k) = ssnow%wbliq(i,k) * & - soil%zse_vec(i,k)*Cdensity_liq + soil%zse_vec(i,k)*real(Cdensity_liq,r_2) ssnow%wmice(i,k) = ssnow%wbice(i,k) * & - soil%zse_vec(i,k)*Cdensity_ice - ssnow%wb(i,k) = ssnow%wbliq(i,k) + ssnow%wbice(i,k) + soil%zse_vec(i,k)*real(Cdensity_ice,r_2) + ssnow%wb(i,k) = ssnow%wbliq(i,k) + den_rat * ssnow%wbice(i,k) ssnow%wmtot(i,k) = ssnow%wmliq(i,k) + ssnow%wmice(i,k) END DO END DO + !> give value to subsurface runoff DO i=1,mp ssnow%rnof2(i) = ssnow%qhz(i) !rnof2 is default cable deep runoff var END DO !mp loop @@ -894,7 +911,25 @@ SUBROUTINE smoistgw (dels,ktau,ssnow,soil,veg,canopy) END SUBROUTINE smoistgw - + SUBROUTINE soil_snow_gw(dels, soil, ssnow, canopy, met, bal, veg) + !*## Purpose + ! + ! This is the main subroutine for Mark Decker's new hydrology scheme. + ! This subroutine should be called in subroutine cbm but not yet. + ! + !## Method + ! + ! The subroutine takes a float as input, prints its value then adds 2/3, + ! prints it and returns it. + ! + ! The equation used is: + ! \[ myarg = myarg + !frac{2.}{3.} \] + ! + !## References + ! + ! The guidelines for documentation can be found in: + ! [CABLE developer guide](https://cable-lsm.github.io/CABLE/developer_guide/doc_guide/science_doc/) + ! ! Inputs: ! dt_in - time step in sec @@ -909,11 +944,10 @@ END SUBROUTINE smoistgw ! ivegt - vegetation type ! Output ! ssnow - SUBROUTINE soil_snow_gw(dels, soil, ssnow, canopy, met, bal, veg) - USE cable_IO_vars_module, ONLY: wlogn USE cable_common_module -USE snow_processes_soil_thermal_mod, ONLY : snow_processes_soil_thermal + USE snow_processes_soil_thermal_mod, ONLY : snow_processes_soil_thermal ! inserted by rk4417 - phase2 + REAL , INTENT(IN) :: dels ! integration time step (s) TYPE(soil_parameter_type), INTENT(INOUT) :: soil TYPE(soil_snow_type) , INTENT(INOUT) :: ssnow @@ -923,11 +957,11 @@ SUBROUTINE soil_snow_gw(dels, soil, ssnow, canopy, met, bal, veg) TYPE (balances_type) , INTENT(INOUT) :: bal INTEGER :: k,i - REAL, DIMENSION(mp) :: snowmlt - REAL, DIMENSION(mp) :: GWwb_ic - REAL, DIMENSION(mp,ms) :: tgg_old - REAL, DIMENSION(mp) :: tggsn_old,wbtot_ic,del_wbtot + ! REAL, DIMENSION(mp) :: snowmlt ! MMY@Nov2022 not really use + ! REAL, DIMENSION(mp) :: GWwb_ic ! MMY@Nov2022 not really use + REAL, DIMENSION(mp) :: tggsn_old,del_wbtot ! wbtot_ic ! MMY@Nov2022 not really use REAL(r_2), DIMENSION(mp) :: xx + REAL(r_2), DIMENSION(mp,ms) :: gammzz_snow REAL :: zsetot INTEGER, SAVE :: ktau =0 REAL(r_2) :: wb_lake_T, rnof2_T @@ -935,21 +969,34 @@ SUBROUTINE soil_snow_gw(dels, soil, ssnow, canopy, met, bal, veg) LOGICAL, SAVE :: first_gw_hydro_call = .TRUE. use_sli = .FALSE. - ktau = ktau +1 - zsetot = SUM(soil%zse) ssnow%tggav = 0. - DO k = 1, ms + !>## Order of procedure + !> 1. Set the physic constants + !> 2. Calculate average soil temp for soil column + DO k = 1, ms ssnow%tggav = ssnow%tggav + soil%zse(k)*ssnow%tgg(:,k)/zsetot - END DO + !> 3. If it is the first time step, define the ratio of ice density to liquid water density + ! and constrains wb and wbice + if (first_gw_hydro_call) then + den_rat = real(Cdensity_ice/Cdensity_liq,r_2) ! MMY @Nov2022 + ! call set_den_rat() ! MMY @Nov2022 + DO k = 1, ms + ssnow%wb(:,k) = MIN(soil%ssat_vec(:,k), MAX(real(ssnow%wb(:,k)), soil%watr(:,k))) + ssnow%wbice(:,k) = MIN(real(ssnow%wb(:,k))/den_rat, real(ssnow%wbice(:,k))) + END DO + end if + !> 4. set a default snow depth in the top snow layer IF( cable_runtime%offline .OR. cable_runtime%mk3l ) ssnow%t_snwlr = 0.05_r_2 + !> 5. initialize hydrology variables + ssnow%otgg = ssnow%tgg ! initialize of ssnow%otgg DO i=1,mp ssnow%fwtop1(i) = 0.0 ssnow%fwtop2(i) = 0.0 @@ -958,119 +1005,151 @@ SUBROUTINE soil_snow_gw(dels, soil, ssnow, canopy, met, bal, veg) ssnow%rnof1(i) = 0.0 ! initialise surface runoff ssnow%rnof2(i) = 0.0 ! initialise deep drainage ssnow%smelt(i) = 0.0 ! initialise snowmelt - ssnow%dtmlt(i,:) = 0.0 + ssnow%dtmlt(i,:) = 0.0 ! initialise water flux to the soil ssnow%osnowd(i) = ssnow%snowd(i) ! Scaling runoff to kg/m^2/s (mm/s) to match rest of the model ssnow%sinfil(i) = 0.0 ssnow%qhz(i) = 0.0 END DO + !> 6. set heat cap lower limit IF (cable_user%soil_thermal_fix) THEN - soil%heat_cap_lower_limit(:,:) = 0.01 !never allow /0 +!$ soil%heat_cap_lower_limit(:,:) = 0.01 !never allow /0 ! FEEDBACK (MMY asks: I guess we should delete this line since someone changed it on purpose) --rk4417 + soil%heat_cap_lower_limit(:,:) = 0._r_2 !allow /0 to show bugs ! FEEDBACK (MMY asks: I don't know how it shows bugs, can anyone check it???) --rk4417 ELSE + print *, "MMY testing soil%css_vec(:,:) =",soil%css_vec(:,:), "soil%rhosoil_vec(:,:) = ", soil%rhosoil_vec(:,:) !MMY@18May2023 soil%heat_cap_lower_limit(:,:) = soil%css_vec(:,:) * soil%rhosoil_vec(:,:) END IF + !> 7. MMY??? IF( (.NOT.cable_user%cable_runtime_coupled ) .AND. (first_gw_hydro_call)) THEN - IF (cable_runtime%um) canopy%dgdtg = 0.0 ! RML added um condition - ! after discussion with BP - ! N.B. snmin should exceed sum of layer depths, i.e. .11 m - ssnow%wbtot = 0.0 - ssnow%wb(:,:) = MIN( soil%ssat_vec(:,:), MAX ( ssnow%wb(:,:), 0.5*soil%swilt_vec(:,:) ) ) - - DO k = 1, ms - - WHERE( ssnow%tgg(:,k) <= CTFRZ .AND. ssnow%wbice(:,k) <= 0.001*ssnow%wb(:,k) ) & - ssnow%wbice(:,k) = 0.5 * ssnow%wb(:,k) - - !WHERE( ssnow%tgg(:,k) < CTFRZ) & - ! ssnow%wbice(:,k) = 0.8 * ssnow%wb(:,k) - - END DO - - WHERE ( soil%isoilm .EQ. 9)! .and. ssnow%snowd .le. 0.1*max_glacier_snowd) - - ! permanent ice: fix hard-wired number in next version - ssnow%snowd = max_glacier_snowd - ssnow%osnowd = max_glacier_snowd - ssnow%tgg(:,1) = ssnow%tgg(:,1) - 1.0 - - END WHERE - - WHERE ( SPREAD(soil%isoilm,2,ms) .EQ. 9 ) - - ssnow%wb = 0.95 * soil%ssat_vec - ssnow%wbice = 0.95 * ssnow%wb - - END WHERE - + IF (cable_runtime%um) canopy%dgdtg = 0.0 ! RML added um condition + +! MMY@23Apr2023 delete this block, since without it CABLE-GW works well ! FEEDBACK (Please see MMY questions regarding commented block below) --rk4417 +! MMY@13Mar2023 the block below is an initialization for ssnow%wb, ssnow%wbice & ssnow%snowd (if soil%isoilm=9) +! It is duplicate to the section 3. I don't think we need to initializate ssnow%wb and ssnow%wbice again. +! However, I don't know whether we should keep ssnow%snowd = max_glacier_snowd for soil%isoilm=9. +! Please check with Claire and Jhan if possible. + +!$ ! MMY??? should we keep wb & wbice setting for soil%isoilm==9 (permanent ice) and snow covering region +!$ +!$ ! after discussion with BP ! block commented out by rk4417 as missing from MMY +!$ ! N.B. snmin should exceed sum of layer depths, i.e. .11 m ! need to discuss with MMY +!$ ssnow%wbtot = 0.0 +!$ ssnow%wb(:,:) = MIN( soil%ssat_vec(:,:), MAX ( ssnow%wb(:,:), 0.5*soil%swilt_vec(:,:) ) ) +!$ +!$ DO k = 1, ms +!$ +!$ WHERE( ssnow%tgg(:,k) <= CTFRZ .AND. ssnow%wbice(:,k) <= 0.001*ssnow%wb(:,k) ) & +!$ ssnow%wbice(:,k) = 0.5 * ssnow%wb(:,k) +!$ +!$ !WHERE( ssnow%tgg(:,k) < CTFRZ) & +!$ ! ssnow%wbice(:,k) = 0.8 * ssnow%wb(:,k) +!$ +!$ END DO +!$ WHERE ( soil%isoilm .EQ. 9)! .and. ssnow%snowd .le. 0.1*max_glacier_snowd) +!$ +!$ ! permanent ice: fix hard-wired number in next version +!$ ssnow%snowd = max_glacier_snowd +!$ ssnow%osnowd = max_glacier_snowd +!$ ssnow%tgg(:,1) = ssnow%tgg(:,1) - 1.0 +!$ +!$ END WHERE +!$ +!$ WHERE ( SPREAD(soil%isoilm,2,ms) .EQ. 9 ) +!$ +!$ ssnow%wb = 0.95 * soil%ssat_vec +!$ ssnow%wbice = 0.95 * ssnow%wb +!$ +!$ END WHERE +! END DELETE END IF - - tgg_old = ssnow%tgg - - !Start with wb and wbice. Need wbliq, wmliq,wmice,wmtot - !find the mass of ice and liq from the prognostic volumetric values + !> 8. Calculate snow heat capacity to the top soil + ! ??? MMY@Nov2022 gammzz_snow and ssnow%gammzz calculated here are useless, should be commented out ___ + gammzz_snow(:,:) = 0._r_2 ! MMY@23Apr2023 necessary to have this line + ! since only the top soil layer can have snow + ! and gammzz_snow in the other layers should + ! be 0 + do i=1,mp + ! ssnow%isflag = 0 one snow layer; =1 three snow layers + gammzz_snow(i,1) = real((1. - ssnow%isflag(i)) * Ccgsnow * ssnow%snowd(i),r_2) + end do + + !> 9. Find the mass and saturation fraction of ice and liq from the prognostic volumetric values (wb,wbice) + ! and calculate sucs_hys and smp_hys DO k=1,ms DO i=1,mp - ssnow%wbliq(i,k) = ssnow%wb(i,k) - ssnow%wbice(i,k) !liquid volume - ssnow%wmice(i,k) = ssnow%wbice(i,k)*REAL(Cdensity_ice*soil%zse(k),r_2) !ice mass - ssnow%wmliq(i,k) = ssnow%wbliq(i,k)*REAL(Cdensity_liq*soil%zse(k),r_2) !liquid mass + ssnow%wbliq(i,k) = ssnow%wb(i,k) - den_rat*ssnow%wbice(i,k) ! MMY !liquid volume + ssnow%wmice(i,k) = ssnow%wbice(i,k)*real(Cdensity_ice,r_2)*soil%zse_vec(i,k)!ice mass + ssnow%wmliq(i,k) = ssnow%wbliq(i,k)*real(Cdensity_liq,r_2)*soil%zse_vec(i,k) !liquid mass ssnow%wmtot(i,k) = ssnow%wmice(i,k) + ssnow%wmliq(i,k) !liq+ice mass + ssnow%wblf(i,k) = MAX(ssnow%wbliq(i,k)/soil%ssat_vec(i,k),0.01_r_2) ssnow%wbfice(i,k) = MAX(ssnow%wbice(i,k)/soil%ssat_vec(i,k),0._r_2) - + !do not pass with mpi + ssnow%sucs_hys(i,k) = ssnow%hys_fac(i,k)*soil%sucs_vec(i,k) + ssnow%smp_hys(i,k) = min(ssnow%smp_hys(i,k),-ssnow%sucs_hys(i,k)) END DO END DO - + !> 10. calculate heat capacity for each soil layer IF( first_gw_hydro_call ) THEN - - DO i=1,mp - ssnow%gammzz(i,1) = MAX(soil%heat_cap_lower_limit(i,1),& - (1.0-soil%ssat_vec(i,1))*& - soil%css_vec(i,1) * soil%rhosoil_vec(i,1) & - & + ssnow%wbliq(i,1) * Ccs_rho_wat & - & + ssnow%wbice(i,1) * Ccs_rho_ice ) * soil%zse(1) + & - & (1. - ssnow%isflag(i)) * Ccgsnow * ssnow%snowd(i) - - END DO - + DO k=1,ms + DO i=1,mp + ssnow%gammzz(i,k) = max(soil%heat_cap_lower_limit(i,k),& + (1.0-soil%ssat_vec(i,k))*& + soil%css_vec(i,k) * soil%rhosoil_vec(i,k) & + + ssnow%wbliq(i,k) * real(Ccswat*Cdensity_liq,r_2) & + + ssnow%wbice(i,k) * real(Ccsice*Cdensity_ice,r_2) )* & + soil%zse_vec(i,k) + gammzz_snow(i,k) + END DO + END DO ENDIF ! if(.NOT.cable_runtime_coupled) and first_gw_hydro_call + !> wbliq_old is used for hysteresis + ssnow%wbliq_old = ssnow%wbliq - DO i=1,mp - !initial water in the soil column - wbtot_ic(i) = SUM(ssnow%wbliq(i,:)*Cdensity_liq*soil%zse(:),1) + & - SUM(ssnow%wbice(i,:)*Cdensity_ice*soil%zse(:),1) + & - ssnow%GWwb(i)*soil%GWdz(i)*Cdensity_liq - - GWwb_ic(i) = ssnow%GWwb(i) - - END DO - - !improve hiding, call single soilsnow subroutine to do all the - !snow processes and thermal soil calculations - - CALL snow_processes_soil_thermal(dels,ssnow,soil,veg,canopy,met,bal,snowmlt) - - !leave here for now, could move into soilsnow as well - CALL remove_transGW(dels, soil, ssnow, canopy, veg) !transpiration loss per soil layer - - CALL GWsoilfreeze(dels, soil, ssnow,tgg_old) + !> 10. snow processes and thermal soil + CALL snow_processes_soil_thermal(dels,ssnow,soil,veg,canopy,met,bal) + + !> 11. transpiration loss per soil layer ! leave here for now, could move into soilsnow as well + CALL remove_transGW(dels, soil, ssnow, canopy, veg) + !> 12. Snow freezes and melts. + CALL GWsoilfreeze(dels, soil, ssnow) + ssnow%fwtop = canopy%precis/dels + ssnow%smelt/dels !water from canopy and snowmelt [mm/s] + !> 13. calculate water table depth CALL iterative_wtd (ssnow, soil, veg, .TRUE. ) - CALL ovrlndflx (dels, ssnow, soil, veg, canopy,use_sli ) !surface runoff, incorporate ssnow%pudsto? - - ssnow%sinfil = ssnow%fwtop - canopy%segg !canopy%fes/Chl !remove soil evap from throughfall - - CALL smoistgw (dels,ktau,ssnow,soil,veg,canopy) !vertical soil moisture movement. - - ! correction required for energy balance in online simulations + !> 14. surface runoff, incorporate ssnow%pudsto? + CALL ovrlndflx (dels, ssnow, soil, veg, canopy,use_sli ) + !> remove soil evap from throughfall + ssnow%sinfil = ssnow%fwtop - canopy%segg !canopy%fes/CHL + + !> 15. vertical soil moisture movement. + CALL smoistgw (dels,ktau,ssnow,soil,veg,canopy) + + ! _________ MMY@23Apr2023 need to check these hysteresis-related codes, I think they should show before smoistgw ______ + !* if Brook & Cosby water retention hysteresis is used, calculate smp_hys, wb_hys, + ! ssat_hys, hys_fac, sucs_hys, watr_hys... + IF (gw_params%BC_hysteresis) & + CALL swc_hyst_direction(soil,ssnow,veg) + + !call swc_smp_dsmpdw(soil,ssnow) + !> 16. soil matric potential + if (gw_params%BC_hysteresis) then + call brook_corey_hysteresis_swc_smp(soil,ssnow) + elseif (gw_params%HC_SWC) then + call hutson_cass_swc_smp(soil,ssnow) + else + call brook_corey_swc_smp(soil,ssnow) + end if + + !> 17. correction required for energy balance in online simulations IF( cable_runtime%um ) THEN !cls package - rewritten for flexibility @@ -1094,11 +1173,12 @@ SUBROUTINE soil_snow_gw(dels, soil, ssnow, canopy, met, bal, veg) canopy%fess = canopy%fess + canopy%fes_cor ENDIF ENDIF - + + !> 18. update variables ! MMY??? where is pudsto calculated DO i=1,mp ssnow%pudsto(i) = 0.0 !no puddle ssnow%smelt(i) = ssnow%smelt(i)/dels !change units to mm/s. cable_driver then reverts back to mm - ssnow%runoff(i) = (ssnow%rnof1(i) + ssnow%rnof2(i))! *dels !cable_driver converts from mm/s to mm + ssnow%runoff(i) = (ssnow%rnof1(i) + ssnow%rnof2(i))!*dels !cable_driver converts from mm/s to mm !rnof1 and rnof2 are already in mm/s ! Set weighted soil/snow surface temperature ssnow%tss(i) = (1-ssnow%isflag(i))*ssnow%tgg(i,1) + ssnow%isflag(i)*ssnow%tggsn(i,1) @@ -1109,16 +1189,20 @@ SUBROUTINE soil_snow_gw(dels, soil, ssnow, canopy, met, bal, veg) ssnow%GWwb(i)*soil%GWdz(i)*Cdensity_liq !for debug water balance. del_wbtot = fluxes = infiltration [though-evap] - trans - qhorz drainage - del_wbtot(i) = dels * (ssnow%sinfil(i) - ssnow%rnof2(i) - canopy%fevc(i) / Chl) - !set below to keep track of water imbalance within the GW module explicitly. also must change cable_checks - !ssnow%wbtot(i) = ssnow%wbtot(i)-wbtot_ic(i) + del_wbtot(i) = dels * (ssnow%sinfil(i) - ssnow%rnof2(i) - canopy%fevc(i) / CHL) END DO - + ! MMY take from subroutine soil_snow, hydraulic redistribution should be included + ! IF( redistrb ) & + ! CALL hydraulic_redistribution( dels, soil, ssnow, canopy, veg, met ) + first_gw_hydro_call=.false. + END SUBROUTINE soil_snow_gw SUBROUTINE calc_equilibrium_water_content(ssnow,soil) - !find layer mean soil moisture and potential at equilibrium with wtd + !* Calculate soil moisture and potential at hydrostatic equilibrium + ! with water table depth [Zeng and Decker 2009](https://doi.org/10.1175/2008JHM1011.1) + ! MMY unfinished IMPLICIT NONE @@ -1129,150 +1213,203 @@ SUBROUTINE calc_equilibrium_water_content(ssnow,soil) REAL(r_2), DIMENSION(ms) :: dzmm !layer thickness for single tile REAL(r_2), DIMENSION(mp) :: GWdzmm !aquifer thickness at each tile REAL(r_2), DIMENSION(mp) :: GWzimm !aquifer layer interface depth - REAL(r_2), DIMENSION(0:ms) :: zimm !layer interface depth in mm - REAL(r_2), DIMENSION(ms) :: zmm !node depths in mm - REAL(r_2) :: tempi, temp0,voleq1,wbrat - REAL(r_2), DIMENSION(mp,ms+1) :: ice_correction - + REAL(r_2), dimension(mp,0:ms) :: zimm !layer interface depth in mm + REAL(r_2), dimension(mp,ms) :: zmm !node depths in mm + REAL(r_2) :: tempi, temp0,voleq1,wbrat,& + zi_smpc,tmp_const,voleq2 INTEGER :: k,i - IF (gw_params%ssgw_ice_switch) THEN - smp_cor = 8.0 - ELSE - smp_cor = 0.0 - END IF +!$ IF (gw_params%ssgw_ice_switch) THEN ! FEEDBACK (MMY asks: ask Claire or Anna what ssgw_ice_switch is for and whether to keep it) --rk4417 +!$ smp_cor = 8.0 +!$ ELSE +!$ smp_cor = 0.0 +!$ END IF !make code cleaner define these here - dzmm = 1000.0_r_2 * REAL(soil%zse(:),r_2) - zimm(0) = 0._r_2 - + zimm(:,:) = 0._r_2 DO k=1,ms - zimm(k) = zimm(k-1) + dzmm(k) - zmm(k) = zimm(k-1) + 0.5_r_2*dzmm(k) + zimm(:,k) = zimm(:,k-1) + m2mm*soil%zse_vec(:,k) + zmm(:,k) = zimm(:,k-1) + 0.5_r_2*m2mm*soil%zse_vec(:,k) END DO - DO i=1,mp - GWdzmm(i) = REAL(soil%GWdz(i),r_2)*1000._r_2 - GWzimm(i) = zimm(ms)+GWdzmm(i) - zaq(i) = zimm(ms) + 0.5_r_2*GWdzmm(i) - END DO - - IF (.NOT.gw_params%ssgw_ice_switch) THEN - ice_correction(:,:) = 1._r_2 - - ELSE - - DO k=1,ms - DO i=1,mp - ice_correction(i,k) = 1._r_2 + smp_cor * ssnow%wbice(i,k) - ice_correction(i,k) = ice_correction(i,k)**(2.0/soil%bch_vec(i,k)) - END DO - END DO - DO i=1,mp - ice_correction(i,ms+1) = 1._r_2 + smp_cor * ssnow%wbice(i,ms) - ice_correction(i,ms+1) = ice_correction(i,ms+1)**(2.0/soil%GWbch_vec(i)) - END DO - - END IF - - +!$ IF (.NOT.gw_params%ssgw_ice_switch) THEN ! FEEDBACK (MMY asks: ask Claire or Anna what ssgw_ice_switch is for and whether to keep it) --rk4417 +!$ ice_correction(:,:) = 1._r_2 +!$ +!$ ELSE +!$ +!$ DO k=1,ms +!$ DO i=1,mp +!$ ice_correction(i,k) = 1._r_2 + smp_cor * ssnow%wbice(i,k) +!$ ice_correction(i,k) = ice_correction(i,k)**(2.0/soil%bch_vec(i,k)) +!$ END DO +!$ END DO +!$ DO i=1,mp +!$ ice_correction(i,ms+1) = 1._r_2 + smp_cor * ssnow%wbice(i,ms) +!$ ice_correction(i,ms+1) = ice_correction(i,ms+1)**(2.0/soil%GWbch_vec(i)) +!$ END DO +!$ +!$ END IF + + do i=1,mp + GWzimm(i) = zimm(i,ms)+m2mm*soil%GWdz(i) + zaq(i) = zimm(i,ms) + 0.5_r_2*m2mm*soil%GWdz(i) + end do + + soil%wbc_GW(:) = 0.0 + soil%wbc_vec(:,:) = 0.0 + soil%smpc_vec(:,:) = 1.0e+30 + soil%smpc_GW(:) = 1.0e+30 + + if (.not.gw_params%BC_hysteresis) then !not needed but make code clear + ssnow%watr_hys = soil%watr(:,:) + ssnow%ssat_hys = soil%ssat_vec(:,:) + ssnow%sucs_hys = soil%sucs_vec + + if (gw_params%HC_SWC) then + soil%wbc_vec(:,:) = 2.0*soil%bch_vec(:,:)*soil%ssat_vec(:,:)/& + (1.0+2.0*soil%bch_vec(:,:)) + soil%smpc_vec(:,:) = -soil%sucs_vec(:,:) * & + (2.0*soil%bch_vec(:,:)/& + ((1.0+2.0*soil%bch_vec(:,:))))**(-soil%bch_vec(:,:)) + soil%wbc_GW(:) = 2.0*soil%GWbch_vec(:)*soil%GWssat_vec(:)/& + (1.0+2.0*soil%GWbch_vec(:)) + soil%smpc_GW(:) = -soil%GWsucs_vec(:) * & + (2.0*soil%GWbch_vec(:)/& + ((1.0+2.0*soil%GWbch_vec(:))))**(-soil%GWbch_vec(:)) + end if + end if + !equilibrium water content DO k=1,ms DO i=1,mp - IF ((ssnow%wtd(i) .LE. zimm(k-1))) THEN !fully saturated + if ((ssnow%wtd(i) .le. zimm(i,k-1))) then !fully saturated ! replaced block above by below as per MMY -- rk4417 - ssnow%wbeq(i,k) = soil%ssat_vec(i,k) + ssnow%wbeq(i,k) = ssnow%ssat_hys(i,k) - ELSEIF ((ssnow%wtd(i) .LE. zimm(k)) .AND. & - (ssnow%wtd(i) .GT. zimm(k-1))) THEN + elseif ((ssnow%wtd(i) .le. zimm(i,k)) .and. & + (ssnow%wtd(i) .gt. zimm(i,k-1))) then tempi = 1._r_2 temp0 = & - (((soil%sucs_vec(i,k)+ssnow%wtd(i)-zimm(k-1))/& - soil%sucs_vec(i,k)))**(1._r_2-1._r_2/soil%bch_vec(i,k)) - voleq1 = -soil%sucs_vec(i,k)*(soil%ssat_vec(i,k)-soil%watr(i,k))/& - (1._r_2-1._r_2/soil%bch_vec(i,k))/& - (ssnow%wtd(i)-zimm(k-1))*(tempi-temp0) - ssnow%wbeq(i,k) = (voleq1*(ssnow%wtd(i)-zimm(k-1)) +& - (soil%ssat_vec(i,k)-soil%watr(i,k))& - *(zimm(k)-ssnow%wtd(i)))/(zimm(k)-zimm(k-1))& - + soil%watr(i,k) - ssnow%wbeq(i,k) = ssnow%wbeq(i,k)*ice_correction(i,k) - ELSE - - tempi = (((soil%sucs_vec(i,k)+ssnow%wtd(i)-zimm(k))/& - soil%sucs_vec(i,k)))**(1._r_2-1._r_2/soil%bch_vec(i,k)) - temp0 = (((soil%sucs_vec(i,k)+ssnow%wtd(i)-zimm(k-1))/& - soil%sucs_vec(i,k)))**(1._r_2-1._r_2/soil%bch_vec(i,k)) - ssnow%wbeq(i,k) = -soil%sucs_vec(i,k)*(soil%ssat_vec(i,k)-soil%watr(i,k))/& - (1._r_2-1._r_2/soil%bch_vec(i,k))/& - (zimm(k)-zimm(k-1))*(tempi-temp0)+soil%watr(i,k) - ssnow%wbeq(i,k) = ssnow%wbeq(i,k)*ice_correction(i,k) - END IF - - ssnow%wbeq(i,k) = MIN(MAX(ssnow%wbeq(i,k),soil%watr(i,k)),soil%ssat_vec(i,k)) - - ssnow%wbeq(i,k) = ssnow%wbeq(i,k)*ice_correction(i,k) - - wbrat = MIN(MAX((& - ssnow%wbeq(i,k) - soil%watr(i,k))/(soil%ssat_vec(i,k)-soil%watr(i,k)),& - 0.001_r_2),1._r_2) - - ssnow%zq(i,k) = MAX(& - -soil%sucs_vec(i,k)*(wbrat**(-soil%bch_vec(i,k))),sucmin) - - IF (gw_params%ssgw_ice_switch) THEN - ssnow%zq(i,k) = MAX(& - -soil%sucs_vec(i,k)*(1._r_2+smp_cor*ssnow%wbice(i,k))*(wbrat**(-soil%bch_vec(i,k))),sucmin) - END IF - + (((ssnow%sucs_hys(i,k)+ssnow%wtd(i)-zimm(i,k-1))/& + ssnow%sucs_hys(i,k)))**(1._r_2-1._r_2/soil%bch_vec(i,k)) + voleq1 = -ssnow%sucs_hys(i,k)*(ssnow%ssat_hys(i,k)-ssnow%watr_hys(i,k))/& + (1._r_2-1._r_2/soil%bch_vec(i,k))/& + (ssnow%wtd(i)-zimm(i,k-1))*(tempi-temp0) + ssnow%watr_hys(i,k) ! MMY@23Apr2023 compared with trunk version, Mark added ssnow%watr_hys(i,k) to this equation, but why??? + ssnow%wbeq(i,k) = (voleq1*(ssnow%wtd(i)-zimm(i,k-1)) +& ! MMY@23Apr2023 compared with trunk version, Mark remove ssnow%watr_hys(i,k) from this equation but why??? + (ssnow%ssat_hys(i,k))& + *(zimm(i,k)-ssnow%wtd(i)))/(zimm(i,k)-zimm(i,k-1)) + ! MMY@23Apr2023 compared with trunk version, Mark removed ssnow%wbeq(i,k) = ssnow%wbeq(i,k)*ice_correction(i,k), why??? + else + + tempi = (((ssnow%sucs_hys(i,k)+ssnow%wtd(i)-zimm(i,k))/& + ssnow%sucs_hys(i,k)))**(1._r_2-1._r_2/soil%bch_vec(i,k)) + temp0 = (((ssnow%sucs_hys(i,k)+ssnow%wtd(i)-zimm(i,k-1))/& + ssnow%sucs_hys(i,k)))**(1._r_2-1._r_2/soil%bch_vec(i,k)) + ssnow%wbeq(i,k) = -ssnow%sucs_hys(i,k)*(ssnow%ssat_hys(i,k)-ssnow%watr_hys(i,k))/& + (1._r_2-1._r_2/soil%bch_vec(i,k))/& + (zimm(i,k)-zimm(i,k-1))*(tempi-temp0)+ssnow%watr_hys(i,k) + ! MMY@23Apr2023 compared with trunk version, Mark removed ssnow%wbeq(i,k) = ssnow%wbeq(i,k)*ice_correction(i,k), why??? + end if + + if (.not.gw_params%HC_SWC) then + ssnow%wbeq(i,k) = min(max(ssnow%wbeq(i,k),ssnow%watr_hys(i,k)),ssnow%ssat_hys(i,k)) + + wbrat = min(max((& + ssnow%wbeq(i,k) - ssnow%watr_hys(i,k))/& + (ssnow%ssat_hys(i,k)-ssnow%watr_hys(i,k)),& + 0.01_r_2),1._r_2) + ssnow%zq(i,k) = max(& + -ssnow%sucs_hys(i,k)*(wbrat**(-soil%bch_vec(i,k))),sucmin) + + else + if (ssnow%wbeq(i,k) .lt. soil%wbc_vec(i,k)) then + wbrat = min(max((& + ssnow%wbeq(i,k) - soil%watr(i,k))/(soil%ssat_vec(i,k)-soil%watr(i,k)),& + 0.01_r_2),1._r_2) + + ssnow%zq(i,k) = max(& + -soil%sucs_vec(i,k)*(wbrat**(-soil%bch_vec(i,k))),sucmin) + else + ssnow%zq(i,k) = -soil%sucs_vec(i,k)* & + sqrt(1._r_2 - ssnow%wbeq(i,k)/soil%ssat_vec(i,k))/& + (sqrt(1._r_2-soil%wbc_vec(i,k)/soil%ssat_vec(i,k))*& + ( (soil%wbc_vec(i,k)/soil%ssat_vec(i,k))**soil%bch_vec(i,k) )) + + end if + + end if END DO !mp END DO !ms DO i=1,mp - !Aquifer Equilibrium water content - IF (ssnow%wtd(i) .LE. zimm(ms)) THEN !fully saturated - ssnow%GWwbeq(i) = soil%GWssat_vec(i)-soil%GWwatr(i) + if (ssnow%wtd(i) .le. zimm(i,ms)) then !fully saturated !MMY@23Apr2023 I don't know why Mark changed it but as codes from CABLE-GW works, I suggest to delete the codes from trunk + + ssnow%GWwbeq(i) = soil%GWssat_vec(i) ! MMY@23Apr2023 in trunk it has '-soil%GWwatr(i)' - ELSEIF ((ssnow%wtd(i) .GT. GWzimm(i))) THEN !fully unsaturated + elseif ((ssnow%wtd(i) .gt. GWzimm(i))) then !fully unsaturated tempi = & - (((soil%GWsucs_vec(i)+ssnow%wtd(i)-GWzimm(i))/& - soil%GWsucs_vec(i)))**(1._r_2-1._r_2/soil%GWbch_vec(i)) - temp0 = (((soil%GWsucs_vec(i)+ssnow%wtd(i)-zimm(ms))/& - soil%GWsucs_vec(i)))**(1._r_2-1._r_2/soil%GWbch_vec(i)) + (((soil%GWsucs_vec(i)+ssnow%wtd(i)-GWzimm(i))/& + soil%GWsucs_vec(i)))**(1._r_2-1._r_2/soil%GWbch_vec(i)) + temp0 = (((soil%GWsucs_vec(i)+ssnow%wtd(i)-zimm(i,ms))/& + soil%GWsucs_vec(i)))**(1._r_2-1._r_2/soil%GWbch_vec(i)) ssnow%GWwbeq(i) = -soil%GWsucs_vec(i)*soil%GWssat_vec(i)/& - (1._r_2-1._r_2/soil%GWbch_vec(i))/& - (GWzimm(i)-zimm(ms))*(tempi-temp0) + soil%GWwatr(i) + (1._r_2-1._r_2/soil%GWbch_vec(i))/& + (GWzimm(i)-zimm(i,ms))*(tempi-temp0) + soil%GWwatr(i) - ELSE - - tempi = 1._r_2 - temp0 = (((soil%GWsucs_vec(i)+ssnow%wtd(i)-zimm(ms))/& - soil%GWsucs_vec(i)))**(1._r_2-1._r_2/soil%GWbch_vec(i)) - voleq1 = -soil%GWsucs_vec(i)*(soil%GWssat_vec(i)-soil%GWwatr(i))/& - (1._r_2-1._r_2/soil%GWbch_vec(i))/& - (ssnow%wtd(i)-zimm(ms))*(tempi-temp0) + soil%GWwatr(i) - ssnow%GWwbeq(i) = (voleq1*(ssnow%wtd(i)-zimm(ms)) + & - (soil%GWssat_vec(i)-soil%GWwatr(i))*& - (GWzimm(i)-ssnow%wtd(i)))/(GWzimm(i)-zimm(ms)) + soil%GWwatr(i) - - END IF - - ssnow%GWwbeq(i) = MIN(MAX(ssnow%GWwbeq(i),soil%GWwatr(i)),soil%GWssat_vec(i)) + else - ssnow%GWzq(i) = -soil%GWsucs_vec(i)*(MAX((ssnow%GWwbeq(i)-soil%GWwatr(i))/ & - (soil%GWssat_vec(i)-soil%GWwatr(i)),0.001_r_2))**(-soil%GWbch_vec(i)) - ssnow%GWzq(i) = MAX(sucmin, ssnow%GWzq(i)) + tempi = 1._r_2 + temp0 = & + (((soil%GWsucs_vec(i)+ssnow%wtd(i)-zimm(i,ms))/& + soil%GWsucs_vec(i)))**(1._r_2-1._r_2/soil%GWbch_vec(i)) + voleq1 = -soil%GWsucs_vec(i)*(soil%GWssat_vec(i)-soil%GWwatr(i))/& + (1._r_2-1._r_2/soil%GWbch_vec(i))/& + (ssnow%wtd(i)-zimm(i,ms))*(tempi-temp0) + soil%GWwatr(i) + ssnow%GWwbeq(i) = (voleq1*(ssnow%wtd(i)-zimm(i,ms)) +& ! MMY@23Apr2023 this block doesn't consider 'soil%GWwatr(i))' as the trunk why??? + (soil%GWssat_vec(i))& + *(GWzimm(i)-ssnow%wtd(i)))/(GWzimm(i)-zimm(i,ms)) + + end if + + if (.not.gw_params%HC_SWC) then + + ssnow%GWwbeq(i) = min(max(ssnow%GWwbeq(i),soil%GWwatr(i)),soil%GWssat_vec(i)) + + ssnow%GWzq(i) = -soil%GWsucs_vec(i)*(max((ssnow%GWwbeq(i)-soil%GWwatr(i))/ & + (soil%GWssat_vec(i)-soil%GWwatr(i)),0.01_r_2))**(-soil%GWbch_vec(i)) + ssnow%GWzq(i) = max(sucmin, ssnow%GWzq(i)) + + else + if (ssnow%GWwbeq(i) .lt. soil%wbc_GW(i)) then + wbrat = min(max((& + ssnow%wbeq(i,k) - soil%GWwatr(i))/(soil%GWssat_vec(i)-soil%GWwatr(i)),& + 0.01_r_2),1._r_2) + + ssnow%GWzq(i) = max(& + -soil%GWsucs_vec(i)*(wbrat**(-soil%GWbch_vec(i))),sucmin) + else + ssnow%gwzq(i) = -soil%gwsucs_vec(i)* & + sqrt(1._r_2 - ssnow%gwwbeq(i)/soil%gwssat_vec(i))/& + (sqrt(1._r_2-soil%wbc_gw(i)/soil%gwssat_vec(i))*& + ( (soil%wbc_gw(i)/soil%GWssat_vec(i))**soil%GWbch_vec(i) )) + + end if + end if END DO END SUBROUTINE calc_equilibrium_water_content + SUBROUTINE calc_srf_wet_fraction(ssnow,soil,met,veg) + !* Calculate the wet fraction of the surafce + ! following [Decker, 2015](http://doi.wiley.com/10.1002/2015MS000507) + !* This subrountine is called in subrountine surf_wetness_fact in cable_canopy.F90 IMPLICIT NONE TYPE(soil_snow_type), INTENT(INOUT) :: ssnow ! soil+snow variables @@ -1283,12 +1420,14 @@ SUBROUTINE calc_srf_wet_fraction(ssnow,soil,met,veg) !local variables REAL(r_2), DIMENSION(mp) :: icef,satfrac_liqice,S REAL(r_2) :: fice,xx - REAL(r_2) :: dzmm_one,liqmass,icemass,totmass + REAL(r_2) :: liqmass,icemass,totmass INTEGER :: i,j,k REAL(r_2) :: wb_unsat,wb_lin,funcval REAL(r_2) :: derv,slopeSTDmm,func_step REAL(r_2) :: wb_evap_threshold +! REAL(r_2) :: pi_temp=3.1415927 ! no need, use CPI instead - rk4417 - phase2 + !> if true, using Dani Or soil evaporation scheme IF (cable_user%or_evap) THEN CALL saturated_fraction(ssnow,soil,veg) @@ -1306,19 +1445,20 @@ SUBROUTINE calc_srf_wet_fraction(ssnow,soil,met,veg) END DO ELSEIF (cable_user%gw_model) THEN - + !> if true, using Dani Or soil evaporation scheme CALL saturated_fraction(ssnow,soil,veg) DO i = 1,mp - dzmm_one = 1000._r_2 * REAL(soil%zse_vec(i,1),r_2) - icemass = ssnow%wbice(i,1) * dzmm_one - liqmass = (ssnow%wb(i,1)-ssnow%wbice(i,1)) * dzmm_one + ! MMY@23Apr2023, calc_srf_wet_fraction is called before ssnow%wmice and ssnow%wmliq calculated, + ! here needs to calcuate icemass and liqmass. + + icemass = ssnow%wbice(i,1)*real(Cdensity_ice,r_2)*soil%zse_vec(i,1) !ice mass + liqmass = ssnow%wbliq(i,1)*real(Cdensity_liq,r_2)*soil%zse_vec(i,1) totmass = MAX(liqmass+icemass,REAL(1e-2,r_2)) - icef(i) = MAX(0._r_2,MIN(1._r_2, gw_params%IceBeta*icemass / totmass)) + icef(i) = max(0._r_2,min(1._r_2,icemass / totmass)) ! MMY END DO - !srf frozen fraction. should be based on topography DO i = 1,mp fice = (EXP(-gw_params%IceAlpha*(1._r_2-icef(i)))-& @@ -1326,9 +1466,9 @@ SUBROUTINE calc_srf_wet_fraction(ssnow,soil,met,veg) (1._r_2-EXP(-gw_params%IceAlpha)) fice = MIN(1._r_2,MAX(0._r_2,fice)) - satfrac_liqice(i) = fice + (1._r_2-fice)*ssnow%satfrac(i) + satfrac_liqice(i) = max(0.,min(0.95,fice + (1._r_2-fice)*ssnow%satfrac(i) ) ) ! MMY - wb_unsat = ((ssnow%wb(i,1)-ssnow%wbice(i,1)) -& + wb_unsat = ((ssnow%wb(i,1)-ssnow%wbice(i,1)*den_rat) -& ! MMY add *den_rat ! MMY@23Apr2023, since this subroutine is called before den_rat calculated in soil_snow_gw, here den_rat's value from definition at the start of module ssnow%satfrac(i)*soil%ssat_vec(i,1))/(1.-ssnow%satfrac(i)) wb_unsat = MIN(soil%ssat_vec(i,1),MAX(0.,wb_unsat)) @@ -1340,7 +1480,9 @@ SUBROUTINE calc_srf_wet_fraction(ssnow,soil,met,veg) IF (wb_unsat .GE. wb_evap_threshold) THEN xx = 1. ELSE - xx = 0.25 * (1._r_2 - COS(Cpi*wb_unsat/(wb_evap_threshold)))**2.0 +! xx = 0.25 * (1._r_2 - cos(pi_temp*wb_unsat/(wb_evap_threshold)))**2.0 ! MMY@23Apr2023 add pi_temp to this subroutine, C=>phys which doesn't include pi value +! replaced above by below - rk4417 - phase2 + xx = 0.25 * (1._r_2 - cos(CPI*wb_unsat/(wb_evap_threshold)))**2.0 END IF ssnow%wetfac(i) = MAX(0.0,MIN(1.0,satfrac_liqice(i) +& @@ -1363,14 +1505,15 @@ SUBROUTINE calc_srf_wet_fraction(ssnow,soil,met,veg) IF( ssnow%wbice(i,1) > 0. )& ssnow%wetfac(i) = ssnow%wetfac(i) * & REAL(MAX( 0.5_r_2, 1._r_2 - MIN( 0.2_r_2, & - ( ssnow%wbice(i,1) / ssnow%wb(i,1) )**2 ) ) ) + ( ssnow%wbice(i,1) * den_rat & ! MMY not sure whether needed but add * den_rat + / ssnow%wb(i,1) )**2 ) ) ) IF( ssnow%snowd(i) > 0.1) ssnow%wetfac(i) = 0.9 - IF ( veg%iveg(i) == 16 .AND. met%tk(i) >= Ctfrz + 5. ) & + IF ( veg%iveg(i) == 16 .AND. met%tk(i) >= CTFRZ + 5. ) & ssnow%wetfac(i) = 1.0 ! lakes: hard-wired number to be removed - IF( veg%iveg(i) == 16 .AND. met%tk(i) < Ctfrz + 5. ) & + IF( veg%iveg(i) == 16 .AND. met%tk(i) < CTFRZ + 5. ) & ssnow%wetfac(i) = 0.7 ! lakes: hard-wired number to be removed ENDDO @@ -1383,137 +1526,9 @@ SUBROUTINE calc_srf_wet_fraction(ssnow,soil,met,veg) END SUBROUTINE calc_srf_wet_fraction - !SUBROUTINE calc_soil_hydraulic_props(ssnow,soil,veg) - ! USE cable_common_module - ! TYPE(soil_parameter_type), INTENT(INOUT) :: soil - ! TYPE(soil_snow_type) , INTENT(INOUT) :: ssnow - ! TYPE(veg_parameter_type) , INTENT(INOUT) :: veg - ! - ! INTEGER :: i,k,kk - ! - ! REAL(r_2), DIMENSION(mp) :: s1, & !temporary variables for calculating hydraulic properties - ! s2, & - ! s_mid, & - ! liq_ratio, & - ! Dliq_ratio_Dz - ! - ! REAL(r_2), DIMENSION(0:ms) :: zimm !depths at interface between layers - ! REAL(r_2), dimension(mp,ms) ::wb_temp - ! - ! !soil matric potential, hydraulic conductivity, and - ! derivatives of each with respect to water (calculated using total (not liquid)) - ! - ! do k=1,ms - ! do i=1,mp - ! ssnow%icefrac(i,k) = ssnow%wbice(i,k)/(max(ssnow%wb(i,k),0.01_r_2)) - ! ssnow%fracice(i,k) = (exp(-gw_params%IceAlpha*(1._r_2-ssnow%icefrac(i,k)))& - ! -exp(-gw_params%IceAlpha))/(1._r_2-exp(-gw_params%IceAlpha)) - ! end do - ! end do - ! - ! ssnow%fracice(:,:) = max( min( ssnow%fracice, 1._r_2), 0._r_2) - ! - ! if (gw_params%ssgw_ice_switch) then - ! wb_temp = ssnow%wbliq - ! else - ! wb_temp = ssnow%wb - ! end if - ! - ! do k=1,ms-1 - ! kk=k+1 - ! do i=1,mp - ! - ! s1(i) = 0.5_r_2*(max(wb_temp(i,k)-soil%watr(i,k),0.) + & - ! max(wb_temp(i,kk)-soil%watr(i,kk),0.)) / & - ! (0.5_r_2*((soil%ssat_vec(i,k)-soil%watr(i,k)) + & - ! (soil%ssat_vec(i,kk)-soil%watr(i,kk)))) - ! - ! s1(i) = min(max(s1(i),0.01_r_2),1._r_2) - ! s2(i) = soil%hyds_vec(i,k)*s1(i)**(2._r_2*soil%bch_vec(i,k)+2._r_2) - ! - ! ssnow%hk(i,k) = s1(i)*s2(i) - ! ssnow%dhkdw(i,k) = (2._r_2*soil%bch_vec(i,k)+3._r_2)*s2(i)*& - ! 0.5_r_2/(soil%ssat_vec(i,k)-soil%watr(i,k)) - ! if (.not.gw_params%ssgw_ice_switch) then - ! ssnow%hk(i,k) = ssnow%hk(i,k)*& - ! (1.0 - 0.5_r_2*(ssnow%fracice(i,k)+ssnow%fracice(i,kk))) - ! ssnow%dhkdw(i,k) = ssnow%dhkdw(i,k)*& - ! (1.0 - 0.5_r_2*(ssnow%fracice(i,k)+ssnow%fracice(i,kk))) - ! end if - ! end do - ! end do - ! - ! liq_ratio(:) = 1.0 - ! - ! k = ms - ! do i=1,mp - ! - ! if (gw_params%ssgw_ice_switch) then - ! liq_ratio(i) =min(1.,max(0.,wb_temp(i,k)/max(ssnow%wb(i,k),1e-6) ) ) - ! end if - ! - ! s1(i) = 0.5_r_2*(max(wb_temp(i,k)-soil%watr(i,k),0.) + & - ! max(liq_ratio(i)*ssnow%GWwb(i)-soil%GWwatr(i),0.)) / & - ! (0.5_r_2*(soil%ssat_vec(i,k)-soil%watr(i,k) +& - ! soil%GWssat_vec(i)-soil%GWwatr(i))) - ! - ! s1(i) = min(max(s1(i),0.01_r_2),1._r_2) - ! s2(i) = soil%hyds_vec(i,k)*s1(i)**(2._r_2*soil%bch_vec(i,k)+2._r_2) - ! - ! ssnow%hk(i,k) = s1(i)*s2(i) - ! ssnow%dhkdw(i,k) = (2._r_2*soil%bch_vec(i,k)+3._r_2)*& - ! s2(i)*0.5_r_2/(soil%ssat_vec(i,k)-soil%watr(i,k)) - ! if (.not.gw_params%ssgw_ice_switch) then - ! ssnow%hk(i,k) = (1.-ssnow%fracice(i,k))*ssnow%hk(i,k) - ! ssnow%dhkdw(i,k) = (1.-ssnow%fracice(i,k))*ssnow%dhkdw(i,k) - ! endif - ! end do - ! - ! do k=1,ms - ! do i=1,mp - ! s_mid(i) = (ssnow%wb(i,k)-soil%watr(i,k))/& !+dri*ssnow%wbice(:,k) - ! (soil%ssat_vec(i,k)-soil%watr(i,k)) - ! - ! s_mid(i) = min(max(s_mid(i),0.001_r_2),1._r_2) - ! - ! ssnow%smp(i,k) = -soil%sucs_vec(i,k)*s_mid(i)**(-soil%bch_vec(i,k)) - ! - ! ssnow%smp(i,k) = max(min(ssnow%smp(i,k),-soil%sucs_vec(i,k)),sucmin) - ! - ! ssnow%dsmpdw(i,k) = -soil%bch_vec(i,k)*ssnow%smp(i,k)/& - ! (max(s_mid(i)*(soil%ssat_vec(i,k)-soil%watr(i,k)),0.001_r_2)) - ! end do - ! end do - ! - ! do i=1,mp - ! !Aquifer properties - ! s_mid(i) = (ssnow%GWwb(i)*liq_ratio(i)-soil%GWwatr(i))/& - ! (soil%GWssat_vec(i)-soil%GWwatr(i)) - ! s_mid(i) = min(max(s_mid(i),0.001_r_2),1._r_2) - ! s2(i) = soil%GWhyds_vec(i)*s_mid(i)**(2._r_2*soil%GWbch_vec(i)+2._r_2) - ! - ! ssnow%GWhk(i) =s_mid(i)*s2(i) - ! - ! ssnow%GWdhkdw(i) = (2._r_2*soil%GWbch_vec(i)+3._r_2)*& - ! s2(i)*0.5_r_2/(soil%GWssat_vec(i)-soil%GWwatr(i)) - ! - ! if (.not.gw_params%ssgw_ice_switch) then - ! ssnow%GWhk(i) = (1.-ssnow%fracice(i,ms)) * ssnow%GWhk(i) - ! ssnow%GWdhkdw(i) = (1.-ssnow%fracice(i,ms)) * ssnow%GWdhkdw(i) - ! endif - ! - ! s_mid(i) = (ssnow%GWwb(i)-soil%GWwatr(i))/(soil%GWssat_vec(i)-soil%GWwatr(i)) - ! s_mid(i) = min(max(s_mid(i),0.001_r_2),1._r_2) - ! - ! ssnow%GWsmp(i) = -soil%GWsucs_vec(i)*s_mid(i)**(-soil%GWbch_vec(i)) - ! ssnow%GWsmp(i) = max(min(ssnow%GWsmp(i),-soil%GWsucs_vec(i)),sucmin) - ! ssnow%GWdsmpdw(i) = -soil%GWbch_vec(i)*ssnow%GWsmp(i)/& - ! (s_mid(i)*(soil%GWssat_vec(i)-soil%GWwatr(i))) - ! end do - ! - !END SUBROUTINE calc_soil_hydraulic_props - SUBROUTINE calc_soil_hydraulic_props(ssnow,soil,veg) + !* Calculate soil hydraulic conductivity and dhk/dw + USE cable_common_module TYPE(soil_parameter_type), INTENT(INOUT) :: soil TYPE(soil_snow_type) , INTENT(INOUT) :: ssnow @@ -1532,31 +1547,72 @@ SUBROUTINE calc_soil_hydraulic_props(ssnow,soil,veg) REAL(r_2), DIMENSION(mp,ms+1) :: hk_ice_factor !soil matric potential, hydraulic conductivity, and derivatives of each with respect to water (calculated using total (not liquid)) - - DO k=1,ms - DO i=1,mp - ssnow%icefrac(i,k) = ssnow%wbice(i,k)/(MAX(ssnow%wb(i,k),0.01_r_2)) - ssnow%fracice(i,k) = (EXP(-gw_params%IceAlpha*(1._r_2-ssnow%icefrac(i,k)))& - -EXP(-gw_params%IceAlpha))/(1._r_2-EXP(-gw_params%IceAlpha)) - END DO - END DO + ! __ MMY@23Apr2023 need to test, since itself cannot provide all hysteresis parameters and become redundant ____ + if (gw_params%BC_hysteresis) then + !swc_smp_dsmpdw => brook_corey_hysteresis_swc_smp + ssnow%sucs_hys(:,:) = ssnow%hys_fac(:,:)*soil%sucs_vec(:,:) + elseif (gw_params%HC_SWC) then + !swc_smp_dsmpdw => hutson_cass_swc_smp + ssnow%sucs_hys(:,:) = soil%sucs_vec(:,:) + else + !swc_smp_dsmpdw => brook_corey_swc_smp + ssnow%sucs_hys(:,:) = soil%sucs_vec(:,:) + end if + + ! ___ MMY COMMENT: for Hutson Cass SWC potential ___ + do k=1,ms + do i=1,mp + soil%wbc_vec(i,k) = 2.0*soil%bch_vec(i,k)*soil%ssat_vec(i,k)/& + (1.0+2.0*soil%bch_vec(i,k)) + soil%smpc_vec(i,k) = -soil%sucs_vec(i,k) * & + (2.0*soil%bch_vec(i,k)/& + ((1.0+2.0*soil%bch_vec(i,k))))**(-soil%bch_vec(i,k)) + end do + end do + do i=1,mp + soil%wbc_GW(i) = 2.0*soil%GWbch_vec(i)*soil%GWssat_vec(i)/& + (1.0+2.0*soil%GWbch_vec(i)) + soil%smpc_GW(i) = -soil%GWsucs_vec(i) * & + (2.0*soil%GWbch_vec(i)/& + ((1.0+2.0*soil%GWbch_vec(i))))**(-soil%GWbch_vec(i)) + end do + ! ___________________________________________________ + + do k=1,ms + do i=1,mp + ! _____ MMY it doesn't match to icef in SUBROUTINE ovrlndflx ______ + !ssnow%icefrac(i,k) = ssnow%wbice(i,k)/(max(ssnow%wb(i,k),0.01_r_2)) ! MMY + ! ________________ MMY to unify the calculation ____________________ + ssnow%icefrac(i,k) = max(0._r_2, min(1._r_2, & + ssnow%wmice(i,k) / max(ssnow%wmtot(i,k), 0.01_r_2)) ) + ! __________________________________________________________________ + ssnow%fracice(i,k) = (exp(-gw_params%IceAlpha*(1._r_2-ssnow%icefrac(i,k)))& + -exp(-gw_params%IceAlpha))/(1._r_2-exp(-gw_params%IceAlpha)) + end do + end do ssnow%fracice(:,:) = MAX( MIN( ssnow%fracice, 1._r_2), 0._r_2) IF (gw_params%ssgw_ice_switch) THEN wb_temp(:,1:ms) = ssnow%wbliq(:,:) wb_temp(:,ms+1) = ssnow%GWwb(:) - smp_cor = 8.0 DO k=1,ms kk = MIN(k+1,ms) DO i=1,mp IF (soil%isoilm(i) .EQ. 9) THEN - hk_ice_factor(i,k) = 10.0**(-gw_params%ice_impedence) +!$ hk_ice_factor(i,k) = 10.0**(-gw_params%ice_impedence) ! replaced as per MMY -- rk4417 ! MMY@23Apr2023 I don't know why the sign is changed, need to test its impact ... + !hk_ice_factor(i,k) = (1.0-soil%ssat_vec(i,k))**(gw_params%ice_impedence) + hk_ice_factor(i,k) = 10.0**(gw_params%ice_impedence) + ELSE - hk_ice_factor(i,k) = 10.0**(-gw_params%ice_impedence* & - ( 0.5*(ssnow%wbice(i,k)/MAX(1.0e-8,ssnow%wb(i,k)) + & - ssnow%wbice(i,kk)/MAX(1.0e-8,ssnow%wb(i,kk))) ) & - ) +!$ hk_ice_factor(i,k) = 10.0**(-gw_params%ice_impedence* & ! replaced as per MMY -- rk4417 ! MMY@23Apr2023 keep the commented lines as a reminder for future check +!$ ( 0.5*(ssnow%wbice(i,k)/MAX(1.0e-8,ssnow%wb(i,k)) + & +!$ ssnow%wbice(i,kk)/MAX(1.0e-8,ssnow%wb(i,kk))) ) & +!$ ) + !hk_ice_factor(i,k) = sqrt((1.0-ssnow%wbice(i,k))**(gw_params%ice_impedence) *& + ! (1.0-ssnow%wbice(i,kk))**(gw_params%ice_impedence)) + hk_ice_factor(i,k) = min(10.0**(gw_params%ice_impedence*ssnow%wbice(i,k)/(soil%ssat_vec(i,k)-soil%watr(i,k))) ,& ! MMY@23Apr2023 I don't know why the eq is changed, need to test its impact ... + 10.0**(gw_params%ice_impedence*ssnow%wbice(i,kk)/(soil%ssat_vec(i,kk)-soil%watr(i,kk)))) END IF END DO END DO @@ -1564,7 +1620,6 @@ SUBROUTINE calc_soil_hydraulic_props(ssnow,soil,veg) ELSE wb_temp(:,1:ms) = ssnow%wb(:,:) wb_temp(:,ms+1) = ssnow%GWwb(:) - smp_cor = 0.0 DO k=1,ms kk = MIN(k+1,ms) DO i=1,mp @@ -1579,84 +1634,47 @@ SUBROUTINE calc_soil_hydraulic_props(ssnow,soil,veg) DO i=1,mp liq_ratio(i) =MIN(1.,MAX(0.,wb_temp(i,k)/MAX(ssnow%wb(i,k),1e-6) ) ) END DO - !aquifer ice - wb_temp(:,ms+1) = liq_ratio(:) * wb_temp(:,ms+1) - - !potential from soil water rention function - !defined as layer average - DO k=1,ms - DO i=1,mp - s_mid(i) = (wb_temp(i,k)-soil%watr(i,k))/& !+dri*ssnow%wbice(:,k) - (soil%ssat_vec(i,k)-soil%watr(i,k)) - - s_mid(i) = MIN(MAX(s_mid(i),0.001_r_2),1._r_2) - - ssnow%smp(i,k) = -soil%sucs_vec(i,k)*s_mid(i)**(-soil%bch_vec(i,k))*& - ((1._r_2 + smp_cor*ssnow%wbice(i,k))**2.0) - ssnow%smp(i,k) = MAX(MIN(ssnow%smp(i,k),-soil%sucs_vec(i,k)),sucmin) - - ssnow%dsmpdw(i,k) = -soil%bch_vec(i,k)*ssnow%smp(i,k)/& - (MAX(s_mid(i)*(soil%ssat_vec(i,k)-soil%watr(i,k)),0.001_r_2)) *& - ((1._r_2 + smp_cor*ssnow%wbice(i,k))**2.0) - END DO - END DO - - !Aquifer potential - DO i=1,mp - s_mid(i) = (wb_temp(i,ms+1)-soil%GWwatr(i))/& - (soil%GWssat_vec(i)-soil%GWwatr(i)) - s_mid(i) = MIN(MAX(s_mid(i),0.001_r_2),1._r_2) - s2(i) = soil%GWhyds_vec(i)*s_mid(i)**(2._r_2*soil%GWbch_vec(i)+2._r_2) - - !ssnow%GWhk(i) =s_mid(i)*s2(i) * hk_ice_factor(i,ms+1) - !ssnow%GWdhkdw(i) = (2._r_2*soil%GWbch_vec(i)+3._r_2)*& - ! s2(i)*0.5_r_2/(soil%GWssat_vec(i)-soil%GWwatr(i)) *& - ! hk_ice_factor(i,ms+1) - - ssnow%GWhk(i) = soil%GWhyds_vec(i) * hk_ice_factor(i,ms+1)*& - EXP(-ssnow%wtd(i)/1000._r_2/& - (1.0/(120*(soil%drain_dens(i)+1.0e-3)))) - !d(h)*Sy=dW - ssnow%GWdhkdw(i) = ssnow%GWhk(i)/(soil%GWssat_vec(i)-soil%GWwatr(i))*& - (0.001/(120*(soil%drain_dens(i)+1.0e-3))) + !aquifer ice ! MMY should be aquifer liq + wb_temp(:,ms+1) = liq_ratio(:) * wb_temp(:,ms+1) + ! MMY for ssgw_ice_switch true, wb_temp(:,ms+1) = ssnow%GWwb(:) * wb_temp(:,ms)/max(ssnow%wb(:,ms)) + ! MMY for ssgw_ice_switch false, wb_temp(:,ms+1) = ssnow%GWwb(:) - s_mid(i) = (wb_temp(i,ms+1)-soil%GWwatr(i))/(soil%GWssat_vec(i)-soil%GWwatr(i)) - s_mid(i) = MIN(MAX(s_mid(i),0.001_r_2),1._r_2) + !soil potential (head) calculations can use brooks-corey + !or hutson-cass SWC - ssnow%GWsmp(i) = -soil%GWsucs_vec(i)*s_mid(i)**(-soil%GWbch_vec(i)) - ssnow%GWsmp(i) = MAX(MIN(ssnow%GWsmp(i),-soil%GWsucs_vec(i)),sucmin) - ssnow%GWdsmpdw(i) = -soil%GWbch_vec(i)*ssnow%GWsmp(i)/& - (s_mid(i)*(soil%GWssat_vec(i)-soil%GWwatr(i))) - END DO + !call swc_smp_dsmpdw(soil,ssnow) + if (gw_params%BC_hysteresis) then + call brook_corey_hysteresis_swc_smp(soil,ssnow) + elseif (gw_params%HC_SWC) then + call hutson_cass_swc_smp(soil,ssnow) + else + call brook_corey_swc_smp(soil,ssnow) + end if !hydraulic conductivity !Interfacial so uses layer i and i+1 - DO k=1,ms - kk=MIN(ms+1,k+1) - DO i=1,mp - - IF (k .LT. ms) THEN - s1(i) = 0.5_r_2*((wb_temp(i,k)-soil%watr(i,k)) + & - (wb_temp(i,kk)-soil%watr(i,kk))) / & - (0.5_r_2*((soil%ssat_vec(i,k)-soil%watr(i,k)) + & - (soil%ssat_vec(i,kk)-soil%watr(i,kk)))) - ELSE - s1(i) = 0.5_r_2*((wb_temp(i,k)-soil%watr(i,k)) + & - (wb_temp(i,kk)-soil%GWwatr(i))) / & - (0.5_r_2*((soil%ssat_vec(i,k)-soil%watr(i,k)) + & - (soil%GWssat_vec(i)-soil%GWwatr(i)))) - END IF - s1(i) = MIN(MAX(s1(i),0.01_r_2),1._r_2) - s2(i) = soil%hyds_vec(i,k)*s1(i)**(2._r_2*soil%bch_vec(i,k)+2._r_2) - + do k=1,ms-1 + ! kk=min(ms+1,k+1) ! MMY + kk= k+1 ! MMY + do i=1,mp + ! ____________________ MMY ______________________ + s1(i) = 0.5_r_2*((wb_temp(i,k)-soil%watr(i,k)) + & + (wb_temp(i,kk)-soil%watr(i,kk))) / & + (0.5_r_2*((soil%ssat_vec(i,k)-soil%watr(i,k)) + & + (soil%ssat_vec(i,kk)-soil%watr(i,kk)))) + s1(i) = min(max(s1(i),0.01_r_2),1._r_2) + s2(i) = soil%hyds_vec(i,k)*s1(i)**(2._r_2*soil%bch_vec(i,k)+2._r_2) + ! _________________________________________________ ssnow%hk(i,k) = s1(i)*s2(i)*hk_ice_factor(i,k) ssnow%dhkdw(i,k) = (2._r_2*soil%bch_vec(i,k)+3._r_2)*s2(i)*& - 0.5_r_2/(soil%ssat_vec(i,k)-soil%watr(i,k))*& - hk_ice_factor(i,k) - END DO - END DO + 0.5_r_2/(soil%ssat_vec(i,k)-soil%watr(i,k))*& + hk_ice_factor(i,k) + ! MMY Note that the dhkdw equation doesn't exactly follow the finite difference + end do + end do + !conductivity between soil column and aquifer k = ms kk = ms+1 @@ -1674,13 +1692,23 @@ SUBROUTINE calc_soil_hydraulic_props(ssnow,soil,veg) ssnow%dhkdw(i,k) = (2._r_2*soil%bch_vec(i,k)+3._r_2)*& hk_ice_factor(i,k)*& s2(i)*0.5_r_2/(soil%ssat_vec(i,k)-soil%watr(i,k)) + !Aquifer + + s2(i) = soil%GWhyds_vec(i)*s1(i)**(2._r_2*soil%GWbch_vec(i)+2._r_2) + ssnow%GWhk(i) =s1(i)*s2(i) * hk_ice_factor(i,ms+1) + ssnow%GWdhkdw(i) = (2._r_2*soil%GWbch_vec(i)+3._r_2)*& + s2(i)*0.5_r_2/(soil%GWssat_vec(i)-soil%GWwatr(i)) *& + hk_ice_factor(i,ms+1) END DO END SUBROUTINE calc_soil_hydraulic_props + SUBROUTINE aquifer_recharge(dt,ssnow,soil,veg) + !* Calculate the water movement between the bottom soil layer and + ! groundwater aquifer, following the equation (21) in + ! [Zeng and Decker 2009](https://doi.org/10.1175/2008JHM1011.1) - SUBROUTINE aquifer_recharge(dt,ssnow,soil,veg,zaq,zmm,dzmm) USE cable_common_module IMPLICIT NONE @@ -1688,31 +1716,65 @@ SUBROUTINE aquifer_recharge(dt,ssnow,soil,veg,zaq,zmm,dzmm) TYPE (soil_snow_type), INTENT(INOUT) :: ssnow ! soil and snow variables TYPE (soil_parameter_type), INTENT(INOUT) :: soil ! soil parameters TYPE (veg_parameter_type), INTENT(INOUT) :: veg - REAL(r_2), DIMENSION(:), INTENT(in) :: zaq - REAL(r_2), DIMENSION(:), INTENT(in) :: zmm,dzmm + REAL(r_2), dimension(mp) :: zaq + REAL(r_2), dimension(mp,ms) :: zmm,csum_dzmm + integer :: i,k + + !> Doing the recharge outside of the soln of Richards Equation makes it easier to track total recharge amount. + + csum_dzmm(:,1) = m2mm*soil%zse_vec(:,1) + do k=2,ms + csum_dzmm(:,k) = csum_dzmm(:,k-1) + m2mm*soil%zse_vec(:,k) + end do - INTEGER :: i !Doing the recharge outside of the soln of Richards Equation makes it easier to track total recharge amount. !Add to ssnow at some point - DO i=1,mp - IF ((ssnow%wtd(i) .LE. SUM(dzmm,dim=1)) .OR. & - (veg%iveg(i) .GE. 16) .OR. & - (soil%isoilm(i) .EQ. 9)) THEN - - ssnow%Qrecharge(i) = 0._r_2 - ELSE - ssnow%Qrecharge(i) = -0.5*(ssnow%hk(i,ms)*ssnow%GWhk(i))*& - ((-ssnow%smp(i,ms)) -& - (-ssnow%zq(i,ms))) / & - (ssnow%wtd(i) - & - (zmm(ms)-0.5*soil%zse_vec(i,ms)*1000.0)) - END IF - END DO + select case (gw_params%aquifer_recharge_function) + !* if water table depth is above the bottom soil coloumn, land cover type is lake + ! or soil type is permanent ice, there is no water movement between bottom soil + ! layer and groundwater aquifer. Otherwise, the water movement will be calcuated + ! as the equation (21) in [Zeng and Decker 2009](https://doi.org/10.1175/2008JHM1011.1) + case(0) + ssnow%Qrecharge(:) = 0._r_2 + case(1) + do i=1,mp + if ((ssnow%wtd(i) .le. csum_dzmm(i,ms-1)) .or. & + (veg%iveg(i) .ge. 16) .or. & + (soil%isoilm(i) .eq. 9)) then + + ssnow%Qrecharge(i) = 0._r_2 + else + ssnow%Qrecharge(i) = -0.5*(ssnow%hk(i,ms)+ssnow%GWhk(i))*& + ((-ssnow%smp(i,ms)) -& + (-ssnow%zq(i,ms))) / & + (ssnow%wtd(i) - & + (csum_dzmm(i,ms)-0.5*soil%zse_vec(i,ms)*m2mm)) + end if + end do + + case default + do i=1,mp + if ((ssnow%wtd(i) .le. csum_dzmm(i,ms)) .or. & + (veg%iveg(i) .ge. 16) .or. & + (soil%isoilm(i) .eq. 9)) then + + ssnow%Qrecharge(i) = 0._r_2 + else + ssnow%Qrecharge(i) = -(ssnow%hk(i,ms)+ssnow%GWhk(i))*& + ((ssnow%GWsmp(i)-ssnow%smp(i,ms)) -& + (ssnow%GWzq(i)-ssnow%zq(i,ms))) / & + (m2mm*(soil%GWdz(i)+soil%zse_vec(i,ms))) + end if + end do + end select END SUBROUTINE aquifer_recharge - SUBROUTINE subsurface_drainage(ssnow,soil,veg,dzmm) + SUBROUTINE subsurface_drainage(ssnow,soil,veg) + !* Calculate horizontal drainage based on the equation (18) in + ! [Decker, 2015](http://doi.wiley.com/10.1002/2015MS000507) + USE cable_common_module IMPLICIT NONE @@ -1720,11 +1782,9 @@ SUBROUTINE subsurface_drainage(ssnow,soil,veg,dzmm) TYPE (soil_snow_type), INTENT(INOUT) :: ssnow ! soil and snow variables TYPE (soil_parameter_type), INTENT(INOUT) :: soil ! soil parameters TYPE (veg_parameter_type), INTENT(INOUT) :: veg - REAL(r_2), DIMENSION(:), INTENT(in) :: dzmm REAL(r_2), DIMENSION(mp) :: sm_tot,&!sum var - ice_factor_tot !avg ice factor - REAL(r_2), DIMENSION(mp,ms) :: ice_factor !ice limitation on - !subsurface drainage + ice_factor_tot !avg ice factor + REAL(r_2), dimension(mp,ms) :: dzmm, ice_factor !ice limitation on subsurface drainage INTEGER, DIMENSION(mp) :: k_drain INTEGER :: i,k @@ -1733,126 +1793,98 @@ SUBROUTINE subsurface_drainage(ssnow,soil,veg,dzmm) Efold_mod(:) = 1.0 !Efold_mod(1:4) = (/0.2,0.2,0.2,0.2/) !Efold_mod(9) = 0.25 - DO i=1,mp - - !Note: future revision will have interaction with river here. nned to - !work on router and add river type cells - ssnow%qhz(i) = MIN(MAX(soil%slope(i),0.000001),0.9)*& - gw_params%MaxHorzDrainRate* & - EXP(-ssnow%wtd(i)/1000._r_2/& - (1.0/(60.0*gw_params%EfoldHorzDrainRate*& - (soil%drain_dens(i)+1.0e-3))*Efold_mod(veg%iveg(i)))) - - - IF (gw_params%subsurface_sat_drainage) THEN - !drain from sat layers - k_drain(i) = ms+1 - DO k=ms,2,-1 - IF (ssnow%wtd(i) .LE. SUM(dzmm(1:k),dim=1)) THEN - k_drain(i) = k + 1 - END IF - END DO - k_drain(i) = MAX(k_drain(i),3) - ELSE - k_drain(i) = 2 - END IF - - END DO - - IF (gw_params%ssgw_ice_switch) THEN - DO k=1,ms - DO i=1,mp - ice_factor(i,k) = (10.0**(-gw_params%ice_impedence*ssnow%wbice(i,k)/& - (ssnow%wb(i,k)+1.0e-12))) - END DO - END DO - ELSE - DO k=1,ms - DO i=1,mp - ice_factor(i,k) = (1._r_2-ssnow%fracice(i,k)) - END DO - END DO - - END IF - DO i=1,mp - - ice_factor(i,:) = 0._r_2 - ice_factor_tot(i)= 0._r_2 - ssnow%qhlev(i,:) = 0._r_2 - sm_tot(i) = 0._r_2 - - END DO - - DO i=1,mp - IF (gw_params%subsurface_sat_drainage) THEN - sm_tot(i) = MAX((ssnow%GWwb(i) - soil%watr(i,ms)),0._r_2)*& - ice_factor(i,ms) + dzmm(:,:) = m2mm*soil%zse_vec(:,:) - ice_factor_tot(i) = (SUM(ice_factor(i,k_drain(i):ms)*& - soil%zse_vec(i,k_drain(i):ms),dim=1)+& - ice_factor(i,ms)*soil%GWdz(i))/& - (SUM(soil%zse_vec(i,:),dim=1)+& - soil%GWdz(i)) + do i=1,mp - DO k=k_drain(i),ms - sm_tot(i) = sm_tot(i) + MAX(ssnow%wbliq(i,k)-soil%watr(i,k),0._r_2)*& - ice_factor(i,k) - END DO - - ssnow%qhz(i) = ssnow%qhz(i)*ice_factor_tot(i) !reduced due to ice - - IF (sm_tot(i) .GE. 1.0e-12) THEN - DO k=k_drain(i),ms - ssnow%qhlev(i,k) = ssnow%qhz(i)*ice_factor(i,k)*& - MAX(0.0,ssnow%wbliq(i,k)-soil%watr(i,k))/sm_tot(i) - END DO - ssnow%qhlev(i,ms+1) = MAX((ssnow%GWwb(i) - soil%watr(i,ms)),0.0)*& - ice_factor(i,ms)*ssnow%qhz(i)/sm_tot(i) - ENDIF - - ELSE !second option - IF (k_drain(i) .LE. ms) THEN - DO k=k_drain(i),ms - sm_tot(i) = sm_tot(i) + MAX(ssnow%wbliq(i,k)-soil%watr(i,k),0._r_2)*& - ice_factor(i,k) - END DO - ice_factor_tot(i) = (SUM(ice_factor(i,k_drain(i):ms)*& - soil%zse_vec(i,k_drain(i):ms),dim=1))/& - (SUM(soil%zse_vec(i,:),dim=1)) - - ssnow%qhz(i) = ssnow%qhz(i)*ice_factor_tot(i) !reduced due to ice - IF (sm_tot(i) .GE. 1.0e-12) THEN - DO k=k_drain(i),ms - ssnow%qhlev(i,k) = (ssnow%qhz(i)*ice_factor(i,k)/sm_tot(i))*& - MAX(0.0,ssnow%wbliq(i,k)-soil%watr(i,k)) - END DO - ENDIF - - ELSE - ice_factor_tot(i) = ice_factor(i,ms) - ssnow%qhz(i) = ssnow%qhz(i)*ice_factor_tot(i) - ssnow%qhlev(i,ms+1) = ssnow%qhz(i)*MAX(ssnow%GWwb(i)-soil%watr(i,ms),0.0) + !Note: future revision will have interaction with river here. nned to + !work on router and add river type cells - END IF + !* Calulate the total subsurface runoff by following the equation (18) in + ! [Decker, 2015](http://doi.wiley.com/10.1002/2015MS000507) + ssnow%qhz(i) = soil%slope(i)*soil%qhz_max(i)*& + exp( -mm2m*ssnow%wtd(i)/ soil%qhz_efold(i) ) + ! MMY@23Apr2023, defined in derived_parameters: + ! soil%qhz_max(:) = real(gw_params%MaxHorzDrainRate,r_2) + ! soil%qhz_efold(:) = real(gw_params%EfoldHorzDrainScale,r_2)*soil%drain_dens(:)+real(gw_params%EfoldHorzDrainRate,r_2) + ! Note that, this equation is different to the one in the trunk, I have no idea about why it is changed + + !* calculate how many layers are below water table depth and can generate subsurface runoff + !drain from sat layers + k_drain(i) = ms+1 + do k=ms,2,-1 + if (ssnow%wtd(i) .le. sum(dzmm(i,1:k),dim=1)) then + k_drain(i) = k + 1 + end if + end do + k_drain(i) = max(k_drain(i),3) + + end do + + if (gw_params%ssgw_ice_switch) then + do k=1,ms + do i=1,mp + ice_factor(i,k) = (1.0-ssnow%wbice(i,k))**gw_params%ice_impedence + ! MMY@23Apr2023 in trunk: + ! ice_factor(i,k) = (10.0**(-gw_params%ice_impedence*ssnow%wbice(i,k)/(ssnow%wb(i,k)+1.0e-12))) + end do + end do + else + do k=1,ms + do i=1,mp + ice_factor(i,k) = (1._r_2-ssnow%fracice(i,k)) + end do + end do + + end if + + ssnow%qhlev(:,:) = 0._r_2 + sm_tot(:) = 0._r_2 + + do i=1,mp + + if (gw_params%subsurface_sat_drainage) then ! MMY@23Apr2023 I think subsurface_sat_drainage should be the default setting + ! MMY it doesn't make sense since sm_tot == 0. + ! sm_tot(i) = sum(ssnow%qhlev(i,k_drain(i):ms+1),dim=1) ! MMY + ! ______ MMY find this calculation from version : cable-2.2.3-pore-scale-model _______________ + sm_tot(i) = max(ssnow%GWwb(i)-soil%GWwatr(i),0._r_2) + do k=k_drain(i),ms + sm_tot(i) = sm_tot(i) + max(ssnow%wbliq(i,k)-soil%watr(i,k),0._r_2)!*dzmm(k) + end do + ! ____________________________________________________________________________________________ + if (sm_tot(i) .lt. 1.0e-8) then + sm_tot(i) = 1._r_2 + end if + end if + end do + + + do i=1,mp + + ssnow%qhlev(i,ms+1) = max((ssnow%GWwb(i) - soil%GWwatr(i)),0._r_2)*& + ice_factor(i,ms)*ssnow%qhz(i)/sm_tot(i) + + do k=k_drain(i),ms + ssnow%qhlev(i,k) = max(ssnow%wbliq(i,k)-ssnow%watr_hys(i,k),0._r_2)*& + ice_factor(i,k)*ssnow%qhz(i)/sm_tot(i) + end do - END IF !incase every layer is frozen very dry - ssnow%qhz(i) = SUM(ssnow%qhlev(i,:),dim=1) + ssnow%qhz(i) = sum(ssnow%qhlev(i,:),dim=1) !Keep "lakes" saturated forcing qhz = 0. runoff only from lakes !overflowing - IF (soil%isoilm(i) .EQ. 9 .OR. veg%iveg(i) .GE. 16) THEN + if (soil%isoilm(i) .eq. 9 .or. veg%iveg(i) .ge. 16) then ssnow%qhz(i) = 0._r_2 ssnow%qhlev(i,:) = 0._r_2 - END IF + end if - END DO + end do END SUBROUTINE subsurface_drainage - SUBROUTINE saturated_fraction(ssnow,soil,veg) TYPE (soil_snow_type), INTENT(INOUT) :: ssnow ! soil and snow variables TYPE (soil_parameter_type), INTENT(IN) :: soil ! soil parameters @@ -1875,8 +1907,8 @@ SUBROUTINE saturated_fraction(ssnow,soil,veg) S(:) = 0._r_2 DO k=1,gw_params%level_for_satfrac S(:) = S(:) + MAX(0.01,MIN(1.0, & - (ssnow%wb(:,k)-ssnow%wbice(:,k)-soil%watr(:,k))/& - MAX(0.001,soil%ssat_vec(:,k)-soil%watr(:,k)) ) )*soil%zse_vec(:,k) + (ssnow%wb(:,k)-den_rat*ssnow%wbice(:,k)-ssnow%watr_hys(:,k))/& + max(0.001,ssnow%ssat_hys(:,k)-soil%watr(:,k)-den_rat*ssnow%wbice(:,k)) ) )*soil%zse_vec(:,k) END DO S(:) = S(:)/SUM(soil%zse(1:gw_params%level_for_satfrac),dim=1) !srf frozen fraction. should be based on topography @@ -1888,7 +1920,7 @@ SUBROUTINE saturated_fraction(ssnow,soil,veg) 1e-5),10000._r_2)) ! ensure some variability ssnow%satfrac(i) = MAX(0._r_2,MIN(0.99_r_2,& !note UM wants std03, and erf is not included then - 1._r_2 - my_erf( slopeSTDmm / SQRT(2.0* S(i)) ) ) ) + 1._r_2 - my_erf( slopeSTDmm * sqrt(2.0* S(i)) ) ) ) ! MMY change / to *@24 Sep 2021 ELSEIF (veg%iveg(i) .LT. 16) THEN ssnow%satfrac(i) = 0._r_2 ELSE @@ -1906,9 +1938,12 @@ SUBROUTINE pore_space_relative_humidity(ssnow,soil,veg) REAL(r_2), DIMENSION(mp) :: unsat_wb,unsat_smp - ! Need a matching array of NEGATIVE ones for the intrinsic sign func below - REAL(r_2), DIMENSION(mp,ms) :: minus_ones - + ! Need a matching array of ones to use in Mark's call to the intrinsic + ! sign func below + ! mgk, 24/07/2018 +!$ REAL(r_2), DIMENSION(mp,ms) :: ones + REAL(r_2), DIMENSION(mp,ms) :: minus_ones ! rk4417 as per MMY + INTEGER :: i !if gw_model = true @@ -1918,24 +1953,26 @@ SUBROUTINE pore_space_relative_humidity(ssnow,soil,veg) !cable_um_init_subrs.F90 or cable_parameters: !ssat_vec(i,:) = ssat(i) !so ssat_vec can be used although soilsnow uses ssat - - minus_ones = -1.0_r_2 + + ! mgk, 24/07/2018 - fix to compile + minus_ones = -1. DO i=1,mp IF (veg%iveg(i) .LT. 16 .AND. soil%isoilm(i) .NE. 9 .AND. & ssnow%snowd(i) .LE. 1e-8 ) THEN - unsat_wb(i) = (ssnow%wb(i,1) - soil%ssat_vec(i,1)*& + unsat_wb(i) = (ssnow%wb(i,1) - ssnow%ssat_hys(i,1)*& MIN(0.95,MAX(0.0,ssnow%satfrac(i))))/(1.0 - MIN(0.95,MAX(0.0,ssnow%satfrac(i)))) - - unsat_wb(i) = MAX(soil%watr(i,1)+1e-2, MIN(soil%ssat_vec(i,1), unsat_wb(i) ) ) - + ! MMY ??? I'm not sure whether we should take wbice*den_rat into consideration here, + ! ??? so I didn't modify. + unsat_wb(i) = max(ssnow%watr_hys(i,1)+1e-2, min(ssnow%ssat_hys(i,1), unsat_wb(i) ) ) + !unsat_smp(i) = sign(soil%sucs_vec(i,1),-1.0) * min(1.0, & ! (max(0.001, (unsat_wb(i)-soil%watr(i,1))/(soil%ssat_vec(i,1)-& ! soil%watr(i,1)) ) )** (-soil%bch_vec(i,1)) ) ! mgk, 24/07/2018 - fix to compile - unsat_smp(i) = SIGN(soil%sucs_vec(i,1),minus_ones(i,1)) * MIN(1.0, & + unsat_smp(i) = SIGN(soil%sucs_vec(i,1),minus_ones(i,1)) * MIN(1.0, & (MAX(0.001, (unsat_wb(i)-soil%watr(i,1))/(soil%ssat_vec(i,1)-& soil%watr(i,1)) ) )** (-soil%bch_vec(i,1)) ) @@ -1963,9 +2000,9 @@ SUBROUTINE sli_hydrology(dels,ssnow,soil,veg,canopy) LOGICAL, SAVE :: sli_call = .TRUE. - REAL(r_2), DIMENSION(ms) :: dzmm - REAL(r_2), DIMENSION(mp) :: zmm - REAL(r_2), DIMENSION(mp) :: zaq + ssnow%sucs_hys = soil%sucs_vec + ssnow%ssat_hys = soil%ssat_vec + ssnow%watr_hys = soil%watr CALL iterative_wtd (ssnow, soil, veg, cable_user%test_new_gw) @@ -1973,21 +2010,18 @@ SUBROUTINE sli_hydrology(dels,ssnow,soil,veg,canopy) CALL ovrlndflx (dels, ssnow, soil, veg,canopy,sli_call ) - dzmm = REAL(soil%zse(:),r_2)*1000._r_2 - - CALL subsurface_drainage(ssnow,soil,veg,dzmm) - - zmm(:) = 1000._r_2*(SUM(REAL(soil%zse,r_2),dim=1)) - zaq(:) = zmm(:) + 0.5_r_2*soil%GWdz(:)*1000._r_2 - - CALL aquifer_recharge(dels,ssnow,soil,veg,zaq,zmm,zmm) - - + CALL subsurface_drainage(ssnow,soil,veg) + call aquifer_recharge(dels,ssnow,soil,veg) END SUBROUTINE sli_hydrology - +! MMY@23Apr2023 Please keep SUBROUTINE set_unsed_gw_vars to see whether can call it in future codes to normalize +! CABLE writing. Open to any suggestion. +!----------------------------------------------------------------------------------------- +! subroutine set_unsed_gw_vars checked by rk4417. This subroutine is not called anywhere. +!----------------------------------------------------------------------------------------- + SUBROUTINE set_unsed_gw_vars(ssnow,soil,canopy) TYPE(soil_snow_type), INTENT(INOUT) :: ssnow ! soil+snow variables TYPE(soil_parameter_type), INTENT(INOUT) :: soil ! soil parameters @@ -2031,4 +2065,499 @@ REAL(r_2) FUNCTION my_erf(x) END FUNCTION my_erf + subroutine brook_corey_swc_smp(soil,ssnow) + !* Using Brook_Corey equation to calculate soil matric potential + + type(soil_parameter_type), intent(inout) :: soil + type(soil_snow_type), intent(inout) :: ssnow + + real(r_2), dimension(mp,ms+1) :: wb_temp + real(r_2), dimension(mp) :: s_mid + integer :: i,k + + if (gw_params%ssgw_ice_switch) then + wb_temp(:,1:ms) = ssnow%wbliq(:,:) + wb_temp(:,ms+1) = ssnow%GWwb(:) + do i=1,mp + if (ssnow%wb(i,ms) .gt. 1.0e-8) then + wb_temp(i,ms+1) = ssnow%GWwb(i) * ssnow%wbliq(i,ms)/ssnow%wb(i,ms) + end if + end do + else + wb_temp(:,1:ms) = ssnow%wb(:,:) + wb_temp(:,ms+1) = ssnow%GWwb(:) + end if + !potential from soil water rention function + !defined as layer average + do k=1,ms + do i=1,mp + s_mid(i) = (wb_temp(i,k)-soil%watr(i,k))/& !+dri*ssnow%wbice(:,k) + (soil%ssat_vec(i,k)-soil%watr(i,k)) + + s_mid(i) = min(max(s_mid(i),0.01_r_2),1._r_2) + + ssnow%smp(i,k) = -soil%sucs_vec(i,k)*s_mid(i)**(-soil%bch_vec(i,k)) + + ssnow%smp(i,k) = max(min(ssnow%smp(i,k),-soil%sucs_vec(i,k)),sucmin) + + ssnow%dsmpdw(i,k) = -soil%bch_vec(i,k)*ssnow%smp(i,k)/& + (max(s_mid(i)*(wb_temp(i,k)-soil%watr(i,k)),0.01_r_2)) !MMY + ! MMY BUG in (max(s_mid(i)*(soil%ssat_vec(i,k)-soil%watr(i,k)),0.01_r_2)) + end do + end do + ! _____________________ MMY BUG it forgot to calculate the aquifer __________________ + !Aquifer potential + do i=1,mp + s_mid(i) = (wb_temp(i,ms+1)-soil%GWwatr(i))/(soil%GWssat_vec(i)-soil%GWwatr(i)) + s_mid(i) = min(max(s_mid(i),0.001_r_2),1._r_2) + + ssnow%GWsmp(i) = -soil%GWsucs_vec(i)*s_mid(i)**(-soil%GWbch_vec(i)) + ssnow%GWsmp(i) = max(min(ssnow%GWsmp(i),-soil%GWsucs_vec(i)),sucmin) + ssnow%GWdsmpdw(i) = -soil%GWbch_vec(i)*ssnow%GWsmp(i)/& + (max(s_mid(i)*(wb_temp(i,ms+1)-soil%GWwatr(i)),0.01_r_2)) !MMY + end do + ! ____________________________________________________________________________________ + end subroutine brook_corey_swc_smp + + ! MMY@13Mar2023 Please keep subroutine hutson_cass_swc_smp, test this subroutine when there is no problem + ! in the merged version. + subroutine hutson_cass_swc_smp(soil,ssnow) + + !* Using Hutson-CASS equation to calculate soil matric potential + + type(soil_parameter_type), intent(inout) :: soil + type(soil_snow_type), intent(inout) :: ssnow + + real(r_2), dimension(mp,ms+1) :: wb_temp + real(r_2), dimension(mp) :: s_mid + integer :: i,k + + do k=1,ms + do i=1,mp + soil%wbc_vec(i,k) = 2.0*soil%bch_vec(i,k)*soil%ssat_vec(i,k)/& + (1.0+2.0*soil%bch_vec(i,k)) + soil%smpc_vec(i,k) = -soil%sucs_vec(i,k) * & + (2.0*soil%bch_vec(i,k)/& + ((1.0+2.0*soil%bch_vec(i,k))))**(-soil%bch_vec(i,k)) + end do + end do + + do i=1,mp + soil%wbc_GW(i) = 2.0*soil%GWbch_vec(i)*soil%GWssat_vec(i)/& + (1.0+2.0*soil%GWbch_vec(i)) + soil%smpc_GW(i) = -soil%GWsucs_vec(i) * & + (2.0*soil%GWbch_vec(i)/& + ((1.0+2.0*soil%GWbch_vec(i))))**(-soil%GWbch_vec(i)) + end do + !potential from soil water rention function + !defined as layer average + do k=1,ms + do i=1,mp + s_mid(i) = (wb_temp(i,k)-soil%watr(i,k))/& !+dri*ssnow%wbice(:,k) + (soil%ssat_vec(i,k)-soil%watr(i,k)) + + s_mid(i) = min(max(s_mid(i),0.01_r_2),0.9999999_r_2) + + if (wb_temp(i,k) .lt. soil%wbc_vec(i,k)) then + ssnow%smp(i,k) = -soil%sucs_vec(i,k)*s_mid(i)**(-soil%bch_vec(i,k)) + + ssnow%smp(i,k) = max(min(ssnow%smp(i,k),-soil%sucs_vec(i,k)),sucmin) + + ssnow%dsmpdw(i,k) = -soil%bch_vec(i,k)*ssnow%smp(i,k)/& + (max(s_mid(i)*(wb_temp(i,k)-soil%watr(i,k)),0.001_r_2)) ! MMY + ! MMY BUG in (max(s_mid(i)*(soil%ssat_vec(i,k)-soil%watr(i,k)),0.001_r_2)) + else + !!! MMY BUG: in Hutson & Cass 1987 using 'wb/ssat' as independent factor + !!! MMY but here Mark uses effective saturation (wb-watr)/(ssat-watr) + !!! MMY in wet soil and wb/ssat in wet soil. This leads to a iscontinuity + !!! MMY in the water retention curve (smp-wb relationship), and causes + !!! MMY abs(smp) in wet soil is larger than in dry soil. I suggest to + !!! MMY use wb/ssat in HC_SWC + ssnow%smp(i,k) = -soil%sucs_vec(i,k)* sqrt(1._r_2 - wb_temp(i,k)/soil%ssat_vec(i,k))/& + (sqrt(1._r_2-soil%wbc_vec(i,k)/soil%ssat_vec(i,k))*& + ( (soil%wbc_vec(i,k)/soil%ssat_vec(i,k))**soil%bch_vec(i,k) )) + + ssnow%dsmpdw(i,k) = -ssnow%smp(i,k)/(soil%ssat_vec(i,k)*& + (1._r_2 - wb_temp(i,k)/soil%ssat_vec(i,k)) ) + end if + end do + end do + + !Aquifer potential + do i=1,mp + s_mid(i) = (wb_temp(i,ms+1)-soil%GWwatr(i))/(soil%GWssat_vec(i)-soil%GWwatr(i)) + s_mid(i) = min(max(s_mid(i),0.01_r_2),1._r_2) + if (wb_temp(i,ms+1) .lt. soil%wbc_GW(i)) then + ssnow%GWsmp(i) = -soil%GWsucs_vec(i)*s_mid(i)**(-soil%GWbch_vec(i)) + + ssnow%GWsmp(i) = max(min(ssnow%GWsmp(i),-soil%GWsucs_vec(i)),sucmin) + + ssnow%GWdsmpdw(i) = -soil%GWbch_vec(i)*ssnow%GWsmp(i)/& + (max(s_mid(i)*(soil%GWssat_vec(i)-soil%GWwatr(i)),0.001_r_2)) + else + ssnow%GWsmp(i) = -soil%GWsucs_vec(i)* sqrt(1._r_2 - wb_temp(i,ms+1)/soil%GWssat_vec(i))/& + (sqrt(1._r_2-soil%wbc_GW(i)/soil%GWssat_vec(i))*& + ( (soil%wbc_GW(i)/soil%GWssat_vec(i))**soil%GWbch_vec(i) )) + + ssnow%GWsmp(i) = max(min(ssnow%GWsmp(i),-soil%GWsucs_vec(i)),sucmin) + + ssnow%GWdsmpdw(i) = -ssnow%GWsmp(i)/(soil%GWssat_vec(i)*& + (1._r_2 - wb_temp(i,ms+1)/soil%GWssat_vec(i)) ) + end if + end do + end subroutine hutson_cass_swc_smp + + ! MMY@13Mar2023 Please keep subroutine brook_corey_hysteresis_swc_smp temporarily. + ! Hysteresis in water retention curve isn't commonly considered in + ! land surface models. I doubt whether this subrountine is necessary + ! for CABLE. But keep it at this moment, may delete it if this subroutine + ! is actually broken. + + subroutine brook_corey_hysteresis_swc_smp(soil,ssnow) + + !* Using Brook_Corey equation to calculate soil matric potential + ! but considering the hysteresis of water retention curve + + type(soil_parameter_type), intent(inout) :: soil + type(soil_snow_type), intent(inout) :: ssnow + + real(r_2), dimension(mp,ms) :: delta_wbliq + real(r_2), dimension(mp) :: s_mid + integer :: i,k,klev + real(r_2), dimension(mp,ms+1) :: wb_temp + real(r_2) :: tmp_smp + + if (gw_params%ssgw_ice_switch) then + wb_temp(:,1:ms) = ssnow%wbliq(:,:) + wb_temp(:,ms+1) = ssnow%GWwb(:) * ssnow%wbliq(:,ms)/soil%ssat_vec(:,ms) + else + wb_temp(:,1:ms) = ssnow%wb(:,:) + wb_temp(:,ms+1) = ssnow%GWwb(:) + end if + + !ensure sucs_hys is set + ssnow%sucs_hys = ssnow%hys_fac * soil%sucs_vec +! do k=1,ms +! do i=1,mp +! !on dry or wet? +! IF (ssnow%hys_fac(i,k) .gt. 0.75) then +! !on drying +! ssnow%watr_hys(i,k) = soil%watr(i,k) +! ssnow%hys_fac(i,k) = 1.0 !drying +! ssnow%sucs_hys(i,k) = ssnow%hys_fac(i,k)*soil%sucs_vec(i,k) +! if (ssnow%smp_hys(i,k) .lt. -ssnow%sucs_hys(i,k)) then +! tmp_smp = (min(0.99,-ssnow%smp_hys(i,k)/ssnow%sucs_hys(i,k)))**(-soil%bch_vec(i,k)) +! ssnow%ssat_hys(i,k) = (ssnow%wb_hys(i,k) - ssnow%watr_hys(i,k)*(1.0-tmp_smp))/& +! tmp_smp +! else +! ssnow%ssat_hys(i,k) = ssnow%wb_hys(i,k) +! end if +! ssnow%ssat_hys(i,k) = max(0.001+ssnow%watr_hys(i,k),ssnow%ssat_hys(i,k)) +! +! ELSE !wetting +! ssnow%ssat_hys(i,k) = gw_params%ssat_wet_factor*soil%ssat_vec(i,k) +! ssnow%hys_fac(i,k) = 0.5 !wetting +! ssnow%sucs_hys(i,k) = ssnow%hys_fac(i,k)*soil%sucs_vec(i,k) +! +! if (ssnow%smp_hys(i,k) .lt. -ssnow%sucs_hys(i,k) ) then +! tmp_smp = (min(0.99,-ssnow%smp_hys(i,k)/ssnow%sucs_hys(i,k)))**(-soil%bch_vec(i,k)) +! ssnow%watr_hys(i,k) = (ssnow%wb_hys(i,k) - ssnow%ssat_hys(i,k) *tmp_smp)/& +! (1._r_2 - tmp_smp) +! else +! ssnow%watr_hys(i,k) = soil%watr(i,k) +! end if +! +! ssnow%watr_hys(i,k) = max(0._r_2,min(ssnow%ssat_hys(i,k)-0.001, ssnow%watr_hys(i,k) ) ) +! END IF +! END DO +! END DO + + do k=1,ms + do i=1,mp + s_mid(i) = (wb_temp(i,k) - ssnow%watr_hys(i,k)) / & + (ssnow%ssat_hys(i,k) - ssnow%watr_hys(i,k)) + + s_mid(i) = min(max(s_mid(i),0.01_r_2),1._r_2) + ! MMY ??? why 0.01_r_2 here but 0.001_r_2 in aquifer + ssnow%smp(i,k) = -ssnow%sucs_hys(i,k)*s_mid(i)**(-soil%bch_vec(i,k)) + + ssnow%smp(i,k) = max(min(ssnow%smp(i,k),-ssnow%sucs_hys(i,k)),sucmin) + + ssnow%dsmpdw(i,k) = -soil%bch_vec(i,k)*ssnow%smp(i,k)/s_mid(i) + end do + end do + + !Aquifer potential + do i=1,mp + s_mid(i) = (wb_temp(i,ms+1)-soil%GWwatr(i))/(soil%GWssat_vec(i)-soil%GWwatr(i)) + s_mid(i) = min(max(s_mid(i),0.001_r_2),1._r_2) + ! MMY ??? + ssnow%GWsmp(i) = -soil%GWsucs_vec(i)*s_mid(i)**(-soil%GWbch_vec(i)) + ssnow%GWsmp(i) = max(min(ssnow%GWsmp(i),-soil%GWsucs_vec(i)),sucmin) + ssnow%GWdsmpdw(i) = -soil%GWbch_vec(i)*ssnow%GWsmp(i)/& + (max(s_mid(i)*(wb_temp(i,ms+1)-soil%GWwatr(i)),0.01_r_2)) !MMY + end do + + end subroutine brook_corey_hysteresis_swc_smp + + ! MMY@13Mar2023 Please keep subroutine swc_hyst_direction temporarily. Subroutine + ! swc_hyst_direction should be kept or deleted as subroutine + ! brook_corey_hysteresis_swc_smp + +subroutine swc_hyst_direction(soil,ssnow,veg) + !* Calculate soil water content and soil hydraulic parameters + ! with the consideration of hysteresis effect + + type(soil_parameter_type), intent(inout) :: soil + type(soil_snow_type), intent(inout) :: ssnow + TYPE(veg_parameter_type) , INTENT(INOUT) :: veg ! veg parameters + + real(r_2), dimension(mp,ms) :: delta_wbliq,psi_tmp + integer :: i,k,klev + real(r_2) :: tmp_smp + + delta_wbliq = ssnow%wbliq - ssnow%wbliq_old + !soil hydraulic state/props so smp out matches the wb out + !call swc_smp_dsmpdw(soil,ssnow) + + if (gw_params%BC_hysteresis) then ! MMY??? redundant,calling swc_hyst_direction requires gw_params%BC_hysteresis, + call brook_corey_hysteresis_swc_smp(soil,ssnow) + elseif (gw_params%HC_SWC) then + call hutson_cass_swc_smp(soil,ssnow) + else + call brook_corey_swc_smp(soil,ssnow) + end if + + !switch drying/wetting curve + do k=1,ms + do i=1,mp + if (delta_wbliq(i,k) .gt. 0.0 .and. & + ssnow%hys_fac(i,k) .gt. 0.75.and.& + ssnow%wb(i,k).lt.gw_params%ssat_wet_factor * soil%ssat_vec(i,k)) then !avoid testing .eq. 1.0 + !layer was drying now it is wetting! + ssnow%smp_hys(i,k) = ssnow%smp(i,k) + ssnow%wb_hys(i,k) = ssnow%wb(i,k) + ssnow%ssat_hys(i,k)= gw_params%ssat_wet_factor * soil%ssat_vec(i,k) + ssnow%hys_fac(i,k) = 0.5 + ssnow%sucs_hys(i,k) = ssnow%hys_fac(i,k)*soil%sucs_vec(i,k) + elseif (delta_wbliq(i,k) .le. 0.0 .and. & + ssnow%hys_fac(i,k) .lt. 0.75 .and.& + ssnow%wb(i,k) .gt. soil%watr(i,k)) then + !swtiched wetting to drying + ssnow%smp_hys(i,k) = ssnow%smp(i,k) + ssnow%wb_hys(i,k) = ssnow%wb(i,k) + ssnow%hys_fac(i,k) = 1.0 + ssnow%sucs_hys(i,k) = ssnow%hys_fac(i,k)*soil%sucs_vec(i,k) + end if + + if (delta_wbliq(i,k) .gt. 0.0) then + + ssnow%ssat_hys(i,k)= gw_params%ssat_wet_factor * soil%ssat_vec(i,k) + if (ssnow%smp_hys(i,k) .lt. -ssnow%sucs_hys(i,k) ) then + + tmp_smp = (min(0.99,-ssnow%smp_hys(i,k)/ssnow%sucs_hys(i,k)))**(-soil%bch_vec(i,k)) + ssnow%watr_hys(i,k) = (ssnow%wb_hys(i,k) - soil%ssat_vec(i,k) * tmp_smp)/& + (1.0 - tmp_smp) + else + ssnow%watr_hys(i,k) = ssnow%wb_hys(i,k) + end if + + ssnow%watr_hys(i,k) = max(0._r_2,min(ssnow%ssat_hys(i,k)-0.001, ssnow%watr_hys(i,k) ) ) + + else !drying ! MMY add a space + ssnow%watr_hys(i,k)= soil%watr(i,k) !this is how we tell if drying + !watr_hys .eq. watr + if (ssnow%smp_hys(i,k) .lt. -ssnow%sucs_hys(i,k)) then + tmp_smp = (min(0.99,-ssnow%smp_hys(i,k)/ssnow%sucs_hys(i,k)))**(-soil%bch_vec(i,k)) + ssnow%ssat_hys(i,k) = (ssnow%wb_hys(i,k) - soil%watr(i,k)*(1.0-tmp_smp))/& + tmp_smp + else + ssnow%ssat_hys(i,k) = ssnow%wb_hys(i,k) + end if + + ssnow%ssat_hys(i,k) = max(ssnow%watr_hys(i,k)+0.001,ssnow%ssat_hys(i,k)) + end if + + end do + end do + + if (cable_user%gw_model .and. gw_params%bc_hysteresis) then + do klev=1,ms + do i=1,mp + if (soil%isoilm(i) .ne. 9 .and. veg%iveg(i) .le. 16) then + + psi_tmp(i,klev) = abs(psi_c(veg%iveg(i))) + + soil%swilt_vec(i,klev) = (ssnow%ssat_hys(i,klev)-ssnow%watr_hys(i,klev)) * & + (psi_tmp(i,klev)/soil%sucs_vec(i,klev))& + **(-1.0/soil%bch_vec(i,klev))+& + ssnow%watr_hys(i,klev) + soil%sfc_vec(i,klev) = (gw_params%sfc_vec_hk/soil%hyds_vec(i,klev))& + **(1.0/(2.0*soil%bch_vec(i,klev)+3.0)) *& + (ssnow%ssat_hys(i,klev)-ssnow%watr_hys(i,klev)) + ssnow%watr_hys(i,klev) + end if + end do + end do + + end if + + end subroutine swc_hyst_direction + +!`!taken from +!`!/g/data1/w35/mrd561/CABLE/CMIP6-GM2_dev_testing_tiles/core/biogeophys +!`! to test +!`SUBROUTINE GWsoilfreeze(dels, soil, ssnow) +!` !NOTE: this is only included because gw_model uses parameters XXX_vec +!` !these are r_2. this breaks bitwise compatibility with trunk +!` !if acceptable this routine does the same thing but with r_2 soil params +!` ! if max_ice_frac always set to frozen_limit and tgg_tmp is always CTFRZ +!` +!` REAL, INTENT(IN) :: dels ! integration time step (s) +!` TYPE(soil_snow_type), INTENT(INOUT) :: ssnow +!` TYPE(soil_parameter_type), INTENT(INOUT) :: soil +!` REAL , DIMENSION(mp,ms) :: tgg_old,tgg_new,tgg_tmp !tgg_old is previous point of when crosses freezing +!` REAL(r_2), DIMENSION(mp,ms) :: sicefreeze +!` REAL(r_2), DIMENSION(mp,ms) :: sicemelt +!` REAL(r_2), DIMENSION(mp,ms) :: wbice_delta,avail_por,delta_ice_vol +!` REAL(r_2), DIMENSION(mp) :: ice_mass,liq_mass,tot_mass +!` INTEGER :: i,j,k +!` REAL(r_2) :: func,funcderv,Aconst,Dconst,t_zero,t_one,dtmp +!` REAL, DIMENSION(mp,ms) :: gammzz_snow +!` REAL(r_2),DIMENSION(mp,ms) :: xx,max_ice_frac,iceF,den_css !Decker and Zeng 20.9 +!` REAL(r_2) :: delta_wbliq,tmp_var +!` +!` max_ice_frac(:,:) = zero +!` delta_ice_vol(:,:) = zero +!` tgg_old(:,:) = ssnow%otgg(:,:) +!` tgg_new(:,:) = ssnow%tgg(:,:) +!` tgg_tmp(:,:) = tgg_old(:,:) +!` +!` gammzz_snow(:,:) = zero +!` k=1 +!` do i=1,mp +!` if (ssnow%isflag(i) .eq. zero.and. soil%isoilm(i) .ne. 9) then +!` gammzz_snow(i,k) = real(Ccgsnow,r_2) * real(ssnow%snowd(i),r_2) +!` end if +!` end do +!` +!` sicefreeze(:,:) = -1._r_2 +!` sicemelt(:,:) = -1._r_2 +!` +!` do k=1,ms +!` do i=1,mp +!` +!` ssnow%wmice(i,k) = ssnow%wbice(i,k)*soil%zse_vec(i,k)*real(Cdensity_ice,r_2) +!` ssnow%wmliq(i,k) = ssnow%wbliq(i,k)*soil%zse_vec(i,k)*real(Cdensity_liq,r_2) +!` ssnow%wmtot(i,k) = ssnow%wmice(i,k) + ssnow%wmliq(i,k) +!` +!` if ((ssnow%tgg(i,k) .lt. CTFRZ) .and. & +!` (ssnow%tgg(i,k) .lt. ssnow%otgg(i,k))) then +!` +!` ssnow%otgg(i,k) = min(ssnow%otgg(i,k),CTFRZ) +!` +!` if (ssnow%wb(i,k) .gt. (soil%watr(i,k)+1.0e-6) ) then +!` iceF(i,k) = max(zero,min(0.95_r_2,max(zero,ssnow%wbliq(i,k)-soil%watr(i,k))/& +!` (ssnow%wb(i,k)-soil%watr(i,k)) ) ) +!` else +!` iceF(i,k) = 0._r_2 +!` end if +!` tgg_tmp(i,k) = iceF(i,k)*ssnow%otgg(i,k) + & +!` (1._r_2 - iceF(i,k))*ssnow%tgg(i,k) +!` +!` Aconst =max(0.1,min(0.99_r_2,(ssnow%wb(i,k)-soil%watr(i,k))/(soil%ssat_vec(i,k)-soil%watr(i,k)) ) ) +!` Dconst = exp(1. - Aconst ) +!` +!` if (tgg_tmp(i,k) .lt. CTFRZ) then +!` max_ice_frac(i,k) = max(zero,ssnow%wb(i,k)*& +!` (1._r_2 - exp(2._r_2*(tgg_tmp(i,k)-CTFRZ)*Aconst*Aconst)) / Dconst) +!` +!` else +!` max_ice_frac(i,k) = zero +!` end if +!` +!` max_ice_frac(i,k) = min(ssnow%wb(i,k)*0.9, max_ice_frac(i,k) ) +!` +!` delta_ice_vol(i,k) = max(zero, max_ice_frac(i,k) - ssnow%wbice(i,k) ) +!` +!` !check amount of water we have +!` delta_ice_vol(i,k) = min(ssnow%wbliq(i,k)*real(Cdensity_liq/Cdensity_ice,r_2), delta_ice_vol(i,k) ) +!` +!` sicefreeze(i,k) = min(delta_ice_vol(i,k)*soil%zse_vec(i,k)*Cdensity_ice, & +!` max(zero,(ssnow%otgg(i,k)-ssnow%tgg(i,k))*ssnow%gammzz(i,k)/CHLF) ) +!` +!` elseif ((ssnow%tgg(i,k) .gt. CTFRZ) .and. & +!` (ssnow%tgg(i,k) .gt. ssnow%otgg(i,k)) .and. & +!` ssnow%wbice(i,k) .gt. zero ) then +!` +!` ssnow%otgg(i,k) = min(ssnow%otgg(i,k),CTFRZ) +!` +!` tgg_tmp(i,k) = CTFRZ +!` +!` delta_ice_vol(i,k) = ssnow%wbice(i,k) +!` +!` sicemelt(i,k) = min(delta_ice_vol(i,k)*soil%zse_vec(i,k)*Cdensity_ice, & +!` max(zero,(ssnow%tgg(i,k)-ssnow%otgg(i,k))*ssnow%gammzz(i,k)/CHLF)) +!` +!` endif +!` end do +!` end do +!` +!` DO k = 1, ms +!` DO i=1,mp +!` +!` +!` if (sicefreeze(i,k) .gt. zero .and. ssnow%tgg(i,k).lt.CTFRZ .and. & +!` ssnow%tgg(i,k).lt.ssnow%otgg(i,k) ) then +!` +!` +!` ssnow%wbice(i,k) = ssnow%wbice(i,k) +& +!` sicefreeze(i,k)/soil%zse_vec(i,k)/real(Cdensity_ice,r_2) +!` +!` delta_wbliq = max(zero,min(ssnow%wbliq(i,k),delta_ice_vol(i,k)*real(Cdensity_ice/Cdensity_liq,r_2))) +!` +!` ssnow%gammzz(i,k) = max(soil%heat_cap_lower_limit(i,k), & +!` (1.0- soil%ssat_vec(i,k))*soil%css_vec(i,k)*soil%rhosoil_vec(i,k) & +!` + (ssnow%wbliq(i,k) - delta_wbliq) * REAL(Ccswat*Cdensity_liq,r_2) & +!` + ssnow%wbice(i,k) * REAL(Ccsice*Cdensity_ice,r_2)& +!` )*soil%zse_vec(i,k) + gammzz_snow(i,k) +!` +!` ssnow%tgg(i,k) = ssnow%tgg(i,k) + real(sicefreeze(i,k) )& +!` * CHLF / real(ssnow%gammzz(i,k) ) +!` +!` ssnow%wmice(i,k) = ssnow%wbice(i,k)*soil%zse_vec(i,k)*real(Cdensity_ice,r_2) +!` ssnow%wmliq(i,k) = ssnow%wmtot(i,k) - ssnow%wmice(i,k) +!` +!` ssnow%wbliq(i,k) = ssnow%wmliq(i,k) / (soil%zse_vec(i,k)*m2mm) +!` ssnow%wb(i,k) = ssnow%wbliq(i,k) + den_rat * ssnow%wbice(i,k) +!` +!` elseif (sicemelt(i,k) .gt. zero .and. ssnow%tgg(i,k).gt.CTFRZ & +!` .and. ssnow%wbice(i,k) .gt. 0._r_2) then +!` +!` ssnow%wbice(i,k) = ssnow%wbice(i,k) - delta_ice_vol(i,k) +!` +!` delta_wbliq = delta_ice_vol(i,k)*real(Cdensity_ice/Cdensity_liq,r_2) +!` +!` ssnow%gammzz(i,k) =max(soil%heat_cap_lower_limit(i,k), & +!` (1.0 - soil%ssat_vec(i,k))*soil%css_vec(i,k)*soil%rhosoil_vec(i,k)& +!` + (ssnow%wbliq(i,k)+delta_wbliq) * REAL(Ccswat*Cdensity_liq,r_2) & +!` + ssnow%wbice(i,k) * REAL(Ccsice*Cdensity_ice,r_2)& +!` )*soil%zse_vec(i,k) + gammzz_snow(i,k) +!` +!` ssnow%tgg(i,k) = ssnow%tgg(i,k) - real(sicemelt(i,k) )& +!` * CHLF / real(ssnow%gammzz(i,k) ) +!` +!` ssnow%wmice(i,k) = ssnow%wbice(i,k)*soil%zse_vec(i,k)*real(Cdensity_ice,r_2) +!` ssnow%wmliq(i,k) = ssnow%wmtot(i,k) - ssnow%wmice(i,k) +!` +!` ssnow%wbliq(i,k) = ssnow%wmliq(i,k) / (soil%zse_vec(i,k)*m2mm) +!` ssnow%wb(i,k) = ssnow%wbliq(i,k) + den_rat * ssnow%wbice(i,k) +!` +!` END IF +!` +!` +!` END DO +!` END DO +!` +!`END SUBROUTINE GWsoilfreeze + END MODULE cable_gw_hydro_module diff --git a/src/science/soilsnow/cbl_thermal.F90 b/src/science/soilsnow/cbl_thermal.F90 index 163b9266c..cb682df1f 100644 --- a/src/science/soilsnow/cbl_thermal.F90 +++ b/src/science/soilsnow/cbl_thermal.F90 @@ -6,7 +6,11 @@ MODULE snow_processes_soil_thermal_mod CONTAINS -SUBROUTINE snow_processes_soil_thermal(dels,ssnow,soil,veg,canopy,met,bal,snowmlt) +!SUBROUTINE snow_processes_soil_thermal(dels,ssnow,soil,veg,canopy,met,bal,snowmlt) ! replaced by rk4417 - phase2 +! snowmlt is not used in cable_gw_hydro_module and as far as I can tell serves no purpose in the code - rk4417 + +SUBROUTINE snow_processes_soil_thermal(dels,ssnow,soil,veg,canopy,met,bal) +!* calculate snow processes and thermal soil USE snowl_adjust_mod, ONLY: snowl_adjust USE snowCheck_mod, ONLY: snowCheck @@ -24,10 +28,12 @@ SUBROUTINE snow_processes_soil_thermal(dels,ssnow,soil,veg,canopy,met,bal,snowml TYPE(veg_parameter_type), INTENT(INOUT) :: veg TYPE(met_type), INTENT(INOUT) :: met ! all met forcing TYPE (balances_type), INTENT(INOUT) :: bal - REAL, DIMENSION(:), INTENT(INOUT) :: snowmlt - + REAL, DIMENSION(mp) :: snowmlt !track snow melt +! REAL, DIMENSION(:), INTENT(INOUT) :: snowmlt ! replaced by rk4417 - phase2 INTEGER :: k,i + snowmlt = 0.0 ! inserted by rk4417 - phase2 + CALL snowcheck (dels, ssnow, soil, met ) CALL snowdensity (dels, ssnow, soil) diff --git a/src/util/cable_common.F90 b/src/util/cable_common.F90 index ce9550d46..f3d2a99c9 100644 --- a/src/util/cable_common.F90 +++ b/src/util/cable_common.F90 @@ -100,36 +100,91 @@ MODULE cable_common_module ssat_vec_organic = 0.9, & watr_organic = 0.1, & sfc_vec_hk = 1.157407e-06, & - swilt_vec_hk = 2.31481481e-8 - + swilt_vec_hk = 2.31481481e-8, & + +! should the ones below be included also or is it a renaming? - rk4417 - phase2 +! they are included to fix compilation error - rk4417 - phase2 + hyds_organic = 1.0e-4, & + sucs_organic = 10.3, & + bch_organic = 2.91, & + ssat_organic = 0.9, & + css_organic = 4000.0, & + cnsd_organic = 0.1 END TYPE organic_soil_params TYPE gw_parameters_type +! REAL :: & +! MaxHorzDrainRate=2e-4, & !anisintropy * q_max [qsub] +! EfoldHorzDrainRate=2.0, & !e fold rate of q_horz +! MaxSatFraction=2500.0, & !parameter controll max sat fraction +! hkrz=0.5, & !hyds_vec variation with z +! zdepth=1.5, & !level where hyds_vec(z) = hyds_vec(no z) +! frozen_frac=0.05, & !ice fraction to determine first non-frozen layer for qsub +! SoilEvapAlpha = 1.0, & !modify field capacity dependence of soil evap limit +! IceAlpha=3.0, & +! IceBeta=1.0 +! +! REAL :: ice_impedence=5.0 +! +! TYPE(organic_soil_params) :: org +! +! INTEGER :: level_for_satfrac = 6 +! LOGICAL :: ssgw_ice_switch = .FALSE. +! +! LOGICAL :: subsurface_sat_drainage = .TRUE. + +! replaced above block by below - rk4417 - phase2 + REAL :: & MaxHorzDrainRate=2e-4, & !anisintropy * q_max [qsub] EfoldHorzDrainRate=2.0, & !e fold rate of q_horz + EfoldHorzDrainScale=1.0, & !e fold rate of q_horz MaxSatFraction=2500.0, & !parameter controll max sat fraction hkrz=0.5, & !hyds_vec variation with z zdepth=1.5, & !level where hyds_vec(z) = hyds_vec(no z) frozen_frac=0.05, & !ice fraction to determine first non-frozen layer for qsub SoilEvapAlpha = 1.0, & !modify field capacity dependence of soil evap limit IceAlpha=3.0, & - IceBeta=1.0 + IceBeta=1.0, & + sfc_vec_hk = 1.157407e-06, & + swilt_vec_hk = 2.31481481e-8 REAL :: ice_impedence=5.0 - + REAL :: ssat_wet_factor=0.85 + !hysteresis reduces ssat due to air entrapment + TYPE(organic_soil_params) :: org - + INTEGER :: aquifer_recharge_function=-1 !0=>no flux,1=>assume gw at hydrostat eq !inserted line as per MMY -- rk4417 INTEGER :: level_for_satfrac = 6 LOGICAL :: ssgw_ice_switch = .FALSE. + !LOGICAL :: derive_soil_param = .FALSE. ! MMY TRUE: derive soil parameters by cosby or HC-SWC equations hard-coded in CABLE-GW + ! MMY however, sand/silt/clay/org/rhosoil_vec are read from gridinfo + ! MMY FALSE: read soil parameters from land gridinfo file LOGICAL :: subsurface_sat_drainage = .TRUE. - + LOGICAL :: cosby_univariate=.false. + LOGICAL :: cosby_multivariate=.false. + LOGICAL :: HC_SWC=.false. !use Hutson Cass modified brooks corey + !seperates wet/dry to remove need for watr and + !gives better numerical behavoir for soln + LOGICAL :: BC_hysteresis=.false. + END TYPE gw_parameters_type TYPE(gw_parameters_type), SAVE :: gw_params +! psi_c and psi_o below inserted by rk4417 - phase2 + REAL, DIMENSION(17),SAVE :: psi_c = (/-2550000.0,-2550000.0,-2550000.0, & + -2240000.0,-4280000.0,-2750000.0,-2750000.0,& + -2750000.0,-2750000.0,-2750000.0,-2750000.0,-2750000.0,& + -2750000.0,-2750000.0,-2750000.0,-2750000.0,-2750000.0/) + + REAL, DIMENSION(17),SAVE :: psi_o = (/-66000.0,-66000.0,-66000.0,& + -35000.0,-83000.0,-74000.0,-74000.0,& + -74000.0,-74000.0,-74000.0,-74000.0,-74000.0,& + -74000.0,-74000.0,-74000.0,-74000.0,-74000.0/) + REAL, SAVE :: &!should be able to change parameters! max_glacier_snowd=1100.0,& snow_ccnsw = 2.0, & From a6e0dccd19ee16158d64891979033f92d98197c5 Mon Sep 17 00:00:00 2001 From: Sean Bryan <39685865+SeanBryan51@users.noreply.github.com> Date: Fri, 19 Apr 2024 15:32:04 +1000 Subject: [PATCH 16/85] Add support for MPI builds with the GNU compiler (#241) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The build script currently does not support MPI builds with the GNU compiler on Gadi. This is due to the `intel-mpi` module being loaded when we should be using an MPI module that is compatible with the chosen compiler. This change loads the `openmpi` module when GNU compilation is enabled in the build script. Fixes #239 ---- 📚 Documentation preview 📚: https://cable--241.org.readthedocs.build/en/241/ --- build.bash | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/build.bash b/build.bash index 37b685db7..b4dd10f8d 100755 --- a/build.bash +++ b/build.bash @@ -75,10 +75,12 @@ if hostname -f | grep gadi.nci.org.au > /dev/null; then intel) module add intel-compiler/2019.5.281 compiler_lib_install_dir=Intel + [[ -n $mpi ]] && module add intel-mpi/2019.5.281 ;; gnu) module add gcc/13.2.0 compiler_lib_install_dir=GNU + [[ -n $mpi ]] && module add openmpi/4.1.4 ;; ?*) echo -e "\nError: compiler ${compiler} is not supported.\n" @@ -89,10 +91,6 @@ if hostname -f | grep gadi.nci.org.au > /dev/null; then # pkg-config: prepend_path PKG_CONFIG_PATH "${NETCDF_BASE}/lib/${compiler_lib_install_dir}/pkgconfig" - if [[ -n $mpi ]]; then - module add intel-mpi/2019.5.281 - fi - if module is-loaded openmpi; then # This is required so that the openmpi MPI libraries are discoverable # via CMake's `find_package` mechanism: From 81b8795766b95063acfafe8c48e0b2bdf974ce68 Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Tue, 7 May 2024 16:08:23 +1000 Subject: [PATCH 17/85] (#285): run testcase from within src/offline/ for now. --- documentation/docs/user_guide/uber_quick_guide.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/documentation/docs/user_guide/uber_quick_guide.md b/documentation/docs/user_guide/uber_quick_guide.md index 8f0aea573..17246dbfb 100644 --- a/documentation/docs/user_guide/uber_quick_guide.md +++ b/documentation/docs/user_guide/uber_quick_guide.md @@ -13,7 +13,8 @@ Assuming you have computing resources on gadi@NCI, installing and running CABLE 1. Execute this serial version of CABLE - ./bin/cable + cd src/offline + ../../bin/cable ## In slightly more detail From 87c95926f41a0f6158f2ae138facf10ae0064653 Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Thu, 9 May 2024 16:46:16 +1000 Subject: [PATCH 18/85] (#186): additions to review guidelines --- documentation/docs/assets/re-review.png | Bin 0 -> 41612 bytes documentation/docs/assets/review-comment.png | Bin 0 -> 269302 bytes .../docs/assets/review-suggestion.png | Bin 0 -> 285927 bytes .../contribution/resources/how_to.md | 46 +++++++++++++++++- .../contribution/review_guide.md | 14 ++++-- 5 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 documentation/docs/assets/re-review.png create mode 100644 documentation/docs/assets/review-comment.png create mode 100644 documentation/docs/assets/review-suggestion.png diff --git a/documentation/docs/assets/re-review.png b/documentation/docs/assets/re-review.png new file mode 100644 index 0000000000000000000000000000000000000000..08ed2dce616c54b5563d55dcc99cbc5aa8da02ac GIT binary patch literal 41612 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 literal 0 HcmV?d00001 diff --git a/documentation/docs/assets/review-comment.png b/documentation/docs/assets/review-comment.png new file mode 100644 index 0000000000000000000000000000000000000000..9555d442a8a06a240122318e6a058d2a0e09545e GIT binary patch literal 269302 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
7e~U2#%body9mV%n7T(iC`2g^%^@eI%-k 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�T^Dw!w7uRb6gSR+Jwnct!4Uy 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�aKgr0ttwQ`OW4`b>+NjH0I8M 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

y3U$b{;c93gR;)rZ- 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ΞM%yi>AA1c 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

@xU20=^IXHn1g?= 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

2h%1o?y>kXy!{rB^|wotR45&2}YaFHSA_x0qj@* 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 ^D&CrEgv6|VP+Oh2}{jW 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
![how request review](../../../assets/request_review.png){ width="90%", align=right }
+### Understand a review + +Reviewers can either leave comments or suggestions during the review. All of these need to be resolved to finish the current review. + +#### Suggestions from the reviewer + +A reviewer can directly suggest a specific code change. These suggestions appear like this: +
+ ![how review suggestion](../../../assets/review-suggestion.png) +
+ +These suggestions can be directly applied within GitHub without requiring the author to copy them to their own local branch. It is easier to: + +- first apply the suggestions you agree with via GitHub +- then update your local branch with `git pull` +- apply other changes required by the review locally to the branch +- and finally push the fully revised version to GitHub (`git push`) + +#### Comments from the reviewer + +These comments can be: + +- generic to the whole set of changes +- attached to a specific file +- or attached to a specific set of modified lines in a file + +Comments to a specific set of lines look like this: +
+ ![how review comment](../../../assets/review-comment.png) +
+ +It shows the specific lines commented on and the comment from the reviewer and it allows to reply to that specific comment. + +### Request a re-review + +Once you have finished addressing all the comments from the reviewer, you should ask the reviewer to re-review the pull request: +
+ ![how re-review](../../../assets/re-review.png) +
+ +You will only be able to merge you work after getting approval from a reviewer. + [CABLE-repo]: https://github.com/CABLE-LSM/CABLE diff --git a/documentation/docs/developer_guide/contribution/review_guide.md b/documentation/docs/developer_guide/contribution/review_guide.md index 2ab8258eb..0309b18c9 100644 --- a/documentation/docs/developer_guide/contribution/review_guide.md +++ b/documentation/docs/developer_guide/contribution/review_guide.md @@ -1,6 +1,6 @@ # Review guidelines -All contributions to the CABLE land surface model will be reviewed before inclusion in the model. The review process is intended to check: +All contributions to the CABLE land surface model will be reviewed before inclusion in the model. The review process is intended to check that: - [the coding standards][coding-standards] have been applied - the documentation is understandable and follows at least the [minimum requirements][doc-min-req] @@ -11,17 +11,21 @@ All contributions to the CABLE land surface model will be reviewed before inclus Once you have finished the implementation of your changes, please make sure the description of the pull request is up-to-date. Ensure all the required test results are either linked to in comments or copied in. If you have performed tests beyond the required tests, make sure these tests and their results are described in comments in your pull request. -Once you are ready, [ask for a review by `CABLE-LSM/reviewers`][how-review]. If you want a specific individual who isn't part of the reviewers team to review your pull request, you can use the same process. However, a following review from the reviewers team will be necessary to accept the changes. +Once you are ready, [ask for a review by `CABLE-LSM/reviewers`][how-ask-review]. If you want a specific individual, you can use the same process to choose that person. ## Review process The reviewers team will try and reply to review requests quickly. If you think your review request has been lost, please ask for an update as a comment on your pull request and mention your reviewer (with @). -The review is likely to be an iterative process between the reviewer and the reviewee. As such, it would be appreciated if the reviewee is responsive once the review process starts. Make sure to keep discussions polite and courteous. Reviewees can reject suggestions from reviewers but the reasoning has to be explained and the rejection has to be agreed to by the reviewer. +The review is likely to be an iterative process between the reviewer and the author. As such, it is appreciated if you, the author, is responsive once the review process starts. Make sure to keep discussions polite and courteous. You can reject suggestions from reviewers but the reasoning has to be explained and the rejection has to be agreed to by the reviewer. -Once a reviewer has given you a written agreement the pull request is ready to be merged, you can merge it. We prefer if the author of the code changes merges the pull request as that leaves them a last chance to change their mind if they discover a reason not to go ahead with the changes. However, the admins team will periodically merge any approved pull request that has not been merged. +To better understand the pull request interface for reviews on GitHub, please refer to [our quick review guide][how-review] or [the GitHub documentation][github-review]. + +Once a reviewer has given approved the pull request, you can merge it. We prefer if the author of the code changes merges the pull request as that leaves them a last chance to change their mind. However, the admin team will periodically merge any pull request approved some time ago and that has not been merged. [coding-standards]: ../other_resources/coding_standards.md [doc-min-req]: ../documentation_guidelines/index.md [tests-req]: testing.md -[how-review]: resources/how_to.md#ask-a-review +[how-ask-review]: resources/how_to.md#ask-a-review +[how-review]: resources/how_to.md#understand-a-review +[github-review]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests From 3ab8f4559f4ee22d90864c0dc29fda1b908f5e92 Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Fri, 10 May 2024 15:31:51 +1000 Subject: [PATCH 19/85] (#186): formatting --- .../docs/developer_guide/contribution/resources/how_to.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/docs/developer_guide/contribution/resources/how_to.md b/documentation/docs/developer_guide/contribution/resources/how_to.md index eeab1758f..b100172f8 100644 --- a/documentation/docs/developer_guide/contribution/resources/how_to.md +++ b/documentation/docs/developer_guide/contribution/resources/how_to.md @@ -98,7 +98,7 @@ Reviewers can either leave comments or suggestions during the review. All of the A reviewer can directly suggest a specific code change. These suggestions appear like this:
- ![how review suggestion](../../../assets/review-suggestion.png) + ![how review suggestion](../../../assets/review-suggestion.png){ width="90%", align=right }
These suggestions can be directly applied within GitHub without requiring the author to copy them to their own local branch. It is easier to: @@ -118,7 +118,7 @@ These comments can be: Comments to a specific set of lines look like this:
- ![how review comment](../../../assets/review-comment.png) + ![how review comment](../../../assets/review-comment.png){ width="90%", align=right }
It shows the specific lines commented on and the comment from the reviewer and it allows to reply to that specific comment. @@ -127,7 +127,7 @@ It shows the specific lines commented on and the comment from the reviewer and i Once you have finished addressing all the comments from the reviewer, you should ask the reviewer to re-review the pull request:
- ![how re-review](../../../assets/re-review.png) + ![how re-review](../../../assets/re-review.png){ width="90%", align=right }
You will only be able to merge you work after getting approval from a reviewer. From 5d7b8083f1e5e080a4c4da430d229d75283f97a9 Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Fri, 10 May 2024 17:03:48 +1000 Subject: [PATCH 20/85] (#186): revised text --- documentation/docs/assets/review-comment.png | Bin 269302 -> 261012 bytes .../docs/assets/review-suggestion.png | Bin 285927 -> 271534 bytes .../contribution/resources/how_to.md | 6 ++-- .../contribution/review_guide.md | 27 +++++++++++++++--- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/documentation/docs/assets/review-comment.png b/documentation/docs/assets/review-comment.png index 9555d442a8a06a240122318e6a058d2a0e09545e..01409bc2793c58f31a23a2612801558245e0e658 100644 GIT binary patch literal 261012 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
    wZPEZn=cExCpoZQ*&3 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 z�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
    7e~U2#%body9mV%n7T(iC`2g^%^@eI%-k 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�T^Dw!w7uRb6gSR+Jwnct!4Uy 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�aKgr0ttwQ`OW4`b>+NjH0I8M zt^0F3I2O=5*FECZh9h~aw@^{YqzhewZYo^%-(CHFPH}z(0-2zsuG&6pAy-sHj3BN; zmw=#*qf$OJ@s88%S$#8WCC@AQ?h|iJ*&Gbg>E@Q)ZrMcx& z2PX0g3gcB&Edr`_W_du)*l2M`926XCbtJ?2d^Zb5w=-yQwPE9bp%iw_hB91UoEh1f z8AB>fnj`C_5K8e|pZ5lW4*C^UP}|FS5)!oq02v?&DNS-FZim_Uz`#gG!DQN$+0EW+ zocU*~Q1`>ei{u>mr;A! z8{y-?8>Kp($*a`4XKAn-JuXMbe=NgxS%~OWli7A%5!;##{`cuGZeobLQ!!k+$ z?cpcTi&m5>W)sFAN?4}3i|8exYU5(OAq+7E{ILFryG9-TF+Ks|kIuF9M=u_onpV#1 z5!C{hy3+d!D?y%Ib~dwE4T3M@$883HS2h#uNDADM;!&gP=HqvyNXfP-r?5 zbx$OtYWng1nDu9gc#+WPobY6-qX4ViqCep>FZFn9%lE=UlR1<80HvtRDJ=D=nJIYK z-bh?oX9Bopt*|Ka{|&|)u76Lr^z0BJs@E;KzI=L9z# zfFtcChbs7L=Ce5~aFF(Aewm?}(H{J{dh;R9|>sB_R=5XG>Xjn32aEdU;Nd?OnQGAkpoTpi!{ zE0E!qhtyv~9hJ}5U17u>#>}o}Y>_D*xcOI((QG}t2-Vt)*lWC28*|6RXElYX$H#N; zd$5p@P{yIlnz?}-PAu>GU@^(O=}d)QU)J0I-Dd+rm(jjj+F;r>@`?1{&-HgM(Z3Ql zV*uHJ$~x;)%FECGa2(?k6qv)`p(6t@W}K#55`+1QHVYLKQ+ycHXGK+`d*b0@v^hIJ$}RaB=SOj7mfidh&RfRH2BF6@RUTD9v=t@7&O!(4h*(X@+J5I zvf}-3IWWKrsYJe-nC+J_y6*#IHAF2eE6ZDYSWsKlTU2$L+l?(*Ne{cC|&sdE&4G%V&uj)|7m;I1%6ioj!`=~yU- znMR3=jR+8xc}3HNg-78HFl(KEz#oa8ud@C4Wz6xtJfMJgz61kY))QU5d{Jp>ps*&Y zIjya!=fOb*g@pnz}zYUq5u&*@WaNcK-PzNai$;6*O--rZ+=6?VF z=7gw5y9me>nme=$OYHKCI&5;0*EVE+FB0=tR_9AaDd290yOqeaI<1+A#Mu>tz{S~u z>Atjc3q-M3Y64Uf7DqQe7Tx-6lut6P%cj#$e(t}gc7a(&gWyUx`nF~V2NJ5t=A0Gq zrQwbrUzKD{DG{RhDonV z-vL~wl-4ZT4e>Xa zKe#@MzW_=ppafnt@c`RtV_1O@S%T!@!AUR?pcv}IWpa$$A?C!NgJ7_~pFALDDD>4| zB^Y-;^G~i_^_98XrhN;jD={=}zqqWNOs+pWA|fOsVWzO55Cj+~9s6TKr*tof6ta9d zgj@?*apH`Jm>ej-fRAzrg#7Pih*NIxny&O?1AbddV<_4|)Cer5A}+WB^!`i>0_Xh!iXn$4z3U0Gss~@~`QZ;!5RpIUTCc{VS^k!P1_ogk@T$?0 z?}1CYY5X(`MlyD8Bq{0KMNVaqeNJG7Rc=!ts0aWNGs??9j@TfIc)opmERg?udA{*v z5O`H-BGA|IhteThzd17~TOtU6 zx&W+~<>Gn+_Wr$$oNj&L#Tato?{mD@826J8sLxVj;C9H#$w}$y5xmHgSoH`M7Bq`Xg>t_AHp<{f|Lhy`J)(i;pGBV}NvF*$h|er3p* zs_y_&%-~50OqW$x7yt4l18G2mhWpDGq)!;Y(Ti)Y7$Xl_iuCpyuo2%>urX} zu)|XUe`5RJc)|*&^Fq?u+1be{DGBlOcjpo{wT^JpZ{^6T{orj-P9U99{_HZ16o(}1 zt zr6i=JnG-ayZaq#$g(k*A)>GxIAE3#p44d`kU;gISf8)=z;Y zrQ|t}#UBPngz`X8%&aS`h^ZI_1L-28a(!O-$_uo#1UeEcXn5V9-4Edrxu`J;#n`^d zQCM_G5fT#mMMg!DkT3_Xudfrcu_Zs=v2pm0UgXXB=mwoEd4urcUQ+Xw&x-T#fPh)1 z{i*8u1_U$srv}BCT=|Wtghc7&gKyd_3#@ExOlyL@`RV|(ejy1Xk$rt}ABsr*y-~~-$T?yIQd{8>9f2v8p@eJerRt8klvX#xv zQ=i3Rk#{Dq#Z8F6v#SI_K^b-W!BiV<2n;MG2*(^!bfQ5&^iKh(7Ppb98x=h8W9L28 z%N^MlLOQzW&Ui4A3IWhq=Vv0ITQ`p=C^Rj=vYE`5PUYC325ngCM^@!lRz{K*6%qTG zIbX4U=fTsysvsaF#Mw-cc*pt&TQ0vroFfB6>&M2s)328K(d2D!Ixl2b0~;f&|4?gI zZ9c5BP@w}JW5rbU2IU*Z;TpnER_;R*ycHVv;sGWm%}^hqA|1(uMwSR|p{>*ihKh(& z{YZa8%Q$v2wn9))&`MNs+??E8>AK@(CJS+LgPejqm1EJ7i=DPjN_M78Wk$1r5Gd;vG&cGfJC+J>hbMnIU!0Pn{)7%Xg@H}A4ZFU}+}_TO zgn~8%Z^c7Q)9fbD)c$0&A#CwBs^y5o_$}Y=1hi+1L^^d4?bVeX#)v8AmSt-K)bksP zzQMeZOWTE7Ju*E5J!uk`c_w3%7%s%Fbumk+H!i)PWNQT9SL3%jYy1|Aitc#hz%al) zcHf^R)i@3XsNsDX#a|6^oF=wFtBo_6nGXJr$hX{hl|EH1w?B~s?OSCKnpVGOsf~8s zFO9uIZ50?j(b9H460rk;8yd%oEdIaCryLvtDK1u4%jz?7TxknCJB&-@*ttq#R-lrrpxtSoe5i!o0FQPWij_dA_e4V8O|ueHvWP&^d2)M_;wM1RBfyr#Ud+fT3=9N7#U%Ae z?lWgMEGjCpG$^BZcI{-!0U-CiZOZKme9bth;t6=Q%3E!vzPNN?lh& zWJqar72#H#dZ{UMhfh31^sSpJ2T(v)lg;B5dhNU!93YGFkG?hpRwogEq4Y!0&Z;hC zsOWy0Cro`$A8_r8U4t2f>45JN3e-)+^z~;-QTZ{==F5{sf}n|`d4C+uwWa{=rX*Dv zEVM@xObfSNzdn;^f>!**_3%7oN5n=PesCvMQ~v7FC&KX=Qj?IXob)<9;(2gzupqw0 z+}I=qd+6Dk!(}{ROlCAQ*xF#@RBxSKRzsOLV=W?ji6p`K@=%yv)`gS`&8ZXBQ@|(n z8;U*O8-$2lm;F}P);@l|6y>3agTGxmS55i$OsH>w{5re>UXL*yJKDN0M&`ym*Jhy)p(t$Iv0)*R&5mj`rz@+e$`n|p&Ij|;$h zT}Mz~OT((Za;X~R@c7emOQ;Q{sCM!(p#m-L+@R5d!qQAqg^6z2yy8qXUlQmwHoC}Q z0X7}JzJiE0mQ3fiH&CGgnf3Kd`!iXrFrU7DKTsN6JFsCve=Z_|ca&SJz{j`Eq+Gr) z;5{4KTcGE6+G2t^<@_7+pGy=`XmmiQEJ52YK`Ql!q)5P8K3N2XoATwVA0$$_R8$mE zs+>eS&laBa{*e*DPg;W!P`R+~#4G2q zY4U~4x0<1ss8x8?+BjCxgdwB#rIK~6je5-w5=35f@CoqA5bq>KI7Z@53Dwi|li-1f zLs$@8#&0IU!wWUARuYK|8&KfW+?rUpz*3kGG-4I{)ZNn! zR7KuhFAMt8L;s3FDIU)MXteIsxo22^>Y)}lK_9vv)mYFA4-YTV-`{VH{o?sI#Bepn z+q1~I)QC=a>B1>~ma05HYaY`<^^fdztRVAFzR~@u@-iJxo(?zB_^E=MeJmwXmL9br zn+lCxsmSWXGz?Nc~EsbmzxNSBY}g2xN@!k1dHZ^MZ-(ZKO?2Jk=E z&&CBY3)&oZVg8qJVQ2>uX`^f6%;2BlU}>K4ZGVPYdMn=O%JY|(S?c%A{P~FfyHc_u zr*``{SBHtk)(AD5Kdn4!@t4^rZ&K^SuZQru<&QoZ&H^bZ@?xu-KNQur<CORjXUrXmRep$~x~ceRHce|R1YL{E zO{V+PLzLqvXl13wXkkbIvmN=w?FC;6g7Gb9D@!=V_j@=tpM!VvF1=}u4kx*__NiiX z-+!j!d_Dc{9V3`vf0V)NKjweZQi7>H2x^YboY?xjt%?{7oIK8Kqm*E5H8u{>2lum( zbO(z4&NR~ZZ72nTm+X0haKw_)IbH@H(#8ggO|73Pw@9V=oF@Hxbs z=4LOTsw=_DY@y-q?s<>(aTKe;$cTOKyXONP31}f(EppM!ggq=|lZ`>_{c*%Z4x-)3 zg75WWo<~%xNr1!Id5nqSpn?WO=SK1NiI7zVb@W6IEvD#eFyCsU3k6bg z(rxV47-Q3sZ| zWlH|`&b%eGr36^{cfq>T%6Jley-deqxWf0A|0o1+s}tqx6hcXub(#krEB zdpsxfc~4b&{o9?lZ!FpfYE);&C~)*C)d;$5zmoyJhZxv&r6ca0ftQjc(44Gd z&UEKhQkDA1NY_6aSWV?wXznlPg;z$n@87w?8*WOn+1K;#_&Qx8ycEmsm`5j1h_aWy zB8c#C#RnjCF5m)GWNR8SaQSQ}7wo`s8@>HhE97wtEG$I4I$2cZtgW(HRKGb}f1Af; z^GGc?L4f+9&PJuFCSr8HtnDF?<7MCFi8^3s1rKhe2%FK~pu3Qs?%_^xS;A#+Z_nJ0 zLir1{DxJjzA6It0v?8fBeEfcPeJLn&-8>5B<5cAdg3CnZ;i(tmY4pEKW?vi5xViBVZ} zRS?r#`@uc>NFg1b3gs*{LPlPir$~|f3#1XDiocjfbX?r{3`LUB^gxVU{{!yWRJmX< zwxs)QRm5$HkFQVVExaI!@L^crmr)RYoCpS3al%xJL?OJ)ARodg9e7J!GJflcz5#;- zDfn>oEtt;tTaRzs%oi0zb|Bxw8+N(m3XWnO`T~VpQ=(bRQ&3sVmx5N^v5AUDtFsNW zwkO!kUs47LEN7Y0JYiK%;g3`ecE>Fina;%vZ?3WF0!o{%Nsm4*!oJpRPl&KULM;R^ zr`L~eI5X~`U#76#m6V9ZldLtf*o=lihQFd1j?6qPF4}ixtx-E`A`Zc>?8T~>k05lb1<~5o1yKi!Gip+X}sagV2N+8zmt%XXUi8UkVfPdXU7-L z0}G6Ktw1Xs@v!JT4`C2L!%GAnrbJ?-aeZ<3M8Y>yqgopRVNwfPsLV&e?|^y{{zMBe zm#x8v0gLj8K&X1$E<^V&5HAv#o7MD;-D2h z1(+}#e{#`hn8gVT!W+gu)_D<~uGU=6&0%^9{2!*iDj=$GYg-8^0cmNZQv`+{O1eS1 zr3a91hLDm5>F)0ClJ1Tn1SE%!q5Gfn*LQAa?)Jrg_j*@6u_WH&pj61&paH0HgN8tUhMO#lsy})pzgfe7EVFhkVg70ML4s?NZcwB16x)c`^b5*~go+^25c7RT;?v zC1tY-P=90c+;kw;G}c-Z^-bu$DeG+U-aQ?HnyhSTZK@aSYdrX@Ya(BU%ks4O>iSkB zeKIz1rvNEDDoizZUH>uRM$oP`8qTm0byNMX6PrPrt%osI=V#nj_cS4s)7(5jVwa@(X|CMi6FJCeoRrg+LNH zVe&F60SZFd&?yAW*WyXjutA*`E^a5w;=zwxaRk6-g$8qh( zA}&Z@5__bX)A%oAxW#6lw(!HT{KF>nevp}9Me%D#E8)Eo;9-5lE1JfNNDTUSvzSTQ zls_q$-l&ElGAME`+#AJfs}_YH7zkF%e$}k_Mxl^a>A@O9>{^c-+aR#~*`O&d3w)1h zN?_o+jO?lAsf{(~p4|nQ^MnSI~$M}B(P#Gag z!CQW~N_$d#ul#rdK@qOrQC=6>-P?7%NiCjkyH1CHdQ6HqpfY~4(jcDrFh3?-L#19Y zvABEVFHstV`C*RRqfZial;eoo(rN|XBDIWh`4&BAn8p`C&zYyYF@%TnxmGXi5QoV$ z(yA_X5uVeIi%IFC4qoV&jX7oh9#Gy5C3s6`rJw(%fzx+fM($|YKoDR{#BQL({&L3F zS)~X03^-Vyd8lo=1cL9L#oi-# zhuRn(5_Lo9N1D8-oh(Pb!@IH!HL1x>jpBhsf(DZl-SFKHmOhWS`6@R{r8~gSSp3Rp z0I^XTsSbN}IG|6F1uKg+t@QmT*0&@q6IG89)7%)L5RC>gAsmPndcmLDjp2Lx;$?Az z=Vbr_rKJ6vWnp!r1*{b*rdw_Au`zqp1A?g`PCSY%7Tw?ANFV9ZU$`zF6M zX9Txq$_*bvnz64>*W`t=tNK3p+ardAFV`67TZ=fHzn#yQcCV(8bL!SmR|mKZO!<(3 zzstr#t(WU|8$8D}nc3J18|KvyA=T`3a8}UL*-HGQ#p4aR_j43*QQ>fGn+)I}f)0Jm zuQhkqZZjOoW;O0cE^7p>BEOp@A31VS&;y=BXG26pEEwrIyy0?W@6>! z#94TAEX%}X;BAl;&IcbqVC3swxW0~Der6eM#2v4m3q?IbQ<;!5Jko3Wk$ZLZJ`VD= z+0K99;?N*i4d|TZvxTG9PB!e?_#^`Vg#T?-df#qWUyVSGj_7%v zebWQ^SgHPtaJWSGTTA;ZT(*Tjig)nr=1jeI$}O0;mTuoEt^vfR->nhHR&}NX3x>F| zK54-0E2=W_m_9Wbujg>Yklq%jYEn!Q`3OKUI$?k7L)1)6E`ws{1Z_Q5tNz?m9n%XiO@XSgdZ{#uYx+Rw_1 z3ozQez)o#yPm^xA_iVzjAz-uP3|dm0a?Xej!%)Gy$<58BjmP7h(VC#7uOsM@@|>!H zMh2S{~&?u}h_(ui@EgE<}rlcQZa z)nr5;1vd=T^3~Qn*#J~v(3@L$y&RKg8sGml40VEgxkRAh!bmsU=Z7}G;-ttKnV0uN zzTFKcj)>`A{M7|RcIk*8FJjgH7+$YshA+t)-yHY znWi`eeC#My#1go4e%isCJD3*#RmS64W$3%Bk#;>lXV=83>UYAeHDll&?UMc*cN>LX zL;<$jtNn6+$veukGDS5>E1He=ITwdK4Fc?K#sk|5w%4NJ2XwA94;PDFIfjdqd z^DTS5(;!`8XrgC!X>+Q3JYPq7vWYByiSFEHXPiqZA3V5jd*2bNXo{Ssn9eg-UfnHw z*74YtVW+b*wyL3Js8pQkRcGGb@%i!0W-`{{=A7&PKFipOJrRY{i*^L1T~i|E@yhgw zW7upLOzAB#CG?7mA%n@%*yud9$&Pfp?#v6`q-z)QC4K~-b>ya&Rl*}iJCe*bdH0#- zm@*6YCev$Fwy3KCQTcX-TmIyg@t17s;bMo}q+zyQ)>bQfbQpZU3F| z@sjAX)0oevv)zz7=%275O3BP+n_0D3GFnQ%n?&pAP*k<}e%Ql{$D~$6kkH$pWKG(Q z!IwwOoQNsPs)&AFJ=10>e<}JJIx{slr9K~P2CH^Q+^7FEd2~b>CypOso=r~Ix(``> zW??Ad7mg#cTe}Xkj?(ZF7Ns3c^?>zG=zg5VYlA4uot}J)=6$-pJuF}O9New;Px$+^ zu*(1)^vLIKg##TBmkw=XVc(pxwA`;;!vQtft%|8xjxVya^J~%Gh6iEW*!u6C(Y?-$ zRdaiH{RKm8=UFO?g?Y-!^HpX8gSQ{gh|M|2jM=x*;)@SlrO6!`4LnQTPtW|Gke`8P zyw4dZgBy|tY9xfeLW^TVg>{L2A4XjEtQf3Al2#eAJi`_%)^eI#(G8vafL~mTK4(Sn z(N$~NoB!Vy*)?8IT3<2nc0*ZY5bJ*ily}rMc9&RL64kk^o=`vo-lMRor$;t;~gkRLzGGCT)D07Z>@mT{b#Rt@<%fBf@oU zSSwvK1Gc`cz~_5gMjs;l*3w*-_c}y`Fu!k}MSvC#7p|UfMdDcBbw4krFMKssz5&-6 z?#)gLpHcguX8XY2VhVrvd-kyZYZd(nvfruW6)AFKm>#x1$;i;Z&iJ9zoB`v9M1~Uk z9#ha551IwYYc4={cBWzGuQT29gwA}NA+QXb&7v&HM3CVc8_Ou(79QUuh!MF47Z-12 z)Xlb2K#TtUPIXyXIJ4)s?y4@OFec+orI@Ii8V3R|T1H0gO0s0M&pNJI+1b(q9Zugpq1z9fY=^8$@ zq1B}z+QZa6ePU(`;+4^>#WtoW%95@s&r|-sgRmh|`k;Qp^{b&sQhR<`n*}3XU1p!B z9zv6T%KzsDAlM||6%Q)7l#7>@CjoG6gg!C}&Vcaim3V&G3cICpX{>uBJx+B80gh1D-7yV` z?`bgorYcZF*!#?Ou2d6YqW4~8?%rEj7fp09e#85jK;UrLc#yf#-c@;Wlbt!)$Tian zXmSjfjIA|Aosx^h5vd-_ON_@oE;qKI1FWn{uddXTr&If;oVi^EeQyqQTpp~7 z+ZK3>zQ*NrUmdR6eGSy0gl4!hXZpe}G!?H-u)AlAjrg>7Bbs~0rRisAZ@$&YDO9;q zZA~%W?CsA9YLr`FEiz8a_~8vk7sz6Z*d1EJf;c)#sFu|&fi*1CGSm;nMjnZa_J4l> z*PM)i-v-w`G5nNxJZ8eA=TF=fr*&>mGK+q&3NC51`u5SMUCd*&!ByW`vJB+*gsaz5 z5#%_aB9VKbfzNWV%U!Ox0^xsZEUw2FrnzNjcB5;C4N?mrFm~XoMu>Vk^aGx=)+^ zrn01#*@i;0y|tb!bCyEVq&&8&^jpt>qgs^C)K%+vNNI;*BehSH*FUddO;b8ecnQhA2#5 z!S&5Ax9aJR!ln7BfL^bYBJyK?^|=Clz=V&Vm)EI*-;mw})Kj3j^$=2JAWa7xVxh~* zZOtyF4bY1$Jd}LBU6Gdj^Aiwl9wSQ5gs0~aQI}h4$EPTJF(V&e>l3C=H=K@ zu97ugdAa?>OZLJ*3y5SeLMW;02>7bKvzY^;Ku#0z)epoL_|<*|oi>O)9)wcxl+)RB zY@?J_AGLJlzP4Y92%H7TduQ$~e$Jg+_dMcO>r51lPfD`ZZM7HZaiB7M!$9U&p%sG} z$gc>#GH%=ddMRgGKH`AGRspn(^cm?272aZ_UT5zL4+TW{W<#5tI{9@*KiYL~e||VT zviHUus`Odz_G{h!TE{Xy{tUBe+n#J+d$`hYd~zI`W?>iFIM;>Z>3+*;z1Ukl2%+?Y zakDPixneI7fZn~|SGHNKXmri2hWbi99&`OMvvF0v*HO}WjdSW)J3el}rn+tL7CY0myIXm;wJdb}6R&fU|Wnv3>(+-CQJ%h?*m^;Wl| zg#$i!o|EzF<%`lp;abDhe@W??Ho*$-r&0uFPPmV(p$AJEIi3#}Axja)pE_SJpbtzV zvS@(ams$#jlM_?`%#-IJmsnjzyWqC`B=qCILs=SIYW+|?GX>Gtl~u}VO25yGN`(x? z%9>dvUcqD0KoJnLq*`{cVreRE7<)CKADeayc`3 zK1-4|1O#wmv4NNEl+xHI+_7~Xp(Xipj>6V6<#HQ#sKb8WRO_Eg**v@9v-?G6%S@lH zuF!{|?U-%PY$z-HnksVIT5AleSYDkX9>^VGBAWcb`r1!Y2d7f^p?MT%n^wR2kgh*f z1YC+wL^N}_P!3wJ?pEOjH{aEc=fS4VB@#TwhJ)1b?E`7mi7_~X?}OF*(3?HRWMU(~ z#H~sJF%S7GQiBNNKUmggxJ#JS4b`;d??Qj;Q%REbb!YVXm3Z^9J_Ob3m5apC#SZv? z&T#(}a3Yyu3?aS=2;2J0-NP)RHy=SOKc-Wcaw?kMmjR8s!8JWFMHPcLoCJ%=dXIS0;9X1uRUczZ`oTHC1 zWT}GKGQp8=VjNIK_|4x+Xb1m#N6|4lV9+KMmCoeC$dA1VpU1BAUW#OF6BaqJDpa~W z(#a$Vd}@G;$hPcn=1z^gmH6)^1irsMGX>zqv+KaveO?BVb$K6dx-Pas{nvYFdhod{ z?;d>R=ap(-LeAbnqvu%*hs#_PgjBh{k=+pGR_HE8R(r{QV{v>{6`K*%VMJ+~I1)IxDD^r{x(MY`!D z+r_(&i`Z88Yg4E8hqMgb-jc&tNdHF{3KTm1C@3rR`fY;@?`rTRoqBp_m#AdgD2-~N z+upwIF*^OqZZ%MphTpTlUWNtltTn#PohzjK%eqJu4o5$jg^NYcm2LBse$B>rW2VZ= z@^PVAWEN`VQ=Q)CwX=`O``^6Pd6A@#SV$(XDrEPfI6TVsBIpv_E~E zJKR#EOqHtccxcm`t4N)b>1}P+^cUUEygL0Wy$+VL(W9NNLLx~$UhWNBD%>$Io-4X8 zPxwv!@T=ktp)xVfHxEN4G=L3X*4C3}cTKTe>!=uwA)p7YeE6C%PxZs>&!{Gozdvy1=;4kEWE7bhfQDYAG$sxOujtcs;p{UjfyH?L2 z-!6Dl*I_FBye~w+r4~ttwB88WFk^aBxCR!HW#lvEhYi#0S3+JbE9%B0Xy5f(4>m~ig$#dqZlupGZK#dlgC4fh7~f%0 zIQ=g5D|c|w+&-tBmH`QbbyfshkB*P#rP~o7435iv;KuCl>w!zjm8cm(lD)Q3#0%%T z^M~e-o5jutLq>%A8k%Uk2120zB{kRu-0lIs0bHc=HaTe}aB#zx?f5{7!VQQ97#N@f zy!1#fK;zxYXwA;%STqFZo4b(G6ec(6*0}~bPnAx`r~&DyMtGEIc5SDM5CbuBtiMJg zKF2{J*RoFb#*?%OEAO$CiwKl~jW>gK@OT4GZZ0l5E^#wC*$WGJc8ose8?;wq03u!t zzrsyDx_I<=@3%?T6-c7K%3DvJx@@GxKJc%*Me>`H&>XkiFnK1NX3u_rsRMr&*B3`* z0=;0q*LdBA_bimjUT_)vZjE=kLThTlz;#!Gz<)6X&!ut_@>71SB#q>r2A0}eU$Xi( z;)2ZH+9ncyEB%! z;prAWp6flR%GzYNkvnewY2UL?ndZLIx>#nOd4!m?dslv$pSsYQL143m=Ab5b&y!Wq zr%@x_jc!`T#32=sRA)M-JGxXG<@d*ViIY&rEIxks3~b-?=&6}$rp3E~TVw7p9+J*b1% z60MVP%Fd1wFwSdbG*4B@4r}BN&Z*F04KWD|4=?&%qml@w|2b6&eHqh6V&2Z+DJ``E zeBXGM>98bY#j1^u)bcNKmUEYrJt(JWrVWd)ZE&-y5T&tysNx5jQLi(Ptho`kL<`^0 z&WX2e!Q?egaVlryMK9MNMlHLNwc#7g&oaKaBWhc^74#{ucPB(@-&|Py_af(%w>wys zTim2g`NbZGvb`g>MbLAaH_d|FHde=j!yC$#2Y)G>g3g(JSyv2b%ZaEFKIu| z55jIpt7pF`y*tz8v0WLDH=SIVpQT4Au%W;;LWt_* zi;lwf>-2%|?mLxOG;a$+BhI=X-zj(8E{^|g@?(9NOVES*qs)5LJ?4#$45 zzVx-y#$ktQclt``6T~hwhUSUZZP^t#`Q3H* z0Dgd_Q(kW`a}|}`zUwrBM9;>-uABw~8}H&_}F&Y4>%v!1A!&3k>gWw#`SSaF1)*;m*M%PD6Yegjf#0 zczvTmoQ6+wyRBQpQW)vxBtejefu`w+xsOe0;W#O9Cbr#v^UV8 z&oAh1QT8%BH&@F0ng!g?>0##nSxXs4TN}`4YP%Dxohd+9E^z{90Kx9aH$HN1qy$>* zmMt{+K6|Z6!rz*e|b2F%_ov&m5*Mr9X=L3O1o|i<^+>o^rtuYgWRK4j@N(?^@{`N*w$jR($ z5|hQZ?9q&d67niHr)toBAKi+gh|)8aB%wyNL9^k>hU=}6mkX}v3&Wa-;lh|7uBx=2 z*`Yv84qHdkqv$DJ*eK0q0Sb(tvzyAf*-cJX7EOBdK3zQB(n;yUI}t-~4;4#j=R^2j z13^}JP}D|^W4?9LhS?)FNr@q1U5jpBo{XMc^5-TbU1iAhVY(Bg6_f{Z13~tiZl_Fx z@)e#H^n0WMUOuB=a7eR#YAaUqlbh%y9ip8&3v$dav5~VhZCvdNvdQlK)aC4Sxwi7T zdtYB*kMXuufw#|1Wu^)#&B>Q$VuirV^!d<_NrYWmaXRcbb-c(mYnhA(S84;Ezs1R+ z1~ZBxF^larP?n5!bAazk8yG?wZ~KO_o28E?FLZdVnYHc=nN* z(^QWS1Xl3f&^OC#)BR{As;zd5p-E?1=WsxO04*huZzdy1IG#6%s!LY<4v{@_Tj`gh zcDq3#cMY%`O{taiV$elt{-5?rR_ zvg<&HnpeD@rnk;l+f#OqT5~?NT4oi@DG5n7&$v|p)oEE1f|dHixeD%S{DY zD|$)8*HIn|Oiv-qR}dDp$uDKa=0v?aBST#<$N ztOCkx;1&R*rv1#6agHjuH}(L((l3ONA$Hs5D6*41g6)GB9PkCgqwBi&@#DTfM5(6MD6E_fOUK{?0n82c;`(wVkh(I!g%Ki85r z?owLTgsS3bi69g?Y}+$!k1-30C!+qmD^b$DSvy3n!3xL(T-h|6Zq6!iNBxNhEt!NItrg|DpaN~G0v|jx;fW) zvtdKDm^x*cMJj&@v7}Mn85O`;+7-PaA(@)=VumY~HHSc0ndP@>J||vBGp+Bkc~86f zry|_uBSU$Z`AG+ZrAU6)U(isUYv%VRTu^_!Xb>g@wyi8O7n*Lzr2%%bPx?#s_#QZI zW+R=mOr8WIA@N#@EwZsj={@M*jwwXMCL6z(c~`1|)rCX~&z?si$@*gp@-ppRO^J!3 z)L0)Qyi@1m1{;G!FZWi@W)ZQ|v~1-KvpC#0tjK;@8EHyo^tZZ3n(t44y4nQqVPnG! zHAr@MewI*$)}Dg*cl6E)qqeAlYv1}dhTXBm9X@LX95Fo@gSokd8b>$9?z4hs*O-l( zA?cvWwLl#%{CEsR=KI2+0~UwvQ&v{lVvVq?pP`^(MtjgACUp#NV z!~x~MksOK9;ky2e?dd1Mnx z!s!xM@j$u%l3sle`SUPA<`&*e356Z>IOclhwAsxzEk>Eqc2C+_lB zYJHj5jdqderwBV6y6Iu}hevvaJZv{b@1sFNK~3ZFfpLwT14wnYmC15rImE~(O!(oB ztC|NUcyXyLGS4vIC>#mr_B>2&0*k9Yt#j+yvKUHNsR|ZU@>8^{=EOo}I~eqb=JXL1 zk=g$lcGCr_u{iK`HdL+jUAEbVJ_QJb1tefBSc_fL*w z6SaPiYj}Jn>QUxenyO6tnAx5e+`3J@UaD2B;fVva>)}WCF8Q{me)S|%wl!VvVbJl?nyisoA+_T`2FFn<>&Jl}Jp$SBLF^d&-j`^~)RdHx zzZ>dHT&I0ZeE2NsGFbL||GwD7vc4OjrLVbFpw)1MZ}?N}%?NflO%ELgp_^foh!8qS zWL(fsBO$$;{)ZT&VHyry$m3vr)97XecND`rui92iS>ff-U*$woc*>JS#o3O& z{EH9g_=L(f%`k2FfWAVnQvt0<*J$vhftc$6KJetwES)xy5}TIGxxc)$1$crHBFQS5(y72l7qa~btON=UavcaQz9f{-~*zS7e z^S~D)u%*%lo4vd?RTiY443)`GyvXRIo%lfMwwdR*ALTAQpT_T<%0Hf}>amikPyc|- z>IQGp>QnMN`oeBVa|Ai z>&)^DlK4Q2y<;M)6R+a-E{!VsZEpSB-D|39jLP9lVXG%lIEcR5$oPUSqTa~oG2acX zG1KYwBUazO*oQj4g*#2A)j{A7FE>#Q8# zKpLT%GjnL3F+}0q5YAWkz31!Nn1l_a36}l@XK~D8VFli--R_;4Y0i+rLwYgf$FBRy zW(avNzob@+VuJkY?Z%{rv*Vz1+IB4|T!*p&yQ2#!XFY7cP9i-hp$Q>QPj6tqFVnJJ zDkA)Rx(e|!F0vV7bMzyr-XwV|5i$Ge04?%1i(#sI?*pjc=C~6(qnl>K7wYruo7nmb zV^Tz#^7N#6y}}7BKTv0Wnmb!)c$%0WO;SV{`229>-Tdgb3!}5E?j*JASfCA(6Nv*$ zOZ2?H=$#VUsTdMfcfkSQdU%C?c!qQBCLT`3`WQ4z2D zid8K;-U41rxm62A+ggTx$uGJc^XkRqWW6(lcIP;@#xK1ho_1S!C-`$bzo2WD3Y{D3 z5JT*hL{YWjEJEarKiZ>t$QuXa8dxOJ@U=q*1GuOm4x2tWHnYw4`5Q#z#U{d2Jwu=1 zV`cwNoj8dc<5-Cx@{1hfuwVJUgK z?O0V1FCI1t+juJAJ^vjN$L6_J?Njb@O}LImQ?DPKQ3)SkDCA4UM*J}K@nZTuLyMiese!maiJ|qZl;ild8YhW8cy3{t?Z}zwSau(h zyFO!g49EP6;7??r!FQC0H3fwP>ln7O!Aae3t@>ep^~&x6}&e*XJcm`ZALoIY9Is1b{%=eOji=XUhI>SZ|O?{vc6eJ3#` zNPTGtiD?>V(G$C9D4=-8Gi#Rzqxd_b(!QF~T0w++$DS zJ3R~ioqG0Nv4hdXwm^*&-VjmK<11F*^~U?Jrv3Q&QOEESy~;E}WwCj~v6zXdshl^d z`~%(XimKSFI)HvQd#ozHW4l-OQiAne~F&n-^)bGKA=MfqbX&@{?LSm9hM=Bbf zkH-GLP6iq^f{6GxV)~+G8L=+X;N)muc8x0i#6$wtdG*T(wn(i`l=8|Tl87CV+VZ`w zu_c@0jJ|30%L2I%s~VSldCS{$X~?-GT}pru&2rPmLQRQJ6c!)A)59OPz7wH#kbYDGl`ZFxK*;Pupkwa4EN-xO*)|^{2aME zhy$5}b6!4{D?Gx1Z4INYs6<;GxR^%t9>%iW#0=BL$Id|Vox)WXfkm6OcQ^MN^p1TFu2hB5=2Qh( zSI4a(1t(R7sQ~Tid?%%{z->7+t~^^psI9>rHhh4D8TwloG0WY1BxkE;0X@Ak7nS4# zQ;gflk}86c(D^dn=OrZkhA1jj-oB4+jIWm*AuxL525-8@M`IJQ5a>IgEL}Lmf&50a zAu7qLA)CUgL65FPPwx{Y(QE*vpQD}o56B{ab^jzrEsc85$WO#^=qL@+@ z(|BnnXHOQNB0@&P5$m7qj+Y?DKeh`e&G$O`Vcrw?irvKcRQjkvcm0O>5 zr;CaT6%`@iC;TttBdP@Ro6CT3#pyradUu%4_=GiTxhMln1XFrppECti9;H`eWkE|w zQI*ec=1i}vTK-NZy=Xr%aND{?;JyCMu`C&26&h;3WYlP)Ujt}hIF(x=!j!ncji z&lL3NI$h)iPjc~btOnY&e-0JD^XTDM?rK`+(%`h09uyWcj` z26_275Fc(e_O4xn4*XCY?Ul1~0KHc}KKd=^me!7779ZKBM#A)*9v|(A+M{i=58JZ9 z$Kd2LTT96>A|nbss)#?%&4Bi-Dm(Qlc|w56IO&f)*55l9ZR-+mi#nu;P+8Dpgq)0i zGP(J%^HR_}XI|D!zj=Bq`H(~TFNJ>6H{}tNT(xL8<==M%L<|>UhwnZg3C+Z~=*>3_ z)A)Tz3hVB(#4E~BMF7D%;KGkKEeR%@riS#U9*@N! z5G-q>B0`pS2|Gz}}|RoT8$Z=#YcZ3JTza(#F2 z$)S1){B5`Xggjs7N_vUYb~q{paJxb!fJ#lboGi@{w_J0?pNqBG7fs}#teT@9;}HGe zi~^&ot@|c>2`}?LZ!LB6r{?sWt=#y#y}cgTDfjDUC_Ob#uC=c)d3*a01@+~p%P`=B(VYy_}Jsb3wBSLyNpOM{;G`RFW}eY6 zoZ;~a)OF|e&Ifi65l)bDdFGDVAEbxe#c8!DD6nx91hXffX0EDm*RB8+4S-SBBIXx zS@+9F_3{w{^HTZO5P6Q#xt2|;{7W1fW4`otHt-e_jb1_e>8{-(hX5XdS zK{FBp*9m52|7JS6CJ_lKUi3OOqx3Y&)$``~Vq|)ycpf`5F8>s*h7*k9JweEnKYh!h z(?cUk+4B!{4%+a2h*pfQ-9YkvE9Usq#(#v9O!@7?%r3a;lSxA=JemRXcll&XS4HQVALe?_Nrs+zpMxJCW2*Z{4} zr;v)7u0#gA^~p~mTZdb{AJ4a<#<;LU!l#djaXmV^ySAD;D{m3rmjZad`hH^8OQm!wabWeM2FnVu+rq(4qDjX-dDc^ET*ddkK5G$n0kDr@s9} zRnz&xR-74Hz>k2zB#adLWS6c7knY!-MpcCX`j4{4g7JR7=k>>w1+A0o{3|aOil2CJ zQ&0Ta$?p2m2#=#mzuaqf>GLQ4t!_$3QY=q$XH>K9ImEN^26TyU&4{=PR&_O@vFT-< z+RQ3iy!E7)k+j_#w^g%+zx2PuG;2ziymmfX@?K?U@rOxlb3Z(xCrFs--`_53d^eX2 zk?elj{{d=5BS}A=ow{?3ETX(ut=fsbM%`f!c-QoW*LI~so&SqR{#movj8K7|266Ys zXB8g`#SP;&f^Di>ncw*N7%Q#2WC*Fgm!AGd-gYPraC?4xwUjc5Ags!ewUVzy?G4^ z!)Sny_gfDTq1dEvy>6zmelP<$-NSKF$`vY2_-LhAg1;l7O zq$sxYkY(l)JQR#2f;qowm5?ib{#Ftjd*D{u->WERI2T%_p0uj4M_&ZVTRc}|TjQv& z@#lwFL)5foXQB^J`5u@{p~ml=d5xXz^!TE1FPA}+#dU*IL%#-5P@<$sJw7^+9}*O#0Y{nBQ)=7qfA$C5O?vQU0U zmhg+mxd@GfUNj|#-{t&GrEY6R(rdlC)f|~I-WS0pJ9FwHs?|Prr2)~ZFHC)2tm>g? z2}tx7qLV+p{cGO(Noya`oBN?-Ah^{lr*~pG2D${N{PR~%3#h(Emvd0?6hAr_Yh~M4i2-)ywpw%G8C( zu~m0R6Un%h31TH*MTdP454gD!7hg+-=L6ioE%nlLHlrZ>u(pFVQGwG1$L)h< z|EU9cC?k^MJF#uvq@uR^ciwPC^8E2&(Ze@#DBG>Z~`+kBNr^0R!4d{1j zC#e)skg(%&VRDH(rejTn*DE5nVDy%Yzz0MsTo@^W2k$Jh#g$YCaDLe;5UrnuW@x%* z^Pp(P#h0%Q2Vl1%yvH>%vOsPbW6|N66_1uC8^1xXFg!86ITKQB!1R4|ay$rN2QT@2j_3{JL&-r3OZ zNBkLSt`rKg*L!8irb2x^`8|peX84SPg4!)^#b|57y}hn1a%SeNT6uXeWZI={UEiJj zxZ2=ydhfFpoDnEcMhBD*+YvO_GAAIn&8RN)N!L{2K5^p;53x~?(_kX2`F*XEtzN_K-nzsi5~HJnu?eK86KKoPb|#u|QXq26kDp}n zA^aOk#mpMBVNLMIeBozowY zEsgq^iXS_<$K^eQ?-|?B8AhS8%&!ZuLz*ZpUMToh$Wq#*QEkY!>K4{!#abeFA@U)T z7o-wH;mhbVB-B7aCEASmL)p+<)mGBGr#ZOtZSEX~SiIQuU6gtE%hYr_-ukSH;1Fp# zPi}-YB(F@PeEM*~29-xntMUQT8WX>>b2zG0E}H=FEt>2%l(f$6kUQm3JrCaG`c+~~ zY3&?si6CbFIso*AV5&whUvWp@AWe3lfb;HC8J~};yA8%9ba?~bT?A%Re$5~1_%&Da z)-2LMN{Jq%S*2e{i00N;^QEOu6)~%yVKz_F59uzGV{VT&z~Xwv74ZFB-r_o8xsD#f z$DxLOpD*g6gdjE!}vg3scKt3#>Om-Utw& zUCyfM&_Uv=KJZ(6Iz((?&yNS>DMj)r!`A%YtOubQ%TH}spGzHfb*{y-VBxk;1#l#J zkomu5K=ctA-Q^CA-_(!DdLty`H?aK7kO(&8wdxSkt7<>GIh=ZSua4}JN{glY+y~|m zT;_(H>?CA}@W<;oGq=~G4MkF}kvg4pjv`Uzy-JuwBkjuTakMf(#IzkNo8S-sM(&%T z^3Z;&4<{gIRPl7=d0PK4g8#kU$rv#KvRLDW=yuz$eBVFjE5e^j?&djCU{jQsoAR$C zy?+_r7WW4aMXs+^~c{h2o2sWR$7MDL9c7TD3Eqf27yrVyGI@#v!Cvij?TJ+jzX z0zdP2ZM~vxXP!o+Bze%efZg?kM9C z$NW^_Qgv)H$GBhX3{PFmV^;uvVEpoJ{)BB*F=pRqIP?guL1C@}-{aNBX!kq4GFbLN zT)68cVR0uY@6*k`NRcYzn-2>WRt%PgnH@Ey8YY81GQo8cx(r0OnKa$osTm4B<|gBw z3D8(@-qhqeB7^WrJT5oK3UI?8KxScNeq?CTbWO(Nf~@T8m`LxCby2)PVp7$dQr4e ztTicAgCd;m)qAe5S|_)z$}g404-YHgZ~p050CI}ii)K%gq!V23ey%uQKpGBzNx?)p zQ<|K%4XITY9z9{e^B!!$bd6UKu-fk)7_ZQ zF}4abqRVki8f@#QQB$i>-&)sS-xI^`M?@nNO|2^5bwj8qsj{L$=F#_e3 zye0q{!XP+nI>MXnUrfPQiv>0bFTL`t161sg5ai^+!c&)Yk1|Bgp!&+^QOmEAkEiWM zf^!&2Lj>8$^N^UkAU!p;e0E-9%wnxxbk*3O^Qb<7Ens2AEx?YnzkkMZG4`V})##k* z!}XzbEZvuiY}0-Lpu9(5+p_H#g%p2YT5B-rR9?m17gpZ;vF7jBYQ_l)BlVW*L-p%t zT{5i3odq>*U&$lRvJVJbL(|FLlVE46)|qT|8Hj*&Hc`_rC98BNqaJTBO#mcA*wQI)YNh!Wh z)alAz9DxMa=acfh_dAa#1oDH83!GabZ}W!v9Jpq$`?EoIu|vkw9{{DoZsK?vtl)LrEq8gd`5A2$xsSQ3}5Di&ven#=ZSrjJFM zMfw}lnP0&>4b#Q3pdmewCJIx%Vvzw&?m2RDL{L+9C1x^%PazAZ9t;iaHXJz|nlR1b z1r%uHI{$FzAz*$O{hSz<(I2$4K~UxGL+R*1IsS_u4_AFkcAm{LGWLi6sirjI1=3q9s@o~*5GRdNh? zpysOQ4s~^Uooe&3p^%TYS;ZS+bSU|TkFSr1#zJ^xXq2}X@g=C22R_yDgH}U`m6?tB z+@oMlmH8^O=O+M%@1DOrnj?q0JOSuwA;k01OK6bCDtpnYSu8SdTbyik`@6RhDk}F$ z^GUmBf4Nnqlk4`L`(^i3IT8*x>0uD^@8KYVvgqjI$stohP!^`KKf5LQ(A0^Aag@>h zw;i2|(J(o*bkfX;&Q1I(<4e(1>11MLqFZ$6y|37G?MOsbctl8}=%f-%ba)>GJF}D? z5O=4divy$vR=Wk$1s&It=nf`_IkX9`=T)%{sD&;rtUbmOY;aQd1={kK%xqqQK_y>9 zbGJ9OEHUL~l65?#<9tI53Ajs9_M54R+D4y^d zMi16sfH9f@9wqOg)T<4{<8D5L@c9)vzhv$}Os**Cb8sbcz8Q78w5h8=I7@Pz3KrN@ zdTeupH$$W|n1%Lz1F||;`W5Mxe&MgJy(yxdVi!X-)O?fitUct)JsnIHRwMUfl28v0 zY7rmgX;Z)n0?zPQ^-L<&te2c`Od0fPVu(RRhJ7Ib@WsI9>UIr22VL(WH>-)8Af}c7 z!*O$f^VOlzN3I=?B}Y3?C~hvUy0Kfpv$G3$cv6gQU_eis(b1`O(4%OIpw<*5{`O;x zOG+NkOHa%Nw3;JXH;e^cwr7X17G?3|-3gAT4#k}Se%`Gkhv^R_5vEqqR3Ejju_m7* z?V(53hpO0xlxmN2!Dpd1Mp2%2w~1ca_qCvAQo)3TASOx?4{xrfZ|gfc?z!$I?8ioA z=m!0s`S*&UMEQocMM#ydC(W!hn%Dc!?knr)mLV*UACf!VTo945b(|$glfX8vf-R{H z-+{!FJ21tEsjz%Xk$}lSm5=Z_=>o?1pTYKh;uF-cEWc5ke)yyj3$MCy#OtQdp|#~M z;-nUSDMkG(z%IdS^2SZTAuf?u*BIH#v&~ziS9hKNni;Hbq)YY_6a3zItF;(;WZFZg zsjGT!bDvsaqnK#SX(wgNnLKjRcsSExehLSs=V_b~U2&)V`R;6Ib+?)W#8WGdPW*a| zBZXK`c8yp(Io|dn6ldE;z2%h30(8}u!ie}sstI7{Zr{xE9L7sSvu048=J0#vk~i89^A0^bsiXRXdD)X zPIjBa`5nlRw|%xR81pCdm0E2k&|Qvcwl1fG0@nRROoM2yD=6`nBeJi+%8lXhk<0^2%`K zvjaDqxh?wVQpJ9@P*IfsxutnhV4`?U9}*Z)KOhEmT`Ctmc3^=~J)Zq^vj$&T@jC{Y+5{Zb#=rxBuE}MnwYS8&V^ofa*;k&ufaf!o|_fc!cFI^uSDn~|` zj*dXZ6$k$4dplaHy^*W)n<#;(l^%QxEu@22WH#*6-YI*ha~sf4QzIhr$Q@Xl$**=t zIaa;Ka11r!Or+Bt`ogNR*fDR&sj88%yihaWA@ug!V-w@wvW2w1_Qe+oBbqW@n? z1v9Wi0HLEs=3uvcm4J4bFo6x0%PvBvU}_2%q@;)^5#0fY{%A;VY-=<>k-J}?&AX-> zsng_WbA?C_?pB4(LrQ+?>-3eN#rVqOa3~LpeL*EzjDSJLbxkrtnZp1#Y4V76Saont z`3N)Ee?4A6@9{0T!V`6S*zEDd;}9pC;vrKn+o%K`metr10f2A0iO`$UMB;+c+f}S1 znNhiPMT^v_%51dI8Hu&4JFic%Jek2k!hUS#vlB-64Y?(#BjrJ;L<2lmRlQ5* z`#>&&FqEE1oIx^c2`xrh04p+I7ZtMH0I71C#20fHWYPqjxkbu_UzJ5SJuHfhm+!A0 zpULIj=o6pVV!!4GM*2byW-8?n+&#kmV5DoZ_}e>dLGI-ZAoH>j1mG6+x7z zqQ6tN499BA`8B{?Xa&uu#Yr)CV4qj~^B3B;{{oTqC|=7JVb818$*O5ep0WbWGakGlKt>*4{mP=P}_)bJ41TadtPQN zLmSB|?-+}GNF|iqa+KD4J3ZEXudQ7~xmnUlk~S&O$mx~)_2_8pZ4}wj+&s<0Jha?6 zY3=I1CL#~>1JZ=_%RMUhR!sC~+vF5MDtD=+0N!pY%xTz1IVSIIClHQ!7+G;NS8sID zm)x7xROz{#ur&f9pQbdIbul8g`_Cx|a28<5MdXoD&u~xMWjt<#X$Zm3KTf>3-b!dM zP4O|PY;uwhyn6^kpY7qA&|6gum#6Mgck-1 z(l>{r6`8w4>GwUG660Cj1x%=UQP?;%k>N~QaUG3YLSs3nAM9>3By@*~44*^%zQ8Bw z(hRVV|EzrNg9)cLR@E*}pw7<3R+;*=a`@XhW^=jZR9`8jn*Kw>?N>=!1!44wiqyD( zbRQZvq;6cHPDqzWaKbwK8-YiM_HJ~}aG2m>HiuDT5uM04@Ln5aUOh5NhWGD1p7#R2 z&m_JKPT6BhTQ2Ym+U*!|&VJ0Ic7f#ASRRkWXukmhjBB?-8LO2dB$hEfDjXTx9AJKT zB5DS#|A{>U-{2J2-7Bh&abCmxYJ`SGlFD>a{z9< zE4=zhO=#>;_o#%eBsW&R0BZVESQyl0u}23YQy>GWvOmv27wATib!Jgg)q zAQcU2E&YMw>}#0*EO*skMaV~oL?m#pFy`MMN)jYkMrCqcv9LW;x@VT^!T22c<%34Y zrZfr;?E_70Kc2}b$$ESkSC~Ez_W785*y1lsy3%#h2Mxzw&c`;Y3bjg6kXkUVbVgLu zB)3=pYu@jH5~Q2aJ=;UrIM}L{c}zH9_*gaY+Em9Ot3k<)|^ zdl3we=W65Q%I?BZD)TmBLU$pPIpWu88^tmBT{NqCs;m=JSX?vKR6!$qwBNBnZ3T! zj(YlBSF~lrf(3@Fqo9la(k+Kc-w(z;`YEjB^u?vgq+{zv|ERfIy8=w9MVXgEt0b(< zfh%Y0y&{P8GilBM-hlibcIF~By_~>({u8k?vvuBqelk~O5brIQbL8+Zxu^XDs9`4F z@ZqBH8jl2-qSg%Q#kU_~URLqwzF;rCa^*1A_Pic$Ix*s&kzOOOlbB47h($?ve{6{w z-8H{(ysDNV;TmqXRFB@{>5;wxoU4DbmUGhG@8?6l>`){uEZGrg&E76Z-(UiPhVtD= zaUQN4cda^4$%>lR^!9M~O=CBz^4qr&bjU;|@ogzsVT}$}nQD{#naUtz!7f^Sgvu$rm~4QF;%von!%PCZ^pJ9>-98axNSVhfPAd=Y43BtCMN(v)kq3>I>$< z(7BYlcTr_wZsjPKis>+k0h{>kkk<=Q1o-uwAb#P{G*&K?LMNKc@C9RDN03BtQ(@0` z9&V7&M~Od_ggOc+;=1_R#t8^wKs?L?@4Sc%eREDM7}z=yJXmv$4&;#IvzQ{@DwB1O zPc5VM7qv0!|8lmq1^sAa!OzLBpjc+q0nd9;`JMtr&@!|v@Yy2`H9i+9kKhrztT#Z# z*;G6uP{Ou$oTDz%-bm>^_rSr_)kG0aL`|;v}CUI0-h%7xv%^%xI zVM@>q#h{!}%%vV~wP-ttPX<-qrymhpJspaxd1c0|W5Co$We82Kb3l_*`Z`s%W^8%9 z9z!F?{w>eopLvbbip`332Ee(^Vo%q=vNt! ze{3+;Tc}nRt;VY?9S;rM@yg}2-7K)>8|P2hfJ_C;M0DqaKVLppC={(2r#f*%EN0nf ztA%Lk|7E;^h(Va=^%XRUY_WC_$_0WJvbSIrQceZqlHp64O1SujOV07hNBO^$OUmm^wVrE!mb5X39so!2tX72c3m*3yJ%DMyBl~>EF}gw&+mQj$(EULO!d*Q(1|u z2dMXV0Zv0vInnfz81P+)h`D=NVWt+SEU{0s7KV5=GF9d`AJ|pweNi@zfBC(fGe1P7 z2gQ5ep}wzf`rRFj^^85Qg8n-r6qbRAiFT}sMw8PE<<|@vSpQY!eC6AcNZ8NA%_ZHH zh9}w!!*F8~)TyGzX%KuKF1q5r1XqhM=xTtUlpo}c>jGylZhD_XPWPqkW2_uE>1XQk zGzF$U0dK(?3Qr8G9-tEE^H%HUD!X1;cA12LphZRHpI_k{3hWuSJZLp&sr`WK%%87@ zlD&{FQrPbIPwOjgjK(2+%KWR?kYHZH45}UI30UVbXqO;;F4i0gipLRZql0-VU6gLT zK2%C>l{2)Y7x1~16Br+wcj~Sr-#UzwI`R}O1DRw5!7vb!+?*_mY<%RC3rM8bTP7^1 ztSGF^j?uw-V=~Vf{ZQMeSA?aw*0rT(+8J}|koANo69&mez1~D1O$yY@D zT1VzdL$-LqYyp%hi5}uQCkS7{U=b(-XW8|1cw^)-;Le`i<8GReBeC_XwgPGgGhU64 zE72_Fi%&2vL$JC6{|I$6?QQ&pzA&OOr+D9}=-3vzwJywip+s4qYc%PCKdSGaq^$q@ z&nbo%Y*V{^w+AuO7hFkvM#;}~aaW9X{d;xdy2JhqRr<5q?_79u)y3?^j>=DP_tJaa z2o%vn{&C!fmP?1G;m|WyJM+4LR!@2EeyuN$q5RLf*jsuGM3`)d^Ifk4@t7zwI5Q|= zZMQHVBIc{jsgDf2jX2E559MSsvxnAnjd{VE84OB+YzBf8xSQ>GpwaW6G+;~tCW*NC z;e0&9R&e*cxD4e?)_kJ_#!jVpA_q^$<`CtF1E^>rvEcZONm-uQA{DtW+hZiuDv!Lk zuMbB87>Q&?JPWvPyrl}2_kvwNmOzxaRX81$Vq-o2y(Ibo3g2S7WbusECVH)@Wb}59 zq+$1x+J^`9%7%uBol@;qG1HMvL$$BAu_%WI{FEQ2Bc2HfRP99b)aJu&MSXIyg|Par z;Lz1;oGy$Odfjy}TT-9lhwtpUb1RI7+-JUWb*M9prS*@(f)Wlpq#JPi(!*b|N>m!( zSS{4sAs!h-QO8!BWDLT&(9uPbpzvYA8$(@cU~bVovh z(qL1JiL7j&kpcUe>kPSHC45ohHxTT={i?$e5H1KC&`&mU6F70I2O~i!pM~?+@6YUdG z1dVCakKga5BbkMK+6jy%bc^V{E_^VE5;zxYJ<=O=JS8%`NpwQ0%||#7Jic!y8Y}pr z;7v9A`oe*1UcHYtyt{MSgpEST{JwXtTyNH}N@#MXT&5{udQp&k9{yMV>HpRY-hxY* zo?L}&C3w*3U?jYOxE$MDsjgDqe$E@p3a3Tcg*wB4BF8s4j-S;Q2dpcN+T|mk3DFXl z2+~uZ-rr%v$MFlaPz#!AyB zLGU7?Y)N2v>`!umkg@`8qoUw@EtVkKc*azQtC;6RhKdJ86WM+77VsyQGjy*F{|x9i zc>+mp57&w>EzP^L=^k%tq&`Xn`4w6eDh6lJbWshCiy+Pu3`29rBuTm?e4B@OO5lU^ zUNL3b1v<#&Fe_yLdG~fhdeRM}uV>1<(g`1hvi;GM6o``F4|ejKomZX^MX)0u#^>3_ zN&*CR^U)Z3HO0FquB4u4Q_hn|3z$$mM-u@Y5r8<7pTuTfStH%>midgwM@P~7uj~Ea zvY7X2J8ph3#W9!6A;IYrk;*bS%To3ZO7d=6|I%?54qW^LOsR2LdF+o2%{fomhmT(+ zRM3qkeU=czslf?jssf?iviOB}ZX837jr#NRX z?|_&z858XzA_LJEh{7fi4l<3ABLul(&rzeh4z*pXX@krM;^;)Ci&U~DON5l7f+$U9 zNc3J<1L{Ly9+?p%m0C2#xDSRo*maJ7hC?UfZG#o@CWt z;Y7D2Ug1e_aYwkiT=M*Jur&1w*I!g5!(pH;TKpfpMCebX4BsHM2(4Ybd&j1wfuIJ$ zrEODZ?JoQt^i?4SvsFCDqX%R0likSh)BA}UN#_?V&SNAZL4zo8o%_~SJV3S_op(1O zr0p~sIVa=m=t5h>HH_A0g7{N9oMgVW_oqMR*7?MI@Q6*ekkMhJ1KJc zX|@PO`Q8z%M95r!^@9H8C;(d{!Vc53r(VpY2r};1rb-b{qqw??+Z6e7Ty3L1 zr+T&^fnwfc{Yg{9!PsnokD(Y_^tnLz?%ZO#(@jSbGsV~2dkXWxHe)np(sfIOBvxeUip}BP{o<02q;xht0Ay#(R~us- zEj0hQK3)_re6$(q?2;jCQ3+u)9*AR*ilzOWRb1W_Wu_(ngUtk6+3lP;Q7Nw48O1IQ z``;V*zrvukE}^wLkjW{lcglQE*HDYwL#hs>TR>{J(YhrkRtjHfL2u;cyewO&2`i>rN6gJS_ou_f=e&zl&B`R;W*Qs=_=jj*)iY$Y&}z|BX^L1 zOFKZsBA(zWAx$r=GF2)Cq#oyPnoWORxy}C+DN3u=P_^OFQ%_0#ztzsa`}A$;?YAWy z@I8TVeizLAVp&cv8k zYvR{#+c0TE}!O=jUXFC`cptlpJg&8CNd2RXm%) zI>H}65YvCk>hl;(AeV*xPBJH1LBtpCUnJ+hzR-W<9Q*~|a#CV(0?A2FsN_cJ%#98w z+pT<(8XtQ%9GTes*q<9yUcQXaK+H`ZdP1wrd6GXZHj3Zn(DZE&V+Z4AW&t<9pkG@B z%6`GhHMV%P8ig#ev^qg<6S&|?B_d7k6 z+hFCDi*|+}wB#q|AUMEAB$Og3k#T`+KJu6RwGZ0xpywhAQ;$ zPKo~wFd$r4^2>i->c1Z6C?tqP#Q0u<=^MQb&j^2Ad!(4|CIJDa72_@b;U4L6d1igu^twJ z=C+r(Pui3HPWCPdD|fRNstZ1bPP#hHKPDCTWLu51%ilwe6Gz1#h+UklM$`DJ%xA4) ztNz$qwO={$y;Py7Fpl|OO7G)m%5~&|{BZVSl%fii3l%@mypzQ2BSq@cZ;s_r|4@w! zCo2scGA?G1n?Mb>%UuP0@QGcT9S(TINK%p(l?$WrJLWgxZ`ADqa75bEsxrKh8#v(( zSpnqE6x%}^k;X%@EG%{ow;hNV50>g+6&PgLH-8&hWPT588YorvXV zIQ80Dua61x7NAiLr(7Fui(++cUOVWmccd3~AC;!yGbRWm55&{$XbuKZtP#Laf7Rg` zUm!VXGJd*8zueLB7+zQA!%&Inm_4@G!;<+;sF6cu^OYNm|)7 z;QQ|g2loPwz;@ADkw%qelzXbn_Qm*fk9OL@!xU5!lTDPQ`afwQ+GNpS1en(s026Og z&2CR4m78CZl*~<4XFvhqx*^>*uM7l19WFPqCU|Q#ejs%pf<-uMjHp zJjAApRqV>H`a?OEi>jc%p+i%{rD8vdv}tDWuWT_p=Pdg$8X*et3W0>W7p)aa z)d`4bY>!Pjzy97gPagZVMVEp=QjQw*jgu3~U@{0390_}J<4sxHib|c7!EjFYR_@lX zEog35wu)Vx=S1!Hf)V^28UzNSCBpW#z{JP0fl|y4D>fQ^-^Z6+?-RW)?{ASuva8K? zKAp%q4c3QUcZJuRHSObDCgCXk@nu6klG*13EF7p1(}9XLSf&>EvnNF z^AX2vK(q{NmCC|(;2yQDx4=0Sk(=lDD%{g%Qx(w7?Djc!M_ZeD8dmv$XMOV>jo!1; z%`d6l84WAYkes*Q6AjJxnR!BD?{wlzwCcKd`WF%vJ5<`3fp~!UzKWf~Ik}H4IZfTC zJ*3Qx+#1oQy4wD-E0r69KEFR8nhacL+}E(ZgoYNtFR*9(9htB7k$!d@h4w4WWVvxC z7S0jR_dLctBNH+-a&})U6Wdgs?wthJj`fITJUnmE6F~y+7O8r@ZEOSQ#n8*R%&;}u z{p4-4ZeP$zN7Egu$xMkg9>N^gbgoiBhU4aUA!2(^boXa5Zrj@mGm(v+*)czY6!I!Q z+qdRe5iR&cCn?YFer0Z(4sTO$+Db;-ght^p-)c)X|1`yM21tF%IiIi?`}uO)9dcAo z++`Qy99Cq3^k_&~Hs6_k8BuwI*dl0eR(LGq1W5?zh&bkXNk26`LyrGxsUHqz&N*J^ zBj7DjJ_#P&W5Mr{X!t{Rx7_W<3+*e6xRC z6nEgz{ENHw8>a!p?eN?;LqdErEY4xlo7`QQU{=%ZT`1YzFZ5WuBVfx?x1he&CKMC# zf90^yWOj$Wv&7%O=gp4vO^$WwmT$V8quL6R4-{V-0m0>z`yue>x9Vh?liw|W+UA?v zn$OfHNMg48lIJbUbA?--NJ~j6l*p}dej@CzmVdQ>y$@3DT5UT(9Z<3?MPwkoupm+rJq&j(!A5L`smqH9*lxyRdZ|%;Md&GgKYB4aEqni@7iQW@p7*?J zFmQ_-TS$z4t7}88ybBKW{_GbbdAPk;Qoahwo8j5=OX0Dcw~09TXk2?*n3?rD)(M+9 zub}tLGqJFR?7s=wr?)(r{?4I+h7va4YH>N~HweC6YxlXlBhZ-$jLatW@OQ){0^7Bu zZWr6xw)WZz>=e1rGC(~deaO*4JekF6OE`!|5yE+rs{^bN_esZ(RJ6zQ(S3vW)Bri< z(+u8`gQQtd|ON2*g&RFOn~h4srCyeZr{lO9XZPk(ap z%z#$dc$WYtQ%RgWF-GYl!hikbO};zwEgKtz`5Y zAJh~BVq#*z_KFGi34>v5r&biP1Pgir2rAkKYlA!#M~gz`8FG=3@hO zOM==!XE>R~CMT)9Mq&<2+l3JR+etZ8*4!YruakMhraTVE!EDLWqZhrag)Zsta>fnh z=3OmM50f(`YRNSo9+D+$xtSPm%aPe?NZ2aUr#yUW*~_z`qRW8GR-+g4<6Rekvo5w%Fi&oP z)ZyRtlF}17)Ac3pZFLnumc!`iTgq)z3-!L*JA2;kA}qG|pT6pbLg2SG-ThOh%Ab5nRTvtZutH<7 zK14YiO*^AL%`n!7g%&Qd-NQUM+N`VwS`NMg5M-@H)WDJwHQ?E6_B zW|!7J$9!Eq3mc`&klkxY0u=my@_ewRMCwBI`s5VHTY&T_ConOU-Y6}H(*x_YNJu|P zy<$4#1?c`{HrtY|^pl!f;3GQmj6>P7?AWq;bxXV>Wr-DsnS46g$+>D?j=T-BLir3qFX_>bI9|?f=X=Irx1QR|*{FBWhFMK^PB*fh{#Sbd z9&j9R--esZ^)cD|N3$!sEHx7btj=@54nR)nRkZWt^V7pjc(1kiTRi+hH1} zi->4Z{T7#AHG<#y#d08-qg-jqADwtlo1M6zvp8EP^L%Ttu!ZHUl%~pN z?CN@=G2-OX-D^$bhyAvdp9es zufV60hsg)MTvjpyEbi6m`j&wEG&_44Gn+w~w8irDY4KYd$Mx>`sdtQJsXw8yKxBUN z`JDleE&FRVI1Q>lzk-bp&B3PUJkTd9%MJ00N2rWcoV#UTj;K<_#`Nhork5>`^M^HR z3Yvyj30kG5iwHNmd@OwG=R-N*N=533nFu}49`pSK5SvE-z)Ry<-XFsZ)tSL~biRWh z-BeaQUPRc~8J{m0srf1d;ypA%#5pc*#@La$zMZ0W5lblFE54JO(7@3ijp^w>oa;Y4 z*&fT-@#h>bMsTs|!P&BrfC!W7@;ydPHa!RjVE^of5&k!*{`UZ~KDMFVX~_ zRi)`;zDahtPD-^pkgeg|2JOvkNKm7=zdd_m@d*{n{)j$R#}1(CS2dqro|e?i$h_|y zi)SoTPR1)JN5}W_XPGL|IKz82*)pIu-b6L%J+mdw;@&oUY`6HH(8E0LO>HulDs@KP|ldF3V!#C3Z19Mkt-mJbA_zVBHIV?&${o&4Qno?E&OG ztvnN*a!SAfEEIVNpkZdlQlNz0o@Nrb9cd(o8=C!-DsnZ;mWOz3E|Nf<(AalImi_7{ zoIsBt<5r_yz{&NPUMH#DP9GwO0P*r9nP$*r=lJEZGKTCR$|}9ukQ=X)S&J4OT`+p6wz}J!qR%^UW9Jsg91g!tzmtG>`pSf` zx0_%#uei)&vx<63qQnwCmg88gF^u^l)KJTK8)u()!TG*

    y3U$b{;c93gR;)rZ- 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ΞM%yi>AA1c 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

    @xU20=^IXHn1g?= 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

    2h%1o?y>kXy!{rB^|wotR45&2}YaFHSA_x0qj@* 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 ^D&CrEgv6|VP+Oh2}{jW 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 -These suggestions can be directly applied within GitHub without requiring the author to copy them to their own local branch. It is easier to: +These suggestions can be directly applied within GitHub without requiring the author to copy them to their own local branch. It is recommended to: - first apply the suggestions you agree with via GitHub - then update your local branch with `git pull` @@ -133,3 +133,5 @@ Once you have finished addressing all the comments from the reviewer, you should You will only be able to merge you work after getting approval from a reviewer. [CABLE-repo]: https://github.com/CABLE-LSM/CABLE +[github-commentPR]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/commenting-on-a-pull-request +[github-feedback]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/incorporating-feedback-in-your-pull-request diff --git a/documentation/docs/developer_guide/contribution/review_guide.md b/documentation/docs/developer_guide/contribution/review_guide.md index 0309b18c9..146a47bc8 100644 --- a/documentation/docs/developer_guide/contribution/review_guide.md +++ b/documentation/docs/developer_guide/contribution/review_guide.md @@ -9,23 +9,42 @@ All contributions to the CABLE land surface model will be reviewed before inclus - the proposed changes are correct - the implementation of the changes follows the design of the CABLE model and will be maintainable -Once you have finished the implementation of your changes, please make sure the description of the pull request is up-to-date. Ensure all the required test results are either linked to in comments or copied in. If you have performed tests beyond the required tests, make sure these tests and their results are described in comments in your pull request. +Once you have finished the implementation of your changes, please make sure: + +- the description of the pull request is up-to-date. +- all the required test results are either linked to in comments or copied in. If you have performed tests beyond the required tests, make sure these tests and their results are described in comments in your pull request. +- the automated checks pass. Contact the @CABLE-LSM/admin team if you need help understanding a failure of these tests. +- all conflicts have been solved. Once you are ready, [ask for a review by `CABLE-LSM/reviewers`][how-ask-review]. If you want a specific individual, you can use the same process to choose that person. ## Review process +### Review response + The reviewers team will try and reply to review requests quickly. If you think your review request has been lost, please ask for an update as a comment on your pull request and mention your reviewer (with @). -The review is likely to be an iterative process between the reviewer and the author. As such, it is appreciated if you, the author, is responsive once the review process starts. Make sure to keep discussions polite and courteous. You can reject suggestions from reviewers but the reasoning has to be explained and the rejection has to be agreed to by the reviewer. +The review is likely to be an iterative process between the reviewer and the author. As such, it is appreciated if you, the author, are responsive once the review process starts. Make sure to keep discussions polite and courteous. You can reject suggestions from reviewers but the reasoning has to be explained and the rejection has to be agreed to by the reviewer. + +[To incorporate code changes requested by the reviewer][how-review], you often need to incorporate these changes to your local repository and push them to GitHub again. It is possible for the reviewer to suggest changes that can be apply directly in GitHub. We recommend to: + +- first apply the suggestions you agree with via GitHub +- then update your local branch with `git pull` +- apply other changes required by the review locally to your branch +- push the fully revised version to GitHub (`git push`) +- and finally [ask for a re-review][how-re-review] once you have resolved all points raised by the reviewer + +To better understand the pull request interface for reviews on GitHub, please refer to [the GitHub documentation][github-review]. -To better understand the pull request interface for reviews on GitHub, please refer to [our quick review guide][how-review] or [the GitHub documentation][github-review]. +### Merge approved submission -Once a reviewer has given approved the pull request, you can merge it. We prefer if the author of the code changes merges the pull request as that leaves them a last chance to change their mind. However, the admin team will periodically merge any pull request approved some time ago and that has not been merged. +Once a reviewer has approved the pull request, you can merge it. We prefer if the author merges the pull request as it provides you a last chance to spot an issue. However, the admin team will periodically merge any pull request approved some time ago and that has not been merged. [coding-standards]: ../other_resources/coding_standards.md [doc-min-req]: ../documentation_guidelines/index.md [tests-req]: testing.md [how-ask-review]: resources/how_to.md#ask-a-review +[how-checks]: resources/how_to.md# [how-review]: resources/how_to.md#understand-a-review +[how-re-review]: resources/how_to.md#request-a-re-review [github-review]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests From 8d73f908aad63fe382b3e86bf844402daad00a67 Mon Sep 17 00:00:00 2001 From: Claire Carouge Date: Wed, 15 May 2024 15:51:53 +1000 Subject: [PATCH 21/85] (#186): few more edits --- .../contribution/resources/how_to.md | 4 ++- .../contribution/review_guide.md | 33 ++++++++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/documentation/docs/developer_guide/contribution/resources/how_to.md b/documentation/docs/developer_guide/contribution/resources/how_to.md index 8abedfd83..68cb6a135 100644 --- a/documentation/docs/developer_guide/contribution/resources/how_to.md +++ b/documentation/docs/developer_guide/contribution/resources/how_to.md @@ -92,7 +92,7 @@ To ask for a review, on the pull request screen, click on the Reviewers menu or ### Understand a review -Reviewers can either leave comments or suggestions during the review. All of these need to be resolved to finish the current review. The GitHub documentation has more information about reviews, in particular around [comments on PR][github-commentPR] and how to [incorporate feedback][github-feedback]. +Reviewers can either leave comments or suggestions during the review. All of these need to be resolved to finish the current review. The GitHub documentation has more information about reviews, in particular around [comments on PR][github-commentPR] and how to [incorporate feedback][github-feedback]. #### Suggestions from the reviewer @@ -123,6 +123,8 @@ Comments to a specific set of lines look like this: It shows the specific lines commented on and the comment from the reviewer and it allows to reply to that specific comment. +Changes arising from these comments need to be applied on your local repository. + ### Request a re-review Once you have finished addressing all the comments from the reviewer, you should ask the reviewer to re-review the pull request: diff --git a/documentation/docs/developer_guide/contribution/review_guide.md b/documentation/docs/developer_guide/contribution/review_guide.md index 146a47bc8..add34911a 100644 --- a/documentation/docs/developer_guide/contribution/review_guide.md +++ b/documentation/docs/developer_guide/contribution/review_guide.md @@ -1,6 +1,8 @@ # Review guidelines -All contributions to the CABLE land surface model will be reviewed before inclusion in the model. The review process is intended to check that: +All contributions to the CABLE land surface model will be reviewed before inclusion in the model. The review is intended to ensure submissions to CABLE are of the best quality and integrate correctly within the CABLE's code design. + +The review process checks that: - [the coding standards][coding-standards] have been applied - the documentation is understandable and follows at least the [minimum requirements][doc-min-req] @@ -9,14 +11,20 @@ All contributions to the CABLE land surface model will be reviewed before inclus - the proposed changes are correct - the implementation of the changes follows the design of the CABLE model and will be maintainable -Once you have finished the implementation of your changes, please make sure: +## Final checks before asking for review + +Once you have finished the implementation of your changes and before asking for a review, please make sure: -- the description of the pull request is up-to-date. +- the description of the pull request is up-to-date. - all the required test results are either linked to in comments or copied in. If you have performed tests beyond the required tests, make sure these tests and their results are described in comments in your pull request. -- the automated checks pass. Contact the @CABLE-LSM/admin team if you need help understanding a failure of these tests. -- all conflicts have been solved. +- the automated checks pass. Contact the @CABLE-LSM/admin team, through a comment in your pull request, if you need help understanding a failure of these tests. +- all conflicts have been solved. + +## Asking for review -Once you are ready, [ask for a review by `CABLE-LSM/reviewers`][how-ask-review]. If you want a specific individual, you can use the same process to choose that person. +Once you are ready, [ask for a review by `CABLE-LSM/reviewers`][how-ask-review]. If you want a specific individual, you can use the same process to choose that person. Using the reviewers team is preferred as it will spread the workload across reviewers. + +In most cases, asking for one reviewer is enough. The system allows asking for multiple reviewers, please use this feature will parsimony. It is often easier to ask for a single reviewer first and add another reviewer later as necessary. ## Review process @@ -28,11 +36,13 @@ The review is likely to be an iterative process between the reviewer and the aut [To incorporate code changes requested by the reviewer][how-review], you often need to incorporate these changes to your local repository and push them to GitHub again. It is possible for the reviewer to suggest changes that can be apply directly in GitHub. We recommend to: -- first apply the suggestions you agree with via GitHub -- then update your local branch with `git pull` -- apply other changes required by the review locally to your branch -- push the fully revised version to GitHub (`git push`) -- and finally [ask for a re-review][how-re-review] once you have resolved all points raised by the reviewer +1. apply the suggestions you agree with via GitHub +1. update your local branch with `git pull` +1. apply other changes required by the review locally to your branch +1. push the fully revised version to GitHub (`git push`) +1. [ask for a re-review][how-re-review] once you have resolved all points raised by the reviewer + +The reviewer might ask for a complementary review by another individual if they think they are not able to review all aspects of a submission. To better understand the pull request interface for reviews on GitHub, please refer to [the GitHub documentation][github-review]. @@ -44,7 +54,6 @@ Once a reviewer has approved the pull request, you can merge it. We prefer if th [doc-min-req]: ../documentation_guidelines/index.md [tests-req]: testing.md [how-ask-review]: resources/how_to.md#ask-a-review -[how-checks]: resources/how_to.md# [how-review]: resources/how_to.md#understand-a-review [how-re-review]: resources/how_to.md#request-a-re-review [github-review]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests From d8b5538e159691f66edf0b7eb6b8a7492d24541a Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Thu, 16 May 2024 16:06:02 +1000 Subject: [PATCH 22/85] (#186): simplify language (review) --- documentation/docs/developer_guide/contribution/review_guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/developer_guide/contribution/review_guide.md b/documentation/docs/developer_guide/contribution/review_guide.md index add34911a..3b6b1faa0 100644 --- a/documentation/docs/developer_guide/contribution/review_guide.md +++ b/documentation/docs/developer_guide/contribution/review_guide.md @@ -24,7 +24,7 @@ Once you have finished the implementation of your changes and before asking for Once you are ready, [ask for a review by `CABLE-LSM/reviewers`][how-ask-review]. If you want a specific individual, you can use the same process to choose that person. Using the reviewers team is preferred as it will spread the workload across reviewers. -In most cases, asking for one reviewer is enough. The system allows asking for multiple reviewers, please use this feature will parsimony. It is often easier to ask for a single reviewer first and add another reviewer later as necessary. +In most cases, asking for one reviewer is enough. The system allows asking for multiple reviewers, please use this feature sparingly. It is often easier to ask for a single reviewer first and add another reviewer later as necessary. ## Review process From 38e2a64a861f8b109f38f54de032950ea398d34d Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh Date: Mon, 20 May 2024 21:34:48 +1000 Subject: [PATCH 23/85] Update content of pft_params.nml options under User Guide --- .../docs/user_guide/inputs/pft_params_nml.md | 218 +++++++++++++----- 1 file changed, 157 insertions(+), 61 deletions(-) diff --git a/documentation/docs/user_guide/inputs/pft_params_nml.md b/documentation/docs/user_guide/inputs/pft_params_nml.md index b95773bc5..08e9d0bfe 100644 --- a/documentation/docs/user_guide/inputs/pft_params_nml.md +++ b/documentation/docs/user_guide/inputs/pft_params_nml.md @@ -1,5 +1,162 @@ # pft_params.nml options +In CABLE the characteristics of the vegetation cover are parametrised and generally remain constant throughout the simulation. These **vegetation parameters** in general vary by **vegetation type**. +CABLE supports tiling of vegetation, i.e. multiple vegetation types with specified area fractions for a single location/grid-cell (also referred to as patches in CABLE). +Altogether CABLE considers the 17 distinct types of vegetation cover listed in Table 1. +Eleven of those are plant functional types (PFT), two are generally unoccupied, and the remaining four are not vegetated. + +## Table 1: CABLE vegetation types + +| Number | Type | +|--------|----------------------| +| 1 | Evergreen Needleleaf | +| 2 | Evergreen Broadleaf | +| 3 | Deciduous Needleleaf | +| 4 | Deciduous Broadleaf | +| 5 | Shrub | +| 6 | C3 Grassland | +| 7 | C4 Grassland | +| 8 | Tundra | +| 9 | C3 Cropland | +| 10 | C4 Cropland | +| 11 | Wetland | +| 12 | empty | +| 13 | empty | +| 14 | Barren | +| 15 | Urban | +| 16 | Lakes | +| 17 | Ice | + +The CABLE vegetation parameters are listed in Table 2 along with their value ranges, units, and descriptions. All parameters in Table 2 are of type real and dimension 17, corresponding to the number of vegetation types in Table 1. +The ranges listed are “physically possible” and mostly correspond to the optional checks in the CABLE offline code. +## Table 2: CABLE vegetation parameters + +| Name (vegin%) | Range | Units | Description | +|-----------------------|------------------|-----------------------------------------------------------------------------------------------------|-------------| +| a1gs | >=0.0 | \( (-) \) | a1 parameter in stomatal conductance model. Represents the sensitivity of stomatal conductance to the assimilation rate | +| alpha | >=0.0 | \( (mol (electrons) \cdot mol^{-1} (photons) (C3) \cdot mol (CO2) \cdot mol^{-1} (photons) (C4)) \) | Initial slope of J-Q response curve | +| canst1 | 0.05 – 0.15 | \( (mm \cdot LAI^{-1}) \) | Maximum intercepted water by canopy | +| cfrd | >=0.0 | \( (-) \) | Ratio of day respiration to vcmax | +| clitt | >=0.0 | \( (tC \cdot ha^{-1}) \) | Leaf litter (alters resistance to soil evaporation) | +| conkc0 | >=0.0 | \( (bar) \) | Michaelis-Menton constant for carboxylase | +| conko0 | >=0.0 | \( (bar) \) | Michaelis-Menton constant for oxygenase | +| convex | >=0.0 | \( (-) \) | Convexity of J-Q response curve | +| cplant1 | >=0.0 | \( (gC \cdot m^{-2}) \) | Plant carbon in 1st vegetation carbon store | +| cplant2 | >=0.0 | \( (gC \cdot m^{-2}) \) | Plant carbon in 2nd vegetation carbon store | +| cplant3 | >=0.0 | \( (gC \cdot m^{-2}) \) | Plant carbon in 3rd vegetation carbon store | +| csoil1 | >=0.0 | \( (gC \cdot m^{-2}) \) | Soil carbon in 1st soil carbon store | +| csoil2 | >=0.0 | \( (gC \cdot m^{-2}) \) | Soil carbon in 2nd soil carbon store | +| d0gs | >=0.0 | \( (kPa) \) | d0 in stomatal conductance model | +| ejmax | 0 – 3.0E-4 | \( (mol \cdot m^{-2} \cdot s^{-1}) \) | Maximum potential electron transp rate top leaf | +| ekc | >=0.0 | \( (J \cdot mol^{-1}) \) | Activation energy for carboxylase | +| eko | >=0.0 | \( (J \cdot mol^{-1}) \) | Activation energy for oxygenase | +| extkn | 0.0 – 10.0 | \( (-) \) | Extinction coeficient for vertical profile of N | +| frac4 | 0.0 – 1.0 | \( (-) \) | Fraction of c4 plants | +| froot1 | 0.0 – 1.0 | \( (-) \) | Fraction of root in soil layer 1 | +| froot2 | 0.0 – 1.0 | \( (-) \) | Fraction of root in soil layer 2 | +| froot3 | 0.0 – 1.0 | \( (-) \) | Fraction of root in soil layer 3 | +| froot4 | 0.0 – 1.0 | \( (-) \) | Fraction of root in soil layer 4 | +| froot5 | 0.0 – 1.0 | \( (-) \) | Fraction of root in soil layer 5 | +| froot6 | 0.0 – 1.0 | \( (-) \) | Fraction of root in soil layer 6 | +| g0 | -0.5 – 0.5 | \( (mol \cdot m^{-2} \cdot s^{-1}) \) | Belinda's stomatal model intercept. Residual stomatal conductance as net assimilation rate reaches zero | +| g1 | 0.0 – 20.0 | \( (kPa) \) | Belinda's stomatal model slope. Sensitivity of stomatal conductance to the assimilation rate | +| gswmin | >=0.0 | \( (mol \cdot m^{-2} \cdot s^{-1}) \) | Minimal stomatal conductance | +| hc | 0.0 – 100.0 | \( (m) \) | Roughness height of canopy (veg - snow) | +| lai | 0.0 – 8.0 | \( (-) or (m^{2} \cdot m^{-2} ) \) | Leaf area index of each plant functional type | +| length | >=0.0 | \( (m) \) | Leaf length | +| ratecp1 | 0.01 – 3.0 | \( (year^{-1}) \) | Plant carbon pool rate constant in 1st vegetation carbon store | +| ratecp2 | 0.01 – 3.0 | \( (year^{-1}) \) | Plant carbon pool rate constant in 2nd vegetation carbon store | +| ratecp3 | 0.01 – 3.0 | \( (year^{-1}) \) | Plant carbon pool rate constant in 3rd vegetation carbon store | +| ratecs1 | 0.01 – 3.0 | \( (year^{-1}) \) | Soil carbon pool rate constant in 1st soil carbon store | +| ratecs2 | 0.01 – 3.0 | \( (year^{-1}) \) | Soil carbon pool rate constant in 2nd soil carbon store | +| refl1 | 0.0 – 0.5 | \( (-) \) | Leaf reflectance in 1st radiation band | +| refl2 | 0.0 – 0.5 | \( (-) \) | Leaf reflectance in 2nd radiation band | +| refl3 | 0.0 – 0.5 | \( (-) \) | Leaf reflectance in 3rd radiation band | +| rootbeta | 0.0 – 1.0 | \( (-) \) | Beta parameter to calculate froot (Jackson et al. 1996) | +| rp20 | 0.0 – 10.0 | \( (-) \) | Plant respiration coefficient at 20 C | +| rpcoef | 0.05 – 1.5 | \( (^{\circ}C^{-1}) \) | Temperature coefficient non-leaf plant respiration | +| rs20 | 0.0 – 10.0 | \( (mol \cdot m^{-2} \cdot s^{-1} ) \) | Soil respiration at 20 C | +| shelrb | 1.0 – 3.0 | \( (-) \) | Sheltering factor | +| taul1 | 0.0 – 0.3 | \( (-) \) | Leaf transmittance in 1st radiation band | +| taul2 | 0.0 – 0.3 | \( (-) \) | Leaf transmittance in 2nd radiation band | +| taul3 | 0.0 – 0.3 | \( (-) \) | Leaf transmittance in 3rd radiation band | +| tmaxvj | -15.0 – 30.0 | \( (^{\circ}C) \) | Maximum temperature of the start of photosynthesis | +| tminvj | -20.0 – 15.0 | \( (^{\circ}C) \) | Minimum temperature of the start of photosynthesis | +| vbeta | -999999 – 999999 | \( (-) \) | Stomatal sensitivity to soil water | +| vcmax | 5.0E-6 – 1.5E-4 | \( ( mol \cdot m^{-2} \cdot s^{-1} ) \) | Maximum RuBP carboxylation rate top leaf | +| vegcf | 0.0 – 100.0 | \( (-) \) | Scaling on soil respiration (place-holder scheme) | +| width | >=0.0 | \( (m) \) | Leaf width | +| xfang | -1.0 – 0.5 | \( (-) \) | Leaf angle | +| zr | >=0.0 | \( (cm) \) | Maximum rooting depth | + + + +The CABLE default values of the vegetation parameters in Table 2 for the vegetation types in Table 1 are listed in Table 3. + +## Table 3: Default vegetation parameter values + +| | Evergreen Needleleaf | Evergreen Broadleaf | Deciduous Needleleaf | Deciduous Broadleaf | Shrub | C3 Grassland | C4 Grassland | Tundra | C3 Cropland | C4 Cropland | Wetland | empty | empty | Barren | Urban | Lakes | Ice | +|----------------|----------------------|---------------------|----------------------|---------------------|-------|--------------|--------------|--------|-------------|-------------|---------|-------|-------|--------|-------|-------|-----| +| a1gs | 9 | 9 | 9 | 9 | 9 | 9 | 4 | 9 | 9 | 4 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | +| alpha | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 0.05 | 0.2 | 0.2 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | +| canst1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | +| cfrd | 0.015 | 0.015 | 0.015 | 0.015 | 0.015 | 0.025 | 0.015 | 0.015 | 0.025 | 0.015 | 0.015 | 0.015 | 0.015 | 0.015 | 0.015 | 0.015 | 0.015 | +| clitt | 20 | 6 | 10 | 13 | 2 | 2 | 0.3 | 0.3 | 0 | 0 | 2 | 2 | 0 | 0 | 0 | 0 | 0 | +| conkc0 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | +| conko0 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | +| convex | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.8 | 0.01 | 0.01 | 0.8 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | +| cplant1 | 200 | 300 | 200 | 300 | 159 | 250 | 250 | 250 | 150 | 150 | 250 | 1 | 0.1 | 0 | 1 | 1 | 0 | +| cplant2 | 10217 | 16833 | 5967 | 12000 | 5000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| cplant3 | 876 | 1443 | 511 | 1029 | 500 | 500 | 500 | 500 | 607 | 607 | 500 | 1 | 0.1 | 0 | 1 | 1 | 0 | +| csoil1 | 184 | 303 | 107 | 216 | 100 | 275 | 275 | 275 | 149 | 149 | 275 | 1 | 0.1 | 1 | 1 | 1 | 1 | +| csoil2 | 367 | 606 | 214 | 432 | 250 | 314 | 314 | 314 | 300 | 300 | 314 | 1 | 0.1 | 1 | 1 | 1 | 1 | +| d0gs | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | +| ejmax | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| ekc | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | +| eko | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | +| extkn | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | +| frac4 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0| +| froot1 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| froot2 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| froot3 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| froot4 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| froot5 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| froot6 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| g0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| g1 | 2.346064 | 4.114762 | 2.346064 | 4.447321 | 4.694803 | 5.2485 | 1.616178 | 2.222156 | 5.789377 | 1.616178 | 5.2485 | 5.2485 | 0 | 5.2485 | 5.2485 | 5.2485 | 5.2485 | +| gswmin | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.04 | 0.01 | 0.01 | 0.04 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | +| hc | 17 | 35 | 15.5 | 20 | 0.6 | 0.567 | 0.567 | 0.567 | 0.55 | 0.55 | 0.567 | 0.2 | 6.017 | 0.2 | 0.2 | 0.2 | 0.2 | +| lai | 4 | 5 | 0 | 0 | 0 | 0.2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| length | 0.055 | 0.1 | 0.04 | 0.15 | 0.1 | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.03 | 0.242 | 0.03 | 0.03 | 0.03 | 0.03 | +| ratecp1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +| ratecp2 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | +| ratecp3 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | +| ratecs1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | +| ratecs2 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | +| refl1 | 0.09 | 0.09 | 0.075 | 0.09 | 0.09 | 0.11 | 0.11 | 0.075 | 0.11 | 0.11 | 0.108 | 0.055 | 0.091 | 0.238 | 0.143 | 0.143 | 0.159 | +| refl2 | 0.3 | 0.29 | 0.3 | 0.29 | 0.3 | 0.34 | 0.34 | 0.32 | 0.34 | 0.34 | 0.343 | 0.19 | 0.31 | 0.457 | 0.275 | 0.275 | 0.305 | +| refl3 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | +| rootbeta | 0.943 | 0.962 | 0.966 | 0.961 | 0.964 | 0.943 | 0.943 | 0.943 | 0.961 | 0.961 | 0.943 | 0.975 | 0.961 | 0.961 | 0.961 | 0.961 | 0.961 | +| rp20 | 3 | 0.6 | 3 | 2.2 | 1 | 1.5 | 2.8 | 2.5 | 1.5 | 1 | 1.5 | 1 | 1 | 1 | 1 | 1 | 1 | +| rpcoef | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | +| rs20 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | +| shelrb | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | +| taul1 | 0.09 | 0.09 | 0.075 | 0.09 | 0.09 | 0.11 | 0.11 | 0.075 | 0.11 | 0.11 | 0.075 | 0.023 | 0.059 | 0.039 | 0.023 | 0.023 | 0.026 | +| taul2 | 0.3 | 0.29 | 0.3 | 0.29 | 0.3 | 0.34 | 0.34 | 0.32 | 0.34 | 0.34 | 0.146 | 0.198 | 0.163 | 0.189 | 0.113 | 0.113 | 0.113 | +| taul3 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | +| tmaxvj | -10 | -10 | 10 | 15 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | +| tminvj | -15 | -15 | 5 | 5 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | +| vbeta | 2 | 2 | 2 | 2 | 4 | 4 | 4 | 4 | 2 | 2 | 4 | 4 | 2 | 4 | 4 | 4 | 4 | +| vcmax | 4E-05 | 5.5E-05 | 4E-05 | 6E-05 | 4E-05 | 6E-05 | 1E-05 | 4E-05 | 8E-05 | 8E-05 | 6E-05 | 1.7E-05 | 1E-06 | 1.7E-05 | 1.7E-05 | 1.7E-05 | 1.7E-05 | +| vegcf | 9 | 14 | 9 | 8 | 5 | 7 | 7 | 5 | 7 | 1 | 7 | 1 | 1 | 1 | 1 | 1 | 1 | +| width | 0.001 | 0.05 | 0.001 | 0.08 | 0.005 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.003 | 0.015 | 0.001 | 0.001 | 0.001 | 0.001 | +| xfang | 0.01 | 0.1 | 0.01 | 0.25 | 0.01 | -0.3 | -0.3 | -0.3 | -0.3 | -0.3 | -0.3 | 0.1 | 0 | 0 | 0 | 0 | 0| +| zr | 1.8 | 3 | 2 | 2 | 2.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 1.8 | 3.1 | 3 | 1 | 1 | 1 | 1 | + + + +The CABLE distribution provides the default vegetation parameter values from Table 3 in the namelist file pft_params.nml, including the vegetation types from Table 1 in the top part. +The chosen parameter values in offline cases can be checked against the pre-defined realistic parameter value ranges using the CABLE namelist variable check%ranges=.true. in cable.nml. ## Example pft_params.nml file !!! Note "Namelist file format explanation" @@ -71,67 +228,6 @@ vegin%zr=1.800000,3.000000,2.000000,2.000000,2.500000,5*0.500000,1.800000,3.1000 / ``` -## Descriptive table of parameters - -| Namelist variable| Type | Available values | Default values | Description | -|------------------|------|------------------|----------------|-------------| -| vegin%a1gs | real | >=0.0 | 9, 9, 9, 9, 9, 9, 4, 9, 9, 4, 9, 9, 9, 9, 9, 9, 9 | a1 parameter in stomatal conductance model. Represents the sensitivity of stomatal conductance to the assimilation rate \( (-) \) | -| vegin%alpha | real | >=0.0 | 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.05, 0.2, 0.2, 0.05, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2 | Initial slope of J-Q response curve \( (mol (electrons) \cdot mol^{-1} (photons) (C3) \cdot mol (CO2) \cdot mol^{-1} (photons) (C4)) \) | -| vegin%canst1 | real | 0.05 – 0.15 | 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1 | Maximum intercepted water by canopy \( (mm \cdot LAI^{-1}) \) | -| vegin%cfrd | real | >=0.0 | 0.015, 0.015, 0.015, 0.015, 0.015, 0.025, 0.015, 0.015, 0.025, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015 | Ratio of day respiration to vcmax \( (-) \) | -| vegin%clitt | real | >=0.0 | 20, 6, 10, 13, 2, 2, 0.3, 0.3, 0, 0, 2, 2, 0, 0, 0, 0, 0 | Leaf litter (alters resistance to soil evaporation) \( (tC \cdot ha^{-1}) \) | -| vegin%conkc0 | real | >=0.0 | 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302 | Michaelis-Menton constant for carboxylase \( (bar) \) | -| vegin%conko0 | real | >=0.0 | 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256 | Michaelis-Menton constant for oxygenase \( (bar) \) | -| vegin%convex | real | >=0.0 | 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.8, 0.01, 0.01, 0.8, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01 | Convexity of J-Q response curve \( (-) \) | -| vegin%cplant1 | real | >=0.0 | 200, 300, 200, 300, 159, 250, 250, 250, 150, 150, 250, 1, 0.1, 0, 1, 1, 0 | Plant carbon in 1st vegetation carbon store \( (gC \cdot m^{-2}) \) | -| vegin%cplant2 | real | >=0.0 | 10217, 16833, 5967, 12000, 5000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Plant carbon in 2nd vegetation carbon store \( (gC \cdot m^{-2}) \) | -| vegin%cplant3 | real | >=0.0 | 876, 1443, 511, 1029, 500, 500, 500, 500, 607, 607, 500, 1, 0.1, 0, 1, 1, 0 | Plant carbon in 3rd vegetation carbon store \( (gC \cdot m^{-2}) \) | -| vegin%csoil1 | real | >=0.0 | 184, 303, 107, 216, 100, 275, 275, 275, 149, 149, 275, 1, 0.1, 1, 1, 1, 1 | Soil carbon in 1st soil carbon store \( (gC \cdot m^{-2}) \) | -| vegin%csoil2 | real | >=0.0 | 367, 606, 214, 432, 250, 314, 314, 314, 300, 300, 314, 1, 0.1, 1, 1, 1, 1 | Soil carbon in 2nd soil carbon store \( (gC \cdot m^{-2}) \) | -| vegin%d0gs | real | >=0.0 | 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500 | d0 in stomatal conductance model \( (kPa) \) | -| vegin%desc | character | | 'Evergreen Needleleaf', 'Evergreen Broadleaf', 'Deciduous Needleleaf', 'Deciduous Broadleaf', 'Shrub', 'C3 Grassland', 'C4 Grassland', 'Tundra', 'C3 Cropland', 'C4 Cropland', 'Wetland', 'empty', 'empty', 'Barren', 'Urban', 'Lakes', 'Ice' | Description of plant functional type | -| vegin%ejmax | real | 0 – 3.0E-4 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Maximum potential electron transp rate top leaf \( (mol \cdot m^{-2} \cdot s^{-1}) \) | -| vegin%ekc | real | >=0.0 | 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430 | Activation energy for carboxylase \( (J \cdot mol^{-1}) \) | -| vegin%eko | real | >=0.0 | 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000 | Activation energy for oxygenase \( (J \cdot mol^{-1}) \) | -| vegin%extkn | real | 0.0 – 10.0 | 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001 | Extinction coeficient for vertical profile of N \( (-) \) | -| vegin%frac4 | real | 0.0 – 1.0 | 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0| Fraction of c4 plants \( (-) \) | -| vegin%froot1 | real | 0.0 – 1.0 | 0.05, 0.2, 0.2, 0.2, 0.2, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Fraction of root in soil layer 1 \( (-) \) | -| vegin%froot2 | real | 0.0 – 1.0 | 0.05, 0.2, 0.2, 0.2, 0.2, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Fraction of root in soil layer 2 \( (-) \) | -| vegin%froot3 | real | 0.0 – 1.0 | 0.05, 0.2, 0.2, 0.2, 0.2, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Fraction of root in soil layer 3 \( (-) \) | -| vegin%froot4 | real | 0.0 – 1.0 | 0.05, 0.2, 0.2, 0.2, 0.2, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Fraction of root in soil layer 4 \( (-) \) | -| vegin%froot5 | real | 0.0 – 1.0 | 0.05, 0.2, 0.2, 0.2, 0.2, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Fraction of root in soil layer 5 \( (-) \) | -| vegin%froot6 | real | 0.0 – 1.0 | 0.05, 0.2, 0.2, 0.2, 0.2, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Fraction of root in soil layer 6 \( (-) \) | -| vegin%g0 | real | -0.5 – 0.5 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Belinda's stomatal model intercept. Residual stomatal conductance as net assimilation rate reaches zero \( (mol \cdot m^{-2} \cdot s^{-1}) \) | -| vegin%g1 | real | 0.0 – 20.0 | 2.346064, 4.114762, 2.346064, 4.447321, 4.694803, 5.2485, 1.616178, 2.222156, 5.789377, 1.616178, 5.2485, 5.2485, 0, 5.2485, 5.2485, 5.2485, 5.2485 | Belinda's stomatal model slope. Sensitivity of stomatal conductance to the assimilation rate \( (kPa) \) | -| vegin%gswmin | real | >=0.0 | 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.04, 0.01, 0.01, 0.04, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01 | Minimal stomatal conductance \( (mol \cdot m^{-2} \cdot s^{-1}) \) | -| vegin%hc | real | 0.0 – 100.0 | 17, 35, 15.5, 20, 0.6, 0.567, 0.567, 0.567, 0.55, 0.55, 0.567, 0.2, 6.017, 0.2, 0.2, 0.2, 0.2 | Roughness height of canopy (veg - snow) \( (m) \) | -| vegin%lai | real | 0.0 – 8.0 | 4, 5, 0, 0, 0, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Leaf area index of each plant functional type \( (-) or (m^{2} \cdot m^{-2} ) \) | -| vegin%length | real | >=0.0 | 0.055, 0.1, 0.04, 0.15, 0.1, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.03, 0.242, 0.03, 0.03, 0.03, 0.03 | Leaf length \( (m) \) | -| vegin%ratecp1 | real | 0.01 – 3.0 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 | Plant carbon pool rate constant in 1st vegetation carbon store \( (year^{-1}) \) | -| vegin%ratecp2 | real | 0.01 – 3.0 | 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03 | Plant carbon pool rate constant in 2nd vegetation carbon store \( (year^{-1}) \) | -| vegin%ratecp3 | real | 0.01 – 3.0 | 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14 | Plant carbon pool rate constant in 3rd vegetation carbon store \( (year^{-1}) \) | -| vegin%ratecs1 | real | 0.01 – 3.0 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 | Soil carbon pool rate constant in 1st soil carbon store \( (year^{-1}) \) | -| vegin%ratecs2 | real | 0.01 – 3.0 | 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 | Soil carbon pool rate constant in 2nd soil carbon store \( (year^{-1}) \) | -| vegin%refl1 | real | 0.0 – 0.5 | 0.09, 0.09, 0.075, 0.09, 0.09, 0.11, 0.11, 0.075, 0.11, 0.11, 0.108, 0.055, 0.091, 0.238, 0.143, 0.143, 0.159 | Leaf reflectance in 1st radiation band \( (-) \) | -| vegin%refl2 | real | 0.0 – 0.5 | 0.3, 0.29, 0.3, 0.29, 0.3, 0.34, 0.34, 0.32, 0.34, 0.34, 0.343, 0.19, 0.31, 0.457, 0.275, 0.275, 0.305 | Leaf reflectance in 2nd radiation band \( (-) \) | -| vegin%refl3 | real | 0.0 – 0.5 | 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01 | Leaf reflectance in 3rd radiation band \( (-) \) | -| vegin%rootbeta | real | 0.0 – 1.0 | 0.943, 0.962, 0.966, 0.961, 0.964, 0.943, 0.943, 0.943, 0.961, 0.961, 0.943, 0.975, 0.961, 0.961, 0.961, 0.961, 0.961 | Beta parameter to calculate froot (Jackson et al. 1996) \( (-) \) | -| vegin%rp20 | real | 0.0 – 10.0 | 3, 0.6, 3, 2.2, 1, 1.5, 2.8, 2.5, 1.5, 1, 1.5, 1, 1, 1, 1, 1, 1 | Plant respiration coefficient at 20 C \( (-) \) | -| vegin%rpcoef | real | 0.05 – 1.5 | 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832 | Temperature coefficient non-leaf plant respiration \( (^{\circ}C^{-1}) \) | -| vegin%rs20 | real | 0.0 – 10.0 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0 | Soil respiration at 20 C \( (mol \cdot m^{-2} \cdot s^{-1} ) \) | -| vegin%shelrb | real | 1.0 – 3.0 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 | Sheltering factor \( (-) \) | -| vegin%taul1 | real | 0.0 – 0.3 | 0.09, 0.09, 0.075, 0.09, 0.09, 0.11, 0.11, 0.075, 0.11, 0.11, 0.075, 0.023, 0.059, 0.039, 0.023, 0.023, 0.026 | Leaf transmittance in 1st radiation band \( (-) \) | -| vegin%taul2 | real | 0.0 – 0.3 | 0.3, 0.29, 0.3, 0.29, 0.3, 0.34, 0.34, 0.32, 0.34, 0.34, 0.146, 0.198, 0.163, 0.189, 0.113, 0.113, 0.113 | Leaf transmittance in 2nd radiation band \( (-) \) | -| vegin%taul3 | real | 0.0 – 0.3 | 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01 | Leaf transmittance in 3rd radiation band \( (-) \) | -| vegin%tmaxvj | real | -15.0 – 30.0 | -10, -10, 10, 15, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10 | Maximum temperature of the start of photosynthesis \( (^{\circ}C) \) | -| vegin%tminvj | real | -20.0 – 15.0 | -15, -15, 5, 5, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15 | Minimum temperature of the start of photosynthesis \( (^{\circ}C) \) | -| vegin%vbeta | real | -999999 – 999999 | 2, 2, 2, 2, 4, 4, 4, 4, 2, 2, 4, 4, 2, 4, 4, 4, 4 | Stomatal sensitivity to soil water \( (-) \) | -| vegin%vcmax | real | 5.0E-6 – 1.5E-4 | 4E-05, 5.5E-05, 4E-05, 6E-05, 4E-05, 6E-05, 1E-05, 4E-05, 8E-05, 8E-05, 6E-05, 1.7E-05, 1E-06, 1.7E-05, 1.7E-05, 1.7E-05, 1.7E-05 | Maximum RuBP carboxylation rate top leaf \( ( mol \cdot m^{-2} \cdot s^{-1} ) \) | -| vegin%vegcf | real | 0.0 – 100.0 | 9, 14, 9, 8, 5, 7, 7, 5, 7, 1, 7, 1, 1, 1, 1, 1, 1 | Scaling on soil respiration (place-holder scheme) \( (-) \) | -| vegin%width | real | >=0.0 | 0.001, 0.05, 0.001, 0.08, 0.005, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.003, 0.015, 0.001, 0.001, 0.001, 0.001 | Leaf width \( (m) \) | -| vegin%xfang | real | -1.0 – 0.5 | 0.01, 0.1, 0.01, 0.25, 0.01, -0.3, -0.3, -0.3, -0.3, -0.3, -0.3, 0.1, 0, 0, 0, 0, 0| Leaf angle \( (-) \) | -| vegin%zr | real | >=0.0 | 1.8, 3, 2, 2, 2.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.8, 3.1, 3, 1, 1, 1, 1 | Maximum rooting depth \( (cm) \) | - ## Unused parameters | Name | Type | Available | Default | Description | From 400f550f160d2fae79496067b93f6011b2661be9 Mon Sep 17 00:00:00 2001 From: Abhaas Goyal Date: Wed, 22 May 2024 18:07:02 +1000 Subject: [PATCH 24/85] Auto refresh MathJax on page load --- documentation/docs/javascripts/mathjax.js | 35 +++++++++++++---------- documentation/mkdocs.yml | 4 +-- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/documentation/docs/javascripts/mathjax.js b/documentation/docs/javascripts/mathjax.js index e648674dd..d3f8bf241 100644 --- a/documentation/docs/javascripts/mathjax.js +++ b/documentation/docs/javascripts/mathjax.js @@ -1,16 +1,21 @@ +//https://squidfunk.github.io/mkdocs-material/reference/math/#mathjax-docsjavascriptsmathjaxjs + window.MathJax = { - tex: { - inlineMath: [["\\(", "\\)"]], - displayMath: [["\\[", "\\]"]], - processEscapes: true, - processEnvironments: true - }, - options: { - ignoreHtmlClass: ".*|", - processHtmlClass: "arithmatex" - } - }; - - document$.subscribe(() => { - MathJax.typesetPromise() - }) \ No newline at end of file + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex" + } +}; + +document$.subscribe(() => { + MathJax.startup.output.clearCache() + MathJax.typesetClear() + MathJax.texReset() + MathJax.typesetPromise() +}) \ No newline at end of file diff --git a/documentation/mkdocs.yml b/documentation/mkdocs.yml index cbc5aaab0..e6b60509b 100644 --- a/documentation/mkdocs.yml +++ b/documentation/mkdocs.yml @@ -65,8 +65,8 @@ markdown_extensions: extra_javascript: - javascripts/mathjax.js - https://polyfill.io/v3/polyfill.min.js?features=es6 - - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js - + - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js + # Navigation nav: - About: From 21195f65b64108ed77be19cff02a7367e00b3d02 Mon Sep 17 00:00:00 2001 From: Claire Carouge Date: Fri, 24 May 2024 15:04:22 +1000 Subject: [PATCH 25/85] (#303): increase max width. Case of mobile is not a major consideration here, comfort on a computer is more important --- documentation/docs/css/cable.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/docs/css/cable.css b/documentation/docs/css/cable.css index 4903a8605..ffb331b52 100644 --- a/documentation/docs/css/cable.css +++ b/documentation/docs/css/cable.css @@ -1,5 +1,5 @@ .md-grid { margin-left: auto; margin-right: auto; - max-width: 70rem; -} \ No newline at end of file + max-width: 120rem; +} From 63bd1497b66aad0b982a8f5413cc47f55675e231 Mon Sep 17 00:00:00 2001 From: Rachel Law Date: Fri, 31 May 2024 09:36:10 +1000 Subject: [PATCH 26/85] Defined ncid_mask for met data files with multiple sites. Fixes #306. --- src/offline/cable_input.F90 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/offline/cable_input.F90 b/src/offline/cable_input.F90 index cb9158371..6afad577e 100644 --- a/src/offline/cable_input.F90 +++ b/src/offline/cable_input.F90 @@ -483,6 +483,10 @@ SUBROUTINE open_met_file(dels,koffset,kend,spinup, TFRZ) IF (ok /= NF90_NOERR) CALL nc_abort & (ok,'Error opening netcdf met forcing file '//TRIM(filename%met)// & ' (SUBROUTINE open_met_file)') + ! R. Law (rml599gh) 30/05/24 ncid_mask needs to be set to ncid_met + ! if reading a met data file otherwise code crashes if trying to do + ! multiple sites with a met data file + ncid_mask = ncid_met ENDIF !=====================VV Determine spatial details VV================= From d5acf4222d506ff15d6350229cd73f538991a1a5 Mon Sep 17 00:00:00 2001 From: rkutteh <98803952+rkutteh@users.noreply.github.com> Date: Sun, 2 Jun 2024 22:08:48 +1000 Subject: [PATCH 27/85] Update documentation/docs/user_guide/inputs/pft_params_nml.md Co-authored-by: Claire Carouge --- documentation/docs/user_guide/inputs/pft_params_nml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/user_guide/inputs/pft_params_nml.md b/documentation/docs/user_guide/inputs/pft_params_nml.md index 08e9d0bfe..b57cdea96 100644 --- a/documentation/docs/user_guide/inputs/pft_params_nml.md +++ b/documentation/docs/user_guide/inputs/pft_params_nml.md @@ -34,7 +34,7 @@ The ranges listed are “physically possible” and mostly correspond to the opt | Name (vegin%) | Range | Units | Description | |-----------------------|------------------|-----------------------------------------------------------------------------------------------------|-------------| | a1gs | >=0.0 | \( (-) \) | a1 parameter in stomatal conductance model. Represents the sensitivity of stomatal conductance to the assimilation rate | -| alpha | >=0.0 | \( (mol (electrons) \cdot mol^{-1} (photons) (C3) \cdot mol (CO2) \cdot mol^{-1} (photons) (C4)) \) | Initial slope of J-Q response curve | +| alpha | >=0.0 | \( (mol (electrons) \cdot mol^{-1} (photons) (C3) \cdot \)
    \( mol (CO2) \cdot mol^{-1} (photons) (C4)) \) | Initial slope of J-Q response curve | | canst1 | 0.05 – 0.15 | \( (mm \cdot LAI^{-1}) \) | Maximum intercepted water by canopy | | cfrd | >=0.0 | \( (-) \) | Ratio of day respiration to vcmax | | clitt | >=0.0 | \( (tC \cdot ha^{-1}) \) | Leaf litter (alters resistance to soil evaporation) | From cad3cc9407907144976342366c32709fa41dc9c5 Mon Sep 17 00:00:00 2001 From: rml599gh <126837083+rml599gh@users.noreply.github.com> Date: Thu, 6 Jun 2024 15:53:59 +1000 Subject: [PATCH 28/85] Update src/offline/cable_input.F90 Comment alignment Co-authored-by: Claire Carouge --- src/offline/cable_input.F90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/offline/cable_input.F90 b/src/offline/cable_input.F90 index 6afad577e..c11a97312 100644 --- a/src/offline/cable_input.F90 +++ b/src/offline/cable_input.F90 @@ -483,9 +483,9 @@ SUBROUTINE open_met_file(dels,koffset,kend,spinup, TFRZ) IF (ok /= NF90_NOERR) CALL nc_abort & (ok,'Error opening netcdf met forcing file '//TRIM(filename%met)// & ' (SUBROUTINE open_met_file)') - ! R. Law (rml599gh) 30/05/24 ncid_mask needs to be set to ncid_met - ! if reading a met data file otherwise code crashes if trying to do - ! multiple sites with a met data file + ! R. Law (rml599gh) 30/05/24 ncid_mask needs to be set to ncid_met + ! if reading a met data file otherwise code crashes if trying to do + ! multiple sites with a met data file ncid_mask = ncid_met ENDIF From 43e6bcc9cf7016260b4af5237cef65a8b560061a Mon Sep 17 00:00:00 2001 From: Sean Bryan <39685865+SeanBryan51@users.noreply.github.com> Date: Fri, 7 Jun 2024 11:12:55 +1000 Subject: [PATCH 29/85] Update build-ci version (#271) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Issues in the [build-ci](https://github.com/ACCESS-NRI/build-ci) pipeline have now been fixed. This change updates the build-ci version to incorporate these changes. Fixes #236 ---- 📚 Documentation preview 📚: https://cable--271.org.readthedocs.build/en/271/ --- .github/workflows/model-build-test-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/model-build-test-ci.yml b/.github/workflows/model-build-test-ci.yml index f53802e9d..fe127f243 100644 --- a/.github/workflows/model-build-test-ci.yml +++ b/.github/workflows/model-build-test-ci.yml @@ -10,6 +10,6 @@ on: jobs: build: name: Build ${{ github.repository }} via spack - uses: access-nri/build-ci/.github/workflows/model-1-build.yml@983fb50caaf0fe7e93bb3b13e09e81a7b846f7d1 + uses: access-nri/build-ci/.github/workflows/model-1-build.yml@3c0840d775d8f3d67cfeedb44173caa2682fa27e permissions: - packages: read \ No newline at end of file + packages: read From b70539d59de60e6e7aeed72c3f26e7364b602b7a Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Fri, 17 May 2024 15:46:40 +1000 Subject: [PATCH 30/85] Add missing ;; to case statement Fixes #293 --- build.bash | 1 + 1 file changed, 1 insertion(+) diff --git a/build.bash b/build.bash index b4dd10f8d..0cbb24f7e 100755 --- a/build.bash +++ b/build.bash @@ -85,6 +85,7 @@ if hostname -f | grep gadi.nci.org.au > /dev/null; then ?*) echo -e "\nError: compiler ${compiler} is not supported.\n" exit 1 + ;; esac # This is required so that the netcdf-fortran library is discoverable by From e33ed3e3444f2e1843a2ebfa7ac994a0e42ce1fa Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Fri, 17 May 2024 15:49:58 +1000 Subject: [PATCH 31/85] Specify CABLE_MPI option for non-MPI case Fixes #295 --- build.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.bash b/build.bash index 0cbb24f7e..721a91870 100755 --- a/build.bash +++ b/build.bash @@ -33,7 +33,7 @@ Enabling verbose output from Makefile builds: EOF } -cmake_args=(-DCMAKE_BUILD_TYPE=Release) +cmake_args=(-DCMAKE_BUILD_TYPE=Release -DCABLE_MPI=OFF) # Argument parsing adapted and stolen from http://mywiki.wooledge.org/BashFAQ/035#Complex_nonstandard_add-on_utilities while [ $# -gt 0 ]; do From b4ace3041f34b68f357bd9ec46ffdc31ae8cd0c0 Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Fri, 17 May 2024 15:50:58 +1000 Subject: [PATCH 32/85] Remove all build artifacts and exit for --clean Fixes #292 --- build.bash | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.bash b/build.bash index 721a91870..3be34f392 100755 --- a/build.bash +++ b/build.bash @@ -39,7 +39,8 @@ cmake_args=(-DCMAKE_BUILD_TYPE=Release -DCABLE_MPI=OFF) while [ $# -gt 0 ]; do case $1 in --clean) - rm -r build + rm -r build bin + exit ;; --mpi) mpi=1 From 39ae045acd3acd7d382a1b17bdb9dd9c6a3e4984 Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Fri, 17 May 2024 15:55:21 +1000 Subject: [PATCH 33/85] Rename -j option to --ncpus Fixes #294 --- build.bash | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/build.bash b/build.bash index 3be34f392..2c0d51cb7 100755 --- a/build.bash +++ b/build.bash @@ -1,6 +1,6 @@ #!/usr/bin/env bash -nproc_default=4 +ncpus_default=4 script_name=$(basename "${0}") @@ -16,8 +16,9 @@ Options: --mpi Compile MPI executable. --compiler Specify the compiler to use. - -j Specify the number of parallel jobs in the compilation. By - default this value is set to $nproc_default. + --ncpus + Specify the number of parallel jobs in the compilation. By + default this value is set to $ncpus_default. -h, --help Show this screen. Enabling debug mode: @@ -50,7 +51,7 @@ while [ $# -gt 0 ]; do compiler=$2 shift ;; - -j) + --ncpus) CMAKE_BUILD_PARALLEL_LEVEL=$2 shift ;; @@ -115,7 +116,7 @@ elif hostname -f | grep -E '(mc16|mcmini)' > /dev/null; then esac fi -export CMAKE_BUILD_PARALLEL_LEVEL="${CMAKE_BUILD_PARALLEL_LEVEL:=$nproc_default}" +export CMAKE_BUILD_PARALLEL_LEVEL="${CMAKE_BUILD_PARALLEL_LEVEL:=$ncpus_default}" cmake -S . -B build "${cmake_args[@]}" &&\ cmake --build build &&\ From 42fb97148547f4194ff1c76c648dc79f918dbefd Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Fri, 14 Jun 2024 18:00:37 +1000 Subject: [PATCH 34/85] Add support for short command line options Fixes #311 --- build.bash | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/build.bash b/build.bash index 2c0d51cb7..a140df689 100755 --- a/build.bash +++ b/build.bash @@ -12,11 +12,11 @@ Build script wrapper around CMake. Supplied arguments that do not match the options below will be passed to CMake when generating the build system. Options: - --clean Delete build directory before invoking CMake. - --mpi Compile MPI executable. - --compiler + -c, --clean Delete build directory before invoking CMake. + -m, --mpi Compile MPI executable. + -C, --compiler Specify the compiler to use. - --ncpus + -n, --ncpus Specify the number of parallel jobs in the compilation. By default this value is set to $ncpus_default. -h, --help Show this screen. @@ -39,19 +39,19 @@ cmake_args=(-DCMAKE_BUILD_TYPE=Release -DCABLE_MPI=OFF) # Argument parsing adapted and stolen from http://mywiki.wooledge.org/BashFAQ/035#Complex_nonstandard_add-on_utilities while [ $# -gt 0 ]; do case $1 in - --clean) + -c|--clean) rm -r build bin exit ;; - --mpi) + -m|--mpi) mpi=1 cmake_args+=(-DCABLE_MPI="ON") ;; - --compiler) + -C|--compiler) compiler=$2 shift ;; - --ncpus) + -n|--ncpus) CMAKE_BUILD_PARALLEL_LEVEL=$2 shift ;; From 3a1442e6470eaf2f7039585b5ae4844fca9f5aa2 Mon Sep 17 00:00:00 2001 From: Sean Bryan Date: Mon, 17 Jun 2024 11:37:44 +1000 Subject: [PATCH 35/85] Use curly braces everywhere instead of just in potentially ambiguous cases Fixes #312 --- build.bash | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/build.bash b/build.bash index a140df689..75e3b3198 100755 --- a/build.bash +++ b/build.bash @@ -6,7 +6,7 @@ script_name=$(basename "${0}") show_help() { cat << EOF -Usage: ./$script_name [OPTIONS] +Usage: ./${script_name} [OPTIONS] Build script wrapper around CMake. Supplied arguments that do not match the options below will be passed to CMake when generating the build system. @@ -18,18 +18,18 @@ Options: Specify the compiler to use. -n, --ncpus Specify the number of parallel jobs in the compilation. By - default this value is set to $ncpus_default. + default this value is set to ${ncpus_default}. -h, --help Show this screen. Enabling debug mode: The release build is default. To enable debug mode, specify the CMake option - -DCMAKE_BUILD_TYPE=Debug when invoking $script_name. + -DCMAKE_BUILD_TYPE=Debug when invoking ${script_name}. Enabling verbose output from Makefile builds: To enable more verbose output from Makefile builds, specify the CMake option - -DCMAKE_VERBOSE_MAKEFILE=ON when invoking $script_name. + -DCMAKE_VERBOSE_MAKEFILE=ON when invoking ${script_name}. EOF } @@ -37,8 +37,8 @@ EOF cmake_args=(-DCMAKE_BUILD_TYPE=Release -DCABLE_MPI=OFF) # Argument parsing adapted and stolen from http://mywiki.wooledge.org/BashFAQ/035#Complex_nonstandard_add-on_utilities -while [ $# -gt 0 ]; do - case $1 in +while [ ${#} -gt 0 ]; do + case ${1} in -c|--clean) rm -r build bin exit @@ -48,11 +48,11 @@ while [ $# -gt 0 ]; do cmake_args+=(-DCABLE_MPI="ON") ;; -C|--compiler) - compiler=$2 + compiler=${2} shift ;; -n|--ncpus) - CMAKE_BUILD_PARALLEL_LEVEL=$2 + CMAKE_BUILD_PARALLEL_LEVEL=${2} shift ;; -h|--help) @@ -60,7 +60,7 @@ while [ $# -gt 0 ]; do exit ;; ?*) - cmake_args+=("$1") + cmake_args+=("${1}") ;; esac shift @@ -77,12 +77,12 @@ if hostname -f | grep gadi.nci.org.au > /dev/null; then intel) module add intel-compiler/2019.5.281 compiler_lib_install_dir=Intel - [[ -n $mpi ]] && module add intel-mpi/2019.5.281 + [[ -n ${mpi} ]] && module add intel-mpi/2019.5.281 ;; gnu) module add gcc/13.2.0 compiler_lib_install_dir=GNU - [[ -n $mpi ]] && module add openmpi/4.1.4 + [[ -n ${mpi} ]] && module add openmpi/4.1.4 ;; ?*) echo -e "\nError: compiler ${compiler} is not supported.\n" @@ -116,7 +116,7 @@ elif hostname -f | grep -E '(mc16|mcmini)' > /dev/null; then esac fi -export CMAKE_BUILD_PARALLEL_LEVEL="${CMAKE_BUILD_PARALLEL_LEVEL:=$ncpus_default}" +export CMAKE_BUILD_PARALLEL_LEVEL="${CMAKE_BUILD_PARALLEL_LEVEL:=${ncpus_default}}" cmake -S . -B build "${cmake_args[@]}" &&\ cmake --build build &&\ From 16dbbe3248cb6faaebd679da6340c2d06cc59747 Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh Date: Mon, 17 Jun 2024 17:35:35 +1000 Subject: [PATCH 36/85] Add an "Input files" file to the User Guide --- documentation/docs/user_guide/inputs/index.md | 17 +++++++++++++++++ documentation/docs/user_guide/inputs/restart.md | 1 + .../docs/user_guide/inputs/surface_forcing.md | 1 + documentation/docs/user_guide/outputs/index.md | 1 + documentation/mkdocs.yml | 13 +++++++++---- 5 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 documentation/docs/user_guide/inputs/index.md create mode 100644 documentation/docs/user_guide/inputs/restart.md create mode 100644 documentation/docs/user_guide/inputs/surface_forcing.md create mode 100644 documentation/docs/user_guide/outputs/index.md diff --git a/documentation/docs/user_guide/inputs/index.md b/documentation/docs/user_guide/inputs/index.md new file mode 100644 index 000000000..dbb9dd2fa --- /dev/null +++ b/documentation/docs/user_guide/inputs/index.md @@ -0,0 +1,17 @@ +# Input files + +CABLE can be used in many configurations, in part determined by the input files supplied to the code. +Table 1 lists the various input files used in offline CABLE. A description of each file can be accessed through the sidebar. + +## Table 1: CABLE input files for the offline case + +| Input file | +|------------------------| +| cable.nml | +| pft_params.nml | +| cable_soilparm.nml | +| pftlookup.csv | +| Meteorological forcing | +| Surface forcing | +| Restart | + diff --git a/documentation/docs/user_guide/inputs/restart.md b/documentation/docs/user_guide/inputs/restart.md new file mode 100644 index 000000000..616b06cf9 --- /dev/null +++ b/documentation/docs/user_guide/inputs/restart.md @@ -0,0 +1 @@ +This section will be made available soon. diff --git a/documentation/docs/user_guide/inputs/surface_forcing.md b/documentation/docs/user_guide/inputs/surface_forcing.md new file mode 100644 index 000000000..616b06cf9 --- /dev/null +++ b/documentation/docs/user_guide/inputs/surface_forcing.md @@ -0,0 +1 @@ +This section will be made available soon. diff --git a/documentation/docs/user_guide/outputs/index.md b/documentation/docs/user_guide/outputs/index.md new file mode 100644 index 000000000..616b06cf9 --- /dev/null +++ b/documentation/docs/user_guide/outputs/index.md @@ -0,0 +1 @@ +This section will be made available soon. diff --git a/documentation/mkdocs.yml b/documentation/mkdocs.yml index e6b60509b..a9110f262 100644 --- a/documentation/mkdocs.yml +++ b/documentation/mkdocs.yml @@ -75,12 +75,17 @@ nav: - user_guide/index.md - Uber Quick Guide: user_guide/uber_quick_guide.md - Installation: user_guide/installation.md - - Inputs description: - - cable.nml options: user_guide/inputs/cable_nml.md - - pft_params.nml options: user_guide/inputs/pft_params_nml.md - - cable_soilparm.nml options: user_guide/inputs/cable_soilparm_nml.md + - Input files: + - user_guide/inputs/index.md + - cable.nml: user_guide/inputs/cable_nml.md + - pft_params.nml: user_guide/inputs/pft_params_nml.md + - cable_soilparm.nml: user_guide/inputs/cable_soilparm_nml.md - pftlookup.csv table: user_guide/inputs/pftlookup_csv.md - Meteorological forcing: user_guide/inputs/meteorological_forcing.md + - Surface forcing: user_guide/inputs/surface_forcing.md + - Restart: user_guide/inputs/restart.md + - Output files: + - user_guide/outputs/index.md - Other resources: - Existing configurations: user_guide/other_resources/configurations/config.md - Obsolete and deprecated features: user_guide/other_resources/obsolete_and_deprecated_features/obsolete_and_deprecated_features.md From 29fe6cdb591c1cdaa4379e65907a5bfa0c075dd2 Mon Sep 17 00:00:00 2001 From: rkutteh <98803952+rkutteh@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:52:56 +1000 Subject: [PATCH 37/85] Update documentation/docs/user_guide/inputs/index.md Co-authored-by: Claire Carouge --- documentation/docs/user_guide/inputs/index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/documentation/docs/user_guide/inputs/index.md b/documentation/docs/user_guide/inputs/index.md index dbb9dd2fa..936370a6a 100644 --- a/documentation/docs/user_guide/inputs/index.md +++ b/documentation/docs/user_guide/inputs/index.md @@ -1,7 +1,8 @@ # Input files CABLE can be used in many configurations, in part determined by the input files supplied to the code. -Table 1 lists the various input files used in offline CABLE. A description of each file can be accessed through the sidebar. +Table 1 lists the various input files used in offline CABLE. A description of each file can be accessed through the left navigation bar. + ## Table 1: CABLE input files for the offline case From b22a3e70f2c4c9909f5faf7f983cda62e2c5581b Mon Sep 17 00:00:00 2001 From: rkutteh <98803952+rkutteh@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:53:56 +1000 Subject: [PATCH 38/85] Update documentation/docs/user_guide/inputs/index.md Co-authored-by: Claire Carouge --- documentation/docs/user_guide/inputs/index.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/documentation/docs/user_guide/inputs/index.md b/documentation/docs/user_guide/inputs/index.md index 936370a6a..75c6a8f2b 100644 --- a/documentation/docs/user_guide/inputs/index.md +++ b/documentation/docs/user_guide/inputs/index.md @@ -6,13 +6,14 @@ Table 1 lists the various input files used in offline CABLE. A description of ea ## Table 1: CABLE input files for the offline case -| Input file | -|------------------------| -| cable.nml | -| pft_params.nml | -| cable_soilparm.nml | -| pftlookup.csv | -| Meteorological forcing | -| Surface forcing | -| Restart | +| Input file | Description | +|------------------------|-------------| +| cable.nml | main configuration file for CABLE | +| pft_params.nml | default parameter values for each PFT | +| cable_soilparm.nml | default parameter values for each soil type | +| pftlookup.csv | default parameter values for CASA-CNP | +| Meteorological forcing | atmospheric forcing data for CABLE | +| Surface forcing | information about the surface characteristics | +| Restart | information from a previous CABLE run to restart a simulation | + From 24285354e608ed000feaf8ad3cb95fc60f03da17 Mon Sep 17 00:00:00 2001 From: Ian Harman Date: Fri, 21 Jun 2024 15:45:50 +1000 Subject: [PATCH 39/85] one line bug fix to address screen level temperatures #313 --- src/science/canopy/cable_canopy.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/science/canopy/cable_canopy.F90 b/src/science/canopy/cable_canopy.F90 index 8514645a6..a0fa6fa68 100644 --- a/src/science/canopy/cable_canopy.F90 +++ b/src/science/canopy/cable_canopy.F90 @@ -746,12 +746,12 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima IF( zscl(j) < rough%disp(j) ) THEN - !Ticket #154 + !Ticket #154 - issue #313 !r_sc(j) = term5(j) * LOG(zscl(j)/rough%z0soilsn(j)) * & ! ( EXP(2*CCSW*canopy%rghlai(j)) - term1(j) ) / term3(j) r_sc(j) = term5(j) * LOG(zscl(j)/rough%z0soilsn(j)) * & ( EXP(2*CCSW*canopy%rghlai(j)) - term2(j) ) / term3(j) - r_sc(j) = r_sc(j) + term5(j) * LOG(rough%disp(j)/rough%z0soilsn(j)) * & + r_sc(j) = r_sc(j) + term5(j) * LOG(rough%disp(j)/zscl(j)) * & ( EXP(2*CCSW*canopy%rghlai(j)) - term1(j) ) / term3(j) ELSEIF( rough%disp(j) <= zscl(j) .AND. & From 1872ea5057211c6ed38ce866d44d69e1eb565e1a Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh Date: Thu, 27 Jun 2024 20:22:25 +1000 Subject: [PATCH 40/85] Add a table of physical constants to the user guide --- .../docs/user_guide/constants/index.md | 16 +++++++++++++ .../constants/mathematical_constants.md | 5 ++++ .../constants/physical_constants.md | 23 +++++++++++++++++++ documentation/mkdocs.yml | 4 ++++ src/params/cable_phys_constants_mod.F90 | 16 ++++++------- 5 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 documentation/docs/user_guide/constants/index.md create mode 100644 documentation/docs/user_guide/constants/mathematical_constants.md create mode 100644 documentation/docs/user_guide/constants/physical_constants.md diff --git a/documentation/docs/user_guide/constants/index.md b/documentation/docs/user_guide/constants/index.md new file mode 100644 index 000000000..58e196679 --- /dev/null +++ b/documentation/docs/user_guide/constants/index.md @@ -0,0 +1,16 @@ +# CABLE constants + +Table 1 lists the various types of constants used in CABLE. A list of the numerical values of each type can be accessed through the left navigation bar. + + +## Table 1: Various constants used in CABLE + +| CABLE constants | +|------------------------| +| Physical constants | +| Mathematical constants | +| | +| | +| | +| | +| | diff --git a/documentation/docs/user_guide/constants/mathematical_constants.md b/documentation/docs/user_guide/constants/mathematical_constants.md new file mode 100644 index 000000000..dc3e97b38 --- /dev/null +++ b/documentation/docs/user_guide/constants/mathematical_constants.md @@ -0,0 +1,5 @@ +## Table 1: CABLE mathematical constants + +| Name | Value | +|-----------------------|------------------| +| pi | 3.1415927 | diff --git a/documentation/docs/user_guide/constants/physical_constants.md b/documentation/docs/user_guide/constants/physical_constants.md new file mode 100644 index 000000000..b4344b993 --- /dev/null +++ b/documentation/docs/user_guide/constants/physical_constants.md @@ -0,0 +1,23 @@ +## Table 1: CABLE physical constants + +| Name | Value | Units | Description | +|-----------------------|------------------|-----------------------------------------------------|-------------------------------------------------- | +| tfrz | 273.16 | \( K \) | Temperature corresponding to \( 0^{\circ}C \) | +| sboltz | 5.67E-8 | \( W \cdot m^{-2} \cdot K^{-4} \) | Stefan-Boltzmann constant | +| emsoil | 1.0 | \( - \) | Soil emissivity | +| emleaf | 1.0 | \( - \) | Leaf emissivity | +| capp | 1004.64 | \( J \cdot kg^{-1} \cdot K^{-1} \) | Air specific heat | +| hl | 2.5014E6 | \( J \cdot kg^{-1} \) | Latent heat of vaporization | +| hlf | 0.334E6 | \( J \cdot kg^{-1} \) | Latent heat of fusion | +| hls | 2.8350E6 | \( J \cdot kg^{-1} \) | Latent heat of Sublimation | +| dheat | 21.5E-6 | \( cm^{2} \cdot s^{-1} \) | Molecular diffusivity for heat | +| grav | 9.8086 | \( m \cdot s^{-2} \) | Gravity acceleration | +| rgas | 8.3143 | \(J \cdot mol^{-1} \cdot K^{-1} \) | Universal gas const | +| rmair | 0.02897 | \( kg \cdot mol^{-1} \) | Molecular weight of dry air | +| rmh2o | 0.018016 | \( kg \cdot mol^{-1} \) | Molecular weight of water | +| cgsnow | 2090.0 | \( J \cdot kg^{-1} \cdot K^{-1} \) | Specific heat for snow | +| csice | 2.100E3 | \( J \cdot kg^{-1} \cdot K^{-1} \) | Specific heat for ice | +| cswat | 4.218E3 | \( J \cdot kg^{-1} \cdot K^{-1} \) | Specific heat for water at \( 0^{\circ}C \) | +| density_liq | 1000.0 | \( kg \cdot m^{-3} \) | Density of liquid water | +| density_ice | 921.0 | \( kg \cdot m^{-3} \) | Density of ice | + diff --git a/documentation/mkdocs.yml b/documentation/mkdocs.yml index a9110f262..f310fbc89 100644 --- a/documentation/mkdocs.yml +++ b/documentation/mkdocs.yml @@ -86,6 +86,10 @@ nav: - Restart: user_guide/inputs/restart.md - Output files: - user_guide/outputs/index.md + - CABLE constants: + - user_guide/constants/index.md + - Physical constants: user_guide/constants/physical_constants.md + - Mathematical constants: user_guide/constants/mathematical_constants.md - Other resources: - Existing configurations: user_guide/other_resources/configurations/config.md - Obsolete and deprecated features: user_guide/other_resources/obsolete_and_deprecated_features/obsolete_and_deprecated_features.md diff --git a/src/params/cable_phys_constants_mod.F90 b/src/params/cable_phys_constants_mod.F90 index f0328a6d7..09138981b 100644 --- a/src/params/cable_phys_constants_mod.F90 +++ b/src/params/cable_phys_constants_mod.F90 @@ -25,23 +25,23 @@ MODULE cable_phys_constants_mod REAL, PARAMETER :: sboltz = 5.67e-8 ! Stefan-Boltz. const (W/m2/K4) REAL, PARAMETER :: emsoil = 1.0 ! soil emissivity REAL, PARAMETER :: emleaf = 1.0 ! leaf emissivity -REAL, PARAMETER :: capp = 1004.64 ! air spec. heat (J/kg/K) -REAL, PARAMETER :: hl = 2.5014e6 ! latent heat of vaporization (J/s/m2) +REAL, PARAMETER :: capp = 1004.64 ! air spec. heat (J/kg/K) +REAL, PARAMETER :: hl = 2.5014e6 ! latent heat of vaporization (J/kg) !Below are constants used in CABLE model which are not as yet used in JAC-6.2 -REAL, PARAMETER :: hlf = 0.334e6 ! latent heat of fusion -REAL, PARAMETER :: hls = 2.8350e6 ! latent heatOFsublimation (J/kg) -REAL, PARAMETER :: dheat = 21.5e-6 ! molecular diffusivity for heat +REAL, PARAMETER :: hlf = 0.334e6 ! latent heat of fusion (J/kg) +REAL, PARAMETER :: hls = 2.8350e6 ! latent heat of sublimation (J/kg) +REAL, PARAMETER :: dheat = 21.5e-6 ! molecular diffusivity for heat (cm2/s) REAL, PARAMETER :: grav = 9.8086 ! gravity acceleration (m/s2) -REAL, PARAMETER :: rgas = 8.3143 ! universal gas const (J/mol/K) +REAL, PARAMETER :: rgas = 8.3143 ! universal gas const (J/mol/K) REAL, PARAMETER :: rmair = 0.02897 ! molecular wt: dry air (kg/mol) REAL, PARAMETER :: rmh2o = 0.018016 ! molecular wt: water (kg/mol) REAL, PARAMETER :: cgsnow = 2090.0 ! specific heat for snow (J/kg/K) -REAL, PARAMETER :: cs_rho_ice = 1.9341e6 !heat capacity * density ice +REAL, PARAMETER :: cs_rho_ice = 1.9341e6 ! heat capacity * density ice REAL, PARAMETER :: cs_rho_wat = 4.218e6 ! heat capacity * density water REAL, PARAMETER :: csice = 2.100e3 ! specific heat for ice (J/kg/K) REAL, PARAMETER :: cswat = 4.218e3 ! specific heat for water at 0°C (J/kg/K) REAL, PARAMETER :: density_liq = 1000.0 ! density of liquid water -REAL, PARAMETER :: density_ice = 921.0 ! denisty of ice +REAL, PARAMETER :: density_ice = 921.0 ! density of ice ! Teten coefficients REAL, PARAMETER :: tetena = 6.106 ! Magnus Tetans (Murray 1967) From e2737370738789b30ca401335ca66e8267d38ae1 Mon Sep 17 00:00:00 2001 From: Abhaas Goyal Date: Fri, 12 Apr 2024 11:38:24 +1000 Subject: [PATCH 41/85] Flags for range checks in CABLE vars (#225) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #225 Add 2 flags to range checks ``` check%ranges (0, 1, 2) - When to do the range checks NO_CHECK, ON_TIMESTEP, ON_WRITE check%exit (.true., .false.) - Whether to exit the program if range checks are done, and out of range - the other option is to provide a warning ``` - Checks are being done in the following stages 1. Parameters of `soil` and `veg` before running the spinloop 2. Parameters when creating the NetCDF output file (some of them clash with `soil` and `veg` but code can be refactored in the future to account for that) 3. Landuse variables I/O 4. Variables in creating restart file 5. Variables at every timestep - Redesign `cable_output` with introducing `generate_out_write_acc`, and `check_and_write` - Change the range checks to be done in `cable_write` during `cable_output`. - Make `output_inclusion_type` dependencies clear between group output and individual values Tested with experiments in `bench_example` for `main` vs current commit. ---- 📚 Documentation preview 📚: https://cable--287.org.readthedocs.build/en/287/ --- .github/workflows/model-build-test-ci.yml | 4 +- build.bash | 51 +- documentation/docs/css/cable.css | 4 +- documentation/docs/javascripts/mathjax.js | 35 +- .../docs/user_guide/inputs/cable_nml.md | 6 +- documentation/docs/user_guide/inputs/index.md | 19 + .../docs/user_guide/inputs/pft_params_nml.md | 218 +- .../docs/user_guide/inputs/restart.md | 1 + .../docs/user_guide/inputs/surface_forcing.md | 1 + .../docs/user_guide/outputs/index.md | 1 + .../docs/user_guide/uber_quick_guide.md | 3 +- documentation/mkdocs.yml | 17 +- src/offline/cable_abort.F90 | 82 +- src/offline/cable_checks.F90 | 554 +++- src/offline/cable_driver.F90 | 17 +- src/offline/cable_input.F90 | 32 +- src/offline/cable_iovars.F90 | 142 +- src/offline/cable_mpimaster.F90 | 4 +- src/offline/cable_output.F90 | 2526 ++++++----------- src/offline/cable_write.F90 | 579 +--- src/offline/landuse_inout.F90 | 193 +- 21 files changed, 1923 insertions(+), 2566 deletions(-) create mode 100644 documentation/docs/user_guide/inputs/index.md create mode 100644 documentation/docs/user_guide/inputs/restart.md create mode 100644 documentation/docs/user_guide/inputs/surface_forcing.md create mode 100644 documentation/docs/user_guide/outputs/index.md diff --git a/.github/workflows/model-build-test-ci.yml b/.github/workflows/model-build-test-ci.yml index f53802e9d..fe127f243 100644 --- a/.github/workflows/model-build-test-ci.yml +++ b/.github/workflows/model-build-test-ci.yml @@ -10,6 +10,6 @@ on: jobs: build: name: Build ${{ github.repository }} via spack - uses: access-nri/build-ci/.github/workflows/model-1-build.yml@983fb50caaf0fe7e93bb3b13e09e81a7b846f7d1 + uses: access-nri/build-ci/.github/workflows/model-1-build.yml@3c0840d775d8f3d67cfeedb44173caa2682fa27e permissions: - packages: read \ No newline at end of file + packages: read diff --git a/build.bash b/build.bash index 37b685db7..75e3b3198 100755 --- a/build.bash +++ b/build.bash @@ -1,56 +1,58 @@ #!/usr/bin/env bash -nproc_default=4 +ncpus_default=4 script_name=$(basename "${0}") show_help() { cat << EOF -Usage: ./$script_name [OPTIONS] +Usage: ./${script_name} [OPTIONS] Build script wrapper around CMake. Supplied arguments that do not match the options below will be passed to CMake when generating the build system. Options: - --clean Delete build directory before invoking CMake. - --mpi Compile MPI executable. - --compiler + -c, --clean Delete build directory before invoking CMake. + -m, --mpi Compile MPI executable. + -C, --compiler Specify the compiler to use. - -j Specify the number of parallel jobs in the compilation. By - default this value is set to $nproc_default. + -n, --ncpus + Specify the number of parallel jobs in the compilation. By + default this value is set to ${ncpus_default}. -h, --help Show this screen. Enabling debug mode: The release build is default. To enable debug mode, specify the CMake option - -DCMAKE_BUILD_TYPE=Debug when invoking $script_name. + -DCMAKE_BUILD_TYPE=Debug when invoking ${script_name}. Enabling verbose output from Makefile builds: To enable more verbose output from Makefile builds, specify the CMake option - -DCMAKE_VERBOSE_MAKEFILE=ON when invoking $script_name. + -DCMAKE_VERBOSE_MAKEFILE=ON when invoking ${script_name}. EOF } -cmake_args=(-DCMAKE_BUILD_TYPE=Release) +cmake_args=(-DCMAKE_BUILD_TYPE=Release -DCABLE_MPI=OFF) # Argument parsing adapted and stolen from http://mywiki.wooledge.org/BashFAQ/035#Complex_nonstandard_add-on_utilities -while [ $# -gt 0 ]; do - case $1 in - --clean) - rm -r build +while [ ${#} -gt 0 ]; do + case ${1} in + -c|--clean) + rm -r build bin + exit ;; - --mpi) + -m|--mpi) mpi=1 cmake_args+=(-DCABLE_MPI="ON") ;; - --compiler) - compiler=$2 + -C|--compiler) + compiler=${2} shift ;; - -j) - CMAKE_BUILD_PARALLEL_LEVEL=$2 + -n|--ncpus) + CMAKE_BUILD_PARALLEL_LEVEL=${2} shift ;; -h|--help) @@ -58,7 +60,7 @@ while [ $# -gt 0 ]; do exit ;; ?*) - cmake_args+=("$1") + cmake_args+=("${1}") ;; esac shift @@ -75,24 +77,23 @@ if hostname -f | grep gadi.nci.org.au > /dev/null; then intel) module add intel-compiler/2019.5.281 compiler_lib_install_dir=Intel + [[ -n ${mpi} ]] && module add intel-mpi/2019.5.281 ;; gnu) module add gcc/13.2.0 compiler_lib_install_dir=GNU + [[ -n ${mpi} ]] && module add openmpi/4.1.4 ;; ?*) echo -e "\nError: compiler ${compiler} is not supported.\n" exit 1 + ;; esac # This is required so that the netcdf-fortran library is discoverable by # pkg-config: prepend_path PKG_CONFIG_PATH "${NETCDF_BASE}/lib/${compiler_lib_install_dir}/pkgconfig" - if [[ -n $mpi ]]; then - module add intel-mpi/2019.5.281 - fi - if module is-loaded openmpi; then # This is required so that the openmpi MPI libraries are discoverable # via CMake's `find_package` mechanism: @@ -115,7 +116,7 @@ elif hostname -f | grep -E '(mc16|mcmini)' > /dev/null; then esac fi -export CMAKE_BUILD_PARALLEL_LEVEL="${CMAKE_BUILD_PARALLEL_LEVEL:=$nproc_default}" +export CMAKE_BUILD_PARALLEL_LEVEL="${CMAKE_BUILD_PARALLEL_LEVEL:=${ncpus_default}}" cmake -S . -B build "${cmake_args[@]}" &&\ cmake --build build &&\ diff --git a/documentation/docs/css/cable.css b/documentation/docs/css/cable.css index 4903a8605..ffb331b52 100644 --- a/documentation/docs/css/cable.css +++ b/documentation/docs/css/cable.css @@ -1,5 +1,5 @@ .md-grid { margin-left: auto; margin-right: auto; - max-width: 70rem; -} \ No newline at end of file + max-width: 120rem; +} diff --git a/documentation/docs/javascripts/mathjax.js b/documentation/docs/javascripts/mathjax.js index e648674dd..d3f8bf241 100644 --- a/documentation/docs/javascripts/mathjax.js +++ b/documentation/docs/javascripts/mathjax.js @@ -1,16 +1,21 @@ +//https://squidfunk.github.io/mkdocs-material/reference/math/#mathjax-docsjavascriptsmathjaxjs + window.MathJax = { - tex: { - inlineMath: [["\\(", "\\)"]], - displayMath: [["\\[", "\\]"]], - processEscapes: true, - processEnvironments: true - }, - options: { - ignoreHtmlClass: ".*|", - processHtmlClass: "arithmatex" - } - }; - - document$.subscribe(() => { - MathJax.typesetPromise() - }) \ No newline at end of file + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex" + } +}; + +document$.subscribe(() => { + MathJax.startup.output.clearCache() + MathJax.typesetClear() + MathJax.texReset() + MathJax.typesetPromise() +}) \ No newline at end of file diff --git a/documentation/docs/user_guide/inputs/cable_nml.md b/documentation/docs/user_guide/inputs/cable_nml.md index 204c3b195..b7d2de2f3 100644 --- a/documentation/docs/user_guide/inputs/cable_nml.md +++ b/documentation/docs/user_guide/inputs/cable_nml.md @@ -50,7 +50,8 @@ applications. The following are annotated examples of cable.nml: | output%balances | logical | .TRUE. .FALSE. | .FALSE. | Output energy and water balances when .TRUE.. | | output%grid | character(len=7) | 'default' 'land' 'mask' 'ALMA' | 'default' | Output grid convention. `'land'` outputs land-only points, `'mask'` outputs masked spatial grids. `'ALMA'` uses the Assistance for Land-surface Modelling Activities convention. `'default'` uses the whichever convention the input meteorological file is using. | | output%averaging | character(len=7) | 'all' 'daily' 'monthly' 'user6' | 'all' | Output averaging. | -| check%ranges | logical | .TRUE. .FALSE. | uninitialised | Check input and output variables against valid ranges. | +| check%ranges | integer | 0 (`NO_CHECK`), 1 (`ON_TIMESTEP`), 2 (`ON_WRITE`) | uninitialised | Check input and output variables at certain timesteps against valid ranges. | +| check%exit | logical | .TRUE. .FALSE. | .FALSE. | Behaviour on failed range checks. If true , write to console and exit the program, else write to logfile as warning | | check%energy_bal | logical | .TRUE. .FALSE. | uninitialised | Check the energy balance. | | check%mass_bal | logical | .TRUE. .FALSE. | uninttialised | Check the water/mass balance. | | verbose | logical | .TRUE. .FALSE. | uninitialised | Write details of every grid cell initialisation and parameters to log. | @@ -160,7 +161,8 @@ applications. The following are annotated examples of cable.nml: output%veg = .TRUE. ! vegetation states output%params = .TRUE. ! input parameters used to produce run output%balances = .TRUE. ! energy and water balances - check%ranges = .FALSE. ! variable ranges, input and output + check%ranges = 1 ! Range-checks on every timestep + check%exit = .TRUE. ! Exit the program if range checks fail check%energy_bal = .TRUE. ! energy balance check%mass_bal = .TRUE. ! water/mass balance verbose = .TRUE. ! write details of every grid cell init and params to log? diff --git a/documentation/docs/user_guide/inputs/index.md b/documentation/docs/user_guide/inputs/index.md new file mode 100644 index 000000000..75c6a8f2b --- /dev/null +++ b/documentation/docs/user_guide/inputs/index.md @@ -0,0 +1,19 @@ +# Input files + +CABLE can be used in many configurations, in part determined by the input files supplied to the code. +Table 1 lists the various input files used in offline CABLE. A description of each file can be accessed through the left navigation bar. + + +## Table 1: CABLE input files for the offline case + +| Input file | Description | +|------------------------|-------------| +| cable.nml | main configuration file for CABLE | +| pft_params.nml | default parameter values for each PFT | +| cable_soilparm.nml | default parameter values for each soil type | +| pftlookup.csv | default parameter values for CASA-CNP | +| Meteorological forcing | atmospheric forcing data for CABLE | +| Surface forcing | information about the surface characteristics | +| Restart | information from a previous CABLE run to restart a simulation | + + diff --git a/documentation/docs/user_guide/inputs/pft_params_nml.md b/documentation/docs/user_guide/inputs/pft_params_nml.md index b95773bc5..b57cdea96 100644 --- a/documentation/docs/user_guide/inputs/pft_params_nml.md +++ b/documentation/docs/user_guide/inputs/pft_params_nml.md @@ -1,5 +1,162 @@ # pft_params.nml options +In CABLE the characteristics of the vegetation cover are parametrised and generally remain constant throughout the simulation. These **vegetation parameters** in general vary by **vegetation type**. +CABLE supports tiling of vegetation, i.e. multiple vegetation types with specified area fractions for a single location/grid-cell (also referred to as patches in CABLE). +Altogether CABLE considers the 17 distinct types of vegetation cover listed in Table 1. +Eleven of those are plant functional types (PFT), two are generally unoccupied, and the remaining four are not vegetated. + +## Table 1: CABLE vegetation types + +| Number | Type | +|--------|----------------------| +| 1 | Evergreen Needleleaf | +| 2 | Evergreen Broadleaf | +| 3 | Deciduous Needleleaf | +| 4 | Deciduous Broadleaf | +| 5 | Shrub | +| 6 | C3 Grassland | +| 7 | C4 Grassland | +| 8 | Tundra | +| 9 | C3 Cropland | +| 10 | C4 Cropland | +| 11 | Wetland | +| 12 | empty | +| 13 | empty | +| 14 | Barren | +| 15 | Urban | +| 16 | Lakes | +| 17 | Ice | + +The CABLE vegetation parameters are listed in Table 2 along with their value ranges, units, and descriptions. All parameters in Table 2 are of type real and dimension 17, corresponding to the number of vegetation types in Table 1. +The ranges listed are “physically possible” and mostly correspond to the optional checks in the CABLE offline code. +## Table 2: CABLE vegetation parameters + +| Name (vegin%) | Range | Units | Description | +|-----------------------|------------------|-----------------------------------------------------------------------------------------------------|-------------| +| a1gs | >=0.0 | \( (-) \) | a1 parameter in stomatal conductance model. Represents the sensitivity of stomatal conductance to the assimilation rate | +| alpha | >=0.0 | \( (mol (electrons) \cdot mol^{-1} (photons) (C3) \cdot \)
    \( mol (CO2) \cdot mol^{-1} (photons) (C4)) \) | Initial slope of J-Q response curve | +| canst1 | 0.05 – 0.15 | \( (mm \cdot LAI^{-1}) \) | Maximum intercepted water by canopy | +| cfrd | >=0.0 | \( (-) \) | Ratio of day respiration to vcmax | +| clitt | >=0.0 | \( (tC \cdot ha^{-1}) \) | Leaf litter (alters resistance to soil evaporation) | +| conkc0 | >=0.0 | \( (bar) \) | Michaelis-Menton constant for carboxylase | +| conko0 | >=0.0 | \( (bar) \) | Michaelis-Menton constant for oxygenase | +| convex | >=0.0 | \( (-) \) | Convexity of J-Q response curve | +| cplant1 | >=0.0 | \( (gC \cdot m^{-2}) \) | Plant carbon in 1st vegetation carbon store | +| cplant2 | >=0.0 | \( (gC \cdot m^{-2}) \) | Plant carbon in 2nd vegetation carbon store | +| cplant3 | >=0.0 | \( (gC \cdot m^{-2}) \) | Plant carbon in 3rd vegetation carbon store | +| csoil1 | >=0.0 | \( (gC \cdot m^{-2}) \) | Soil carbon in 1st soil carbon store | +| csoil2 | >=0.0 | \( (gC \cdot m^{-2}) \) | Soil carbon in 2nd soil carbon store | +| d0gs | >=0.0 | \( (kPa) \) | d0 in stomatal conductance model | +| ejmax | 0 – 3.0E-4 | \( (mol \cdot m^{-2} \cdot s^{-1}) \) | Maximum potential electron transp rate top leaf | +| ekc | >=0.0 | \( (J \cdot mol^{-1}) \) | Activation energy for carboxylase | +| eko | >=0.0 | \( (J \cdot mol^{-1}) \) | Activation energy for oxygenase | +| extkn | 0.0 – 10.0 | \( (-) \) | Extinction coeficient for vertical profile of N | +| frac4 | 0.0 – 1.0 | \( (-) \) | Fraction of c4 plants | +| froot1 | 0.0 – 1.0 | \( (-) \) | Fraction of root in soil layer 1 | +| froot2 | 0.0 – 1.0 | \( (-) \) | Fraction of root in soil layer 2 | +| froot3 | 0.0 – 1.0 | \( (-) \) | Fraction of root in soil layer 3 | +| froot4 | 0.0 – 1.0 | \( (-) \) | Fraction of root in soil layer 4 | +| froot5 | 0.0 – 1.0 | \( (-) \) | Fraction of root in soil layer 5 | +| froot6 | 0.0 – 1.0 | \( (-) \) | Fraction of root in soil layer 6 | +| g0 | -0.5 – 0.5 | \( (mol \cdot m^{-2} \cdot s^{-1}) \) | Belinda's stomatal model intercept. Residual stomatal conductance as net assimilation rate reaches zero | +| g1 | 0.0 – 20.0 | \( (kPa) \) | Belinda's stomatal model slope. Sensitivity of stomatal conductance to the assimilation rate | +| gswmin | >=0.0 | \( (mol \cdot m^{-2} \cdot s^{-1}) \) | Minimal stomatal conductance | +| hc | 0.0 – 100.0 | \( (m) \) | Roughness height of canopy (veg - snow) | +| lai | 0.0 – 8.0 | \( (-) or (m^{2} \cdot m^{-2} ) \) | Leaf area index of each plant functional type | +| length | >=0.0 | \( (m) \) | Leaf length | +| ratecp1 | 0.01 – 3.0 | \( (year^{-1}) \) | Plant carbon pool rate constant in 1st vegetation carbon store | +| ratecp2 | 0.01 – 3.0 | \( (year^{-1}) \) | Plant carbon pool rate constant in 2nd vegetation carbon store | +| ratecp3 | 0.01 – 3.0 | \( (year^{-1}) \) | Plant carbon pool rate constant in 3rd vegetation carbon store | +| ratecs1 | 0.01 – 3.0 | \( (year^{-1}) \) | Soil carbon pool rate constant in 1st soil carbon store | +| ratecs2 | 0.01 – 3.0 | \( (year^{-1}) \) | Soil carbon pool rate constant in 2nd soil carbon store | +| refl1 | 0.0 – 0.5 | \( (-) \) | Leaf reflectance in 1st radiation band | +| refl2 | 0.0 – 0.5 | \( (-) \) | Leaf reflectance in 2nd radiation band | +| refl3 | 0.0 – 0.5 | \( (-) \) | Leaf reflectance in 3rd radiation band | +| rootbeta | 0.0 – 1.0 | \( (-) \) | Beta parameter to calculate froot (Jackson et al. 1996) | +| rp20 | 0.0 – 10.0 | \( (-) \) | Plant respiration coefficient at 20 C | +| rpcoef | 0.05 – 1.5 | \( (^{\circ}C^{-1}) \) | Temperature coefficient non-leaf plant respiration | +| rs20 | 0.0 – 10.0 | \( (mol \cdot m^{-2} \cdot s^{-1} ) \) | Soil respiration at 20 C | +| shelrb | 1.0 – 3.0 | \( (-) \) | Sheltering factor | +| taul1 | 0.0 – 0.3 | \( (-) \) | Leaf transmittance in 1st radiation band | +| taul2 | 0.0 – 0.3 | \( (-) \) | Leaf transmittance in 2nd radiation band | +| taul3 | 0.0 – 0.3 | \( (-) \) | Leaf transmittance in 3rd radiation band | +| tmaxvj | -15.0 – 30.0 | \( (^{\circ}C) \) | Maximum temperature of the start of photosynthesis | +| tminvj | -20.0 – 15.0 | \( (^{\circ}C) \) | Minimum temperature of the start of photosynthesis | +| vbeta | -999999 – 999999 | \( (-) \) | Stomatal sensitivity to soil water | +| vcmax | 5.0E-6 – 1.5E-4 | \( ( mol \cdot m^{-2} \cdot s^{-1} ) \) | Maximum RuBP carboxylation rate top leaf | +| vegcf | 0.0 – 100.0 | \( (-) \) | Scaling on soil respiration (place-holder scheme) | +| width | >=0.0 | \( (m) \) | Leaf width | +| xfang | -1.0 – 0.5 | \( (-) \) | Leaf angle | +| zr | >=0.0 | \( (cm) \) | Maximum rooting depth | + + + +The CABLE default values of the vegetation parameters in Table 2 for the vegetation types in Table 1 are listed in Table 3. + +## Table 3: Default vegetation parameter values + +| | Evergreen Needleleaf | Evergreen Broadleaf | Deciduous Needleleaf | Deciduous Broadleaf | Shrub | C3 Grassland | C4 Grassland | Tundra | C3 Cropland | C4 Cropland | Wetland | empty | empty | Barren | Urban | Lakes | Ice | +|----------------|----------------------|---------------------|----------------------|---------------------|-------|--------------|--------------|--------|-------------|-------------|---------|-------|-------|--------|-------|-------|-----| +| a1gs | 9 | 9 | 9 | 9 | 9 | 9 | 4 | 9 | 9 | 4 | 9 | 9 | 9 | 9 | 9 | 9 | 9 | +| alpha | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 0.05 | 0.2 | 0.2 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | +| canst1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | +| cfrd | 0.015 | 0.015 | 0.015 | 0.015 | 0.015 | 0.025 | 0.015 | 0.015 | 0.025 | 0.015 | 0.015 | 0.015 | 0.015 | 0.015 | 0.015 | 0.015 | 0.015 | +| clitt | 20 | 6 | 10 | 13 | 2 | 2 | 0.3 | 0.3 | 0 | 0 | 2 | 2 | 0 | 0 | 0 | 0 | 0 | +| conkc0 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | 0.000302 | +| conko0 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | 0.256 | +| convex | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.8 | 0.01 | 0.01 | 0.8 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | +| cplant1 | 200 | 300 | 200 | 300 | 159 | 250 | 250 | 250 | 150 | 150 | 250 | 1 | 0.1 | 0 | 1 | 1 | 0 | +| cplant2 | 10217 | 16833 | 5967 | 12000 | 5000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| cplant3 | 876 | 1443 | 511 | 1029 | 500 | 500 | 500 | 500 | 607 | 607 | 500 | 1 | 0.1 | 0 | 1 | 1 | 0 | +| csoil1 | 184 | 303 | 107 | 216 | 100 | 275 | 275 | 275 | 149 | 149 | 275 | 1 | 0.1 | 1 | 1 | 1 | 1 | +| csoil2 | 367 | 606 | 214 | 432 | 250 | 314 | 314 | 314 | 300 | 300 | 314 | 1 | 0.1 | 1 | 1 | 1 | 1 | +| d0gs | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | 1500 | +| ejmax | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| ekc | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | 59430 | +| eko | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | 36000 | +| extkn | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | +| frac4 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0| +| froot1 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| froot2 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| froot3 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| froot4 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| froot5 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| froot6 | 0.05 | 0.2 | 0.2 | 0.2 | 0.2 | 0.15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| g0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| g1 | 2.346064 | 4.114762 | 2.346064 | 4.447321 | 4.694803 | 5.2485 | 1.616178 | 2.222156 | 5.789377 | 1.616178 | 5.2485 | 5.2485 | 0 | 5.2485 | 5.2485 | 5.2485 | 5.2485 | +| gswmin | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.04 | 0.01 | 0.01 | 0.04 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | +| hc | 17 | 35 | 15.5 | 20 | 0.6 | 0.567 | 0.567 | 0.567 | 0.55 | 0.55 | 0.567 | 0.2 | 6.017 | 0.2 | 0.2 | 0.2 | 0.2 | +| lai | 4 | 5 | 0 | 0 | 0 | 0.2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| length | 0.055 | 0.1 | 0.04 | 0.15 | 0.1 | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | 0.03 | 0.242 | 0.03 | 0.03 | 0.03 | 0.03 | +| ratecp1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | +| ratecp2 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | +| ratecp3 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | 0.14 | +| ratecs1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | +| ratecs2 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | +| refl1 | 0.09 | 0.09 | 0.075 | 0.09 | 0.09 | 0.11 | 0.11 | 0.075 | 0.11 | 0.11 | 0.108 | 0.055 | 0.091 | 0.238 | 0.143 | 0.143 | 0.159 | +| refl2 | 0.3 | 0.29 | 0.3 | 0.29 | 0.3 | 0.34 | 0.34 | 0.32 | 0.34 | 0.34 | 0.343 | 0.19 | 0.31 | 0.457 | 0.275 | 0.275 | 0.305 | +| refl3 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | +| rootbeta | 0.943 | 0.962 | 0.966 | 0.961 | 0.964 | 0.943 | 0.943 | 0.943 | 0.961 | 0.961 | 0.943 | 0.975 | 0.961 | 0.961 | 0.961 | 0.961 | 0.961 | +| rp20 | 3 | 0.6 | 3 | 2.2 | 1 | 1.5 | 2.8 | 2.5 | 1.5 | 1 | 1.5 | 1 | 1 | 1 | 1 | 1 | 1 | +| rpcoef | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | 0.0832 | +| rs20 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | +| shelrb | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | +| taul1 | 0.09 | 0.09 | 0.075 | 0.09 | 0.09 | 0.11 | 0.11 | 0.075 | 0.11 | 0.11 | 0.075 | 0.023 | 0.059 | 0.039 | 0.023 | 0.023 | 0.026 | +| taul2 | 0.3 | 0.29 | 0.3 | 0.29 | 0.3 | 0.34 | 0.34 | 0.32 | 0.34 | 0.34 | 0.146 | 0.198 | 0.163 | 0.189 | 0.113 | 0.113 | 0.113 | +| taul3 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | +| tmaxvj | -10 | -10 | 10 | 15 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | +| tminvj | -15 | -15 | 5 | 5 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | -15 | +| vbeta | 2 | 2 | 2 | 2 | 4 | 4 | 4 | 4 | 2 | 2 | 4 | 4 | 2 | 4 | 4 | 4 | 4 | +| vcmax | 4E-05 | 5.5E-05 | 4E-05 | 6E-05 | 4E-05 | 6E-05 | 1E-05 | 4E-05 | 8E-05 | 8E-05 | 6E-05 | 1.7E-05 | 1E-06 | 1.7E-05 | 1.7E-05 | 1.7E-05 | 1.7E-05 | +| vegcf | 9 | 14 | 9 | 8 | 5 | 7 | 7 | 5 | 7 | 1 | 7 | 1 | 1 | 1 | 1 | 1 | 1 | +| width | 0.001 | 0.05 | 0.001 | 0.08 | 0.005 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.01 | 0.003 | 0.015 | 0.001 | 0.001 | 0.001 | 0.001 | +| xfang | 0.01 | 0.1 | 0.01 | 0.25 | 0.01 | -0.3 | -0.3 | -0.3 | -0.3 | -0.3 | -0.3 | 0.1 | 0 | 0 | 0 | 0 | 0| +| zr | 1.8 | 3 | 2 | 2 | 2.5 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | 1.8 | 3.1 | 3 | 1 | 1 | 1 | 1 | + + + +The CABLE distribution provides the default vegetation parameter values from Table 3 in the namelist file pft_params.nml, including the vegetation types from Table 1 in the top part. +The chosen parameter values in offline cases can be checked against the pre-defined realistic parameter value ranges using the CABLE namelist variable check%ranges=.true. in cable.nml. ## Example pft_params.nml file !!! Note "Namelist file format explanation" @@ -71,67 +228,6 @@ vegin%zr=1.800000,3.000000,2.000000,2.000000,2.500000,5*0.500000,1.800000,3.1000 / ``` -## Descriptive table of parameters - -| Namelist variable| Type | Available values | Default values | Description | -|------------------|------|------------------|----------------|-------------| -| vegin%a1gs | real | >=0.0 | 9, 9, 9, 9, 9, 9, 4, 9, 9, 4, 9, 9, 9, 9, 9, 9, 9 | a1 parameter in stomatal conductance model. Represents the sensitivity of stomatal conductance to the assimilation rate \( (-) \) | -| vegin%alpha | real | >=0.0 | 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.05, 0.2, 0.2, 0.05, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2 | Initial slope of J-Q response curve \( (mol (electrons) \cdot mol^{-1} (photons) (C3) \cdot mol (CO2) \cdot mol^{-1} (photons) (C4)) \) | -| vegin%canst1 | real | 0.05 – 0.15 | 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1 | Maximum intercepted water by canopy \( (mm \cdot LAI^{-1}) \) | -| vegin%cfrd | real | >=0.0 | 0.015, 0.015, 0.015, 0.015, 0.015, 0.025, 0.015, 0.015, 0.025, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015 | Ratio of day respiration to vcmax \( (-) \) | -| vegin%clitt | real | >=0.0 | 20, 6, 10, 13, 2, 2, 0.3, 0.3, 0, 0, 2, 2, 0, 0, 0, 0, 0 | Leaf litter (alters resistance to soil evaporation) \( (tC \cdot ha^{-1}) \) | -| vegin%conkc0 | real | >=0.0 | 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302, 0.000302 | Michaelis-Menton constant for carboxylase \( (bar) \) | -| vegin%conko0 | real | >=0.0 | 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256, 0.256 | Michaelis-Menton constant for oxygenase \( (bar) \) | -| vegin%convex | real | >=0.0 | 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.8, 0.01, 0.01, 0.8, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01 | Convexity of J-Q response curve \( (-) \) | -| vegin%cplant1 | real | >=0.0 | 200, 300, 200, 300, 159, 250, 250, 250, 150, 150, 250, 1, 0.1, 0, 1, 1, 0 | Plant carbon in 1st vegetation carbon store \( (gC \cdot m^{-2}) \) | -| vegin%cplant2 | real | >=0.0 | 10217, 16833, 5967, 12000, 5000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Plant carbon in 2nd vegetation carbon store \( (gC \cdot m^{-2}) \) | -| vegin%cplant3 | real | >=0.0 | 876, 1443, 511, 1029, 500, 500, 500, 500, 607, 607, 500, 1, 0.1, 0, 1, 1, 0 | Plant carbon in 3rd vegetation carbon store \( (gC \cdot m^{-2}) \) | -| vegin%csoil1 | real | >=0.0 | 184, 303, 107, 216, 100, 275, 275, 275, 149, 149, 275, 1, 0.1, 1, 1, 1, 1 | Soil carbon in 1st soil carbon store \( (gC \cdot m^{-2}) \) | -| vegin%csoil2 | real | >=0.0 | 367, 606, 214, 432, 250, 314, 314, 314, 300, 300, 314, 1, 0.1, 1, 1, 1, 1 | Soil carbon in 2nd soil carbon store \( (gC \cdot m^{-2}) \) | -| vegin%d0gs | real | >=0.0 | 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500 | d0 in stomatal conductance model \( (kPa) \) | -| vegin%desc | character | | 'Evergreen Needleleaf', 'Evergreen Broadleaf', 'Deciduous Needleleaf', 'Deciduous Broadleaf', 'Shrub', 'C3 Grassland', 'C4 Grassland', 'Tundra', 'C3 Cropland', 'C4 Cropland', 'Wetland', 'empty', 'empty', 'Barren', 'Urban', 'Lakes', 'Ice' | Description of plant functional type | -| vegin%ejmax | real | 0 – 3.0E-4 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Maximum potential electron transp rate top leaf \( (mol \cdot m^{-2} \cdot s^{-1}) \) | -| vegin%ekc | real | >=0.0 | 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430, 59430 | Activation energy for carboxylase \( (J \cdot mol^{-1}) \) | -| vegin%eko | real | >=0.0 | 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000, 36000 | Activation energy for oxygenase \( (J \cdot mol^{-1}) \) | -| vegin%extkn | real | 0.0 – 10.0 | 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001 | Extinction coeficient for vertical profile of N \( (-) \) | -| vegin%frac4 | real | 0.0 – 1.0 | 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0| Fraction of c4 plants \( (-) \) | -| vegin%froot1 | real | 0.0 – 1.0 | 0.05, 0.2, 0.2, 0.2, 0.2, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Fraction of root in soil layer 1 \( (-) \) | -| vegin%froot2 | real | 0.0 – 1.0 | 0.05, 0.2, 0.2, 0.2, 0.2, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Fraction of root in soil layer 2 \( (-) \) | -| vegin%froot3 | real | 0.0 – 1.0 | 0.05, 0.2, 0.2, 0.2, 0.2, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Fraction of root in soil layer 3 \( (-) \) | -| vegin%froot4 | real | 0.0 – 1.0 | 0.05, 0.2, 0.2, 0.2, 0.2, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Fraction of root in soil layer 4 \( (-) \) | -| vegin%froot5 | real | 0.0 – 1.0 | 0.05, 0.2, 0.2, 0.2, 0.2, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Fraction of root in soil layer 5 \( (-) \) | -| vegin%froot6 | real | 0.0 – 1.0 | 0.05, 0.2, 0.2, 0.2, 0.2, 0.15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Fraction of root in soil layer 6 \( (-) \) | -| vegin%g0 | real | -0.5 – 0.5 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Belinda's stomatal model intercept. Residual stomatal conductance as net assimilation rate reaches zero \( (mol \cdot m^{-2} \cdot s^{-1}) \) | -| vegin%g1 | real | 0.0 – 20.0 | 2.346064, 4.114762, 2.346064, 4.447321, 4.694803, 5.2485, 1.616178, 2.222156, 5.789377, 1.616178, 5.2485, 5.2485, 0, 5.2485, 5.2485, 5.2485, 5.2485 | Belinda's stomatal model slope. Sensitivity of stomatal conductance to the assimilation rate \( (kPa) \) | -| vegin%gswmin | real | >=0.0 | 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.04, 0.01, 0.01, 0.04, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01 | Minimal stomatal conductance \( (mol \cdot m^{-2} \cdot s^{-1}) \) | -| vegin%hc | real | 0.0 – 100.0 | 17, 35, 15.5, 20, 0.6, 0.567, 0.567, 0.567, 0.55, 0.55, 0.567, 0.2, 6.017, 0.2, 0.2, 0.2, 0.2 | Roughness height of canopy (veg - snow) \( (m) \) | -| vegin%lai | real | 0.0 – 8.0 | 4, 5, 0, 0, 0, 0.2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Leaf area index of each plant functional type \( (-) or (m^{2} \cdot m^{-2} ) \) | -| vegin%length | real | >=0.0 | 0.055, 0.1, 0.04, 0.15, 0.1, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.03, 0.242, 0.03, 0.03, 0.03, 0.03 | Leaf length \( (m) \) | -| vegin%ratecp1 | real | 0.01 – 3.0 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 | Plant carbon pool rate constant in 1st vegetation carbon store \( (year^{-1}) \) | -| vegin%ratecp2 | real | 0.01 – 3.0 | 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03 | Plant carbon pool rate constant in 2nd vegetation carbon store \( (year^{-1}) \) | -| vegin%ratecp3 | real | 0.01 – 3.0 | 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14 | Plant carbon pool rate constant in 3rd vegetation carbon store \( (year^{-1}) \) | -| vegin%ratecs1 | real | 0.01 – 3.0 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 | Soil carbon pool rate constant in 1st soil carbon store \( (year^{-1}) \) | -| vegin%ratecs2 | real | 0.01 – 3.0 | 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 | Soil carbon pool rate constant in 2nd soil carbon store \( (year^{-1}) \) | -| vegin%refl1 | real | 0.0 – 0.5 | 0.09, 0.09, 0.075, 0.09, 0.09, 0.11, 0.11, 0.075, 0.11, 0.11, 0.108, 0.055, 0.091, 0.238, 0.143, 0.143, 0.159 | Leaf reflectance in 1st radiation band \( (-) \) | -| vegin%refl2 | real | 0.0 – 0.5 | 0.3, 0.29, 0.3, 0.29, 0.3, 0.34, 0.34, 0.32, 0.34, 0.34, 0.343, 0.19, 0.31, 0.457, 0.275, 0.275, 0.305 | Leaf reflectance in 2nd radiation band \( (-) \) | -| vegin%refl3 | real | 0.0 – 0.5 | 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01 | Leaf reflectance in 3rd radiation band \( (-) \) | -| vegin%rootbeta | real | 0.0 – 1.0 | 0.943, 0.962, 0.966, 0.961, 0.964, 0.943, 0.943, 0.943, 0.961, 0.961, 0.943, 0.975, 0.961, 0.961, 0.961, 0.961, 0.961 | Beta parameter to calculate froot (Jackson et al. 1996) \( (-) \) | -| vegin%rp20 | real | 0.0 – 10.0 | 3, 0.6, 3, 2.2, 1, 1.5, 2.8, 2.5, 1.5, 1, 1.5, 1, 1, 1, 1, 1, 1 | Plant respiration coefficient at 20 C \( (-) \) | -| vegin%rpcoef | real | 0.05 – 1.5 | 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832, 0.0832 | Temperature coefficient non-leaf plant respiration \( (^{\circ}C^{-1}) \) | -| vegin%rs20 | real | 0.0 – 10.0 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0 | Soil respiration at 20 C \( (mol \cdot m^{-2} \cdot s^{-1} ) \) | -| vegin%shelrb | real | 1.0 – 3.0 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 | Sheltering factor \( (-) \) | -| vegin%taul1 | real | 0.0 – 0.3 | 0.09, 0.09, 0.075, 0.09, 0.09, 0.11, 0.11, 0.075, 0.11, 0.11, 0.075, 0.023, 0.059, 0.039, 0.023, 0.023, 0.026 | Leaf transmittance in 1st radiation band \( (-) \) | -| vegin%taul2 | real | 0.0 – 0.3 | 0.3, 0.29, 0.3, 0.29, 0.3, 0.34, 0.34, 0.32, 0.34, 0.34, 0.146, 0.198, 0.163, 0.189, 0.113, 0.113, 0.113 | Leaf transmittance in 2nd radiation band \( (-) \) | -| vegin%taul3 | real | 0.0 – 0.3 | 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01 | Leaf transmittance in 3rd radiation band \( (-) \) | -| vegin%tmaxvj | real | -15.0 – 30.0 | -10, -10, 10, 15, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10, -10 | Maximum temperature of the start of photosynthesis \( (^{\circ}C) \) | -| vegin%tminvj | real | -20.0 – 15.0 | -15, -15, 5, 5, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15 | Minimum temperature of the start of photosynthesis \( (^{\circ}C) \) | -| vegin%vbeta | real | -999999 – 999999 | 2, 2, 2, 2, 4, 4, 4, 4, 2, 2, 4, 4, 2, 4, 4, 4, 4 | Stomatal sensitivity to soil water \( (-) \) | -| vegin%vcmax | real | 5.0E-6 – 1.5E-4 | 4E-05, 5.5E-05, 4E-05, 6E-05, 4E-05, 6E-05, 1E-05, 4E-05, 8E-05, 8E-05, 6E-05, 1.7E-05, 1E-06, 1.7E-05, 1.7E-05, 1.7E-05, 1.7E-05 | Maximum RuBP carboxylation rate top leaf \( ( mol \cdot m^{-2} \cdot s^{-1} ) \) | -| vegin%vegcf | real | 0.0 – 100.0 | 9, 14, 9, 8, 5, 7, 7, 5, 7, 1, 7, 1, 1, 1, 1, 1, 1 | Scaling on soil respiration (place-holder scheme) \( (-) \) | -| vegin%width | real | >=0.0 | 0.001, 0.05, 0.001, 0.08, 0.005, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.003, 0.015, 0.001, 0.001, 0.001, 0.001 | Leaf width \( (m) \) | -| vegin%xfang | real | -1.0 – 0.5 | 0.01, 0.1, 0.01, 0.25, 0.01, -0.3, -0.3, -0.3, -0.3, -0.3, -0.3, 0.1, 0, 0, 0, 0, 0| Leaf angle \( (-) \) | -| vegin%zr | real | >=0.0 | 1.8, 3, 2, 2, 2.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.8, 3.1, 3, 1, 1, 1, 1 | Maximum rooting depth \( (cm) \) | - ## Unused parameters | Name | Type | Available | Default | Description | diff --git a/documentation/docs/user_guide/inputs/restart.md b/documentation/docs/user_guide/inputs/restart.md new file mode 100644 index 000000000..616b06cf9 --- /dev/null +++ b/documentation/docs/user_guide/inputs/restart.md @@ -0,0 +1 @@ +This section will be made available soon. diff --git a/documentation/docs/user_guide/inputs/surface_forcing.md b/documentation/docs/user_guide/inputs/surface_forcing.md new file mode 100644 index 000000000..616b06cf9 --- /dev/null +++ b/documentation/docs/user_guide/inputs/surface_forcing.md @@ -0,0 +1 @@ +This section will be made available soon. diff --git a/documentation/docs/user_guide/outputs/index.md b/documentation/docs/user_guide/outputs/index.md new file mode 100644 index 000000000..616b06cf9 --- /dev/null +++ b/documentation/docs/user_guide/outputs/index.md @@ -0,0 +1 @@ +This section will be made available soon. diff --git a/documentation/docs/user_guide/uber_quick_guide.md b/documentation/docs/user_guide/uber_quick_guide.md index 8f0aea573..17246dbfb 100644 --- a/documentation/docs/user_guide/uber_quick_guide.md +++ b/documentation/docs/user_guide/uber_quick_guide.md @@ -13,7 +13,8 @@ Assuming you have computing resources on gadi@NCI, installing and running CABLE 1. Execute this serial version of CABLE - ./bin/cable + cd src/offline + ../../bin/cable ## In slightly more detail diff --git a/documentation/mkdocs.yml b/documentation/mkdocs.yml index cbc5aaab0..a9110f262 100644 --- a/documentation/mkdocs.yml +++ b/documentation/mkdocs.yml @@ -65,8 +65,8 @@ markdown_extensions: extra_javascript: - javascripts/mathjax.js - https://polyfill.io/v3/polyfill.min.js?features=es6 - - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js - + - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js + # Navigation nav: - About: @@ -75,12 +75,17 @@ nav: - user_guide/index.md - Uber Quick Guide: user_guide/uber_quick_guide.md - Installation: user_guide/installation.md - - Inputs description: - - cable.nml options: user_guide/inputs/cable_nml.md - - pft_params.nml options: user_guide/inputs/pft_params_nml.md - - cable_soilparm.nml options: user_guide/inputs/cable_soilparm_nml.md + - Input files: + - user_guide/inputs/index.md + - cable.nml: user_guide/inputs/cable_nml.md + - pft_params.nml: user_guide/inputs/pft_params_nml.md + - cable_soilparm.nml: user_guide/inputs/cable_soilparm_nml.md - pftlookup.csv table: user_guide/inputs/pftlookup_csv.md - Meteorological forcing: user_guide/inputs/meteorological_forcing.md + - Surface forcing: user_guide/inputs/surface_forcing.md + - Restart: user_guide/inputs/restart.md + - Output files: + - user_guide/outputs/index.md - Other resources: - Existing configurations: user_guide/other_resources/configurations/config.md - Obsolete and deprecated features: user_guide/other_resources/obsolete_and_deprecated_features/obsolete_and_deprecated_features.md diff --git a/src/offline/cable_abort.F90 b/src/offline/cable_abort.F90 index 608e701c3..346c89035 100644 --- a/src/offline/cable_abort.F90 +++ b/src/offline/cable_abort.F90 @@ -18,9 +18,9 @@ ! ! ============================================================================== - MODULE cable_abort_module + USE cable_IO_vars_module, ONLY: check, logn IMPLICIT NONE CONTAINS @@ -60,13 +60,12 @@ MODULE cable_abort_module ! !============================================================================== - - SUBROUTINE abort( message ) + SUBROUTINE abort(message) ! Input arguments CHARACTER(LEN=*), INTENT(IN) :: message - WRITE(*, *) message + WRITE (*, *) message STOP 1 END SUBROUTINE abort @@ -109,8 +108,7 @@ END SUBROUTINE abort ! !============================================================================== - - SUBROUTINE nc_abort( ok, message ) + SUBROUTINE nc_abort(ok, message) USE netcdf @@ -118,8 +116,8 @@ SUBROUTINE nc_abort( ok, message ) CHARACTER(LEN=*), INTENT(IN) :: message INTEGER, INTENT(IN) :: ok - WRITE(*,*) message ! error from subroutine - WRITE(*,*) NF90_STRERROR(ok) ! netcdf error details + WRITE (*, *) message ! error from subroutine + WRITE (*, *) NF90_STRERROR(ok) ! netcdf error details STOP @@ -140,60 +138,56 @@ END SUBROUTINE nc_abort ! !============================================================================== - - - SUBROUTINE range_abort(message,ktau,met,value,var_range, & - i,xx,yy) + SUBROUTINE range_abort(vname, ktau, met, value, var_range, i, xx, yy) USE cable_def_types_mod, ONLY: met_type - USE cable_IO_vars_module, ONLY: latitude,longitude,landpt,lat_all,lon_all + USE cable_IO_vars_module, ONLY: latitude, longitude, & + landpt, lat_all, lon_all ! Input arguments - CHARACTER(LEN=*), INTENT(IN) :: message + CHARACTER(LEN=*), INTENT(IN) :: vname - INTEGER, INTENT(IN) :: & - ktau, & ! time step - i ! landpt number of erroneous grid square + INTEGER, INTENT(IN) :: & + ktau, & ! time step + i ! tile number along mp - INTEGER,INTENT(IN),OPTIONAL :: & - xx, & ! coordinates of erroneous grid square - yy ! coordinates of erroneous grid square + REAL, INTENT(IN) :: & + xx, & ! coordinates of erroneous grid square + yy ! coordinates of erroneous grid square + TYPE(met_type), INTENT(IN) :: met ! met data - TYPE(met_type),INTENT(IN) :: met ! met data + REAL(4), INTENT(IN) :: value ! value deemed to be out of range - REAL,INTENT(IN) :: value ! value deemed to be out of range + REAL, INTENT(IN) :: var_range(2) ! appropriate var range - REAL,DIMENSION(2),INTENT(IN) :: var_range ! appropriate var range + INTEGER :: iunit - WRITE(*,*) "in SUBR range_abort" - WRITE(*,*) message ! error from subroutine + IF (check%exit) THEN + iunit = 6 + ELSE + iunit = logn ! warning + END IF - IF( PRESENT(yy) ) THEN ! i.e. using rectangular land/sea grid + WRITE (iunit, *) "in SUBR range_abort: Out of range" + WRITE (iunit, *) "for var ", vname ! error from subroutine - WRITE(*,*) 'Site lat, lon:',lat_all(xx,yy),lon_all(xx,yy) - WRITE(*,*) 'Output timestep',ktau, & - ', or ', met%hod(landpt(i)%cstart),' hod, ', & - INT( met%doy( landpt(i)%cstart) ),'doy, ', & - INT( met%year(landpt(i)%cstart) ) + ! patch(i)%latitude, patch(i)%longitude + WRITE (iunit, *) 'Site lat, lon:', xx, yy + WRITE (iunit, *) 'Output timestep', ktau, & + ', or ', met%hod(i), ' hod, ', & + INT(met%doy(i)), 'doy, ', & + INT(met%year(i)) - ELSE ! i.e. using compressed land only grid + WRITE (iunit, *) 'Specified acceptable range (cable_checks.f90):', & + var_range(1), 'to', var_range(2) - WRITE(*,*) 'Site lat, lon:', latitude(i), longitude(i) - WRITE(*,*) 'Output timestep', ktau, & - ', or ', met%hod( landpt(i)%cstart ), ' hod, ', & - INT( met%doy( landpt(i)%cstart) ),'doy, ', & - INT( met%year( landpt(i)%cstart) ) + WRITE (iunit, *) 'Value:', value + IF (check%exit) THEN + STOP END IF - WRITE(*,*) 'Specified acceptable range (checks.f90):', var_range(1), & - 'to',var_range(2) - - WRITE(*,*) 'Value:',value - - STOP - END SUBROUTINE range_abort !============================================================================== diff --git a/src/offline/cable_checks.F90 b/src/offline/cable_checks.F90 index 9a82a2a7a..c3c50b5ae 100644 --- a/src/offline/cable_checks.F90 +++ b/src/offline/cable_checks.F90 @@ -30,161 +30,435 @@ MODULE cable_checks_module ! particular sections of the code - largely for diagnostics/fault finding. ! rh_sh - converts relative to sensible humidity if met file units require it ! + USE cable_IO_vars_module, ONLY: patch + USE cable_abort_module, ONLY: range_abort USE cable_def_types_mod USE cable_common_module, ONLY: cable_user IMPLICIT NONE PRIVATE - PUBLIC ranges_type, ranges, mass_balance, energy_balance, rh_sh - + PUBLIC constant_check_range, check_range, ranges_type, ranges, mass_balance, energy_balance, rh_sh + TYPE units_type - CHARACTER(LEN=1) :: Rainf ! 's' (mm/s) or 'h' (mm/h) - CHARACTER(LEN=1) :: PSurf ! 'h'(hPa or mbar) or 'P'(Pa) - CHARACTER(LEN=1) :: Tair ! 'C' or 'K' - CHARACTER(LEN=1) :: Qair ! '%' or 'g' (spec hum) - CHARACTER(LEN=1) :: CO2air ! 'p' (ppmv) - CHARACTER(LEN=1) :: Wind ! 'm'(m/s) + CHARACTER(LEN=1) :: Rainf ! 's' (mm/s) or 'h' (mm/h) + CHARACTER(LEN=1) :: PSurf ! 'h'(hPa or mbar) or 'P'(Pa) + CHARACTER(LEN=1) :: Tair ! 'C' or 'K' + CHARACTER(LEN=1) :: Qair ! '%' or 'g' (spec hum) + CHARACTER(LEN=1) :: CO2air ! 'p' (ppmv) + CHARACTER(LEN=1) :: Wind ! 'm'(m/s) END TYPE units_type TYPE(units_type) :: units TYPE ranges_type - REAL, DIMENSION(2) :: & - nav_lon = (/-360.0,360.0/), & - nav_lat = (/-90.0,90.0/), & - time, & - timestp, & - ! possible forcing variables for CABLE - SWdown = (/0.0,1360.0/), & ! W/m^2 - LWdown = (/0.0,950.0/), & ! W/m^2 - Rainf = (/0.0,0.1/), & ! mm/s - Snowf = (/0.0,0.1/), & ! mm/s - PSurf = (/500.0,1100.0/), & ! mbar/hPa - Tair = (/200.0,333.0/), & ! K - Qair = (/0.0,0.1/), & ! g/g - Tscrn = (/-70.0,70.0/), & ! oC - INH - Qscrn = (/0.0,0.1/), & ! kg/kg - CO2air = (/160.0,2000.0/), & ! ppmv - Wind = (/0.0,75.0/), & ! m/s - Wind_N = (/-75.0,75.0/), & ! m/s - Wind_E = (/-75.0,75.0/), & ! m/s - ! possible output variables - Qmom = (/-10.0,8000.0/), & ! kg/m/s2 - (INH generous range) - Qh = (/-2000.0,2000.0/), & ! W/m^2 - Qle = (/-2500.0,2500.0/), & ! W/m^2 - Qg = (/-4000.0,4000.0/), & ! W/m^2 - SWnet = (/0.0,1350.0/), & ! W/m^2 (YP oct07) - ! SWnet = (/0.0,1250.0/), & ! W/m^2 - LWnet = (/-500.0,510.0/), & ! W/m^2 - Rnet = (/-500.0,1250.0/), & ! W/m^2 - Evap = (/-0.0045,0.0045/), & ! note this is also used for snow melt ! - Ewater = (/-0.0005,0.0005/), & - ESoil = (/-0.0015,0.0015/), & - TVeg = (/-0.0003,0.0003/), & - ECanop = (/-0.0003,0.0003/), & - PotEvap = (/-0.0006,0.0006/), & - ACond = (/0.0,1.0/), & - SoilWet = (/-0.4,1.2/), & - Albedo = (/0.0,1.0/), & - visAlbedo = (/0.0,1.0/), & ! vars intro for Ticket #27 - nirAlbedo = (/0.0,1.0/), & ! vars intro for Ticket #27 - VegT = (/213.0,353.0/), & - SoilTemp = (/213.0,353.0/), & - SoilMoist = (/0.0,2000.0/), & - Qs = (/0.0,15.0/), & - Qsb = (/0.0,15.0/), & - DelSoilMoist = (/-2000.0,2000.0/), & - DelSWE = (/-2000.0,2000.0/), & - DelIntercept = (/-100.0,100.0/), & - SnowT = (/213.0,280.0/), & - BaresoilT = (/213.0,343.0/), & - AvgSurfT = (/213.0,333.0/), & - RadT = (/200.0,373.0/), & - ! vh_js ! - SWE = (/0.0,4000.0/), & - RootMoist = (/0.0,2000.0/), & - CanopInt = (/0.0,100.0/), & - NEE = (/-70.0,50.0/), & ! umol/m2/s - NPP = (/-20.0,75.0/), & ! umol/m2/s - GPP = (/-20.0,100.0/), & ! umol/m2/s - PAR = (/-1000.0,5000.0/), & ! umol/m2/s - AutoResp = (/-50.0,20.0/), & ! umol/m2/s - LeafResp = (/-50.0,20.0/), & ! umol/m2/s - HeteroResp = (/-50.0,20.0/), & ! umol/m2/s - HSoil = (/-1000.0,1000.0/), & - HVeg = (/-1000.0,1000.0/), & - SnowDepth = (/0.0,50.0/), & ! EK nov07 - Wbal = (/-999999.0,999999.0/), & - Ebal = (/-999999.0,999999.0/), & - ! vh_js ! - CanT = (/213.0,333.0/), & - Fwsoil = (/0.0,1.0/), & - ! parameters: - albsoil = (/0.0,0.9/), & - isoil = (/1.0,30.0/), & - iveg = (/1.0,30.0/), & - bch = (/2.0,15.0/), & - latitude = (/-90.0,90.0/), & - c3 = (/0.0,1.0/), & ! EK nov07 - clay = (/0.0,1.0/), & - css = (/700.0,2200.0/), & - rhosoil = (/300.0,3000.0/), & - hyds = (/5.0E-7,8.5E-3/), & ! vh_js ! sep14 - rs20 = (/0.0,10.0/), & - sand = (/0.0,1.0/), & - sfc = (/0.1,0.5/), & - silt = (/0.0,1.0/), & - ssat = (/0.35,0.5/), & - sucs = (/-0.8,-0.03/), & - swilt = (/0.05,0.4/), & - froot = (/0.0,1.0/), & - zse = (/0.0,5.0/), & - canst1 = (/0.05,0.15/), & - dleaf = (/0.005,0.4/), & - ejmax = (/1.0E-5,3.0E-4/), & - frac4 = (/0.0,1.0/), & - hc = (/0.0,100.0/), & - lai = (/0.0,8.0/), & - rp20 = (/0.0,10.0/), & - vbeta =(/-999999.0,999999.0/), & - g0 = (/-0.5,0.5/), & ! Ticket #56 (must find better range) - g1 = (/0.0,20.0/), & ! Ticket #56 (must find better range) - xalbnir = (/0.0,1.5/), & - meth = (/0.0,1.0/), & - za =(/0.0,150.0/), & - rpcoef = (/0.05,1.5/), & - shelrb = (/1.0,3.0/), & - vcmax = (/5.0E-6,1.5E-4/), & - xfang = (/-1.0,0.5/), & - ratecp = (/0.01,3.0/), & - ratecs = (/0.01,3.0/), & - refsbare = (/0.0,0.5/), & - taul = (/0.0,0.3/), & - refl = (/0.0,0.5/), & - tauw = (/0.0,0.1/), & - refw = (/0.0,0.5/), & - extkn = (/0.0,10.0/), & ! YP oct07 - wai = (/0.0,5.0/), & ! YP oct07 - vegcf = (/0.0,100.0/), & ! YP oct07 - tminvj = (/-20.0,15.0/), & - tmaxvj = (/-15.0,30.0/), & - rootbeta = (/0.7,1.0/), & ! YP oct07 - veg_class = (/1.0,20.0/), & - soil_class = (/1.0,20.0/) , & - TotLivBiomass = (/0.0, 1000./), & - TotSoilCarb = (/0.0, 1000./), & - TotLittCarb = (/0.0, 1000./), & - Area = (/0.0, 5000./),& - !MD - WatTable = (/0.0,1.0e10/), & - GWwb = (/0.0,1.0/), & - SatFrac = (/0.0,1.0/), & - Qrecharge = (/-9999.0,9999.0/) + REAL, DIMENSION(2) :: & + nav_lon = [-360.0, 360.0], & + nav_lat = [-90.0, 90.0], & + time, & + timestp, & + ! possible forcing variables for CABLE + SWdown = [0.0, 1360.0], & ! W/m^2 + LWdown = [0.0, 950.0], & ! W/m^2 + Rainf = [0.0, 0.1], & ! mm/s + Snowf = [0.0, 0.1], & ! mm/s + PSurf = [500.0, 1100.0], & ! mbar/hPa + Tair = [200.0, 333.0], & ! K + Qair = [0.0, 0.1], & ! g/g + Tscrn = [-70.0, 70.0], & ! oC - INH + Qscrn = [0.0, 0.1], & ! kg/kg + CO2air = [160.0, 2000.0], & ! ppmv + Wind = [0.0, 75.0], & ! m/s + Wind_N = [-75.0, 75.0], & ! m/s + Wind_E = [-75.0, 75.0], & ! m/s + ! possible output variables + Qmom = [-10.0, 8000.0], & ! kg/m/s2 - (INH generous range) + Qh = [-2000.0, 2000.0], & ! W/m^2 + Qle = [-2500.0, 2500.0], & ! W/m^2 + Qg = [-4000.0, 4000.0], & ! W/m^2 + SWnet = [0.0, 1350.0], & ! W/m^2 (YP oct07) + ! SWnet = [0.0, 1250.0], & ! W/m^2 + LWnet = [-500.0, 510.0], & ! W/m^2 + Rnet = [-500.0, 1250.0], & ! W/m^2 + Evap = [-0.0045, 0.0045], & ! note this is also used for snow melt ! + Ewater = [-0.0005, 0.0005], & + ESoil = [-0.0015, 0.0015], & + TVeg = [-0.0003, 0.0003], & + ECanop = [-0.0003, 0.0003], & + PotEvap = [-0.0006, 0.0006], & + ACond = [0.0, 1.0], & + SoilWet = [-0.4, 1.2], & + Albedo = [0.0, 1.0], & + visAlbedo = [0.0, 1.0], & ! vars intro for Ticket #27 + nirAlbedo = [0.0, 1.0], & ! vars intro for Ticket #27 + VegT = [213.0, 353.0], & + SoilTemp = [213.0, 353.0], & + SoilMoist = [0.0, 2000.0], & + Qs = [0.0, 15.0], & + Qsb = [0.0, 15.0], & + DelSoilMoist = [-2000.0, 2000.0], & + DelSWE = [-2000.0, 2000.0], & + DelIntercept = [-100.0, 100.0], & + SnowT = [213.0, 280.0], & + BaresoilT = [213.0, 343.0], & + AvgSurfT = [213.0, 333.0], & + RadT = [200.0, 373.0], & + ! vh_js ! + SWE = [0.0, 4000.0], & + RootMoist = [0.0, 2000.0], & + CanopInt = [0.0, 100.0], & + NEE = [-70.0, 50.0], & ! umol/m2/s + NPP = [-20.0, 75.0], & ! umol/m2/s + GPP = [-20.0, 100.0], & ! umol/m2/s + PAR = [-1000.0, 5000.0], & ! umol/m2/s + AutoResp = [-50.0, 20.0], & ! umol/m2/s + LeafResp = [-50.0, 20.0], & ! umol/m2/s + HeteroResp = [-50.0, 20.0], & ! umol/m2/s + HSoil = [-1000.0, 1000.0], & + HVeg = [-1000.0, 1000.0], & + SnowDepth = [0.0, 50.0], & ! EK nov07 + SnowMelt = [-99999.0, 999999.0], & + Wbal = [-999999.0, 999999.0], & + Ebal = [-999999.0, 999999.0], & + ! vh_js ! + CanT = [213.0, 333.0], & + Fwsoil = [0.0, 1.0], & + ! parameters: + albsoil = [0.0, 0.9], & + isoil = [1.0, 30.0], & + iveg = [1.0, 30.0], & + bch = [2.0, 15.0], & + latitude = [-90.0, 90.0], & + c3 = [0.0, 1.0], & ! EK nov07 + clay = [0.0, 1.0], & + css = [700.0, 2200.0], & + rhosoil = [300.0, 3000.0], & + hyds = [5.0E-7, 8.5E-3], & ! vh_js ! sep14 + rs20 = [0.0, 10.0], & + sand = [0.0, 1.0], & + sfc = [0.1, 0.5], & + silt = [0.0, 1.0], & + ssat = [0.35, 0.5], & + sucs = [-0.8, -0.03], & + swilt = [0.05, 0.4], & + froot = [0.0, 1.0], & + zse = [0.0, 5.0], & + canst1 = [0.05, 0.15], & + dleaf = [0.005, 0.4], & + ejmax = [1.0E-5, 3.0E-4], & + frac4 = [0.0, 1.0], & + hc = [0.0, 100.0], & + lai = [0.0, 8.0], & + rp20 = [0.0, 10.0], & + vbeta = [-999999.0, 999999.0], & + g0 = [-0.5, 0.5], & ! Ticket #56 (must find better range) + g1 = [0.0, 20.0], & ! Ticket #56 (must find better range) + xalbnir = [0.0, 1.5], & + meth = [0.0, 1.0], & + za = [0.0, 150.0], & + rpcoef = [0.05, 1.5], & + shelrb = [1.0, 3.0], & + vcmax = [5.0E-6, 1.5E-4], & + xfang = [-1.0, 0.5], & + ratecp = [0.01, 3.0], & + ratecs = [0.01, 3.0], & + refsbare = [0.0, 0.5], & + taul = [0.0, 0.3], & + refl = [0.0, 0.5], & + tauw = [0.0, 0.1], & + refw = [0.0, 0.5], & + extkn = [0.0, 10.0], & ! YP oct07 + wai = [0.0, 5.0], & ! YP oct07 + vegcf = [0.0, 100.0], & ! YP oct07 + tminvj = [-20.0, 15.0], & + tmaxvj = [-15.0, 30.0], & + rootbeta = [0.7, 1.0], & ! YP oct07 + veg_class = [1.0, 20.0], & + soil_class = [1.0, 20.0], & + TotLivBiomass = [0.0, 1000.], & + TotSoilCarb = [0.0, 1000.], & + TotLittCarb = [0.0, 1000.], & + Area = [0.0, 5000.], & + !MD + WatTable = [0.0, 1.0e10], & + GWwb = [0.0, 1.0], & + SatFrac = [0.0, 1.0], & + Qrecharge = [-9999.0, 9999.0], & + patchfrac = [0.0, 1.0], & + ! soil + slope = [0.0, 1.0], & + slope_std = [0.0, 1.0], & + GWdz = [0.0, 1.0], & + ! ssnow + ssdn = [0.0, 9999.0], & + smass = [0.0, 9999.0], & + sdepth = [0.0, 9999.0], & + tggsn = [100.0, 300.0], & + albsoiln = [0.0, 1.0], & + S = [0.0, 1.5], & + Tsoil = [-100.0, 100.0], & + ! gw model + gw_default = [0.0, 100000000.0], & + default_l = [-99999.0, 9999999.0], & ! default large range + default_s = [-99999.9, 99999.0] ! default smaller range END TYPE ranges_type - TYPE(ranges_type),SAVE :: ranges + + TYPE(ranges_type), SAVE :: ranges + + INTERFACE check_range + MODULE PROCEDURE :: check_range_d1 + MODULE PROCEDURE :: check_range_d2 + MODULE PROCEDURE :: check_range_d3 + END INTERFACE check_range CONTAINS + SUBROUTINE check_range_d1(vname, parameter_r1, parameter_range, ktau, met) + + CHARACTER(LEN=*) :: vname + INTEGER, INTENT(IN) :: ktau + TYPE(met_type), INTENT(IN) :: met + + REAL(4), INTENT(IN) :: parameter_r1(:) + REAL, INTENT(IN) :: parameter_range(2) + + INTEGER :: index + + DO index = 1, SIZE(parameter_r1) + IF (parameter_r1(index) < parameter_range(1) .OR. parameter_r1(index) > parameter_range(2)) THEN + CALL range_abort(vname, ktau, met, parameter_r1(index), \ + parameter_range, index, patch(index)%latitude, patch(index)%longitude) + END IF + END DO + + END SUBROUTINE check_range_d1 + + SUBROUTINE check_range_d2(var_name, var, var_range, ktau, met) + + CHARACTER(LEN=*), INTENT(IN) :: var_name + INTEGER, INTENT(IN) :: ktau + TYPE(met_type), INTENT(IN) :: met + + REAL(4), INTENT(IN) :: var(:, :) + REAL, INTENT(IN) :: var_range(2) + + REAL :: max_val, min_val + INTEGER :: index(2) + + index = 0 + max_val = MAXVAL(var) + min_val = MINVAL(var) + + IF (min_val < var_range(1)) THEN + index = FINDLOC(var, min_val) + END IF + + IF (max_val > var_range(2)) THEN + index = FINDLOC(var, max_val) + END IF + + IF (index(1) > 0) THEN + CALL range_abort(var_name, ktau, met, var(index(1), index(2)), & + var_range, index(1), & + patch(index(1))%latitude, patch(index(1))%longitude) + END IF + + END SUBROUTINE check_range_d2 + + SUBROUTINE check_range_d3(var_name, var, var_range, ktau, met) + + CHARACTER(LEN=*), INTENT(IN) :: var_name + INTEGER, INTENT(IN) :: ktau + TYPE(met_type), INTENT(IN) :: met + + REAL(4), INTENT(IN) :: var(:, :, :) + REAL, INTENT(IN) :: var_range(2) + INTEGER :: index(3) + REAL :: max_val, min_val + + index = 0 + max_val = MAXVAL(var) + min_val = MINVAL(var) + + IF (min_val < var_range(1)) THEN + index = FINDLOC(var, min_val) + END IF + + IF (max_val > var_range(2)) THEN + index = FINDLOC(var, max_val) + END IF + + IF (index(1) > 0) THEN + CALL range_abort(var_name, ktau, met, var(index(1), index(2), index(3)), var_range, & + index(1), patch(index(1))%latitude, patch(index(1))%longitude) + END IF + + END SUBROUTINE check_range_d3 + + SUBROUTINE constant_check_range(soil, veg, ktau, met) + ! Notes + ! Done for uncommented types in cable_def_types_mod + ! Commented ones in cable_def_types need to be checked + ! Commented ones here need to be range-specified + ! In future, it's better to have a callback for a derived type having both ranges and values + ! This also clashes with range checks in open_output_file + + TYPE(soil_parameter_type), INTENT(IN) :: soil + TYPE(veg_parameter_type), INTENT(IN) :: veg + + INTEGER, INTENT(IN) :: ktau + TYPE(met_type), INTENT(IN) :: met + + ! Soil + !~ 1D + + !~~ Integer + ! CALL check_range(soil%isoilm, ranges%isoilm) ! Review: isoilm vs isoil + ! CALL check_range(soil%nhorizons, ranges%nhorizons) + + !~~ r1 + CALL check_range("bch", soil%bch, ranges%bch, ktau, met) + CALL check_range("c3", soil%c3, ranges%c3, ktau, met) + CALL check_range("clay", soil%clay, ranges%clay, ktau, met) + CALL check_range("css", soil%css, ranges%css, ktau, met) + ! CALL check_range(soil%hsbh, ranges%hsbh, ktau, met) + CALL check_range("hyds", soil%hyds, ranges%hyds, ktau, met) + ! CALL check_range(soil%i2bp3, ranges%i2bp3, ktau, met) + ! CALL check_range(soil%ibp2, ranges%ibp2, ktau, met) + CALL check_range("rhosoil", soil%rhosoil, ranges%rhosoil, ktau, met) + CALL check_range("sand", soil%sand, ranges%sand, ktau, met) + CALL check_range("sfc", soil%sfc, ranges%sfc, ktau, met) + CALL check_range("silt", soil%silt, ranges%silt, ktau, met) + CALL check_range("ssat", soil%ssat, ranges%ssat, ktau, met) + CALL check_range("sucs", soil%sucs, ranges%sucs, ktau, met) + CALL check_range("swilt", soil%swilt, ranges%swilt, ktau, met) + CALL check_range("zse", soil%zse, ranges%zse, ktau, met) + ! CALL check_range(soil%zshh, ranges%zshh, ktau, met) + ! CALL check_range(soil%soilcol, ranges%soilcol, ktau, met) + ! CALL check_range(soil%albsoilf, ranges%albsoilf, ktau, met) ! Review: albsoil vs adding an f ?? + + ! CALL check_range(soil%cnsd, ranges%cnsd, ktau, met) + ! CALL check_range(soil%pwb_min, ranges%pwb_min, ktau, met) + + ! CALL check_range(soil%hkrz, ranges%hkrz, ktau, met) + ! CALL check_range(soil%zdepth, ranges%zdepth, ktau, met) + ! CALL check_range(soil%srf_frac_ma, ranges%srf_frac_ma, ktau, met) + ! CALL check_range(soil%edepth_ma, ranges%edepth_ma, ktau, met) + ! CALL check_range(soil%qhz_max, ranges%qhz_max, ktau, met) + ! CALL check_range(soil%qhz_efold, ranges%qhz_efold, ktau, met) + ! CALL check_range(soil%drain_dens, ranges%drain_dens, ktau, met) + ! CALL check_range(soil%elev, ranges%elev, ktau, met) + ! CALL check_range(soil%elev_std, ranges%elev_std, ktau, met) + ! CALL check_range(soil%slope, ranges%slope, ktau, met) + ! CALL check_range(soil%slope_std, ranges%slope_std, ktau, met) + ! CALL check_range(soil%GWsucs_vec, ranges%GWsucs_vec, ktau, met) + ! CALL check_range(soil%GWhyds_vec, ranges%GWhyds_vec, ktau, met) + ! CALL check_range(soil%GWbch_vec, ranges%GWbch_vec, ktau, met) + ! CALL check_range(soil%GWssat_vec, ranges%GWssat_vec, ktau, met) + ! CALL check_range(soil%GWwatr, ranges%GWwatr, ktau, met) + ! CALL check_range(soil%GWz, ranges%GWz, ktau, met) + ! CALL check_range(soil%GWdz, ranges%GWdz, ktau, met) + ! CALL check_range(soil%GWrhosoil_vec, ranges%GWrhosoil_vec, ktau, met) + + ! CALL check_range(soil%clitt, ranges%clitt, ktau, met) + ! CALL check_range(soil%zeta, ranges%zeta, ktau, met) + ! CALL check_range(soil%fsatma, ranges%fsatma, ktau, met) + + !~ 2D + !~~ Integer + ! CALL check_range(soil%ishorizon, ranges%ishorizon, ktau, met) + + !~~ Real + ! CALL check_range(soil%heat_cap_lower_limit, ranges%heat_cap_lower_limit, ktau, met) + CALL check_range("albsoil", soil%albsoil, ranges%albsoil, ktau, met) + + !~~ Real r2 + !~~~ REVIEW: soil%field_vec vs ranges%field + !~~~ without vec failing on 1x1 - zse and css + !~~~ CALL check_range(soil%zse_vec, ranges%zse_vec, ktau, met) + !~~~ CALL check_range(soil%css_vec, ranges%css_vec, ktau, met) + !~~~ CALL check_range(soil%cnsd_vec, ranges%cnsd, ktau, met) + + !~~~ CALL check_range(soil%sucs_vec, ranges%sucs, ktau, met) + !~~~ CALL check_range(soil%hyds_vec, ranges%hyds, ktau, met) + !~~~ CALL check_range(soil%bch_vec, ranges%bch, ktau, met) + !~~~ CALL check_range(soil%clay_vec, ranges%clay, ktau, met) + !~~~ CALL check_range(soil%sand_vec, ranges%sand, ktau, met) + !~~~ CALL check_range(soil%silt_vec, ranges%silt, ktau, met) + ! CALL check_range(soil%org_vec, ranges%org, ktau, met) + !~~~ CALL check_range(soil%rhosoil_vec, ranges%rhosoil, ktau, met) + !~~~ CALL check_range(soil%ssat_vec, ranges%ssat, ktau, met) + ! CALL check_range(soil%watr, ranges%watr, ktau, met) + !~~~ CALL check_range(soil%sfc_vec, ranges%sfc, ktau, met) + !~~~ CALL check_range(soil%swilt_vec, ranges%swilt, ktau, met) + + ! Vegetation + !~ 1D + !~~ Integer + CALL check_range("iveg", REAL(veg%iveg, 4), ranges%iveg, ktau, met) + ! CALL check_range(veg%iLU, ranges%iLU, ktau, met) + + !~~ Real + + CALL check_range("canst1", veg%canst1, ranges%canst1, ktau, met) + CALL check_range("dleaf", veg%dleaf, ranges%dleaf, ktau, met) + CALL check_range("ejmax", veg%ejmax, ranges%ejmax, ktau, met) + CALL check_range("meth", veg%meth, ranges%meth, ktau, met) + CALL check_range("frac4", veg%frac4, ranges%frac4, ktau, met) + CALL check_range("hc", veg%hc, ranges%hc, ktau, met) + ! CALL check_range("vlai", veg%vlai, ranges%vlai, ktau, met) + CALL check_range("xalbnir", veg%xalbnir, ranges%xalbnir, ktau, met) + CALL check_range("rp20", veg%rp20, ranges%rp20, ktau, met) + CALL check_range("rpcoef", veg%rpcoef, ranges%rpcoef, ktau, met) + CALL check_range("rs20", veg%rs20, ranges%rs20, ktau, met) + CALL check_range("shelrb", veg%shelrb, ranges%shelrb, ktau, met) + CALL check_range("vegcf", veg%vegcf, ranges%vegcf, ktau, met) + CALL check_range("tminvj", veg%tminvj, ranges%tminvj, ktau, met) + ! CALL check_range("toptvj", veg%toptvj, ranges%toptvj, ktau, met) + CALL check_range("tmaxvj", veg%tmaxvj, ranges%tmaxvj, ktau, met) + CALL check_range("vbeta", veg%vbeta, ranges%vbeta, ktau, met) + CALL check_range("vcmax", veg%vcmax, ranges%vcmax, ktau, met) + CALL check_range("xfang", veg%xfang, ranges%xfang, ktau, met) + CALL check_range("extkn", veg%extkn, ranges%extkn, ktau, met) + ! CALL check_range("vlaimax", veg%vlaimax, ranges%vlaimax, ktau, met) + CALL check_range("wai", veg%wai, ranges%wai, ktau, met) + ! CALL check_range("a1gs", veg%a1gs, ranges%a1gs, ktau, met) + ! CALL check_range("d0gs", veg%d0gs, ranges%d0gs, ktau, met) + ! CALL check_range("alpha", veg%alpha, ranges%alpha, ktau, met) + ! CALL check_range("convex", veg%convex, ranges%convex, ktau, met) + ! CALL check_range("cfrd", veg%cfrd, ranges%cfrd, ktau, met) + ! CALL check_range("gswmin", veg%gswmin, ranges%gswmin, ktau, met) + ! CALL check_range("conkc0", veg%conkc0, ranges%conkc0, ktau, met) + ! CALL check_range("conko0", veg%conko0, ranges%conko0, ktau, met) + ! CALL check_range("ekc", veg%ekc, ranges%ekc, ktau, met) + ! CALL check_range("eko", veg%eko, ranges%eko, ktau, met) + CALL check_range("g0", veg%g0, ranges%g0, ktau, met) + CALL check_range("g1", veg%g1, ranges%g1, ktau, met) + + !~~ Real r_2 + + CALL check_range("rootbeta", REAL(veg%rootbeta, 4), ranges%rootbeta, ktau, met) + ! CALL check_range("gamma", veg%gamma, ranges%gamma, ktau, met) + ! CALL check_range("ZR", veg%ZR, ranges%ZR, ktau, met) + ! CALL check_range("F10", veg%F10, ranges%F10, ktau, met) + ! CALL check_range("clit", veg%clit, ranges%clit, ktau, met) + + !~ 2D + + !~~ logical, public, DIMENSION(:, ktau, met), POINTER :: deciduous ! Review: No need of this since T/F + + !~~ Integer + ! CALL check_range("disturbance_interval", veg%disturbance_interval, ranges%disturbance_interval, ktau, met) + + !~~ Real + CALL check_range("refl", veg%refl, ranges%refl, ktau, met) + ! CALL check_range("taul", veg%taul, ranges%taul, ktau, met) + CALL check_range("froot", veg%froot, ranges%froot, ktau, met) + + !~~ Real r_2 + ! CALL check_range("disturbance_intensity", veg%disturbance_intensity, ranges%disturbance_intensity, ktau, met) + + END SUBROUTINE constant_check_range + !============================================================================== ! ! Name: mass_balance diff --git a/src/offline/cable_driver.F90 b/src/offline/cable_driver.F90 index c16038859..52bb1bfaa 100644 --- a/src/offline/cable_driver.F90 +++ b/src/offline/cable_driver.F90 @@ -63,7 +63,7 @@ PROGRAM cable_offline_driver USE cable_IO_vars_module, ONLY: logn,gswpfile,ncciy,leaps, & verbose, fixedCO2,output,check,patchout, & patch_type,landpt,soilparmnew,& - defaultLAI, sdoy, smoy, syear, timeunits, exists, calendar + defaultLAI, sdoy, smoy, syear, timeunits, exists, calendar, set_group_output_values USE casa_ncdf_module, ONLY: is_casa_time USE cable_common_module, ONLY: ktau_gl, kend_gl, knode_gl, cable_user, & cable_runtime, filename, myhome, & @@ -91,6 +91,7 @@ PROGRAM cable_offline_driver ncid_wd,ncid_mask USE cable_output_module, ONLY: create_restart,open_output_file, & write_output,close_output_file + USE cable_checks_module, ONLY: constant_check_range USE cable_write_module, ONLY: nullify_write USE cable_IO_vars_module, ONLY: timeunits,calendar USE cable_cbm_module, ONLY : cbm @@ -337,6 +338,10 @@ PROGRAM cable_offline_driver ENDIF ! INITIALISATION depending on nml settings + ! Initialise flags to output individual variables according to group + ! options from the namelist file + CALL set_group_output_values() + IF (TRIM(cable_user%MetType) .EQ. 'gswp' .OR. TRIM(cable_user%MetType) .EQ. 'gswp3') THEN IF ( CABLE_USER%YearStart.EQ.0 .AND. ncciy.GT.0) THEN CABLE_USER%YearStart = ncciy @@ -456,6 +461,7 @@ PROGRAM cable_offline_driver !$ YearEnd = CABLE_USER%YearEnd !$ cable_user%CASA_SPIN_ENDYEAR + SPINLOOP:DO WHILE ( SPINon ) NREP: DO RRRR = 1, NRRRR @@ -615,6 +621,11 @@ PROGRAM cable_offline_driver casamet, casabal, phen, POP, spinup, & CEMSOIL, CTFRZ, LUC_EXPT, POPLUC ) + IF (check%ranges) THEN + WRITE (*, *) "Checking parameter ranges" + CALL constant_check_range(soil, veg, 0, met) + END IF + IF ( CABLE_USER%POPLUC .AND. TRIM(CABLE_USER%POPLUC_RunType) .EQ. 'static') & CABLE_USER%POPLUC= .FALSE. ! Open output file: @@ -633,7 +644,7 @@ PROGRAM cable_offline_driver ENDIF IF (RRRR.EQ.1) THEN CALL nullify_write() ! nullify pointers - CALL open_output_file( dels, soil, veg, bgc, rough ) + CALL open_output_file( dels, soil, veg, bgc, rough, met) ENDIF ENDIF @@ -1220,7 +1231,7 @@ PROGRAM cable_offline_driver call WRITE_LANDUSE_CASA_RESTART_NC(cend(mland), lucmp, CASAONLY ) print *, 'writing cable restart: land use' - call create_landuse_cable_restart(logn, dels, ktau, soil, cend(mland),lucmp,cstart,cend,nap) + call create_landuse_cable_restart(logn, dels, ktau, soil, cend(mland),lucmp,cstart,cend,nap, met) print *, 'deallocating' call landuse_deallocate_mp(cend(mland),ms,msn,nrb,mplant,mlitter,msoil,mwood,lucmp) diff --git a/src/offline/cable_input.F90 b/src/offline/cable_input.F90 index cb9158371..901045ae7 100644 --- a/src/offline/cable_input.F90 +++ b/src/offline/cable_input.F90 @@ -57,6 +57,7 @@ MODULE cable_input_module USE casa_ncdf_module, ONLY: HANDLE_ERR USE casa_inout_module, ONLY: casa_readphen, casa_init USE casa_readbiome_module, ONLY: casa_readbiome + USE cable_checks_module, ONLY: check_range IMPLICIT NONE @@ -483,6 +484,10 @@ SUBROUTINE open_met_file(dels,koffset,kend,spinup, TFRZ) IF (ok /= NF90_NOERR) CALL nc_abort & (ok,'Error opening netcdf met forcing file '//TRIM(filename%met)// & ' (SUBROUTINE open_met_file)') + ! R. Law (rml599gh) 30/05/24 ncid_mask needs to be set to ncid_met + ! if reading a met data file otherwise code crashes if trying to do + ! multiple sites with a met data file + ncid_mask = ncid_met ENDIF !=====================VV Determine spatial details VV================= @@ -2478,26 +2483,13 @@ SUBROUTINE get_met_data(spinup,spinConv,met,soil,rad, & met%tvrad = met%tk IF(check%ranges) THEN ! Check ranges are okay: - !jhan:quick fix, use dimension 1 here arbitrarily - IF(ANY(met%fsd(:,1)ranges%SWdown(2))) & - CALL abort('SWdown out of specified ranges!') - IF(ANY(met%fsd(:,2)ranges%SWdown(2))) & - CALL abort('SWdown out of specified ranges!') - IF(ANY(met%fldranges%LWdown(2))) & - CALL abort('LWdown out of specified ranges!') - IF(ANY(met%qvranges%Qair(2))) & - CALL abort('Qair out of specified ranges!') - IF(ANY(met%precipranges%Rainf(2))) THEN - CALL abort('Rainf out of specified ranges!') - ENDIF - IF(ANY(met%uaranges%Wind(2))) & - CALL abort('Wind out of specified ranges!') - IF(ANY(met%tkranges%Tair(2))) & - CALL abort('Tair out of specified ranges!') - IF(ANY(met%pmbranges%PSurf(2))) THEN - WRITE(*,*) "min, max Psurf", MINVAL(met%pmb), MAXVAL(met%pmb),ranges%Psurf(1), ranges%Psurf(2) - CALL abort('PSurf out of specified ranges!') - ENDIF + CALL check_range("SWdown", met%fsd, ranges%SWdown, 0, met) + CALL check_range("LWdown", met%fld, ranges%LWdown, 0, met) + CALL check_range("Qair", met%qv, ranges%Qair, 0, met) + CALL check_range("Rainf", met%precip, ranges%Rainf, 0, met) + CALL check_range("Wind", met%ua, ranges%Wind, 0, met) + CALL check_range("Tair", met%tk, ranges%Tair, 0, met) + CALL check_range("PSurf", met%pmb, ranges%PSurf, 0, met) END IF END SUBROUTINE get_met_data diff --git a/src/offline/cable_iovars.F90 b/src/offline/cable_iovars.F90 index d26a1d235..caf711247 100644 --- a/src/offline/cable_iovars.F90 +++ b/src/offline/cable_iovars.F90 @@ -399,8 +399,16 @@ MODULE cable_IO_vars_module TYPE(output_inclusion_type),SAVE :: output TYPE(output_inclusion_type),SAVE :: patchout ! do we want patch-specific info + ENUM, BIND(C) + ENUMERATOR :: NO_CHECK = 0 + ENUMERATOR :: ON_TIMESTEP = 1 + ENUMERATOR :: ON_WRITE = 2 + ENUMERATOR :: RANGE_CHECK + END ENUM TYPE checks_type - LOGICAL :: ranges, energy_bal, mass_bal + LOGICAL :: energy_bal, mass_bal + INTEGER(KIND(RANGE_CHECK)) :: ranges ! 0 = NO , 1 = TIMESTEP , 2 = WRITE + LOGICAL :: exit END TYPE checks_type TYPE(checks_type) :: check ! what types of checks to perform @@ -413,5 +421,137 @@ MODULE cable_IO_vars_module ! For threading: !$OMP THREADPRIVATE(landpt,patch) +CONTAINS + SUBROUTINE set_group_output_values + + !*#Purpose: + ! Set individual variables to output according to the values of the group options from the namelist entries in `output%`. + IF (output%params) THEN + output%iveg = .TRUE. + output%patchfrac = .TRUE. + output%isoil = .TRUE. + output%bch = .TRUE. + output%clay = .TRUE. + output%sand = .TRUE. + output%silt = .TRUE. + output%css = .TRUE. + output%rhosoil = .TRUE. + output%hyds = .TRUE. + output%sucs = .TRUE. + output%rs20 = .TRUE. + output%ssat = .TRUE. + output%sfc = .TRUE. + output%swilt = .TRUE. + output%albsoil = .TRUE. + output%canst1 = .TRUE. + output%dleaf = .TRUE. + output%ejmax = .TRUE. + output%vcmax = .TRUE. + output%frac4 = .TRUE. + output%hc = .TRUE. + output%rp20 = .TRUE. + output%g0 = .TRUE. + output%g1 = .TRUE. + output%rpcoef = .TRUE. + output%shelrb = .TRUE. + output%xfang = .TRUE. + output%wai = .TRUE. + output%vegcf = .TRUE. + output%extkn = .TRUE. + output%tminvj = .TRUE. + output%tmaxvj = .TRUE. + output%vbeta = .TRUE. + output%xalbnir = .TRUE. + output%meth = .TRUE. + output%za = .TRUE. + output%ratecp = .TRUE. + output%ratecs = .TRUE. + output%froot = .TRUE. + output%zse = .TRUE. + output%slope = .TRUE. + output%slope_std = .TRUE. + output%GWdz = .TRUE. + END IF + + IF (output%met) THEN + output%Swdown = .TRUE. + output%Lwdown = .TRUE. + output%Rainf = .TRUE. + output%Snowf = .TRUE. + output%PSurf = .TRUE. + output%Tair = .TRUE. + output%Qair = .TRUE. + output%Wind = .TRUE. + output%CO2air = .TRUE. + END IF + + IF (output%flux) THEN + output%Qmom = .TRUE. + output%Qh = .TRUE. + output%Qle = .TRUE. + output%Qg = .TRUE. + output%Qs = .TRUE. + output%Qsb = .TRUE. + output%Evap = .TRUE. + output%ECanop = .TRUE. + output%TVeg = .TRUE. + output%ESoil = .TRUE. + output%HVeg = .TRUE. + output%HSoil = .TRUE. + output%RNetSoil = .TRUE. + output%NEE = .TRUE. + END IF + + IF (output%soil) THEN + output%SoilMoist = .TRUE. + output%SoilTemp = .TRUE. + output%BaresoilT = .TRUE. + output%WatTable = .TRUE. + output%GWMoist = .TRUE. + output%SatFrac = .TRUE. + output%Qrecharge = .TRUE. + END IF + + IF (output%snow) THEN + output%SWE = .TRUE. + output%SnowT = .TRUE. + output%SnowDepth = .TRUE. + END IF + + IF (output%radiation) THEN + output%Swnet = .TRUE. + output%Lwnet = .TRUE. + output%Rnet = .TRUE. + output%Albedo = .TRUE. + output%RadT = .TRUE. + END IF + + IF (output%veg) THEN + output%Tscrn = .TRUE. + output%Tex = .TRUE. + output%Qscrn = .TRUE. + output%VegT = .TRUE. + output%CanT = .TRUE. + output%Fwsoil = .TRUE. + output%CanopInt = .TRUE. + output%LAI = .TRUE. + END IF + + IF (output%balances) THEN + output%Ebal = .TRUE. + output%Wbal = .TRUE. + END IF + + IF (output%carbon) THEN + output%GPP = .TRUE. + output%NPP = .TRUE. + output%NBP = .TRUE. + output%NEE = .TRUE. + output%AutoResp = .TRUE. + output%LeafResp = .TRUE. + output%HeteroResp = .TRUE. + END IF + + END SUBROUTINE set_group_output_values END MODULE cable_IO_vars_module diff --git a/src/offline/cable_mpimaster.F90 b/src/offline/cable_mpimaster.F90 index 0e030c354..0c868afa3 100644 --- a/src/offline/cable_mpimaster.F90 +++ b/src/offline/cable_mpimaster.F90 @@ -746,7 +746,7 @@ SUBROUTINE mpidrv_master (comm) ENDIF IF (YYYY.EQ.CABLE_USER%YEARSTART) THEN CALL nullify_write() ! nullify pointers - CALL open_output_file( dels, soil, veg, bgc, rough ) + CALL open_output_file( dels, soil, veg, bgc, rough, met) ENDIF ENDIF @@ -1448,7 +1448,7 @@ SUBROUTINE mpidrv_master (comm) call WRITE_LANDUSE_CASA_RESTART_NC(cend(mland), lucmp, CASAONLY ) - call create_landuse_cable_restart(logn, dels, ktau, soil, cend(mland),lucmp,cstart,cend,nap) + call create_landuse_cable_restart(logn, dels, ktau, soil, cend(mland),lucmp,cstart,cend,nap, met) call landuse_deallocate_mp(cend(mland),ms,msn,nrb,mplant,mlitter,msoil,mwood,lucmp) ENDIF diff --git a/src/offline/cable_output.F90 b/src/offline/cable_output.F90 index 62014905b..a30603432 100644 --- a/src/offline/cable_output.F90 +++ b/src/offline/cable_output.F90 @@ -40,15 +40,15 @@ MODULE cable_output_module USE cable_def_types_mod USE casavariable, ONLY: casa_pool, casa_flux, casa_met USE cable_IO_vars_module - USE cable_checks_module, ONLY: mass_balance, energy_balance, ranges + USE cable_checks_module, ONLY: mass_balance, energy_balance, ranges, check_range USE cable_write_module USE netcdf USE cable_common_module, ONLY: filename, calcsoilalbedo, CurYear,IS_LEAPYEAR, cable_user,& gw_params IMPLICIT NONE PRIVATE - PUBLIC open_output_file, write_output, close_output_file, create_restart - INTEGER :: ncid_out ! output data netcdf file ID + PUBLIC open_output_file, write_output, close_output_file, create_restart, check_and_write, output_par_settings_type + INTEGER :: ncid_out, ncid_restart ! output/restart data netcdf file ID REAL :: missing_value = -999999.0 ! for netcdf output TYPE out_varID_type ! output variable IDs in netcdf file INTEGER :: SWdown, LWdown, Wind, Wind_E, PSurf, & @@ -230,12 +230,40 @@ MODULE cable_output_module REAL(KIND=4), POINTER, DIMENSION(:) :: RootResp ! autotrophic root respiration [umol/m2/s] REAL(KIND=4), POINTER, DIMENSION(:) :: StemResp ! autotrophic stem respiration [umol/m2/s] END TYPE output_temporary_type + + TYPE output_var_settings_type + TYPE(met_type), POINTER :: met + LOGICAL :: writenow + ! Optional + CHARACTER(LEN=15) :: dimswitch = 'default' + END TYPE output_var_settings_type + TYPE output_par_settings_type + TYPE(met_type), POINTER :: met + ! Optional + LOGICAL :: restart = .FALSE. + CHARACTER(LEN=15) :: dimswitch = 'default' + END TYPE output_par_settings_type TYPE(output_temporary_type), SAVE :: out INTEGER :: ok ! netcdf error status + + ! Some Additional internal variables + INTEGER :: out_timestep ! counter for output time steps + + INTERFACE check_and_write + MODULE PROCEDURE :: check_and_write_d1 + MODULE PROCEDURE :: check_and_write_d2 + MODULE PROCEDURE :: check_and_write_d1_p + MODULE PROCEDURE :: check_and_write_d2_p + END INTERFACE check_and_write + + INTERFACE generate_out_write_acc + MODULE PROCEDURE :: generate_out_write_acc_d1 + MODULE PROCEDURE :: generate_out_write_acc_d2 + END INTERFACE generate_out_write_acc CONTAINS - SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) + SUBROUTINE open_output_file(dels, soil, veg, bgc, rough, met) ! Creates netcdf output file, defines all variables ! and writes parameters to it if requested by user. REAL, INTENT(IN) :: dels ! time step size @@ -243,7 +271,8 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) TYPE (veg_parameter_type), INTENT(IN) :: veg ! vegetation parameters TYPE (bgc_pool_type), INTENT(IN) :: bgc TYPE (roughness_type), INTENT(IN) :: rough - ! REAL, POINTER,DIMENSION(:,:) :: surffrac ! fraction of each surf type + TYPE (met_type), TARGET, INTENT(IN) :: met + ! REAL, POINTER :: surffrac(:, :) ! fraction of each surf type INTEGER :: xID, yID, zID, radID, soilID, soilcarbID, & plantcarbID, tID, landID, patchID ! dimension IDs @@ -252,8 +281,9 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) ! INTEGER :: surffracID ! surface fraction varaible ID CHARACTER(LEN=10) :: todaydate, nowtime ! used to timestamp netcdf file + TYPE(output_par_settings_type) :: out_settings - + out_settings = output_par_settings_type(met=met, restart=.FALSE.) ! Create output file: ok = NF90_CREATE(filename%out, NF90_CLOBBER, ncid_out) @@ -403,63 +433,64 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) !=============DEFINE OUTPUT VARIABLES======================================= ! Define met forcing variables in output file and allocate temp output vars: - IF(output%met .OR. output%SWdown) THEN + + IF(output%SWdown) THEN CALL define_ovar(ncid_out, & ovid%SWdown, 'SWdown', 'W/m^2', 'Downward shortwave radiation', & patchout%SWdown, 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%SWdown(mp)) out%SWdown = 0.0 ! initialise END IF - IF(output%met .OR. output%LWdown) THEN + IF(output%LWdown) THEN CALL define_ovar(ncid_out, ovid%LWdown, 'LWdown', 'W/m^2', & 'Downward longwave radiation', patchout%LWdown, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%LWdown(mp)) out%LWdown = 0.0 ! initialise END IF - IF(output%met .OR. output%Tair) THEN + IF(output%Tair) THEN CALL define_ovar(ncid_out, ovid%Tair, & 'Tair', 'K', 'Surface air temperature', patchout%Tair, & 'ALMA', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Tair(mp)) out%Tair = 0.0 ! initialise END IF - IF(output%met .OR. output%Rainf) THEN + IF(output%Rainf) THEN CALL define_ovar(ncid_out, ovid%Rainf, 'Rainf', & 'kg/m^2/s', 'Rainfall+snowfall', patchout%Rainf, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Rainf(mp)) out%Rainf = 0.0 ! initialise END IF - IF(output%met .OR. output%Snowf) THEN + IF(output%Snowf) THEN CALL define_ovar(ncid_out, ovid%Snowf, 'Snowf', & 'kg/m^2/s', 'Snowfall', patchout%Snowf, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Snowf(mp)) out%Snowf = 0.0 ! initialise END IF - IF(output%met .OR. output%Qair) THEN + IF(output%Qair) THEN CALL define_ovar(ncid_out, ovid%Qair, 'Qair', & 'kg/kg', 'Surface specific humidity', patchout%Qair, & 'ALMA', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Qair(mp)) out%Qair = 0.0 ! initialise END IF - IF(output%met .OR. output%Wind) THEN + IF(output%Wind) THEN CALL define_ovar(ncid_out, ovid%Wind, 'Wind', & 'm/s', 'Scalar surface wind speed', patchout%Wind, & 'ALMA', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Wind(mp)) out%Wind = 0.0 ! initialise END IF - IF(output%met .OR. output%PSurf) THEN + IF(output%PSurf) THEN CALL define_ovar(ncid_out, ovid%PSurf, 'PSurf', & 'hPa', 'Surface air pressure', patchout%PSurf, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%PSurf(mp)) out%PSurf = 0.0 ! initialise END IF - IF(output%met .OR. output%CO2air) THEN + IF(output%CO2air) THEN CALL define_ovar(ncid_out, ovid%CO2air, 'CO2air', 'ppmv', & 'Surface air CO2 concentration', patchout%CO2air, & 'ALMA', xID, yID, zID, landID, patchID, tID) @@ -468,21 +499,21 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) END IF ! Define surface flux variables in output file and allocate temp output ! vars: - IF(output%flux .OR. output%Qmom) THEN + IF(output%Qmom) THEN CALL define_ovar(ncid_out, ovid%Qmom, 'Qmom', 'kg/m/s2', & 'Surface momentum flux',patchout%Qmom,'dummy', & xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Qmom(mp)) out%Qmom = 0.0 ! initialise END IF - IF(output%flux .OR. output%Qle) THEN + IF(output%Qle) THEN CALL define_ovar(ncid_out, ovid%Qle, 'Qle', 'W/m^2', & 'Surface latent heat flux',patchout%Qle,'dummy', & xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Qle(mp)) out%Qle = 0.0 ! initialise END IF - IF(output%flux .OR. output%Qh) THEN + IF(output%Qh) THEN CALL define_ovar(ncid_out,ovid%Qh,'Qh', 'W/m^2', & 'Surface sensible heat flux',patchout%Qh,'dummy', & xID,yID,zID,landID,patchID,tID) @@ -490,63 +521,63 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) out%Qh = 0.0 ! initialise END IF - IF(output%flux .OR. output%Qg) THEN + IF(output%Qg) THEN CALL define_ovar(ncid_out, ovid%Qg, 'Qg', 'W/m^2', & 'Surface ground heat flux', patchout%Qg, 'dummy', & xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Qg(mp)) out%Qg = 0.0 ! initialise END IF - IF(output%flux .OR. output%Qs) THEN + IF(output%Qs) THEN CALL define_ovar(ncid_out, ovid%Qs, 'Qs', & 'kg/m^2/s', 'Surface runoff', patchout%Qs, 'dummy', & xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Qs(mp)) out%Qs = 0.0 ! initialise END IF - IF(output%flux .OR. output%Qsb) THEN + IF(output%Qsb) THEN CALL define_ovar(ncid_out, ovid%Qsb, 'Qsb', 'kg/m^2/s', & 'Subsurface runoff', patchout%Qsb, 'dummy', & xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Qsb(mp)) out%Qsb = 0.0 ! initialise END IF - IF(output%flux .OR. output%Evap) THEN + IF(output%Evap) THEN CALL define_ovar(ncid_out, ovid%Evap,'Evap', 'kg/m^2/s', & 'Total evapotranspiration', patchout%Evap, 'dummy', & xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Evap(mp)) out%Evap = 0.0 ! initialise END IF - IF(output%flux .OR. output%ECanop) THEN + IF(output%ECanop) THEN CALL define_ovar(ncid_out, ovid%Ecanop, 'ECanop', 'kg/m^2/s', & 'Wet canopy evaporation', patchout%ECanop, 'dummy', & xID, yID, zID, landID, patchID, tID) ALLOCATE(out%ECanop(mp)) out%ECanop = 0.0 ! initialise END IF - IF(output%flux .OR. output%TVeg) THEN + IF(output%TVeg) THEN CALL define_ovar(ncid_out, ovid%TVeg, 'TVeg', 'kg/m^2/s', & 'Vegetation transpiration', patchout%TVeg, 'dummy', & xID, yID, zID, landID, patchID, tID) ALLOCATE(out%TVeg(mp)) out%TVeg = 0.0 ! initialise END IF - IF(output%flux .OR. output%ESoil) THEN + IF(output%ESoil) THEN CALL define_ovar(ncid_out, ovid%ESoil, 'ESoil', 'kg/m^2/s', & 'Evaporation from soil', patchout%ESoil, 'dummy', & xID, yID, zID, landID, patchID, tID) ALLOCATE(out%ESoil(mp)) out%ESoil = 0.0 ! initialise END IF - IF(output%flux .OR. output%HVeg) THEN + IF(output%HVeg) THEN CALL define_ovar(ncid_out, ovid%HVeg, 'HVeg', 'W/m^2', & 'Sensible heat from vegetation', patchout%HVeg, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%HVeg(mp)) out%HVeg = 0.0 ! initialise END IF - IF(output%flux .OR. output%HSoil) THEN + IF(output%HSoil) THEN CALL define_ovar(ncid_out, ovid%HSoil, 'HSoil', 'W/m^2', & 'Sensible heat from soil', patchout%HSoil, 'dummy', & xID, yID, zID, landID, patchID, tID) @@ -559,7 +590,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) ALLOCATE(out%RnetSoil(mp)) out%RnetSoil = 0.0 ! initialise END IF - IF(output%flux .OR. output%carbon .OR. output%NEE) THEN + IF(output%NEE) THEN CALL define_ovar(ncid_out, ovid%NEE, 'NEE', 'umol/m^2/s', & 'Net ecosystem exchange of CO2', patchout%NEE, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -570,7 +601,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) ! Define soil state variables in output file and allocate temp output vars: - IF(output%soil .OR. output%SoilMoist) THEN + IF(output%SoilMoist) THEN CALL define_ovar(ncid_out, ovid%SoilMoist, 'SoilMoist', 'm^3/m^3', & 'Average layer soil moisture', patchout%SoilMoist, & 'soil', xID, yID, zID, landID, patchID, soilID, tID) @@ -582,14 +613,14 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) out%SoilMoist = 0.0 ! initialise out%SoilMoistIce = 0.0 ! initialise END IF - IF(output%soil .OR. output%SoilTemp) THEN + IF(output%SoilTemp) THEN CALL define_ovar(ncid_out, ovid%SoilTemp, 'SoilTemp', 'K', & 'Average layer soil temperature', patchout%SoilTemp, & 'soil', xID, yID, zID, landID, patchID, soilID, tID) ALLOCATE(out%SoilTemp(mp,ms)) out%SoilTemp = 0.0 ! initialise END IF - IF(output%soil .OR. output%BaresoilT) THEN + IF(output%BaresoilT) THEN CALL define_ovar(ncid_out, ovid%BaresoilT, 'BaresoilT', & 'K', 'Bare soil temperature', patchout%BaresoilT, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -597,7 +628,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) out%BaresoilT = 0.0 ! initialise END IF ! Define snow state variables in output file and allocate temp output vars: - IF(output%snow .OR. output%SWE) THEN + IF(output%SWE) THEN CALL define_ovar(ncid_out, ovid%SWE, 'SWE', 'kg/m^2', & 'Snow water equivalent', patchout%SWE, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -610,14 +641,14 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) ALLOCATE(out%SnowMelt(mp)) out%SnowMelt = 0.0 ! initialise END IF - IF(output%snow .OR. output%SnowT) THEN + IF(output%SnowT) THEN CALL define_ovar(ncid_out, ovid%SnowT, 'SnowT', 'K', & 'Snow surface temperature', patchout%SnowT, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%SnowT(mp)) out%SnowT = 0.0 ! initialise END IF - IF(output%snow .OR. output%SnowDepth) THEN + IF(output%SnowDepth) THEN CALL define_ovar(ncid_out, ovid%SnowDepth, 'SnowDepth', & 'm', 'Snow depth', patchout%SnowDepth, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -625,7 +656,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) out%SnowDepth = 0.0 ! initialise END IF ! Define radiative variables in output file and allocate temp output vars: - IF(output%radiation .OR. output%SWnet) THEN + IF(output%SWnet) THEN CALL define_ovar(ncid_out, ovid%SWnet, 'SWnet', 'W/m^2', & 'Net shortwave radiation absorbed by surface', & patchout%SWnet, 'dummy', xID, yID, zID, landID, & @@ -633,7 +664,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) ALLOCATE(out%SWnet(mp)) out%SWnet = 0.0 ! initialise END IF - IF(output%radiation .OR. output%LWnet) THEN + IF(output%LWnet) THEN CALL define_ovar(ncid_out, ovid%LWnet, 'LWnet', 'W/m^2', & 'Net longwave radiation absorbed by surface', & patchout%LWnet, 'dummy', xID, yID, zID, landID, & @@ -641,14 +672,14 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) ALLOCATE(out%LWnet(mp)) out%LWnet = 0.0 ! initialise END IF - IF(output%radiation .OR. output%Rnet) THEN + IF(output%Rnet) THEN CALL define_ovar(ncid_out, ovid%Rnet, 'Rnet', 'W/m^2', & 'Net radiation absorbed by surface', patchout%Rnet, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Rnet(mp)) out%Rnet = 0.0 ! initialise END IF - IF(output%radiation .OR. output%Albedo) THEN + IF(output%Albedo) THEN CALL define_ovar(ncid_out, ovid%Albedo, 'Albedo', '-', & 'Surface albedo', patchout%Albedo, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -658,14 +689,14 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) ! output calc of soil albedo based on colour? - Ticket #27 IF (calcsoilalbedo) THEN - IF(output%radiation .OR. output%visAlbedo) THEN + IF(output%visAlbedo) THEN CALL define_ovar(ncid_out, ovid%visAlbedo, 'visAlbedo', '-', & 'Surface vis albedo', patchout%visAlbedo, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%visAlbedo(mp)) out%visAlbedo = 0.0 ! initialise END IF - IF(output%radiation .OR. output%nirAlbedo) THEN + IF(output%nirAlbedo) THEN CALL define_ovar(ncid_out, ovid%nirAlbedo, 'nirAlbedo', '-', & 'Surface nir albedo', patchout%nirAlbedo, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -674,7 +705,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) END IF END IF - IF(output%radiation .OR. output%RadT) THEN + IF(output%RadT) THEN CALL define_ovar(ncid_out, ovid%RadT, 'RadT', 'K', & 'Radiative surface temperature', patchout%RadT, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -683,7 +714,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) END IF ! Define vegetation variables in output file and allocate temp output vars: ! REV_CORR - new output variables. - IF(output%Tscrn .OR. output%veg) THEN + IF(output%Tscrn) THEN CALL define_ovar(ncid_out, ovid%Tscrn, & 'Tscrn', 'oC', 'screen level air temperature', & patchout%Tscrn, & @@ -691,7 +722,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) ALLOCATE(out%Tscrn(mp)) out%Tscrn = 0.0 ! initialise END IF - IF (output%Tex .OR. output%veg) THEN + IF (output%Tex) THEN IF((output%averaging(1:2) == 'da').OR.(output%averaging(1:2)=='mo')) THEN CALL define_ovar(ncid_out, ovid%Txx, & 'Txx', 'oC', 'max screen-level T in reporting period',& @@ -725,7 +756,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) out%Tdaymn = 1.0E6 ENDIF ENDIF - IF(output%Qscrn .OR. output%veg) THEN + IF(output%Qscrn) THEN CALL define_ovar(ncid_out, ovid%Qscrn, & 'Qscrn', 'kg/kg', 'screen level specific humdity', & patchout%Qscrn, & @@ -733,35 +764,35 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) ALLOCATE(out%Qscrn(mp)) out%Qscrn = 0.0 ! initialise END IF - IF(output%veg .OR. output%VegT) THEN + IF(output%VegT) THEN CALL define_ovar(ncid_out, ovid%VegT, 'VegT', 'K', & 'Average vegetation temperature', patchout%VegT, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%VegT(mp)) out%VegT = 0.0 ! initialise END IF - IF(output%veg .OR. output%CanT) THEN + IF(output%CanT) THEN CALL define_ovar(ncid_out, ovid%CanT, 'CanT', 'K', & 'Within-canopy temperature', patchout%CanT, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%CanT(mp)) out%CanT = 0.0 ! initialise END IF - IF(output%veg .OR. output%Fwsoil) THEN + IF(output%Fwsoil) THEN CALL define_ovar(ncid_out, ovid%Fwsoil, 'Fwsoil', '[-]', & 'soil moisture modifier to stomatal conductance', patchout%Fwsoil, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Fwsoil(mp)) out%Fwsoil = 0.0 ! initialise END IF - IF(output%veg .OR. output%CanopInt) THEN + IF(output%CanopInt) THEN CALL define_ovar(ncid_out, ovid%CanopInt, 'CanopInt', 'kg/m^2', & 'Canopy intercepted water storage', patchout%CanopInt, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%CanopInt(mp)) out%CanopInt = 0.0 ! initialise END IF - IF(output%veg .OR. output%LAI) THEN + IF(output%LAI) THEN CALL define_ovar(ncid_out, ovid%LAI, 'LAI', '-', & 'Leaf area index', patchout%LAI, 'dummy', xID, & yID, zID, landID, patchID, tID) @@ -769,14 +800,14 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) out%LAI = 0.0 ! initialise END IF ! Define balance variables in output file and allocate temp output vars: - IF(output%balances .OR. output%Ebal) THEN + IF(output%Ebal) THEN CALL define_ovar(ncid_out, ovid%Ebal, 'Ebal', 'W/m^2', & 'Cumulative energy imbalance', patchout%Ebal, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%Ebal(mp)) out%Ebal = 0.0 ! initialise END IF - IF(output%balances .OR. output%Wbal) THEN + IF(output%Wbal) THEN CALL define_ovar(ncid_out, ovid%Wbal, 'Wbal', 'kg/m^2', & 'Cumulative water imbalance', patchout%Wbal, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -784,14 +815,14 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) out%Wbal = 0.0 ! initialise END IF ! Define carbon variables in output file and allocate temp output vars: - IF(output%carbon .OR. output%AutoResp) THEN + IF(output%AutoResp) THEN CALL define_ovar(ncid_out, ovid%AutoResp, 'AutoResp', 'umol/m^2/s', & 'Autotrophic respiration', patchout%AutoResp, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%AutoResp(mp)) out%AutoResp = 0.0 ! initialise END IF - IF(output%casa .OR. output%AutoResp) THEN + IF(output%casa .AND. output%AutoResp) THEN CALL define_ovar(ncid_out, ovid%RootResp, 'RootResp', 'umol/m^2/s', & 'Fine Root Autotrophic respiration', patchout%AutoResp, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -799,7 +830,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) out%RootResp = 0.0 ! initialise END IF - IF(output%casa .OR. output%AutoResp) THEN + IF(output%casa .AND. output%AutoResp) THEN CALL define_ovar(ncid_out, ovid%StemResp, 'StemResp', 'umol/m^2/s', & 'StemWood Autotrophic respiration', patchout%AutoResp, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -807,21 +838,21 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) out%StemResp = 0.0 ! initialise END IF - IF(output%carbon .OR. output%LeafResp) THEN + IF(output%LeafResp) THEN CALL define_ovar(ncid_out, ovid%LeafResp, 'LeafResp', 'umol/m^2/s', & 'Leaf respiration', patchout%LeafResp, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%LeafResp(mp)) out%LeafResp = 0.0 ! initialise END IF - IF(output%carbon .OR. output%HeteroResp) THEN + IF(output%HeteroResp) THEN CALL define_ovar(ncid_out, ovid%HeteroResp, 'HeteroResp', 'umol/m^2/s', & 'Heterotrophic respiration', patchout%HeteroResp, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%HeteroResp(mp)) out%HeteroResp = 0.0 ! initialise END IF - IF(output%carbon.OR.output%GPP) THEN + IF(output%GPP) THEN CALL define_ovar(ncid_out, ovid%GPP, 'GPP', 'umol/m^2/s', & 'Gross primary production', patchout%GPP, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -835,7 +866,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) - IF(output%carbon .OR. output%NPP) THEN + IF(output%NPP) THEN CALL define_ovar(ncid_out, ovid%NPP, 'NPP', 'umol/m^2/s', & 'Net primary production', patchout%NPP, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -844,14 +875,14 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) END IF !MD groundwater related variables - IF(output%soil .OR. output%WatTable) THEN + IF(output%WatTable) THEN CALL define_ovar(ncid_out, ovid%WatTable, 'WatTable', 'm', & 'Water Table Depth', patchout%WatTable, & 'dummy', xID, yID, zID, landID, patchID, tID) ALLOCATE(out%WatTable(mp)) out%WatTable = 0.0 ! initialise END IF - IF(output%soil .OR. output%GWMoist) THEN + IF(output%GWMoist) THEN CALL define_ovar(ncid_out, ovid%GWMoist, 'GWMoist', 'mm3/mm3', & 'Aquifer mositure content', patchout%GWMoist, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -859,7 +890,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) out%GWMoist = 0.0 ! initialise END IF - IF(output%soil .OR. output%SatFrac) THEN + IF(output%SatFrac) THEN CALL define_ovar(ncid_out, ovid%SatFrac, 'SatFrac', 'unitless', & 'Saturated Fraction of Gridcell', patchout%SatFrac, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -867,7 +898,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) out%SatFrac = 0.0 ! initialise END IF - IF(output%soil .OR. output%Qrecharge) THEN + IF(output%Qrecharge) THEN CALL define_ovar(ncid_out, ovid%Qrecharge, 'Qrecharge', 'mm/s', & 'Recharge to or from Aquifer', patchout%Qrecharge, & 'dummy', xID, yID, zID, landID, patchID, tID) @@ -1034,7 +1065,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) ! Define CABLE parameters in output file: - IF(output%params .OR. output%iveg) CALL define_ovar(ncid_out, opid%iveg, & + IF(output%iveg) CALL define_ovar(ncid_out, opid%iveg, & 'iveg', '-', 'Vegetation type', patchout%iveg, 'integer', & xID, yID, zID, landID, patchID) @@ -1046,7 +1077,7 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) ELSE - IF((output%params .OR. output%patchfrac) & + IF((output%patchfrac) & .AND. (patchout%patchfrac .OR. output%patch)) & CALL define_ovar(ncid_out, opid%patchfrac, 'patchfrac', '-', & 'Fractional cover of vegetation patches', patchout%patchfrac, 'real', & @@ -1055,123 +1086,123 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) ENDIF - IF(output%params .OR. output%isoil) CALL define_ovar(ncid_out, opid%isoil, & + IF(output%isoil) CALL define_ovar(ncid_out, opid%isoil, & 'isoil', '-', 'Soil type', patchout%isoil, 'integer', & xID, yID, zID, landID, patchID) - IF(output%params .OR. output%bch) CALL define_ovar(ncid_out, opid%bch, & + IF(output%bch) CALL define_ovar(ncid_out, opid%bch, & 'bch', '-', 'Parameter b, Campbell eqn 1985', patchout%bch, 'real', & xID, yID, zID, landID, patchID) - IF(output%params .OR. output%clay) CALL define_ovar(ncid_out, opid%clay, & + IF(output%clay) CALL define_ovar(ncid_out, opid%clay, & 'clay', '-', 'Fraction of soil which is clay', patchout%clay, 'real', & xID, yID, zID, landID, patchID) - IF(output%params .OR. output%sand) CALL define_ovar(ncid_out, opid%sand, & + IF(output%sand) CALL define_ovar(ncid_out, opid%sand, & 'sand', '-', 'Fraction of soil which is sand', patchout%sand, 'real', & xID, yID, zID, landID, patchID) - IF(output%params .OR. output%silt) CALL define_ovar(ncid_out, opid%silt, & + IF(output%silt) CALL define_ovar(ncid_out, opid%silt, & 'silt', '-', 'Fraction of soil which is silt', patchout%silt, 'real', & xID, yID, zID, landID, patchID) - IF(output%params .OR. output%ssat) CALL define_ovar(ncid_out, opid%ssat, & + IF(output%ssat) CALL define_ovar(ncid_out, opid%ssat, & 'ssat', '-', 'Fraction of soil volume which is water @ saturation', & patchout%ssat, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%sfc) CALL define_ovar(ncid_out, opid%sfc, & + IF(output%sfc) CALL define_ovar(ncid_out, opid%sfc, & 'sfc', '-', 'Fraction of soil volume which is water @ field capacity', & patchout%sfc, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%swilt) CALL define_ovar(ncid_out, opid%swilt, & + IF(output%swilt) CALL define_ovar(ncid_out, opid%swilt, & 'swilt', '-', 'Fraction of soil volume which is water @ wilting point', & patchout%swilt, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%hyds) CALL define_ovar(ncid_out, opid%hyds, & + IF(output%hyds) CALL define_ovar(ncid_out, opid%hyds, & 'hyds', 'm/s', 'Hydraulic conductivity @ saturation', & patchout%hyds, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%sucs) CALL define_ovar(ncid_out, opid%sucs, & + IF(output%sucs) CALL define_ovar(ncid_out, opid%sucs, & 'sucs', 'm', 'Suction @ saturation', & patchout%sucs, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%css) CALL define_ovar(ncid_out, opid%css, & + IF(output%css) CALL define_ovar(ncid_out, opid%css, & 'css', 'J/kg/C', 'Heat capacity of soil minerals', & patchout%css, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%rhosoil) CALL define_ovar(ncid_out, & + IF(output%rhosoil) CALL define_ovar(ncid_out, & opid%rhosoil, 'rhosoil', 'kg/m^3', 'Density of soil minerals', & patchout%rhosoil, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%rs20) CALL define_ovar(ncid_out, opid%rs20, & + IF(output%rs20) CALL define_ovar(ncid_out, opid%rs20, & 'rs20', '-', 'Soil respiration coefficient at 20C', & patchout%rs20, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%albsoil) CALL define_ovar(ncid_out, & + IF(output%albsoil) CALL define_ovar(ncid_out, & opid%albsoil, 'albsoil', '-', & 'Snow free shortwave soil reflectance fraction', & patchout%albsoil, radID, 'radiation', xID, yID, zID, landID, patchID) ! vh_js ! IF (cable_user%CALL_POP) THEN - IF(output%params .OR. output%hc) CALL define_ovar(ncid_out, opid%hc, & + IF(output%hc) CALL define_ovar(ncid_out, opid%hc, & 'hc', 'm', 'Height of canopy', patchout%hc, & 'real', xID, yID, zID, landID, patchID,tID) ELSE - IF(output%params .OR. output%hc) CALL define_ovar(ncid_out, opid%hc, & + IF(output%hc) CALL define_ovar(ncid_out, opid%hc, & 'hc', 'm', 'Height of canopy', patchout%hc, & 'real', xID, yID, zID, landID, patchID) ENDIF - IF(output%params .OR. output%canst1) CALL define_ovar(ncid_out, & + IF(output%canst1) CALL define_ovar(ncid_out, & opid%canst1, 'canst1', 'mm/LAI', 'Max water intercepted by canopy', & patchout%canst1, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%dleaf) CALL define_ovar(ncid_out, opid%dleaf, & + IF(output%dleaf) CALL define_ovar(ncid_out, opid%dleaf, & 'dleaf', 'm', 'Chararacteristic length of leaf', & patchout%dleaf, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%frac4) CALL define_ovar(ncid_out, opid%frac4, & + IF(output%frac4) CALL define_ovar(ncid_out, opid%frac4, & 'frac4', '-', 'Fraction of plants which are C4', & patchout%frac4, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%ejmax) CALL define_ovar(ncid_out, opid%ejmax, & + IF(output%ejmax) CALL define_ovar(ncid_out, opid%ejmax, & 'ejmax', 'mol/m^2/s', 'Max potential electron transport rate top leaf', & patchout%ejmax, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%vcmax) CALL define_ovar(ncid_out, opid%vcmax, & + IF(output%vcmax) CALL define_ovar(ncid_out, opid%vcmax, & 'vcmax', 'mol/m^2/s', 'Maximum RuBP carboxylation rate top leaf', & patchout%vcmax, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%rp20) CALL define_ovar(ncid_out, opid%rp20, & + IF(output%rp20) CALL define_ovar(ncid_out, opid%rp20, & 'rp20', '-', 'Plant respiration coefficient at 20C', & patchout%rp20, 'real', xID, yID, zID, landID, patchID) ! Ticket #56 - IF(output%params .OR. output%g0) CALL define_ovar(ncid_out, opid%g0, & + IF(output%g0) CALL define_ovar(ncid_out, opid%g0, & 'g0', '-', 'g0 term in Medlyn Stom Cond. Param', & patchout%g0, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%g1) CALL define_ovar(ncid_out, opid%g1, & + IF(output%g1) CALL define_ovar(ncid_out, opid%g1, & 'g1', '-', 'g1 term in Medlyn Stom Cond. Param', & patchout%g1, 'real', xID, yID, zID, landID, patchID) ! end Ticket #56 - IF(output%params .OR. output%rpcoef) CALL define_ovar(ncid_out, & + IF(output%rpcoef) CALL define_ovar(ncid_out, & opid%rpcoef, 'rpcoef', '1/C', & 'Temperature coef nonleaf plant respiration', & patchout%rpcoef, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%shelrb) CALL define_ovar(ncid_out, & + IF(output%shelrb) CALL define_ovar(ncid_out, & opid%shelrb, 'shelrb', '-', 'Sheltering factor', patchout%shelrb, & 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%xfang) CALL define_ovar(ncid_out, opid%xfang, & + IF(output%xfang) CALL define_ovar(ncid_out, opid%xfang, & 'xfang', '-', 'Leaf angle parameter',patchout%xfang, 'real', & xID, yID, zID, landID, patchID) - IF(output%params .OR. output%wai) CALL define_ovar(ncid_out, opid%wai, & + IF(output%wai) CALL define_ovar(ncid_out, opid%wai, & 'wai', '-', 'Wood area index', patchout%wai, 'real', & xID, yID, zID, landID, patchID) - IF(output%params .OR. output%vegcf) CALL define_ovar(ncid_out, opid%vegcf, & + IF(output%vegcf) CALL define_ovar(ncid_out, opid%vegcf, & 'vegcf', '-', 'vegcf', patchout%vegcf, 'real', & xID, yID, zID, landID, patchID) - IF(output%params .OR. output%extkn) CALL define_ovar(ncid_out, opid%extkn, & + IF(output%extkn) CALL define_ovar(ncid_out, opid%extkn, & 'extkn', '-', 'Nitrogen extinction coef for vert. canopy profile', & patchout%extkn, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%tminvj) CALL define_ovar(ncid_out, & + IF(output%tminvj) CALL define_ovar(ncid_out, & opid%tminvj, 'tminvj', 'C', & 'Min temperature for the start of photosynthesis', & patchout%tminvj, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%tmaxvj) CALL define_ovar(ncid_out, & + IF(output%tmaxvj) CALL define_ovar(ncid_out, & opid%tmaxvj, 'tmaxvj', 'C', 'Max temperature for photosynthesis', & patchout%tmaxvj, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%vbeta) CALL define_ovar(ncid_out, opid%vbeta, & + IF(output%vbeta) CALL define_ovar(ncid_out, opid%vbeta, & 'vbeta', '-', 'Stomatal sensitivity to soil water', & patchout%vbeta, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%xalbnir) CALL define_ovar(ncid_out, & + IF(output%xalbnir) CALL define_ovar(ncid_out, & opid%xalbnir, 'xalbnir', '-', 'Modifier for albedo in near ir band', & patchout%xalbnir, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%meth) CALL define_ovar(ncid_out, opid%meth, & + IF(output%meth) CALL define_ovar(ncid_out, opid%meth, & 'meth', '-', 'Canopy turbulence parameterisation choice', & patchout%meth, 'real', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%za) THEN + IF(output%za) THEN CALL define_ovar(ncid_out, opid%za_uv, 'za_uv', 'm', & 'Reference height (lowest atm. model layer) for momentum', & patchout%za, 'real', xID, yID, zID, landID, patchID) @@ -1179,30 +1210,30 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) 'Reference height (lowest atm. model layer) for scalars', & patchout%za, 'real', xID, yID, zID, landID, patchID) ENDIF - IF(output%params .OR. output%ratecp) CALL define_ovar(ncid_out, & + IF(output%ratecp) CALL define_ovar(ncid_out, & opid%ratecp, 'ratecp', '1/year', 'Plant carbon rate constant', & patchout%ratecp, plantcarbID, 'plantcarbon', xID, yID, zID, & landID, patchID) - IF(output%params .OR. output%ratecs) CALL define_ovar(ncid_out, & + IF(output%ratecs) CALL define_ovar(ncid_out, & opid%ratecs, 'ratecs', '1/year', 'Soil carbon rate constant', & patchout%ratecs, soilcarbID, 'soilcarbon', xID, yID, zID, & landID, patchID) - IF(output%params .OR. output%zse) CALL define_ovar(ncid_out, opid%zse, & + IF(output%zse) CALL define_ovar(ncid_out, opid%zse, & 'zse', 'm', 'Depth of each soil layer', & patchout%zse, soilID, 'soil', xID, yID, zID, landID, patchID) - IF(output%params .OR. output%froot) CALL define_ovar(ncid_out, opid%froot, & + IF(output%froot) CALL define_ovar(ncid_out, opid%froot, & 'froot', '-', 'Fraction of roots in each soil layer', & patchout%froot, soilID, 'soil', xID, yID, zID, landID, patchID) - ! IF(output%params .OR. output%slope) CALL define_ovar(ncid_out, opid%slope, & + ! IF(output%slope) CALL define_ovar(ncid_out, opid%slope, & ! 'slope', '-', 'Mean subgrid topographic slope', & ! patchout%slope, 'real', xID, yID, zID, landID, patchID) ! - ! IF(output%params .OR. output%slope_std) CALL define_ovar(ncid_out, opid%slope_std, & + ! IF(output%slope_std) CALL define_ovar(ncid_out, opid%slope_std, & ! 'slope_std', '-', 'Mean subgrid topographic slope_std', & ! patchout%slope_std, 'real', xID, yID, zID, landID, patchID) ! - ! IF(output%params .OR. output%GWdz) CALL define_ovar(ncid_out, opid%GWdz, & + ! IF(output%GWdz) CALL define_ovar(ncid_out, opid%GWdz, & ! 'GWdz', '-', 'Mean aquifer layer thickness ', & ! patchout%GWdz, 'real', xID, yID, zID, landID, patchID) ! @@ -1324,149 +1355,167 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough) //TRIM(filename%out)// ' (SUBROUTINE open_output_file)') ! Write model parameters if requested: - IF(output%params .OR. output%iveg) CALL write_ovar(ncid_out, opid%iveg, & - 'iveg', REAL(veg%iveg, 4), ranges%iveg, patchout%iveg, 'integer') - - IF (.NOT.cable_user%POPLUC) THEN - IF((output%params .OR. output%patchfrac) & - .AND. (patchout%patchfrac .OR. output%patch)) & - CALL write_ovar(ncid_out, opid%patchfrac, 'patchfrac', & - REAL(patch(:)%frac, 4), (/0.0, 1.0/), patchout%patchfrac, 'real') - ENDIF - IF(output%params .OR. output%isoil) CALL write_ovar(ncid_out, opid%isoil, & - 'isoil', REAL(soil%isoilm, 4), ranges%isoil, patchout%isoil,'integer') - IF(output%params .OR. output%bch) CALL write_ovar(ncid_out, opid%bch, & - 'bch', REAL(soil%bch, 4), ranges%bch, patchout%bch, 'real') - IF(output%params .OR. output%clay) CALL write_ovar(ncid_out, opid%clay, & - 'clay', REAL(soil%clay, 4), ranges%clay, patchout%clay, 'real') - IF(output%params .OR. output%sand) CALL write_ovar(ncid_out, opid%sand, & - 'sand', REAL(soil%sand, 4), ranges%sand, patchout%sand, 'real') - IF(output%params .OR. output%silt) CALL write_ovar(ncid_out, opid%silt, & - 'silt', REAL(soil%silt, 4), ranges%silt, patchout%silt, 'real') - IF(output%params .OR. output%css) CALL write_ovar(ncid_out, opid%css, & - 'css', REAL(soil%css, 4), ranges%css, patchout%css, 'real') - IF(output%params .OR. output%rhosoil) CALL write_ovar(ncid_out, & + + !~ Patch + out_settings%dimswitch = "real" + CALL check_and_write(output%patchfrac .AND. (patchout%patchfrac .OR. output%patch), opid%patchfrac, 'patchfrac', & + REAL(patch(:)%frac, 4), ranges%patchfrac, patchout%patchfrac, out_settings) + + !~ Soil + out_settings%dimswitch = "integer" + CALL check_and_write(output%isoil, opid%isoil, & + 'isoil', REAL(soil%isoilm, 4), ranges%isoil, patchout%isoil, out_settings) + out_settings%dimswitch = "real" + CALL check_and_write(output%bch, opid%bch, & + 'bch', REAL(soil%bch, 4), ranges%bch, patchout%bch, out_settings) + CALL check_and_write(output%clay, opid%clay, & + 'clay', REAL(soil%clay, 4), ranges%clay, patchout%clay, out_settings) + CALL check_and_write(output%sand, opid%sand, & + 'sand', REAL(soil%sand, 4), ranges%sand, patchout%sand, out_settings) + CALL check_and_write(output%silt, opid%silt, & + 'silt', REAL(soil%silt, 4), ranges%silt, patchout%silt, out_settings) + CALL check_and_write(output%css, opid%css, & + 'css', REAL(soil%css, 4), ranges%css, patchout%css, out_settings) + CALL check_and_write(output%rhosoil, & opid%rhosoil, 'rhosoil',REAL(soil%rhosoil,4), & - ranges%rhosoil, patchout%rhosoil, 'real') - IF(output%params .OR. output%hyds) CALL write_ovar(ncid_out, opid%hyds, & - 'hyds', REAL(soil%hyds, 4), ranges%hyds, patchout%hyds, 'real') - IF(output%params .OR. output%sucs) CALL write_ovar(ncid_out, opid%sucs, & - 'sucs', REAL(soil%sucs, 4), ranges%sucs, patchout%sucs, 'real') - IF(output%params .OR. output%rs20) CALL write_ovar(ncid_out, opid%rs20, & - 'rs20', REAL(veg%rs20, 4), ranges%rs20, patchout%rs20, 'real') - ! 'rs20',REAL(soil%rs20,4),ranges%rs20,patchout%rs20,'real') - IF(output%params .OR. output%ssat) CALL write_ovar(ncid_out, opid%ssat, & - 'ssat', REAL(soil%ssat, 4), ranges%ssat, patchout%ssat, 'real') - IF(output%params .OR. output%sfc) CALL write_ovar(ncid_out, opid%sfc, & - 'sfc', REAL(soil%sfc, 4), ranges%sfc, patchout%sfc, 'real') - IF(output%params .OR. output%swilt) CALL write_ovar(ncid_out, opid%swilt, & - 'swilt', REAL(soil%swilt, 4), ranges%swilt, patchout%swilt, 'real') - IF(output%params .OR. output%albsoil) CALL write_ovar(ncid_out, & + ranges%rhosoil, patchout%rhosoil, out_settings) + CALL check_and_write(output%hyds, opid%hyds, & + 'hyds', REAL(soil%hyds, 4), ranges%hyds, patchout%hyds, out_settings) + CALL check_and_write(output%sucs, opid%sucs, & + 'sucs', REAL(soil%sucs, 4), ranges%sucs, patchout%sucs, out_settings) + CALL check_and_write(output%rs20, opid%rs20, & + 'rs20', REAL(veg%rs20, 4), ranges%rs20, patchout%rs20, out_settings) + ! 'rs20',REAL(soil%rs20,4),ranges%rs20,patchout%rs20,out_settings) + CALL check_and_write(output%ssat, opid%ssat, & + 'ssat', REAL(soil%ssat, 4), ranges%ssat, patchout%ssat, out_settings) + CALL check_and_write(output%sfc, opid%sfc, & + 'sfc', REAL(soil%sfc, 4), ranges%sfc, patchout%sfc, out_settings) + CALL check_and_write(output%swilt, opid%swilt, & + 'swilt', REAL(soil%swilt, 4), ranges%swilt, patchout%swilt, out_settings) + + ! CALL check_and_write(output%slope ,ncid_out, opid%slope, & + ! 'slope', REAL(soil%slope, 4), ranges%slope, patchout%slope, out_settings) + ! CALL check_and_write(output%slope_std, opid%slope_std, & + ! 'slope_std', REAL(soil%slope_std, 4), ranges%slope_std, patchout%slope_std, out_settings) + ! CALL check_and_write(output%GWdz, opid%GWdz, & + ! 'GWdz', REAL(soil%GWdz, 4), ranges%GWdz, patchout%GWdz, out_settings) + + out_settings%dimswitch = "radiation" + CALL check_and_write(output%albsoil, & opid%albsoil, 'albsoil', REAL(soil%albsoil, 4), & - ranges%albsoil, patchout%albsoil, 'radiation') - IF(output%params .OR. output%canst1) CALL write_ovar(ncid_out, & + ranges%albsoil, patchout%albsoil, out_settings) + + out_settings%dimswitch = "soil" + CALL check_and_write(output%zse, opid%zse, & + 'zse', SPREAD(REAL(soil%zse, 4), 1, mp),ranges%zse, & + patchout%zse, out_settings)! no spatial dim at present + + !~ Veg + out_settings%dimswitch = "integer" + CALL check_and_write(output%iveg, opid%iveg, & + 'iveg', REAL(veg%iveg, 4), ranges%iveg, patchout%iveg, out_settings) + CALL check_and_write(output%meth, opid%meth, & + 'meth', REAL(veg%meth, 4), ranges%meth, patchout%meth, out_settings) + + out_settings%dimswitch = "real" + CALL check_and_write(output%canst1, & opid%canst1, 'canst1', REAL(veg%canst1, 4), & - ranges%canst1, patchout%canst1, 'real') - IF(output%params .OR. output%dleaf) CALL write_ovar(ncid_out, opid%dleaf, & - 'dleaf', REAL(veg%dleaf, 4), ranges%dleaf, patchout%dleaf, 'real') - IF(output%params .OR. output%ejmax) CALL write_ovar(ncid_out, opid%ejmax, & - 'ejmax', REAL(veg%ejmax, 4), ranges%ejmax, patchout%ejmax, 'real') - IF(output%params .OR. output%vcmax) CALL write_ovar(ncid_out, opid%vcmax, & - 'vcmax', REAL(veg%vcmax, 4), ranges%vcmax, patchout%vcmax, 'real') - IF(output%params .OR. output%frac4) CALL write_ovar(ncid_out, opid%frac4, & - 'frac4', REAL(veg%frac4, 4), ranges%frac4, patchout%frac4, 'real') + ranges%canst1, patchout%canst1, out_settings) + CALL check_and_write(output%dleaf, opid%dleaf, & + 'dleaf', REAL(veg%dleaf, 4), ranges%dleaf, patchout%dleaf, out_settings) + CALL check_and_write(output%ejmax, opid%ejmax, & + 'ejmax', REAL(veg%ejmax, 4), ranges%ejmax, patchout%ejmax, out_settings) + CALL check_and_write(output%vcmax, opid%vcmax, & + 'vcmax', REAL(veg%vcmax, 4), ranges%vcmax, patchout%vcmax, out_settings) + CALL check_and_write(output%frac4, opid%frac4, & + 'frac4', REAL(veg%frac4, 4), ranges%frac4, patchout%frac4, out_settings) IF (.NOT.cable_user%CALL_POP) THEN - IF(output%params .OR. output%hc) CALL write_ovar(ncid_out, opid%hc, & - 'hc', REAL(veg%hc, 4), ranges%hc, patchout%hc, 'real') + CALL check_and_write(output%hc, opid%hc, & + 'hc', REAL(veg%hc, 4), ranges%hc, patchout%hc, out_settings) ENDIF - IF(output%params .OR. output%rp20) CALL write_ovar(ncid_out, opid%rp20, & - 'rp20', REAL(veg%rp20, 4),ranges%rp20, patchout%rp20, 'real') + CALL check_and_write(output%rp20, opid%rp20, & + 'rp20', REAL(veg%rp20, 4),ranges%rp20, patchout%rp20, out_settings) ! Ticket #56 - IF(output%params .OR. output%g0) CALL write_ovar(ncid_out, opid%g0, & - 'g0', REAL(veg%g0, 4),ranges%g0, patchout%g0, 'real') - IF(output%params .OR. output%g1) CALL write_ovar(ncid_out, opid%g1, & - 'g1', REAL(veg%g1, 4),ranges%g1, patchout%g1, 'real') + CALL check_and_write(output%g0, opid%g0, & + 'g0', REAL(veg%g0, 4),ranges%g0, patchout%g0, out_settings) + CALL check_and_write(output%g1, opid%g1, & + 'g1', REAL(veg%g1, 4),ranges%g1, patchout%g1, out_settings) ! End Ticket #56 - IF(output%params .OR. output%rpcoef) CALL write_ovar(ncid_out, & + CALL check_and_write(output%rpcoef, & opid%rpcoef, 'rpcoef', REAL(veg%rpcoef, 4), & - ranges%rpcoef, patchout%rpcoef, 'real') - IF(output%params .OR. output%shelrb) CALL write_ovar(ncid_out, & + ranges%rpcoef, patchout%rpcoef, out_settings) + CALL check_and_write(output%shelrb, & opid%shelrb, 'shelrb', REAL(veg%shelrb, 4), & - ranges%shelrb, patchout%shelrb, 'real') - IF(output%params .OR. output%xfang) CALL write_ovar(ncid_out, opid%xfang, & - 'xfang', REAL(veg%xfang, 4), ranges%xfang, patchout%xfang, 'real') - IF(output%params .OR. output%wai) CALL write_ovar(ncid_out, opid%wai, & - 'wai', REAL(veg%wai, 4), ranges%wai, patchout%wai, 'real') - IF(output%params .OR. output%vegcf) CALL write_ovar(ncid_out, opid%vegcf, & - 'vegcf', REAL(veg%vegcf, 4), ranges%vegcf, patchout%vegcf, 'real') - IF(output%params .OR. output%extkn) CALL write_ovar(ncid_out, opid%extkn, & - 'extkn', REAL(veg%extkn, 4), ranges%extkn, patchout%extkn, 'real') - IF(output%params .OR. output%tminvj) CALL write_ovar(ncid_out, & + ranges%shelrb, patchout%shelrb, out_settings) + CALL check_and_write(output%xfang, opid%xfang, & + 'xfang', REAL(veg%xfang, 4), ranges%xfang, patchout%xfang, out_settings) + CALL check_and_write(output%wai, opid%wai, & + 'wai', REAL(veg%wai, 4), ranges%wai, patchout%wai, out_settings) + CALL check_and_write(output%vegcf, opid%vegcf, & + 'vegcf', REAL(veg%vegcf, 4), ranges%vegcf, patchout%vegcf, out_settings) + CALL check_and_write(output%extkn, opid%extkn, & + 'extkn', REAL(veg%extkn, 4), ranges%extkn, patchout%extkn, out_settings) + CALL check_and_write(output%tminvj, & opid%tminvj, 'tminvj', REAL(veg%tminvj, 4), & - ranges%tminvj, patchout%tminvj, 'real') - IF(output%params .OR. output%tmaxvj) CALL write_ovar(ncid_out, & + ranges%tminvj, patchout%tminvj, out_settings) + CALL check_and_write(output%tmaxvj, & opid%tmaxvj, 'tmaxvj', REAL(veg%tmaxvj, 4), & - ranges%tmaxvj, patchout%tmaxvj, 'real') - IF(output%params .OR. output%vbeta) CALL write_ovar(ncid_out, opid%vbeta, & - 'vbeta', REAL(veg%vbeta, 4), ranges%vbeta, patchout%vbeta, 'real') - IF(output%params .OR. output%xalbnir) CALL write_ovar(ncid_out, & + ranges%tmaxvj, patchout%tmaxvj, out_settings) + CALL check_and_write(output%vbeta, opid%vbeta, & + 'vbeta', REAL(veg%vbeta, 4), ranges%vbeta, patchout%vbeta, out_settings) + CALL check_and_write(output%xalbnir, & opid%xalbnir, 'xalbnir', REAL(veg%xalbnir, 4), & - ranges%xalbnir, patchout%xalbnir, 'real') - IF(output%params .OR. output%meth) CALL write_ovar(ncid_out, opid%meth, & - 'meth', REAL(veg%meth, 4), ranges%meth, patchout%meth, 'integer') - IF(output%params .OR. output%za) THEN - CALL write_ovar(ncid_out, opid%za_uv, & - 'za_uv', REAL(rough%za_uv, 4), ranges%za, patchout%za, 'real') - CALL write_ovar(ncid_out, opid%za_tq, & - 'za_tq', REAL(rough%za_tq, 4), ranges%za, patchout%za, 'real') - ENDIF - IF(output%params .OR. output%ratecp) CALL write_ovar(ncid_out, & + ranges%xalbnir, patchout%xalbnir, out_settings) + + out_settings%dimswitch = "soil" + CALL check_and_write (output%froot, opid%froot, & + 'froot', REAL(veg%froot, 4), ranges%froot, patchout%froot, out_settings) + + !~ Rough + out_settings%dimswitch = "real" + CALL check_and_write(output%za, opid%za_uv, & + 'za_uv', REAL(rough%za_uv, 4), ranges%za, patchout%za, out_settings) + CALL check_and_write(output%za, opid%za_tq, & + 'za_tq', REAL(rough%za_tq, 4), ranges%za, patchout%za, out_settings) + !~ bgc + out_settings%dimswitch = "plantcarbon" + CALL check_and_write(output%ratecp, & opid%ratecp, 'ratecp',SPREAD(REAL(bgc%ratecp,4),1,mp), ranges%ratecp, & - patchout%ratecp,'plantcarbon')! no spatial dim at present - IF(output%params .OR. output%ratecs) CALL write_ovar(ncid_out, & + patchout%ratecp, out_settings)! no spatial dim at present + out_settings%dimswitch = "soilcarbon" + CALL check_and_write(output%ratecs, & opid%ratecs, 'ratecs', SPREAD(REAL(bgc%ratecs, 4), 1, mp), ranges%ratecs, & - patchout%ratecs, 'soilcarbon')! no spatial dim at present - IF(output%params .OR. output%froot) CALL write_ovar (ncid_out, opid%froot, & - 'froot', REAL(veg%froot, 4), ranges%froot, patchout%froot, 'soil') - IF(output%params .OR. output%zse) CALL write_ovar(ncid_out, opid%zse, & - 'zse', SPREAD(REAL(soil%zse, 4), 1, mp),ranges%zse, & - patchout%zse, 'soil')! no spatial dim at present - - ! IF(output%params .OR. output%slope) CALL write_ovar(ncid_out, opid%slope, & - ! 'slope', REAL(soil%slope, 4), (/0.0,1.0/), patchout%slope, 'real') - ! IF(output%params .OR. output%slope_std) CALL write_ovar(ncid_out, opid%slope_std, & - ! 'slope_std', REAL(soil%slope_std, 4), (/0.0,1.0/), patchout%slope_std, 'real') - ! IF(output%params .OR. output%GWdz) CALL write_ovar(ncid_out, opid%GWdz, & - ! 'GWdz', REAL(soil%GWdz, 4), (/0.0,10000.0/), patchout%GWdz, 'real') - ! - IF(output%params .AND. cable_user%gw_model) THEN - CALL write_ovar(ncid_out, opid%SatFracmax, & - 'SatFracmax', SPREAD(REAL(gw_params%MaxSatFraction,4),1,mp), & - (/0.0,100000000.0/), patchout%SatFracmax, 'real') + patchout%ratecs, out_settings)! no spatial dim at present - CALL write_ovar(ncid_out, opid%Qhmax, & - 'Qhmax', SPREAD(REAL(gw_params%MaxHorzDrainRate, 4),1,mp), & - (/0.0,100000000.0/), patchout%Qhmax, 'real') + !~ gwmodel + out_settings%dimswitch = "real" + CALL check_and_write(output%params .AND. cable_user%gw_model, opid%SatFracmax, & + 'SatFracmax', SPREAD(REAL(gw_params%MaxSatFraction,4),1,mp), & + ranges%gw_default, patchout%SatFracmax, out_settings) - CALL write_ovar(ncid_out, opid%QhmaxEfold, & - 'QhmaxEfold', SPREAD(REAL(gw_params%EfoldHorzDrainRate, 4),1,mp), & - (/0.0,100000000.0/), patchout%QhmaxEfold, 'real') + CALL check_and_write(output%params .AND. cable_user%gw_model, opid%Qhmax, & + 'Qhmax', SPREAD(REAL(gw_params%MaxHorzDrainRate, 4),1,mp), & + ranges%gw_default, patchout%Qhmax, out_settings) - CALL write_ovar(ncid_out, opid%HKefold, & - 'HKefold', SPREAD(REAL(gw_params%hkrz, 4),1,mp), & - (/0.0,100000000.0/), patchout%HKefold, 'real') + CALL check_and_write(output%params .AND. cable_user%gw_model, opid%QhmaxEfold, & + 'QhmaxEfold', SPREAD(REAL(gw_params%EfoldHorzDrainRate, 4),1,mp), & + ranges%gw_default, patchout%QhmaxEfold, out_settings) - CALL write_ovar(ncid_out, opid%HKdepth, & - 'HKdepth', SPREAD(REAL(gw_params%zdepth, 4),1,mp), & - (/0.0,100000000.0/), patchout%HKdepth, 'real') - END IF + CALL check_and_write(output%params .AND. cable_user%gw_model, opid%HKefold, & + 'HKefold', SPREAD(REAL(gw_params%hkrz, 4),1,mp), & + ranges%gw_default, patchout%HKefold, out_settings) + + CALL check_and_write(output%params .AND. cable_user%gw_model, opid%HKdepth, & + 'HKdepth', SPREAD(REAL(gw_params%zdepth, 4),1,mp), & + ranges%gw_default, patchout%HKdepth, out_settings) END SUBROUTINE open_output_file + !============================================================================= - SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ssnow, & - rad, bal, air, soil, veg, SBOLTZ, EMLEAF, EMSOIL) + SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ssnow, & + rad, bal, air, soil, veg, SBOLTZ, EMLEAF, EMSOIL) ! Writes model output variables and, if requested, calls ! energy and mass balance routines. This subroutine is called ! each timestep, but may only write to the output file periodically, @@ -1475,7 +1524,7 @@ SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ss REAL, INTENT(IN) :: dels ! time step size INTEGER, INTENT(IN) :: ktau ! timestep number in loop which include spinup REAL, INTENT(IN) :: SBOLTZ, EMLEAF, EMSOIL - TYPE(met_type), INTENT(IN) :: met ! met data + TYPE(met_type), TARGET, INTENT(IN) :: met ! met data TYPE(canopy_type), INTENT(IN) :: canopy ! canopy variable data TYPE(soil_snow_type), INTENT(IN) :: ssnow ! soil data TYPE(soil_parameter_type), INTENT(IN) :: soil ! soil parameters @@ -1487,12 +1536,10 @@ SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ss TYPE(balances_type), INTENT(INOUT) :: bal TYPE(casa_met), INTENT(IN) :: casamet - REAL(r_2), DIMENSION(1) :: timetemp ! temporary variable for storing time + REAL(r_2) :: timetemp(1) ! temporary variable for storing time ! value - LOGICAL :: writenow ! write to output file during this time step? - INTEGER, SAVE :: out_timestep ! counter for output time steps INTEGER, SAVE :: out_month ! counter for output month - INTEGER, DIMENSION(mp) :: realyear ! fix problem for yr b4 leap yr + INTEGER :: realyear(mp) ! fix problem for yr b4 leap yr INTEGER :: backtrack ! modify timetemp for averaged output INTEGER :: dday ! number of past-years days for monthly output LN @@ -1502,6 +1549,14 @@ SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ss INTEGER :: ok + TYPE(output_var_settings_type) :: out_settings + + ! Temporary accumulation variable to be passed (we expect implicit-type conversion on assignment) + ! Assumption: All variables have size mp, including CASA + REAL(4) :: temp_acc(mp) + + out_settings = output_var_settings_type(met=met, writenow=.FALSE., dimswitch='default') + ! IF asked to check mass/water balance: IF(check%mass_bal) CALL mass_balance(dels, ktau, ssnow, soil, canopy, & met,air,bal) @@ -1510,7 +1565,7 @@ SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ss IF(check%energy_bal) CALL energy_balance(dels,ktau,met,rad, & canopy,bal,ssnow, & SBOLTZ, EMLEAF, EMSOIL ) - + ! Initialise output time step counter and month counter: IF(ktau == 1) THEN out_timestep = 0 @@ -1525,7 +1580,7 @@ SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ss ! Decide on output averaging regime: IF(output%averaging(1:3) == 'all') THEN ! write every time step to file ! Set flag to write data for current time step: - writenow = .TRUE. + out_settings%writenow = .TRUE. ! Set output time step to be current model time step: out_timestep = ktau backtrack = 0 @@ -1535,12 +1590,12 @@ SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ss IF(MOD(ktau, output%interval) == 0) THEN ! i.e.ktau divisible by ! interval ! write to output file this time step - writenow = .TRUE. + out_settings%writenow = .TRUE. ! increment output time step counter: out_timestep = out_timestep + 1 backtrack = output%interval / 2 ELSE - writenow = .FALSE. + out_settings%writenow = .FALSE. END IF ELSE IF(output%averaging(1:2) == 'mo') THEN ! write monthly averages to file !realyear = met%year @@ -1569,13 +1624,13 @@ SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ss IF(ANY(INT(REAL(lastdayl+dday) * 24. * 3600. / dels) == ktau)) THEN out_month = MOD(out_month, 12) + 1 ! can only be 1 - 12 ! write to output file this time step - writenow = .TRUE. + out_settings%writenow = .TRUE. ! increment output time step counter: out_timestep = out_timestep + 1 ! set numbr of time steps in output period output%interval = daysml(out_month) * 24 * 3600 / INT(dels) ELSE - writenow = .FALSE. + out_settings%writenow = .FALSE. END IF ELSE ! not currently a leap year ! last time step of month @@ -1584,13 +1639,13 @@ SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ss ! increment output month counter out_month = MOD(out_month, 12) + 1 ! can only be 1 - 12 ! write to output file this time step - writenow = .TRUE. + out_settings%writenow = .TRUE. ! increment output time step counter: out_timestep = out_timestep + 1 ! set numbr of time steps in output period output%interval = daysm(out_month) * 24 * 3600 / INT(dels) ELSE - writenow = .FALSE. + out_settings%writenow = .FALSE. END IF END IF ELSE ! not using leap year timing in this run @@ -1601,13 +1656,13 @@ SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ss ! increment output month counter out_month = MOD(out_month, 12) + 1 ! can only be 1 - 12 ! write to output file this time step - writenow = .TRUE. + out_settings%writenow = .TRUE. ! increment output time step counter: out_timestep = out_timestep + 1 ! set numbr of time steps in output period output%interval = daysm(out_month) * 24 * 3600 / INT(dels) ELSE - writenow = .FALSE. + out_settings%writenow = .FALSE. END IF END IF ! using leap year timing or not backtrack = output%interval / 2 @@ -1622,7 +1677,7 @@ SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ss ! output file unless output is monthly (in which case it's set above) ! If this time step is an output time step: - IF(writenow) THEN + IF(out_settings%writenow) THEN ! Write to temporary time variable: timetemp(1) = DBLE(REAL(ktau-backtrack)*dels) ! Write time variable for this output time step: @@ -1633,1266 +1688,506 @@ SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ss //TRIM(filename%out)// '(SUBROUTINE write_output)') END IF - ! Arguments to write_ovar: current time step; output file netcdf file ID; + ! Arguments to generate_out_write_acc: current time step; output file netcdf file ID; ! netcdf variable ID; variable name; variable data; variable ranges; ! non-land fill value; include patch info for this var; any specific ! formatting info; met variables for reporting in case of abort. + !-----------------------WRITE MET DATA------------------------------------- + out_settings%dimswitch = 'default' ! SWdown: downward short-wave radiation [W/m^2] - IF(output%met .OR. output%SWdown) THEN - ! Add current timestep's value to total of temporary output variable: - out%SWdown = out%SWdown + REAL(met%fsd(:, 1) + met%fsd(:, 2), 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%SWdown = out%SWdown/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%SWdown, 'SWdown', & - out%SWdown, ranges%SWdown, patchout%SWdown, 'default', met) - ! Reset temporary output variable: - out%SWdown = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%SWdown, ovid%SWdown, 'SWdown', out%SWdown, REAL(met%fsd(:, 1) + met%fsd(:, 2)), ranges%SWdown, patchout%SWdown, out_settings) ! LWdown: downward long-wave radiation [W/m^2] - IF(output%met .OR. output%LWdown) THEN - ! Add current timestep's value to total of temporary output variable: - out%LWdown = out%LWdown + REAL(met%fld, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%LWdown = out%LWdown/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%LWdown, 'LWdown', & - out%LWdown, ranges%LWdown, patchout%LWdown, 'default', met) - ! Reset temporary output variable: - out%LWdown = 0.0 - END IF - END IF - ! Tair: surface air temperature [K] - IF(output%met .OR. output%Tair) THEN - ! Add current timestep's value to total of temporary output variable: - out%Tair = out%Tair + REAL(met%tk, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Tair = out%Tair/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Tair, 'Tair', out%Tair, & - ranges%Tair, patchout%Tair, 'ALMA', met) - ! Reset temporary output variable: - out%Tair = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%LWdown, ovid%LWdown, 'LWdown', out%LWdown, REAL(met%fld, 4), ranges%LWdown, patchout%LWdown, out_settings) ! Rainf: rainfall [kg/m^2/s] - IF(output%met .OR. output%Rainf) THEN - ! Add current timestep's value to total of temporary output variable: - out%Rainf = out%Rainf + REAL(met%precip / dels, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Rainf = out%Rainf/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Rainf, 'Rainf', & - out%Rainf, ranges%Rainf, patchout%Rainf, 'default', met) - ! Reset temporary output variable: - out%Rainf = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%Rainf, ovid%Rainf, 'Rainf', out%Rainf, REAL(met%precip/dels, 4), ranges%Rainf, patchout%Rainf, out_settings) ! Snowf: snowfall [kg/m^2/s] - IF(output%met .OR. output%Snowf) THEN - ! Add current timestep's value to total of temporary output variable: - out%Snowf = out%Snowf + REAL(met%precip_sn / dels, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Snowf = out%Snowf/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Snowf, 'Snowf', & - out%Snowf, ranges%Snowf, patchout%Snowf, 'default', met) - ! Reset temporary output variable: - out%Snowf = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%Snowf, ovid%Snowf, 'Snowf', out%Snowf, REAL(met%precip_sn/dels, 4), ranges%Snowf, patchout%Snowf, out_settings) ! PSurf: surface pressure [Pa] - IF(output%met .OR. output%PSurf) THEN - ! Add current timestep's value to total of temporary output variable: - out%PSurf = out%PSurf + REAL(met%pmb, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%PSurf = out%PSurf / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%PSurf, 'PSurf', & - out%PSurf, ranges%PSurf, patchout%PSurf, 'default', met) - ! Reset temporary output variable: - out%PSurf = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%PSurf, ovid%PSurf, 'PSurf', out%PSurf, REAL(met%pmb, 4), ranges%PSurf, patchout%PSurf, out_settings) + + out_settings%dimswitch = 'ALMA' + ! Tair: surface air temperature [K] + CALL generate_out_write_acc(output%Tair, ovid%Tair, 'Tair', out%Tair, REAL(met%tk, 4), ranges%Tair, patchout%Tair, out_settings) ! Qair: specific humidity [kg/kg] - IF(output%met .OR. output%Qair) THEN - ! Add current timestep's value to total of temporary output variable: - out%Qair = out%Qair + REAL(met%qv, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Qair = out%Qair / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Qair, 'Qair', out%Qair, & - ranges%Qair, patchout%Qair, 'ALMA', met) - ! Reset temporary output variable: - out%Qair = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%Qair, ovid%Qair, 'Qair', out%Qair, REAL(met%qv, 4), ranges%Qair, patchout%Qair, out_settings) ! Wind: windspeed [m/s] - IF(output%met .OR. output%Wind) THEN - ! Add current timestep's value to total of temporary output variable: - out%Wind = out%Wind + REAL(met%ua, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Wind = out%Wind/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Wind, 'Wind', out%Wind, & - ranges%Wind, patchout%Wind, 'ALMA', met) - ! Reset temporary output variable: - out%Wind = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%Wind, ovid%Wind, 'Wind', out%Wind, REAL(met%ua, 4), ranges%Wind, patchout%Wind, out_settings) ! CO2air: CO2 concentration [ppmv] - IF(output%met .OR. output%CO2air) THEN - ! Add current timestep's value to total of temporary output variable: - out%CO2air = out%CO2air + REAL(met%ca * 1000000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%CO2air = out%CO2air / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%CO2air, 'CO2air', & - OUT%CO2air, ranges%CO2air, patchout%CO2air, 'ALMA', met) - ! Reset temporary output variable: - out%CO2air = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%CO2air, ovid%CO2air, 'CO2air', out%CO2air, REAL(met%ca*1000000.0, 4), ranges%CO2air, patchout%CO2air, out_settings) + !-----------------------WRITE FLUX DATA------------------------------------- + out_settings%dimswitch = 'default' ! Qmom: momentum flux [kg/m/s2] INH - IF(output%flux .OR. output%Qmom) THEN - ! Add current timestep's value to total of temporary output variable: - out%Qmom = out%Qmom + REAL(air%rho,4)*(REAL(canopy%us,4)**2.) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Qmom = out%Qmom / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Qmom, 'Qmom', out%Qmom, & - ranges%Qmom, patchout%Qmom, 'default', met) - ! Reset temporary output variable: - out%Qmom = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%Qmom, ovid%Qmom, 'Qmom', out%Qmom, REAL(air%rho, 4)*(REAL(canopy%us, 4)**2.), ranges%Qmom, patchout%Qmom, out_settings) ! Qle: latent heat flux [W/m^2] - IF(output%flux .OR. output%Qle) THEN - ! Add current timestep's value to total of temporary output variable: - out%Qle = out%Qle + REAL(canopy%fe, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Qle = out%Qle / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Qle, 'Qle', out%Qle, & - ranges%Qle, patchout%Qle, 'default', met) - ! Reset temporary output variable: - out%Qle = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%Qmom, ovid%Qle, 'Qle', out%Qle, REAL(canopy%fe, 4), ranges%Qle, patchout%Qle, out_settings) ! Qh: sensible heat flux [W/m^2] - IF(output%flux .OR. output%Qh) THEN - ! Add current timestep's value to total of temporary output variable: - out%Qh = out%Qh + REAL(canopy%fh, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Qh = out%Qh / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Qh, 'Qh', out%Qh, & - ranges%Qh, patchout%Qh, 'default', met) - ! Reset temporary output variable: - out%Qh = 0.0 - END IF - END IF - + CALL generate_out_write_acc(output%Qh, ovid%Qh, 'Qh', out%Qh, REAL(canopy%fh, 4), ranges%Qh, patchout%Qh, out_settings) ! Qg: ground heat flux [W/m^2] - IF(output%flux .OR. output%Qg) THEN - ! Add current timestep's value to total of temporary output variable: - out%Qg = out%Qg + REAL(canopy%ga, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Qg = out%Qg / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Qg, 'Qg', out%Qg, & - ranges%Qg, patchout%Qg, 'default', met) - ! Reset temporary output variable: - out%Qg = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%Qg, ovid%Qg, 'Qg', out%Qg, REAL(canopy%ga, 4), ranges%Qg, patchout%Qg, out_settings) ! Qs: surface runoff [kg/m^2/s] - IF(output%flux .OR. output%Qs) THEN - ! Add current timestep's value to total of temporary output variable: - out%Qs = out%Qs + ssnow%rnof1 / dels - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Qs = out%Qs / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Qs, 'Qs', out%Qs, & - ranges%Qs, patchout%Qs, 'default', met) - ! Reset temporary output variable: - out%Qs = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%Qs, ovid%Qs, 'Qs', out%Qs, REAL(ssnow%rnof1/dels, 4), ranges%Qs, patchout%Qs, out_settings) ! Qsb: subsurface runoff [kg/m^2/s] - IF(output%flux .OR. output%Qsb) THEN - ! Add current timestep's value to total of temporary output variable: - out%Qsb = out%Qsb + REAL(ssnow%rnof2 / dels, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Qsb = out%Qsb / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Qsb, 'Qsb', out%Qsb, & - ranges%Qsb, patchout%Qsb, 'default', met) - ! Reset temporary output variable: - out%Qsb = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%Qsb, ovid%Qsb, 'Qsb', out%Qsb, REAL(ssnow%rnof2/dels, 4), ranges%Qsb, patchout%Qsb, out_settings) ! Evap: total evapotranspiration [kg/m^2/s] - IF(output%flux .OR. output%Evap) THEN - ! Add current timestep's value to total of temporary output variable: - out%Evap = out%Evap + REAL(canopy%fe / air%rlam, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Evap = out%Evap / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Evap, 'Evap', out%Evap, & - ranges%Evap, patchout%Evap, 'default', met) - ! Reset temporary output variable: - out%Evap = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%Evap, ovid%Evap, 'Evap', out%Evap, REAL(canopy%fe/air%rlam, 4), ranges%Evap, patchout%Evap, out_settings) ! ECanop: interception evaporation [kg/m^2/s] - IF(output%flux .OR. output%ECanop) THEN - ! Add current timestep's value to total of temporary output variable: - out%ECanop = out%ECanop + REAL(canopy%fevw / air%rlam, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%ECanop = out%ECanop / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%ECanop, 'ECanop', & - out%ECanop, ranges%ECanop, patchout%ECanop, 'default', met) - ! Reset temporary output variable: - out%ECanop = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%ECanop, ovid%ECanop, 'ECanop', out%ECanop, REAL(canopy%fevw/air%rlam, 4), ranges%ECanop, patchout%ECanop, out_settings) ! TVeg: vegetation transpiration [kg/m^2/s] - IF(output%flux .OR. output%TVeg) THEN - ! Add current timestep's value to total of temporary output variable: - out%TVeg = out%TVeg + REAL(canopy%fevc / air%rlam, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%TVeg = out%TVeg / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%TVeg, 'TVeg', out%TVeg, & - ranges%TVeg, patchout%TVeg, 'default', met) - ! Reset temporary output variable: - out%TVeg = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%TVeg, ovid%TVeg, 'TVeg', out%TVeg, REAL(canopy%fevc/air%rlam, 4), ranges%TVeg, patchout%TVeg, out_settings) + ! ESoil: bare soil evaporation [kg/m^2/s] - IF(output%flux .OR. output%ESoil) THEN - ! Add current timestep's value to total of temporary output variable: - IF(cable_user%SOIL_STRUC=='sli') THEN - out%ESoil = out%ESoil + REAL(ssnow%evap/dels, 4) !vh! - ELSE - out%ESoil = out%ESoil + REAL(canopy%fes / air%rlam, 4) - ENDIF - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%ESoil = out%ESoil / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%ESoil, 'ESoil', & - out%ESoil, ranges%ESoil, patchout%ESoil, 'default', met) - ! Reset temporary output variable: - out%ESoil = 0.0 - END IF + IF (cable_user%SOIL_STRUC == 'sli') THEN + temp_acc = ssnow%evap/dels !vh! + ELSE + temp_acc = canopy%fes/air%rlam END IF + CALL generate_out_write_acc(output%Esoil, ovid%Esoil, 'Esoil', out%Esoil, temp_acc, ranges%Esoil, patchout%Esoil, out_settings) + ! HVeg: sensible heat from vegetation [W/m^2] - IF(output%flux .OR. output%HVeg) THEN - ! Add current timestep's value to total of temporary output variable: - out%HVeg = out%HVeg + REAL(canopy%fhv, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%HVeg = out%HVeg/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%HVeg, 'HVeg', out%HVeg, & - ranges%HVeg, patchout%HVeg, 'default', met) - ! Reset temporary output variable: - out%HVeg = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%HVeg, ovid%HVeg, 'HVeg', out%HVeg, REAL(canopy%fhv, 4), ranges%HVeg, patchout%HVeg, out_settings) ! HSoil: sensible heat from soil [W/m^2] - IF(output%flux .OR. output%HSoil) THEN - ! Add current timestep's value to total of temporary output variable: - out%HSoil = out%HSoil + REAL(canopy%fhs, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%HSoil = out%HSoil / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%HSoil, 'HSoil', & - out%HSoil, ranges%HSoil, patchout%HSoil, 'default', met) - ! Reset temporary output variable: - out%HSoil = 0.0 - END IF - - out%RnetSoil = out%RnetSoil + REAL(canopy%fns, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%RnetSoil = out%RnetSoil / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%RnetSoil, 'RnetSoil', & - out%RnetSoil, ranges%HSoil, patchout%HSoil, 'default', met) - ! Reset temporary output variable: - out%RnetSoil = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%HSoil, ovid%HSoil, 'HSoil', out%HSoil, REAL(canopy%fhs, 4), ranges%HSoil, patchout%HSoil, out_settings) + CALL generate_out_write_acc(output%RNetSoil, ovid%RNetSoil, 'RNetSoil', out%RNetSoil, REAL(canopy%fns, 4), ranges%HSoil, patchout%HSoil, out_settings) ! NEE: net ecosystem exchange [umol/m^2/s] - IF(output%flux .OR. output%carbon .OR. output%NEE) THEN - ! Add current timestep's value to total of temporary output variable: - out%NEE = out%NEE + REAL(canopy%fnee / 1.201E-5, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%NEE = out%NEE / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%NEE, 'NEE', out%NEE, & - ranges%NEE, patchout%NEE, 'default', met) - ! Reset temporary output variable: - out%NEE = 0.0 - END IF - END IF - - - + CALL generate_out_write_acc(output%NEE, ovid%NEE, 'NEE', out%NEE, REAL(canopy%fnee/1.201E-5, 4), ranges%NEE, patchout%NEE, out_settings) !-----------------------WRITE SOIL STATE DATA------------------------------- + + out_settings%dimswitch = 'soil' ! SoilMoist: av.layer soil moisture [kg/m^2] - IF(output%soil .OR. output%SoilMoist) THEN - ! Add current timestep's value to total of temporary output variable: - out%SoilMoist = out%SoilMoist + REAL(ssnow%wb, 4) - out%SoilMoistIce = out%SoilMoistIce + REAL(ssnow%wbice, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%SoilMoist = out%SoilMoist / REAL(output%interval, 4) - out%SoilMoistIce = out%SoilMoistIce / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%SoilMoist, 'SoilMoist', & - out%SoilMoist, ranges%SoilMoist, patchout%SoilMoist, 'soil', met) - CALL write_ovar(out_timestep, ncid_out, ovid%SoilMoistIce, 'SoilMoistIce', & - out%SoilMoistIce, ranges%SoilMoist, patchout%SoilMoistIce, 'soil', met) - ! Reset temporary output variable: - out%SoilMoist = 0.0 - out%SoilMoistIce = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%SoilMoist, ovid%SoilMoist, 'SoilMoist', out%SoilMoist, REAL(ssnow%wb, 4), ranges%SoilMoist, patchout%SoilMoistIce, out_settings) + CALL generate_out_write_acc(output%SoilMoist, ovid%SoilMoistIce, 'SoilMoistIce', out%SoilMoistIce, REAL(ssnow%wbice, 4), ranges%SoilMoist, patchout%SoilMoistIce, out_settings) ! SoilTemp: av.layer soil temperature [K] - IF(output%soil .OR. output%SoilTemp) THEN - ! Add current timestep's value to total of temporary output variable: - out%SoilTemp = out%SoilTemp + REAL(ssnow%tgg, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%SoilTemp = out%SoilTemp/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%SoilTemp, 'SoilTemp', & - out%SoilTemp, ranges%SoilTemp, patchout%SoilTemp, 'soil', met) - ! Reset temporary output variable: - out%SoilTemp = 0.0 - END IF - END IF - ! BaresoilT: surface bare soil temp [K] - IF(output%soil .OR. output%BaresoilT) THEN - ! Add current timestep's value to total of temporary output variable: - out%BaresoilT = out%BaresoilT + REAL(ssnow%tgg(:, 1), 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%BaresoilT = out%BaresoilT / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%BaresoilT, 'BaresoilT', & - out%BaresoilT, ranges%BaresoilT, patchout%BaresoilT, 'default', met) - ! Reset temporary output variable: - out%BaresoilT = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%SoilTemp, ovid%SoilTemp, 'SoilTemp', out%SoilTemp, REAL(ssnow%tgg, 4), ranges%SoilTemp, patchout%SoilTemp, out_settings) + out_settings%dimswitch = 'default' + ! BaresoilT: surface bare soil temp [K] + CALL generate_out_write_acc(output%BaresoilT, ovid%BaresoilT, 'BaresoilT', out%BaresoilT, REAL(ssnow%tgg(:, 1), 4), ranges%BaresoilT, patchout%BaresoilT, out_settings) !MD Write the hydrology output data from the groundwater module calculations !water table depth - IF((output%soil .OR. output%WatTable) .AND. cable_user%GW_MODEL) THEN - !write(*,*) 'wtd' !MDeck - ! Add current timestep's value to total of temporary output variable: - out%WatTable = out%WatTable + REAL(ssnow%wtd/1000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%WatTable = out%WatTable / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%WatTable, 'WatTable', & - out%WatTable, ranges%WatTable, patchout%WatTable, 'default', met) - ! Reset temporary output variable: - out%WatTable = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%WatTable .AND. cable_user%GW_MODEL, ovid%WatTable, 'WatTable', out%WatTable, REAL(ssnow%wtd/1000.0, 4), ranges%WatTable, patchout%WatTable, out_settings) !aquifer water content - IF((output%soil .OR. output%GWMoist) .AND. cable_user%GW_MODEL) THEN - out%GWMoist = out%GWMoist + REAL(ssnow%GWwb, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%GWMoist = out%GWMoist / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%GWMoist, 'GWMoist', & - out%GWMoist, ranges%GWwb, patchout%GWMoist, 'default', met) - ! Reset temporary output variable: - out%GWMoist = 0.0 - END IF - END IF - IF((output%soil .OR. output%SatFrac) .AND. cable_user%GW_MODEL) THEN - !write(*,*) 'Qinfl' !MDeck - ! Add current timestep's value to total of temporary output variable: - out%SatFrac = out%SatFrac + REAL(ssnow%satfrac, 4) - IF(writenow) THEN - out%SatFrac = out%SatFrac / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%SatFrac, 'SatFrac', & - out%SatFrac, ranges%SatFrac, patchout%SatFrac, 'default', met) - ! Reset temporary output variable: - out%SatFrac = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%GWMoist .AND. cable_user%GW_MODEL, ovid%GWMoist, 'GWMoist', out%GWMoist, REAL(ssnow%GWwb, 4), ranges%GWwb, patchout%GWMoist, out_settings) + !write(*,*) 'Qinfl' !MDeck + CALL generate_out_write_acc(output%SatFrac .AND. cable_user%GW_MODEL, ovid%SatFrac, 'SatFrac', out%SatFrac, REAL(ssnow%satfrac, 4), ranges%SatFrac, patchout%SatFrac, out_settings) ! recharge rate - IF(output%soil .OR. output%Qrecharge) THEN - ! Add current timestep's value to total of temporary output variable: - out%Qrecharge = out%Qrecharge + REAL(ssnow%Qrecharge, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Qrecharge = out%Qrecharge / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Qrecharge, 'Qrecharge', & - out%Qrecharge, ranges%Qrecharge, patchout%Qrecharge, 'default', met) - ! Reset temporary output variable: - out%Qrecharge = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%Qrecharge, ovid%Qrecharge, 'Qrecharge', out%Qrecharge, REAL(ssnow%Qrecharge, 4), ranges%Qrecharge, patchout%Qrecharge, out_settings) + !----------------------WRITE SNOW STATE DATA-------------------------------- ! SWE: snow water equivalent [kg/m^2] - IF(output%snow .OR. output%SWE) THEN - ! Add current timestep's value to total of temporary output variable: - out%SWE = out%SWE + REAL(ssnow%snowd, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%SWE = out%SWE / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%SWE, 'SWE', out%SWE, & - ranges%SWE, patchout%SWE, 'default', met) - ! Reset temporary output variable: - out%SWE = 0.0 - END IF + CALL generate_out_write_acc(output%SWE, ovid%SWE, 'SWE', out%SWE, REAL(ssnow%snowd, 4), ranges%SWE, patchout%SWE, out_settings) + CALL generate_out_write_acc(output%SWE, ovid%SnowMelt, 'SnowMelt', out%SnowMelt, REAL(ssnow%smelt/dels, 4), ranges%SnowMelt, patchout%SnowMelt, out_settings) - ! Add current timestep's value to total of temporary output variable: - out%SnowMelt = out%SnowMelt + REAL(ssnow%smelt, 4)/dels - ! temp test vh ! - !out%SnowMelt = out%SnowMelt + REAL(ssnow%nsteps, 4)/dels - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%SnowMelt = out%SnowMelt / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%SnowMelt, 'SnowMelt', out%SnowMelt, & - (/-99999.0, 9999999.0/), patchout%SnowMelt, 'default', met) - ! Reset temporary output variable: - out%SnowMelt = 0.0 - END IF - - END IF ! SnowT: snow surface temp [K] - IF(output%snow .OR. output%SnowT) THEN - ! Add current timestep's value to total of temporary output variable: - out%SnowT = out%SnowT + REAL(ssnow%tggsn(:, 1), 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%SnowT = out%SnowT / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%SnowT, 'SnowT', & - out%SnowT, ranges%SnowT, patchout%SnowT, 'default', met) - ! Reset temporary output variable: - out%SnowT = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%SnowT, ovid%SnowT, 'SnowT', out%SnowT, REAL(ssnow%tggsn(:, 1), 4), ranges%SnowT, patchout%SnowT, out_settings) ! SnowDepth: actual depth of snow in [m] - IF(output%snow .OR. output%SnowDepth) THEN - ! Add current timestep's value to total of temporary output variable: - out%SnowDepth = out%SnowDepth + REAL(SUM(ssnow%sdepth, 2), 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%SnowDepth = out%SnowDepth/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%SnowDepth, 'SnowDepth', & - out%SnowDepth, ranges%SnowDepth, patchout%SnowDepth, 'default', met) - ! Reset temporary output variable: - out%SnowDepth = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%SnowDepth, ovid%SnowDepth, 'SnowDepth', out%SnowDepth, REAL(SUM(ssnow%sdepth, 2), 4), ranges%SnowDepth, patchout%SnowDepth, out_settings) + !-------------------------WRITE RADIATION DATA------------------------------ ! SWnet: net shortwave [W/m^2] - IF(output%radiation .OR. output%SWnet) THEN - ! Add current timestep's value to total of temporary output variable: - out%SWnet = out%SWnet + REAL(SUM(rad%qcan(:, :, 1), 2) + & - SUM(rad%qcan(:, :, 2), 2) + rad%qssabs, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%SWnet = out%SWnet / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%SWnet, 'SWnet', & - out%SWnet, ranges%SWnet, patchout%SWnet, 'default', met) - ! Reset temporary output variable: - out%SWnet = 0.0 - END IF - END IF + temp_acc = SUM(rad%qcan(:, :, 1), 2) + SUM(rad%qcan(:, :, 2), 2) + rad%qssabs + CALL generate_out_write_acc(output%Swnet, ovid%Swnet, 'Swnet', out%Swnet, temp_acc, ranges%Swnet, patchout%Swnet, out_settings) ! LWnet: net longwave [W/m^2] - IF(output%radiation .OR. output%LWnet) THEN - ! Add current timestep's value to total of temporary output variable: - out%LWnet = out%LWnet + & - REAL(met%fld - sboltz * emleaf * canopy%tv ** 4 * (1 - rad%transd) - & - rad%flws * rad%transd, 4) - - ! REV_CORR (needed for testing and offline-as-online cases): - ! correction term added in entirety onto %LWnet not (1-rad%transd)* - ! for standard offline cases %fns_cor = 0. - IF (cable_user%L_REV_CORR) THEN - out%LWnet = out%LWnet + canopy%fns_cor - ENDIF - - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%LWnet = out%LWnet / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%LWnet, 'LWnet', & - out%LWnet, ranges%LWnet, patchout%LWnet, 'default', met) - ! Reset temporary output variable: - out%LWnet = 0.0 - END IF - END IF + temp_acc = met%fld - sboltz*emleaf*canopy%tv**4*(1 - rad%transd) - & + rad%flws*rad%transd + CALL generate_out_write_acc(output%Lwnet, ovid%Lwnet, 'Lwnet', out%Lwnet, temp_acc, ranges%Lwnet, patchout%Lwnet, out_settings) ! Rnet: net absorbed radiation [W/m^2] - IF(output%radiation .OR. output%Rnet) THEN - ! Add current timestep's value to total of temporary output variable: - out%Rnet = out%Rnet + REAL(met%fld - sboltz * emleaf * canopy%tv ** 4 * & - (1 - rad%transd) -rad%flws * rad%transd + & - SUM(rad%qcan(:, :, 1), 2) + & - SUM(rad%qcan(:, :, 2), 2) + rad%qssabs, 4) - - ! REV_CORR (needed for testing and offline-as-online cases): - ! correction term added in entirety onto %Rnet not (1-rad%transd)* - ! for standard offline cases %fns_cor = 0. - IF (cable_user%L_REV_CORR) THEN - out%Rnet = out%Rnet + canopy%fns_cor - ENDIF + temp_acc = met%fld - sboltz*emleaf*canopy%tv**4* & + (1 - rad%transd) - rad%flws*rad%transd + & + SUM(rad%qcan(:, :, 1), 2) + & + SUM(rad%qcan(:, :, 2), 2) + rad%qssabs + CALL generate_out_write_acc(output%Rnet, ovid%Rnet, 'Rnet', out%Rnet, temp_acc, ranges%Rnet, patchout%Rnet, out_settings) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Rnet = out%Rnet / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Rnet, 'Rnet', out%Rnet, & - ranges%Rnet, patchout%Rnet, 'default', met) - ! Reset temporary output variable: - out%Rnet = 0.0 - END IF - END IF ! Albedo: - IF(output%radiation .OR. output%Albedo) THEN - ! Add current timestep's value to total of temporary output variable: - out%Albedo = out%Albedo + REAL((rad%albedo(:, 1) + rad%albedo(:, 2)) & - * 0.5, 4) - ! output calc of soil albedo based on colour? - Ticket #27 - IF (calcsoilalbedo) THEN - out%visAlbedo = out%visAlbedo + REAL(rad%albedo(:, 1) , 4) - out%nirAlbedo = out%nirAlbedo + REAL(rad%albedo(:, 2) , 4) - END IF + CALL generate_out_write_acc(output%Albedo, ovid%Albedo, 'Albedo', out%Albedo, REAL((rad%albedo(:, 1) + rad%albedo(:, 2)) & + *0.5, 4), ranges%Albedo, patchout%Albedo, out_settings) + CALL generate_out_write_acc(output%Albedo .AND. calcsoilalbedo, ovid%visAlbedo, 'visAlbedo', out%visAlbedo, REAL(rad%albedo(:, 1), 4), ranges%visAlbedo, patchout%visAlbedo, out_settings) + CALL generate_out_write_acc(output%Albedo .AND. calcsoilalbedo, ovid%nirAlbedo, 'nirAlbedo', out%nirAlbedo, REAL(rad%albedo(:, 2), 4), ranges%nirAlbedo, patchout%nirAlbedo, out_settings) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Albedo = out%Albedo / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Albedo, 'Albedo', & - out%Albedo, ranges%Albedo, patchout%Albedo, 'default', met) - ! Reset temporary output variable: - out%Albedo = 0.0 - - ! output calc of soil albedo based on colour? - Ticket #27 - IF (calcsoilalbedo) THEN - out%visAlbedo = out%visAlbedo / REAL(output%interval, 4) - CALL write_ovar(out_timestep, ncid_out, ovid%visAlbedo, 'visAlbedo',& - out%visAlbedo, ranges%visAlbedo, patchout%visAlbedo, 'default', met) - out%visAlbedo = 0.0 - out%nirAlbedo = out%nirAlbedo / REAL(output%interval, 4) - CALL write_ovar(out_timestep, ncid_out, ovid%nirAlbedo, 'nirAlbedo',& - out%nirAlbedo, ranges%nirAlbedo, patchout%nirAlbedo, 'default', met) - out%nirAlbedo = 0.0 - END IF - END IF - END IF ! RadT: Radiative surface temperature [K] - IF(output%radiation .OR. output%RadT) THEN - ! Add current timestep's value to total of temporary output variable: - out%RadT = out%RadT + REAL((((1.0 - rad%transd) * emleaf * sboltz * & - canopy%tv ** 4 + rad%transd * emsoil * sboltz * (ssnow%tss) ** 4) / sboltz) & - ** 0.25, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%RadT = out%RadT/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%RadT, 'RadT', out%RadT, & - ranges%RadT, patchout%RadT, 'default', met) - ! Reset temporary output variable: - out%RadT = 0.0 - END IF - END IF + temp_acc = (((1.0 - rad%transd)*emleaf*sboltz* & + canopy%tv**4 + rad%transd*emsoil*sboltz*(ssnow%tss)**4)/sboltz)**0.25 + CALL generate_out_write_acc(output%RadT, ovid%RadT, 'RadT', out%RadT, temp_acc, ranges%RadT, patchout%RadT, out_settings) + !------------------------WRITE VEGETATION DATA------------------------------ + + out_settings%dimswitch = 'ALMA' ! Tscrn: screen level air temperature [oC] - IF(output%Tscrn .OR. output%veg) THEN - ! Add current timestep's value to total of temporary output variable: - out%Tscrn = out%Tscrn + REAL(canopy%tscrn, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Tscrn = out%Tscrn/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Tscrn, 'Tscrn', & - out%Tscrn, ranges%Tscrn, patchout%Tscrn, 'ALMA', met) - ! Reset temporary output variable: - out%Tscrn = 0.0 - END IF - END IF - !INH - extremes in screen level air temperature [oC] - IF(output%Tex .OR. output%veg) THEN - !if 'daily' then only daily values - using variables Txx and Tnn - IF (output%averaging(1:2) == 'da') THEN - DO iy=1,mp - out%Txx(iy) = MAX(out%Txx(iy),REAL(canopy%tscrn(iy),4)) - out%Tnn(iy) = MIN(out%Tnn(iy),REAL(canopy%tscrn(iy),4)) - ENDDO - IF(writenow) THEN - CALL write_ovar(out_timestep,ncid_out,ovid%Txx, 'Txx', & - out%Txx, ranges%Tscrn, patchout%Tex, 'ALMA', met) - CALL write_ovar(out_timestep,ncid_out,ovid%Tnn, 'Tnn', & - out%Tnn, ranges%Tscrn, patchout%Tex, 'ALMA', met) - !Reset temporary output variables: - out%Txx = -1.0E6 - out%Tnn = 1.0E6 - ENDIF - ENDIF + CALL generate_out_write_acc(output%Tscrn, ovid%Tscrn, 'Tscrn', out%Tscrn, REAL(canopy%tscrn, 4), ranges%Tscrn, patchout%Tscrn, out_settings) - IF (output%averaging(1:2)=='mo') THEN - !if monthly then both full extremes and averaged extremes - DO iy=1,mp - out%Txx(iy) = MAX(out%Txx(iy),REAL(canopy%tscrn(iy),4)) - out%Tnn(iy) = MIN(out%Tnn(iy),REAL(canopy%tscrn(iy),4)) - out%Tdaymx(iy) = MAX(out%Tdaymx(iy),REAL(canopy%tscrn(iy),4)) - out%Tdaymn(iy) = MIN(out%Tdaymn(iy),REAL(canopy%tscrn(iy),4)) - ENDDO - !take copy of day's max/min for averaged output - reset Tdaymx/mn - IF (MOD(ktau,24*3600/INT(dels))==0) THEN - out%Tmx = out%Tmx + out%Tdaymx - out%Tmn = out%Tmn + out%Tdaymn - out%Tdaymx = -1.0E6 - out%Tdaymn = 1.0E6 - ENDIF - IF(writenow) THEN - !divide by number of records in average (dels*%interval/24/3600) - out%Tmx = REAL(86400,4)*out%Tmx/REAL(output%interval*INT(dels),4) - out%Tmn = REAL(86400,4)*out%Tmn/REAL(output%interval*INT(dels),4) - !write to file - CALL write_ovar(out_timestep,ncid_out,ovid%Txx, 'Txx', & - out%Txx, ranges%Tscrn, patchout%Tex, 'ALMA', met) - CALL write_ovar(out_timestep,ncid_out,ovid%Tnn, 'Tnn', & - out%Tnn, ranges%Tscrn, patchout%Tex, 'ALMA', met) - CALL write_ovar(out_timestep,ncid_out,ovid%Tmx, 'Tmx', & - out%Tmx, ranges%Tscrn, patchout%Tex, 'ALMA', met) - CALL write_ovar(out_timestep,ncid_out,ovid%Tmn, 'Tmn', & - out%Tmn, ranges%Tscrn, patchout%Tex, 'ALMA', met) - !Reset temporary output variables: - out%Txx = -1.0E6 - out%Tnn = 1.0E6 - out%Tmx = 0.0 - out%Tmn = 0.0 - ENDIF - ENDIF - ENDIF - ! Qscrn: screen level specific humdity [kg/kg] - IF(output%Qscrn .OR. output%veg) THEN - ! Add current timestep's value to total of temporary output variable: - out%Qscrn = out%Qscrn + REAL(canopy%qscrn, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%qscrn = out%qscrn/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Qscrn, 'Qscrn', & - out%Qscrn, ranges%Qscrn, patchout%Qscrn, 'ALMA', met) - ! Reset temporary output variable: - out%Qscrn = 0.0 - END IF + !INH - extremes in screen level air temperature [oC] + IF (output%Tex) THEN + !if 'daily' then only daily values - using variables Txx and Tnn + IF (output%averaging(1:2) == 'da') THEN + DO iy = 1, mp + out%Txx(iy) = MAX(out%Txx(iy), REAL(canopy%tscrn(iy), 4)) + out%Tnn(iy) = MIN(out%Tnn(iy), REAL(canopy%tscrn(iy), 4)) + END DO + IF (out_settings%writenow) THEN + CALL check_and_write(.TRUE., ovid%Txx, 'Txx', & + out%Txx, out%Txx, ranges%Tscrn, patchout%Tex, out_settings) + CALL check_and_write(.TRUE., ovid%Tnn, 'Tnn', & + out%Tnn, out%Tnn, ranges%Tscrn, patchout%Tex, out_settings) + !Reset temporary output variables: + out%Txx = -1.0E6 + out%Tnn = 1.0E6 + END IF + END IF + + IF (output%averaging(1:2) == 'mo') THEN + !if monthly then both full extremes and averaged extremes + DO iy = 1, mp + out%Txx(iy) = MAX(out%Txx(iy), REAL(canopy%tscrn(iy), 4)) + out%Tnn(iy) = MIN(out%Tnn(iy), REAL(canopy%tscrn(iy), 4)) + out%Tdaymx(iy) = MAX(out%Tdaymx(iy), REAL(canopy%tscrn(iy), 4)) + out%Tdaymn(iy) = MIN(out%Tdaymn(iy), REAL(canopy%tscrn(iy), 4)) + END DO + !take copy of day's max/min for averaged output - reset Tdaymx/mn + IF (MOD(ktau, 24*3600/INT(dels)) == 0) THEN + out%Tmx = out%Tmx + out%Tdaymx + out%Tmn = out%Tmn + out%Tdaymn + out%Tdaymx = -1.0E6 + out%Tdaymn = 1.0E6 + END IF + IF (out_settings%writenow) THEN + !divide by number of records in average (dels*%interval/24/3600) + out%Tmx = REAL(86400, 4)*out%Tmx/REAL(output%interval*INT(dels), 4) + out%Tmn = REAL(86400, 4)*out%Tmn/REAL(output%interval*INT(dels), 4) + !write to file + CALL check_and_write(.TRUE., ovid%Txx, 'Txx', & + out%Txx, out%Txx, ranges%Tscrn, patchout%Tex, out_settings) + CALL check_and_write(.TRUE., ovid%Tnn, 'Tnn', & + out%Tnn, out%Tnn, ranges%Tscrn, patchout%Tex, out_settings) + CALL check_and_write(.TRUE., ovid%Tmx, 'Tmx', & + out%Tmx, out%Tmx, ranges%Tscrn, patchout%Tex, out_settings) + CALL check_and_write(.TRUE., ovid%Tmn, 'Tmn', & + out%Tmn, out%Tmn, ranges%Tscrn, patchout%Tex, out_settings) + !Reset temporary output variables: + out%Txx = -1.0E6 + out%Tnn = 1.0E6 + out%Tmx = 0.0 + out%Tmn = 0.0 + END IF + END IF END IF + ! Qscrn: screen level specific humdity [kg/kg] + CALL generate_out_write_acc(output%Qscrn, ovid%qscrn, 'Qscrn', out%qscrn, REAL(canopy%qscrn, 4), ranges%Qscrn, patchout%Qscrn, out_settings) + + out_settings%dimswitch = 'default' ! VegT: vegetation temperature [K] - IF(output%veg .OR. output%VegT) THEN - ! Add current timestep's value to total of temporary output variable: - out%VegT = out%VegT + REAL(canopy%tv, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%VegT = out%VegT / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%VegT, 'VegT', out%VegT, & - ranges%VegT, patchout%VegT, 'default', met) - ! Reset temporary output variable: - out%VegT = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%VegT, ovid%VegT, 'VegT', out%VegT, REAL(canopy%tv, 4), ranges%VegT, patchout%VegT, out_settings) ! CanT: within-canopy temperature [K] - IF(output%veg .OR. output%CanT) THEN - ! Add current timestep's value to total of temporary output variable: - out%CanT = out%CanT + REAL(met%tvair, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%CanT = out%CanT / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%CanT, 'CanT', out%CanT, & - ranges%CanT, patchout%CanT, 'default', met) - ! Reset temporary output variable: - out%CanT = 0.0 - END IF - END IF - IF(output%veg .OR. output%Fwsoil) THEN - ! Add current timestep's value to total of temporary output variable: - out%Fwsoil = out%Fwsoil + REAL(canopy%fwsoil, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Fwsoil = out%Fwsoil / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Fwsoil, 'Fwsoil', out%Fwsoil, & - ranges%Fwsoil, patchout%Fwsoil, 'default', met) - ! Reset temporary output variable: - out%Fwsoil = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%CanT, ovid%CanT, 'CanT', out%CanT, REAL(met%tvair, 4), ranges%CanT, patchout%CanT, out_settings) + ! Fwsoil + CALL generate_out_write_acc(output%Fwsoil, ovid%Fwsoil, 'Fwsoil', out%Fwsoil, REAL(canopy%fwsoil, 4), ranges%Fwsoil, patchout%Fwsoil, out_settings) ! CanopInt: total canopy water storage [kg/m^2] - IF(output%veg .OR. output%CanopInt) THEN - ! Add current timestep's value to total of temporary output variable: - out%CanopInt = out%CanopInt + REAL(canopy%cansto, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%CanopInt = out%CanopInt / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%CanopInt, 'CanopInt', & - out%CanopInt, ranges%CanopInt, patchout%CanopInt, 'default', met) - ! Reset temporary output variable: - out%CanopInt = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%CanopInt, ovid%CanopInt, 'CanopInt', out%CanopInt, REAL(canopy%cansto, 4), ranges%CanopInt, patchout%CanopInt, out_settings) ! LAI: - IF(output%veg .OR. output%LAI) THEN - ! Add current timestep's value to total of temporary output variable: - out%LAI = out%LAI + REAL(veg%vlai, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%LAI = out%LAI/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%LAI, 'LAI', out%LAI, & - ranges%LAI, patchout%LAI, 'default', met) - ! Reset temporary output variable: - out%LAI = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%LAI, ovid%LAI, 'LAI', out%LAI, REAL(veg%vlai, 4), ranges%LAI, patchout%LAI, out_settings) !------------------------WRITE BALANCES DATA-------------------------------- ! Ebal: cumulative energy balance [W/m^2] - IF(output%balances .OR. output%Ebal) THEN - ! Add current timestep's value to total of temporary output variable: - out%Ebal = out%Ebal + REAL(bal%ebal_tot, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Ebal = out%Ebal / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Ebal, 'Ebal', out%Ebal, & - ranges%Ebal, patchout%Ebal, 'default', met) - ! Reset temporary output variable: - out%Ebal = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%Ebal, ovid%Ebal, 'Ebal', out%Ebal, REAL(bal%ebal_tot, 4), ranges%Ebal, patchout%Ebal, out_settings) ! Wbal: cumulative water balance [kg/m^2/s] - IF(output%balances .OR. output%Wbal) THEN - ! Add current timestep's value to total of temporary output variable: - out%Wbal = out%Wbal + REAL(bal%wbal_tot, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%Wbal = out%Wbal / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Wbal, 'Wbal', & - out%Wbal, ranges%Wbal, patchout%Wbal, 'default', met) - ! Reset temporary output variable: - out%Wbal = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%Wbal, ovid%Wbal, 'Wbal', out%Wbal, REAL(bal%wbal_tot, 4), ranges%Wbal, patchout%Wbal, out_settings) !------------------------WRITE CARBON DATA---------------------------------- ! GPP: gross primary production C by veg [umol/m^2/s] ! added frday in the calculation of GPP (BP may08) - IF(output%carbon .OR. output%GPP) THEN - ! Add current timestep's value to total of temporary output variable: - out%GPP = out%GPP + REAL((-1.0 * canopy%fpn + canopy%frday) & - / 1.201E-5, 4) - ! out%GPP = out%GPP + REAL((-1.0 * canopy%fpn) & - ! / 1.201E-5, 4) - - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%GPP = out%GPP/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%GPP, 'GPP', out%GPP, & - ranges%GPP, patchout%GPP, 'default', met) - ! Reset temporary output variable: - out%GPP = 0.0 - END IF - - END IF + ! temp_acc = REAL((-1.0 * canopy%fpn) / 1.201E-5, 4) + CALL generate_out_write_acc(output%GPP, ovid%GPP, 'GPP', out%GPP, REAL((-1.0*canopy%fpn + canopy%frday) & + /1.201E-5, 4), ranges%GPP, patchout%GPP, out_settings) ! NPP: net primary production of C by veg [umol/m^2/s] - IF(output%carbon .OR. output%NPP) THEN - ! Add current timestep's value to total of temporary output variable: - !out%NPP = out%NPP + REAL((-1.0 * canopy%fpn - canopy%frp & - ! - casaflux%clabloss/86400.0) / 1.201E-5, 4) - ! vh ! expression below can be slightly different form that above in cases where - ! leaf maintenance respiration is reduced in CASA - ! (relative to its original value calculated in cable_canopy) - ! in order to avoid negative carbon stores. - IF(output%casa) THEN - out%NPP = out%NPP + REAL(casaflux%cnpp/86400.0 / 1.201E-5, 4) - ELSE - out%NPP = out%NPP + REAL((-1.0 * canopy%fpn - canopy%frp)/ 1.201E-5)! & - ENDIF - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%NPP = out%NPP / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%NPP, 'NPP', out%NPP, & - ranges%NPP, patchout%NPP, 'default', met) - ! Reset temporary output variable: - out%NPP = 0.0 - END IF - END IF - ! AutoResp: autotrophic respiration [umol/m^2/s] - IF(output%carbon .OR. output%AutoResp) THEN - ! Add current timestep's value to total of temporary output variable: - !out%AutoResp = out%AutoResp + REAL((canopy%frp + canopy%frday + casaflux%clabloss/86400.0) & - ! / 1.201E-5, 4) - ! vh ! expression below can be slightly different form that above in cases where - ! leaf maintenance respiration is reduced in CASA - ! (relative to its original value calculated in cable_canopy) - ! in order to avoid negative carbon stores. - - IF(output%casa) THEN - out%AutoResp = out%AutoResp + REAL(canopy%frday / 1.201E-5, 4) + & - REAL((casaflux%crmplant(:,2)/86400.0 + casaflux%crmplant(:,3)/86400.0 + & - casaflux%crgplant/86400.0 + casaflux%clabloss/86400.)/ 1.201E-5, 4) - ELSE - out%AutoResp = out%AutoResp + REAL((canopy%frp + canopy%frday) & - / 1.201E-5, 4) - ENDIF - - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%AutoResp = out%AutoResp/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%AutoResp, 'AutoResp', & - out%AutoResp, ranges%AutoResp, patchout%AutoResp, 'default', met) - ! Reset temporary output variable: - out%AutoResp = 0.0 - END IF - - IF(output%casa) THEN - out%RootResp = out%RootResp + REAL(casaflux%crmplant(:,3)/86400.0/ 1.201E-5, 4) !+ & - ! REAL(0.3*casaflux%crmplant(:,2)/86400.0/ 1.201E-5, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%RootResp = out%RootResp/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%RootResp, 'RootResp', & - out%RootResp, ranges%AutoResp, patchout%AutoResp, 'default', met) - ! Reset temporary output variable: - out%RootResp = 0.0 - END IF - END IF + IF (output%NPP) THEN + ! Add current timestep's value to total of temporary output variable: + !out%NPP = out%NPP + REAL((-1.0 * canopy%fpn - canopy%frp & + ! - casaflux%clabloss/86400.0) / 1.201E-5, 4) + ! vh ! expression below can be slightly different form that above in cases where + ! leaf maintenance respiration is reduced in CASA + ! (relative to its original value calculated in cable_canopy) + ! in order to avoid negative carbon stores. + IF (output%casa) THEN + temp_acc = casaflux%cnpp/86400.0/1.201E-5 + ELSE + temp_acc = (-1.0*canopy%fpn - canopy%frp)/1.201E-5 ! & + END IF + END IF + CALL generate_out_write_acc(output%NPP, ovid%NPP, 'NPP', out%NPP, temp_acc, ranges%NPP, patchout%NPP, out_settings) - IF(output%casa) THEN - out%StemResp = out%StemResp + REAL(casaflux%crmplant(:,2)/86400.0/ 1.201E-5, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%StemResp = out%StemResp/REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%StemResp, 'StemResp', & - out%StemResp, ranges%AutoResp, patchout%AutoResp, 'default', met) - ! Reset temporary output variable: - out%StemResp = 0.0 - END IF - END IF - - END IF + ! AutoResp: autotrophic respiration [umol/m^2/s] + IF (output%AutoResp) THEN + ! Add current timestep's value to total of temporary output variable: + !out%AutoResp = out%AutoResp + REAL((canopy%frp + canopy%frday + casaflux%clabloss/86400.0) & + ! / 1.201E-5, 4) + ! vh ! expression below can be slightly different form that above in cases where + ! leaf maintenance respiration is reduced in CASA + ! (relative to its original value calculated in cable_canopy) + ! in order to avoid negative carbon stores. + + IF (output%casa) THEN + temp_acc = canopy%frday/1.201E-5 + & + (casaflux%crmplant(:, 2)/86400.0 + casaflux%crmplant(:, 3)/86400.0 + & + casaflux%crgplant/86400.0 + casaflux%clabloss/86400.)/1.201E-5 + ELSE + temp_acc = (canopy%frp + canopy%frday)/1.201E-5 + END IF + END IF + CALL generate_out_write_acc(output%AutoResp, ovid%AutoResp, 'AutoResp', out%AutoResp, temp_acc, ranges%AutoResp, patchout%AutoResp, out_settings) + ! rootresp alt: REAL(0.3*casaflux%crmplant(:,2)/86400.0/ 1.201E-5, 4) + CALL generate_out_write_acc(output%AutoResp .AND. output%casa, ovid%RootResp, 'RootResp', out%RootResp, & + REAL(casaflux%crmplant(:, 3)/86400.0/1.201E-5, 4), ranges%AutoResp, patchout%AutoResp, out_settings) + CALL generate_out_write_acc(output%AutoResp .AND. output%casa, ovid%StemResp, 'StemResp', out%StemResp, & + REAL(casaflux%crmplant(:, 2)/86400.0/1.201E-5, 4), ranges%AutoResp, patchout%AutoResp, out_settings) ! LeafResp: Leaf respiration [umol/m^2/s] - IF(output%carbon .OR. output%LeafResp) THEN - ! Add current timestep's value to total of temporary output variable: - out%LeafResp = out%LeafResp + REAL(canopy%frday / 1.201E-5, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%LeafResp = out%LeafResp / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%LeafResp, 'LeafResp', & - out%LeafResp, ranges%LeafResp, patchout%LeafResp, 'default', met) - ! Reset temporary output variable: - out%LeafResp = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%LeafResp, ovid%LeafResp, 'LeafResp', out%LeafResp, REAL(canopy%frday/1.201E-5, 4), ranges%LeafResp, patchout%LeafResp, out_settings) ! HeteroResp: heterotrophic respiration [umol/m^2/s] - IF(output%carbon .OR. output%HeteroResp) THEN - ! Add current timestep's value to total of temporary output variable: - out%HeteroResp = out%HeteroResp + REAL(canopy%frs / 1.201E-5, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%HeteroResp = out%HeteroResp / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%HeteroResp, & - 'HeteroResp', out%HeteroResp, ranges%HeteroResp, & - patchout%HeteroResp, 'default', met) - ! Reset temporary output variable: - out%HeteroResp = 0.0 - END IF - END IF + CALL generate_out_write_acc(output%HeteroResp, ovid%HeteroResp, 'HeteroResp', out%HeteroResp, REAL(canopy%frs/1.201E-5, 4), ranges%HeteroResp, patchout%HeteroResp, out_settings) ! output patch area - IF(output%casa) THEN - out%Area = casamet%areacell/1e6 ! km2 - IF(writenow) THEN - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%Area, 'Area', out%Area, & - ranges%Area, patchout%Area, 'default', met) - END IF - IF (cable_user%POPLUC) THEN - ! output patch fraction - IF(writenow) THEN - CALL write_ovar(out_timestep, ncid_out, opid%patchfrac, 'patchfrac', & - REAL(patch(:)%frac, 4), (/0.0, 1.0/), patchout%patchfrac, 'default',met) - - END IF - ENDIF - ENDIF - IF (cable_user%CALL_POP) THEN - IF(writenow) THEN - IF(output%params .OR. output%hc) CALL write_ovar(out_timestep,ncid_out, opid%hc, & - 'hc', REAL(veg%hc, 4), ranges%hc, patchout%hc, 'default', met) - ENDIF - ENDIF + IF (output%casa) THEN + out%Area = casamet%areacell/1e6 ! km2 + END IF + CALL check_and_write(output%casa, ovid%Area, 'Area', out%Area, out%Area, ranges%Area, patchout%Area, out_settings) + CALL check_and_write(output%casa .AND. cable_user%POPLUC, ovid%patchfrac, 'patchfrac', REAL(patch(:)%frac, 4), REAL(patch(:)%frac, 4), ranges%Area, patchout%Area, out_settings) + CALL check_and_write(output%casa .AND. cable_user%CALL_POP, ovid%hc, 'hc', REAL(veg%hc, 4), REAL(veg%hc, 4), ranges%hc, patchout%hc, out_settings) ! NBP and turnover fluxes [umol/m^2/s] - IF((output%carbon .OR. output%NBP) .AND. output%casa) THEN - ! Add current timestep's value to total of temporary output variable: - IF (cable_user%POPLUC) THEN - out%NBP = out%NBP + -REAL((casaflux%Crsoil-casaflux%cnpp & - - casapool%dClabiledt)/86400.0 & - / 1.201E-5, 4) !- & - !REAL((casaflux%FluxCtohwp + casaflux%FluxCtoclear )/86400.0 & - !/ 1.201E-5, 4) - ELSE - out%NBP = out%NBP + -REAL((casaflux%Crsoil-casaflux%cnpp & - - casapool%dClabiledt)/86400.0 & - / 1.201E-5, 4) - ENDIF + IF (output%NBP .AND. output%casa) THEN + IF (cable_user%POPLUC) THEN + temp_acc = -(casaflux%Crsoil - casaflux%cnpp & + - casapool%dClabiledt)/86400.0 & + /1.201E-5 !- & + !REAL((casaflux%FluxCtohwp + casaflux%FluxCtoclear )/86400.0 & + !/ 1.201E-5, 4) + ELSE + temp_acc = -(casaflux%Crsoil - casaflux%cnpp & + - casapool%dClabiledt)/86400.0 & + /1.201E-5 + END IF + END IF + CALL generate_out_write_acc(output%NBP .AND. output%casa, ovid%NBP, 'NBP', out%NBP, temp_acc, ranges%NEE, patchout%NBP, out_settings) + + !------------------------WRITE REMAINING CASA DATA---------------------------------- + CALL generate_out_write_acc(output%casa, ovid%dCdt, 'dCdt', out%dCdt, & + REAL((casapool%ctot - casapool%ctot_0)/86400.0/1.201E-5, 4), ranges%NEE, patchout%dCdt, out_settings) + CALL generate_out_write_acc(output%casa, ovid%PlantTurnover, 'PlantTurnover', out%PlantTurnover, & + REAL((SUM(casaflux%Cplant_turnover, 2))/86400.0/1.201E-5, 4), ranges%NEE, patchout%PlantTurnover, out_settings) + CALL generate_out_write_acc(output%casa, ovid%PlantTurnoverLeaf, 'PlantTurnoverLeaf', out%PlantTurnoverLeaf, & + REAL((casaflux%Cplant_turnover(:, 1))/86400.0/1.201E-5, 4), ranges%NEE, patchout%PlantTurnoverLeaf, out_settings) + CALL generate_out_write_acc(output%casa, ovid%PlantTurnoverFineRoot, 'PlantTurnoverFineRoot', out%PlantTurnoverFineRoot, & + REAL((casaflux%Cplant_turnover(:, 3))/86400.0/1.201E-5, 4), ranges%NEE, patchout%PlantTurnoverFineRoot, out_settings) + CALL generate_out_write_acc(output%casa, ovid%PlantTurnoverWood, 'PlantTurnoverWood', out%PlantTurnoverWood, & + REAL((casaflux%Cplant_turnover(:, 2))/86400.0/1.201E-5, 4), ranges%NEE, patchout%PlantTurnoverWood, out_settings) + CALL generate_out_write_acc(output%casa, ovid%PlantTurnoverWoodDist, 'PlantTurnoverWoodDist', out%PlantTurnoverWoodDist, & + REAL(casaflux%Cplant_turnover_disturbance/86400.0/1.201E-5, 4), ranges%NEE, patchout%PlantTurnoverWoodDist, out_settings) + CALL generate_out_write_acc(output%casa, ovid%PlantTurnoverWoodCrowding, 'PlantTurnoverWoodCrowding', out%PlantTurnoverWoodCrowding, & + REAL(casaflux%Cplant_turnover_crowding/86400.0/1.201E-5, 4), ranges%NEE, patchout%PlantTurnoverWoodCrowding, out_settings) + CALL generate_out_write_acc(output%casa, ovid%PlantTurnoverWoodResourceLim, 'PlantTurnoverWoodResourceLim', out%PlantTurnoverWoodResourceLim, & + REAL((casaflux%Cplant_turnover_resource_limitation)/86400.0/1.201E-5, 4), ranges%NEE, patchout%PlantTurnoverWoodResourceLim, out_settings) + CALL generate_out_write_acc(output%casa .AND. cable_user%POPLUC, ovid%LandUseFlux, 'LandUseFlux', out%LandUseFlux, & + REAL((casaflux%FluxCtohwp + casaflux%FluxCtoclear)/86400.0/1.201E-5, 4), ranges%NEE, patchout%LandUseFlux, out_settings) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%NBP = out%NBP / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%NBP, 'NBP', out%NBP, & - ranges%NEE, patchout%NBP, 'default', met) - ! Reset temporary output variable: - out%NBP = 0.0 - END IF - ENDIF - IF(output%casa) THEN - ! Add current timestep's value to total of temporary output variable: - out%dCdt = out%dCdt + REAL((casapool%ctot-casapool%ctot_0)/86400.0 & - / 1.201E-5, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%dCdt = out%dCdt / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%dCdt, 'dCdt', out%dCdt, & - ranges%NEE, patchout%dCdt, 'default', met) - ! Reset temporary output variable: - out%dCdt = 0.0 - END IF + ! plant carbon [kg C m-2] + CALL generate_out_write_acc(output%casa, ovid%TotSoilCarb, 'TotSoilCarb', out%TotSoilCarb, REAL((SUM(casapool%csoil, 2) + SUM(casapool%clitter, 2)) & + /1000.0, 4), ranges%TotSoilCarb, patchout%TotSoilCarb, out_settings) + CALL generate_out_write_acc(output%casa, ovid%TotLittCarb, 'TotLittCarb', out%TotLittCarb, REAL(SUM(casapool%clitter, 2)/1000.0, 4) & + , ranges%TotLittCarb, patchout%TotLittCarb, out_settings) + + ! csoil + CALL generate_out_write_acc(output%casa, ovid%SoilCarbFast, 'SoilCarbFast', out%SoilCarbFast, REAL(casapool%csoil(:, 1)/1000.0, 4) & + , ranges%TotLittCarb, patchout%SoilCarbFast, out_settings) + CALL generate_out_write_acc(output%casa, ovid%SoilCarbSlow, 'SoilCarbSlow', out%SoilCarbSlow, REAL(casapool%csoil(:, 2)/1000.0, 4) & + , ranges%TotSoilCarb, patchout%SoilCarbSlow, out_settings) + CALL generate_out_write_acc(output%casa, ovid%SoilCarbPassive, 'SoilCarbPassive', out%SoilCarbPassive, REAL(casapool%csoil(:, 3)/1000.0, 4) & + , ranges%TotSoilCarb, patchout%SoilCarbPassive, out_settings) + + ! clitter + CALL generate_out_write_acc(output%casa, ovid%LittCarbMetabolic, 'LittCarbMetabolic', out%LittCarbMetabolic, REAL(casapool%clitter(:, 1)/1000.0, 4) & + , ranges%TotLittCarb, patchout%LittCarbMetabolic, out_settings) + CALL generate_out_write_acc(output%casa, ovid%LittCarbStructural, 'LittCarbStructural', out%LittCarbStructural, REAL(casapool%clitter(:, 2)/1000.0, 4) & + , ranges%TotLittCarb, patchout%LittCarbStructural, out_settings) + CALL generate_out_write_acc(output%casa, ovid%LittCarbCWD, 'LittCarbCWD', out%LittCarbCWD, REAL(casapool%clitter(:, 3)/1000.0, 4) & + , ranges%TotLittCarb, patchout%LittCarbCWD, out_settings) + + ! cplant + CALL generate_out_write_acc(output%casa, ovid%PlantCarbLeaf, 'PlantCarbLeaf', out%PlantCarbLeaf, REAL(casapool%cplant(:, 1)/1000.0, 4) & + , ranges%TotLittCarb, patchout%PlantCarbLeaf, out_settings) + CALL generate_out_write_acc(output%casa, ovid%PlantCarbWood, 'PlantCarbWood', out%PlantCarbWood, REAL(casapool%cplant(:, 2)/1000.0, 4) & + , ranges%TotLittCarb, patchout%PlantCarbWood, out_settings) + CALL generate_out_write_acc(output%casa, ovid%PlantCarbFineRoot, 'PlantCarbFineRoot', out%PlantCarbFineRoot, REAL(casapool%cplant(:, 3)/1000.0, 4) & + , ranges%TotLittCarb, patchout%PlantCarbFineRoot, out_settings) + + CALL generate_out_write_acc(output%casa, ovid%TotLivBiomass, 'TotLivBiomass', out%TotLivBiomass, REAL((SUM(casapool%cplant, 2)) & + /1000.0, 4), ranges%TotLivBiomass, patchout%TotLivBiomass, out_settings) - ! Add current timestep's value to total of temporary output variable: - out%PlantTurnover = out%PlantTurnover + REAL((SUM(casaflux%Cplant_turnover,2))/86400.0 & - / 1.201E-5, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%PlantTurnover = out%PlantTurnover / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%PlantTurnover, 'PlantTurnover', out%PlantTurnover, & - ranges%NEE, patchout%PlantTurnover, 'default', met) - ! Reset temporary output variable: - out%PlantTurnover = 0.0 - END IF + IF (cable_user%sync_nc_file) & + ok = NF90_SYNC(ncid_out) - ! Add current timestep's value to total of temporary output variable: - out%PlantTurnoverLeaf = out%PlantTurnoverLeaf + REAL((casaflux%Cplant_turnover(:,1))/86400.0 & - / 1.201E-5, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%PlantTurnoverLeaf = out%PlantTurnoverLeaf / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%PlantTurnoverLeaf, 'PlantTurnoverLeaf', out%PlantTurnoverLeaf, & - ranges%NEE, patchout%PlantTurnoverLeaf, 'default', met) - ! Reset temporary output variable: - out%PlantTurnoverLeaf = 0.0 - END IF + END SUBROUTINE write_output - ! Add current timestep's value to total of temporary output variable: - out%PlantTurnoverFineRoot = out%PlantTurnoverFineRoot + REAL((casaflux%Cplant_turnover(:,3))/86400.0 & - / 1.201E-5, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%PlantTurnoverFineRoot = out%PlantTurnoverFineRoot / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%PlantTurnoverFineRoot, 'PlantTurnoverFineRoot', & - out%PlantTurnoverFineRoot, & - ranges%NEE, patchout%PlantTurnoverFineRoot, 'default', met) - ! Reset temporary output variable: - out%PlantTurnoverFineRoot = 0.0 - END IF + PURE ELEMENTAL REAL(4) FUNCTION acc_out_var(output_var, out_var, acc_val, writenow) RESULT(res) + LOGICAL, INTENT(IN) :: output_var ! Whether to write the current variable + REAL(4), INTENT(IN) :: out_var + REAL(4), INTENT(IN) :: acc_val + LOGICAL, INTENT(IN) :: writenow + + IF (output_var) THEN + ! Accumulate out_var until interval timesteps + res = out_var + acc_val + IF (writenow) THEN + res = res/REAL(output%interval, 4) + END IF + ELSE + res = out_var + END IF + END FUNCTION acc_out_var - ! Add current timestep's value to total of temporary output variable: - out%PlantTurnoverWood = out%PlantTurnoverWood + REAL((casaflux%Cplant_turnover(:,2))/86400.0 & - / 1.201E-5, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%PlantTurnoverWood = out%PlantTurnoverWood / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%PlantTurnoverWood, 'PlantTurnoverWood', out%PlantTurnoverWood, & - ranges%NEE, patchout%PlantTurnoverWood, 'default', met) - ! Reset temporary output variable: - out%PlantTurnoverWood = 0.0 - END IF + PURE ELEMENTAL REAL(4) FUNCTION reset_on_write(output_var, out_var, writenow) RESULT(res) + LOGICAL, INTENT(IN) :: output_var ! Whether to write the current variable + REAL(4), INTENT(IN) :: out_var + LOGICAL, INTENT(IN) :: writenow - ! Add current timestep's value to total of temporary output variable: - out%PlantTurnoverWoodDist = out%PlantTurnoverWoodDist + & - REAL((casaflux%Cplant_turnover_disturbance)/86400.0 & - / 1.201E-5, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%PlantTurnoverWoodDist = out%PlantTurnoverWoodDist / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%PlantTurnoverWoodDist, 'PlantTurnoverWoodDist', & - out%PlantTurnoverWoodDist, & - ranges%NEE, patchout%PlantTurnoverWoodDist, 'default', met) - ! Reset temporary output variable: - out%PlantTurnoverWoodDist = 0.0 - END IF + res = out_var - ! Add current timestep's value to total of temporary output variable: - out%PlantTurnoverWoodCrowding = out%PlantTurnoverWoodCrowding + & - REAL((casaflux%Cplant_turnover_crowding)/86400.0 & - / 1.201E-5, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%PlantTurnoverWoodCrowding = out%PlantTurnoverWoodCrowding / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%PlantTurnoverWoodCrowding, 'PlantTurnoverWoodCrowding', & - out%PlantTurnoverWoodCrowding, & - ranges%NEE, patchout%PlantTurnoverWoodCrowding, 'default', met) - ! Reset temporary output variable: - out%PlantTurnoverWoodCrowding = 0.0 - END IF + ! Reset the value if it has been written to file + IF (output_var .AND. writenow) THEN + res = 0.0 + END IF + END FUNCTION reset_on_write - ! Add current timestep's value to total of temporary output variable: - out%PlantTurnoverWoodResourceLim = out%PlantTurnoverWoodResourceLim + & - REAL((casaflux%Cplant_turnover_resource_limitation)/86400.0 & - / 1.201E-5, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%PlantTurnoverWoodResourceLim = out%PlantTurnoverWoodResourceLim / & - REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%PlantTurnoverWoodResourceLim, & - 'PlantTurnoverWoodResourceLim', & - out%PlantTurnoverWoodResourceLim, & - ranges%NEE, patchout%PlantTurnoverWoodResourceLim, 'default', met) - ! Reset temporary output variable: - out%PlantTurnoverWoodResourceLim = 0.0 - END IF - IF (cable_user%POPLUC) THEN - ! Add current timestep's value to total of temporary output variable: - out%LandUseFlux = out%LandUseFlux + & - REAL((casaflux%FluxCtohwp + casaflux%FluxCtoclear )/86400.0 & - / 1.201E-5, 4) - - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%LandUseFlux = out%LandUseFlux / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%LandUseFlux, 'LandUseFlux', & - out%LandUseFlux, & - ranges%NEE, patchout%LandUseFlux, 'default', met) - ! Reset temporary output variable: - out%LandUseFlux = 0.0 - END IF - ENDIF + SUBROUTINE check_and_write_d1(output_var, varID, vname, out_var, acc_val, vrange, writepatch, out_settings) + LOGICAL, INTENT(IN) :: output_var ! Whether to write the current variable + INTEGER, INTENT(IN) :: varID ! variable's netcdf ID + CHARACTER(LEN=*), INTENT(IN) :: vname ! name of variable + REAL(4), INTENT(IN) :: out_var(:) + REAL(4), INTENT(IN) :: acc_val(:) + REAL, INTENT(IN) :: vrange(2) ! max and min for variable + LOGICAL, INTENT(IN) :: writepatch ! write patch-specific info for this var? + TYPE(output_var_settings_type), INTENT(IN) :: out_settings ! output specific settings + IF ((check%ranges .EQ. ON_TIMESTEP) .OR. (out_settings%writenow .AND. (check%ranges .EQ. ON_WRITE))) THEN + CALL check_range(vname, acc_val, vrange, out_timestep, out_settings%met) END IF - ! plant carbon [kg C m-2] - IF(output%casa) THEN - out%TotSoilCarb = out%TotSoilCarb + REAL((SUM(casapool%csoil,2)+SUM(casapool%clitter,2)) & - / 1000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%TotSoilCarb = out%TotSoilCarb / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%TotSoilCarb, 'TotSoilCarb', out%TotSoilCarb, & - ranges%TotSoilCarb, patchout%TotSoilCarb, 'default', met) - ! Reset temporary output variable: - out%TotSoilCarb = 0.0 - END IF + IF (output_var .AND. out_settings%writenow) THEN + ! Write value to file: + CALL write_ovar(out_timestep, ncid_out, varID, vname, & + out_var, writepatch, out_settings%dimswitch, out_settings%met) + END IF + END SUBROUTINE check_and_write_d1 - out%TotLittCarb = out%TotLittCarb + REAL(SUM(casapool%clitter,2) / 1000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%TotLittCarb = out%TotLittCarb / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%TotLittCarb, 'TotLittCarb', out%TotLittCarb, & - ranges%TotLittCarb, patchout%TotLittCarb, 'default', met) - ! Reset temporary output variable: - out%TotLittCarb = 0.0 - END IF + SUBROUTINE check_and_write_d2(output_var, varID, vname, out_var, acc_val, vrange, writepatch, out_settings) + LOGICAL, INTENT(IN) :: output_var ! Whether to write the current variable + INTEGER, INTENT(IN) :: varID ! variable's netcdf ID + CHARACTER(LEN=*), INTENT(IN) :: vname ! name of variable + REAL(4), INTENT(IN) :: out_var(:, :) + REAL(4), INTENT(IN) :: acc_val(:, :) + REAL, INTENT(IN) :: vrange(2) ! max and min for variable + LOGICAL, INTENT(IN) :: writepatch ! write patch-specific info for this var? + TYPE(output_var_settings_type), INTENT(IN) :: out_settings ! output specific settings - out%SoilCarbFast = out%SoilCarbFast + REAL(casapool%csoil(:,1) / 1000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%SoilCarbFast = out%SoilCarbFast / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%SoilCarbFast, 'SoilCarbFast' & - , out%SoilCarbFast, & - ranges%TotSoilCarb, patchout%SoilCarbFast, 'default', met) - ! Reset temporary output variable: - out%SoilCarbFast = 0.0 - END IF + IF ((check%ranges .EQ. ON_TIMESTEP) .OR. (out_settings%writenow .AND. (check%ranges .EQ. ON_WRITE))) THEN + CALL check_range(vname, acc_val, vrange, out_timestep, out_settings%met) + END IF - out%SoilCarbSlow = out%SoilCarbSlow + REAL(casapool%csoil(:,2)/ 1000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%SoilCarbSlow = out%SoilCarbSlow / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%SoilCarbSlow, 'SoilCarbSlow' & - , out%SoilCarbSlow, & - ranges%TotSoilCarb, patchout%SoilCarbSlow, 'default', met) - ! Reset temporary output variable: - out%SoilCarbSlow = 0.0 - END IF + IF (output_var .AND. out_settings%writenow) THEN + ! Write value to file: + CALL write_ovar(out_timestep, ncid_out, varID, vname, & + out_var, writepatch, out_settings%dimswitch, out_settings%met) + END IF + END SUBROUTINE check_and_write_d2 - out%SoilCarbPassive = out%SoilCarbPassive + REAL(casapool%csoil(:,3) / 1000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%SoilCarbPassive = out%SoilCarbPassive / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%SoilCarbPassive, 'SoilCarbPassive' & - , out%SoilCarbPassive, & - ranges%TotSoilCarb, patchout%SoilCarbPassive, 'default', met) - ! Reset temporary output variable: - out%SoilCarbPassive = 0.0 - END IF + SUBROUTINE check_and_write_d1_p(output_par, parID, pname, out_par, prange, writepatch, out_settings) - out%LittCarbMetabolic = out%LittCarbMetabolic + REAL(casapool%clitter(:,1) / 1000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%LittCarbMetabolic = out%LittCarbMetabolic / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%LittCarbMetabolic, 'LittCarbMetabolic', out%LittCarbMetabolic, & - ranges%TotLittCarb, patchout%LittCarbMetabolic, 'default', met) - ! Reset temporary output variable: - out%LittCarbMetabolic = 0.0 - END IF + LOGICAL, INTENT(IN) :: output_par ! Whether to write the current parameter + INTEGER, INTENT(IN) :: parID ! parameter netcdf ID + CHARACTER(LEN=*), INTENT(IN) :: pname ! name of parameter + REAL(4), INTENT(IN) :: out_par(:) + REAL, INTENT(IN) :: prange(2) ! max and min for parameter + LOGICAL, INTENT(IN) :: writepatch ! write patch-specific info for this par? + TYPE(output_par_settings_type), INTENT(IN) :: out_settings ! output specific settings - out%LittCarbStructural = out%LittCarbStructural + REAL(casapool%clitter(:,2) / 1000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%LittCarbStructural = out%LittCarbStructural / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%LittCarbStructural, 'LittCarbStructural', out%LittCarbStructural, & - ranges%TotLittCarb, patchout%LittCarbStructural, 'default', met) - ! Reset temporary output variable: - out%LittCarbStructural = 0.0 - END IF + INTEGER :: ncid_file - out%LittCarbCWD = out%LittCarbCWD + REAL(casapool%clitter(:,3) / 1000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%LittCarbCWD = out%LittCarbCWD / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%LittCarbCWD, 'LittCarbCWD', out%LittCarbCWD, & - ranges%TotLittCarb, patchout%LittCarbCWD, 'default', met) - ! Reset temporary output variable: - out%LittCarbCWD = 0.0 - END IF + CALL check_range(pname, out_par, prange, out_timestep, out_settings%met) + IF (output_par) THEN + IF (out_settings%restart) THEN + ncid_file = ncid_restart + ELSE + ncid_file = ncid_out + END IF + ! Write value to file: + CALL write_ovar(ncid_file, parID, pname, out_par, & + writepatch, out_settings%dimswitch, out_settings%restart) + END IF - out%PlantCarbLeaf = out%PlantCarbLeaf + REAL(casapool%cplant(:,1) / 1000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%PlantCarbLeaf = out%PlantCarbLeaf / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%PlantCarbLeaf, 'PlantCarbLeaf', out%PlantCarbLeaf, & - ranges%TotLittCarb, patchout%PlantCarbLeaf, 'default', met) - ! Reset temporary output variable: - out%PlantCarbLeaf = 0.0 - END IF + END SUBROUTINE check_and_write_d1_p - out%PlantCarbFineRoot = out%PlantCarbFineRoot + REAL(casapool%cplant(:,3) / 1000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%PlantCarbFineRoot = out%PlantCarbFineRoot / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%PlantCarbFineRoot, 'PlantCarbFineRoot', & - out%PlantCarbFineRoot, & - ranges%TotLittCarb, patchout%PlantCarbFineRoot, 'default', met) - ! Reset temporary output variable: - out%PlantCarbFineRoot = 0.0 - END IF + SUBROUTINE check_and_write_d2_p(output_par, parID, pname, out_par, prange, writepatch, out_settings) - out%PlantCarbWood = out%PlantCarbWood + REAL(casapool%cplant(:,2) / 1000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%PlantCarbWood = out%PlantCarbWood / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%PlantCarbWood, 'PlantCarbWood', out%PlantCarbWood, & - ranges%TotLittCarb, patchout%PlantCarbWood, 'default', met) - ! Reset temporary output variable: - out%PlantCarbWood = 0.0 - END IF + LOGICAL, INTENT(IN) :: output_par ! Whether to write the current parameter + INTEGER, INTENT(IN) :: parID ! parameter netcdf ID + CHARACTER(LEN=*), INTENT(IN) :: pname ! name of parameter + REAL(4), INTENT(IN) :: out_par(:, :) + REAL, INTENT(IN) :: prange(2) ! max and min for parameter + LOGICAL, INTENT(IN) :: writepatch ! write patch-specific info for this par? + TYPE(output_par_settings_type), INTENT(IN) :: out_settings ! output specific settings - out%TotLivBiomass = out%TotLivBiomass + REAL((SUM(casapool%cplant,2)) & - / 1000.0, 4) - IF(writenow) THEN - ! Divide accumulated variable by number of accumulated time steps: - out%TotLivBiomass = out%TotLivBiomass / REAL(output%interval, 4) - ! Write value to file: - CALL write_ovar(out_timestep, ncid_out, ovid%TotLivBiomass, 'TotLivBiomass', out%TotLivBiomass, & - ranges%TotLivBiomass, patchout%TotLivBiomass, 'default', met) - ! Reset temporary output variable: - out%TotLivBiomass = 0.0 - END IF + INTEGER :: ncid_file + + CALL check_range(pname, out_par, prange, out_timestep, out_settings%met) + IF (output_par) THEN + IF (out_settings%restart) THEN + ncid_file = ncid_restart + ELSE + ncid_file = ncid_out + END IF + ! Write value to file: + CALL write_ovar(ncid_file, parID, pname, out_par, & + writepatch, out_settings%dimswitch, out_settings%restart) END IF - IF (cable_user%sync_nc_file) & - ok = NF90_SYNC(ncid_out) + END SUBROUTINE check_and_write_d2_p + SUBROUTINE generate_out_write_acc_d1(output_var, varID, vname, out_var, acc_val, vrange, writepatch, out_settings) + LOGICAL, INTENT(IN) :: output_var ! Whether to write the current variable + INTEGER, INTENT(IN) :: varID ! variable's netcdf ID + CHARACTER(LEN=*), INTENT(IN) :: vname ! name of variable + REAL(4), INTENT(INOUT) :: out_var(:) + REAL(4), INTENT(IN) :: acc_val(:) + REAL, INTENT(IN) :: vrange(2) ! max and min for variable + LOGICAL, INTENT(IN) :: writepatch ! write patch-specific info for this var? + TYPE(output_var_settings_type), INTENT(IN) :: out_settings ! met data + + out_var = acc_out_var(output_var, out_var, acc_val, out_settings%writenow) + CALL check_and_write(output_var, varID, vname, out_var, acc_val, vrange, writepatch, out_settings) + out_var = reset_on_write(output_var, out_var, out_settings%writenow) + + END SUBROUTINE generate_out_write_acc_d1 + + SUBROUTINE generate_out_write_acc_d2(output_var, varID, vname, out_var, acc_val, vrange, writepatch, out_settings) + LOGICAL, INTENT(IN) :: output_var ! Whether to write the current variable + INTEGER, INTENT(IN) :: varID ! variable's netcdf ID + CHARACTER(LEN=*), INTENT(IN) :: vname ! name of variable + REAL(4), INTENT(INOUT) :: out_var(:, :) + REAL(4), INTENT(IN) :: acc_val(:, :) + REAL, INTENT(IN) :: vrange(2) ! max and min for variable + LOGICAL, INTENT(IN) :: writepatch ! write patch-specific info for this var? + TYPE(output_var_settings_type), INTENT(IN) :: out_settings ! met data + + out_var = acc_out_var(output_var, out_var, acc_val, out_settings%writenow) + CALL check_and_write(output_var, varID, vname, out_var, acc_val, vrange, writepatch, out_settings) + out_var = reset_on_write(output_var, out_var, out_settings%writenow) + + END SUBROUTINE generate_out_write_acc_d2 - END SUBROUTINE write_output !============================================================================= SUBROUTINE close_output_file(bal, air, bgc, canopy, met, & rad, rough, soil, ssnow, sum_flux, veg) @@ -2951,7 +2246,7 @@ SUBROUTINE create_restart(logn, dels, ktau, soil, veg, ssnow, INTEGER, INTENT(IN) :: logn ! log file number REAL, INTENT(IN) :: dels ! time step size INTEGER, INTENT(IN) :: ktau ! timestep number in loop which include spinup - TYPE (met_type),INTENT(IN) :: met ! meteorological data + TYPE (met_type), TARGET, INTENT(IN) :: met ! meteorological data TYPE (soil_parameter_type), INTENT(IN) :: soil ! soil parameters TYPE (veg_parameter_type), INTENT(IN) :: veg ! vegetation parameters TYPE (soil_snow_type), INTENT(IN) :: ssnow ! soil and snow variables @@ -2964,8 +2259,13 @@ SUBROUTINE create_restart(logn, dels, ktau, soil, veg, ssnow, ! INTEGER, INTENT(IN) :: mstype TYPE(parID_type) :: rpid ! parameter IDs for restart nc file - INTEGER :: ncid_restart ! netcdf restart file ID - ! REAL, POINTER,DIMENSION(:,:) :: surffrac ! fraction of each surf type + + + TYPE(output_par_settings_type) :: out_settings + + LOGICAL, PARAMETER :: output_var = .TRUE., patchout_var = .TRUE. + + ! REAL, POINTER, :: surffrac(:, :) ! fraction of each surf type INTEGER :: dummy ! dummy argument in subroutine call INTEGER :: mlandID, mpID, radID, soilID, napID, & soilcarbID, plantcarbID, tID, snowID ! dimension IDs @@ -2983,6 +2283,7 @@ SUBROUTINE create_restart(logn, dels, ktau, soil, veg, ssnow, ! CHARACTER :: FRST_OUT*100, CYEAR*4 CHARACTER :: FRST_OUT*200, CYEAR*4 + out_settings = output_par_settings_type(met=met, restart=.TRUE.) dummy = 0 ! initialise @@ -3453,215 +2754,238 @@ SUBROUTINE create_restart(logn, dels, ktau, soil, veg, ssnow, //TRIM(frst_out)// '(SUBROUTINE create_restart)') ! Write parameters: - CALL write_ovar (ncid_restart, rpid%iveg, 'iveg', REAL(veg%iveg, 4), & - ranges%iveg, .TRUE., 'integer', .TRUE.) - CALL write_ovar (ncid_restart, rpid%isoil, 'isoil', REAL(soil%isoilm, 4), & - ranges%isoil, .TRUE., 'integer', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%bch, 'bch', REAL(soil%bch, 4), & -!$ ranges%bch, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%bch, 'bch', REAL(soil%bch, 4), & -!$ ranges%bch, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%clay, 'clay', REAL(soil%clay, 4), & -!$ ranges%clay, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%sand, 'sand', REAL(soil%sand, 4), & -!$ ranges%sand, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%silt, 'silt', REAL(soil%silt, 4), & -!$ ranges%silt, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%css, 'css', REAL(soil%css, 4), & -!$ ranges%css, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%rhosoil, 'rhosoil', & -!$ REAL(soil%rhosoil,4), ranges%rhosoil, .TRUE., 'real', & -!$ .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%hyds, 'hyds', REAL(soil%hyds, 4), & -!$ ranges%hyds, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%sucs, 'sucs', REAL(soil%sucs, 4), & -!$ ranges%sucs, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%rs20, 'rs20', REAL(veg%rs20, 4), & -!$ ranges%rs20, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%ssat, 'ssat', REAL(soil%ssat, 4), & -!$ ranges%ssat, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%sfc, 'sfc', REAL(soil%sfc, 4), & -!$ ranges%sfc, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%swilt, 'swilt', REAL(soil%swilt, 4), & -!$ ranges%swilt, .TRUE., 'real', .TRUE.) + !~ veg and soil + out_settings%dimswitch = "integer" + CALL check_and_write(output_var, rpid%iveg, & + 'iveg', REAL(veg%iveg, 4), ranges%iveg, patchout_var, out_settings) + CALL check_and_write(output_var, rpid%isoil, 'isoil', REAL(soil%isoilm, 4), & + ranges%isoil, patchout_var, out_settings) + out_settings%dimswitch = "real" +!$ CALL check_and_write(output_var, rpid%bch, 'bch', REAL(soil%bch, 4), & +!$ ranges%bch, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%bch, 'bch', REAL(soil%bch, 4), & +!$ ranges%bch, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%clay, 'clay', REAL(soil%clay, 4), & +!$ ranges%clay, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%sand, 'sand', REAL(soil%sand, 4), & +!$ ranges%sand, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%silt, 'silt', REAL(soil%silt, 4), & +!$ ranges%silt, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%css, 'css', REAL(soil%css, 4), & +!$ ranges%css, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%rhosoil, 'rhosoil', & +!$ REAL(soil%rhosoil, 4), ranges%rhosoil, patchout_var, & +!$ out_settings) +!$ CALL check_and_write(output_var, rpid%hyds, 'hyds', REAL(soil%hyds, 4), & +!$ ranges%hyds, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%sucs, 'sucs', REAL(soil%sucs, 4), & +!$ ranges%sucs, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%rs20, 'rs20', REAL(veg%rs20, 4), & +!$ ranges%rs20, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%ssat, 'ssat', REAL(soil%ssat, 4), & +!$ ranges%ssat, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%sfc, 'sfc', REAL(soil%sfc, 4), & +!$ ranges%sfc, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%swilt, 'swilt', REAL(soil%swilt, 4), & +!$ ranges%swilt, patchout_var, out_settings) ! Soil dimensioned variables/parameters: -!$ CALL write_ovar (ncid_restart, rpid%froot, 'froot', REAL(veg%froot, 4), & -!$ ranges%froot, .TRUE., 'soil', .TRUE.) - CALL write_ovar (ncid_restart, tggID, 'tgg', REAL(ssnow%tgg, 4), & - ranges%SoilTemp, .TRUE., 'soil', .TRUE.) - CALL write_ovar (ncid_restart, wbID, 'wb', ssnow%wb, ranges%SoilMoist, & - .TRUE., 'soil', .TRUE.) - CALL write_ovar (ncid_restart, wbiceID, 'wbice', ssnow%wbice, & - ranges%SoilMoist, .TRUE., 'soil', .TRUE.) - CALL write_ovar (ncid_restart, gammzzID, 'gammzz', ssnow%gammzz, & - (/-99999.0, 9999999.0/), .TRUE., 'soil', .TRUE.) - ! Snow dimensioned variables/parameters: - CALL write_ovar (ncid_restart, ssdnID, 'ssdn', REAL(ssnow%ssdn, 4), & - (/0.0, 9999.0/), .TRUE., 'snow', .TRUE.) - CALL write_ovar (ncid_restart, smassID, 'smass', REAL(ssnow%smass, 4), & - (/0.0, 9999.0/), .TRUE., 'snow', .TRUE.) - CALL write_ovar (ncid_restart, sdepthID, 'sdepth', REAL(ssnow%sdepth, 4), & - (/0.0, 9999.0/), .TRUE., 'snow', .TRUE.) - CALL write_ovar (ncid_restart, tggsnID, 'tggsn', REAL(ssnow%tggsn, 4), & - (/100.0, 300.0/), .TRUE., 'snow', .TRUE.) - ! Other dims - CALL write_ovar (ncid_restart, albsoilsnID, 'albsoilsn', & - REAL(ssnow%albsoilsn, 4), (/0.0, 1.0/), .TRUE., 'radiation', .TRUE.) - CALL write_ovar (ncid_restart, cplantID, 'cplant', REAL(bgc%cplant, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'plantcarbon', .TRUE.) - CALL write_ovar (ncid_restart, csoilID, 'csoil', REAL(bgc%csoil, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'soilcarbon', .TRUE.) + out_settings%dimswitch = "soil" +!$ CALL check_and_write(output_var, rpid%froot, 'froot', REAL(veg%froot, 4), & +!$ ranges%froot, patchout_var, out_settings) + + !~ ssnow + !~~ Soil dimensioned variables/parameters: + out_settings%dimswitch = "soil" + CALL check_and_write(output_var, tggID, 'tgg', REAL(ssnow%tgg, 4), & + ranges%SoilTemp, patchout_var, out_settings) + CALL check_and_write(output_var, wbID, 'wb', REAL(ssnow%wb, 4), ranges%SoilMoist, & + patchout_var, out_settings) + CALL check_and_write(output_var, wbiceID, 'wbice', REAL(ssnow%wbice, 4), & + ranges%SoilMoist, patchout_var, out_settings) + CALL check_and_write(output_var, gammzzID, 'gammzz', REAL(ssnow%gammzz, 4), & + ranges%default_l, patchout_var, out_settings) + !~~ Snow dimensioned variables/parameters: + out_settings%dimswitch = "snow" + CALL check_and_write(output_var, ssdnID, 'ssdn', REAL(ssnow%ssdn, 4), & + ranges%ssdn, patchout_var, out_settings) + CALL check_and_write(output_var, smassID, 'smass', REAL(ssnow%smass, 4), & + ranges%smass, patchout_var, out_settings) + CALL check_and_write(output_var, sdepthID, 'sdepth', REAL(ssnow%sdepth, 4), & + ranges%sdepth, patchout_var, out_settings) + CALL check_and_write(output_var, tggsnID, 'tggsn', REAL(ssnow%tggsn, 4), & + ranges%tggsn, patchout_var, out_settings) + !~~ Other dims + out_settings%dimswitch = "radiation" + CALL check_and_write(output_var, albsoilsnID, 'albsoilsn', & + REAL(ssnow%albsoilsn, 4), ranges%albsoiln, patchout_var, out_settings) + out_settings%dimswitch = "plantcarbon" + CALL check_and_write(output_var, cplantID, 'cplant', REAL(bgc%cplant, 4), & + ranges%default_l, patchout_var, out_settings) + out_settings%dimswitch = "soilcarbon" + CALL check_and_write(output_var, csoilID, 'csoil', REAL(bgc%csoil, 4), & + ranges%default_l, patchout_var, out_settings) ok = NF90_PUT_VAR(ncid_restart, rpid%zse, REAL(soil%zse, 4)) - IF(ok /= NF90_NOERR) CALL nc_abort(ok, 'Error writing zse parameter to ' & - //TRIM(frst_out)// '(SUBROUTINE create_restart)') + IF (ok /= NF90_NOERR) CALL nc_abort(ok, 'Error writing zse parameter to ' & + //TRIM(frst_out)//'(SUBROUTINE create_restart)') ! Single dim: - CALL write_ovar (ncid_restart, rpid%albsoil, 'albsoil', & - REAL(soil%albsoil, 4), ranges%albsoil, .TRUE., & - 'radiation', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%canst1, 'canst1', REAL(veg%canst1, 4), & -!$ ranges%canst1, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%dleaf, 'dleaf', REAL(veg%dleaf, 4), & -!$ ranges%dleaf, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%ejmax, 'ejmax', REAL(veg%ejmax, 4), & -!$ ranges%ejmax, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%vcmax, 'vcmax', REAL(veg%vcmax, 4), & -!$ ranges%vcmax, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%frac4, 'frac4', REAL(veg%frac4, 4), & -!$ ranges%frac4, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%hc, 'hc', REAL(veg%hc, 4), & -!$ ranges%hc, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%rp20, 'rp20', REAL(veg%rp20, 4), & -!$ ranges%rp20, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%g0, 'g0', REAL(veg%g0, 4), & -!$ ranges%g0, .TRUE., 'real', .TRUE.) ! Ticket #56 -!$ CALL write_ovar (ncid_restart, rpid%g1, 'g1', REAL(veg%g1, 4), & -!$ ranges%g1, .TRUE., 'real', .TRUE.) ! Ticket #56 -!$ CALL write_ovar (ncid_restart, rpid%rpcoef, 'rpcoef', REAL(veg%rpcoef, 4), & -!$ ranges%rpcoef, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%shelrb, 'shelrb', REAL(veg%shelrb, 4), & -!$ ranges%shelrb, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%xfang, 'xfang', REAL(veg%xfang, 4), & -!$ ranges%xfang, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%wai, 'wai', REAL(veg%wai, 4), & -!$ ranges%wai, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%vegcf, 'vegcf', REAL(veg%vegcf, 4), & -!$ ranges%vegcf, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%extkn, 'extkn', REAL(veg%extkn, 4), & -!$ ranges%extkn, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%tminvj, 'tminvj', REAL(veg%tminvj, 4), & -!$ ranges%tminvj, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%tmaxvj, 'tmaxvj', REAL(veg%tmaxvj, 4), & -!$ ranges%tmaxvj, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%vbeta, 'vbeta', REAL(veg%vbeta, 4), & -!$ ranges%vbeta, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%xalbnir, 'xalbnir', & -!$ REAL(veg%xalbnir, 4), ranges%xalbnir, .TRUE., & -!$ 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%tmaxvj, 'tmaxvj', REAL(veg%tmaxvj, 4), & -!$ ranges%tmaxvj, .TRUE., 'real', .TRUE.) -!$ ok = NF90_PUT_VAR(ncid_restart, rpid%ratecp, REAL(bgc%ratecp, 4)) -!$ IF(ok /= NF90_NOERR) CALL nc_abort(ok, & -!$ 'Error writing ratecp parameter to ' & -!$ //TRIM(frst_out)// '(SUBROUTINE create_restart)') -!$ ok = NF90_PUT_VAR(ncid_restart, rpid%ratecs, REAL(bgc%ratecs, 4)) -!$ IF(ok /= NF90_NOERR) CALL nc_abort(ok, & -!$ 'Error writing ratecs parameter to ' & -!$ //TRIM(frst_out)// '(SUBROUTINE create_restart)') -!$ CALL write_ovar (ncid_restart, rpid%meth, 'meth', REAL(veg%meth, 4), & -!$ ranges%meth, .TRUE., 'integer', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%za_uv, 'za_uv', REAL(rough%za_uv, 4), & -!$ ranges%za, .TRUE., 'real', .TRUE.) -!$ CALL write_ovar (ncid_restart, rpid%za_tq, 'za_tq', REAL(rough%za_tq, 4), & -!$ ranges%za, .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, tssID, 'tss', REAL(ssnow%tss, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, ssdnnID, 'ssdnn', REAL(ssnow%ssdnn, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, osnowdID, 'osnowd', REAL(ssnow%osnowd, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, snageID, 'snage', REAL(ssnow%snage, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, snowdID, 'snowd', REAL(ssnow%snowd, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, rtsoilID, 'rtsoil', REAL(ssnow%rtsoil, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, isflagID, 'isflag', REAL(ssnow%isflag, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'integer', .TRUE.) - CALL write_ovar (ncid_restart, canstoID, 'cansto', REAL(canopy%cansto, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, sghfluxID, 'sghflux', & - REAL(canopy%sghflux, 4), (/-99999.0, 9999999.0/), & - .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, ghfluxID, 'ghflux', REAL(canopy%ghflux, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, runoffID, 'runoff', REAL(ssnow%runoff, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, rnof1ID, 'rnof1', REAL(ssnow%rnof1, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, rnof2ID, 'rnof2', REAL(ssnow%rnof2, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, gaID, 'ga', REAL(canopy%ga, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, dgdtgID, 'dgdtg', canopy%dgdtg, & - (/-99999.0, 9999999.0/), .TRUE., 'r2', .TRUE.) - CALL write_ovar (ncid_restart, fevID, 'fev', REAL(canopy%fev, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, fesID, 'fes', REAL(canopy%fes, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, fhsID, 'fhs', REAL(canopy%fhs, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, wbtot0ID, 'wbtot0', REAL(bal%wbtot0, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, osnowd0ID, 'osnowd0', REAL(bal%osnowd0, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, albedoID, 'albedo', REAL(rad%albedo, 4), & - ranges%Albedo, .TRUE., 'radiation', .TRUE.) - CALL write_ovar (ncid_restart, tradID, 'trad', & - REAL(rad%trad, 4), ranges%RadT, .TRUE., 'real', .TRUE.) - - CALL write_ovar (ncid_restart, gwID, 'GWwb', REAL(ssnow%GWwb, 4), & - ranges%GWwb, .TRUE., 'real', .TRUE.) - -!$ IF(cable_user%SOIL_STRUC=='sli'.OR.cable_user%FWSOIL_SWITCH=='Haverd2013') THEN -!$ CALL write_ovar (ncid_restart,rpid%gamma,'gamma', & -!$ REAL(veg%gamma,4),(/-99999.0,99999.0/),.TRUE.,'real',.TRUE.) -!$ ENDIF + out_settings%dimswitch = "radiation" + CALL check_and_write(output_var, rpid%albsoil, 'albsoil', & + REAL(soil%albsoil, 4), ranges%albsoil, patchout_var, out_settings) +!$ out_settings%dimswitch = "real" +!$ CALL check_and_write(output_var, rpid%canst1, 'canst1', REAL(veg%canst1, 4), & +!$ ranges%canst1, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%dleaf, 'dleaf', REAL(veg%dleaf, 4), & +!$ ranges%dleaf, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%ejmax, 'ejmax', REAL(veg%ejmax, 4), & +!$ ranges%ejmax, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%vcmax, 'vcmax', REAL(veg%vcmax, 4), & +!$ ranges%vcmax, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%frac4, 'frac4', REAL(veg%frac4, 4), & +!$ ranges%frac4, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%hc, 'hc', REAL(veg%hc, 4), & +!$ ranges%hc, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%rp20, 'rp20', REAL(veg%rp20, 4), & +!$ ranges%rp20, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%g0, 'g0', REAL(veg%g0, 4), & +!$ ranges%g0, patchout_var, out_settings) ! Ticket #56 +!$ CALL check_and_write(output_var, rpid%g1, 'g1', REAL(veg%g1, 4), & +!$ ranges%g1, patchout_var, out_settings) ! Ticket #56 +!$ CALL check_and_write(output_var, rpid%rpcoef, 'rpcoef', REAL(veg%rpcoef, 4), & +!$ ranges%rpcoef, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%shelrb, 'shelrb', REAL(veg%shelrb, 4), & +!$ ranges%shelrb, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%xfang, 'xfang', REAL(veg%xfang, 4), & +!$ ranges%xfang, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%wai, 'wai', REAL(veg%wai, 4), & +!$ ranges%wai, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%vegcf, 'vegcf', REAL(veg%vegcf, 4), & +!$ ranges%vegcf, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%extkn, 'extkn', REAL(veg%extkn, 4), & +!$ ranges%extkn, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%tminvj, 'tminvj', REAL(veg%tminvj, 4), & +!$ ranges%tminvj, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%tmaxvj, 'tmaxvj', REAL(veg%tmaxvj, 4), & +!$ ranges%tmaxvj, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%vbeta, 'vbeta', REAL(veg%vbeta, 4), & +!$ ranges%vbeta, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%xalbnir, 'xalbnir', & +!$ REAL(veg%xalbnir, 4), ranges%xalbnir, patchout_var, & +!$ out_settings) +!$ CALL check_and_write(output_var, rpid%tmaxvj, 'tmaxvj', REAL(veg%tmaxvj, 4), & +!$ ranges%tmaxvj, patchout_var, out_settings) +!$ ok = NF90_PUT_VAR(output_var, rpid%ratecp, REAL(bgc%ratecp, 4)) +!$ IF (ok /= NF90_NOERR) CALL nc_abort(ok, & +!$ 'Error writing ratecp parameter to ' & +!$ //TRIM(frst_out)//'(SUBROUTINE create_restart)') +!$ ok = NF90_PUT_VAR(output_var, rpid%ratecs, REAL(bgc%ratecs, 4)) +!$ IF (ok /= NF90_NOERR) CALL nc_abort(ok, & +!$ 'Error writing ratecs parameter to ' & +!$ //TRIM(frst_out)//'(SUBROUTINE create_restart)') +!$ out_settings%dimswitch = "integer" +!$ CALL check_and_write(output_var, rpid%meth, 'meth', REAL(veg%meth, 4), & +!$ ranges%meth, patchout_var, out_settings) +!$ out_settings%dimswitch = "real" +!$ CALL check_and_write(output_var, rpid%za_uv, 'za_uv', REAL(rough%za_uv, 4), & +!$ ranges%za, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%za_tq, 'za_tq', REAL(rough%za_tq, 4), & +!$ ranges%za, patchout_var, out_settings) + out_settings%dimswitch = "r2" + CALL check_and_write(output_var, dgdtgID, 'dgdtg', REAL(canopy%dgdtg, 4), & + ranges%default_l, patchout_var, out_settings) + out_settings%dimswitch = "integer" + CALL check_and_write(output_var, isflagID, 'isflag', REAL(ssnow%isflag, 4), & + ranges%default_l, patchout_var, out_settings) + out_settings%dimswitch = "real" + CALL check_and_write(output_var, gwID, 'GWwb', REAL(ssnow%GWwb, 4), & + ranges%GWwb, patchout_var, out_settings) + CALL check_and_write(output_var, tssID, 'tss', REAL(ssnow%tss, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, ssdnnID, 'ssdnn', REAL(ssnow%ssdnn, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, osnowdID, 'osnowd', REAL(ssnow%osnowd, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, snageID, 'snage', REAL(ssnow%snage, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, snowdID, 'snowd', REAL(ssnow%snowd, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, rtsoilID, 'rtsoil', REAL(ssnow%rtsoil, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, canstoID, 'cansto', REAL(canopy%cansto, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, sghfluxID, 'sghflux', & + REAL(canopy%sghflux, 4), ranges%default_l, & + patchout_var, out_settings) + CALL check_and_write(output_var, ghfluxID, 'ghflux', REAL(canopy%ghflux, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, runoffID, 'runoff', REAL(ssnow%runoff, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, rnof1ID, 'rnof1', REAL(ssnow%rnof1, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, rnof2ID, 'rnof2', REAL(ssnow%rnof2, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, gaID, 'ga', REAL(canopy%ga, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, fevID, 'fev', REAL(canopy%fev, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, fesID, 'fes', REAL(canopy%fes, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, fhsID, 'fhs', REAL(canopy%fhs, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, wbtot0ID, 'wbtot0', REAL(bal%wbtot0, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, osnowd0ID, 'osnowd0', REAL(bal%osnowd0, 4), & + ranges%default_l, patchout_var, out_settings) + + !~ Radiation + out_settings%dimswitch = "radiation" + CALL check_and_write(output_var, albedoID, 'albedo', REAL(rad%albedo, 4), & + ranges%Albedo, patchout_var, out_settings) + out_settings%dimswitch = "real" + CALL check_and_write(output_var, tradID, 'trad', & + REAL(rad%trad, 4), ranges%RadT, patchout_var, out_settings) + +!$ IF (cable_user%SOIL_STRUC == 'sli' .OR. cable_user%FWSOIL_SWITCH == 'Haverd2013') THEN +!$ CALL check_and_write(output_var, rpid%gamma, 'gamma', & +!$ REAL(veg%gamma, 4), ranges%default_s, patchout_var, out_settings) +!$ END IF !$ - IF(cable_user%SOIL_STRUC=='sli') THEN - ! Write SLI parameters: -!$ CALL write_ovar (ncid_restart,rpid%nhorizons,'nhorizons', & -!$ REAL(soil%nhorizons,4),(/-99999.0,99999.0/),.TRUE.,'integer',.TRUE.) -!$ CALL write_ovar (ncid_restart,rpid%ishorizon,'ishorizon', & -!$ REAL(soil%ishorizon,4),(/-99999.0,99999.0/),.TRUE.,'soil',.TRUE.) -!$ CALL write_ovar (ncid_restart,rpid%clitt,'clitt', & -!$ REAL(veg%clitt,4),(/-99999.0,99999.0/),.TRUE.,'real',.TRUE.) -!$ CALL write_ovar (ncid_restart,rpid%ZR,'ZR', & -!$ REAL(veg%ZR,4),(/-99999.0,99999.0/),.TRUE.,'real',.TRUE.) -!$ CALL write_ovar (ncid_restart,rpid%F10,'F10', & -!$ REAL(veg%F10,4),(/-99999.0,99999.0/),.TRUE.,'real',.TRUE.) - ! Write SLI variables: - CALL write_ovar (ncid_restart,SID,'S',REAL(ssnow%S,4), & - (/0.0,1.5/),.TRUE.,'soil',.TRUE.) - CALL write_ovar (ncid_restart,TsoilID,'Tsoil',REAL(ssnow%Tsoil,4), & - (/-100.0,100.0/),.TRUE.,'soil',.TRUE.) - CALL write_ovar (ncid_restart,snowliqID,'snowliq',REAL(ssnow%snowliq,4), & - (/-99999.0,99999.0/),.TRUE.,'snow',.TRUE.) - CALL write_ovar (ncid_restart,scondsID,'sconds',REAL(ssnow%sconds,4), & - (/-99999.0,99999.0/),.TRUE.,'snow',.TRUE.) - CALL write_ovar (ncid_restart,h0ID,'h0',REAL(ssnow%h0,4), & - (/-99999.0,99999.0/),.TRUE.,'real',.TRUE.) - CALL write_ovar (ncid_restart,nsnowID,'nsnow',REAL(ssnow%nsnow,4), & - (/-99999.0,99999.0/),.TRUE.,'integer',.TRUE.) - CALL write_ovar (ncid_restart,TsurfaceID,'Tsurface',REAL(ssnow%Tsurface,4), & - (/-99999.0,99999.0/),.TRUE.,'real',.TRUE.) - + IF (cable_user%SOIL_STRUC == 'sli') THEN + ! Write SLI parameters: + out_settings%dimswitch = "integer" +!$ CALL check_and_write(output_var, rpid%nhorizons, 'nhorizons', & +!$ REAL(soil%nhorizons, 4), ranges%default_s, patchout_var, out_settings) + CALL check_and_write(output_var, nsnowID, 'nsnow', REAL(ssnow%nsnow, 4), & + ranges%default_s, patchout_var, out_settings) + out_settings%dimswitch = "soil" +!$ CALL check_and_write(output_var, rpid%ishorizon, 'ishorizon', & +!$ REAL(soil%ishorizon, 4), ranges%default_s, patchout_var, out_settings) + CALL check_and_write(output_var, SID, 'S', REAL(ssnow%S, 4), & + ranges%S, patchout_var, out_settings) + CALL check_and_write(output_var, TsoilID, 'Tsoil', REAL(ssnow%Tsoil, 4), & + ranges%Tsoil, patchout_var, out_settings) + out_settings%dimswitch = "real" +!$ CALL check_and_write(output_var, rpid%clitt, 'clitt', & +!$ REAL(veg%clitt, 4), ranges%default_s, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%ZR, 'ZR', & +!$ REAL(veg%ZR, 4), ranges%default_s, patchout_var, out_settings) +!$ CALL check_and_write(output_var, rpid%F10, 'F10', & +!$ REAL(veg%F10, 4), ranges%default_s, patchout_var, out_settings) + CALL check_and_write(output_var, TsurfaceID, 'Tsurface', REAL(ssnow%Tsurface, 4), & + ranges%default_s, patchout_var, out_settings) + CALL check_and_write(output_var, h0ID, 'h0', REAL(ssnow%h0, 4), & + ranges%default_s, patchout_var, out_settings) + out_settings%dimswitch = "snow" + CALL check_and_write(output_var, snowliqID, 'snowliq', REAL(ssnow%snowliq, 4), & + ranges%default_s, patchout_var, out_settings) + CALL check_and_write(output_var, scondsID, 'sconds', REAL(ssnow%sconds, 4), & + ranges%default_s, patchout_var, out_settings) END IF ! Close restart file ok = NF90_CLOSE(ncid_restart) - WRITE(logn, '(A36)') ' Restart file complete and closed.' + WRITE (logn, '(A36)') ' Restart file complete and closed.' END SUBROUTINE create_restart diff --git a/src/offline/cable_write.F90 b/src/offline/cable_write.F90 index ff5cc55ee..49badaa9a 100644 --- a/src/offline/cable_write.F90 +++ b/src/offline/cable_write.F90 @@ -45,11 +45,11 @@ MODULE cable_write_module - USE cable_abort_module + USE cable_abort_module, ONLY: nc_abort USE cable_def_types_mod USE cable_IO_vars_module, ONLY: landpt, patch, max_vegpatches, parID_type, & metGrid, land_x, land_y, logn, output, & - xdimsize, ydimsize, check, mask + xdimsize, ydimsize, mask USE netcdf IMPLICIT NONE PRIVATE @@ -823,14 +823,12 @@ SUBROUTINE define_output_parameter_r2(ncid, parID, pname, punits, longname, & END SUBROUTINE define_output_parameter_r2 !============================================================================= SUBROUTINE write_output_variable_r1(ktau, ncid, varID, vname, var_r1, & - vrange, writepatch, dimswitch, met) + writepatch, dimswitch, met) ! Subroutine for writing a real valued 1D variable INTEGER, INTENT(IN) :: ktau ! current time step # INTEGER, INTENT(IN) :: ncid ! netcdf file ID INTEGER, INTENT(IN) :: varID ! variable's netcdf ID REAL(KIND=4), DIMENSION(:), INTENT(IN) :: var_r1 ! variable values - REAL, DIMENSION(2), INTENT(IN) :: vrange ! max and min for variable - ! error checking LOGICAL, INTENT(IN) :: writepatch ! write patch-specific info for this var? CHARACTER(LEN=*), INTENT(IN) :: vname ! name of variable CHARACTER(LEN=*), INTENT(IN) :: dimswitch ! indicates dimesnion of parameter @@ -854,15 +852,6 @@ SUBROUTINE write_output_variable_r1(ktau, ncid, varID, vname, var_r1, & ! Then write data for inactive patches (if any) as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp4xypt(land_x(i), & land_y(i), (landpt(i)%nap + 1):max_vegpatches, 1) = ncmissingr - IF(check%ranges) THEN ! Check ranges: - DO j = 1, landpt(i)%nap ! only check active patches - IF((otmp4xypt(land_x(i), land_y(i), j, 1) < vrange(1)) .OR. & - (otmp4xypt(land_x(i), land_y(i), j, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!',& - ktau, met, otmp4xypt(land_x(i), land_y(i), j, 1), & - vrange, i, land_x(i),land_y(i)) - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, max_vegpatches @@ -882,13 +871,6 @@ SUBROUTINE write_output_variable_r1(ktau, ncid, varID, vname, var_r1, & otmp4xyzt(land_x(i), land_y(i), 1, 1) = & SUM(var_r1(landpt(i)%cstart: & landpt(i)%cend) * patch(landpt(i)%cstart:landpt(i)%cend)%frac) - IF(check%ranges) THEN ! Check ranges: - IF((otmp4xyzt(land_x(i), land_y(i), 1, 1) < vrange(1)) .OR. & - (otmp4xyzt(land_x(i), land_y(i), 1, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp4xyzt(land_x(i), land_y(i), 1, 1), vrange, i, & - land_x(i), land_y(i)) - END IF END DO ! Fill non-land points with dummy value: WHERE(mask /= 1) otmp4xyzt(:, :, 1, 1) = ncmissingr ! not land @@ -901,13 +883,6 @@ SUBROUTINE write_output_variable_r1(ktau, ncid, varID, vname, var_r1, & ! patches): otmp3xyt(land_x(i), land_y(i), 1) = SUM(var_r1(landpt(i)%cstart: & landpt(i)%cend) * patch(landpt(i)%cstart:landpt(i)%cend)%frac) - IF(check%ranges) THEN ! Check ranges: - IF((otmp3xyt(land_x(i), land_y(i), 1) < vrange(1)) .OR. & - (otmp3xyt(land_x(i), land_y(i), 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp3xyt(land_x(i), land_y(i), 1), vrange, i, & - land_x(i), land_y(i)) - END IF END DO ! Fill non-land points with dummy value: WHERE(mask /= 1) otmp3xyt(:, :, 1) = ncmissingr ! not land @@ -927,14 +902,6 @@ SUBROUTINE write_output_variable_r1(ktau, ncid, varID, vname, var_r1, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) & otmp3lpt(i, (landpt(i)%nap + 1):max_vegpatches, 1) = ncmissingr - IF(check%ranges) THEN ! Check ranges for active patches: - DO j = 1,landpt(i)%nap - IF((otmp3lpt(i, j, 1) < vrange(1)) .OR. & - (otmp3lpt(i, j, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp3lpt(i, j, 1), vrange, i) - END DO - END IF END DO ! write data to file ok = NF90_PUT_VAR(ncid, varID, REAL(otmp3lpt(:, :, 1), 4), & @@ -945,12 +912,6 @@ SUBROUTINE write_output_variable_r1(ktau, ncid, varID, vname, var_r1, & ! patches): otmp2lt(i, 1) = SUM(var_r1(landpt(i)%cstart: & landpt(i)%cend) * patch(landpt(i)%cstart:landpt(i)%cend)%frac) - IF(check%ranges) THEN ! Check ranges: - IF((otmp2lt(i, 1) < vrange(1)) .OR. & - (otmp2lt(i, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp2lt(i, 1), vrange, i) - END IF END DO ok = NF90_PUT_VAR(ncid, varID, REAL(otmp2lt, 4), & start = (/1, ktau/), count = (/mland, 1/)) ! write data to file @@ -966,14 +927,12 @@ SUBROUTINE write_output_variable_r1(ktau, ncid, varID, vname, var_r1, & END SUBROUTINE write_output_variable_r1 !============================================================================= SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & - vrange, writepatch, dimswitch, met) + writepatch, dimswitch, met) ! Subroutine for writing a real valued 2D variable INTEGER, INTENT(IN) :: ktau ! current time step # INTEGER, INTENT(IN) :: ncid ! netcdf file ID INTEGER, INTENT(IN) :: varID ! variable's netcdf ID REAL(KIND=4), DIMENSION(:, :), INTENT(IN) :: var_r2 ! variable values - REAL, DIMENSION(2), INTENT(IN) :: vrange ! max and min for variable - ! error checking LOGICAL, INTENT(IN) :: writepatch ! write patch-specific info for this var? CHARACTER(LEN=*), INTENT(IN) :: vname ! name of variable CHARACTER(LEN=*), INTENT(IN) :: dimswitch ! indicates dimesnion of parameter @@ -999,17 +958,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & ! Then write data for inactive patches (if any) as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp5xypst(land_x(i), & land_y(i), (landpt(i)%nap+1):max_vegpatches,:,1) = ncmissingr - IF(check%ranges) THEN ! Check ranges for active patches: - DO j = 1, landpt(i)%nap - DO k = 1, ms - IF((otmp5xypst(land_x(i), land_y(i), j, k, 1) < vrange(1)) & - .OR. (otmp5xypst(land_x(i), land_y(i), j, k, 1) > vrange(2)))& - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp5xypst(land_x(i), land_y(i), j, k, 1), & - vrange, i, land_x(i), land_y(i)) - END DO - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, max_vegpatches @@ -1029,17 +977,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp5xypsnt(land_x(i), & land_y(i), (landpt(i)%nap + 1):max_vegpatches, :, 1) = ncmissingr - IF(check%ranges) THEN ! Check ranges for active patches: - DO j = 1, landpt(i)%nap - DO k = 1, msn - IF((otmp5xypsnt(land_x(i), land_y(i), j, k, 1) < vrange(1)) & - .OR. (otmp5xypsnt(land_x(i),land_y(i),j,k,1)>vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp5xypsnt(land_x(i), land_y(i), j, k, 1), & - vrange, i, land_x(i), land_y(i)) - END DO - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, max_vegpatches @@ -1060,18 +997,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp5xyprt(land_x(i), & land_y(i), (landpt(i)%nap + 1):max_vegpatches, :, 1) = ncmissingr - IF(check%ranges) THEN ! Check ranges for active patches: - DO j = 1, landpt(i)%nap - DO k = 1, nrb - IF((otmp5xyprt(land_x(i), land_y(i), j, k, 1) < vrange(1)) & - .OR. (otmp5xyprt(land_x(i), land_y(i), j, k, 1) > & - vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp5xyprt(land_x(i), land_y(i), j, k, 1), & - vrange, i, land_x(i), land_y(i)) - END DO - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, max_vegpatches @@ -1093,18 +1018,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & ! Then write data for inactive patches (if any) as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp5xyppct(land_x(i), & land_y(i), (landpt(i)%nap + 1):max_vegpatches, :, 1) = ncmissingr - IF(check%ranges) THEN ! Check ranges for active patches: - DO j = 1, landpt(i)%nap - DO k = 1, ncp - IF((otmp5xyppct(land_x(i), land_y(i), j, k, 1) < vrange(1)) & - .OR. (otmp5xyppct(land_x(i), land_y(i), j, k, 1) > & - vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp5xyppct(land_x(i), land_y(i), j, k, 1), & - vrange, i, land_x(i), land_y(i)) - END DO - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, max_vegpatches @@ -1125,18 +1038,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp5xypsct(land_x(i), & land_y(i), (landpt(i)%nap + 1):max_vegpatches, :, 1) = ncmissingr - IF(check%ranges) THEN ! Check ranges for active patches: - DO j = 1, landpt(i)%nap - DO k = 1, ncs - IF((otmp5xypsct(land_x(i), land_y(i), j, k, 1) < vrange(1)) & - .OR. (otmp5xypsct(land_x(i), land_y(i), j, k, 1) > & - vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp5xypsct(land_x(i), land_y(i), j, k, 1), & - vrange, i, land_x(i), land_y(i)) - END DO - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, max_vegpatches @@ -1165,15 +1066,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & var_r2(landpt(i)%cstart:landpt(i)%cend, j) * & patch(landpt(i)%cstart:landpt(i)%cend)%frac) END DO - IF(check%ranges) THEN ! Check ranges: - DO j = 1, ms - IF((otmp4xyst(land_x(i), land_y(i), j, 1) < vrange(1)) .OR. & - (otmp4xyst(land_x(i), land_y(i), j, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp4xyst(land_x(i), land_y(i), j, 1), & - vrange, i, land_x(i), land_y(i)) - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, ms @@ -1191,15 +1083,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & var_r2(landpt(i)%cstart:landpt(i)%cend, j) * & patch(landpt(i)%cstart:landpt(i)%cend)%frac) END DO - IF(check%ranges) THEN ! Check ranges: - DO j = 1, msn - IF((otmp4xysnt(land_x(i), land_y(i), j, 1) < vrange(1)) .OR. & - (otmp4xysnt(land_x(i), land_y(i), j, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp4xysnt(land_x(i), land_y(i), j, 1), & - vrange, i, land_x(i), land_y(i)) - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, msn @@ -1217,15 +1100,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & var_r2(landpt(i)%cstart:landpt(i)%cend, j) * & patch(landpt(i)%cstart:landpt(i)%cend)%frac) END DO - IF(check%ranges) THEN ! Check ranges: - DO j = 1, nrb - IF((otmp4xyrt(land_x(i), land_y(i), j, 1) < vrange(1)) .OR. & - (otmp4xyrt(land_x(i), land_y(i), j, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp4xyrt(land_x(i), land_y(i), j, 1), & - vrange, i, land_x(i), land_y(i)) - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, nrb @@ -1243,15 +1117,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & var_r2(landpt(i)%cstart:landpt(i)%cend, j) * & patch(landpt(i)%cstart:landpt(i)%cend)%frac) END DO - IF(check%ranges) THEN ! Check ranges: - DO j = 1, ncp - IF((otmp4xypct(land_x(i), land_y(i), j, 1) < vrange(1)) .OR. & - (otmp4xypct(land_x(i), land_y(i), j, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp4xypct(land_x(i), land_y(i), j, 1), & - vrange, i, land_x(i), land_y(i)) - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, ncp @@ -1268,15 +1133,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & var_r2(landpt(i)%cstart:landpt(i)%cend, j) * & patch(landpt(i)%cstart:landpt(i)%cend)%frac) END DO - IF(check%ranges) THEN ! Check ranges: - DO j = 1, ncs - IF((otmp4xysct(land_x(i), land_y(i), j, 1) < vrange(1)) .OR. & - (otmp4xysct(land_x(i), land_y(i), j, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp4xysct(land_x(i), land_y(i), j, 1), & - vrange, i, land_x(i), land_y(i)) - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, ncs @@ -1306,16 +1162,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & ! Then write data for inactive patches (if any) as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp4lpst(i, & (landpt(i)%nap + 1):max_vegpatches, :, 1) = ncmissingr - IF(check%ranges) THEN ! Check ranges for active patches: - DO j = 1, landpt(i)%nap - DO k = 1, ms - IF((otmp4lpst(i, j, k, 1) < vrange(1)) .OR. & - (otmp4lpst(i, j, k, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp4lpst(i, j, k, 1), vrange, i) - END DO - END DO - END IF END DO ! Write data to file: ok = NF90_PUT_VAR(ncid, varID, REAL(otmp4lpst(:, :, :, 1), 4), & @@ -1329,16 +1175,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp4lpsnt(i, & (landpt(i)%nap + 1):max_vegpatches, :, 1) = ncmissingr - IF(check%ranges) THEN ! Check ranges for active patches: - DO j = 1, landpt(i)%nap - DO k = 1, msn - IF((otmp4lpsnt(i, j, k, 1) < vrange(1)) .OR. & - (otmp4lpsnt(i, j, k, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp4lpsnt(i, j, k, 1), vrange, i) - END DO - END DO - END IF END DO ! write data to file ok = NF90_PUT_VAR(ncid, varID, REAL(otmp4lpsnt(:, :, :, 1), 4), & @@ -1352,16 +1188,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp4lprt(i, & (landpt(i)%nap + 1):max_vegpatches, :, 1) = ncmissingr - IF(check%ranges) THEN ! Check ranges for active patches: - DO j = 1, landpt(i)%nap - DO k = 1, nrb - IF((otmp4lprt(i, j, k, 1) < vrange(1)) .OR. & - (otmp4lprt(i, j, k, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp4lprt(i, j, k, 1), vrange, i) - END DO - END DO - END IF END DO ! write data to file ok = NF90_PUT_VAR(ncid, varID, REAL(otmp4lprt(:, :, :, 1), 4), & @@ -1376,16 +1202,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp4lppct(i, & (landpt(i)%nap + 1):max_vegpatches, :, 1) = ncmissingr - IF(check%ranges) THEN ! Check ranges for active patches: - DO j = 1, landpt(i)%nap - DO k = 1, ncp - IF((otmp4lppct(i, j, k, 1) < vrange(1)) .OR. & - (otmp4lppct(i, j, k, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp4lppct(i, j, k, 1), vrange, i) - END DO - END DO - END IF END DO ! write data to file ok = NF90_PUT_VAR(ncid, varID, REAL(otmp4lppct(:, :, :, 1), 4), & @@ -1399,16 +1215,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp4lpsct(i, & (landpt(i)%nap + 1):max_vegpatches, :, 1) = ncmissingr - IF(check%ranges) THEN ! Check ranges for active patches: - DO j = 1, landpt(i)%nap - DO k = 1, ncs - IF((otmp4lpsct(i, j, k, 1) < vrange(1)) .OR. & - (otmp4lpsct(i, j, k, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp4lpsct(i, j, k, 1), vrange, i) - END DO - END DO - END IF END DO ! write data to file ok = NF90_PUT_VAR(ncid, varID, REAL(otmp4lpsct(:, :, :, 1), 4), & @@ -1430,14 +1236,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & var_r2(landpt(i)%cstart:landpt(i)%cend, j) * & patch(landpt(i)%cstart:landpt(i)%cend)%frac) END DO - IF(check%ranges) THEN ! Check ranges: - DO j = 1, ms - IF((otmp3lst(i, j, 1) < vrange(1)) .OR. & - (otmp3lst(i, j, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp3lst(i, j, 1), vrange, i) - END DO - END IF END DO ok = NF90_PUT_VAR(ncid, varID, REAL(otmp3lst, 4), & start = (/1, 1, ktau/), & @@ -1451,14 +1249,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & var_r2(landpt(i)%cstart:landpt(i)%cend, j) * & patch(landpt(i)%cstart:landpt(i)%cend)%frac) END DO - IF(check%ranges) THEN ! Check ranges: - DO j = 1, msn - IF((otmp3lsnt(i, j, 1) < vrange(1)) .OR. & - (otmp3lsnt(i, j, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp3lsnt(i, j, 1), vrange, i) - END DO - END IF END DO ok = NF90_PUT_VAR(ncid, varID, REAL(otmp3lsnt, 4), & start = (/1, 1, ktau/), & @@ -1471,14 +1261,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & var_r2(landpt(i)%cstart:landpt(i)%cend, j) * & patch(landpt(i)%cstart:landpt(i)%cend)%frac) END DO - IF(check%ranges) THEN ! Check ranges: - DO j = 1, nrb - IF((otmp3lrt(i, j, 1) < vrange(1)) .OR. & - (otmp3lrt(i, j, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp3lrt(i, j, 1), vrange, i) - END DO - END IF END DO ok = NF90_PUT_VAR(ncid, varID, REAL(otmp3lrt, 4), & start = (/1, 1, ktau/), & @@ -1492,14 +1274,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & var_r2(landpt(i)%cstart:landpt(i)%cend, j) * & patch(landpt(i)%cstart:landpt(i)%cend)%frac) END DO - IF(check%ranges) THEN ! Check ranges: - DO j = 1, ncp - IF((otmp3lpct(i, j, 1) < vrange(1)) .OR. & - (otmp3lpct(i, j, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp3lpct(i, j, 1), vrange, i) - END DO - END IF END DO ok = NF90_PUT_VAR(ncid, varID, REAL(otmp3lpct, 4), & start = (/1, 1, ktau/), & @@ -1512,14 +1286,6 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & var_r2(landpt(i)%cstart:landpt(i)%cend, j) * & patch(landpt(i)%cstart:landpt(i)%cend)%frac) END DO - IF(check%ranges) THEN ! Check ranges: - DO j = 1, ncs - IF((otmp3lsct(i, j, 1) < vrange(1)) .OR. & - (otmp3lsct(i, j, 1) > vrange(2))) & - CALL range_abort(vname//' is out of specified ranges!', & - ktau, met, otmp3lsct(i, j, 1), vrange, i) - END DO - END IF END DO ok = NF90_PUT_VAR(ncid, varID, REAL(otmp3lsct, 4), & start = (/1, 1, ktau/), & @@ -1542,15 +1308,13 @@ SUBROUTINE write_output_variable_r2(ktau, ncid, varID, vname, var_r2, & END SUBROUTINE write_output_variable_r2 !============================================================================= SUBROUTINE write_output_parameter_r1(ncid, parID, pname, par_r1, & - prange, writepatch, dimswitch, restart) + writepatch, dimswitch, restart) ! Subroutine for writing a real valued 1D parameter (time invariant) INTEGER, INTENT(IN) :: ncid ! netcdf file ID INTEGER, INTENT(IN) :: parID ! variable's netcdf ID REAL(KIND=4), DIMENSION(:), INTENT(IN) :: par_r1 ! variable values - REAL, DIMENSION(2), INTENT(IN) :: prange ! max and min for variable - ! error checking LOGICAL, INTENT(IN) :: writepatch ! write patch-specific info for this var? - LOGICAL, INTENT(IN), OPTIONAL :: restart ! are we writing to a restart file? + LOGICAL, INTENT(IN) :: restart ! are we writing to a restart file? CHARACTER(LEN=*), INTENT(IN) :: pname ! name of variable CHARACTER(LEN=*), INTENT(IN) :: dimswitch ! indicates dimesnion of parameter @@ -1560,7 +1324,7 @@ SUBROUTINE write_output_parameter_r1(ncid, parID, pname, par_r1, & ! in the namelist file, use this grid. Else use format of met file. IF((output%grid(1:3) == 'mas' .OR. & (output%grid(1:3) == 'def' .AND. metGrid == 'mask') .OR. & - output%grid(1:3) == 'ALM') .AND. .NOT. PRESENT(restart)) THEN + output%grid(1:3) == 'ALM') .AND. .NOT. restart) THEN ! Should patch-specific info be written for this parameter ! (no patches in ALMA format)? IF((writepatch .OR. output%patch) .AND. (.NOT. output%grid(1:3) & @@ -1577,18 +1341,6 @@ SUBROUTINE write_output_parameter_r1(ncid, parID, pname, par_r1, & IF(landpt(i)%nap < max_vegpatches) otmp3xyp(land_x(i), & land_y(i), (landpt(i)%nap + 1):max_vegpatches) = ncmissingi END IF - IF(check%ranges) THEN ! Check ranges over active patches: - DO j = 1, landpt(i)%nap - IF((otmp3xyp(land_x(i), land_y(i), j) < prange(1)) .OR. & - (otmp3xyp(land_x(i), land_y(i), j) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ',i, 'patch #', j - WRITE(*, *) 'Value: ', otmp3xyp(land_x(i), land_y(i), j) - CALL abort('Aborting.') - END IF - END DO - END IF END DO ! Write data to file: IF(dimswitch(1:1) == 'r') THEN @@ -1613,16 +1365,6 @@ SUBROUTINE write_output_parameter_r1(ncid, parID, pname, par_r1, & ! Write to temporary variable. Use dominant patch info only, ! as averaging parameters over patches wouldn't make nec sense: otmp2xy(land_x(i), land_y(i)) = par_r1(landpt(i)%cstart) - IF(check%ranges) THEN ! Check ranges: - IF((otmp2xy(land_x(i), land_y(i)) < prange(1)) .OR. & - (otmp2xy(land_x(i), land_y(i)) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ',i - WRITE(*, *) 'Value: ', otmp2xy(land_x(i),land_y(i)) - CALL abort('Aborting.') - END IF - END IF END DO ! Write data to file: IF(dimswitch(1:1) == 'r') THEN @@ -1640,12 +1382,12 @@ SUBROUTINE write_output_parameter_r1(ncid, parID, pname, par_r1, & END IF ELSE IF(output%grid(1:3) == 'lan' & .OR. (output%grid(1:3) == 'def' .AND. metGrid == 'land') & - .OR. PRESENT(restart)) THEN + .OR. restart) THEN ! Is patch-specific info written for this variable? ! If this variable has been requested by user with patch-specific info ! (writepatch) OR all have been (output%patch) AND we're NOT writing ! a restart file (which uses a different technique to store patch info): - IF((writepatch .OR. output%patch) .AND. .NOT. PRESENT(restart)) THEN + IF((writepatch .OR. output%patch) .AND. .NOT. restart) THEN DO i = 1, mland ! over all land grid points ! First write data for active patches: otmp2lp(i, 1:landpt(i)%nap) = par_r1(landpt(i)%cstart: & @@ -1658,18 +1400,6 @@ SUBROUTINE write_output_parameter_r1(ncid, parID, pname, par_r1, & otmp2lp(i, (landpt(i)%nap + 1):max_vegpatches) = ncmissingi END IF END IF - IF(check%ranges) THEN ! Check ranges over active patches: - DO j = 1, landpt(i)%nap - IF((otmp2lp(i, j) < prange(1)) .OR. & - (otmp2lp(i, j) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ',i, 'patch #', j - WRITE(*, *) 'Value: ', otmp2lp(i, j) - CALL abort('Aborting.') - END IF - END DO - END IF END DO ! Write data to file IF(dimswitch(1:1) == 'r') THEN @@ -1682,7 +1412,7 @@ SUBROUTINE write_output_parameter_r1(ncid, parID, pname, par_r1, & ELSE ! only grid point values without patch-specific info UNLESS restart ! file ! All 1D single precision restart file variables are written here. - IF(PRESENT(restart)) THEN ! If writing restart data: + IF(restart) THEN ! If writing restart data: ! Write output: IF(dimswitch(1:1) == 'r') THEN ok = NF90_PUT_VAR(ncid, parID, REAL(par_r1, 4), & @@ -1695,16 +1425,6 @@ SUBROUTINE write_output_parameter_r1(ncid, parID, pname, par_r1, & DO i = 1, mland ! over all land grid points ! Write to temporary variable (use dominant patch info only!): otmp1l(i) = par_r1(landpt(i)%cstart) - IF(check%ranges) THEN ! Check ranges: - IF((otmp1l(i) < prange(1)) .OR. & - (otmp1l(i) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ',i - WRITE(*, *) 'Value: ', otmp1l(i) - CALL abort('Aborting.') - END IF - END IF END DO ! Write output: IF(dimswitch(1:1) == 'r') THEN @@ -1728,22 +1448,20 @@ SUBROUTINE write_output_parameter_r1(ncid, parID, pname, par_r1, & END SUBROUTINE write_output_parameter_r1 !============================================================================= SUBROUTINE write_output_parameter_r1d(ncid, parID, pname, par_r1d, & - prange, writepatch, dimswitch, restart) + writepatch, dimswitch, restart) ! Subroutine for writing a double precision 1D parameter (time invariant) INTEGER, INTENT(IN) :: ncid ! netcdf file ID INTEGER, INTENT(IN) :: parID ! variable's netcdf ID REAL(r_2), DIMENSION(:), INTENT(IN) :: par_r1d ! variable values - REAL, DIMENSION(2), INTENT(IN) :: prange ! max and min for variable - ! error checking LOGICAL, INTENT(IN) :: writepatch ! write patch-specific info for this var? - LOGICAL,INTENT(IN),OPTIONAL :: restart ! are we writing to a restart file? + LOGICAL,INTENT(IN) :: restart ! are we writing to a restart file? CHARACTER(LEN=*), INTENT(IN) :: pname ! name of variable CHARACTER(LEN=*), INTENT(IN) :: dimswitch ! indicates dimesnion of parameter INTEGER :: i, j ! do loop counter REAL(r_2), POINTER, DIMENSION(:, :) :: tmpout - IF(PRESENT(restart)) THEN ! If writing to a a restart file + IF(restart) THEN ! If writing to a a restart file ! Write parameter data: ok = NF90_PUT_VAR(ncid, parID, par_r1d, & start = (/1, 1/), count = (/mp/)) ! write data to file @@ -1759,18 +1477,6 @@ SUBROUTINE write_output_parameter_r1d(ncid, parID, pname, par_r1d, & IF(landpt(i)%nap < max_vegpatches) & tmpout(i, (landpt(i)%nap + 1):max_vegpatches) = & REAL(ncmissingr, r_2) - IF(check%ranges) THEN ! Check ranges over active patches: - DO j = 1, landpt(i)%nap - IF((tmpout(i, j) < prange(1)) .OR. & - (tmpout(i, j) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ',i, 'patch #', j - WRITE(*, *) 'Value: ', tmpout(i, j) - CALL abort('Aborting.') - END IF - END DO - END IF END DO ok = NF90_PUT_VAR(ncid, parID, REAL(tmpout(:, :), 8), start = (/1, 1/), & count = (/mland, max_vegpatches/)) ! write data to file @@ -1782,14 +1488,12 @@ SUBROUTINE write_output_parameter_r1d(ncid, parID, pname, par_r1d, & END SUBROUTINE write_output_parameter_r1d !============================================================================= - SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & + SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, & writepatch, dimswitch, restart) ! Subroutine for writing a real valued 2D parameter (time invariant) INTEGER, INTENT(IN) :: ncid ! netcdf file ID INTEGER, INTENT(IN) :: parID ! variable's netcdf ID REAL(KIND=4), DIMENSION(:, :), INTENT(IN) :: par_r2 ! variable values - REAL, DIMENSION(2), INTENT(IN) :: prange ! max and min for variable - ! error checking LOGICAL, INTENT(IN) :: writepatch ! write patch-specific info for this var? LOGICAL,INTENT(IN),OPTIONAL :: restart ! are we writing to a restart file? CHARACTER(LEN=*), INTENT(IN) :: pname ! name of variable @@ -1801,7 +1505,7 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & ! in the namelist file, use this grid. Else use format of met file. IF((output%grid(1:3) == 'mas' .OR. & (output%grid(1:3) == 'def' .AND. metGrid == 'mask') .OR. & - output%grid(1:3) == 'ALM') .AND. .NOT. PRESENT(restart)) THEN + output%grid(1:3) == 'ALM') .AND. .NOT. restart) THEN ! Should patch-specific info be written for this parameter ! (no patches in ALMA format)? IF((writepatch .OR. output%patch) .AND. (.NOT. output%grid(1:3) & @@ -1816,18 +1520,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp4xyps(land_x(i), & land_y(i), (landpt(i)%nap + 1):max_vegpatches, :) = ncmissingr - IF(check%ranges) THEN ! Check ranges: - DO j = 1, landpt(i)%nap - IF(ANY(otmp4xyps(land_x(i), land_y(i), j, :) < prange(1)) .OR. & - ANY(otmp4xyps(land_x(i), land_y(i), j, :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i, 'patch #', j - WRITE(*, *) 'Values: ', otmp4xyps(land_x(i), land_y(i), j, :) - CALL abort('Aborting.') - END IF - END DO - END IF END DO ! Fill non-land points with dummy value: DO j =1, max_vegpatches @@ -1848,19 +1540,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp4xyppc(land_x(i), & land_y(i), (landpt(i)%nap + 1):max_vegpatches, :) = ncmissingr - IF(check%ranges) THEN ! Check ranges: - DO j = 1, landpt(i)%nap - IF(ANY(otmp4xyppc(land_x(i), land_y(i), j, :) < prange(1)) & - .OR. ANY(otmp4xyppc(land_x(i), land_y(i), j, :) > & - prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i, 'patch #', j - WRITE(*, *) 'Values: ', otmp4xyppc(land_x(i), land_y(i), j, :) - CALL abort('Aborting.') - END IF - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, max_vegpatches @@ -1881,19 +1560,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp4xypsc(land_x(i), & land_y(i), (landpt(i)%nap + 1):max_vegpatches, :) = ncmissingr - IF(check%ranges) THEN ! Check ranges: - DO j = 1, landpt(i)%nap - IF(ANY(otmp4xypsc(land_x(i), land_y(i), j, :) < prange(1)) & - .OR. ANY(otmp4xypsc(land_x(i), land_y(i), j, :) > & - prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i, 'patch #', j - WRITE(*, *) 'Values: ', otmp4xypsc(land_x(i), land_y(i), j, :) - CALL abort('Aborting.') - END IF - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, max_vegpatches @@ -1914,19 +1580,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) otmp4xypr(land_x(i), & land_y(i), (landpt(i)%nap + 1):max_vegpatches, :) = ncmissingr - IF(check%ranges) THEN ! Check ranges: - DO j = 1, landpt(i)%nap - IF(ANY(otmp4xypr(land_x(i), land_y(i), j, :) < prange(1)) & - .OR. ANY(otmp4xypr(land_x(i), land_y(i), j, :) > & - prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i, 'patch #', j - WRITE(*, *) 'Values: ', otmp4xypr(land_x(i), land_y(i), j, :) - CALL abort('Aborting.') - END IF - END DO - END IF END DO ! Fill non-land points with dummy value: DO j = 1, max_vegpatches @@ -1949,16 +1602,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & DO i = 1, mland ! over all land grid points ! Write to temporary variable (use dominant patch info only!): otmp3xys(land_x(i), land_y(i), :) = par_r2(landpt(i)%cstart, :) - IF(check%ranges) THEN ! Check ranges: - IF(ANY(otmp3xys(land_x(i), land_y(i), :) < prange(1)) .OR. & - ANY(otmp3xys(land_x(i), land_y(i), :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i - WRITE(*, *) 'Values: ', otmp3xys(land_x(i), land_y(i), :) - CALL abort('Aborting.') - END IF - END IF END DO ! Fill non-land points with dummy value: DO j = 1, ms @@ -1971,16 +1614,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & DO i = 1, mland ! over all land grid points ! Write to temporary variable (use dominant patch info only!): otmp3xypc(land_x(i), land_y(i), :) = par_r2(landpt(i)%cstart, :) - IF(check%ranges) THEN ! Check ranges: - IF(ANY(otmp3xypc(land_x(i), land_y(i), :) < prange(1)) .OR. & - ANY(otmp3xypc(land_x(i), land_y(i), :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i - WRITE(*, *) 'Values: ', otmp3xypc(land_x(i), land_y(i), :) - CALL abort('Aborting.') - END IF - END IF END DO ! Fill non-land points with dummy value: DO j = 1, ncp @@ -1993,16 +1626,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & DO i = 1, mland ! over all land grid points ! Write to temporary variable (use dominant patch info only!): otmp3xysc(land_x(i), land_y(i), :) = par_r2(landpt(i)%cstart, :) - IF(check%ranges) THEN ! Check ranges: - IF(ANY(otmp3xysc(land_x(i), land_y(i), :) < prange(1)) .OR. & - ANY(otmp3xysc(land_x(i), land_y(i), :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i - WRITE(*, *) 'Values: ', otmp3xysc(land_x(i), land_y(i), :) - CALL abort('Aborting.') - END IF - END IF END DO ! Fill non-land points with dummy value: DO j = 1, ncs @@ -2015,16 +1638,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & DO i = 1, mland ! over all land grid points ! Write to temporary variable (use dominant patch info only!): otmp3xyr(land_x(i), land_y(i), :) = par_r2(landpt(i)%cstart, :) - IF(check%ranges) THEN ! Check ranges: - IF(ANY(otmp3xyr(land_x(i), land_y(i), :) < prange(1)) .OR. & - ANY(otmp3xyr(land_x(i), land_y(i), :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i - WRITE(*, *) 'Values: ', otmp3xyr(land_x(i), land_y(i), :) - CALL abort('Aborting.') - END IF - END IF END DO ! Fill non-land points with dummy value: DO j = 1, nrb @@ -2037,16 +1650,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & DO i = 1, mland ! over all land grid points ! Write to temporary variable (surf fraction only has mp dimension): otmp3xysf(land_x(i), land_y(i), :) = par_r2(i, :) - IF(check%ranges) THEN ! Check ranges: - IF(ANY(otmp3xysf(land_x(i), land_y(i), :) < prange(1)) .OR. & - ANY(otmp3xysf(land_x(i), land_y(i), :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i - WRITE(*, *) 'Values: ', otmp3xysf(land_x(i), land_y(i), :) - CALL abort('Aborting.') - END IF - END IF END DO ! Fill non-land points with dummy value: DO j = 1, 4 @@ -2063,10 +1666,10 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & END IF ELSE IF(output%grid(1:3) == 'lan' & .OR.(output%grid(1:3) == 'def' .AND. metGrid == 'land') & - .OR. PRESENT(restart)) THEN + .OR. restart) THEN ! Does this variable have a patch dimension (restart does not)? IF((writepatch .OR. output%patch) .AND. (dimswitch /= 'surftype') & - .AND. .NOT. PRESENT(restart)) THEN + .AND. .NOT. restart) THEN ! Check the nature of the parameter's second dimension: IF(dimswitch == 'soil') THEN ! i.e. spatial and soil DO i = 1, mland ! over all land grid points @@ -2076,18 +1679,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) & otmp3lps(i, (landpt(i)%nap + 1):max_vegpatches, :) = ncmissingr - IF(check%ranges) THEN ! Check ranges over active patches: - DO j = 1, landpt(i)%nap - IF(ANY(otmp3lps(i, j, :) < prange(1)) .OR. & - ANY(otmp3lps(i, j, :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i, 'patch #', j - WRITE(*, *) 'Values: ', otmp3lps(i, j, :) - CALL abort('Aborting.') - END IF - END DO - END IF END DO ! write data to file ok = NF90_PUT_VAR(ncid, parID, REAL(otmp3lps(:, :, :), 4), & @@ -2100,18 +1691,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) & otmp3lppc(i, (landpt(i)%nap + 1):max_vegpatches, :) = ncmissingr - IF(check%ranges) THEN ! Check ranges over active patches: - DO j = 1, landpt(i)%nap - IF(ANY(otmp3lppc(i, j, :) < prange(1)) .OR. & - ANY(otmp3lppc(i, j, :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i, 'patch #', j - WRITE(*, *) 'Values: ', otmp3lppc(i, j, :) - CALL abort('Aborting.') - END IF - END DO - END IF END DO ! write data to file ok = NF90_PUT_VAR(ncid, parID, REAL(otmp3lppc(:, :, :), 4), & @@ -2124,18 +1703,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) & otmp3lpsc(i, (landpt(i)%nap + 1):max_vegpatches, :) = ncmissingr - IF(check%ranges) THEN ! Check ranges over active patches: - DO j = 1, landpt(i)%nap - IF(ANY(otmp3lpsc(i, j, :) < prange(1)) .OR. & - ANY(otmp3lpsc(i, j, :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i, 'patch #', j - WRITE(*, *) 'Values: ', otmp3lpsc(i, j, :) - CALL abort('Aborting.') - END IF - END DO - END IF END DO ! write data to file ok = NF90_PUT_VAR(ncid, parID, REAL(otmp3lpsc(:, :, :), 4), & @@ -2149,18 +1716,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) & otmp3lpr(i, (landpt(i)%nap + 1):max_vegpatches, :) = ncmissingr - IF(check%ranges) THEN ! Check ranges over active patches: - DO j = 1,landpt(i)%nap - IF(ANY(otmp3lpr(i, j, :) < prange(1)) .OR. & - ANY(otmp3lpr(i, j, :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i, 'patch #', j - WRITE(*, *) 'Values: ', otmp3lpr(i, j, :) - CALL abort('Aborting.') - END IF - END DO - END IF END DO ! write data to file ok = NF90_PUT_VAR(ncid, parID, REAL(otmp3lpr(:, :, :), 4), & @@ -2173,18 +1728,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & ! Then write data for inactive patches as dummy value: IF(landpt(i)%nap < max_vegpatches) & otmp3lpsn(i, (landpt(i)%nap + 1):max_vegpatches, :) = ncmissingr - IF(check%ranges) THEN ! Check ranges over active patches: - DO j = 1, landpt(i)%nap - IF(ANY(otmp3lpsn(i, j, :) < prange(1)) .OR. & - ANY(otmp3lpsn(i, j, :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i, 'patch #', j - WRITE(*, *) 'Values: ', otmp3lpsn(i, j, :) - CALL abort('Aborting.') - END IF - END DO - END IF END DO ! write data to file ok = NF90_PUT_VAR(ncid, parID, REAL(otmp3lpsn(:, :, :), 4), & @@ -2197,7 +1740,7 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & ELSE ! Varaible has no patch dimension ! Check the nature of the parameter's second dimension: IF(dimswitch=='soil') THEN ! i.e. spatial and soil - IF(PRESENT(restart)) THEN + IF(restart) THEN ! Write data to restart file ok=NF90_PUT_VAR(ncid,parID,REAL(par_r2,4), & start=(/1,1/),count=(/mp,ms/)) @@ -2205,22 +1748,12 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & DO i = 1, mland ! over all land grid points ! Write to temporary variable (use dominant patch info only!): otmp2ls(i,:) = par_r2(landpt(i)%cstart,:) - IF(check%ranges) THEN ! Check ranges: - IF(ANY(otmp2ls(i,:)prange(2))) THEN - WRITE(*,*) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*,*) 'Land point # ',i - WRITE(*,*) 'Values: ', otmp2ls(i,:) - CALL abort('Aborting.') - END IF - END IF END DO ok=NF90_PUT_VAR(ncid,parID,REAL(otmp2ls,4), & start=(/1,1/),count=(/mland,ms/)) ! write data to file END IF ELSE IF(dimswitch == 'plantcarbon') THEN ! i.e. spatial and plant carbon - IF(PRESENT(restart)) THEN + IF(restart) THEN ! Write data to restart file ok = NF90_PUT_VAR(ncid, parID, REAL(par_r2, 4), & start = (/1, 1/), count = (/mp, ncp/)) @@ -2228,22 +1761,12 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & DO i = 1, mland ! over all land grid points ! Write to temporary variable (use dominant patch info only!): otmp2lpc(i, :) = par_r2(landpt(i)%cstart, :) - IF(check%ranges) THEN ! Check ranges: - IF(ANY(otmp2lpc(i, :) < prange(1)) .OR. & - ANY(otmp2lpc(i, :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i - WRITE(*, *) 'Values: ', otmp2lpc(i, :) - CALL abort('Aborting.') - END IF - END IF END DO ok = NF90_PUT_VAR(ncid, parID, REAL(otmp2lpc, 4), & start = (/1, 1/), count = (/mland, ncp/)) ! write data to file END IF ELSE IF(dimswitch == 'soilcarbon') THEN ! i.e. spatial and soil carbon - IF(PRESENT(restart)) THEN + IF(restart) THEN ! Write data to restart file ok = NF90_PUT_VAR(ncid, parID, REAL(par_r2, 4), & start = (/1, 1/), count = (/mp, ncs/)) @@ -2251,23 +1774,13 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & DO i = 1, mland ! over all land grid points ! Write to temporary variable (use dominant patch info only!): otmp2lsc(i, :) = par_r2(landpt(i)%cstart, :) - IF(check%ranges) THEN ! Check ranges: - IF(ANY(otmp2lsc(i, :) < prange(1)) .OR. & - ANY(otmp2lsc(i, :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i - WRITE(*, *) 'Values: ', otmp2lsc(i, :) - CALL abort('Aborting.') - END IF - END IF END DO ok = NF90_PUT_VAR(ncid, parID, REAL(otmp2lsc, 4), & start = (/1, 1/), count=(/mland, ncs/)) ! write data to file END IF ELSE IF(dimswitch == 'radiation') THEN ! i.e. spatial and radiation ! bands - IF(PRESENT(restart)) THEN + IF(restart) THEN ! Write data to restart file ok = NF90_PUT_VAR(ncid, parID, REAL(par_r2, 4), & start = (/1, 1/), count = (/mp, nrb/)) @@ -2275,22 +1788,12 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & DO i = 1, mland ! over all land grid points ! Write to temporary variable (use dominant patch info only!): otmp2lr(i, :) = par_r2(landpt(i)%cstart, :) - IF(check%ranges) THEN ! Check ranges: - IF(ANY(otmp2lr(i, :) < prange(1)) .OR. & - ANY(otmp2lr(i, :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i - WRITE(*, *) 'Values: ', otmp2lr(i, :) - CALL abort('Aborting.') - END IF - END IF END DO ok = NF90_PUT_VAR(ncid, parID, REAL(otmp2lr, 4), & start = (/1, 1/), count = (/mland, nrb/)) ! write data to file END IF ELSE IF(dimswitch == 'snow') THEN ! i.e. spatial and radiation bands - IF(PRESENT(restart)) THEN + IF(restart) THEN ! Write data to restart file ok = NF90_PUT_VAR(ncid, parID, REAL(par_r2, 4), & start = (/1, 1/), count = (/mp, msn/)) @@ -2298,16 +1801,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & DO i = 1, mland ! over all land grid points ! Write to temporary variable (use dominant patch info only!): otmp2lsn(i, :) = par_r2(landpt(i)%cstart, :) - IF(check%ranges) THEN ! Check ranges: - IF(ANY(otmp2lsn(i, :) < prange(1)) .OR. & - ANY(otmp2lsn(i, :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i - WRITE(*, *) 'Values: ', otmp2lsn(i, :) - CALL abort('Aborting.') - END IF - END IF END DO ok = NF90_PUT_VAR(ncid, parID, REAL(otmp2lsn, 4), & start = (/1, 1/), count = (/mland, msn/)) ! write data to file @@ -2316,16 +1809,6 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & DO i = 1, mland ! over all land grid points ! Write to temporary variable (use dominant patch info only!): otmp2lsf(i, :) = par_r2(i, :) - IF(check%ranges) THEN ! Check ranges: - IF(ANY(otmp2lsf(i, :) < prange(1)) .OR. & - ANY(otmp2lsf(i, :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ', i - WRITE(*, *) 'Values: ', otmp2lsf(i, :) - CALL abort('Aborting.') - END IF - END IF END DO ok = NF90_PUT_VAR(ncid, parID, REAL(otmp2lsf, 4), & start = (/1, 1/), count = (/mland, 4/)) ! write data to file @@ -2345,15 +1828,13 @@ SUBROUTINE write_output_parameter_r2(ncid, parID, pname, par_r2, prange, & END SUBROUTINE write_output_parameter_r2 !============================================================================== - SUBROUTINE write_output_parameter_r2d(ncid, parID, pname, par_r2d, prange, & + SUBROUTINE write_output_parameter_r2d(ncid, parID, pname, par_r2d, & writepatch, dimswitch, restart) ! Subroutine for writing a double precision 2D parameter (time invariant) ! ONLY USED FOR RESTART FILE. INTEGER, INTENT(IN) :: ncid ! netcdf file ID INTEGER, INTENT(IN) :: parID ! variable's netcdf ID REAL(r_2), DIMENSION(:, :), INTENT(IN) :: par_r2d ! variable values - REAL, DIMENSION(2), INTENT(IN) :: prange ! max and min for variable - ! error checking LOGICAL, INTENT(IN) :: writepatch ! write patch-specific info for this var? LOGICAL,INTENT(IN),OPTIONAL :: restart ! are we writing to a restart file? CHARACTER(LEN=*), INTENT(IN) :: pname ! name of variable @@ -2364,7 +1845,7 @@ SUBROUTINE write_output_parameter_r2d(ncid, parID, pname, par_r2d, prange, & ! Check the nature of the parameter's second dimension: IF(dimswitch == 'soil') THEN ! i.e. spatial and soil - IF(PRESENT(restart)) THEN + IF(restart) THEN ! Write data to restart file ok = NF90_PUT_VAR(ncid, parID, par_r2d, & start = (/1, 1/), count = (/mp, ms/)) @@ -2378,18 +1859,6 @@ SUBROUTINE write_output_parameter_r2d(ncid, parID, pname, par_r2d, prange, & IF(landpt(i)%nap < max_vegpatches) & tmpout(i, (landpt(i)%nap + 1):max_vegpatches, :) = & REAL(ncmissingr, r_2) - IF(check%ranges) THEN ! Check ranges over active patches: - DO j = 1, landpt(i)%nap - IF(ANY(tmpout(i, j, :) < prange(1)) .OR. & - ANY(tmpout(i, j, :) > prange(2))) THEN - WRITE(*, *) 'Parameter '//pname// & - ' is set at a value out of specified ranges!' - WRITE(*, *) 'Land point # ',i, 'patch #', j - WRITE(*, *) 'Values: ', tmpout(i, j, :) - CALL abort('Aborting.') - END IF - END DO - END IF END DO ok = NF90_PUT_VAR(ncid, parID, REAL(tmpout(:, :, :), 8), & start = (/1, 1, 1/), & diff --git a/src/offline/landuse_inout.F90 b/src/offline/landuse_inout.F90 index 2f9a29740..3e0fa8202 100644 --- a/src/offline/landuse_inout.F90 +++ b/src/offline/landuse_inout.F90 @@ -1125,7 +1125,7 @@ SUBROUTINE WRITE_LANDUSE_CASA_RESTART_NC(mpx, lucmp, CASAONLY ) END SUBROUTINE WRITE_LANDUSE_CASA_RESTART_NC - SUBROUTINE create_landuse_cable_restart(logn,dels,ktau,soil,mpx,lucmp,cstart,cend,nap) + SUBROUTINE create_landuse_cable_restart(logn,dels,ktau,soil,mpx,lucmp,cstart,cend,nap, met) ! Creates a restart file for CABLE using a land only grid cell area occupied by a '// & ! Creates a restart file for CABLE using a land only grid with mland ! land points and max_vegpatches veg/soil patches (some of which may @@ -1134,10 +1134,11 @@ SUBROUTINE create_landuse_cable_restart(logn,dels,ktau,soil,mpx,lucmp,cstart,cen ! if any additional variables are added to CABLE restart file, they should be repeated here ! use netcdf - USE cable_def_types_mod, ONLY : r_2, mland, mvtype, mstype,nrb,ncs,ncp,ms,msn,soil_parameter_type + USE cable_def_types_mod, ONLY : r_2, mland, mvtype, mstype,nrb,ncs,ncp,ms,msn,soil_parameter_type, met_type use cable_abort_module, ONLY : nc_abort USE cable_IO_vars_module, ONLY : latitude,longitude,timeunits,calendar,time_coord, timevar USE cable_checks_module, ONLY : ranges + USE cable_output_module, ONLY: check_and_write, output_par_settings_type USE cable_write_module USE cable_common_module, ONLY : filename,CurYear,cable_user USE landuse_variable, ONLY : landuse_mp @@ -1151,6 +1152,8 @@ SUBROUTINE create_landuse_cable_restart(logn,dels,ktau,soil,mpx,lucmp,cstart,cen INTEGER, INTENT(IN) :: ktau ! timestep number in loop which include spinup INTEGER, INTENT(IN) :: mpx ! timestep number in loop which include spinup INTEGER, DIMENSION(mland), INTENT(in) :: cstart,cend,nap + + TYPE(met_type), TARGET, INTENT(IN) :: met ! TYPE (soil_parameter_type),INTENT(IN) :: soil ! from "cable_de_types_mod" ! TYPE (ranges_type), INTENT(IN) :: ranges ! from "cable_checks_module" @@ -1177,6 +1180,12 @@ SUBROUTINE create_landuse_cable_restart(logn,dels,ktau,soil,mpx,lucmp,cstart,cen INTEGER ok + TYPE(output_par_settings_type) :: out_settings + + LOGICAL, PARAMETER :: output_var = .TRUE., patchout_var = .TRUE. + + out_settings = output_par_settings_type(met=met, restart=.TRUE.) + dummy = 0 ! initialise WRITE(logn, '(A24)') ' Writing restart file...' @@ -1531,99 +1540,111 @@ SUBROUTINE create_landuse_cable_restart(logn,dels,ktau,soil,mpx,lucmp,cstart,cen IF(ok /= NF90_NOERR) CALL nc_abort(ok, & 'Error writing mstype parameter to ' & //TRIM(frst_out)// '(SUBROUTINE create_restart)') - + ! Write parameters: - CALL write_ovar (ncid_restart, iveg_id, 'iveg', REAL(lucmp%iveg, 4), & - ranges%iveg, .TRUE., 'integer', .TRUE.) - CALL write_ovar (ncid_restart, isoil_id, 'isoil', REAL(lucmp%isoil, 4), & - ranges%isoil, .TRUE., 'integer', .TRUE.) - CALL write_ovar (ncid_restart, tggID, 'tgg', REAL(lucmp%tgg, 4), & - ranges%SoilTemp, .TRUE., 'soil', .TRUE.) - CALL write_ovar (ncid_restart, wbID, 'wb', lucmp%wb, ranges%SoilMoist, & - .TRUE., 'soil', .TRUE.) - CALL write_ovar (ncid_restart, wbiceID, 'wbice', lucmp%wbice, & - ranges%SoilMoist, .TRUE., 'soil', .TRUE.) - CALL write_ovar (ncid_restart, gammzzID, 'gammzz', lucmp%gammzz, & - (/-99999.0, 9999999.0/), .TRUE., 'soil', .TRUE.) + out_settings%dimswitch = "integer" + CALL check_and_write(output_var, iveg_id, 'iveg', REAL(lucmp%iveg, 4), ranges%iveg, & + patchout_var, out_settings) + CALL check_and_write(output_var, isoil_id, 'isoil', REAL(lucmp%tgg, 4), ranges%isoil, & + patchout_var, out_settings) + CALL check_and_write(output_var, isflagID, 'isflag', REAL(lucmp%isflag, 4), & + ranges%default_l, patchout_var, out_settings) + out_settings%dimswitch = "soil" + CALL check_and_write(output_var, tggID, 'tgg', REAL(lucmp%tgg, 4), & + ranges%SoilTemp, patchout_var, out_settings) + CALL check_and_write(output_var, wbID, 'wb', REAL(lucmp%wb, 4), ranges%SoilMoist, & + patchout_var, out_settings) + CALL check_and_write(output_var, wbiceID, 'wbice', REAL(lucmp%wbice, 4), & + ranges%SoilMoist, patchout_var, out_settings) + CALL check_and_write(output_var, gammzzID, 'gammzz', REAL(lucmp%gammzz, 4), & + ranges%default_l, patchout_var, out_settings) ! Snow dimensioned variables/parameters: - CALL write_ovar (ncid_restart, ssdnID, 'ssdn', REAL(lucmp%ssdn, 4), & - (/0.0, 9999.0/), .TRUE., 'snow', .TRUE.) - CALL write_ovar (ncid_restart, smassID, 'smass', REAL(lucmp%smass, 4), & - (/0.0, 9999.0/), .TRUE., 'snow', .TRUE.) - CALL write_ovar (ncid_restart, sdepthID, 'sdepth', REAL(lucmp%sdepth, 4), & - (/0.0, 9999.0/), .TRUE., 'snow', .TRUE.) - CALL write_ovar (ncid_restart, tggsnID, 'tggsn', REAL(lucmp%tggsn, 4), & - (/100.0, 300.0/), .TRUE., 'snow', .TRUE.) + out_settings%dimswitch = "snow" + CALL check_and_write(output_var, ssdnID, 'ssdn', REAL(lucmp%ssdn, 4), & + ranges%ssdn, patchout_var, out_settings) + CALL check_and_write(output_var, smassID, 'smass', REAL(lucmp%smass, 4), & + ranges%smass, patchout_var, out_settings) + CALL check_and_write(output_var, sdepthID, 'sdepth', REAL(lucmp%sdepth, 4), & + ranges%sdepth, patchout_var, out_settings) + CALL check_and_write(output_var, tggsnID, 'tggsn', REAL(lucmp%tggsn, 4), & + ranges%tggsn, patchout_var, out_settings) ! Other dims - CALL write_ovar (ncid_restart, albsoilsnID, 'albsoilsn', & - REAL(lucmp%albsoilsn, 4), (/0.0, 1.0/), .TRUE., 'radiation', .TRUE.) - CALL write_ovar (ncid_restart, cplantID, 'cplant', REAL(lucmp%cplantx, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'plantcarbon', .TRUE.) - CALL write_ovar (ncid_restart, csoilID, 'csoil', REAL(lucmp%csoilx, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'soilcarbon', .TRUE.) + out_settings%dimswitch = "radiation" + CALL check_and_write(output_var, albsoilsnID, 'albsoilsn', & + REAL(lucmp%albsoilsn, 4), ranges%albsoiln, patchout_var, out_settings) + out_settings%dimswitch = "plantcarbon" + CALL check_and_write(output_var, cplantID, 'cplant', REAL(lucmp%cplantx, 4), & + ranges%default_l, patchout_var, out_settings) + out_settings%dimswitch = "soilcarbon" + CALL check_and_write(output_var, csoilID, 'csoil', REAL(lucmp%csoilx, 4), & + ranges%default_l, patchout_var, out_settings) ok = NF90_PUT_VAR(ncid_restart, zse_id, REAL(soil%zse, 4)) - IF(ok /= NF90_NOERR) CALL nc_abort(ok, 'Error writing zse parameter to ' & - //TRIM(frst_out)// '(SUBROUTINE create_restart)') + IF (ok /= NF90_NOERR) CALL nc_abort(ok, 'Error writing zse parameter to ' & + //TRIM(frst_out)//'(SUBROUTINE create_restart)') ! Single dim: - CALL write_ovar (ncid_restart, albsoil_id, 'albsoil', & - REAL(lucmp%albsoil, 4), ranges%albsoil, .TRUE., & - 'radiation', .TRUE.) - - CALL write_ovar (ncid_restart, tssID, 'tss', REAL(lucmp%tss, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, ssdnnID, 'ssdnn', REAL(lucmp%ssdnn, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, osnowdID, 'osnowd', REAL(lucmp%osnowd, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, snageID, 'snage', REAL(lucmp%snage, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, snowdID, 'snowd', REAL(lucmp%snowd, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, rtsoilID, 'rtsoil', REAL(lucmp%rtsoil, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, isflagID, 'isflag', REAL(lucmp%isflag, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'integer', .TRUE.) - CALL write_ovar (ncid_restart, canstoID, 'cansto', REAL(lucmp%cansto, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, sghfluxID, 'sghflux', & - REAL(lucmp%sghflux, 4), (/-99999.0, 9999999.0/), & - .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, ghfluxID, 'ghflux', REAL(lucmp%ghflux, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, runoffID, 'runoff', REAL(lucmp%runoff, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, rnof1ID, 'rnof1', REAL(lucmp%rnof1, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, rnof2ID, 'rnof2', REAL(lucmp%rnof2, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, gaID, 'ga', REAL(lucmp%ga, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, dgdtgID, 'dgdtg', lucmp%dgdtg, & - (/-99999.0, 9999999.0/), .TRUE., 'r2', .TRUE.) - CALL write_ovar (ncid_restart, fevID, 'fev', REAL(lucmp%fev, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, fesID, 'fes', REAL(lucmp%fes, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, fhsID, 'fhs', REAL(lucmp%fhs, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, wbtot0ID, 'wbtot0', REAL(lucmp%wbtot0, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, osnowd0ID, 'osnowd0', REAL(lucmp%osnowd0, 4), & - (/-99999.0, 9999999.0/), .TRUE., 'real', .TRUE.) - CALL write_ovar (ncid_restart, albedoID, 'albedo', REAL(lucmp%albedo, 4), & - ranges%Albedo, .TRUE., 'radiation', .TRUE.) - CALL write_ovar (ncid_restart, tradID, 'trad', & - REAL(lucmp%trad, 4), ranges%RadT, .TRUE., 'real', .TRUE.) - - CALL write_ovar (ncid_restart, gwID, 'GWwb', REAL(lucmp%GWwb, 4), & - ranges%GWwb, .TRUE., 'real', .TRUE.) - + out_settings%dimswitch = "radiation" + CALL check_and_write(output_var, albsoil_id, 'albsoil', & + REAL(lucmp%albsoil, 4), ranges%albsoil, patchout_var, & + out_settings) + + out_settings%dimswitch = "real" + + CALL check_and_write(output_var, tssID, 'tss', REAL(lucmp%tss, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, ssdnnID, 'ssdnn', REAL(lucmp%ssdnn, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, osnowdID, 'osnowd', REAL(lucmp%osnowd, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, snageID, 'snage', REAL(lucmp%snage, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, snowdID, 'snowd', REAL(lucmp%snowd, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, rtsoilID, 'rtsoil', REAL(lucmp%rtsoil, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, canstoID, 'cansto', REAL(lucmp%cansto, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, sghfluxID, 'sghflux', & + REAL(lucmp%sghflux, 4), ranges%default_l, & + patchout_var, out_settings) + CALL check_and_write(output_var, ghfluxID, 'ghflux', REAL(lucmp%ghflux, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, runoffID, 'runoff', REAL(lucmp%runoff, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, rnof1ID, 'rnof1', REAL(lucmp%rnof1, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, rnof2ID, 'rnof2', REAL(lucmp%rnof2, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, gaID, 'ga', REAL(lucmp%ga, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, fevID, 'fev', REAL(lucmp%fev, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, fesID, 'fes', REAL(lucmp%fes, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, fhsID, 'fhs', REAL(lucmp%fhs, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, wbtot0ID, 'wbtot0', REAL(lucmp%wbtot0, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, osnowd0ID, 'osnowd0', REAL(lucmp%osnowd0, 4), & + ranges%default_l, patchout_var, out_settings) + CALL check_and_write(output_var, tradID, 'trad', & + REAL(lucmp%trad, 4), ranges%RadT, patchout_var, out_settings) + + CALL check_and_write(output_var, gwID, 'GWwb', REAL(lucmp%GWwb, 4), & + ranges%GWwb, patchout_var, out_settings) + + out_settings%dimswitch = "r2" + CALL check_and_write(output_var, dgdtgID, 'dgdtg', REAL(lucmp%dgdtg, 4), & + ranges%default_l, patchout_var, out_settings) + + out_settings%dimswitch = "radiation" + CALL check_and_write(output_var, albedoID, 'albedo', REAL(lucmp%albedo, 4), & + ranges%Albedo, patchout_var, out_settings) ! Close restart file ok = NF90_CLOSE(ncid_restart) - write(logn,*) ' landuse on' - WRITE(logn, '(A36)') ' Restart file complete and closed.' + write (logn, *) ' landuse on' + WRITE (logn, '(A36)') ' Restart file complete and closed.' END SUBROUTINE create_landuse_cable_restart From 5553fc626e8a30b7545a87003e5486ec1c1da315 Mon Sep 17 00:00:00 2001 From: rkutteh <98803952+rkutteh@users.noreply.github.com> Date: Tue, 2 Jul 2024 19:52:26 +1000 Subject: [PATCH 42/85] Update documentation/docs/user_guide/constants/index.md Co-authored-by: Claire Carouge --- documentation/docs/user_guide/constants/index.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/documentation/docs/user_guide/constants/index.md b/documentation/docs/user_guide/constants/index.md index 58e196679..89f8b7e4f 100644 --- a/documentation/docs/user_guide/constants/index.md +++ b/documentation/docs/user_guide/constants/index.md @@ -9,8 +9,3 @@ Table 1 lists the various types of constants used in CABLE. A list of the numeri |------------------------| | Physical constants | | Mathematical constants | -| | -| | -| | -| | -| | From a2e177b3e1192e801d78e5cebfa9cd36dfdf2c79 Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh Date: Wed, 3 Jul 2024 11:42:15 +1000 Subject: [PATCH 43/85] Set ice density to 917 kg/m3 --- src/offline/cable_soilparm.nml | 2 +- src/params/cable_phys_constants_mod.F90 | 40 ++++++++++++------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/offline/cable_soilparm.nml b/src/offline/cable_soilparm.nml index 23b70c05f..2f325849f 100644 --- a/src/offline/cable_soilparm.nml +++ b/src/offline/cable_soilparm.nml @@ -13,7 +13,7 @@ soilin%bch=4.2,7.1,11.4,5.15,10.4,10.4,7.12,5.83,7.1, soilin%clay=0.09,0.3,0.67,0.2,0.42,0.48,0.27,0.17,0.3, soilin%css=7*850,1920,2100, soilin%hyds=0.000166,0.000004,0.000001,0.000021,0.000002,0.000001,0.000006,0.0008,0.000001, -soilin%rhosoil=1600,1600,1381,1373,1476,1521,1373,1537,910, +soilin%rhosoil=1600,1600,1381,1373,1476,1521,1373,1537,917, soilin%sand=0.83,0.37,0.16,0.6,0.52,0.27,0.58,0.13,0.37, soilin%sfc=0.143,0.301,0.367,0.218,0.31,0.37,0.255,0.45,0.301, soilin%silt=0.08,0.33,0.17,0.2,0.06,0.25,0.15,0.7,0.33, diff --git a/src/params/cable_phys_constants_mod.F90 b/src/params/cable_phys_constants_mod.F90 index f0328a6d7..c439a5da3 100644 --- a/src/params/cable_phys_constants_mod.F90 +++ b/src/params/cable_phys_constants_mod.F90 @@ -21,27 +21,27 @@ MODULE cable_phys_constants_mod PUBLIC -REAL, PARAMETER :: tfrz = 273.16 ! Temp (K) corresp. to 0 C -REAL, PARAMETER :: sboltz = 5.67e-8 ! Stefan-Boltz. const (W/m2/K4) -REAL, PARAMETER :: emsoil = 1.0 ! soil emissivity -REAL, PARAMETER :: emleaf = 1.0 ! leaf emissivity -REAL, PARAMETER :: capp = 1004.64 ! air spec. heat (J/kg/K) -REAL, PARAMETER :: hl = 2.5014e6 ! latent heat of vaporization (J/s/m2) +REAL, PARAMETER :: tfrz = 273.16 ! Temp (K) corresp. to 0 C +REAL, PARAMETER :: sboltz = 5.67e-8 ! Stefan-Boltz. const (W/m2/K4) +REAL, PARAMETER :: emsoil = 1.0 ! soil emissivity +REAL, PARAMETER :: emleaf = 1.0 ! leaf emissivity +REAL, PARAMETER :: capp = 1004.64 ! air spec. heat (J/kg/K) +REAL, PARAMETER :: hl = 2.5014e6 ! latent heat of vaporization (J/kg) !Below are constants used in CABLE model which are not as yet used in JAC-6.2 -REAL, PARAMETER :: hlf = 0.334e6 ! latent heat of fusion -REAL, PARAMETER :: hls = 2.8350e6 ! latent heatOFsublimation (J/kg) -REAL, PARAMETER :: dheat = 21.5e-6 ! molecular diffusivity for heat -REAL, PARAMETER :: grav = 9.8086 ! gravity acceleration (m/s2) -REAL, PARAMETER :: rgas = 8.3143 ! universal gas const (J/mol/K) -REAL, PARAMETER :: rmair = 0.02897 ! molecular wt: dry air (kg/mol) -REAL, PARAMETER :: rmh2o = 0.018016 ! molecular wt: water (kg/mol) -REAL, PARAMETER :: cgsnow = 2090.0 ! specific heat for snow (J/kg/K) -REAL, PARAMETER :: cs_rho_ice = 1.9341e6 !heat capacity * density ice -REAL, PARAMETER :: cs_rho_wat = 4.218e6 ! heat capacity * density water -REAL, PARAMETER :: csice = 2.100e3 ! specific heat for ice (J/kg/K) -REAL, PARAMETER :: cswat = 4.218e3 ! specific heat for water at 0°C (J/kg/K) -REAL, PARAMETER :: density_liq = 1000.0 ! density of liquid water -REAL, PARAMETER :: density_ice = 921.0 ! denisty of ice +REAL, PARAMETER :: hlf = 0.334e6 ! latent heat of fusion (J/kg) +REAL, PARAMETER :: hls = 2.8350e6 ! latent heat of sublimation (J/kg) +REAL, PARAMETER :: dheat = 21.5e-6 ! molecular diffusivity for heat (cm2/s) +REAL, PARAMETER :: grav = 9.8086 ! gravity acceleration (m/s2) +REAL, PARAMETER :: rgas = 8.3143 ! universal gas const (J/mol/K) +REAL, PARAMETER :: rmair = 0.02897 ! molecular wt: dry air (kg/mol) +REAL, PARAMETER :: rmh2o = 0.018016 ! molecular wt: water (kg/mol) +REAL, PARAMETER :: cgsnow = 2090.0 ! specific heat for snow (J/kg/K) +REAL, PARAMETER :: cs_rho_ice = 1.9257e6 ! heat capacity * density ice +REAL, PARAMETER :: cs_rho_wat = 4.218e6 ! heat capacity * density water +REAL, PARAMETER :: csice = 2.100e3 ! specific heat for ice (J/kg/K) +REAL, PARAMETER :: cswat = 4.218e3 ! specific heat for water at 0°C (J/kg/K) +REAL, PARAMETER :: density_liq = 1000.0 ! density of liquid water +REAL, PARAMETER :: density_ice = 917.0 ! density of ice ! Teten coefficients REAL, PARAMETER :: tetena = 6.106 ! Magnus Tetans (Murray 1967) From 7b7dcc335be09961ac7e41b00d951a4ed36ee9db Mon Sep 17 00:00:00 2001 From: JhanSrbinovsky Date: Thu, 11 Jul 2024 17:19:19 +1000 Subject: [PATCH 44/85] Reconcile versions of rplant (#274) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #163 initialization to 1 so is applicable even IF not over-written by specific case applications. i.e. Will be correct for ESM1.5 # CABLE Thank you for submitting a pull request to the CABLE Project. ## Description Please include a brief summary of the change and list the issues that are fixed. Please also include relevant motivation and context. You can link issues by using a supported keyword in the pull request's description or in a commit message: Fixes #(issue) ## Type of change Please delete options that are not relevant. - [x] Bug fix - [ ] New or updated documentation ## Checklist - [x] The new content is accessible and located in the appropriate section. - [x] I have checked that links are valid and point to the intended content. - [x] I have checked my code/text and corrected any misspellings Please add a reviewer when ready for review. ---- 📚 Documentation preview 📚: https://cable--274.org.readthedocs.build/en/274/ --- src/science/casa-cnp/casa_inout.F90 | 2 +- src/science/casa-cnp/casa_rplant.F90 | 114 +-------------------------- 2 files changed, 4 insertions(+), 112 deletions(-) diff --git a/src/science/casa-cnp/casa_inout.F90 b/src/science/casa-cnp/casa_inout.F90 index 15219902a..9048ed8de 100644 --- a/src/science/casa-cnp/casa_inout.F90 +++ b/src/science/casa-cnp/casa_inout.F90 @@ -153,7 +153,7 @@ SUBROUTINE casa_init(casabiome,casamet,casaflux,casapool,casabal,veg,phen) casaflux%Clabloss = 0. casaflux%fracClabile = 0. casaflux%stemnpp = 0. - casaflux%frac_sapwood = 0. + casaflux%frac_sapwood = 1.0 casaflux%sapwood_area = 0. casaflux%FluxCtohwp = 0. casaflux%FluxCtoClear = 0. diff --git a/src/science/casa-cnp/casa_rplant.F90 b/src/science/casa-cnp/casa_rplant.F90 index 591aa79ad..e406bbf48 100644 --- a/src/science/casa-cnp/casa_rplant.F90 +++ b/src/science/casa-cnp/casa_rplant.F90 @@ -79,11 +79,11 @@ SUBROUTINE casa_rplant(veg,casabiome,casapool,casaflux,casamet,climate) Ygrow = 0.0 WHERE(casapool%Nplant>0.0) - ratioPNplant = casapool%Pplant/(casapool%Nplant+ 1.0e-10) + ratioPNplant = casapool%Pplant / casapool%Nplant ENDWHERE - Ygrow(:) = 0.65+0.2*ratioPNplant(:,leaf)/(ratioPNplant(:,leaf)+1.0/15.0) - Ygrow(:) = min(0.85,max(0.65,Ygrow(:))) + Ygrow(:) = 0.65 + 0.2 * ratioPNplant(:,leaf) / & + ( ratioPNplant(:,leaf) + 1.0 / 15.0 ) casaflux%crmplant(:,wood) = 0.0 casaflux%crmplant(:,froot) = 0.0 @@ -224,12 +224,8 @@ SUBROUTINE casa_rplant(veg,casabiome,casapool,casaflux,casamet,climate) WHERE(casamet%tairk >250.0) WHERE(casapool%cplant(:,wood)>1.0e-6) -# ifdef ESM15 - casaflux%crmplant(:,wood) = casabiome%rmplant(veg%iveg(:),wood) & -# else casaflux%crmplant(:,wood) = resp_coeff * casaflux%frac_sapwood(:) * & casabiome%rmplant(veg%iveg(:),wood) & -# endif * casapool%nplant(:,wood) & * EXP(308.56*(1.0/56.02-1.0 & / (casamet%tairk(:)+46.02-tkzeroc))) @@ -243,11 +239,7 @@ SUBROUTINE casa_rplant(veg,casabiome,casapool,casaflux,casamet,climate) ENDWHERE WHERE(casamet%tsoilavg >250.0.AND.casapool%cplant(:,froot)>1.0e-6) -# ifdef ESM15 - casaflux%crmplant(:,froot) = casabiome%rmplant(veg%iveg(:),froot) & -# else casaflux%crmplant(:,froot) = resp_coeff * casabiome%rmplant(veg%iveg(:),froot) & -# endif * casapool%nplant(:,froot) & * EXP(308.56*(1.0/56.02-1.0 & / (casamet%tsoilavg(:)+46.02-tkzeroc))) @@ -297,104 +289,4 @@ SUBROUTINE casa_rplant(veg,casabiome,casapool,casaflux,casamet,climate) END SUBROUTINE casa_rplant - -SUBROUTINE casa_rplant1(veg,casabiome,casapool,casaflux,casamet) -! maintenance respiration of woody tisse and fineroots -! see Sitch et al. (2003), GCB, reqn (23) - - IMPLICIT NONE - TYPE (veg_parameter_type), INTENT(INOUT) :: veg ! vegetation parameters - TYPE (casa_biome), INTENT(INOUT) :: casabiome - TYPE (casa_pool), INTENT(INOUT) :: casapool - TYPE (casa_flux), INTENT(INOUT) :: casaflux - TYPE (casa_met), INTENT(INOUT) :: casamet - INTEGER :: npt - - real(r_2), dimension(mp) :: Ygrow ! growth efficiency Q.Zhang 22/02/2011 - real(r_2), dimension(mp,mplant) :: ratioPNplant ! Q.Zhang 22/02/2011 - real(r_2), dimension(mp) :: delcrmleaf, delcrmwood,delcrmfroot ! reduction in wood and root respiration when NPP <0.0 - - ratioPNplant(:,:) = 1.0/casabiome%ratioNPplantmin(veg%iveg(:),:) - WHERE(casapool%Nplant>0.0) - ratioPNplant = casapool%Pplant/casapool%Nplant - ENDWHERE - - Ygrow(:) = 0.65+0.2*ratioPNplant(:,leaf)/(ratioPNplant(:,leaf)+1.0/15.0) - - casaflux%crmplant(:,wood) = 0.0 - casaflux%crmplant(:,froot) = 0.0 - delcrmleaf = 0.0 - delcrmwood = 0.0 - delcrmfroot = 0.0 - casaflux%crgplant = 0.0 - casaflux%clabloss = 0.0 - - WHERE(casamet%iveg2/=icewater) - WHERE(casamet%tairk >250.0) - WHERE(casapool%cplant(:,wood)>1.0e-6) - casaflux%crmplant(:,wood) = casabiome%rmplant(veg%iveg(:),wood) & - * casapool%nplant(:,wood) & - * exp(308.56*(1.0/56.02-1.0 & - / (casamet%tairk(:)+46.02-tkzeroc))) - ENDWHERE - casaflux%clabloss(:) = casabiome%kclabrate(veg%iveg(:)) & - * max(0.0,casapool%Clabile(:)) & - * exp(308.56*(1.0/56.02-1.0 & - / (casamet%tairk(:)+46.02-tkzeroc))) - ENDWHERE - WHERE(casamet%tsoilavg >250.0.and.casapool%cplant(:,froot)>1.0e-6) - casaflux%crmplant(:,froot) = casabiome%rmplant(veg%iveg(:),froot) & - * casapool%nplant(:,froot) & - * exp(308.56*(1.0/56.02-1.0 & - / (casamet%tsoilavg(:)+46.02-tkzeroc))) - ENDWHERE - casaflux%crmplant(:,leaf) = casaflux%crmplant(:,leaf) + casaflux%clabloss(:) - - WHERE((casaflux%Cgpp-SUM(casaflux%crmplant,2))>0.0) - ! Growth efficiency correlated to leaf N:P ratio. Q.Zhang @ 22/02/2011 - casaflux%crgplant(:) = (1.0-Ygrow(:))* max(0.0,casaflux%Cgpp(:)-SUM(casaflux%crmplant(:,:),2)) - - ELSEWHERE - casaflux%crgplant(:) = 0.0 - ENDWHERE - -!!!!!!!!!!!!!!!!!!!!!!! begin from YPW 02/10/17 !!!!!!!!!!!!!!!!!!!!!!!!!!! - - casaflux%Cnpp(:) = casaflux%Cgpp(:) - SUM(casaflux%crmplant(:,:),2) & - - casaflux%crgplant(:) - - WHERE(casaflux%Cnpp < 0.0) -! change made here by ypw on 11-7-2016 to include leaf maintenance respiration - delcrmleaf(:) = casaflux%Cnpp(:) * casaflux%crmplant(:,leaf) & - / max(0.01,(casaflux%crmplant(:,leaf)+casaflux%crmplant(:,wood) & - + casaflux%crmplant(:,froot))) - delcrmwood(:) = casaflux%Cnpp(:) * casaflux%crmplant(:,wood) & - / max(0.01,(casaflux%crmplant(:,leaf)+casaflux%crmplant(:,wood) & - + casaflux%crmplant(:,froot))) - delcrmfroot(:) = casaflux%Cnpp(:) * casaflux%crmplant(:,froot) & - / max(0.01,(casaflux%crmplant(:,leaf)+casaflux%crmplant(:,wood) & - + casaflux%crmplant(:,froot))) - - casaflux%crmplant(:,leaf) = casaflux%crmplant(:,leaf) + delcrmleaf(:) - casaflux%crmplant(:,wood) = casaflux%crmplant(:,wood) + delcrmwood(:) - casaflux%crmplant(:,froot) = casaflux%crmplant(:,froot) + delcrmfroot(:) - casaflux%crgplant(:) = 0.0 - - ! The logic above can still lead to a negative NPP as - ! SUM(casaflux%crmplant(:,:),2) can be a tiny number, if this - ! happens, set NPP to zero - WHERE(casaflux%Cnpp < 0.0) - casaflux%cnpp(:) = 0.0 - ENDWHERE - - ENDWHERE - -!!!!!!!!!!!!!!!!!!!!!!! end from YPW 02/10/17 !!!!!!!!!!!!!!!!!!!!!!!!!!! - ENDWHERE - - casaflux%Cnpp(:) = casaflux%Cgpp(:) - SUM(casaflux%crmplant(:,:),2) & - - casaflux%crgplant(:) - -END SUBROUTINE casa_rplant1 - END MODULE casa_rplant_module From e521096e4d6215b3d2f82b26f6fd249946096305 Mon Sep 17 00:00:00 2001 From: JhanSrbinovsky Date: Fri, 12 Jul 2024 11:10:04 +1000 Subject: [PATCH 45/85] bug fix rm USE rplant1 and CALL rplant1 (#340) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # CABLE Thank you for submitting a pull request to the CABLE Project. ## Description addendum to #163/#274 You can link issues by using a supported keyword in the pull request's description or in a commit message: Fixes #339 ## Type of change bug fix - [X ] Bug fix - [ ] New or updated documentation ## Checklist - [X] The new content is accessible and located in the appropriate section. - [ ] I have checked that links are valid and point to the intended content. - [X] I have checked my code/text and corrected any misspellings Please add a reviewer when ready for review. tag @rkutteh ---- 📚 Documentation preview 📚: https://cable--340.org.readthedocs.build/en/340/ --- src/science/casa-cnp/biogeochem_casa.F90 | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/science/casa-cnp/biogeochem_casa.F90 b/src/science/casa-cnp/biogeochem_casa.F90 index 15fb6238b..ab0f4ebb1 100644 --- a/src/science/casa-cnp/biogeochem_casa.F90 +++ b/src/science/casa-cnp/biogeochem_casa.F90 @@ -1,5 +1,3 @@ -!#define ESM15 YES - MODULE biogeochem_mod IMPLICIT NONE @@ -17,11 +15,7 @@ SUBROUTINE biogeochem(ktau,dels,idoY,LALLOC,veg,soil,casabiome,casapool,casaflux USE casa_cnp_module USE casa_inout_module, ONLY : casa_cnpflux USE POP_TYPES, ONLY: POP_TYPE -#ifdef ESM15 USE casa_rplant_module, ONLY: casa_rplant -#else -USE casa_rplant_module, ONLY: casa_rplant1 -#endif IMPLICIT NONE INTEGER, INTENT(IN) :: ktau @@ -62,11 +56,8 @@ SUBROUTINE biogeochem(ktau,dels,idoY,LALLOC,veg,soil,casabiome,casapool,casaflux CALL phenology(idoy,veg,phen) ENDIF CALL avgsoil(veg,soil,casamet) -#ifdef ESM15 + CALL casa_rplant(veg,casabiome,casapool,casaflux,casamet,climate) -#else -CALL casa_rplant1(veg,casabiome,casapool,casaflux,casamet) -#endif IF (.NOT.cable_user%CALL_POP) THEN CALL casa_allocation(veg,soil,casabiome,casaflux,casapool,casamet,phen,LALLOC) ENDIF From 44ce20e8f554e5d4e1fc98b69b6d003670969349 Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Mon, 15 Jul 2024 12:33:13 +1000 Subject: [PATCH 46/85] (#344) - update value for checks%range --- src/offline/cable.nml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/offline/cable.nml b/src/offline/cable.nml index a1b8dc260..8461e014a 100644 --- a/src/offline/cable.nml +++ b/src/offline/cable.nml @@ -23,7 +23,7 @@ output%params = .TRUE. ! input parameters used to produce run output%patch = .TRUE. ! write per patch output%balances = .TRUE. ! energy and water balances - check%ranges = .FALSE. ! variable ranges, input and output + check%ranges = 0 ! variable ranges, input and output check%energy_bal = .TRUE. ! energy balance check%mass_bal = .TRUE. ! water/mass balance verbose = .TRUE. ! write details of every grid cell init and params to log? From 860094b44bdc9140888f9bfca0b955b4e325b96a Mon Sep 17 00:00:00 2001 From: Ian Harman Date: Mon, 15 Jul 2024 14:54:15 +1000 Subject: [PATCH 47/85] added potential evaporation to offline output, changed checks range, corrected epot var in cable_canopy. Fixes #335 --- src/offline/cable.nml | 2 +- src/offline/cable_checks.F90 | 2 +- src/offline/cable_iovars.F90 | 1 + src/offline/cable_output.F90 | 11 ++++++++++- src/science/canopy/cable_canopy.F90 | 2 +- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/offline/cable.nml b/src/offline/cable.nml index a1b8dc260..537222fcd 100644 --- a/src/offline/cable.nml +++ b/src/offline/cable.nml @@ -23,7 +23,7 @@ output%params = .TRUE. ! input parameters used to produce run output%patch = .TRUE. ! write per patch output%balances = .TRUE. ! energy and water balances - check%ranges = .FALSE. ! variable ranges, input and output + check%ranges = 0 ! variable ranges, input and output check%energy_bal = .TRUE. ! energy balance check%mass_bal = .TRUE. ! water/mass balance verbose = .TRUE. ! write details of every grid cell init and params to log? diff --git a/src/offline/cable_checks.F90 b/src/offline/cable_checks.F90 index c3c50b5ae..56f1e4679 100644 --- a/src/offline/cable_checks.F90 +++ b/src/offline/cable_checks.F90 @@ -84,7 +84,7 @@ MODULE cable_checks_module ESoil = [-0.0015, 0.0015], & TVeg = [-0.0003, 0.0003], & ECanop = [-0.0003, 0.0003], & - PotEvap = [-0.0006, 0.0006], & + PotEvap = [-0.005, 0.005], & !note should encompass Evap ACond = [0.0, 1.0], & SoilWet = [-0.4, 1.2], & Albedo = [0.0, 1.0], & diff --git a/src/offline/cable_iovars.F90 b/src/offline/cable_iovars.F90 index caf711247..5aff80494 100644 --- a/src/offline/cable_iovars.F90 +++ b/src/offline/cable_iovars.F90 @@ -494,6 +494,7 @@ SUBROUTINE set_group_output_values output%Qsb = .TRUE. output%Evap = .TRUE. output%ECanop = .TRUE. + output%PotEvap = .TRUE. output%TVeg = .TRUE. output%ESoil = .TRUE. output%HVeg = .TRUE. diff --git a/src/offline/cable_output.F90 b/src/offline/cable_output.F90 index a30603432..04cb67a43 100644 --- a/src/offline/cable_output.F90 +++ b/src/offline/cable_output.F90 @@ -57,7 +57,7 @@ MODULE cable_output_module Qmom, Qle, Qh, Qg, NEE, SWnet, & LWnet, SoilMoist, SoilTemp, Albedo, & visAlbedo, nirAlbedo, SoilMoistIce, & - Qs, Qsb, Evap, BaresoilT, SWE, SnowT, & + Qs, Qsb, Evap, PotEvap, BaresoilT, SWE, SnowT, & RadT, VegT, Ebal, Wbal, AutoResp, RootResp, & StemResp, LeafResp, HeteroResp, GPP, NPP, LAI, & ECanop, TVeg, ESoil, CanopInt, SnowDepth, & @@ -549,6 +549,13 @@ SUBROUTINE open_output_file(dels, soil, veg, bgc, rough, met) ALLOCATE(out%Evap(mp)) out%Evap = 0.0 ! initialise END IF + IF(output%PotEvap) THEN + CALL define_ovar(ncid_out, ovid%PotEvap,'PotEvap', 'kg/m^2/s', & + 'Potential evaporation', patchout%PotEvap, 'dummy', & + xID, yID, zID, landID, patchID, tID) + ALLOCATE(out%PotEvap(mp)) + out%PotEvap = 0.0 ! initialise + END IF IF(output%ECanop) THEN CALL define_ovar(ncid_out, ovid%Ecanop, 'ECanop', 'kg/m^2/s', & 'Wet canopy evaporation', patchout%ECanop, 'dummy', & @@ -1732,6 +1739,8 @@ SUBROUTINE write_output(dels, ktau, met, canopy, casaflux, casapool, casamet, ss CALL generate_out_write_acc(output%Qsb, ovid%Qsb, 'Qsb', out%Qsb, REAL(ssnow%rnof2/dels, 4), ranges%Qsb, patchout%Qsb, out_settings) ! Evap: total evapotranspiration [kg/m^2/s] CALL generate_out_write_acc(output%Evap, ovid%Evap, 'Evap', out%Evap, REAL(canopy%fe/air%rlam, 4), ranges%Evap, patchout%Evap, out_settings) + ! PotEVap: potential evapotranspiration [kg/m^2/s] + CALL generate_out_write_acc(output%PotEvap, ovid%PotEvap, 'PotEvap', out%PotEvap, REAL(canopy%epot/dels, 4), ranges%PotEvap, patchout%PotEvap, out_settings) ! ECanop: interception evaporation [kg/m^2/s] CALL generate_out_write_acc(output%ECanop, ovid%ECanop, 'ECanop', out%ECanop, REAL(canopy%fevw/air%rlam, 4), ranges%ECanop, patchout%ECanop, out_settings) ! TVeg: vegetation transpiration [kg/m^2/s] diff --git a/src/science/canopy/cable_canopy.F90 b/src/science/canopy/cable_canopy.F90 index 8514645a6..fe5cdaff8 100644 --- a/src/science/canopy/cable_canopy.F90 +++ b/src/science/canopy/cable_canopy.F90 @@ -645,7 +645,7 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima !radiation weighted soil and canopy contributions !Note: If PM routine corrected then match changes here canopy%epot = ((1.-rad%transd)*canopy%fevw_pot + & - rad%transd*ssnow%potev*ssnow%cls) * dels/air%rlam + rad%transd*ssnow%potev/ssnow%cls) * dels/air%rlam From b8e24fe130b72a9263ada95b91aef9c2408eccb3 Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Mon, 15 Jul 2024 15:36:18 +1000 Subject: [PATCH 48/85] (#344) - Changes for compatibility with GNU compiler --- src/offline/cable_checks.F90 | 2 +- src/offline/cable_driver.F90 | 2 +- src/offline/cable_input.F90 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/offline/cable_checks.F90 b/src/offline/cable_checks.F90 index c3c50b5ae..c0b159b43 100644 --- a/src/offline/cable_checks.F90 +++ b/src/offline/cable_checks.F90 @@ -225,7 +225,7 @@ SUBROUTINE check_range_d1(vname, parameter_r1, parameter_range, ktau, met) DO index = 1, SIZE(parameter_r1) IF (parameter_r1(index) < parameter_range(1) .OR. parameter_r1(index) > parameter_range(2)) THEN - CALL range_abort(vname, ktau, met, parameter_r1(index), \ + CALL range_abort(vname, ktau, met, parameter_r1(index), & parameter_range, index, patch(index)%latitude, patch(index)%longitude) END IF END DO diff --git a/src/offline/cable_driver.F90 b/src/offline/cable_driver.F90 index 52bb1bfaa..60ec18af3 100644 --- a/src/offline/cable_driver.F90 +++ b/src/offline/cable_driver.F90 @@ -621,7 +621,7 @@ PROGRAM cable_offline_driver casamet, casabal, phen, POP, spinup, & CEMSOIL, CTFRZ, LUC_EXPT, POPLUC ) - IF (check%ranges) THEN + IF (check%ranges > 0) THEN WRITE (*, *) "Checking parameter ranges" CALL constant_check_range(soil, veg, 0, met) END IF diff --git a/src/offline/cable_input.F90 b/src/offline/cable_input.F90 index 901045ae7..96023761d 100644 --- a/src/offline/cable_input.F90 +++ b/src/offline/cable_input.F90 @@ -2481,7 +2481,7 @@ SUBROUTINE get_met_data(spinup,spinConv,met,soil,rad, & ! initialise within canopy air temp met%tvair = met%tk met%tvrad = met%tk - IF(check%ranges) THEN + IF(check%ranges > 0) THEN ! Check ranges are okay: CALL check_range("SWdown", met%fsd, ranges%SWdown, 0, met) CALL check_range("LWdown", met%fld, ranges%LWdown, 0, met) From fa555ba85c9c23697e7e85636331ab7ada50e5c2 Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Mon, 15 Jul 2024 16:36:15 +1000 Subject: [PATCH 49/85] (#344) - Use enumerator values for conditions on check%ranges --- src/offline/cable_driver.F90 | 5 +++-- src/offline/cable_input.F90 | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/offline/cable_driver.F90 b/src/offline/cable_driver.F90 index 60ec18af3..f786ede8e 100644 --- a/src/offline/cable_driver.F90 +++ b/src/offline/cable_driver.F90 @@ -63,7 +63,8 @@ PROGRAM cable_offline_driver USE cable_IO_vars_module, ONLY: logn,gswpfile,ncciy,leaps, & verbose, fixedCO2,output,check,patchout, & patch_type,landpt,soilparmnew,& - defaultLAI, sdoy, smoy, syear, timeunits, exists, calendar, set_group_output_values + defaultLAI, sdoy, smoy, syear, timeunits, exists, calendar, set_group_output_values, & + NO_CHECK USE casa_ncdf_module, ONLY: is_casa_time USE cable_common_module, ONLY: ktau_gl, kend_gl, knode_gl, cable_user, & cable_runtime, filename, myhome, & @@ -621,7 +622,7 @@ PROGRAM cable_offline_driver casamet, casabal, phen, POP, spinup, & CEMSOIL, CTFRZ, LUC_EXPT, POPLUC ) - IF (check%ranges > 0) THEN + IF (check%ranges /= NO_CHECK) THEN WRITE (*, *) "Checking parameter ranges" CALL constant_check_range(soil, veg, 0, met) END IF diff --git a/src/offline/cable_input.F90 b/src/offline/cable_input.F90 index 96023761d..6fe79b6d9 100644 --- a/src/offline/cable_input.F90 +++ b/src/offline/cable_input.F90 @@ -2481,7 +2481,7 @@ SUBROUTINE get_met_data(spinup,spinConv,met,soil,rad, & ! initialise within canopy air temp met%tvair = met%tk met%tvrad = met%tk - IF(check%ranges > 0) THEN + IF(check%ranges /= NO_CHECK) THEN ! Check ranges are okay: CALL check_range("SWdown", met%fsd, ranges%SWdown, 0, met) CALL check_range("LWdown", met%fld, ranges%LWdown, 0, met) From 4aaccb5054aa5459c7c2d5ec97676f5fa4aa9241 Mon Sep 17 00:00:00 2001 From: Ian Harman Date: Tue, 16 Jul 2024 10:49:45 +1000 Subject: [PATCH 50/85] removes hard-wired lake index from code, part of #335 and #347 --- src/offline/cable.nml | 6 +++--- src/science/canopy/cbl_SurfaceWetness.F90 | 9 +++++---- src/science/gw_hydro/cable_gw_hydro.F90 | 24 +++++++++++++---------- src/science/soilsnow/cbl_surfbv.F90 | 4 +++- 4 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/offline/cable.nml b/src/offline/cable.nml index a1b8dc260..55c1343a3 100644 --- a/src/offline/cable.nml +++ b/src/offline/cable.nml @@ -1,6 +1,6 @@ &cable - filename%met = 'TumbaFluxnet.1.3_met.nc' - filename%out = 'out_cable.nc' + filename%met = 'TumbaFluxnet.1.3_lake.nc' + filename%out = 'out_cable_lake.nc' filename%log = 'log_cable.txt' filename%restart_in = ' ' filename%restart_out = './restart_out.nc' @@ -23,7 +23,7 @@ output%params = .TRUE. ! input parameters used to produce run output%patch = .TRUE. ! write per patch output%balances = .TRUE. ! energy and water balances - check%ranges = .FALSE. ! variable ranges, input and output + check%ranges = 0 ! variable ranges, input and output check%energy_bal = .TRUE. ! energy balance check%mass_bal = .TRUE. ! water/mass balance verbose = .TRUE. ! write details of every grid cell init and params to log? diff --git a/src/science/canopy/cbl_SurfaceWetness.F90 b/src/science/canopy/cbl_SurfaceWetness.F90 index 403ef9e6e..f42961e15 100644 --- a/src/science/canopy/cbl_SurfaceWetness.F90 +++ b/src/science/canopy/cbl_SurfaceWetness.F90 @@ -11,6 +11,7 @@ SUBROUTINE Surf_wetness_fact( cansat, canopy, ssnow,veg, met, soil, dels ) USE cable_common_module USE cable_def_types_mod + USE grid_constants_mod_cbl, ONLY : lakes_cable ! physical constants USE cable_phys_constants_mod, ONLY : CTFRZ => TFRZ !H!USE cable_gw_hydro_module, ONLY : calc_srf_wet_fraction @@ -75,11 +76,11 @@ SUBROUTINE Surf_wetness_fact( cansat, canopy, ssnow,veg, met, soil, dels ) IF( ssnow%snowd(i) > 0.1) ssnow%wetfac(i) = 0.9 - IF ( veg%iveg(i) == 16 .and. met%tk(i) >= Ctfrz + 5. ) & - ssnow%wetfac(i) = 1.0 ! lakes: hard-wired number to be removed + IF ( veg%iveg(i) == lakes_cable .and. met%tk(i) >= Ctfrz + 5. ) & + ssnow%wetfac(i) = 1.0 - IF( veg%iveg(i) == 16 .and. met%tk(i) < Ctfrz + 5. ) & - ssnow%wetfac(i) = 0.7 ! lakes: hard-wired number to be removed + IF( veg%iveg(i) == lakes_cable .and. met%tk(i) < Ctfrz + 5. ) & + ssnow%wetfac(i) = 0.7 ENDDO ! owetfac introduced to reduce sharp changes in dry regions, diff --git a/src/science/gw_hydro/cable_gw_hydro.F90 b/src/science/gw_hydro/cable_gw_hydro.F90 index e7cf33918..36f1a002b 100644 --- a/src/science/gw_hydro/cable_gw_hydro.F90 +++ b/src/science/gw_hydro/cable_gw_hydro.F90 @@ -326,6 +326,7 @@ END SUBROUTINE remove_transGW !------------------------------------------------------------------------- SUBROUTINE ovrlndflx (dels, ssnow, soil,veg, canopy,sli_call ) USE cable_common_module, ONLY : gw_params,cable_user + USE grid_constants_mod_cbl, ONLY : lakes_cable IMPLICIT NONE REAL, INTENT(IN) :: dels ! integration time step (s) @@ -394,7 +395,7 @@ SUBROUTINE ovrlndflx (dels, ssnow, soil,veg, canopy,sli_call ) !add back to the lakes to keep saturated instead of drying DO i=1,mp - IF (veg%iveg(i) .EQ. 16) THEN + IF (veg%iveg(i) .EQ. lakes_cable) THEN ssnow%fwtop(i) = ssnow%fwtop(i) + ssnow%rnof1(i) ssnow%rnof1(i) = 0._r_2 END IF @@ -1274,6 +1275,8 @@ END SUBROUTINE calc_equilibrium_water_content SUBROUTINE calc_srf_wet_fraction(ssnow,soil,met,veg) + USE grid_constants_mod_cbl, ONLY : lakes_cable + IMPLICIT NONE TYPE(soil_snow_type), INTENT(INOUT) :: ssnow ! soil+snow variables TYPE(soil_parameter_type), INTENT(IN) :: soil ! soil parameters @@ -1298,11 +1301,11 @@ SUBROUTINE calc_srf_wet_fraction(ssnow,soil,met,veg) DO i=1,mp IF( ssnow%snowd(i) > 0.1) ssnow%wetfac(i) = 0.9 - IF ( veg%iveg(i) == 16 .AND. met%tk(i) >= CTFRZ + 5. ) & - ssnow%wetfac(i) = 1.0 ! lakes: hard-wired number to be removed + IF ( veg%iveg(i) == lakes_cable .AND. met%tk(i) >= CTFRZ + 5. ) & + ssnow%wetfac(i) = 1.0 - IF( veg%iveg(i) == 16 .AND. met%tk(i) < CTFRZ + 5. ) & - ssnow%wetfac(i) = 0.7 ! lakes: hard-wired number to be removed + IF( veg%iveg(i) == lakes_cable .AND. met%tk(i) < CTFRZ + 5. ) & + ssnow%wetfac(i) = 0.7 END DO ELSEIF (cable_user%gw_model) THEN @@ -1367,11 +1370,11 @@ SUBROUTINE calc_srf_wet_fraction(ssnow,soil,met,veg) IF( ssnow%snowd(i) > 0.1) ssnow%wetfac(i) = 0.9 - IF ( veg%iveg(i) == 16 .AND. met%tk(i) >= Ctfrz + 5. ) & - ssnow%wetfac(i) = 1.0 ! lakes: hard-wired number to be removed + IF ( veg%iveg(i) == lakes_cable .AND. met%tk(i) >= Ctfrz + 5. ) & + ssnow%wetfac(i) = 1.0 - IF( veg%iveg(i) == 16 .AND. met%tk(i) < Ctfrz + 5. ) & - ssnow%wetfac(i) = 0.7 ! lakes: hard-wired number to be removed + IF( veg%iveg(i) == lakes_cable .AND. met%tk(i) < Ctfrz + 5. ) & + ssnow%wetfac(i) = 0.7 ENDDO ! owetfac introduced to reduce sharp changes in dry regions, @@ -1714,6 +1717,7 @@ END SUBROUTINE aquifer_recharge SUBROUTINE subsurface_drainage(ssnow,soil,veg,dzmm) USE cable_common_module + USE grid_constants_mod_cbl, ONLY : lakes_cable IMPLICIT NONE @@ -1842,7 +1846,7 @@ SUBROUTINE subsurface_drainage(ssnow,soil,veg,dzmm) !Keep "lakes" saturated forcing qhz = 0. runoff only from lakes !overflowing - IF (soil%isoilm(i) .EQ. 9 .OR. veg%iveg(i) .GE. 16) THEN + IF (soil%isoilm(i) .EQ. 9 .OR. veg%iveg(i) .GE. lakes_cable) THEN ssnow%qhz(i) = 0._r_2 ssnow%qhlev(i,:) = 0._r_2 END IF diff --git a/src/science/soilsnow/cbl_surfbv.F90 b/src/science/soilsnow/cbl_surfbv.F90 index 7777a6f84..6c62b3891 100644 --- a/src/science/soilsnow/cbl_surfbv.F90 +++ b/src/science/soilsnow/cbl_surfbv.F90 @@ -10,6 +10,8 @@ SUBROUTINE surfbv (dels, met, ssnow, soil, veg, canopy ) USE smoisturev_mod, ONLY: smoisturev USE cable_common_module + USE grid_constants_mod_cbl, ONLY : lakes_cable + IMPLICIT NONE REAL, INTENT(IN) :: dels ! integration time step (s) @@ -102,7 +104,7 @@ SUBROUTINE surfbv (dels, met, ssnow, soil, veg, canopy ) ! Rescale drainage to remove water added to lakes (wb_lake) ssnow%sinfil = 0.0 - WHERE( veg%iveg == 16 ) + WHERE( veg%iveg == lakes_cable ) ssnow%sinfil = MIN( ssnow%rnof1, ssnow%wb_lake ) ! water that can be extracted from the rnof1 ssnow%rnof1 = MAX( 0.0, ssnow%rnof1 - ssnow%sinfil ) ssnow%wb_lake = MAX( 0.0, ssnow%wb_lake - ssnow%sinfil) From 5cc5ba40d6170527f0ea191d8b859cdbee42d4dd Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Tue, 16 Jul 2024 12:23:59 +1000 Subject: [PATCH 51/85] (#344) - Remove references to check%ranges as LOGICAL in documentation --- .../docs/user_guide/inputs/meteorological_forcing.md | 3 ++- documentation/docs/user_guide/inputs/pft_params_nml.md | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/documentation/docs/user_guide/inputs/meteorological_forcing.md b/documentation/docs/user_guide/inputs/meteorological_forcing.md index 8231a24e0..64bcf4e65 100644 --- a/documentation/docs/user_guide/inputs/meteorological_forcing.md +++ b/documentation/docs/user_guide/inputs/meteorological_forcing.md @@ -127,5 +127,6 @@ CABLE’s time step size is calculated from the first two values of the time var ## Checking ranges -It is possible to check that the ranges of the meteorological variables are physically possible using `check%ranges=.TRUE.` in the `cable.nml` namelist variable. +It is possible to check that the ranges of the meteorological variables are physically possible using `check%ranges=1` or`check%ranges=2` (see [explanation][nml_desc]) in the `cable.nml` namelist variable. +[nml_desc]: cable_nml.md#list-of-namelist-variables diff --git a/documentation/docs/user_guide/inputs/pft_params_nml.md b/documentation/docs/user_guide/inputs/pft_params_nml.md index b57cdea96..30502a515 100644 --- a/documentation/docs/user_guide/inputs/pft_params_nml.md +++ b/documentation/docs/user_guide/inputs/pft_params_nml.md @@ -156,7 +156,8 @@ The CABLE default values of the vegetation parameters in Table 2 for the vegetat The CABLE distribution provides the default vegetation parameter values from Table 3 in the namelist file pft_params.nml, including the vegetation types from Table 1 in the top part. -The chosen parameter values in offline cases can be checked against the pre-defined realistic parameter value ranges using the CABLE namelist variable check%ranges=.true. in cable.nml. +The chosen parameter values in offline cases can be checked against the pre-defined realistic parameter value ranges using the CABLE namelist variable [`check%ranges`][nml_desc] in cable.nml. + ## Example pft_params.nml file !!! Note "Namelist file format explanation" @@ -243,3 +244,4 @@ vegin%zr=1.800000,3.000000,2.000000,2.000000,2.500000,5*0.500000,1.800000,3.1000 | vegin%wai | real | 0.0 – 5.0 | 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | Wood area index (stem+branches+twigs) (not used) \( (-) \) | | vegin%xalbnir | real | 0.0 – 1.5 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 | ? (not used) | +[nml_desc]: cable_nml.md#list-of-namelist-variables \ No newline at end of file From b326199e9dcbeabb54c84625949f537662b7b537 Mon Sep 17 00:00:00 2001 From: Ian Harman Date: Tue, 16 Jul 2024 12:49:30 +1000 Subject: [PATCH 52/85] enforcing lakes at saturation. fixes #335 --- src/offline/cbl_model_driver_offline.F90 | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/offline/cbl_model_driver_offline.F90 b/src/offline/cbl_model_driver_offline.F90 index 28b0463b8..0425be125 100644 --- a/src/offline/cbl_model_driver_offline.F90 +++ b/src/offline/cbl_model_driver_offline.F90 @@ -53,6 +53,7 @@ SUBROUTINE cbm( ktau,dels, air, bgc, canopy, met, USE cable_phys_constants_mod, ONLY : CEMLEAF => EMLEAF USE cable_phys_constants_mod, ONLY : CEMSOIL => EMSOIL USE cable_phys_constants_mod, ONLY : CSBOLTZ => SBOLTZ +USE cable_phys_constants_mod, ONLY : density_liq !mrd561 USE cable_gw_hydro_module, ONLY : sli_hydrology,& soil_snow_gw @@ -105,6 +106,20 @@ SUBROUTINE cbm( ktau,dels, air, bgc, canopy, met, !iFor testing cable_user%soil_struc="default" +!At start of each time step ensure that lakes surface soil layer is fully saturated. +!Diagnose any water needed to maintain this - this will be removed from +!runoff, drainage and/or deepest soil layer in surfbv +!For offline case retain the water imbalance between timesteps - permits +!balance to be maintained in the longer term. This differs to the coupled model +!where %wb_lake is zero'd each time step (and river outflow is rescaled) +WHERE( veg%iveg == lakes_cable .AND. ssnow%wb(:,1) < soil%ssat ) + ssnow%wbtot1(:) = REAL( ssnow%wb(:,1) ) * density_liq * soil%zse(1) + ssnow%wb(:,1) = soil%ssat + ssnow%wbtot2 = REAL( ssnow%wb(:,1) ) * density_liq * soil%zse(1) +ENDWHERE +ssnow%wb_lake = ssnow%wb_lake + MAX( ssnow%wbtot2 - ssnow%wbtot1, 0.) + + CALL ruff_resist( veg, rough, ssnow, canopy, veg%vlai, veg%hc, canopy%vlaiw ) !jhan: this call to define air may be redundant From b7068d482d05430940a5fd6febd9be0e4953f13c Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh Date: Tue, 16 Jul 2024 18:20:55 +1000 Subject: [PATCH 53/85] consistency_ice_veg_soil --- src/offline/cable_input.F90 | 9 +- src/offline/cable_parameters.F90 | 190 +++++++++++++++++++++++++++++- src/params/grid_constants_cbl.F90 | 2 + 3 files changed, 197 insertions(+), 4 deletions(-) diff --git a/src/offline/cable_input.F90 b/src/offline/cable_input.F90 index 6fe79b6d9..ee0c8cb88 100644 --- a/src/offline/cable_input.F90 +++ b/src/offline/cable_input.F90 @@ -2818,15 +2818,18 @@ SUBROUTINE load_parameters(met,air,ssnow,veg,climate,bgc,soil,canopy,rough,rad, END IF WRITE(logn,*) - !| 9. Construct derived parameters and zero initialisations for the + !> 9. Ensure the consistency of ice points between soil and vegetation + CALL consistency_ice_veg_soil(soil, veg) + + !| 10. Construct derived parameters and zero initialisations for the ! groundwater routine, regardless of where parameters and other ! initialisations have loaded from CALL derived_parameters(soil,sum_flux,bal,ssnow,veg,rough) - !> 10. Check for basic inconsistencies in parameter values + !> 11. Check for basic inconsistencies in parameter values CALL check_parameter_values(soil,veg,ssnow) - !> 11. Write per-site parameter values to log file if requested + !> 12. Write per-site parameter values to log file if requested CALL report_parameters(logn,soil,veg,bgc,rough,ssnow,canopy, & casamet,casapool,casaflux,phen,vegparmnew,verbose) diff --git a/src/offline/cable_parameters.F90 b/src/offline/cable_parameters.F90 index 534f73d43..29d20fdfb 100644 --- a/src/offline/cable_parameters.F90 +++ b/src/offline/cable_parameters.F90 @@ -67,7 +67,7 @@ MODULE cable_param_module PRIVATE PUBLIC get_default_params, write_default_params, derived_parameters, & check_parameter_values, report_parameters, parID_type, & - write_cnp_params + write_cnp_params, consistency_ice_veg_soil INTEGER :: patches_in_parfile=4 ! # patches in default global parameter ! file @@ -2064,7 +2064,195 @@ SUBROUTINE check_parameter_values(soil, veg, ssnow) END WHERE END SUBROUTINE check_parameter_values + + !=============================================================================== + + SUBROUTINE consistency_ice_veg_soil(soil, veg) + ! Ensure that when an active patch has a veg type of ice then its soil type is also ice and vice versa + ! Any change effected to enforce this consistency includes correcting the appropriate paramter values + + USE grid_constants_mod_cbl, ONLY : ICE_SoilType, ICE_VegType + USE cable_phys_constants_mod, ONLY : csice, density_ice + + TYPE (soil_parameter_type), INTENT(INOUT) :: soil ! soil parameter data + TYPE (veg_parameter_type), INTENT(INOUT) :: veg ! vegetation parameter + + INTEGER :: i, j, k, kIVP + LOGICAL :: LIceVegPatch + + + LIceVegPatch = .FALSE. + + look_for_ice_veg_patch: DO i = 1, mland ! loop over all gridcells + DO j = 1, landpt(i)%nap ! loop over all active patches in every gridcell + + k = landpt(i)%cstart + j - 1 ! absolute position of active veg patch + + IF(veg%iveg(k) == ICE_VegType) THEN ! check to see if there is at least one ice veg patch already + LIceVegPatch = .TRUE. + kIVP = k ! remember which patch it is + EXIT look_for_ice_veg_patch ! exit as we only need to find one ice veg patch + END IF + + END DO + END DO look_for_ice_veg_patch + + + DO i = 1, mland ! loop over all gridcells + DO j = 1, landpt(i)%nap ! loop over all active patches in every gridcell + + k = landpt(i)%cstart + j - 1 ! absolute position of active patch + + IF(soil%isoilm(k) == ICE_SoilType) THEN ! check to see if ice soil patch + + WRITE(*,*) 'SUBROUTINE load_parameters:' + WRITE(*,*) 'At land point number ', i + WRITE(*,*) 'And patch number ', k + WRITE(*,*) 'isoilm is ICE_SoilType' + WRITE(*,*) 'Set rhosoil = density_ice from CABLE physical constants' + WRITE(*,*) 'Set css = csice from CABLE physical constants' + + soil%rhosoil(k) = density_ice + soil%css(k) = csice + + END IF + + END DO + END DO + + + DO i = 1, mland ! loop over all gridcells + DO j = 1, landpt(i)%nap ! loop over all active patches in every gridcell + + k = landpt(i)%cstart + j - 1 ! absolute position of active patch + + IF((veg%iveg(k) == ICE_VegType) .AND. (soil%isoilm(k) /= ICE_SoilType)) THEN + + + WRITE(*,*) 'SUBROUTINE load_parameters:' + WRITE(*,*) 'At land point number ', i + WRITE(*,*) 'And patch number ', k + WRITE(*,*) 'iveg is ICE_VegType but isoilm is not ICE_SoilType' + WRITE(*,*) 'Changed isoilm to ICE_SoilType with appropriate parameter corrections' + + soil%isoilm(k) = ICE_SoilType + + ! correct appropriately parameters and derived parameters + + soil%rhosoil(k) = density_ice + soil%css(k) = csice + + + ELSE IF ((veg%iveg(k) /= ICE_VegType) .AND. (soil%isoilm(k) == ICE_SoilType)) THEN + + WRITE(*,*) 'SUBROUTINE load_parameters:' + WRITE(*,*) 'At land point number ', i + WRITE(*,*) 'And patch number ', k + WRITE(*,*) 'iveg is not ICE_VegType but isoilm is ICE_SoilType' + WRITE(*,*) 'Changed iveg to ICE_VegType with appropriate parameter corrections' + + + veg%iveg(k) = ICE_VegType + + ! correct appropriately parameters and derived parameters + + IF (LIceVegPatch) THEN ! if there is at least one ice veg patch already + ! use the parameter values from this ice veg patch for the new ice veg patch + + veg%frac4(k) = veg%frac4(kIVP) + veg%taul(k,1) = veg%taul(kIVP,1) + veg%taul(k,2) = veg%taul(kIVP,2) + veg%refl(k,1) = veg%refl(kIVP,1) + veg%refl(k,2) = veg%refl(kIVP,2) + veg%canst1(k) = veg%canst1(kIVP) + veg%dleaf(k) = veg%dleaf(kIVP) + veg%vcmax(k) = veg%vcmax(kIVP) + veg%ejmax(k) = veg%ejmax(kIVP) + veg%hc(k) = veg%hc(kIVP) + veg%xfang(k) = veg%xfang(kIVP) + veg%vbeta(k) = veg%vbeta(kIVP) + veg%xalbnir(k) = veg%xalbnir(kIVP) + veg%rp20(k) = veg%rp20(kIVP) + veg%rpcoef(k) = veg%rpcoef(kIVP) + veg%rs20(k) = veg%rs20(kIVP) + veg%shelrb(k) = veg%shelrb(kIVP) + veg%wai(k) = veg%wai(kIVP) + veg%a1gs(k) = veg%a1gs(kIVP) + veg%d0gs(k) = veg%d0gs(kIVP) + veg%vegcf(k) = veg%vegcf(kIVP) + veg%extkn(k) = veg%extkn(kIVP) + veg%tminvj(k) = veg%tminvj(kIVP) + veg%tmaxvj(k) = veg%tmaxvj(kIVP) + veg%g0(k) = veg%g0(kIVP) + veg%g1(k) = veg%g1(kIVP) + veg%a1gs(k) = veg%a1gs(kIVP) + veg%d0gs(k) = veg%d0gs(kIVP) + veg%alpha(k) = veg%alpha(kIVP) + veg%convex(k) = veg%convex(kIVP) + veg%cfrd(k) = veg%cfrd(kIVP) + veg%gswmin(k) = veg%gswmin(kIVP) + veg%conkc0(k) = veg%conkc0(kIVP) + veg%conko0(k) = veg%conko0(kIVP) + veg%ekc(k) = veg%ekc(kIVP) + veg%eko(k) = veg%eko(kIVP) + veg%rootbeta(k) = veg%rootbeta(kIVP) + veg%zr(k) = veg%zr(kIVP) + veg%clitt(k) = veg%clitt(kIVP) + + ELSE ! otherwise use default parameter values for ice + + veg%frac4(k) = vegin%frac4(ICE_VegType) + veg%taul(k,1) = vegin%taul1(ICE_VegType) + veg%taul(k,2) = vegin%taul2(ICE_VegType) + veg%refl(k,1) = vegin%refl1(ICE_VegType) + veg%refl(k,2) = vegin%refl2(ICE_VegType) + veg%canst1(k) = vegin%canst1(ICE_VegType) + veg%dleaf(k) = vegin%dleaf(ICE_VegType) + veg%vcmax(k) = vegin%vcmax(ICE_VegType) + veg%ejmax(k) = vegin%ejmax(ICE_VegType) + veg%hc(k) = vegin%hc(ICE_VegType) + veg%xfang(k) = vegin%xfang(ICE_VegType) + veg%vbeta(k) = vegin%vbeta(ICE_VegType) + veg%xalbnir(k) = vegin%xalbnir(ICE_VegType) + veg%rp20(k) = vegin%rp20(ICE_VegType) + veg%rpcoef(k) = vegin%rpcoef(ICE_VegType) + veg%rs20(k) = vegin%rs20(ICE_VegType) + veg%shelrb(k) = vegin%shelrb(ICE_VegType) + veg%wai(k) = vegin%wai(ICE_VegType) + veg%a1gs(k) = vegin%a1gs(ICE_VegType) + veg%d0gs(k) = vegin%d0gs(ICE_VegType) + veg%vegcf(k) = vegin%vegcf(ICE_VegType) + veg%extkn(k) = vegin%extkn(ICE_VegType) + veg%tminvj(k) = vegin%tminvj(ICE_VegType) + veg%tmaxvj(k) = vegin%tmaxvj(ICE_VegType) + veg%g0(k) = vegin%g0(ICE_VegType) + veg%g1(k) = vegin%g1(ICE_VegType) + veg%a1gs(k) = vegin%a1gs(ICE_VegType) + veg%d0gs(k) = vegin%d0gs(ICE_VegType) + veg%alpha(k) = vegin%alpha(ICE_VegType) + veg%convex(k) = vegin%convex(ICE_VegType) + veg%cfrd(k) = vegin%cfrd(ICE_VegType) + veg%gswmin(k) = vegin%gswmin(ICE_VegType) + veg%conkc0(k) = vegin%conkc0(ICE_VegType) + veg%conko0(k) = vegin%conko0(ICE_VegType) + veg%ekc(k) = vegin%ekc(ICE_VegType) + veg%eko(k) = vegin%eko(ICE_VegType) + veg%rootbeta(k) = vegin%rootbeta(ICE_VegType) + veg%zr(k) = vegin%zr(ICE_VegType) + veg%clitt(k) = vegin%clitt(ICE_VegType) + + END IF + + END IF + + END DO + END DO + + + END SUBROUTINE consistency_ice_veg_soil + !=============================================================================== + SUBROUTINE report_parameters(logn, soil, veg, bgc, rough, & ssnow, canopy, casamet, casapool, casaflux, & phen, vegparmnew, verbose ) diff --git a/src/params/grid_constants_cbl.F90 b/src/params/grid_constants_cbl.F90 index 2ae2aa6eb..8d2ec313a 100644 --- a/src/params/grid_constants_cbl.F90 +++ b/src/params/grid_constants_cbl.F90 @@ -47,6 +47,8 @@ MODULE grid_constants_mod_cbl INTEGER, PARAMETER :: ICE_SoilType = 9 ! SoilType Index (soilparm_cable.nml JAC) INTEGER, PARAMETER :: lakes_cable = 16! SoilType Index (soilparm_cable.nml JAC) +INTEGER, PARAMETER :: ICE_VegType = 17 ! permanent ice index for veg + INTEGER, PARAMETER :: mf = 2 ! # leaves (sunlit, shaded) INTEGER, PARAMETER :: niter = 4 ! number of iterations for za/L From 0a69346fc8ed8cda575ce612481bf3929ddea2a3 Mon Sep 17 00:00:00 2001 From: Ian Harman Date: Wed, 17 Jul 2024 13:29:10 +1000 Subject: [PATCH 54/85] reversion of original %epot for connection to ACCESS; new %epot for offline output. fixes #346 --- src/science/canopy/cable_canopy.F90 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/science/canopy/cable_canopy.F90 b/src/science/canopy/cable_canopy.F90 index fe5cdaff8..066338c68 100644 --- a/src/science/canopy/cable_canopy.F90 +++ b/src/science/canopy/cable_canopy.F90 @@ -645,7 +645,7 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima !radiation weighted soil and canopy contributions !Note: If PM routine corrected then match changes here canopy%epot = ((1.-rad%transd)*canopy%fevw_pot + & - rad%transd*ssnow%potev/ssnow%cls) * dels/air%rlam + rad%transd*ssnow%potev*ssnow%cls) * dels/air%rlam @@ -668,6 +668,10 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima ENDDO + ! INH #335 - we don't need to weight components of %epot by %transd + ! however coupled model uses %wetfac_cs so overwrite here before testing in ACCESS + canopy%epot = (canopy%fevw_pot + ssnow%potev/ssnow%cls) * dels/air%rlam + CALL update_zetar( mp, iterplus, NITER, canopy%zetar, iter, nrb, CVONK, CGRAV, CCAPP, & CLAI_THRESH, CZETmul, CZETPOS, CZETNEG, & cable_user%soil_struc, air%rho, met%tk, met%fsd, & From a0d4fe21095ee7895fb4aba3ab951ce5898aa416 Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Thu, 25 Jul 2024 13:46:50 +1000 Subject: [PATCH 55/85] (#351) - define sum_rad_gradis and sum_rad_rniso before wetLeaf call. --- src/science/canopy/cable_canopy.F90 | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/science/canopy/cable_canopy.F90 b/src/science/canopy/cable_canopy.F90 index 8514645a6..13a87e568 100644 --- a/src/science/canopy/cable_canopy.F90 +++ b/src/science/canopy/cable_canopy.F90 @@ -234,6 +234,9 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima canopy%zetash(:,1) = CZETA0 ! stability correction terms canopy%zetash(:,2) = CZETPOS + 1 + sum_rad_rniso = SUM(rad%rniso,2) + sum_rad_gradis = SUM(rad%gradis,2) + DO iter = 1, NITER @@ -389,8 +392,6 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima hcy = 0.0 ! init current estimate lat heat ecy = rny - hcy ! init current estimate lat heat - sum_rad_rniso = SUM(rad%rniso,2) - CALL dryLeaf( dels, rad, rough, air, met, & veg, canopy, soil, ssnow, dsx, & fwsoil, tlfx, tlfy, ecy, hcy, & @@ -418,8 +419,6 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima canopy%fnv = REAL(ftemp) ! canopy rad. temperature calc from long-wave rad. balance - sum_rad_gradis = SUM(rad%gradis,2) - DO j=1,mp IF ( canopy%vlaiw(j) > CLAI_THRESH .AND. & From a9db7aa811a6ec98e49c4c5431169d73048488b0 Mon Sep 17 00:00:00 2001 From: Ian Harman Date: Thu, 25 Jul 2024 13:58:58 +1000 Subject: [PATCH 56/85] reverting lake fix to use field capacity sfc not saturation ssat --- src/offline/cable.nml | 4 ++-- src/offline/cbl_model_driver_offline.F90 | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/offline/cable.nml b/src/offline/cable.nml index 55c1343a3..537222fcd 100644 --- a/src/offline/cable.nml +++ b/src/offline/cable.nml @@ -1,6 +1,6 @@ &cable - filename%met = 'TumbaFluxnet.1.3_lake.nc' - filename%out = 'out_cable_lake.nc' + filename%met = 'TumbaFluxnet.1.3_met.nc' + filename%out = 'out_cable.nc' filename%log = 'log_cable.txt' filename%restart_in = ' ' filename%restart_out = './restart_out.nc' diff --git a/src/offline/cbl_model_driver_offline.F90 b/src/offline/cbl_model_driver_offline.F90 index 0425be125..b9dab3d99 100644 --- a/src/offline/cbl_model_driver_offline.F90 +++ b/src/offline/cbl_model_driver_offline.F90 @@ -106,15 +106,15 @@ SUBROUTINE cbm( ktau,dels, air, bgc, canopy, met, !iFor testing cable_user%soil_struc="default" -!At start of each time step ensure that lakes surface soil layer is fully saturated. +!At start of each time step ensure that lakes surface soil layer is at/above field capacity. !Diagnose any water needed to maintain this - this will be removed from !runoff, drainage and/or deepest soil layer in surfbv !For offline case retain the water imbalance between timesteps - permits !balance to be maintained in the longer term. This differs to the coupled model !where %wb_lake is zero'd each time step (and river outflow is rescaled) -WHERE( veg%iveg == lakes_cable .AND. ssnow%wb(:,1) < soil%ssat ) +WHERE( veg%iveg == lakes_cable .AND. ssnow%wb(:,1) < soil%sfc ) ssnow%wbtot1(:) = REAL( ssnow%wb(:,1) ) * density_liq * soil%zse(1) - ssnow%wb(:,1) = soil%ssat + ssnow%wb(:,1) = soil%sfc ssnow%wbtot2 = REAL( ssnow%wb(:,1) ) * density_liq * soil%zse(1) ENDWHERE ssnow%wb_lake = ssnow%wb_lake + MAX( ssnow%wbtot2 - ssnow%wbtot1, 0.) From 315b899be1ad36a03e408cd2efed4226ce1f688c Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh <98803952+rkutteh@users.noreply.github.com> Date: Thu, 25 Jul 2024 14:37:17 +1000 Subject: [PATCH 57/85] Update src/science/gw_hydro/cable_gw_hydro.F90 Co-authored-by: Claire Carouge --- src/science/gw_hydro/cable_gw_hydro.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/science/gw_hydro/cable_gw_hydro.F90 b/src/science/gw_hydro/cable_gw_hydro.F90 index ead905593..0b63c9c15 100644 --- a/src/science/gw_hydro/cable_gw_hydro.F90 +++ b/src/science/gw_hydro/cable_gw_hydro.F90 @@ -1,6 +1,6 @@ !============================================================================== ! This source code is part of the -! Austrian Community Atmosphere Biosphere Land Exchange (CABLE) model. +! Australian Community Atmosphere Biosphere Land Exchange (CABLE) model. ! This work is licensed under the CABLE Academic User Licence Agreement ! (the "Licence"). ! You may not use this file except in compliance with the Licence. From f430650ece9e5f767104d63e0a386b4610f1a346 Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh <98803952+rkutteh@users.noreply.github.com> Date: Thu, 25 Jul 2024 14:41:29 +1000 Subject: [PATCH 58/85] Update src/science/gw_hydro/cable_gw_hydro.F90 Co-authored-by: Claire Carouge --- src/science/gw_hydro/cable_gw_hydro.F90 | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/science/gw_hydro/cable_gw_hydro.F90 b/src/science/gw_hydro/cable_gw_hydro.F90 index 0b63c9c15..777093b1c 100644 --- a/src/science/gw_hydro/cable_gw_hydro.F90 +++ b/src/science/gw_hydro/cable_gw_hydro.F90 @@ -109,18 +109,6 @@ SUBROUTINE GWsoilfreeze(dels, soil, ssnow) ! if acceptable this routine does the same thing but with r_2 soil params ! if max_ice_frac always set to frozen_limit and tgg_tmp is always CTFRZ ! - !## Method - ! - ! The subroutine takes a float as input, prints its value then adds 2/3, - ! prints it and returns it. - ! - ! The equation used is: - ! \[ myarg = myarg + !frac{2.}{3.} \] - ! - !## References - ! - ! The guidelines for documentation can be found in: - ! [CABLE developer guide](https://cable-lsm.github.io/CABLE/developer_guide/doc_guide/science_doc/) REAL, INTENT(IN) :: dels ! integration time step (s) TYPE(soil_snow_type), INTENT(INOUT) :: ssnow From 1c445811e2cb74232cef6f36e0895c2dda83eb13 Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh <98803952+rkutteh@users.noreply.github.com> Date: Thu, 25 Jul 2024 14:42:43 +1000 Subject: [PATCH 59/85] Update src/science/gw_hydro/cable_gw_hydro.F90 Co-authored-by: Claire Carouge --- src/science/gw_hydro/cable_gw_hydro.F90 | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/science/gw_hydro/cable_gw_hydro.F90 b/src/science/gw_hydro/cable_gw_hydro.F90 index 777093b1c..29a4b774e 100644 --- a/src/science/gw_hydro/cable_gw_hydro.F90 +++ b/src/science/gw_hydro/cable_gw_hydro.F90 @@ -905,18 +905,6 @@ SUBROUTINE soil_snow_gw(dels, soil, ssnow, canopy, met, bal, veg) ! This is the main subroutine for Mark Decker's new hydrology scheme. ! This subroutine should be called in subroutine cbm but not yet. ! - !## Method - ! - ! The subroutine takes a float as input, prints its value then adds 2/3, - ! prints it and returns it. - ! - ! The equation used is: - ! \[ myarg = myarg + !frac{2.}{3.} \] - ! - !## References - ! - ! The guidelines for documentation can be found in: - ! [CABLE developer guide](https://cable-lsm.github.io/CABLE/developer_guide/doc_guide/science_doc/) ! ! Inputs: From 6fac982362a111210d807955eb45e25fdd66d27e Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh <98803952+rkutteh@users.noreply.github.com> Date: Thu, 25 Jul 2024 15:35:56 +1000 Subject: [PATCH 60/85] Update src/science/gw_hydro/cable_gw_hydro.F90 --- src/science/gw_hydro/cable_gw_hydro.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/science/gw_hydro/cable_gw_hydro.F90 b/src/science/gw_hydro/cable_gw_hydro.F90 index 29a4b774e..35d377f69 100644 --- a/src/science/gw_hydro/cable_gw_hydro.F90 +++ b/src/science/gw_hydro/cable_gw_hydro.F90 @@ -1385,7 +1385,7 @@ END SUBROUTINE calc_equilibrium_water_content SUBROUTINE calc_srf_wet_fraction(ssnow,soil,met,veg) !* Calculate the wet fraction of the surafce ! following [Decker, 2015](http://doi.wiley.com/10.1002/2015MS000507) - !* This subrountine is called in subrountine surf_wetness_fact in cable_canopy.F90 + IMPLICIT NONE TYPE(soil_snow_type), INTENT(INOUT) :: ssnow ! soil+snow variables From 45251dd5e4b13c74f6e7e73e6302006ade6bcf11 Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh <98803952+rkutteh@users.noreply.github.com> Date: Thu, 25 Jul 2024 15:43:37 +1000 Subject: [PATCH 61/85] Update src/offline/cable_parameters.F90 --- src/offline/cable_parameters.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/offline/cable_parameters.F90 b/src/offline/cable_parameters.F90 index e69ead88c..be0f14f18 100644 --- a/src/offline/cable_parameters.F90 +++ b/src/offline/cable_parameters.F90 @@ -1798,7 +1798,7 @@ SUBROUTINE derived_parameters(soil, sum_flux, bal, ssnow, veg, rough) REAL(r_2), DIMENSION(:,:), ALLOCATABLE :: ssat_bounded,rho_soil_bulk ! added by rk4417 - phase2 ! line below inserted by rk4417 - phase2 - where(veg%iveg .eq. 17) soil%isoilm = 9 ! MMY@13April it says where iveg = ice, isoilm = permanent ice + ! soil_depth(1) = REAL(soil%zse(1),r_2) ! DO klev=2,ms From 7fdcd1166c4678ee5c4f11d908e10b96eeaf64bc Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh <98803952+rkutteh@users.noreply.github.com> Date: Thu, 25 Jul 2024 15:45:29 +1000 Subject: [PATCH 62/85] Update src/offline/cable_parameters.F90 --- src/offline/cable_parameters.F90 | 1 - 1 file changed, 1 deletion(-) diff --git a/src/offline/cable_parameters.F90 b/src/offline/cable_parameters.F90 index be0f14f18..6f6792d6f 100644 --- a/src/offline/cable_parameters.F90 +++ b/src/offline/cable_parameters.F90 @@ -1797,7 +1797,6 @@ SUBROUTINE derived_parameters(soil, sum_flux, bal, ssnow, veg, rough) REAL(r_2), DIMENSION(:,:), ALLOCATABLE :: ssat_bounded,rho_soil_bulk ! added by rk4417 - phase2 -! line below inserted by rk4417 - phase2 ! soil_depth(1) = REAL(soil%zse(1),r_2) From d8857aa1c781491b73b47a3dfbb20b98015a615e Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Thu, 25 Jul 2024 17:43:23 +1000 Subject: [PATCH 63/85] (#351) - Consistent use of sum_rad_gradis and sum_rad_rniso --- src/science/canopy/cable_canopy.F90 | 14 +++++++------- src/science/canopy/cbl_dryLeaf.F90 | 23 +++++++++++------------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/science/canopy/cable_canopy.F90 b/src/science/canopy/cable_canopy.F90 index 13a87e568..4a5827c8e 100644 --- a/src/science/canopy/cable_canopy.F90 +++ b/src/science/canopy/cable_canopy.F90 @@ -388,7 +388,7 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima ENDDO - rny = SUM(rad%rniso,2) ! init current estimate net rad + rny = sum_rad_rniso ! init current estimate net rad hcy = 0.0 ! init current estimate lat heat ecy = rny - hcy ! init current estimate lat heat @@ -396,7 +396,7 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima veg, canopy, soil, ssnow, dsx, & fwsoil, tlfx, tlfy, ecy, hcy, & rny, gbhu, gbhf, csx, cansat, & - ghwet, iter,climate ) + ghwet, iter,climate, sum_rad_gradis, sum_rad_rniso ) CALL wetLeaf( dels, & @@ -648,7 +648,7 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima - canopy%rniso = SUM(rad%rniso,2) + rad%qssabs + rad%transd*met%fld + & + canopy%rniso = sum_rad_rniso + rad%qssabs + rad%transd*met%fld + & (1.0-rad%transd)*CEMLEAF* & CSBOLTZ*met%tvrad**4 - CEMSOIL*CSBOLTZ*met%tvrad**4 @@ -1003,11 +1003,11 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima ssnow%dfe_dtg = ssnow%dfe_ddq * ssnow%ddq_dtg canopy%dgdtg = ssnow%dfn_dtg - ssnow%dfh_dtg - ssnow%dfe_dtg -bal%drybal = REAL(ecy+hcy) - SUM(rad%rniso,2) & - + CCAPP*Crmair*(tlfy-met%tk)*SUM(rad%gradis,2) ! YP nov2009 +bal%drybal = REAL(ecy+hcy) - sum_rad_rniso & + + CCAPP*Crmair*(tlfy-met%tk)*sum_rad_gradis ! YP nov2009 -bal%wetbal = canopy%fevw + canopy%fhvw - SUM(rad%rniso,2) * canopy%fwet & - + CCAPP*Crmair * (tlfy-met%tk) * SUM(rad%gradis,2) * & +bal%wetbal = canopy%fevw + canopy%fhvw - sum_rad_rniso * canopy%fwet & + + CCAPP*Crmair * (tlfy-met%tk) * sum_rad_gradis * & canopy%fwet ! YP nov2009 DEALLOCATE(cansat,gbhu) diff --git a/src/science/canopy/cbl_dryLeaf.F90 b/src/science/canopy/cbl_dryLeaf.F90 index 2ba5ced43..c9d5dea8c 100644 --- a/src/science/canopy/cbl_dryLeaf.F90 +++ b/src/science/canopy/cbl_dryLeaf.F90 @@ -11,7 +11,7 @@ SUBROUTINE dryLeaf( dels, rad, rough, air, met, & veg, canopy, soil, ssnow, dsx, & fwsoil, tlfx, tlfy, ecy, hcy, & rny, gbhu, gbhf, csx, & - cansat, ghwet, iter,climate ) + cansat, ghwet, iter,climate, sum_rad_gradis, sum_rad_rniso ) USE cable_def_types_mod USE cable_common_module @@ -71,6 +71,10 @@ SUBROUTINE dryLeaf( dels, rad, rough, air, met, & REAL, INTENT(IN) :: dels ! integration time step (s) + ! Sums of radiation quantities over rad bands + REAL, INTENT(IN) :: sum_rad_rniso(mp) + REAL, INTENT(IN) :: sum_rad_gradis(mp) + !local variables REAL, PARAMETER :: & co2cp3 = 0.0, & ! CO2 compensation pt C3 @@ -88,8 +92,6 @@ SUBROUTINE dryLeaf( dels, rad, rough, air, met, & deltlfy, & ! del temp successive iter. gras, & ! Grashof coeff evapfb, & ! - sum_rad_rniso, & ! - sum_rad_gradis,& ! gwwet, & ! cond for water for a wet canopy ghrwet, & ! wet canopy cond: heat & thermal rad sum_gbh, & ! @@ -170,13 +172,12 @@ SUBROUTINE dryLeaf( dels, rad, rough, air, met, & lower_limit2 = rad%scalex * gsw_term gswmin = MAX(1.e-6,lower_limit2) - gw = 1.0e-3 ! default values of conductance gh = 1.0e-3 ghr= 1.0e-3 rdx = 0.0 anx = 0.0 - rnx = SUM(rad%rniso,2) + rnx = sum_rad_rniso abs_deltlf = 999.0 @@ -185,7 +186,7 @@ SUBROUTINE dryLeaf( dels, rad, rough, air, met, & hcx = 0.0 ! init sens heat iteration memory variable hcy = 0.0 rdy = 0.0 - ecx = SUM(rad%rniso,2) ! init lat heat iteration memory variable + ecx = sum_rad_rniso ! init lat heat iteration memory variable tlfxx = tlfx psycst(:,:) = SPREAD(air%psyc,2,mf) canopy%fevc = 0.0 @@ -197,8 +198,6 @@ SUBROUTINE dryLeaf( dels, rad, rough, air, met, & canopy%fevw = 0.0 canopy%fhvw = 0.0 sum_gbh = SUM((gbhu+gbhf),2) - sum_rad_rniso = SUM(rad%rniso,2) - sum_rad_gradis = SUM(rad%gradis,2) DO kk=1,mp @@ -528,17 +527,17 @@ SUBROUTINE dryLeaf( dels, rad, rough, air, met, & ENDIF ! Update canopy sensible heat flux: - hcx(i) = (SUM(rad%rniso(i,:))-ecx(i) & + hcx(i) = (sum_rad_rniso(i)-ecx(i) & - Ccapp*Crmair*(met%tvair(i)-met%tk(i)) & - * SUM(rad%gradis(i,:))) & + * sum_rad_gradis(i)) & * SUM(gh(i,:))/ SUM(ghr(i,:)) ! Update leaf temperature: tlfx(i)=met%tvair(i)+REAL(hcx(i))/(Ccapp*Crmair*SUM(gh(i,:))) ! Update net radiation for canopy: - rnx(i) = SUM( rad%rniso(i,:)) - & + rnx(i) = sum_rad_rniso(i) - & CCAPP * Crmair *( tlfx(i)-met%tk(i) ) * & - SUM( rad%gradis(i,:) ) + sum_rad_gradis(i) ! Update leaf surface vapour pressure deficit: dsx(i) = met%dva(i) + air%dsatdk(i) * (tlfx(i)-met%tvair(i)) From fb4cc3b5d0e5f81591ae39cc185e34699b1a47e3 Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh <98803952+rkutteh@users.noreply.github.com> Date: Thu, 25 Jul 2024 18:22:02 +1000 Subject: [PATCH 64/85] Update src/offline/cable_parameters.F90 Co-authored-by: Claire Carouge --- src/offline/cable_parameters.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/offline/cable_parameters.F90 b/src/offline/cable_parameters.F90 index 6f6792d6f..2780d8baf 100644 --- a/src/offline/cable_parameters.F90 +++ b/src/offline/cable_parameters.F90 @@ -2288,7 +2288,7 @@ SUBROUTINE derived_parameters(soil, sum_flux, bal, ssnow, veg, rough) END DO bal%osnowd0 = ssnow%osnowd - !! vh_js !! comment out hide% condition + ! vh_js ! comment out hide% condition ! IF (hide%Ticket49Bug6) THEN IF(cable_user%SOIL_STRUC=='sli') THEN From f6a95b2a80c4ede52b9f8a3e855078924b07247d Mon Sep 17 00:00:00 2001 From: Ian Harman Date: Tue, 30 Jul 2024 16:08:57 +1000 Subject: [PATCH 65/85] fix bug in spitter call, use total SW down and apply equally to VIS&NIR; fixes #355 --- src/science/radiation/cbl_init_radiation.F90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/science/radiation/cbl_init_radiation.F90 b/src/science/radiation/cbl_init_radiation.F90 index a32a6d1f0..0368dc0da 100644 --- a/src/science/radiation/cbl_init_radiation.F90 +++ b/src/science/radiation/cbl_init_radiation.F90 @@ -378,8 +378,9 @@ SUBROUTINE BeamFraction( RadFbeam, mp, nrb, Cpi,Ccoszen_tols_huge, metDoy, & ! Define beam fraction, fbeam: -RadFbeam(:,1) = spitter(mp, cpi, metDoy, coszen, SW_down(:,1)) -RadfBeam(:,2) = spitter(mp, cpi, metDoy, coszen, SW_down(:,2)) +! #355 beam fraction defined using total SW_down; applies to VIS&NIR equally +RadFbeam(:,1) = spitter(mp, cpi, metDoy, coszen, SW_down(:,1)+SW_down(:,2)) +RadFbeam(:,2) = RadFbeam(:,1) ! coszen is set during met data read in. WHERE (coszen < Ccoszen_tols_huge ) From 00c70ec2f07aa635ba61063932b3869e2e4ffcef Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Fri, 2 Aug 2024 16:06:13 +1000 Subject: [PATCH 66/85] (#359) - Bug fix: outputs broken in MPI implementation --- src/offline/cable_mpimaster.F90 | 6 +++++- src/offline/cable_mpiworker.F90 | 10 ++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/offline/cable_mpimaster.F90 b/src/offline/cable_mpimaster.F90 index 0c868afa3..97ab7b30e 100644 --- a/src/offline/cable_mpimaster.F90 +++ b/src/offline/cable_mpimaster.F90 @@ -159,7 +159,7 @@ SUBROUTINE mpidrv_master (comm) verbose, fixedCO2,output,check,patchout, & patch_type,landpt,soilparmnew,& defaultLAI, sdoy, smoy, syear, timeunits, exists, output, & - latitude,longitude, calendar + latitude,longitude, calendar, set_group_output_values USE cable_common_module, ONLY: ktau_gl, kend_gl, knode_gl, cable_user, & cable_runtime, fileName, myhome, & redistrb, wiltParam, satuParam, CurYear, & @@ -407,6 +407,10 @@ SUBROUTINE mpidrv_master (comm) ENDIF ! INITIALISATION depending on nml settings + ! Initialise flags to output individual variables according to group + ! options from the namelist file + CALL set_group_output_values() + IF (TRIM(cable_user%MetType) .EQ. 'gswp' .OR. TRIM(cable_user%MetType) .EQ. 'gswp3') THEN IF ( CABLE_USER%YearStart.EQ.0 .AND. ncciy.GT.0) THEN CABLE_USER%YearStart = ncciy diff --git a/src/offline/cable_mpiworker.F90 b/src/offline/cable_mpiworker.F90 index 0f33ede84..18dd2233d 100644 --- a/src/offline/cable_mpiworker.F90 +++ b/src/offline/cable_mpiworker.F90 @@ -127,13 +127,14 @@ SUBROUTINE mpidrv_worker (comm) USE cable_IO_vars_module, ONLY: logn,gswpfile,ncciy,leaps, globalMetfile, & verbose, fixedCO2,output,check,patchout, & patch_type,soilparmnew,& - defaultLAI, wlogn + defaultLAI, wlogn, NO_CHECK USE cable_common_module, ONLY: ktau_gl, kend_gl, knode_gl, cable_user, & cable_runtime, filename, myhome, & redistrb, wiltParam, satuParam, CurYear, & IS_LEAPYEAR, calcsoilalbedo, & kwidth_gl, gw_params - USE casa_ncdf_module, ONLY: is_casa_time + USE cable_checks_module, ONLY: constant_check_range + USE casa_ncdf_module, ONLY: is_casa_time USE cable_input_module, ONLY: open_met_file,load_parameters, & get_met_data,close_met_file USE cable_output_module, ONLY: create_restart,open_output_file, & @@ -463,6 +464,11 @@ SUBROUTINE mpidrv_worker (comm) WRITE(wlogn,*) ' wb min',MINVAL(ssnow%wb),MINLOC(ssnow%wb) CALL flush(wlogn) + IF (check%ranges /= NO_CHECK) THEN + WRITE (*, *) "Checking parameter ranges" + CALL constant_check_range(soil, veg, 0, met) + END IF + IF (cable_user%call_climate) THEN CALL worker_climate_types(comm, climate, ktauday ) ENDIF From 93b16a1160193b112b180fa560e0ab8dcd9412be Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Tue, 6 Aug 2024 09:42:27 +1000 Subject: [PATCH 67/85] (#359) - Set logn for workers --- src/offline/cable_mpiworker.F90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/offline/cable_mpiworker.F90 b/src/offline/cable_mpiworker.F90 index 18dd2233d..db8cb68f6 100644 --- a/src/offline/cable_mpiworker.F90 +++ b/src/offline/cable_mpiworker.F90 @@ -321,6 +321,8 @@ SUBROUTINE mpidrv_worker (comm) WRITE(cRank,FMT='(I4.4)')rank wlogn = 1000+rank OPEN(wlogn,FILE="cable_log_"//cRank,STATUS="REPLACE") + logn = wlogn + write(wlogn,*) 'ccc logn, wlogn values: ', logn, wlogn ELSE wlogn = 1000 OPEN(wlogn, FILE="/dev/null") @@ -465,7 +467,7 @@ SUBROUTINE mpidrv_worker (comm) CALL flush(wlogn) IF (check%ranges /= NO_CHECK) THEN - WRITE (*, *) "Checking parameter ranges" + WRITE (wlogn, *) "Checking parameter ranges" CALL constant_check_range(soil, veg, 0, met) END IF From 335aa6f563e919ee8d62ec495aa621178abb7552 Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Tue, 6 Aug 2024 10:32:40 +1000 Subject: [PATCH 68/85] (#359) - Removing wlogn, using logn instead for workers and master --- src/offline/cable_driver.F90 | 3 +- src/offline/cable_iovars.F90 | 2 - src/offline/cable_mpiworker.F90 | 106 ++++++++++++------------ src/offline/casa_cable.F90 | 3 - src/science/casa-cnp/bgcdriver.F90 | 2 - src/science/gw_hydro/cable_gw_hydro.F90 | 5 +- src/science/pop/POP.F90 | 2 - src/science/sli/cable_sli_main.F90 | 4 +- src/science/sli/cable_sli_solve.F90 | 60 +++++++------- src_pop/core/biogeochem/POP.F90 | 2 - src_pop/core/biogeochem/POPLUC.F90 | 2 +- src_pop/core/biogeochem/casa_cnp.F90 | 1 - 12 files changed, 87 insertions(+), 105 deletions(-) diff --git a/src/offline/cable_driver.F90 b/src/offline/cable_driver.F90 index f786ede8e..5d8ec690c 100644 --- a/src/offline/cable_driver.F90 +++ b/src/offline/cable_driver.F90 @@ -163,9 +163,8 @@ PROGRAM cable_offline_driver NRRRR, & ! ctime, & ! day count for casacnp LOY, & ! days in year - count_sum_casa, & ! number of time steps over which casa pools & + count_sum_casa ! number of time steps over which casa pools & !and fluxes are aggregated (for output) - wlogn = 10001 REAL :: dels ! time step size in seconds diff --git a/src/offline/cable_iovars.F90 b/src/offline/cable_iovars.F90 index caf711247..15e953b95 100644 --- a/src/offline/cable_iovars.F90 +++ b/src/offline/cable_iovars.F90 @@ -25,8 +25,6 @@ MODULE cable_IO_vars_module PUBLIC PRIVATE r_2, mvtype, mstype - !mrd561 debug - INTEGER :: wlogn ! ============ Timing variables ===================== REAL :: shod ! start time hour-of-day diff --git a/src/offline/cable_mpiworker.F90 b/src/offline/cable_mpiworker.F90 index db8cb68f6..f240e557d 100644 --- a/src/offline/cable_mpiworker.F90 +++ b/src/offline/cable_mpiworker.F90 @@ -111,7 +111,7 @@ MODULE cable_mpiworker INTEGER :: restart_t ! worker's logfile unit - !INTEGER :: wlogn + !INTEGER :: logn !debug moved to iovars -- easy to pass around PUBLIC :: mpidrv_worker @@ -127,7 +127,7 @@ SUBROUTINE mpidrv_worker (comm) USE cable_IO_vars_module, ONLY: logn,gswpfile,ncciy,leaps, globalMetfile, & verbose, fixedCO2,output,check,patchout, & patch_type,soilparmnew,& - defaultLAI, wlogn, NO_CHECK + defaultLAI, NO_CHECK USE cable_common_module, ONLY: ktau_gl, kend_gl, knode_gl, cable_user, & cable_runtime, filename, myhome, & redistrb, wiltParam, satuParam, CurYear, & @@ -319,13 +319,11 @@ SUBROUTINE mpidrv_worker (comm) IF ( CABLE_USER%LogWorker ) THEN CALL MPI_Comm_rank (comm, rank, ierr) WRITE(cRank,FMT='(I4.4)')rank - wlogn = 1000+rank - OPEN(wlogn,FILE="cable_log_"//cRank,STATUS="REPLACE") - logn = wlogn - write(wlogn,*) 'ccc logn, wlogn values: ', logn, wlogn + logn = 1000+rank + OPEN(logn,FILE="cable_log_"//cRank,STATUS="REPLACE") ELSE - wlogn = 1000 - OPEN(wlogn, FILE="/dev/null") + logn = 1000 + OPEN(logn, FILE="/dev/null") ENDIF ! INITIALISATION depending on nml settings @@ -461,13 +459,13 @@ SUBROUTINE mpidrv_worker (comm) & rough,rad,sum_flux,bal) !mrd561 debug - WRITE(wlogn,*) ' ssat_vec min',MINVAL(soil%ssat_vec),MINLOC(soil%ssat_vec) - WRITE(wlogn,*) ' sfc_vec min',MINVAL(soil%sfc_vec),MINLOC(soil%sfc_vec) - WRITE(wlogn,*) ' wb min',MINVAL(ssnow%wb),MINLOC(ssnow%wb) - CALL flush(wlogn) + WRITE(logn,*) ' ssat_vec min',MINVAL(soil%ssat_vec),MINLOC(soil%ssat_vec) + WRITE(logn,*) ' sfc_vec min',MINVAL(soil%sfc_vec),MINLOC(soil%sfc_vec) + WRITE(logn,*) ' wb min',MINVAL(ssnow%wb),MINLOC(ssnow%wb) + CALL flush(logn) IF (check%ranges /= NO_CHECK) THEN - WRITE (wlogn, *) "Checking parameter ranges" + WRITE (logn, *) "Checking parameter ranges" CALL constant_check_range(soil, veg, 0, met) END IF @@ -509,9 +507,9 @@ SUBROUTINE mpidrv_worker (comm) IF ( CABLE_USER%CASA_DUMP_READ .OR. CABLE_USER%CASA_DUMP_WRITE ) & CALL worker_casa_dump_types(comm, casamet, casaflux, phen, climate) - WRITE(wlogn,*) 'cable_mpiworker, POPLUC: ', CABLE_USER%POPLUC + WRITE(logn,*) 'cable_mpiworker, POPLUC: ', CABLE_USER%POPLUC WRITE(*,*) 'cable_mpiworker, POPLUC: ', CABLE_USER%POPLUC - CALL flush(wlogn) + CALL flush(logn) IF ( CABLE_USER%POPLUC ) & CALL worker_casa_LUC_types( comm, casapool, casabal) @@ -544,7 +542,7 @@ SUBROUTINE mpidrv_worker (comm) IF( icycle>0 .AND. spincasa) THEN - WRITE(wlogn,*) 'EXT spincasacnp enabled with mloop= ', mloop + WRITE(logn,*) 'EXT spincasacnp enabled with mloop= ', mloop CALL worker_spincasacnp(dels,kstart,kend,mloop,veg,soil,casabiome,casapool, & casaflux,casamet,casabal,phen,POP,climate,LALLOC, icomm, ocomm) SPINconv = .FALSE. @@ -599,8 +597,8 @@ SUBROUTINE mpidrv_worker (comm) ! increment total timstep counter ktau_tot = ktau_tot + 1 - WRITE(wlogn,*) 'ktau -',ktau_tot - CALL flush(wlogn) + WRITE(logn,*) 'ktau -',ktau_tot + CALL flush(logn) ! globally (WRT code) accessible kend through USE cable_common_module ktau_gl = ktau_gl + 1 @@ -639,7 +637,7 @@ SUBROUTINE mpidrv_worker (comm) ! MPI: receive casa_dump_data for this step from the master ELSEIF ( IS_CASA_TIME("dread", yyyy, ktau, kstart, koffset, & - kend, ktauday, wlogn) ) THEN + kend, ktauday, logn) ) THEN CALL MPI_Recv (MPI_BOTTOM, 1, casa_dump_t, 0, ktau_gl, icomm, stat, ierr) END IF @@ -689,8 +687,8 @@ SUBROUTINE mpidrv_worker (comm) ! ENDIF IF ( IS_CASA_TIME("write", yyyy, ktau, kstart, & - koffset, kend, ktauday, wlogn) ) THEN - ! write(wlogn,*), 'IN IS_CASA', casapool%cplant(:,1) + koffset, kend, ktauday, logn) ) THEN + ! write(logn,*), 'IN IS_CASA', casapool%cplant(:,1) ! CALL MPI_Send (MPI_BOTTOM,1, casa_t,0,ktau_gl,ocomm,ierr) ENDIF @@ -730,15 +728,15 @@ SUBROUTINE mpidrv_worker (comm) ! ENDIF - CALL flush(wlogn) + CALL flush(logn) IF (icycle >0 .AND. cable_user%CALL_POP) THEN IF (CABLE_USER%POPLUC) THEN - WRITE(wlogn,*), 'before MPI_Send casa_LUC' + WRITE(logn,*), 'before MPI_Send casa_LUC' ! worker sends casa updates required for LUC calculations here CALL MPI_Send (MPI_BOTTOM, 1, casa_LUC_t, 0, 0, ocomm, ierr) - WRITE(wlogn,*), 'after MPI_Send casa_LUC' + WRITE(logn,*), 'after MPI_Send casa_LUC' ! master calls LUCDriver here ! worker receives casa and POP updates CALL MPI_Recv( POP%pop_grid(1), POP%np, pop_t, 0, 0, icomm, stat, ierr ) @@ -790,7 +788,7 @@ SUBROUTINE mpidrv_worker (comm) ! ! Write to screen and log file: ! WRITE(*,'(A18,I3,A24)') ' Spinning up: run ',INT(ktau_tot/kend), & ! ' of data set complete...' - ! WRITE(wlogn,'(A18,I3,A24)') ' Spinning up: run ',INT(ktau_tot/kend), & + ! WRITE(logn,'(A18,I3,A24)') ' Spinning up: run ',INT(ktau_tot/kend), & ! ' of data set complete...' ! ! ! IF not 1st run through whole dataset: @@ -885,7 +883,7 @@ SUBROUTINE mpidrv_worker (comm) ! Close log file ! MPI: closes handle to /dev/null in workers - CLOSE(wlogn) + CLOSE(logn) RETURN @@ -6800,7 +6798,7 @@ SUBROUTINE worker_restart_type (comm, canopy, air) !mcd287 CALL MPI_Reduce (tsize, tsize, 1, MPI_INTEGER, MPI_SUM, 0, comm, ierr) WRITE(*,*) 'b4 reduce wk', tsize, MPI_DATATYPE_NULL, 1, MPI_INTEGER, MPI_SUM, 0, comm, ierr CALL flush(6) - !call flush(wlogn) + !call flush(logn) CALL MPI_Reduce (tsize, MPI_DATATYPE_NULL, 1, MPI_INTEGER, MPI_SUM, 0, comm, ierr) DEALLOCATE(types) @@ -7234,7 +7232,7 @@ SUBROUTINE worker_spincasacnp( dels,kstart,kend,mloop,veg,soil,casabiome,casapoo USE biogeochem_mod, ONLY : biogeochem !mrd561 debug - USE cable_IO_vars_module, ONLY: wlogn + USE cable_IO_vars_module, ONLY: logn IMPLICIT NONE !CLN CHARACTER(LEN=99), INTENT(IN) :: fcnpspin @@ -7576,11 +7574,11 @@ SUBROUTINE worker_spincasacnp( dels,kstart,kend,mloop,veg,soil,casabiome,casapoo ENDDO ! end of nyear ENDDO ! end of nloop - WRITE(wlogn,*) 'b4 MPI_SEND' + WRITE(logn,*) 'b4 MPI_SEND' CALL MPI_Send (MPI_BOTTOM, 1, casa_t, 0, 0, ocomm, ierr) - WRITE(wlogn,*) 'after MPI_SEND' + WRITE(logn,*) 'after MPI_SEND' IF(CABLE_USER%CALL_POP) CALL worker_send_pop (POP, ocomm) - WRITE(wlogn,*) 'cplant', casapool%cplant + WRITE(logn,*) 'cplant', casapool%cplant END SUBROUTINE worker_spincasacnp @@ -7604,7 +7602,7 @@ SUBROUTINE worker_CASAONLY_LUC( dels,kstart,kend,veg,soil,casabiome,casapool, & USE biogeochem_mod, ONLY : biogeochem !mrd561 debug - USE cable_IO_vars_module, ONLY: wlogn + USE cable_IO_vars_module, ONLY: logn IMPLICIT NONE !CLN CHARACTER(LEN=99), INTENT(IN) :: fcnpspin @@ -7703,45 +7701,45 @@ SUBROUTINE worker_CASAONLY_LUC( dels,kstart,kend,veg,soil,casabiome,casapool, & ENDIF IF(idoy==mdyear) THEN ! end of year - WRITE(wlogn,*) 'b4 MPI_SEND,casa_LUC_t', casapool%cplant(:,2) - CALL flush(wlogn) + WRITE(logn,*) 'b4 MPI_SEND,casa_LUC_t', casapool%cplant(:,2) + CALL flush(logn) CALL MPI_Send (MPI_BOTTOM, 1, casa_LUC_t, 0, 0, ocomm, ierr) - WRITE(wlogn,*) 'after MPI_SEND,casa_LUC_t', casapool%cplant(:,2) - CALL flush(wlogn) + WRITE(logn,*) 'after MPI_SEND,casa_LUC_t', casapool%cplant(:,2) + CALL flush(logn) StemNPP(:,1) = casaflux%stemnpp StemNPP(:,2) = 0.0 CALL MPI_Comm_rank (icomm, rank, ierr) - WRITE(wlogn,*) - WRITE(wlogn,*),'rank receiving pop_grid from master', rank -!$ write(wlogn,*) 'b4 MPI_Recv, pop_t cmass: ', POP%pop_grid%cmass_sum -!$ write(wlogn,*) 'b4 MPI_Recv, pop_t LU: ', POP%pop_grid%LU + WRITE(logn,*) + WRITE(logn,*),'rank receiving pop_grid from master', rank +!$ write(logn,*) 'b4 MPI_Recv, pop_t cmass: ', POP%pop_grid%cmass_sum +!$ write(logn,*) 'b4 MPI_Recv, pop_t LU: ', POP%pop_grid%LU CALL MPI_Recv( POP%pop_grid(1), POP%np, pop_t, 0, 0, icomm, stat, ierr ) -!$ write(wlogn,*) -!$ write(wlogn,*) 'after MPI_Recv, pop_t cmass: ', POP%pop_grid%cmass_sum - WRITE(wlogn,*) 'after MPI_Recv, pop_t ' - CALL flush(wlogn) +!$ write(logn,*) +!$ write(logn,*) 'after MPI_Recv, pop_t cmass: ', POP%pop_grid%cmass_sum + WRITE(logn,*) 'after MPI_Recv, pop_t ' + CALL flush(logn) IF (cable_user%CALL_POP .AND. POP%np.GT.0) THEN ! CALL_POP - WRITE(wlogn,*), 'b4 POPdriver', POP%pop_grid%cmass_sum + WRITE(logn,*), 'b4 POPdriver', POP%pop_grid%cmass_sum CALL POPdriver(casaflux,casabal,veg, POP) ENDIF -!$ write(wlogn,*) -!$ write(wlogn,*) 'after POPstep cmass: ', POP%pop_grid%cmass_sum - WRITE(wlogn,*) 'after POPstep ', POP%pop_grid%cmass_sum - CALL flush(wlogn) +!$ write(logn,*) +!$ write(logn,*) 'after POPstep cmass: ', POP%pop_grid%cmass_sum + WRITE(logn,*) 'after POPstep ', POP%pop_grid%cmass_sum + CALL flush(logn) CALL worker_send_pop (POP, ocomm) - WRITE(wlogn,*) 'after worker_send_pop' - CALL flush(wlogn) + WRITE(logn,*) 'after worker_send_pop' + CALL flush(logn) ENDIF ENDDO ! receive updates to CASA pools resulting from LUC - WRITE(wlogn,*) - WRITE(wlogn,*) 'b4 mpi_recv casa_LUC_t ' + WRITE(logn,*) + WRITE(logn,*) 'b4 mpi_recv casa_LUC_t ' CALL MPI_Recv (MPI_BOTTOM, 1, casa_LUC_t, 0, nyear, icomm, stat, ierr) - WRITE(wlogn,*) 'after mpi_recv casa_LUC_t: ' + WRITE(logn,*) 'after mpi_recv casa_LUC_t: ' ENDDO END SUBROUTINE WORKER_CASAONLY_LUC diff --git a/src/offline/casa_cable.F90 b/src/offline/casa_cable.F90 index 685c90704..526ec9783 100644 --- a/src/offline/casa_cable.F90 +++ b/src/offline/casa_cable.F90 @@ -58,9 +58,6 @@ SUBROUTINE POPdriver(casaflux,casabal,veg, POP) !! vh_js !! INTEGER, allocatable :: Iw(:) ! array of indices corresponding to woody (shrub or forest) tiles - ! INTEGER, INTENT(IN) :: wlogn - INTEGER , parameter :: wlogn=6 - if (.NOT.Allocated(LAIMax)) allocate(LAIMax(mp)) if (.NOT.Allocated(Cleafmean)) allocate(Cleafmean(mp)) if (.NOT.Allocated(Crootmean)) allocate(Crootmean(mp)) diff --git a/src/science/casa-cnp/bgcdriver.F90 b/src/science/casa-cnp/bgcdriver.F90 index bb5944edc..467883665 100644 --- a/src/science/casa-cnp/bgcdriver.F90 +++ b/src/science/casa-cnp/bgcdriver.F90 @@ -63,8 +63,6 @@ SUBROUTINE bgcdriver(ktau,kstart,kend,dels,met,ssnow,canopy,veg,soil, & CHARACTER :: cyear*4 CHARACTER :: ncfile*99 - INTEGER , parameter :: wlogn=6 - IF ( .NOT. dump_read ) THEN ! construct casa met and flux inputs from current CABLE run IF ( TRIM(cable_user%MetType) .EQ. 'cru' ) THEN diff --git a/src/science/gw_hydro/cable_gw_hydro.F90 b/src/science/gw_hydro/cable_gw_hydro.F90 index e7cf33918..84551060f 100644 --- a/src/science/gw_hydro/cable_gw_hydro.F90 +++ b/src/science/gw_hydro/cable_gw_hydro.F90 @@ -910,10 +910,9 @@ END SUBROUTINE smoistgw ! Output ! ssnow SUBROUTINE soil_snow_gw(dels, soil, ssnow, canopy, met, bal, veg) - USE cable_IO_vars_module, ONLY: wlogn - USE cable_common_module -USE snow_processes_soil_thermal_mod, ONLY : snow_processes_soil_thermal + USE snow_processes_soil_thermal_mod, ONLY : snow_processes_soil_thermal + REAL , INTENT(IN) :: dels ! integration time step (s) TYPE(soil_parameter_type), INTENT(INOUT) :: soil TYPE(soil_snow_type) , INTENT(INOUT) :: ssnow diff --git a/src/science/pop/POP.F90 b/src/science/pop/POP.F90 index 4c29a6599..13d726122 100755 --- a/src/science/pop/POP.F90 +++ b/src/science/pop/POP.F90 @@ -357,7 +357,6 @@ SUBROUTINE POPStep(POP, StemNPP, disturbance_interval, disturbance_intensity,LAI INTEGER(i4b), ALLOCATABLE :: it(:) REAL(dp):: dallocW - !INTEGER, INTENT(IN) :: wlogn pop%it_pop = pop%it_pop + 1 !it = pop%it_pop(1) @@ -373,7 +372,6 @@ SUBROUTINE POPStep(POP, StemNPP, disturbance_interval, disturbance_intensity,LAI !$ !$ CALL GetPatchFrequencies(POP,it) - !call flush(wlogn) IF (PRESENT(precip)) THEN IF(PRESENT(StemNPP_av)) THEN CALL PatchAnnualDynamics(POP, StemNPP,NPPtoGPP,disturbance_interval, it, precip=precip,StemNPP_av=StemNPP_av) diff --git a/src/science/sli/cable_sli_main.F90 b/src/science/sli/cable_sli_main.F90 index c938e6ade..ff4827235 100644 --- a/src/science/sli/cable_sli_main.F90 +++ b/src/science/sli/cable_sli_main.F90 @@ -22,11 +22,9 @@ SUBROUTINE sli_main(ktau, dt, veg, soil, ssnow, met, canopy, air, rad, SEB_only) USE sli_roots, ONLY: setroots, getrex USE sli_solve, ONLY: solve - USE cable_IO_vars_module, ONLY: wlogn, verbose + USE cable_IO_vars_module, ONLY: verbose IMPLICIT NONE - !INTEGER, INTENT(IN) :: wlogn - !INTEGER :: wlogn = 10001 !use correct value from io_vars module REAL, INTENT(IN) :: dt TYPE(veg_parameter_type), INTENT(INOUT) :: veg ! all r_1 TYPE(soil_parameter_type), INTENT(INOUT) :: soil ! all r_1 diff --git a/src/science/sli/cable_sli_solve.F90 b/src/science/sli/cable_sli_solve.F90 index d3b703ec8..b861b0229 100644 --- a/src/science/sli/cable_sli_solve.F90 +++ b/src/science/sli/cable_sli_solve.F90 @@ -84,7 +84,7 @@ MODULE sli_solve csat, slope_csat, potential_evap, tri, setsol, zerovars, & esat_ice, slope_esat_ice, Tfrozen, rtbis_Tfrozen, GTFrozen, & JSoilLayer, esat, forcerestore, SEB - USE cable_IO_vars_module, ONLY: wlogn + USE cable_IO_vars_module, ONLY: logn IMPLICIT NONE @@ -1326,16 +1326,16 @@ SUBROUTINE update_s_t( & tmp1d4(kk) = thetalmax(tmp1d3(kk), S(i), par(i)%he, one/(par(i)%lambc*freezefac), & par(i)%thre, par(i)%the) ! liquid content at solution for Tsoil ELSE - WRITE(wlogn,*) "Found no solution for Tfrozen 1. ", kk, i - WRITE(wlogn,*) "Assume soil is totally frozen" + WRITE(logn,*) "Found no solution for Tfrozen 1. ", kk, i + WRITE(logn,*) "Assume soil is totally frozen" var(i)%thetal = 0.0_r_2 var(i)%thetai = theta IF (i.EQ.1) hice(kk) = h0(kk) tmp1d3(kk) = (tmp1d2(kk) + rhow*lambdaf*(theta*dx(i) + MERGE(h0(kk),zero,i==1)))/ & (dx(i)*par(i)%css*par(i)%rho + rhow*csice*(theta*dx(i) + & MERGE(h0(kk),zero,i==1))) - WRITE(wlogn,*) "frozen soil temperature: ", tmp1d3(kk) - WRITE(wlogn,*) nsteps(kk), S(i), Tsoil(i), dTsoil(i), h0(kk), tmp1, tmp2, tmp1d2(kk), theta, & + WRITE(logn,*) "frozen soil temperature: ", tmp1d3(kk) + WRITE(logn,*) nsteps(kk), S(i), Tsoil(i), dTsoil(i), h0(kk), tmp1, tmp2, tmp1d2(kk), theta, & JSoilLayer(Tfreezing(kk), & dx(i), theta,par(i)%css, par(i)%rho, & MERGE(h0(kk),zero,i==1), par(i)%thre, par(i)%the, & @@ -1994,16 +1994,16 @@ SUBROUTINE get_and_solve_eqn( & itmp(kk) = itmp(kk) + 1 accel(kk) = one - 0.05_r_2*REAL(MIN(10,MAX(0,itmp(kk)-4)),r_2) ! acceleration [0.5,1], start with 1 IF (itmp(kk) > 1000) THEN - WRITE(wlogn,*) "Solve: too many iterations of equation solution" - WRITE(wlogn,*) " irec, kk, S" - WRITE(wlogn,*) irec, kk, S(:) - WRITE(wlogn,*) " irec, kk, Tsoil" - WRITE(wlogn,*) irec, kk, Tsoil(:) - WRITE(wlogn,*) " irec, kk, qex" - WRITE(wlogn,*) irec, kk, iqex(:) - WRITE(wlogn,*) " irec, kk, h0, hsnow, hsnowliq" - WRITE(wlogn,*) irec, kk, h0(kk), vsnow(kk)%hsnow, vsnow(kk)%hliq - WRITE(wlogn,*) nfac1(kk), nfac2(kk), nfac3(kk), nfac4(kk), nfac5(kk), & + WRITE(logn,*) "Solve: too many iterations of equation solution" + WRITE(logn,*) " irec, kk, S" + WRITE(logn,*) irec, kk, S(:) + WRITE(logn,*) " irec, kk, Tsoil" + WRITE(logn,*) irec, kk, Tsoil(:) + WRITE(logn,*) " irec, kk, qex" + WRITE(logn,*) irec, kk, iqex(:) + WRITE(logn,*) " irec, kk, h0, hsnow, hsnowliq" + WRITE(logn,*) irec, kk, h0(kk), vsnow(kk)%hsnow, vsnow(kk)%hliq + WRITE(logn,*) nfac1(kk), nfac2(kk), nfac3(kk), nfac4(kk), nfac5(kk), & nfac6(kk), nfac7(kk), nfac8(kk), nfac9(kk), nfac10(kk), nfac11(kk), nfac12(kk) err = 1 RETURN @@ -2172,8 +2172,8 @@ SUBROUTINE get_and_solve_eqn( & ff(nns(kk):n-1), ffh(nns(kk):n-1), gg(nns(kk):n), ggh(nns(kk):n), & dy(nns(kk):n), de(nns(kk):n), condition=condition, err=err) IF (err /= 0) THEN - WRITE(wlogn,*) "Sparse matrix solution failed ", irec, kk - WRITE(wlogn,*) Tsoil(1), S(1) + WRITE(logn,*) "Sparse matrix solution failed ", irec, kk + WRITE(logn,*) Tsoil(1), S(1) RETURN ENDIF @@ -2518,7 +2518,7 @@ SUBROUTINE get_and_solve_eqn( & nsteps(kk) = nsteps(kk) + 1 !$ if ((irec.eq.8992).and.(kk.eq.1) ) then -!$ !if ((irec.eq.5).and.(kk.eq.1626) .and. wlogn == 1011) then +!$ !if ((irec.eq.5).and.(kk.eq.1626) .and. logn == 1011) then !$ write(*,*) 'writing diags', again(kk), nsteps(kk) !$ !$ ! if (.not. again(kk)) then @@ -2540,9 +2540,9 @@ SUBROUTINE get_and_solve_eqn( & !$ endif IF (nsteps(kk) > nsteps_max) THEN - WRITE(wlogn,*) "nsteps > nsteps_max ", irec, kk - WRITE(wlogn,*) Tsoil(1), S(1) - WRITE(wlogn,*) nfac1(kk), nfac2(kk), nfac3(kk), nfac4(kk), nfac5(kk), & + WRITE(logn,*) "nsteps > nsteps_max ", irec, kk + WRITE(logn,*) Tsoil(1), S(1) + WRITE(logn,*) nfac1(kk), nfac2(kk), nfac3(kk), nfac4(kk), nfac5(kk), & nfac6(kk), nfac7(kk), nfac8(kk), nfac9(kk), nfac10(kk), nfac11(kk), nfac12(kk) err = 1 RETURN @@ -3993,12 +3993,12 @@ SUBROUTINE snow_adjust(irec, mp, n, kk, ns, h0, hice, thetai, dx, vsnow, var, pa tmp1d4(kk) = thetalmax(tmp1d3(kk), S(1), par(1)%he, one/(par(1)%lambc*freezefac), & par(1)%thre, par(1)%the) ! liquid content at new Tsoil ELSE - WRITE(wlogn,*) "Found no solution for Tfrozen 2. ", kk, i - WRITE(wlogn,*) "Assume soil is totally frozen" + WRITE(logn,*) "Found no solution for Tfrozen 2. ", kk, i + WRITE(logn,*) "Assume soil is totally frozen" tmp1d3(kk) = (tmp1d2(kk) + rhow*lambdaf*(theta*dx(1) + h0(kk))) / & (dx(1)*par(1)%css*par(1)%rho + rhow*csice*(theta*dx(1) + h0(kk))) tmp1d4(kk) = 0.0_r_2 - WRITE(wlogn,*) "frozen soil temperature: ", tmp1d3(kk) + WRITE(logn,*) "frozen soil temperature: ", tmp1d3(kk) ENDIF hice_tmp(kk) = hice(kk) @@ -4165,12 +4165,12 @@ SUBROUTINE snow_adjust(irec, mp, n, kk, ns, h0, hice, thetai, dx, vsnow, var, pa tmp1d4(kk) = thetalmax(tmp1d3(kk), S(1), par(1)%he, one/(par(1)%lambc*freezefac), & par(1)%thre, par(1)%the) ! liquid content at new Tsoil ELSE - WRITE(wlogn,*) "Found no solution for Tfrozen 3. ", kk, i - WRITE(wlogn,*) "Assume soil is totally frozen" + WRITE(logn,*) "Found no solution for Tfrozen 3. ", kk, i + WRITE(logn,*) "Assume soil is totally frozen" tmp1d3(kk) = (Jsoil + rhow*lambdaf*(theta*dx(1) + h0(kk))) / & (dx(1)*par(1)%css*par(1)%rho + rhow*csice*(theta*dx(1) + h0(kk))) tmp1d4(kk) = 0.0_r_2 - WRITE(wlogn,*) "frozen soil temperature: ", tmp1d3(kk) + WRITE(logn,*) "frozen soil temperature: ", tmp1d3(kk) ENDIF var(1)%thetal = MAX(tmp1d4(kk), zero) @@ -4416,11 +4416,11 @@ SUBROUTINE snow_adjust(irec, mp, n, kk, ns, h0, hice, thetai, dx, vsnow, var, pa par(1)%thre, par(1)%the) ! liquid content at new Tsoil ELSE WRITE(*,*) "Found no solution for Tfrozen 4.", irec, qmelt(1), h0(kk) - WRITE(wlogn,*) "Assume soil is totally frozen" + WRITE(logn,*) "Assume soil is totally frozen" tmp1d3(kk) = (Jsoil + rhow*lambdaf*(theta*dx(1) + h0(kk))) / & (dx(1)*par(1)%css*par(1)%rho + rhow*csice*(theta*dx(1) + h0(kk))) tmp1d4(kk) = 0.0_r_2 - WRITE(wlogn,*) "frozen soil temperature: ", tmp1d3(kk) + WRITE(logn,*) "frozen soil temperature: ", tmp1d3(kk) ENDIF var(1)%thetal = MAX(tmp1d4(kk), zero) @@ -4554,7 +4554,7 @@ SUBROUTINE snow_adjust(irec, mp, n, kk, ns, h0, hice, thetai, dx, vsnow, var, pa ENDIF IF (vsnow(kk)%hsnow(1).LT.zero.OR.vsnow(kk)%hsnow(nsnow_max).LT.zero) THEN - WRITE(wlogn,*) "hsnow<0. Set it to 0 (irec, kk, hsnow):", irec, kk, vsnow(kk)%hsnow(1) + WRITE(logn,*) "hsnow<0. Set it to 0 (irec, kk, hsnow):", irec, kk, vsnow(kk)%hsnow(1) vsnow(kk)%hsnow(1) = zero ENDIF diff --git a/src_pop/core/biogeochem/POP.F90 b/src_pop/core/biogeochem/POP.F90 index c3c5dba5a..a88287334 100755 --- a/src_pop/core/biogeochem/POP.F90 +++ b/src_pop/core/biogeochem/POP.F90 @@ -627,7 +627,6 @@ SUBROUTINE POPStep(POP, StemNPP, disturbance_interval, disturbance_intensity,LAI INTEGER(i4b) :: idisturb,np,g INTEGER(i4b), allocatable :: it(:) - !INTEGER, INTENT(IN) :: wlogn pop%it_pop = pop%it_pop + 1 !it = pop%it_pop(1) np = SIZE(POP%POP_grid) @@ -642,7 +641,6 @@ SUBROUTINE POPStep(POP, StemNPP, disturbance_interval, disturbance_intensity,LAI ! CALL GetPatchFrequencies(POP) - !call flush(wlogn) IF (PRESENT(precip)) THEN IF(PRESENT(StemNPP_av)) THEN CALL PatchAnnualDynamics(POP, StemNPP, NPPtoGPP, it, precip=precip, StemNPP_av=StemNPP_av) diff --git a/src_pop/core/biogeochem/POPLUC.F90 b/src_pop/core/biogeochem/POPLUC.F90 index dd17c9c7f..a3d2a64de 100644 --- a/src_pop/core/biogeochem/POPLUC.F90 +++ b/src_pop/core/biogeochem/POPLUC.F90 @@ -121,7 +121,7 @@ MODULE POPLUC_Module USE casavariable, ONLY: casa_pool, casa_balance, casa_flux, casa_biome USE POP_Types, ONLY: POP_TYPE USE cable_common_module, ONLY: cable_user - USE cable_IO_vars_module, ONLY: landpt, patch, wlogn + USE cable_IO_vars_module, ONLY: landpt, patch USE CABLE_LUC_EXPT, ONLY: LUC_EXPT_TYPE USE POPModule, ONLY: pop_init_single diff --git a/src_pop/core/biogeochem/casa_cnp.F90 b/src_pop/core/biogeochem/casa_cnp.F90 index 8429c73ad..a7b25abc4 100644 --- a/src_pop/core/biogeochem/casa_cnp.F90 +++ b/src_pop/core/biogeochem/casa_cnp.F90 @@ -60,7 +60,6 @@ MODULE casa_cnp_module USE casaparm USE casavariable USE phenvariable - USE cable_IO_vars_module, ONLY: wlogn USE cable_common_module, only: cable_user ! Custom soil respiration: Ticket #42 implicit none From d395e01412b7f748474884a3984945eecc23ce1e Mon Sep 17 00:00:00 2001 From: Ramzi Kutteh <98803952+rkutteh@users.noreply.github.com> Date: Wed, 7 Aug 2024 15:08:08 +1000 Subject: [PATCH 69/85] Update cable_parameters.F90 changed write statements inside consistency_ice_veg_soil subroutine to output to logn instead of standard output --- src/offline/cable_parameters.F90 | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/offline/cable_parameters.F90 b/src/offline/cable_parameters.F90 index 29d20fdfb..8dc6d28ac 100644 --- a/src/offline/cable_parameters.F90 +++ b/src/offline/cable_parameters.F90 @@ -2105,12 +2105,12 @@ SUBROUTINE consistency_ice_veg_soil(soil, veg) IF(soil%isoilm(k) == ICE_SoilType) THEN ! check to see if ice soil patch - WRITE(*,*) 'SUBROUTINE load_parameters:' - WRITE(*,*) 'At land point number ', i - WRITE(*,*) 'And patch number ', k - WRITE(*,*) 'isoilm is ICE_SoilType' - WRITE(*,*) 'Set rhosoil = density_ice from CABLE physical constants' - WRITE(*,*) 'Set css = csice from CABLE physical constants' + WRITE(logn,*) 'SUBROUTINE load_parameters:' + WRITE(logn,*) 'At land point number ', i + WRITE(logn,*) 'And patch number ', k + WRITE(logn,*) 'isoilm is ICE_SoilType' + WRITE(logn,*) 'Set rhosoil = density_ice from CABLE physical constants' + WRITE(logn,*) 'Set css = csice from CABLE physical constants' soil%rhosoil(k) = density_ice soil%css(k) = csice @@ -2129,11 +2129,11 @@ SUBROUTINE consistency_ice_veg_soil(soil, veg) IF((veg%iveg(k) == ICE_VegType) .AND. (soil%isoilm(k) /= ICE_SoilType)) THEN - WRITE(*,*) 'SUBROUTINE load_parameters:' - WRITE(*,*) 'At land point number ', i - WRITE(*,*) 'And patch number ', k - WRITE(*,*) 'iveg is ICE_VegType but isoilm is not ICE_SoilType' - WRITE(*,*) 'Changed isoilm to ICE_SoilType with appropriate parameter corrections' + WRITE(logn,*) 'SUBROUTINE load_parameters:' + WRITE(logn,*) 'At land point number ', i + WRITE(logn,*) 'And patch number ', k + WRITE(logn,*) 'iveg is ICE_VegType but isoilm is not ICE_SoilType' + WRITE(logn,*) 'Changed isoilm to ICE_SoilType with appropriate parameter corrections' soil%isoilm(k) = ICE_SoilType @@ -2145,11 +2145,11 @@ SUBROUTINE consistency_ice_veg_soil(soil, veg) ELSE IF ((veg%iveg(k) /= ICE_VegType) .AND. (soil%isoilm(k) == ICE_SoilType)) THEN - WRITE(*,*) 'SUBROUTINE load_parameters:' - WRITE(*,*) 'At land point number ', i - WRITE(*,*) 'And patch number ', k - WRITE(*,*) 'iveg is not ICE_VegType but isoilm is ICE_SoilType' - WRITE(*,*) 'Changed iveg to ICE_VegType with appropriate parameter corrections' + WRITE(logn,*) 'SUBROUTINE load_parameters:' + WRITE(logn,*) 'At land point number ', i + WRITE(logn,*) 'And patch number ', k + WRITE(logn,*) 'iveg is not ICE_VegType but isoilm is ICE_SoilType' + WRITE(logn,*) 'Changed iveg to ICE_VegType with appropriate parameter corrections' veg%iveg(k) = ICE_VegType From fe0b80eba0b0bc049b283af967ac5caa1a137599 Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Tue, 13 Aug 2024 16:25:17 +1000 Subject: [PATCH 70/85] Always initialise canopy%DvLitt and canopy%kthLitt --- src/science/canopy/cable_canopy.F90 | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/science/canopy/cable_canopy.F90 b/src/science/canopy/cable_canopy.F90 index 4a5827c8e..1e2c3e538 100644 --- a/src/science/canopy/cable_canopy.F90 +++ b/src/science/canopy/cable_canopy.F90 @@ -186,6 +186,15 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima canopy%tv = met%tvair canopy%fwsoil = 1.0 + ! Initialise canopy%DvLitt and canopy%kthLitt. This value is only used if + ! cable_user%litter is .TRUE. + ! Reference: + ! Mathews (2006), A process-based model of offine fuel moisture, + ! International Journal of Wildland Fire 15,155-168 + ! assuming here u=1.0 ms-1, bulk litter density 63.5 kgm-3 + canopy%kthLitt = 0.3_r_2 ! ~ 0.2992125984251969 = 0.2+0.14*0.045*1000.0/63.5 + canopy%DvLitt = 3.1415841138194147e-05_r_2 ! = 2.17e-5*exp(1.0*2.6)*exp(-0.5*(2.08+(1.0*2.38))) + CALL define_air (met, air) CALL qsatfjh(mp, qstvair, CRMH2o, Crmair, CTETENA, CTETENB, CTETENC, met%tvair-CTfrz,met%pmb) @@ -315,14 +324,6 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima ELSE ! NOT sli rt0 = MAX(rt_min,rough%rt0us / canopy%us) - IF (cable_user%litter) THEN - ! Mathews (2006), A process-based model of offine fuel moisture, - ! International Journal of Wildland Fire 15,155-168 - ! assuming here u=1.0 ms-1, bulk litter density 63.5 kgm-3 - canopy%kthLitt = 0.3_r_2 ! ~ 0.2992125984251969 = 0.2+0.14*0.045*1000.0/63.5 - canopy%DvLitt = 3.1415841138194147e-05_r_2 ! = 2.17e-5*exp(1.0*2.6)*exp(-0.5*(2.08+(1.0*2.38))) - ENDIF - ENDIF ! ! Aerodynamic resistance (sum 3 height integrals)/us From fdcb99fb4d34b7f0764efed6a6504fdadba3de73 Mon Sep 17 00:00:00 2001 From: rml599gh Date: Thu, 15 Aug 2024 10:58:51 +1000 Subject: [PATCH 71/85] Reinstate dry and cold stress (#275) Remove double summation of btran (#279) Require both changes. --- src/science/casa-cnp/casa_cnp.F90 | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/science/casa-cnp/casa_cnp.F90 b/src/science/casa-cnp/casa_cnp.F90 index b6e674e54..1d34da96c 100644 --- a/src/science/casa-cnp/casa_cnp.F90 +++ b/src/science/casa-cnp/casa_cnp.F90 @@ -764,8 +764,13 @@ SUBROUTINE casa_coeffplant(xkleafcold,xkleafdry,xkleaf,veg,casabiome,casapool, & casaflux%fromPtoL(:,str,froot) = 1.0 - casaflux%fromPtoL(:,metb,froot) casaflux%fromPtoL(:,cwd,wood) = 1.0 - ! calc. of casaflux%kplant drops scaling - see #242 - casaflux%kplant(:,leaf) = casabiome%plantrate(veg%iveg(:),leaf) + ! calc. of casaflux%kplant had dropped scaling for cold and drought stress + ! as noted in trac ticket #243 + ! R. Law 23/7/2024 reinstate terms to account for cold and drought stress (#275) + ! which are calculated in casa_xrateplant + ! Needs 'btran' bug fix (#279) implemented with this. + casaflux%kplant(:,leaf) = casabiome%plantrate(veg%iveg(:),leaf)*xkleaf(:) & + + xkleafcold(:) + xkleafdry(:) casaflux%kplant(:,wood) = casabiome%plantrate(veg%iveg(:),wood) casaflux%kplant(:,froot) = casabiome%plantrate(veg%iveg(:),froot) @@ -1498,12 +1503,11 @@ SUBROUTINE avgsoil(veg,soil,casamet) * casamet%tsoil(nland,ns) casamet%moistavg(nland) = casamet%moistavg(nland)+ veg%froot(nland,ns) & * MIN(soil%sfc(nland),casamet%moist(nland,ns)) - casamet%btran(nland) = casamet%btran(nland)+ veg%froot(nland,ns) & - * (MIN(soil%sfc(nland),casamet%moist(nland,ns))-soil%swilt(nland)) & - /(soil%sfc(nland)-soil%swilt(nland)) - - ! Ticket#121 - + + !R. Law 23/7/2024 Issue #279 + !both the alternate (ticket 121) btran calculation and the original btran + !calculation were in the code meaning the summation was done twice. Removed + !original version and kept ticket 121 version casamet%btran(nland) = casamet%btran(nland)+ veg%froot(nland,ns) & * (MAX(MIN(soil%sfc(nland),casamet%moist(nland,ns))-soil%swilt(nland),0.0)) & /(soil%sfc(nland)-soil%swilt(nland)) From 7bd295bfee5b1f563111831a056495df13d5812e Mon Sep 17 00:00:00 2001 From: rml599gh Date: Thu, 15 Aug 2024 14:47:49 +1000 Subject: [PATCH 72/85] Correction to comments as #277 and #279 --- src/science/casa-cnp/casa_cnp.F90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/science/casa-cnp/casa_cnp.F90 b/src/science/casa-cnp/casa_cnp.F90 index 1d34da96c..5f1a08511 100644 --- a/src/science/casa-cnp/casa_cnp.F90 +++ b/src/science/casa-cnp/casa_cnp.F90 @@ -795,7 +795,7 @@ SUBROUTINE casa_coeffsoil(xklitter,xksoil,veg,soil,casabiome,casaflux,casamet) ! outputs: ! klitter(mp,mlitter): decomposition rate of litter pool (1/day) ! ksoil(mp,msoil): decomposition rate of soil pool (1/day) - ! fromLtoS(mp,mlitter,msoil): fraction of decomposed litter to soil (fraction) + ! fromLtoS(mp,msoil,mlitter): fraction of decomposed litter to soil (fraction) ! fromStoS(mp,msoil,msoil): fraction of decomposed soil C to another soil pool (fraction) ! fromLtoCO2(mp,mlitter): fraction of decomposed litter emitted as CO2 (fraction) ! fromStoCO2(mp,msoil): fraction of decomposed soil C emitted as Co2 (fraction) @@ -1483,8 +1483,8 @@ END SUBROUTINE casa_delsoil SUBROUTINE avgsoil(veg,soil,casamet) ! Get avg soil moisture, avg soil temperature - ! need to estimate the land cell mean soil temperature and moisture weighted by the area fraction - ! of each tile within the land cell + ! need to estimate the mean soil temperature and moisture averaged over the + ! soil column and weighted by root fraction for each tile IMPLICIT NONE TYPE (veg_parameter_type), INTENT(INOUT) :: veg ! vegetation parameters From 4db04690a075673e4aabaf2677ed08a2f52c90b1 Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Thu, 15 Aug 2024 15:36:11 +1000 Subject: [PATCH 73/85] (#338) - Add namelist option for ice consistency. --- documentation/docs/user_guide/inputs/cable_nml.md | 2 +- src/offline/cable_input.F90 | 4 +++- src/util/cable_runtime_opts_mod.F90 | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/documentation/docs/user_guide/inputs/cable_nml.md b/documentation/docs/user_guide/inputs/cable_nml.md index b7d2de2f3..14ed9e70c 100644 --- a/documentation/docs/user_guide/inputs/cable_nml.md +++ b/documentation/docs/user_guide/inputs/cable_nml.md @@ -134,7 +134,7 @@ applications. The following are annotated examples of cable.nml: | cable_user%access13roots | logical | .TRUE. .FALSE. | .FALSE. | Switch to use ACCESS1.3 %froot. | | cable_user%l_limit_labile | logical | .TRUE. .FALSE. | .FALSE. | Limit labile in spinup. | | cable_user%NtilesThruMetFile | logical | .TRUE. .FALSE. | .FALSE. | Specify Ntiles through met file. | - +| cable_user%l_ice_consistency | logical | .TRUE. .FALSE. | .FALSE. | If true, ensures consistency between soil and vegetation tiles with permanent ice. All tiles with permanent ice for soil will have ice for vegetation and vice-versa. All the parameters for these tiles are updated to the ice parameters. | ## For offline applications ## diff --git a/src/offline/cable_input.F90 b/src/offline/cable_input.F90 index ee0c8cb88..9c30208f7 100644 --- a/src/offline/cable_input.F90 +++ b/src/offline/cable_input.F90 @@ -2819,7 +2819,9 @@ SUBROUTINE load_parameters(met,air,ssnow,veg,climate,bgc,soil,canopy,rough,rad, WRITE(logn,*) !> 9. Ensure the consistency of ice points between soil and vegetation - CALL consistency_ice_veg_soil(soil, veg) + IF (cable_user%l_ice_consistency) THEN + CALL consistency_ice_veg_soil(soil, veg) + END IF !| 10. Construct derived parameters and zero initialisations for the ! groundwater routine, regardless of where parameters and other diff --git a/src/util/cable_runtime_opts_mod.F90 b/src/util/cable_runtime_opts_mod.F90 index 46b2da7b3..628f97a48 100644 --- a/src/util/cable_runtime_opts_mod.F90 +++ b/src/util/cable_runtime_opts_mod.F90 @@ -113,7 +113,9 @@ MODULE cable_runtime_opts_mod LOGICAL :: access13roots = .FALSE. !switch to use ACCESS1.3 %froot LOGICAL :: l_limit_labile = .FALSE. ! #237: limit Labile in spinup - LOGICAL :: NtilesThruMetFile = .FALSE. ! #199: Specify Ntiles thru met file + LOGICAL :: NtilesThruMetFile = .FALSE. ! #199: Specify Ntiles thru met file + ! #338 https://github.com/CABLE-LSM/CABLE/issues/338 + LOGICAL :: l_ice_consistency = .FALSE. END TYPE kbl_user_switches From 6ed2afc8315ff8ddb4862442854a40e62fa4710d Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Thu, 15 Aug 2024 15:52:58 +1000 Subject: [PATCH 74/85] (#338) - Update doc --- documentation/docs/user_guide/inputs/cable_nml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/user_guide/inputs/cable_nml.md b/documentation/docs/user_guide/inputs/cable_nml.md index 14ed9e70c..1ac59f001 100644 --- a/documentation/docs/user_guide/inputs/cable_nml.md +++ b/documentation/docs/user_guide/inputs/cable_nml.md @@ -134,7 +134,7 @@ applications. The following are annotated examples of cable.nml: | cable_user%access13roots | logical | .TRUE. .FALSE. | .FALSE. | Switch to use ACCESS1.3 %froot. | | cable_user%l_limit_labile | logical | .TRUE. .FALSE. | .FALSE. | Limit labile in spinup. | | cable_user%NtilesThruMetFile | logical | .TRUE. .FALSE. | .FALSE. | Specify Ntiles through met file. | -| cable_user%l_ice_consistency | logical | .TRUE. .FALSE. | .FALSE. | If true, ensures consistency between soil and vegetation tiles with permanent ice. All tiles with permanent ice for soil will have ice for vegetation and vice-versa. All the parameters for these tiles are updated to the ice parameters. | +| cable_user%l_ice_consistency | logical | .TRUE. .FALSE. | .FALSE. | If true, ensures consistency between soil and vegetation tiles with permanent ice. All tiles with permanent ice for soil will have ice for vegetation and vice-versa. All the parameters for these new ice tiles are updated to the ice parameters. | ## For offline applications ## From 06bd3af512d22063e6da788fc973f0cfa0381cd9 Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Fri, 16 Aug 2024 09:32:39 +1000 Subject: [PATCH 75/85] (#351) - correct reference for DvLitt and kthLitt --- src/science/canopy/cable_canopy.F90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/science/canopy/cable_canopy.F90 b/src/science/canopy/cable_canopy.F90 index 1e2c3e538..3dda769a4 100644 --- a/src/science/canopy/cable_canopy.F90 +++ b/src/science/canopy/cable_canopy.F90 @@ -189,8 +189,9 @@ SUBROUTINE define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,clima ! Initialise canopy%DvLitt and canopy%kthLitt. This value is only used if ! cable_user%litter is .TRUE. ! Reference: - ! Mathews (2006), A process-based model of offine fuel moisture, + ! Matthews (2006), A process-based model of fine fuel moisture, ! International Journal of Wildland Fire 15,155-168 + ! https://doi.org/10.1071/WF05063 ! assuming here u=1.0 ms-1, bulk litter density 63.5 kgm-3 canopy%kthLitt = 0.3_r_2 ! ~ 0.2992125984251969 = 0.2+0.14*0.045*1000.0/63.5 canopy%DvLitt = 3.1415841138194147e-05_r_2 ! = 2.17e-5*exp(1.0*2.6)*exp(-0.5*(2.08+(1.0*2.38))) From 6f22bdd039b838b456e281efe989a8bac1b1e803 Mon Sep 17 00:00:00 2001 From: rml599gh Date: Mon, 19 Aug 2024 12:03:58 +1000 Subject: [PATCH 76/85] Initialise casaflux%frac_sapwood=1 for use in casa_rplant (#373) --- src/coupled/ESM1.5/casa_um_inout.F90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/coupled/ESM1.5/casa_um_inout.F90 b/src/coupled/ESM1.5/casa_um_inout.F90 index fbaeb9687..c5ed951c2 100644 --- a/src/coupled/ESM1.5/casa_um_inout.F90 +++ b/src/coupled/ESM1.5/casa_um_inout.F90 @@ -281,6 +281,9 @@ SUBROUTINE casa_init_pk(casabiome,casaflux,casamet,casapool,casabal,veg,canopy,p casaflux%clabloss(:) = 0.0 !print *,'Lest - Crsoil',casaflux%Crsoil + ! R. Law 19/8/24 Initialise casaflux%frac_sapwood=1 (#373,#274,#163) + ! for correct calculation of rmplant(:,wood) in casa_rplant. + casaflux%frac_sapwood = 1.0 ! Lest 19/2/14 - will work for coupled and amip ! mtau is the step number of the day (1,2,..47,0) From 57a343d6027da1e50fc4735bd7a28496b7da9485 Mon Sep 17 00:00:00 2001 From: "C. Carouge" Date: Wed, 21 Aug 2024 16:00:13 +1000 Subject: [PATCH 77/85] (#338) - Add new namelist option to cable.nml --- src/offline/cable.nml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/offline/cable.nml b/src/offline/cable.nml index 537222fcd..e8c104bb5 100644 --- a/src/offline/cable.nml +++ b/src/offline/cable.nml @@ -68,4 +68,5 @@ cable_user%CASA_DUMP_READ = .FALSE. ! TRUE reads CASA forcing from netcdf format cable_user%CASA_DUMP_WRITE = .FALSE. ! TRUE outputs CASA forcing in netcdf format cable_user%SSNOW_POTEV= 'HDM' ! Humidity Deficit Method + cable_user%l_ice_consistency = .FALSE. ! TRUE add QA step for ice tiles input. &end From 03f924ebc1169190b4d59958090db13f99aa91f3 Mon Sep 17 00:00:00 2001 From: rml599gh Date: Fri, 23 Aug 2024 11:46:06 +1000 Subject: [PATCH 78/85] Remove ESM15 case as inconsistent with current input of xkpsorb (#283) --- src/science/casa-cnp/casa_cnp.F90 | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/science/casa-cnp/casa_cnp.F90 b/src/science/casa-cnp/casa_cnp.F90 index b6e674e54..5d88999fd 100644 --- a/src/science/casa-cnp/casa_cnp.F90 +++ b/src/science/casa-cnp/casa_cnp.F90 @@ -1446,23 +1446,16 @@ SUBROUTINE casa_delsoil(veg,casapool,casaflux,casamet,casabiome) casapool%dPsoillabdt(nland)= casaflux%Psnet(nland) + fluxptase(nland) & + casaflux%Pdep(nland) + casaflux%Pwea(nland) & - casaflux%Pleach(nland)-casaflux%pupland(nland) & -!jhan: ESM15 is effectively using xkpsorb**2 - inadvertently?!?!?!?! -# ifdef ESM15 - - casabiome%xkpsorb(casamet%isorder(nland))*casaflux%kpsorb(nland)*casapool%Psoilsorb(nland) & -# else + !R. Law 23/08/2024 Removed ESM15 case as inconsistent with how xkpsorb now input (#283) - casaflux%kpsorb(nland)*casapool%Psoilsorb(nland) & -# endif + casaflux%kpocc(nland) * casapool%Psoilocc(nland) ! here the dPsoillabdt =(dPsoillabdt+dPsoilsorbdt) ! dPsoilsorbdt = xdplabsorb casapool%dPsoillabdt(nland) = casapool%dPsoillabdt(nland)/xdplabsorb(nland) casapool%dPsoilsorbdt(nland) = 0.0 -# ifdef ESM15 - casapool%dPsoiloccdt(nland) = casabiome%xkpsorb(casamet%isorder(nland))*casaflux%kpsorb(nland)* casapool%Psoilsorb(nland) & -# else + !R. Law 23/08/2024 Removed ESM15 case as inconsistent with how xkpsorb now input (#283) casapool%dPsoiloccdt(nland) = casaflux%kpsorb(nland)* casapool%Psoilsorb(nland) & -# endif - casaflux%kpocc(nland) * casapool%Psoilocc(nland) ! P loss to non-available P pools ! casaflux%Ploss(nland) = casaflux%kpocc(nland) * casapool%Psoilocc(nland) From aad87bcbfc67c48d94676def53bb526d79bf9037 Mon Sep 17 00:00:00 2001 From: Claire Carouge Date: Thu, 12 Sep 2024 16:40:46 +1000 Subject: [PATCH 79/85] (#9) - Install graphviz for readthedocs --- documentation/.readthedocs.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/documentation/.readthedocs.yaml b/documentation/.readthedocs.yaml index 0fb96f664..f5389af8c 100644 --- a/documentation/.readthedocs.yaml +++ b/documentation/.readthedocs.yaml @@ -4,6 +4,8 @@ build: os: ubuntu-22.04 tools: python: "3.11" # choose arbitrary version of python for now + apt_packages: + - graphviz jobs: pre_build: # install dependencies for ford and mkdocs separately to avoid dependency conflicts From 0448257503a7a424807a6ee8daf3f1960faaf603 Mon Sep 17 00:00:00 2001 From: JhanSrbinovsky Date: Tue, 17 Sep 2024 10:06:50 +1000 Subject: [PATCH 80/85] Add src/coupled/AM3 directory (#371) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AM3 application specific see issue #370 Fixes #370 ## Type of change Hopefully will cover CM3 as well - [? ] New or updated documentation ## Checklist - [? ] The new content is accessible and located in the appropriate section. - [?] I have checked that links are valid and point to the intended content. - [ ] I have checked my code/text and corrected any misspellings ---- 📚 Documentation preview 📚: https://cable--371.org.readthedocs.build/en/371/ --- .../AM3/control/cable/CM3/air_type_cbl.F90 | 142 + .../control/cable/CM3/balances_type_cbl.F90 | 304 ++ .../AM3/control/cable/CM3/bgc_pool_type.F90 | 115 + .../AM3/control/cable/CM3/cable_common.F90 | 143 + .../control/cable/CM3/cable_define_types.F90 | 72 + .../AM3/control/cable/CM3/cbl_canopy_type.F90 | 587 ++++ .../AM3/control/cable/CM3/cbl_cbm_mod.F90 | 403 +++ .../AM3/control/cable/CM3/climate_type.F90 | 306 ++ .../AM3/control/cable/CM3/met_type_cbl.F90 | 227 ++ .../AM3/control/cable/CM3/radiation_type.F90 | 311 ++ .../cable/CM3/read_cable_namelists_mod.F90 | 116 + .../AM3/control/cable/CM3/roughness_type.F90 | 247 ++ .../AM3/control/cable/CM3/soil_type_cbl.F90 | 517 +++ .../AM3/control/cable/CM3/ssnow_type.F90 | 960 ++++++ .../AM3/control/cable/CM3/sum_flux_type.F90 | 173 + .../AM3/control/cable/CM3/veg_type.F90 | 429 +++ .../explicit/cable_land_sf_explicit_cbl.F90 | 2931 +++++++++++++++++ .../cable_land/explicit/sf_flux_mod_cbl.F90 | 270 ++ .../cable/cable_land/extra/hydrol_mod_cbl.F90 | 1075 ++++++ .../implicit/cable_land_sf_implicit_cbl.F90 | 931 ++++++ .../radiation/alloc_rad_albedo_vars_cbl.F90 | 267 ++ .../radiation/cable_land_albedo_mod_cbl.F90 | 386 +++ .../explicit/cable_explicit_driver.F90 | 280 ++ .../explicit/cable_explicit_main.F90 | 385 +++ .../explicit/cable_explicit_main.F90.cnp | 401 +++ .../explicit/cable_explicit_unpack.F90 | 195 ++ .../interface/hydrology/cable_hyd_driver.F90 | 38 + .../interface/hydrology/cable_hyd_main.F90 | 150 + .../interface/hydrology/cable_wblake_fix.F90 | 19 + .../implicit/cable_implicit_driver.F90 | 249 ++ .../implicit/cable_implicit_main.F90 | 242 ++ .../implicit/cable_implicit_unpack.F90 | 400 +++ .../implicit/cbl_prognostic_bank.F90 | 167 + .../interface/radiation/rad_driver_cbl.F90 | 192 ++ .../interface/radiation/rad_unpack_cbl.F90 | 137 + .../cable/shared/LAI_canopy_height_cbl.F90 | 100 + .../control/cable/shared/cable_fields_mod.F90 | 61 + .../control/cable/shared/cable_model_env.F90 | 105 + .../cable/shared/cable_surface_types_mod.F90 | 377 +++ .../cable/shared/land_tile_ids_mod_cbl.F90 | 121 + .../control/cable/shared/params_io_cbl.F90 | 355 ++ .../cable/shared/progs_cbl_vars_mod.F90 | 386 +++ .../cable/shared/work_vars_mod_cbl.F90 | 361 ++ .../cable/util/activeTile_mask_cbl.F90 | 100 + .../cable/util/cable_jules_links_mod.F90 | 196 ++ .../cable/util/cable_model_env_opts.F90 | 12 + .../cable/util/init/cable_um_init_bgc.F90 | 35 + .../util/init/cable_um_init_respiration.F90 | 44 + .../cable/util/init/cable_um_init_sumflux.F90 | 35 + .../control/cable/util/init/cbl_um_init.F90 | 134 + .../cable/util/init/cbl_um_init_soil.F90 | 236 ++ .../cable/util/init/cbl_um_init_soilsnow.F90 | 157 + .../cable/util/init/cbl_um_init_veg.F90 | 71 + .../util/init/cbl_um_init_veg.F90.manual | 77 + .../control/cable/util/map_paramaters_cbl.F90 | 230 ++ .../AM3/control/cable/util/pack_mod_cbl.F90 | 164 + .../cable/util/update/cbl_um_update.F90 | 117 + .../util/update/cbl_um_update_canopy.F90 | 36 + .../cable/util/update/cbl_um_update_met.F90 | 111 + .../util/update/cbl_um_update_radiation.F90 | 88 + .../util/update/cbl_um_update_roughness.F90 | 73 + .../util/update/cbl_um_update_soilsnow.F90 | 48 + .../control/casa/shared/cnp_fields_mod.F90 | 19 + .../casa/shared/progs_cnp_vars_mod.F90 | 182 + .../control/casa/shared/work_vars_mod_cnp.F90 | 52 + .../AM3/initialisation/cable_pft_params.F90 | 1033 ++++++ .../AM3/initialisation/cable_soil_params.F90 | 150 + .../init_cable_working_vars.F90 | 63 + .../AM3/initialisation/init_soilin_cbl.inc | 187 ++ .../AM3/initialisation/init_vegin_cbl.inc | 479 +++ .../prognostics/init_cable_progs.F90 | 65 + .../prognostics/init_cnp_progs.F90 | 33 + .../prognostics/read_cable_progs.F90 | 276 ++ 73 files changed, 20136 insertions(+) create mode 100644 src/coupled/AM3/control/cable/CM3/air_type_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/balances_type_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/bgc_pool_type.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/cable_common.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/cable_define_types.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/cbl_canopy_type.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/cbl_cbm_mod.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/climate_type.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/met_type_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/radiation_type.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/read_cable_namelists_mod.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/roughness_type.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/soil_type_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/ssnow_type.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/sum_flux_type.F90 create mode 100644 src/coupled/AM3/control/cable/CM3/veg_type.F90 create mode 100644 src/coupled/AM3/control/cable/cable_land/explicit/cable_land_sf_explicit_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/cable_land/explicit/sf_flux_mod_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/cable_land/extra/hydrol_mod_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/cable_land/implicit/cable_land_sf_implicit_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/cable_land/radiation/alloc_rad_albedo_vars_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/cable_land/radiation/cable_land_albedo_mod_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/interface/explicit/cable_explicit_driver.F90 create mode 100644 src/coupled/AM3/control/cable/interface/explicit/cable_explicit_main.F90 create mode 100644 src/coupled/AM3/control/cable/interface/explicit/cable_explicit_main.F90.cnp create mode 100644 src/coupled/AM3/control/cable/interface/explicit/cable_explicit_unpack.F90 create mode 100644 src/coupled/AM3/control/cable/interface/hydrology/cable_hyd_driver.F90 create mode 100644 src/coupled/AM3/control/cable/interface/hydrology/cable_hyd_main.F90 create mode 100644 src/coupled/AM3/control/cable/interface/hydrology/cable_wblake_fix.F90 create mode 100644 src/coupled/AM3/control/cable/interface/implicit/cable_implicit_driver.F90 create mode 100644 src/coupled/AM3/control/cable/interface/implicit/cable_implicit_main.F90 create mode 100644 src/coupled/AM3/control/cable/interface/implicit/cable_implicit_unpack.F90 create mode 100644 src/coupled/AM3/control/cable/interface/implicit/cbl_prognostic_bank.F90 create mode 100644 src/coupled/AM3/control/cable/interface/radiation/rad_driver_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/interface/radiation/rad_unpack_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/shared/LAI_canopy_height_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/shared/cable_fields_mod.F90 create mode 100644 src/coupled/AM3/control/cable/shared/cable_model_env.F90 create mode 100644 src/coupled/AM3/control/cable/shared/cable_surface_types_mod.F90 create mode 100644 src/coupled/AM3/control/cable/shared/land_tile_ids_mod_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/shared/params_io_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/shared/progs_cbl_vars_mod.F90 create mode 100644 src/coupled/AM3/control/cable/shared/work_vars_mod_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/util/activeTile_mask_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/util/cable_jules_links_mod.F90 create mode 100644 src/coupled/AM3/control/cable/util/cable_model_env_opts.F90 create mode 100644 src/coupled/AM3/control/cable/util/init/cable_um_init_bgc.F90 create mode 100644 src/coupled/AM3/control/cable/util/init/cable_um_init_respiration.F90 create mode 100644 src/coupled/AM3/control/cable/util/init/cable_um_init_sumflux.F90 create mode 100644 src/coupled/AM3/control/cable/util/init/cbl_um_init.F90 create mode 100644 src/coupled/AM3/control/cable/util/init/cbl_um_init_soil.F90 create mode 100644 src/coupled/AM3/control/cable/util/init/cbl_um_init_soilsnow.F90 create mode 100644 src/coupled/AM3/control/cable/util/init/cbl_um_init_veg.F90 create mode 100644 src/coupled/AM3/control/cable/util/init/cbl_um_init_veg.F90.manual create mode 100644 src/coupled/AM3/control/cable/util/map_paramaters_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/util/pack_mod_cbl.F90 create mode 100644 src/coupled/AM3/control/cable/util/update/cbl_um_update.F90 create mode 100644 src/coupled/AM3/control/cable/util/update/cbl_um_update_canopy.F90 create mode 100644 src/coupled/AM3/control/cable/util/update/cbl_um_update_met.F90 create mode 100644 src/coupled/AM3/control/cable/util/update/cbl_um_update_radiation.F90 create mode 100644 src/coupled/AM3/control/cable/util/update/cbl_um_update_roughness.F90 create mode 100644 src/coupled/AM3/control/cable/util/update/cbl_um_update_soilsnow.F90 create mode 100644 src/coupled/AM3/control/casa/shared/cnp_fields_mod.F90 create mode 100644 src/coupled/AM3/control/casa/shared/progs_cnp_vars_mod.F90 create mode 100644 src/coupled/AM3/control/casa/shared/work_vars_mod_cnp.F90 create mode 100644 src/coupled/AM3/initialisation/cable_pft_params.F90 create mode 100644 src/coupled/AM3/initialisation/cable_soil_params.F90 create mode 100644 src/coupled/AM3/initialisation/init_cable_working_vars.F90 create mode 100644 src/coupled/AM3/initialisation/init_soilin_cbl.inc create mode 100644 src/coupled/AM3/initialisation/init_vegin_cbl.inc create mode 100644 src/coupled/AM3/initialisation/prognostics/init_cable_progs.F90 create mode 100644 src/coupled/AM3/initialisation/prognostics/init_cnp_progs.F90 create mode 100644 src/coupled/AM3/initialisation/prognostics/read_cable_progs.F90 diff --git a/src/coupled/AM3/control/cable/CM3/air_type_cbl.F90 b/src/coupled/AM3/control/cable/CM3/air_type_cbl.F90 new file mode 100644 index 000000000..efca2e623 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/air_type_cbl.F90 @@ -0,0 +1,142 @@ +MODULE cable_air_type_mod + +IMPLICIT NONE + +PUBLIC :: air_type +PUBLIC :: air_data_type +PUBLIC :: alloc_air_type +PUBLIC :: dealloc_air_type +PUBLIC :: assoc_air_type +PUBLIC :: nullify_air_cbl + +TYPE air_data_type + + REAL, ALLOCATABLE :: rho (:) ! dry air density (kg m-3) + REAL, ALLOCATABLE :: volm(:) ! molar volume (m3 mol-1) + REAL, ALLOCATABLE :: rlam(:) ! latent heat for water (j/kg) + REAL, ALLOCATABLE :: qsat(:) ! saturation specific humidity + REAL, ALLOCATABLE :: epsi(:) ! d(qsat)/dt ((kg/kg)/k) + REAL, ALLOCATABLE :: visc(:) ! air kinematic viscosity (m2/s) + REAL, ALLOCATABLE :: psyc(:) ! psychrometric constant + REAL, ALLOCATABLE :: dsatdk(:) ! d(es)/dt (mb/k) + REAL, ALLOCATABLE :: cmolar(:) ! conv. from m/s to mol/m2/s + +END TYPE air_data_type + +TYPE air_type + + REAL, POINTER :: rho (:) ! dry air density (kg m-3) + REAL, POINTER :: volm(:) ! molar volume (m3 mol-1) + REAL, POINTER :: rlam(:) ! latent heat for water (j/kg) + REAL, POINTER :: qsat(:) ! saturation specific humidity + REAL, POINTER :: epsi(:) ! d(qsat)/dt ((kg/kg)/k) + REAL, POINTER :: visc(:) ! air kinematic viscosity (m2/s) + REAL, POINTER :: psyc(:) ! psychrometric constant + REAL, POINTER :: dsatdk(:) ! d(es)/dt (mb/k) + REAL, POINTER :: cmolar(:) ! conv. from m/s to mol/m2/s + +END TYPE air_type + +CONTAINS + +SUBROUTINE alloc_air_type(air, mp) +IMPLICIT NONE + +TYPE(air_data_type), INTENT(INOUT) :: air +INTEGER, INTENT(IN) :: mp + +ALLOCATE( air% rho (mp) ) +ALLOCATE( air% volm (mp) ) +ALLOCATE( air% rlam (mp) ) +ALLOCATE( air% qsat (mp) ) +ALLOCATE( air% epsi (mp) ) +ALLOCATE( air% visc (mp) ) +ALLOCATE( air% psyc (mp) ) +ALLOCATE( air% dsatdk(mp) ) +ALLOCATE( air% cmolar(mp) ) + +air% rho (:) = 0.0 +air% volm(:) = 0.0 +air% rlam(:) = 0.0 +air% qsat(:) = 0.0 +air% epsi(:) = 0.0 +air% visc(:) = 0.0 +air% psyc(:) = 0.0 +air% dsatdk(:) = 0.0 +air% cmolar(:) = 0.0 + +RETURN +END SUBROUTINE alloc_air_type + +SUBROUTINE dealloc_air_type(air) +IMPLICIT NONE + +TYPE(air_type), INTENT(inout) :: air + +DEALLOCATE( air% rho ) +DEALLOCATE( air% volm ) +DEALLOCATE( air% rlam ) +DEALLOCATE( air% qsat ) +DEALLOCATE( air% epsi ) +DEALLOCATE( air% visc ) +DEALLOCATE( air% psyc ) +DEALLOCATE( air% dsatdk ) +DEALLOCATE( air% cmolar ) + +RETURN +END SUBROUTINE dealloc_air_type + +SUBROUTINE assoc_air_type(air, air_data ) +! Description: +! Associate the CABLE work pointers in the derived type structure +IMPLICIT NONE + +!Arguments +TYPE(air_type), INTENT(IN OUT) :: air +TYPE(air_data_type), INTENT(IN OUT), TARGET :: air_data + +CHARACTER(LEN=*), PARAMETER :: RoutineName='' + +!End of header + +CALL nullify_air_cbl(air) + +air% rho => air_data% rho +air% volm => air_data% volm +air% rlam => air_data% rlam +air% qsat => air_data% qsat +air% epsi => air_data% epsi +air% visc => air_data% visc +air% psyc => air_data% psyc +air% dsatdk => air_data% dsatdk +air% cmolar => air_data% cmolar + +RETURN +END SUBROUTINE assoc_air_type + +SUBROUTINE nullify_air_cbl( air ) +! Description: +! Nullify the CABLE work pointers in the derived type structure +IMPLICIT NONE + +!Arguments +TYPE(air_type), INTENT(IN OUT) :: air + +CHARACTER(LEN=*), PARAMETER :: RoutineName='NULLIFY_ASSOC_AIR_VARS_CBL' +!End of header + +NULLIFY( air % rho ) +NULLIFY( air % volm ) +NULLIFY( air % rlam ) +NULLIFY( air % qsat ) +NULLIFY( air % epsi ) +NULLIFY( air % visc ) +NULLIFY( air % psyc ) +NULLIFY( air % dsatdk ) +NULLIFY( air % cmolar ) + +RETURN + +END SUBROUTINE nullify_air_cbl + +END MODULE cable_air_type_mod diff --git a/src/coupled/AM3/control/cable/CM3/balances_type_cbl.F90 b/src/coupled/AM3/control/cable/CM3/balances_type_cbl.F90 new file mode 100644 index 000000000..7c5b4036e --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/balances_type_cbl.F90 @@ -0,0 +1,304 @@ +MODULE cable_balances_type_mod + +IMPLICIT NONE + +PUBLIC :: balances_type +PUBLIC :: balances_data_type +PUBLIC :: alloc_balances_type +PUBLIC :: dealloc_balances_type +PUBLIC :: assoc_balances_type +PUBLIC :: nullify_balances_cbl + +! Energy and water balance variables: +TYPE balances_data_type + + REAL, ALLOCATABLE :: drybal(:) ! energy balance for dry canopy + REAL, ALLOCATABLE :: ebal(:) ! energy balance per time step (W/m^2) (:) + REAL, ALLOCATABLE :: ebal_tot(:) ! cumulative energy balance (W/m^2) (:) + REAL, ALLOCATABLE :: ebal_cncheck(:) ! energy balance consistency check (W/m^2) (:) + REAL, ALLOCATABLE :: ebal_tot_cncheck(:) ! cumulative energy balance (W/m^2) (:) + REAL, ALLOCATABLE :: ebaltr(:) ! energy balance per time step (W/m^2) (:) + REAL, ALLOCATABLE :: ebal_tottr(:) ! cumulative energy balance (W/m^2) (:) + REAL, ALLOCATABLE :: evap_tot(:) ! cumulative evapotranspiration (mm/dels) (:) + REAL, ALLOCATABLE :: osnowd0(:) ! snow depth, first time step (:) + REAL, ALLOCATABLE :: precip_tot(:) ! cumulative precipitation (mm/dels) (:) + REAL, ALLOCATABLE :: rnoff_tot(:) ! cumulative runoff (mm/dels) (:) + REAL, ALLOCATABLE :: wbal(:) ! water balance per time step (mm/dels) (:) + REAL, ALLOCATABLE :: wbal_tot(:) ! cumulative water balance (mm/dels) (:) + REAL, ALLOCATABLE :: wbtot0(:) ! total soil water (mm), first time step (:) + REAL, ALLOCATABLE :: wetbal(:) ! energy balance for wet canopy (:) + REAL, ALLOCATABLE :: cansto0(:) ! canopy water storage (mm) (:) + REAL, ALLOCATABLE :: owbtot(:) ! total soil water (mm), first time step (:) + REAL, ALLOCATABLE :: evapc_tot(:) ! cumulative evapotranspiration (mm/dels) (:) + REAL, ALLOCATABLE :: evaps_tot(:) ! cumulative evapotranspiration (mm/dels) (:) + REAL, ALLOCATABLE :: rnof1_tot(:) ! cumulative runoff (mm/dels) (:) + REAL, ALLOCATABLE :: rnof2_tot(:) ! cumulative runoff (mm/dels) (:) + REAL, ALLOCATABLE :: snowdc_tot(:) ! cumulative runoff (mm/dels) (:) + REAL, ALLOCATABLE :: wbal_tot1(:) ! cumulative water balance (mm/dels) (:) + REAL, ALLOCATABLE :: delwc_tot(:) ! energy balance for wet canopy (:) + REAL, ALLOCATABLE :: qasrf_tot(:) ! heat advected to the snow by precip. (:) + REAL, ALLOCATABLE :: qfsrf_tot(:) ! energy of snowpack phase changes (:) + REAL, ALLOCATABLE :: qssrf_tot(:) ! energy of snowpack phase changes (:) + REAL, ALLOCATABLE :: Radbal (:) + REAL, ALLOCATABLE :: EbalSoil (:) + REAL, ALLOCATABLE :: Ebalveg (:) + REAL, ALLOCATABLE :: Radbalsum (:) + +END TYPE balances_data_type + +TYPE balances_type + + REAL, POINTER :: drybal(:) ! energy balance for dry canopy + REAL, POINTER :: ebal(:) ! energy balance per time step (W/m^2) (:) + REAL, POINTER :: ebal_tot(:) ! cumulative energy balance (W/m^2) (:) + REAL, POINTER :: ebal_cncheck(:) ! energy balance consistency check (W/m^2) (:) + REAL, POINTER :: ebal_tot_cncheck(:) ! cumulative energy balance (W/m^2) (:) + REAL, POINTER :: ebaltr(:) ! energy balance per time step (W/m^2) (:) + REAL, POINTER :: ebal_tottr(:) ! cumulative energy balance (W/m^2) (:) + REAL, POINTER :: evap_tot(:) ! cumulative evapotranspiration (mm/dels) (:) + REAL, POINTER :: osnowd0(:) ! snow depth, first time step (:) + REAL, POINTER :: precip_tot(:) ! cumulative precipitation (mm/dels) (:) + REAL, POINTER :: rnoff_tot(:) ! cumulative runoff (mm/dels) (:) + REAL, POINTER :: wbal(:) ! water balance per time step (mm/dels) (:) + REAL, POINTER :: wbal_tot(:) ! cumulative water balance (mm/dels) (:) + REAL, POINTER :: wbtot0(:) ! total soil water (mm), first time step (:) + REAL, POINTER :: wetbal(:) ! energy balance for wet canopy (:) + REAL, POINTER :: cansto0(:) ! canopy water storage (mm) (:) + REAL, POINTER :: owbtot(:) ! total soil water (mm), first time step (:) + REAL, POINTER :: evapc_tot(:) ! cumulative evapotranspiration (mm/dels) (:) + REAL, POINTER :: evaps_tot(:) ! cumulative evapotranspiration (mm/dels) (:) + REAL, POINTER :: rnof1_tot(:) ! cumulative runoff (mm/dels) (:) + REAL, POINTER :: rnof2_tot(:) ! cumulative runoff (mm/dels) (:) + REAL, POINTER :: snowdc_tot(:) ! cumulative runoff (mm/dels) (:) + REAL, POINTER :: wbal_tot1(:) ! cumulative water balance (mm/dels) (:) + REAL, POINTER :: delwc_tot(:) ! energy balance for wet canopy (:) + REAL, POINTER :: qasrf_tot(:) ! heat advected to the snow by precip. (:) + REAL, POINTER :: qfsrf_tot(:) ! energy of snowpack phase changes (:) + REAL, POINTER :: qssrf_tot(:) ! energy of snowpack phase changes (:) + REAL, POINTER :: Radbal (:) + REAL, POINTER :: EbalSoil (:) + REAL, POINTER :: Ebalveg (:) + REAL, POINTER :: Radbalsum (:) + +END TYPE balances_type + +CONTAINS + +SUBROUTINE alloc_balances_type(balances, mp) +IMPLICIT NONE + +TYPE(balances_data_type), INTENT(INOUT) :: balances +INTEGER, INTENT(IN) :: mp + +ALLOCATE( balances% drybal (mp) ) +ALLOCATE( balances% ebal (mp) ) +ALLOCATE( balances% ebal_tot (mp) ) +ALLOCATE( balances% ebal_cncheck (mp) ) +ALLOCATE( balances% ebal_tot_cncheck (mp) ) +ALLOCATE( balances% ebaltr (mp) ) +ALLOCATE( balances% ebal_tottr (mp) ) +ALLOCATE( balances% evap_tot (mp) ) +ALLOCATE( balances% osnowd0 (mp) ) +ALLOCATE( balances% precip_tot (mp) ) +ALLOCATE( balances% rnoff_tot (mp) ) +ALLOCATE( balances% wbal (mp) ) +ALLOCATE( balances% wbal_tot (mp) ) +ALLOCATE( balances% wbtot0 (mp) ) +ALLOCATE( balances% wetbal (mp) ) +ALLOCATE( balances% cansto0 (mp) ) +ALLOCATE( balances% owbtot (mp) ) +ALLOCATE( balances% evapc_tot (mp) ) +ALLOCATE( balances% evaps_tot (mp) ) +ALLOCATE( balances% rnof1_tot (mp) ) +ALLOCATE( balances% rnof2_tot (mp) ) +ALLOCATE( balances% snowdc_tot (mp) ) +ALLOCATE( balances% wbal_tot1 (mp) ) +ALLOCATE( balances% delwc_tot (mp) ) +ALLOCATE( balances% qasrf_tot (mp) ) +ALLOCATE( balances% qfsrf_tot (mp) ) +ALLOCATE( balances% qssrf_tot (mp) ) +ALLOCATE( balances% Radbal (mp) ) +ALLOCATE( balances% EbalSoil (mp) ) +ALLOCATE( balances% Ebalveg (mp) ) +ALLOCATE( balances% Radbalsum (mp) ) + +balances % drybal (:) = 0.0 +balances % ebal (:) = 0.0 +balances % ebal_tot (:) = 0.0 +balances % ebal_cncheck (:) = 0.0 +balances % ebal_tot_cncheck (:) = 0.0 +balances % ebaltr (:) = 0.0 +balances % ebal_tottr (:) = 0.0 +balances % evap_tot (:) = 0.0 +balances % osnowd0 (:) = 0.0 +balances % precip_tot (:) = 0.0 +balances % rnoff_tot (:) = 0.0 +balances % wbal (:) = 0.0 +balances % wbal_tot (:) = 0.0 +balances % wbtot0 (:) = 0.0 +balances % wetbal (:) = 0.0 +balances % cansto0 (:) = 0.0 +balances % owbtot (:) = 0.0 +balances % evapc_tot (:) = 0.0 +balances % evaps_tot (:) = 0.0 +balances % rnof1_tot (:) = 0.0 +balances % rnof2_tot (:) = 0.0 +balances % snowdc_tot (:) = 0.0 +balances % wbal_tot1 (:) = 0.0 +balances % delwc_tot (:) = 0.0 +balances % qasrf_tot (:) = 0.0 +balances % qfsrf_tot (:) = 0.0 +balances % qssrf_tot (:) = 0.0 +balances % Radbal (:) = 0.0 +balances % EbalSoil (:) = 0.0 +balances % Ebalveg (:) = 0.0 +balances % Radbalsum (:) = 0.0 + +RETURN +END SUBROUTINE alloc_balances_type + +SUBROUTINE dealloc_balances_type(balances) +IMPLICIT NONE + +TYPE(balances_type), INTENT(inout) :: balances + +DEALLOCATE( balances% drybal ) +DEALLOCATE( balances% ebal ) +DEALLOCATE( balances% ebal_tot ) +DEALLOCATE( balances% ebal_cncheck ) +DEALLOCATE( balances% ebal_tot_cncheck ) +DEALLOCATE( balances% ebaltr ) +DEALLOCATE( balances% ebal_tottr ) +DEALLOCATE( balances% evap_tot ) +DEALLOCATE( balances% osnowd0 ) +DEALLOCATE( balances% precip_tot ) +DEALLOCATE( balances% rnoff_tot ) +DEALLOCATE( balances% wbal ) +DEALLOCATE( balances% wbal_tot ) +DEALLOCATE( balances% wbtot0 ) +DEALLOCATE( balances% wetbal ) +DEALLOCATE( balances% cansto0 ) +DEALLOCATE( balances% owbtot ) +DEALLOCATE( balances% evapc_tot ) +DEALLOCATE( balances% evaps_tot ) +DEALLOCATE( balances% rnof1_tot ) +DEALLOCATE( balances% rnof2_tot ) +DEALLOCATE( balances% snowdc_tot ) +DEALLOCATE( balances% wbal_tot1 ) +DEALLOCATE( balances% delwc_tot ) +DEALLOCATE( balances% qasrf_tot ) +DEALLOCATE( balances% qfsrf_tot ) +DEALLOCATE( balances% qssrf_tot ) +DEALLOCATE( balances% Radbal ) +DEALLOCATE( balances% EbalSoil ) +DEALLOCATE( balances% Ebalveg ) +DEALLOCATE( balances% Radbalsum ) + +RETURN +END SUBROUTINE dealloc_balances_type + +SUBROUTINE assoc_balances_type(balances, balances_data ) +! Description: +! Associate the CABLE work pointers in the derived type structure +IMPLICIT NONE + +!Arguments +TYPE(balances_type), INTENT(IN OUT) :: balances +TYPE(balances_data_type), INTENT(IN OUT), TARGET :: balances_data + +CHARACTER(LEN=*), PARAMETER :: RoutineName='' +!End of header + +CALL nullify_balances_cbl(balances) + +balances% drybal => balances_data% drybal +balances% ebal => balances_data% ebal +balances% ebal_tot => balances_data% ebal_tot +balances% ebal_cncheck => balances_data% ebal_cncheck +balances% ebal_tot_cncheck => balances_data% ebal_tot_cncheck +balances% ebaltr => balances_data% ebaltr +balances% ebal_tottr => balances_data% ebal_tottr +balances% evap_tot => balances_data% evap_tot +balances% osnowd0 => balances_data% osnowd0 +balances% precip_tot => balances_data% precip_tot +balances% rnoff_tot => balances_data% rnoff_tot +balances% wbal => balances_data% wbal +balances% wbal_tot => balances_data% wbal_tot +balances% wbtot0 => balances_data% wbtot0 +balances% wetbal => balances_data% wetbal +balances% cansto0 => balances_data% cansto0 +balances% owbtot => balances_data% owbtot +balances% evapc_tot => balances_data% evapc_tot +balances% evaps_tot => balances_data% evaps_tot +balances% rnof1_tot => balances_data% rnof1_tot +balances% rnof2_tot => balances_data% rnof2_tot +balances% snowdc_tot => balances_data% snowdc_tot +balances% wbal_tot1 => balances_data% wbal_tot1 +balances% delwc_tot => balances_data% delwc_tot +balances% qasrf_tot => balances_data% qasrf_tot +balances% qfsrf_tot => balances_data% qfsrf_tot +balances% qssrf_tot => balances_data% qssrf_tot +balances% Radbal => balances_data% Radbal +balances% EbalSoil => balances_data% EbalSoil +balances% Ebalveg => balances_data% Ebalveg +balances% Radbalsum => balances_data% Radbalsum + +RETURN +END SUBROUTINE assoc_balances_type + +SUBROUTINE nullify_balances_cbl( balances ) +! Description: +! Nullify the CABLE work pointers in the derived type structure +IMPLICIT NONE + +!Arguments +TYPE(balances_type), INTENT(IN OUT) :: balances + +CHARACTER(LEN=*), PARAMETER :: RoutineName='NULLIFY_ASSOC_CBL_TYPES' +!End of header + +NULLIFY( balances % drybal ) +NULLIFY( balances % ebal ) +NULLIFY( balances % ebal_tot ) +NULLIFY( balances % ebal_cncheck ) +NULLIFY( balances % ebal_tot_cncheck) +NULLIFY( balances % ebaltr ) +NULLIFY( balances % ebal_tottr ) +NULLIFY( balances % evap_tot ) +NULLIFY( balances % osnowd0 ) +NULLIFY( balances % precip_tot ) +NULLIFY( balances % rnoff_tot ) +NULLIFY( balances % wbal ) +NULLIFY( balances % wbal_tot ) +NULLIFY( balances % wbtot0 ) +NULLIFY( balances % wetbal ) +NULLIFY( balances % cansto0 ) +NULLIFY( balances % owbtot ) +NULLIFY( balances % evapc_tot ) +NULLIFY( balances % evaps_tot ) +NULLIFY( balances % rnof1_tot ) +NULLIFY( balances % rnof2_tot ) +NULLIFY( balances % snowdc_tot ) +NULLIFY( balances % wbal_tot1 ) +NULLIFY( balances % delwc_tot ) +NULLIFY( balances % qasrf_tot ) +NULLIFY( balances % qfsrf_tot ) +NULLIFY( balances % qssrf_tot ) +NULLIFY( balances % Radbal ) +NULLIFY( balances % EbalSoil ) +NULLIFY( balances % Ebalveg ) +NULLIFY( balances % Radbalsum ) + +RETURN + +END SUBROUTINE nullify_balances_cbl + +END MODULE cable_balances_type_mod + + + + + + + + diff --git a/src/coupled/AM3/control/cable/CM3/bgc_pool_type.F90 b/src/coupled/AM3/control/cable/CM3/bgc_pool_type.F90 new file mode 100644 index 000000000..9697c7d5a --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/bgc_pool_type.F90 @@ -0,0 +1,115 @@ +MODULE cable_bgc_pool_type_mod + +USE cable_other_constants_mod, ONLY: r_2 + +IMPLICIT NONE + +PUBLIC :: bgc_pool_type +PUBLIC :: bgc_pool_data_type +PUBLIC :: alloc_bgc_pool_type +PUBLIC :: dealloc_bgc_pool_type +PUBLIC :: assoc_bgc_pool_type +PUBLIC :: nullify_bgc_pool_cbl + +TYPE bgc_pool_data_type + + REAL, ALLOCATABLE :: ratecp (:) ! plant carbon rate constant (1/year) + REAL, ALLOCATABLE :: ratecs (:) ! soil carbon rate constant (1/year) + REAL, ALLOCATABLE :: cplant (:,:) ! plant carbon (g C/m2)) + REAL, ALLOCATABLE :: csoil (:,:) ! soil carbon (g C/m2) + +END TYPE bgc_pool_data_type + +TYPE bgc_pool_type + + REAL, POINTER :: ratecp (:) ! plant carbon rate constant (1/year) + REAL, POINTER :: ratecs (:) ! soil carbon rate constant (1/year) + REAL, POINTER :: cplant (:,:) ! plant carbon (g C/m2)) + REAL, POINTER :: csoil (:,:) ! soil carbon (g C/m2) + +END TYPE bgc_pool_type + +CONTAINS + +SUBROUTINE alloc_bgc_pool_type(bgc_pool, mp) + +USE grid_constants_mod_cbl, ONLY: nsCs ! # soil carbon stores +USE grid_constants_mod_cbl, ONLY: nvCs ! # vegetation carbon stores + +IMPLICIT NONE + +TYPE(bgc_pool_data_type), INTENT(INOUT) :: bgc_pool +INTEGER, INTENT(IN) :: mp + +ALLOCATE( bgc_pool% ratecp (nvCs) ) +ALLOCATE( bgc_pool% ratecs (nsCs) ) +ALLOCATE( bgc_pool% cplant (mp,nvCs) ) +ALLOCATE( bgc_pool% csoil (mp,nsCs) ) + +bgc_pool % ratecp(:) = 0.0 +bgc_pool % ratecs(:) = 0.0 +bgc_pool % cplant(:,:) = 0.0 +bgc_pool % csoil (:,:) = 0.0 + +RETURN +END SUBROUTINE alloc_bgc_pool_type + +SUBROUTINE dealloc_bgc_pool_type(bgc_pool) + +TYPE(bgc_pool_type), INTENT(inout) :: bgc_pool + +DEALLOCATE ( bgc_pool % ratecp) +DEALLOCATE ( bgc_pool % ratecs) +DEALLOCATE ( bgc_pool % cplant) +DEALLOCATE ( bgc_pool % csoil ) + +RETURN +END SUBROUTINE dealloc_bgc_pool_type + +SUBROUTINE assoc_bgc_pool_type(bgc_pool, bgc_pool_data ) + +! Description: +! Associate the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(bgc_pool_type), INTENT(IN OUT) :: bgc_pool +TYPE(bgc_pool_data_type), INTENT(IN OUT), TARGET :: bgc_pool_data + +CHARACTER(LEN=*), PARAMETER :: RoutineName='' +!End of header + +CALL nullify_bgc_pool_cbl(bgc_pool) + +bgc_pool% ratecp => bgc_pool_data% ratecp +bgc_pool% ratecs => bgc_pool_data% ratecs +bgc_pool% cplant => bgc_pool_data% cplant +bgc_pool% csoil => bgc_pool_data% csoil + +RETURN +END SUBROUTINE assoc_bgc_pool_type + +SUBROUTINE nullify_bgc_pool_cbl( bgc_pool ) + +! Description: +! Nullify the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(bgc_pool_type), INTENT(IN OUT) :: bgc_pool + +CHARACTER(LEN=*), PARAMETER :: RoutineName='NULLIFY_ASSOC_CBL_TYPES' +!End of header + +NULLIFY( bgc_pool % ratecp ) +NULLIFY( bgc_pool % ratecs ) +NULLIFY( bgc_pool % cplant ) +NULLIFY( bgc_pool % csoil ) + +RETURN + +END SUBROUTINE nullify_bgc_pool_cbl + +END MODULE cable_bgc_pool_type_mod diff --git a/src/coupled/AM3/control/cable/CM3/cable_common.F90 b/src/coupled/AM3/control/cable/CM3/cable_common.F90 new file mode 100644 index 000000000..5c4c15a17 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/cable_common.F90 @@ -0,0 +1,143 @@ +!============================================================================== +! This source code is part of the +! Australian Community Atmosphere Biosphere Land Exchange (CABLE) model. +! This work is licensed under the CSIRO Open Source Software License +! Agreement (variation of the BSD / MIT License). +! +! You may not use this file except in compliance with this License. +! A copy of the License (CSIRO_BSD_MIT_License_v2.0_CABLE.txt) is located +! in each directory containing CABLE code. +! +! ============================================================================== +! Purpose: Reads vegetation and soil parameter files, fills vegin, soilin +! NB. Most soil parameters overwritten by spatially explicit datasets +! input as ancillary file (for ACCESS) or surface data file (for offline) +! Module enables accessibility of variables throughout CABLE +! +! Contact: Jhan.Srbinovsky@csiro.au +! +! History: v2.0 vegin%dleaf now calculated from leaf length and width +! Parameter files were read elsewhere in v1.8 (init_subrs) +! +! ============================================================================== + +MODULE cable_common_module + +USE cable_runtime_opts_mod ,ONLY : cable_user +USE cable_runtime_opts_mod ,ONLY : satuparam +USE cable_runtime_opts_mod ,ONLY : wiltparam + + IMPLICIT NONE + + INTEGER, PARAMETER :: pe=120 + !---allows reference to "gl"obal timestep in run (from atm_step) + !---total number of timesteps, and processing node + INTEGER, SAVE :: ktau_gl, kend_gl, knode_gl, kwidth_gl + + LOGICAL :: L_fudge = .FALSE. + + INTEGER, SAVE :: CurYear ! current year of multiannual run + + ! set from environment variable $HOME + CHARACTER(LEN=200) :: & + myhome + + ! switch to calc sil albedo using soil colour - Ticket #27 + LOGICAL :: calcsoilalbedo = .FALSE. + !---Lestevens Sept2012 + !---CASACNP switches and cycle index + LOGICAL, SAVE :: l_casacnp,l_laiFeedbk,l_vcmaxFeedbk + LOGICAL :: l_luc = .FALSE. + LOGICAL :: l_thinforest = .FALSE. + LOGICAL :: l_landuse = .FALSE. + + !---CABLE runtime switches def in this type + TYPE kbl_internal_switches + LOGICAL :: um = .FALSE., um_explicit = .FALSE., um_implicit = .FALSE., & + um_radiation = .FALSE., um_hydrology = .FALSE., esm15 = .FALSE. + LOGICAL :: offline = .FALSE., mk3l = .FALSE. + END TYPE kbl_internal_switches + + ! instantiate internal switches + TYPE(kbl_internal_switches), SAVE :: cable_runtime + + ! hydraulic_redistribution switch _soilsnow module + LOGICAL :: redistrb = .FALSE. + + TYPE organic_soil_params + !Below are the soil properties for fully organic soil + + REAL :: & + hyds_vec_organic = 1.0e-4,& + sucs_vec_organic = 10.3, & + clappb_organic = 2.91, & + ssat_vec_organic = 0.9, & + watr_organic = 0.1, & + sfc_vec_hk = 1.157407e-06, & + swilt_vec_hk = 2.31481481e-8 + + END TYPE organic_soil_params + + TYPE gw_parameters_type + + REAL :: & + MaxHorzDrainRate=2e-4, & !anisintropy * q_max [qsub] + EfoldHorzDrainRate=2.0, & !e fold rate of q_horz + MaxSatFraction=2500.0, & !parameter controll max sat fraction + hkrz=0.5, & !hyds_vec variation with z + zdepth=1.5, & !level where hyds_vec(z) = hyds_vec(no z) + frozen_frac=0.05, & !ice fraction to determine first non-frozen layer for qsub + SoilEvapAlpha = 1.0, & !modify field capacity dependence of soil evap limit + IceAlpha=3.0, & + IceBeta=1.0 + + REAL :: ice_impedence=5.0 + + TYPE(organic_soil_params) :: org + + INTEGER :: level_for_satfrac = 6 + LOGICAL :: ssgw_ice_switch = .FALSE. + + LOGICAL :: subsurface_sat_drainage = .TRUE. + + END TYPE gw_parameters_type + + TYPE(gw_parameters_type), SAVE :: gw_params + + REAL, SAVE :: &!should be able to change parameters! + max_glacier_snowd=1100.0,& + snow_ccnsw = 2.0, & + !jh!an:clobber - effectively force single layer snow + !snmin = 100.0, & ! for 1-layer; + snmin = 1., & ! for 3-layer; + max_ssdn = 750.0, & ! + max_sconds = 2.51, & ! + frozen_limit = 0.85 ! EAK Feb2011 (could be 0.95) + +contains + + ELEMENTAL FUNCTION IS_LEAPYEAR( YYYY ) + IMPLICIT NONE + INTEGER,INTENT(IN) :: YYYY + LOGICAL :: IS_LEAPYEAR + + IS_LEAPYEAR = .FALSE. + IF ( ( ( MOD( YYYY, 4 ) .EQ. 0 .AND. MOD( YYYY, 100 ) .NE. 0 ) .OR. & + MOD( YYYY,400 ) .EQ. 0 ) ) IS_LEAPYEAR = .TRUE. + + END FUNCTION IS_LEAPYEAR + + FUNCTION LEAP_DAY( YYYY ) + IMPLICIT NONE + INTEGER :: YYYY, LEAP_DAY + + IF ( IS_LEAPYEAR ( YYYY ) ) THEN + LEAP_DAY = 1 + ELSE + LEAP_DAY = 0 + END IF + END FUNCTION LEAP_DAY + + + +END MODULE cable_common_module diff --git a/src/coupled/AM3/control/cable/CM3/cable_define_types.F90 b/src/coupled/AM3/control/cable/CM3/cable_define_types.F90 new file mode 100644 index 000000000..6337bb888 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/cable_define_types.F90 @@ -0,0 +1,72 @@ +!============================================================================== +! This source code is part of the +! Australian Community Atmosphere Biosphere Land Exchange (CABLE) model. +! This work is licensed under the CSIRO Open Source Software License +! Agreement (variation of the BSD / MIT License). +! +! You may not use this file except in compliance with this License. +! A copy of the License (CSIRO_BSD_MIT_License_v2.0_CABLE.txt) is located +! in each directory containing CABLE code. +! +! ============================================================================== +! Purpose: defines parameters, variables and derived types, allocation and +! deallocation of these derived types +! +! Contact: Bernard.Pak@csiro.au +! +! History: Brings together define_dimensions and define_types from v1.4b +! rs20 now in veg% instead of soil% +! fes split into fess and fesp (though fes still defined) +! +! Jan 2016: Now includes climate% for use in climate variables required for +! prognostic phenology and potential veg type +! ============================================================================== + +MODULE cable_def_types_mod + +! Scattered throughout CABLE (science code) there are USEs of these vars which +! are/were declared/defined in multiple places. We are migrating to only having +! them defined in one place. Bringing them into the header here satisfies legacy +USE grid_constants_mod_cbl, ONLY: nrb, nrs, mp, swb +USE grid_constants_mod_cbl, ONLY: mstype => nsoil_max ! # of soil types [9] +USE grid_constants_mod_cbl, ONLY: mvtype => ntype_max ! # of PFT types [17] +USE grid_constants_mod_cbl, ONLY: ms => nsl ! # soil layers !sm_levels in JULES IO +USE grid_constants_mod_cbl, ONLY: msn => nsnl ! # snow layers +USE grid_constants_mod_cbl, ONLY: ncp => nvCs ! # vegetation carbon s +USE grid_constants_mod_cbl, ONLY: ncs => nsCs ! # soil carbon stores +USE grid_constants_mod_cbl, ONLY: ntype_max ! Max # tiles ! compile time constant +USE grid_constants_mod_cbl, ONLY: mf ! # leaves (sunlit, shaded) +USE grid_constants_mod_cbl, ONLY: niter ! # iterations for za/L +USE cable_other_constants_mod, ONLY: r_2 ! currently DOUBLE precision was + ! SELECTED_REAL_KIND(12, 50) + +! Scattered throughout CABLE (science code) there are USEs of these vars. We are +! ascertaining (per "module") how we can better describe this data structure. As +! a first step they are now declared/defined in independent, per module, files. +! Bringing them into the header here satisfies legacy +USE cable_canopy_type_mod, ONLY: canopy_type +USE cable_met_type_mod, ONLY: met_type +USE cable_air_type_mod, ONLY: air_type +USE cable_balances_type_mod, ONLY: balances_type +USE cable_soil_type_mod, ONLY: soil_parameter_type => soil_type +USE cable_veg_type_mod, ONLY: veg_parameter_type => veg_type +USE cable_soil_snow_type_mod, ONLY: soil_snow_type +USE cable_radiation_type_mod, ONLY: radiation_type +USE cable_roughness_type_mod, ONLY: roughness_type +USE cable_bgc_pool_type_mod, ONLY: bgc_pool_type +USE cable_climate_type_mod, ONLY: climate_type +USE cable_sum_flux_type_mod, ONLY: sum_flux_type + +IMPLICIT NONE + +PUBLIC + +! CABLE special KINDs for representing INTEGER/REAL values with at least +! 10-digit precision. NA in UM/JULES anyway as -i8 -r8 compile flags overrride + +INTEGER, PARAMETER :: i_d = KIND(9) ! this is useless but needs to be def + +INTEGER :: mland ! # land grid cells where is this used? +INTEGER, PARAMETER :: n_ktherm = 3 ! where is this used? remove? local? + +END MODULE cable_def_types_mod diff --git a/src/coupled/AM3/control/cable/CM3/cbl_canopy_type.F90 b/src/coupled/AM3/control/cable/CM3/cbl_canopy_type.F90 new file mode 100644 index 000000000..615642fa7 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/cbl_canopy_type.F90 @@ -0,0 +1,587 @@ +MODULE cable_canopy_type_mod + +USE cable_other_constants_mod, ONLY: r_2 + +IMPLICIT NONE + +PUBLIC :: canopy_type +PUBLIC :: canopy_data_type +PUBLIC :: alloc_canopy_type +PUBLIC :: dealloc_canopy_type +PUBLIC :: assoc_canopy_type +PUBLIC :: nullify_canopy_cbl + +! Canopy/vegetation variables: +TYPE canopy_data_type + + REAL, ALLOCATABLE, PUBLIC :: cansto(:) ! canopy water storage (mm) + REAL, ALLOCATABLE, PUBLIC :: cduv(:) ! drag coefficient for momentum + REAL, ALLOCATABLE, PUBLIC :: delwc(:) ! change in canopy water store (mm/dels) + REAL, ALLOCATABLE, PUBLIC :: dewmm(:) ! dewfall (mm) + REAL, ALLOCATABLE, PUBLIC :: fe(:) ! total latent heat (W/m2) + REAL, ALLOCATABLE, PUBLIC :: fh(:) ! total sensible heat (W/m2) + REAL, ALLOCATABLE, PUBLIC :: fpn(:) ! plant photosynthesis (g C m-2 s-1) + REAL, ALLOCATABLE, PUBLIC :: frp(:) ! plant respiration (g C m-2 s-1) + REAL, ALLOCATABLE, PUBLIC :: frpw(:) ! plant respiration (woody component) (g C m-2 s-1) + REAL, ALLOCATABLE, PUBLIC :: frpr(:) ! plant respiration (root component) (g C m-2 s-1) + REAL, ALLOCATABLE, PUBLIC :: frs(:) ! soil respiration (g C m-2 s-1) + REAL, ALLOCATABLE, PUBLIC :: fnee(:) ! net carbon flux (g C m-2 s-1) + REAL, ALLOCATABLE, PUBLIC :: frday(:) ! daytime leaf resp + REAL, ALLOCATABLE, PUBLIC :: fnv(:) ! net rad. avail. to canopy (W/m2) + REAL, ALLOCATABLE, PUBLIC :: fev(:) ! latent hf from canopy (W/m2) + REAL, ALLOCATABLE, PUBLIC :: epot(:) ! total potential evaporation + REAL, ALLOCATABLE, PUBLIC :: fnpp(:) ! npp flux + REAL, ALLOCATABLE, PUBLIC :: fevw_pot(:) ! potential lat heat from canopy + REAL, ALLOCATABLE, PUBLIC :: gswx_T(:) ! ! stom cond for water + REAL, ALLOCATABLE, PUBLIC :: cdtq(:) ! drag coefficient for momentum + REAL, ALLOCATABLE, PUBLIC :: wetfac_cs(:) ! + REAL, ALLOCATABLE, PUBLIC :: fevw(:) ! lat heat fl wet canopy (W/m2) + REAL, ALLOCATABLE, PUBLIC :: fhvw(:) ! sens heatfl from wet canopy (W/m2) + REAL, ALLOCATABLE, PUBLIC :: oldcansto(:) ! canopy water storage (mm) + REAL, ALLOCATABLE, PUBLIC :: fhv(:) ! sens heatfl from canopy (W/m2) + REAL, ALLOCATABLE, PUBLIC :: fns(:) ! net rad avail to soil (W/m2) + REAL, ALLOCATABLE, PUBLIC :: fhs(:) ! sensible heat flux from soil + REAL, ALLOCATABLE, PUBLIC :: fhs_cor(:) ! + REAL, ALLOCATABLE, PUBLIC :: ga(:) ! ground heat flux (W/m2) ??? + REAL, ALLOCATABLE, PUBLIC :: ghflux(:) ! ground heat flux (W/m2) ??? + REAL, ALLOCATABLE, PUBLIC :: precis(:) ! throughfall to soil, after snow (mm) + REAL, ALLOCATABLE, PUBLIC :: qscrn(:) ! specific humudity at screen height (g/g) + REAL, ALLOCATABLE, PUBLIC :: rnet(:) ! net radiation absorbed by surface (W/m2) + REAL, ALLOCATABLE, PUBLIC :: rniso(:) !isothermal net radiation absorbed by surface (W/m2) + REAL, ALLOCATABLE, PUBLIC :: segg(:) ! latent heatfl from soil mm + REAL, ALLOCATABLE, PUBLIC :: sghflux(:) ! ground heat flux (W/m2) ??? + REAL, ALLOCATABLE, PUBLIC :: through(:) ! canopy throughfall (mm) + REAL, ALLOCATABLE, PUBLIC :: through_sn(:) ! canopy snow throughfall (equal to precip_sn) (mm) + REAL, ALLOCATABLE, PUBLIC :: spill(:) ! can.storage excess after dewfall (mm) + REAL, ALLOCATABLE, PUBLIC :: tscrn(:) ! air temperature at screen height (oC) + REAL, ALLOCATABLE, PUBLIC :: wcint(:) ! canopy rainfall interception (mm) + REAL, ALLOCATABLE, PUBLIC :: tv(:) ! vegetation temp (K) + REAL, ALLOCATABLE, PUBLIC :: us(:) ! friction velocity + REAL, ALLOCATABLE, PUBLIC :: uscrn(:) ! wind speed at screen height (m/s) + REAL, ALLOCATABLE, PUBLIC :: vlaiw(:) ! lai adj for snow depth for calc of resistances + REAL, ALLOCATABLE, PUBLIC :: rghlai(:) ! lai adj for snow depth for calc of resistances + REAL, ALLOCATABLE, PUBLIC :: fwet(:) ! fraction of canopy wet + REAL, ALLOCATABLE, PUBLIC :: fns_cor(:) ! correction to net rad avail to soil (W/m2) + REAL, ALLOCATABLE, PUBLIC :: ga_cor(:) ! correction to ground heat flux (W/m2) + REAL, ALLOCATABLE, PUBLIC :: evapfbl(:,:) ! + REAL, ALLOCATABLE, PUBLIC :: gswx(:,:) ! stom cond for water + REAL, ALLOCATABLE, PUBLIC :: zetar(:,:) ! stability parameter (ref height) + REAL, ALLOCATABLE, PUBLIC :: zetash(:,:) ! stability parameter (shear height) + REAL(r_2), ALLOCATABLE, PUBLIC :: fess(:) ! latent heatfl from soil (w/m2) + REAL(r_2), ALLOCATABLE, PUBLIC :: fesp(:) ! latent heatfl from soil (w/m2) + REAL(r_2), ALLOCATABLE, PUBLIC :: dgdtg(:) ! derivative of gflux wrt soil temp + REAL(r_2), ALLOCATABLE, PUBLIC :: fes(:) ! latent heatfl from soil (w/m2) + REAL(r_2), ALLOCATABLE, PUBLIC :: fes_cor(:) ! latent heatfl from soil (w/m2) + REAL(r_2), ALLOCATABLE, PUBLIC :: fevc(:) ! dry canopy transpiration (w/m2) + REAL(r_2), ALLOCATABLE, PUBLIC :: ofes(:) ! latent heatfl from soil (w/m2) + REAL(r_2), ALLOCATABLE, PUBLIC :: sublayer_dz(:) ! + REAL(r_2), ALLOCATABLE, PUBLIC :: gw(:,:) ! dry canopy conductance (ms-1) edit vh 6/7/09 + REAL(r_2), ALLOCATABLE, PUBLIC :: ancj(:,:,:) ! limiting photosynthetic rates (Rubisco,RuBP,sink) vh 6/7/09 + REAL(r_2), ALLOCATABLE, PUBLIC :: tlfy(:,:) ! sunlit and shaded leaf temperatures + REAL(r_2), ALLOCATABLE, PUBLIC :: ecy(:,:) ! sunlit and shaded leaf transpiration (dry canopy) + REAL(r_2), ALLOCATABLE, PUBLIC :: ecx(:,:) ! sunlit and shaded leaf latent heat flux + REAL(r_2), ALLOCATABLE, PUBLIC :: ci(:,:,:) ! intra-cellular CO2 vh 6/7/09 + REAL(r_2), ALLOCATABLE, PUBLIC :: fwsoil(:) ! + ! vh_js ! !litter thermal conductivity (Wm-2K-1) and vapour diffusivity (m2s-1) + REAL(r_2), ALLOCATABLE, PUBLIC :: kthLitt(:) ! + REAL(r_2), ALLOCATABLE, PUBLIC :: DvLitt(:) ! + !SSEB - new variables limits on correction terms - for future use + !REAL(r_2), DIMENSION(:), POINTER :: & + ! fescor_upp,& ! upper limit on the correction term fes_cor (W/m2) + ! fescor_low ! lower limit on the correction term fes_cor (W/m2) + +END TYPE canopy_data_type + +! Canopy/vegetation variables: +TYPE canopy_type + + REAL, POINTER, PUBLIC :: cansto(:) ! canopy water storage (mm) + REAL, POINTER, PUBLIC :: cduv(:) ! drag coefficient for momentum + REAL, POINTER, PUBLIC :: delwc(:) ! change in canopy water store (mm/dels) + REAL, POINTER, PUBLIC :: dewmm(:) ! dewfall (mm) + REAL, POINTER, PUBLIC :: fe(:) ! total latent heat (W/m2) + REAL, POINTER, PUBLIC :: fh(:) ! total sensible heat (W/m2) + REAL, POINTER, PUBLIC :: fpn(:) ! plant photosynthesis (g C m-2 s-1) + REAL, POINTER, PUBLIC :: frp(:) ! plant respiration (g C m-2 s-1) + REAL, POINTER, PUBLIC :: frpw(:) ! plant respiration (woody component) (g C m-2 s-1) + REAL, POINTER, PUBLIC :: frpr(:) ! plant respiration (root component) (g C m-2 s-1) + REAL, POINTER, PUBLIC :: frs(:) ! soil respiration (g C m-2 s-1) + REAL, POINTER, PUBLIC :: fnee(:) ! net carbon flux (g C m-2 s-1) + REAL, POINTER, PUBLIC :: frday(:) ! daytime leaf resp + REAL, POINTER, PUBLIC :: fnv(:) ! net rad. avail. to canopy (W/m2) + REAL, POINTER, PUBLIC :: fev(:) ! latent hf from canopy (W/m2) + REAL, POINTER, PUBLIC :: epot(:) ! total potential evaporation + REAL, POINTER, PUBLIC :: fnpp(:) ! npp flux + REAL, POINTER, PUBLIC :: fevw_pot(:) ! potential lat heat from canopy + REAL, POINTER, PUBLIC :: gswx_T(:) ! ! stom cond for water + REAL, POINTER, PUBLIC :: cdtq(:) ! drag coefficient for momentum + REAL, POINTER, PUBLIC :: wetfac_cs(:) ! + REAL, POINTER, PUBLIC :: fevw(:) ! lat heat fl wet canopy (W/m2) + REAL, POINTER, PUBLIC :: fhvw(:) ! sens heatfl from wet canopy (W/m2) + REAL, POINTER, PUBLIC :: oldcansto(:) ! canopy water storage (mm) + REAL, POINTER, PUBLIC :: fhv(:) ! sens heatfl from canopy (W/m2) + REAL, POINTER, PUBLIC :: fns(:) ! net rad avail to soil (W/m2) + REAL, POINTER, PUBLIC :: fhs(:) ! sensible heat flux from soil + REAL, POINTER, PUBLIC :: fhs_cor(:) ! + REAL, POINTER, PUBLIC :: ga(:) ! ground heat flux (W/m2) ??? + REAL, POINTER, PUBLIC :: ghflux(:) ! ground heat flux (W/m2) ??? + REAL, POINTER, PUBLIC :: precis(:) ! throughfall to soil, after snow (mm) + REAL, POINTER, PUBLIC :: qscrn(:) ! specific humudity at screen height (g/g) + REAL, POINTER, PUBLIC :: rnet(:) ! net radiation absorbed by surface (W/m2) + REAL, POINTER, PUBLIC :: rniso(:) !isothermal net radiation absorbed by surface (W/m2) + REAL, POINTER, PUBLIC :: segg(:) ! latent heatfl from soil mm + REAL, POINTER, PUBLIC :: sghflux(:) ! ground heat flux (W/m2) ??? + REAL, POINTER, PUBLIC :: through(:) ! canopy throughfall (mm) + REAL, POINTER, PUBLIC :: through_sn(:) ! canopy snow throughfall (equal to precip_sn) (mm) + REAL, POINTER, PUBLIC :: spill(:) ! can.storage excess after dewfall (mm) + REAL, POINTER, PUBLIC :: tscrn(:) ! air temperature at screen height (oC) + REAL, POINTER, PUBLIC :: wcint(:) ! canopy rainfall interception (mm) + REAL, POINTER, PUBLIC :: tv(:) ! vegetation temp (K) + REAL, POINTER, PUBLIC :: us(:) ! friction velocity + REAL, POINTER, PUBLIC :: uscrn(:) ! wind speed at screen height (m/s) + REAL, POINTER, PUBLIC :: vlaiw(:) ! lai adj for snow depth for calc of resistances + REAL, POINTER, PUBLIC :: rghlai(:) ! lai adj for snow depth for calc of resistances + REAL, POINTER, PUBLIC :: fwet(:) ! fraction of canopy wet + REAL, POINTER, PUBLIC :: fns_cor(:) ! correction to net rad avail to soil (W/m2) + REAL, POINTER, PUBLIC :: ga_cor(:) ! correction to ground heat flux (W/m2) + REAL, POINTER, PUBLIC :: evapfbl(:,:) ! + REAL, POINTER, PUBLIC :: gswx(:,:) ! stom cond for water + REAL, POINTER, PUBLIC :: zetar(:,:) ! stability parameter (ref height) + REAL, POINTER, PUBLIC :: zetash(:,:) ! stability parameter (shear height) + REAL(r_2), POINTER, PUBLIC :: fess(:) ! latent heatfl from soil (w/m2) + REAL(r_2), POINTER, PUBLIC :: fesp(:) ! latent heatfl from soil (w/m2) + REAL(r_2), POINTER, PUBLIC :: dgdtg(:) ! derivative of gflux wrt soil temp + REAL(r_2), POINTER, PUBLIC :: fes(:) ! latent heatfl from soil (w/m2) + REAL(r_2), POINTER, PUBLIC :: fes_cor(:) ! latent heatfl from soil (w/m2) + REAL(r_2), POINTER, PUBLIC :: fevc(:) ! dry canopy transpiration (w/m2) + REAL(r_2), POINTER, PUBLIC :: ofes(:) ! latent heatfl from soil (w/m2) + REAL(r_2), POINTER, PUBLIC :: sublayer_dz(:) ! + REAL(r_2), POINTER, PUBLIC :: gw(:,:) ! dry canopy conductance (ms-1) edit vh 6/7/09 + REAL(r_2), POINTER, PUBLIC :: ancj(:,:,:) ! limiting photosynthetic rates (Rubisco,RuBP,sink) vh 6/7/09 + REAL(r_2), POINTER, PUBLIC :: tlfy(:,:) ! sunlit and shaded leaf temperatures + REAL(r_2), POINTER, PUBLIC :: ecy(:,:) ! sunlit and shaded leaf transpiration (dry canopy) + REAL(r_2), POINTER, PUBLIC :: ecx(:,:) ! sunlit and shaded leaf latent heat flux + REAL(r_2), POINTER, PUBLIC :: ci(:,:,:) ! intra-cellular CO2 vh 6/7/09 + REAL(r_2), POINTER, PUBLIC :: fwsoil(:) ! + REAL(r_2), POINTER, PUBLIC :: kthLitt(:) !!litter thermal conductivity (Wm-2K-1) and vapour diffusivity (m2s-1) + REAL(r_2), POINTER, PUBLIC :: DvLitt(:) ! + !SSEB - new variables limits on correction terms - for future use + !REAL(r_2), DIMENSION(:), POINTER :: & + ! fescor_upp,& ! upper limit on the correction term fes_cor (W/m2) + ! fescor_low ! lower limit on the correction term fes_cor (W/m2) + +END TYPE canopy_type + + +CONTAINS + +SUBROUTINE alloc_canopy_type(var, mp) + +USE grid_constants_mod_cbl, ONLY: mf ! # leaves (sunlit/shaded) +USE grid_constants_mod_cbl, ONLY: nsl ! # soil layers +USE grid_constants_mod_cbl, ONLY: niter ! number of iterations for za/L + +IMPLICIT NONE + +TYPE(canopy_data_type), INTENT(INOUT) :: var +INTEGER, INTENT(IN) :: mp + +ALLOCATE( var% fess(mp) ) +ALLOCATE( var% fesp(mp) ) +ALLOCATE( var% cansto(mp) ) +ALLOCATE( var% cduv(mp) ) +ALLOCATE( var% delwc(mp) ) +ALLOCATE( var% dewmm(mp) ) +ALLOCATE( var% dgdtg(mp) ) +ALLOCATE( var% fe(mp) ) +ALLOCATE( var% fh(mp) ) +ALLOCATE( var% fpn(mp) ) +ALLOCATE( var% frp(mp) ) +ALLOCATE( var% frpw(mp) ) +ALLOCATE( var% frpr(mp) ) +ALLOCATE( var% frs(mp) ) +ALLOCATE( var% fnee(mp) ) +ALLOCATE( var% frday(mp) ) +ALLOCATE( var% fnv(mp) ) +ALLOCATE( var% fev(mp) ) +ALLOCATE( var% fevc(mp) ) +ALLOCATE( var% fhv(mp) ) +ALLOCATE( var% fns(mp) ) +ALLOCATE( var% fhs(mp) ) +ALLOCATE( var% fhs_cor(mp) ) +ALLOCATE( var% ga(mp) ) +ALLOCATE( var% ghflux(mp) ) +ALLOCATE( var% precis(mp) ) +ALLOCATE( var% qscrn(mp) ) +ALLOCATE( var% rnet(mp) ) +ALLOCATE( var% rniso(mp) ) +ALLOCATE( var% segg(mp) ) +ALLOCATE( var% sghflux(mp) ) +ALLOCATE( var% through(mp) ) +ALLOCATE( var% through_sn(mp) ) +ALLOCATE( var% spill(mp) ) +ALLOCATE( var% tscrn(mp) ) +ALLOCATE( var% wcint(mp) ) +ALLOCATE( var% tv(mp) ) +ALLOCATE( var% us(mp) ) +ALLOCATE( var% uscrn(mp) ) +ALLOCATE( var% rghlai(mp) ) +ALLOCATE( var% vlaiw(mp) ) +ALLOCATE( var% fwet(mp) ) +ALLOCATE( var% fns_cor(mp) ) !REV_CORR variable +ALLOCATE( var% ga_cor(mp) ) !REV_CORR variable +ALLOCATE( var % evapfbl(mp,nsl) ) +ALLOCATE( var% epot(mp) ) +ALLOCATE( var% fnpp(mp) ) +ALLOCATE( var% fevw_pot(mp) ) +ALLOCATE( var% gswx_T(mp) ) +ALLOCATE( var% cdtq(mp) ) +ALLOCATE( var% wetfac_cs(mp) ) +ALLOCATE( var% fevw(mp) ) +ALLOCATE( var% fhvw(mp) ) +ALLOCATE( var% fes(mp) ) +ALLOCATE( var% fes_cor(mp) ) +ALLOCATE( var% gswx(mp,mf) ) +ALLOCATE( var% oldcansto(mp) ) +ALLOCATE( var% zetar(mp,niter) ) +ALLOCATE( var% zetash(mp,niter) ) +ALLOCATE( var % fwsoil(mp) ) +ALLOCATE( var % ofes(mp) ) +ALLOCATE( var%sublayer_dz(mp) ) +ALLOCATE( var % gw(mp,mf) ) ! dry canopy conductance (ms-1) edit vh 6/7/09 +ALLOCATE( var % ancj(mp,mf,3) ) ! limiting photosynthetic rates (Rubisco,RuBP,sink) vh 6/7/09 +ALLOCATE( var % tlfy(mp,mf) ) ! sunlit and shaded leaf temperatures +ALLOCATE( var % ecy(mp,mf) ) ! sunlit and shaded leaf transpiration (dry canopy) +ALLOCATE( var % ecx(mp,mf) ) ! sunlit and shaded leaf latent heat flux +ALLOCATE( var % ci(mp,mf,3) ) ! intra-cellular CO2 vh 6/7/09 +ALLOCATE(var % kthLitt(mp)) +ALLOCATE(var % DvLitt(mp)) +!ALLOCATE( var% fescor_upp(mp) ) !SSEB variable +!ALLOCATE( var% fescor_low(mp) ) !SSEB variable + +var % cansto(:) = 0.0 +var % cduv(:) = 0.0 +var % delwc(:) = 0.0 +var % dewmm(:) = 0.0 +var % fe(:) = 0.0 +var % fh(:) = 0.0 +var % fpn(:) = 0.0 +var % frp(:) = 0.0 +var % frpw(:) = 0.0 +var % frpr(:) = 0.0 +var % frs(:) = 0.0 +var % fnee(:) = 0.0 +var % frday(:) = 0.0 +var % fnv(:) = 0.0 +var % fev(:) = 0.0 +var % epot(:) = 0.0 +var % fnpp(:) = 0.0 +var % fevw_pot(:) = 0.0 +var % gswx_T(:) = 0.0 +var % cdtq(:) = 0.0 +var % wetfac_cs(:) = 0.0 +var % fevw(:) = 0.0 +var % fhvw(:) = 0.0 +var % oldcansto(:) = 0.0 +var % fhv(:) = 0.0 +var % fns(:) = 0.0 +var % fhs(:) = 0.0 +var % fhs_cor(:) = 0.0 +var % ga(:) = 0.0 +var % ghflux(:) = 0.0 +var % precis(:) = 0.0 +var % qscrn(:) = 0.0 +var % rnet(:) = 0.0 +var % rniso(:) = 0.0 +var % segg(:) = 0.0 +var % sghflux(:) = 0.0 +var % through(:) = 0.0 +var % through_sn(:) = 0.0 +var % spill(:) = 0.0 +var % tscrn(:) = 0.0 +var % wcint(:) = 0.0 +var % tv(:) = 0.0 +var % us(:) = 0.0 +var % uscrn(:) = 0.0 +var % vlaiw(:) = 0.0 +var % rghlai(:) = 0.0 +var % fwet(:) = 0.0 +var % fns_cor(:) = 0.0 +var % ga_cor(:) = 0.0 +var % evapfbl(:,:) = 0.0 +var % gswx(:,:) = 0.0 +var % zetar(:,:) = 0.0 +var % zetash(:,:) = 0.0 +var % fess(:) = 0.0_r_2 +var % fesp(:) = 0.0_r_2 +var % dgdtg(:) = 0.0_r_2 +var % fes(:) = 0.0_r_2 +var % fes_cor(:) = 0.0_r_2 +var % fevc(:) = 0.0_r_2 +var % ofes(:) = 0.0_r_2 +var % sublayer_dz(:) = 0.0_r_2 +var % gw(:,:) = 0.0_r_2 +var % ancj(:,:,:) = 0.0_r_2 +var % tlfy(:,:) = 0.0_r_2 +var % ecy(:,:) = 0.0_r_2 +var % ecx(:,:) = 0.0_r_2 +var % ci(:,:,:) = 0.0_r_2 +var % fwsoil(:) = 0.0_r_2 +var % kthLitt(:) = 0.0_r_2 +var % DvLitt(:) = 0.0_r_2 + + +RETURN +END SUBROUTINE alloc_canopy_type + +SUBROUTINE dealloc_canopy_type(var) + + TYPE(canopy_type), INTENT(inout) :: var + + DEALLOCATE ( var % fess ) + DEALLOCATE ( var % fesp ) + DEALLOCATE( var% cansto ) + DEALLOCATE( var% cduv ) + DEALLOCATE( var% delwc ) + DEALLOCATE( var% dewmm ) + DEALLOCATE( var% dgdtg ) + DEALLOCATE( var% fe ) + DEALLOCATE( var% fh ) + DEALLOCATE( var% fpn ) + DEALLOCATE( var% frp ) + DEALLOCATE( var% frpw ) + DEALLOCATE( var% frpr ) + DEALLOCATE( var% frs ) + DEALLOCATE( var% fnee ) + DEALLOCATE( var% frday ) + DEALLOCATE( var% fnv ) + DEALLOCATE( var% fev ) + DEALLOCATE( var% fevc ) + DEALLOCATE( var% fhv ) + DEALLOCATE( var% fns ) + DEALLOCATE( var% fhs ) + DEALLOCATE( var% fhs_cor ) + DEALLOCATE( var% ga ) + DEALLOCATE( var% ghflux ) + DEALLOCATE( var% precis ) + DEALLOCATE( var% qscrn ) + DEALLOCATE( var% rnet ) + DEALLOCATE( var% rniso ) + DEALLOCATE( var% segg ) + DEALLOCATE( var% sghflux ) + DEALLOCATE( var% through ) + DEALLOCATE( var% through_sn ) + DEALLOCATE( var% spill ) + DEALLOCATE( var% tscrn ) + DEALLOCATE( var% wcint ) + DEALLOCATE( var% tv ) + DEALLOCATE( var% us ) + DEALLOCATE( var% uscrn ) + DEALLOCATE( var% rghlai ) + DEALLOCATE( var% vlaiw ) + DEALLOCATE( var% fwet ) + DEALLOCATE( var% fns_cor ) !REV_CORR variable + DEALLOCATE( var% ga_cor ) !REV_CORR variable + DEALLOCATE ( var % evapfbl ) + DEALLOCATE( var% epot ) + DEALLOCATE( var% fnpp ) + DEALLOCATE( var% fevw_pot ) + DEALLOCATE( var% gswx_T ) + DEALLOCATE( var% cdtq ) + DEALLOCATE( var% wetfac_cs ) + DEALLOCATE( var% fevw ) + DEALLOCATE( var% fhvw ) + DEALLOCATE( var% fes ) + DEALLOCATE( var% fes_cor ) + DEALLOCATE( var% gswx ) + DEALLOCATE( var% oldcansto ) + DEALLOCATE( var% zetar ) + DEALLOCATE( var% zetash ) + DEALLOCATE ( var % fwsoil ) + DEALLOCATE ( var % ofes ) + DEALLOCATE( var% sublayer_dz ) + DEALLOCATE (var % kthLitt) + DEALLOCATE (var % DvLitt) + !DEALLOCATE( var% fescor_upp ) !SSEB variable + !DEALLOCATE( var% fescor_low ) !SSEB variable + +END SUBROUTINE dealloc_canopy_type + +SUBROUTINE assoc_canopy_type(canopy, canopy_data ) + +! Description: +! Associate the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(canopy_type), INTENT(IN OUT) :: canopy +TYPE(canopy_data_type), INTENT(IN OUT), TARGET :: canopy_data + +CHARACTER(LEN=*), PARAMETER :: RoutineName='' + +!End of header + +CALL nullify_canopy_cbl(canopy) + +canopy% cansto => canopy_data% cansto +canopy% cduv => canopy_data% cduv +canopy% delwc => canopy_data% delwc +canopy% dewmm => canopy_data% dewmm +canopy% fe => canopy_data% fe +canopy% fh => canopy_data% fh +canopy% fpn => canopy_data% fpn +canopy% frp => canopy_data% frp +canopy% frpw => canopy_data% frpw +canopy% frpr => canopy_data% frpr +canopy% frs => canopy_data% frs +canopy% fnee => canopy_data% fnee +canopy% frday => canopy_data% frday +canopy% fnv => canopy_data% fnv +canopy% fev => canopy_data% fev +canopy% epot => canopy_data% epot +canopy% fnpp => canopy_data% fnpp +canopy% fevw_pot => canopy_data% fevw_pot +canopy% gswx_T => canopy_data% gswx_T +canopy% cdtq => canopy_data% cdtq +canopy% wetfac_cs => canopy_data% wetfac_cs +canopy% fevw => canopy_data% fevw +canopy% fhvw => canopy_data% fhvw +canopy% oldcansto => canopy_data% oldcansto +canopy% fhv => canopy_data% fhv +canopy% fns => canopy_data% fns +canopy% fhs => canopy_data% fhs +canopy% fhs_cor => canopy_data% fhs_cor +canopy% ga => canopy_data% ga +canopy% ghflux => canopy_data% ghflux +canopy% precis => canopy_data% precis +canopy% qscrn => canopy_data% qscrn +canopy% rnet => canopy_data% rnet +canopy% rniso => canopy_data% rniso +canopy% segg => canopy_data% segg +canopy% sghflux => canopy_data% sghflux +canopy% through => canopy_data% through +canopy% through_sn => canopy_data% through_sn +canopy% spill => canopy_data% spill +canopy% tscrn => canopy_data% tscrn +canopy% wcint => canopy_data% wcint +canopy% tv => canopy_data% tv +canopy% us => canopy_data% us +canopy% uscrn => canopy_data% uscrn +canopy% vlaiw => canopy_data% vlaiw +canopy% rghlai => canopy_data% rghlai +canopy% fwet => canopy_data% fwet +canopy% fns_cor => canopy_data% fns_cor +canopy% ga_cor => canopy_data% ga_cor +canopy% evapfbl => canopy_data% evapfbl +canopy% gswx => canopy_data% gswx +canopy% zetar => canopy_data% zetar +canopy% zetash => canopy_data% zetash +canopy% fess => canopy_data% fess +canopy% fesp => canopy_data% fesp +canopy% dgdtg => canopy_data% dgdtg +canopy% fes => canopy_data% fes +canopy% fes_cor => canopy_data% fes_cor +canopy% fevc => canopy_data% fevc +canopy% ofes => canopy_data% ofes +canopy% sublayer_dz => canopy_data% sublayer_dz +canopy% gw => canopy_data% gw +canopy% ancj => canopy_data% ancj +canopy% tlfy => canopy_data% tlfy +canopy% ecy => canopy_data% ecy +canopy% ecx => canopy_data% ecx +canopy% ci => canopy_data% ci +canopy% fwsoil => canopy_data% fwsoil +canopy% kthLitt => canopy_data% kthLitt +canopy% DvLitt => canopy_data% DvLitt + +RETURN +END SUBROUTINE assoc_canopy_type + +!=============================================================================== +SUBROUTINE nullify_canopy_cbl( var ) + +! Description: +! Nullify the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(canopy_type), INTENT(IN OUT) :: var + +CHARACTER(LEN=*), PARAMETER :: RoutineName='NULLIFY_ASSOC_WORK_VARS_CBL' + +!End of header + + NULLIFY( var % fess ) + NULLIFY( var % fesp ) + NULLIFY( var% cansto ) + NULLIFY( var% cduv ) + NULLIFY( var% delwc ) + NULLIFY( var% dewmm ) + NULLIFY( var% dgdtg ) + NULLIFY( var% fe ) + NULLIFY( var% fh ) + NULLIFY( var% fpn ) + NULLIFY( var% frp ) + NULLIFY( var% frpw ) + NULLIFY( var% frpr ) + NULLIFY( var% frs ) + NULLIFY( var% fnee ) + NULLIFY( var% frday ) + NULLIFY( var% fnv ) + NULLIFY( var% fev ) + NULLIFY( var% fevc ) + NULLIFY( var% fhv ) + NULLIFY( var% fns ) + NULLIFY( var% fhs ) + NULLIFY( var% fhs_cor ) + NULLIFY( var% ga ) + NULLIFY( var% ghflux ) + NULLIFY( var% precis ) + NULLIFY( var% qscrn ) + NULLIFY( var% rnet ) + NULLIFY( var% rniso ) + NULLIFY( var% segg ) + NULLIFY( var% sghflux ) + NULLIFY( var% through ) + NULLIFY( var% through_sn ) + NULLIFY( var% spill ) + NULLIFY( var% tscrn ) + NULLIFY( var% wcint ) + NULLIFY( var% tv ) + NULLIFY( var% us ) + NULLIFY( var% uscrn ) + NULLIFY( var% rghlai ) + NULLIFY( var% vlaiw ) + NULLIFY( var% fwet ) + NULLIFY( var% fns_cor ) !REV_CORR variable + NULLIFY( var% ga_cor ) !REV_CORR variable + NULLIFY( var % evapfbl ) + NULLIFY( var% epot ) + NULLIFY( var% fnpp ) + NULLIFY( var% fevw_pot ) + NULLIFY( var% gswx_T ) + NULLIFY( var% cdtq ) + NULLIFY( var% wetfac_cs ) + NULLIFY( var% fevw ) + NULLIFY( var% fhvw ) + NULLIFY( var% fes ) + NULLIFY( var% fes_cor ) + NULLIFY( var% gswx ) + NULLIFY( var% oldcansto ) + NULLIFY( var% zetar ) + NULLIFY( var% zetash ) + NULLIFY( var % fwsoil ) + NULLIFY( var % ofes ) + NULLIFY( var% sublayer_dz ) + NULLIFY( var % kthLitt)! liiter resistances to heat and vapour transfer + NULLIFY( var % DvLitt) + !DEALLOCATE( var% fescor_upp ) !SSEB variable + !DEALLOCATE( var% fescor_low ) !SSEB variable + +RETURN + +END SUBROUTINE nullify_canopy_cbl + +END MODULE cable_canopy_type_mod diff --git a/src/coupled/AM3/control/cable/CM3/cbl_cbm_mod.F90 b/src/coupled/AM3/control/cable/CM3/cbl_cbm_mod.F90 new file mode 100644 index 000000000..26de76a76 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/cbl_cbm_mod.F90 @@ -0,0 +1,403 @@ +MODULE cable_cbm_module + + IMPLICIT NONE + + PRIVATE + PUBLIC cbm_expl, cbm_impl + +CONTAINS + +SUBROUTINE cbm_expl( mp, nrb, ktau,dels, air, bgc, canopy, met, & + bal, rad, rough, soil, ssnow, sum_flux, veg, climate ) +!subrs: +USE cbl_albedo_mod, ONLY: albedo +USE cbl_init_radiation_module, ONLY: init_radiation +USE cbl_masks_mod, ONLY: fveg_mask, fsunlit_mask, fsunlit_veg_mask +USE snow_aging_mod, ONLY: snow_aging +USE cable_roughness_module, ONLY: ruff_resist +USE cable_air_module, ONLY: define_air +USE cable_canopy_module, ONLY: define_canopy + +USE cable_common_module +USE cable_carbon_module + +USE cable_def_types_mod, ONLY: met_type, radiation_type, veg_parameter_type, & + soil_parameter_type, roughness_type, & + canopy_type, soil_snow_type, balances_type, & + air_type, bgc_pool_type, sum_flux_type, & + climate_type + +! data: scalars +USE cable_other_constants_mod, ONLY: Ccoszen_tols => coszen_tols +USE cable_other_constants_mod, ONLY: Crad_thresh => rad_thresh +USE cable_other_constants_mod, ONLY: clai_thresh => lai_thresh +USE cable_other_constants_mod, ONLY: cgauss_w => gauss_w +USE cable_math_constants_mod, ONLY: cpi => pi +USE cable_math_constants_mod, ONLY: cpi180 => pi180 +USE cable_phys_constants_mod, ONLY: tfrz +USE cable_phys_constants_mod, ONLY: cEMLEAF=> EMLEAF +USE cable_phys_constants_mod, ONLY: cEMSOIL=> EMSOIL +USE cable_phys_constants_mod, ONLY: cSBOLTZ=> SBOLTZ +USE grid_constants_mod_cbl, ONLY: ICE_SoilType, nsl, nsnl +USE cable_surface_types_mod, ONLY: ICE_SurfaceType => ICE_cable, lakes_cable + +IMPLICIT NONE + +! CABLE model variables +TYPE (air_type), INTENT(INOUT) :: air +TYPE (bgc_pool_type), INTENT(INOUT) :: bgc +TYPE (canopy_type), INTENT(INOUT) :: canopy +TYPE (met_type), INTENT(INOUT) :: met +TYPE (balances_type), INTENT(INOUT) :: bal +TYPE (radiation_type), INTENT(INOUT) :: rad +TYPE (roughness_type), INTENT(INOUT) :: rough +TYPE (soil_snow_type), INTENT(INOUT) :: ssnow +TYPE (sum_flux_type), INTENT(INOUT) :: sum_flux +TYPE (soil_parameter_type), INTENT(INOUT) :: soil +TYPE (veg_parameter_type), INTENT(INOUT) :: veg +TYPE (climate_type) :: climate + +INTEGER, INTENT(IN) :: mp ! # active land points +INTEGER, INTENT(IN) :: nrb +REAL, INTENT(IN) :: dels ! time setp size (s) +INTEGER, INTENT(IN) :: ktau +INTEGER :: k,kk,j + +! local vars +LOGICAL :: veg_mask(mp), sunlit_mask(mp), sunlit_veg_mask(mp) +LOGICAL :: cbl_standalone = .FALSE. +LOGICAL :: jls_standalone = .FALSE. +LOGICAL :: jls_radiation = .FALSE. + +!co-efficients usoughout init_radiation ` called from _albedo as well +REAL :: c1(mp,nrb) +REAL :: rhoch(mp,nrb) +REAL :: xk(mp,nrb) +REAL :: veg_wt(mp) +REAL :: veg_trad(mp) +REAL :: soil_wt(mp) +REAL :: soil_trad(mp) +REAL :: trad_corr(mp) + +CHARACTER(LEN=8), PARAMETER :: subr_name = "ExpCbmT_" + +!explicit ONLY +CALL ruff_resist( veg, rough, ssnow, canopy, veg%vlai, veg%hc, canopy%vlaiw ) + +! Height adjustment not used in ACCESS CM2. See CABLE ticket 197 +! met%tk = met%tk + C%grav/C%capp*(rough%zref_tq + 0.9*rough%z0m) +CALL define_air (met, air) + +call fveg_mask( veg_mask, mp, Clai_thresh, canopy%vlaiw ) +call fsunlit_mask( sunlit_mask, mp, CRAD_THRESH,( met%fsd(:,1)+met%fsd(:,2) ) ) +call fsunlit_veg_mask( sunlit_veg_mask, veg_mask, sunlit_mask, mp ) + +CALL init_radiation( rad%extkb, rad%extkd, & + !ExtCoeff_beam, ExtCoeff_dif, + rad%extkbm, rad%extkdm, Rad%Fbeam, & + !EffExtCoeff_beam, EffExtCoeff_dif, RadFbeam, + c1, rhoch, xk, & + mp,nrb, & + Clai_thresh, Ccoszen_tols, CGauss_w, Cpi, Cpi180, & + cbl_standalone, jls_standalone, jls_radiation, & + subr_name, & + veg_mask, & + veg%Xfang, veg%taul, veg%refl, & + !VegXfang, VegTaul, VegRefl + met%coszen, int(met%DoY), met%fsd, & + !coszen, metDoY, SW_down, + canopy%vlaiw & + ) !reducedLAIdue2snow + +!Ticket 331 refactored albedo code for JAC +CALL snow_aging(ssnow%snage,mp,dels,ssnow%snowd,ssnow%osnowd,ssnow%tggsn(:,1), & + ssnow%tgg(:,1),ssnow%isflag,veg%iveg,soil%isoilm) + +!explicit ONLY +CALL Albedo( ssnow%AlbSoilsn, soil%AlbSoil, & + !AlbSnow, AlbSoil, + mp, nrb, & + ICE_SoilType, lakes_cable, & + jls_radiation, & + veg_mask, & + Ccoszen_tols, CGAUSS_W, & + veg%iveg, soil%isoilm, veg%refl, veg%taul, & + !surface_type, VegRefl, VegTaul, + met%coszen, canopy%vlaiw, & + !coszen, reducedLAIdue2snow, + ssnow%snowd, ssnow%ssdnn, ssnow%tgg(:,1), ssnow%snage, & + !SnowDepth, SnowDensity, SoilTemp, SnowAge, + xk, c1, rhoch, & + rad%fbeam, rad%albedo, & + !RadFbeam, RadAlbedo, + rad%extkb, rad%extkd, & + !ExtCoeff_beam, ExtCoeff_dif, + rad%extkbm, rad%extkdm, & + !EffExtCoeff_beam, EffExtCoeff_dif, + rad%rhocbm, rad%rhocdf, & + !CanopyRefl_beam,CanopyRefl_dif, + rad%cexpkbm, rad%cexpkdm, & + !CanopyTransmit_beam, CanopyTransmit_dif, + rad%reffbm, rad%reffdf & + ) !EffSurfRefl_beam, EffSurfRefldif_ + +! on 1st call tss, wetfac initialized in _um_init_soilsnow +! on subsequent calls it has the value as updated in soilsnow +ssnow%otss = ssnow%tss + +! on subsequent calls it has the value as updated in CALL from surfwetness +ssnow%owetfac = ssnow%wetfac + +CALL define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,climate, sunlit_veg_mask, canopy%vlaiw) + +! reset tss, wetfac, cansto to value corresponding to beginning of timestep +ssnow%tss = ssnow%otss +ssnow%wetfac = ssnow%owetfac +canopy%cansto = canopy%oldcansto + +! need to adjust fe after soilsnow +canopy%fev = canopy%fevc + canopy%fevw + +! Calculate total latent heat flux: +canopy%fe = canopy%fev + canopy%fes + +! Calculate net radiation absorbed by soil + veg +canopy%rnet = canopy%fns + canopy%fnv + +! Calculate radiative/skin temperature: +!Jan 2018: UM assumes a single emissivity for the surface in the radiation scheme +!To accommodate this a single value of is 1. is assumed in ACCESS +! any leaf/soil emissivity /=1 must be incorporated into rad%trad. +! check that emissivities (pft and nvg) set = 1 within the UM i/o configuration +! CM2 - further adapted to pass the correction term onto %trad correctly +!rad%trad = ( ( 1.-rad%transd ) * Cemleaf * canopy%tv**4 + & +! rad%transd * Cemsoil * ssnow%otss**4 + canopy%fns_cor/CSBOLTZ )**0.25 + +veg_wt = 1.0 - rad%transd +veg_trad = Cemleaf * canopy%tv**4 +soil_wt = rad%transd +soil_trad = Cemsoil * ssnow%otss**4 +trad_corr = canopy%fns_cor/CSBOLTZ + +rad%trad = ( veg_wt * veg_trad ) + ( soil_wt * soil_trad ) + trad_corr +rad%trad = rad%trad**0.25 + +RETURN +END SUBROUTINE cbm_expl + +SUBROUTINE cbm_impl( cycleno, numcycles, mp, nrb, ktau, dels, & + air, bgc, canopy, met, bal, rad, rough, & + soil, ssnow, sum_flux, veg, climate ) + +USE cable_common_module +USE cable_carbon_module + +USE cable_def_types_mod, ONLY : met_type, radiation_type, veg_parameter_type, & + soil_parameter_type, roughness_type, & + canopy_type, soil_snow_type, balances_type, & + air_type, bgc_pool_type, sum_flux_type + +USE cable_def_types_mod, only : climate_type + +USE casadimension, only : icycle ! used in casa_cnp +USE cable_roughness_module, only : ruff_resist +USE cable_air_module, only : define_air +USE cable_canopy_module, only : define_canopy + +!subrs: +USE cbl_albedo_mod, ONLY: albedo +USE cbl_init_radiation_module, ONLY: init_radiation +USE cbl_soil_snow_main_module, ONLY : soil_snow +USE cbl_masks_mod, ONLY: fveg_mask, fsunlit_mask, fsunlit_veg_mask +USE snow_aging_mod, ONLY : snow_aging + +!jhan:pass these !data +USE cable_other_constants_mod, ONLY: Ccoszen_tols => coszen_tols +USE cable_other_constants_mod, ONLY: Crad_thresh => rad_thresh +USE cable_other_constants_mod, ONLY: clai_thresh => lai_thresh +USE cable_other_constants_mod, ONLY: cgauss_w => gauss_w +USE cable_math_constants_mod, ONLY: cpi => pi +USE cable_math_constants_mod, ONLY: cpi180 => pi180 +USE cable_phys_constants_mod, ONLY: cEMLEAF=> EMLEAF +USE cable_phys_constants_mod, ONLY: cEMSOIL=> EMSOIL +USE cable_phys_constants_mod, ONLY: cSBOLTZ=> SBOLTZ +USE grid_constants_mod_cbl, ONLY: ICE_SoilType +USE cable_surface_types_mod, ONLY: ICE_SurfaceType => ICE_cable, lakes_cable + +IMPLICIT NONE + +!ptrs to local constants +! CABLE model variables +TYPE (air_type), INTENT(INOUT) :: air +TYPE (bgc_pool_type), INTENT(INOUT) :: bgc +TYPE (canopy_type), INTENT(INOUT) :: canopy +TYPE (met_type), INTENT(INOUT) :: met +TYPE (balances_type), INTENT(INOUT) :: bal +TYPE (radiation_type), INTENT(INOUT) :: rad +TYPE (roughness_type), INTENT(INOUT) :: rough +TYPE (soil_snow_type), INTENT(INOUT) :: ssnow +TYPE (sum_flux_type), INTENT(INOUT) :: sum_flux +TYPE (soil_parameter_type), INTENT(INOUT) :: soil +TYPE (veg_parameter_type), INTENT(INOUT) :: veg +TYPE (climate_type) :: climate + +INTEGER, INTENT(IN) :: cycleno ! # cycle in UM implicit dynamics +INTEGER, INTENT(IN) :: numcycles ! total # cycles in implicit dynamics +INTEGER, INTENT(IN) :: mp ! # active land points +INTEGER, INTENT(IN) :: nrb +REAL, INTENT(IN) :: dels ! time setp size (s) +INTEGER, INTENT(IN) :: ktau +INTEGER :: k,kk,j + +LOGICAL :: veg_mask(mp), sunlit_mask(mp), sunlit_veg_mask(mp) + +LOGICAL :: cbl_standalone = .FALSE. +LOGICAL :: jls_standalone = .FALSE. +LOGICAL :: jls_radiation = .FALSE. + +!co-efficients used in init_radiation and albedo +REAL :: c1(mp,nrb) +REAL :: rhoch(mp,nrb) +REAL :: xk(mp,nrb) + +REAL :: veg_wt(mp) +REAL :: veg_trad(mp) +REAL :: soil_wt(mp) +REAL :: soil_trad(mp) +REAL :: trad_corr(mp) + +CHARACTER(LEN=8), PARAMETER :: subr_name = "cbm_impl" + +CALL define_air (met, air) + +call fveg_mask( veg_mask, mp, Clai_thresh, canopy%vlaiw ) +call fsunlit_mask( sunlit_mask, mp, CRAD_THRESH,( met%fsd(:,1)+met%fsd(:,2) ) ) +call fsunlit_veg_mask( sunlit_veg_mask, veg_mask, sunlit_mask, mp ) + +CALL init_radiation( rad%extkb, rad%extkd, & + !ExtCoeff_beam, ExtCoeff_dif, + rad%extkbm, rad%extkdm, Rad%Fbeam, & + !EffExtCoeff_beam, EffExtCoeff_dif, RadFbeam, + c1, rhoch, xk, & + mp,nrb, & + Clai_thresh, Ccoszen_tols, CGauss_w, Cpi, Cpi180, & + cbl_standalone, jls_standalone, jls_radiation, & + subr_name, & + veg_mask, & + veg%Xfang, veg%taul, veg%refl, & + !VegXfang, VegTaul, VegRefl + met%coszen, int(met%DoY), met%fsd, & + !coszen, metDoY, SW_down, + canopy%vlaiw & + ) !reducedLAIdue2snow + +! on 1st call tss, wetfac initialized in _um_init_soilsnow +! on subsequent calls it has the value as updated in soilsnow +ssnow%otss = ssnow%tss + +! on subsequent calls it has the value as updated in CALL from surfwetness +ssnow%owetfac = ssnow%wetfac + +CALL define_canopy(bal,rad,rough,air,met,dels,ssnow,soil,veg, canopy,climate, sunlit_veg_mask, canopy%vlaiw) + +CALL soil_snow(dels, soil, ssnow, canopy, met, bal,veg) +ssnow%deltss = ssnow%tss-ssnow%otss + +! reset tss & wetfac to value corresponding to beginning of timestep +IF( cycleno .NE. numcycles ) THEN + ssnow%tss = ssnow%otss + ssnow%wetfac = ssnow%owetfac + canopy%cansto = canopy%oldcansto +ENDIF + +! correction required for energy balance in online simulations +! REV_CORR - multiple changes to address %cls bugs and revised correction +! terms. Also - do not apply correction terms if using SLI +! SSEB package will move these calculations to within soilsnow +IF( cable_user%SOIL_STRUC=='default') THEN + + canopy%fhs = canopy%fhs + ( ssnow%tss-ssnow%otss ) * ssnow%dfh_dtg + canopy%fhs_cor = canopy%fhs_cor + ( ssnow%tss-ssnow%otss ) * ssnow%dfh_dtg + canopy%fh = canopy%fhv + canopy%fhs + + !canopy%fes = canopy%fes + ( ssnow%tss-ssnow%otss ) * & + ! ( ssnow%dfe_ddq * ssnow%ddq_dtg ) + ! !( ssnow%cls * ssnow%dfe_ddq * ssnow%ddq_dtg ) + ! + !Ticket 137 - remove double couting of %cls + !canopy%fes_cor = canopy%fes_cor + ( ssnow%tss-ssnow%otss ) * & + ! ( ssnow%dfe_ddq * ssnow%ddq_dtg ) + ! ( ssnow%cls * ssnow%dfe_ddq * ssnow%ddq_dtg ) + + !INH rewritten in terms of %dfe_dtg - NB factor %cls above was a bug + canopy%fes = canopy%fes + ( ssnow%tss-ssnow%otss ) * ssnow%dfe_dtg + + !INH NB factor %cls in %fes_cor above was a bug - see Ticket #135 #137 + canopy%fes_cor = canopy%fes_cor + (ssnow%tss-ssnow%otss) * ssnow%dfe_dtg + !canopy%fes_cor = canopy%fes_cor + ssnow%cls*(ssnow%tss-ssnow%otss) & + ! * ssnow%dfe_dtg + + IF (cable_user%L_REV_CORR) THEN + !INH need to add on corrections to all terms in the soil energy balance + canopy%fns_cor = canopy%fns_cor + (ssnow%tss-ssnow%otss)*ssnow%dfn_dtg + + !NB %fns_cor also added onto out%Rnet and out%LWnet in cable_output and + !cable_checks as the correction term needs to pass through the + !canopy in entirity not be partially absorbed and %fns not used there + !(as would be the case if rad%flws were changed) + canopy%fns = canopy%fns + ( ssnow%tss-ssnow%otss )*ssnow%dfn_dtg + + canopy%ga_cor = canopy%ga_cor + ( ssnow%tss-ssnow%otss )*canopy%dgdtg + canopy%ga = canopy%ga + ( ssnow%tss-ssnow%otss )*canopy%dgdtg + + !assign all the correction to %fes to %fess - none to %fesp + canopy%fess = canopy%fess + ( ssnow%tss-ssnow%otss ) * ssnow%dfe_dtg + + ENDIF +ENDIF +! need to adjust fe after soilsnow +canopy%fev = canopy%fevc + canopy%fevw + +! Calculate total latent heat flux: +canopy%fe = canopy%fev + canopy%fes + +! Calculate net radiation absorbed by soil + veg +canopy%rnet = canopy%fns + canopy%fnv + +! Calculate radiative/skin temperature: +!Jan 2018: UM assumes a single emissivity for the surface in the radiation scheme +!To accommodate this a single value of is 1. is assumed in ACCESS +! any leaf/soil emissivity /=1 must be incorporated into rad%trad. +! check that emissivities (pft and nvg) set = 1 within the UM i/o configuration +! CM2 - further adapted to pass the correction term onto %trad correctly + +veg_wt = 1.0 - rad%transd +veg_trad = Cemleaf * canopy%tv**4 +soil_wt = rad%transd +soil_trad = Cemsoil * ssnow%otss**4 +trad_corr = canopy%fns_cor/CSBOLTZ + +rad%trad = ( veg_wt * veg_trad ) + ( soil_wt * soil_trad ) + trad_corr +rad%trad = rad%trad**0.25 + +! In physical model only (i.e. without CASA-CNP) +! calculate canopy%frp +CALL plantcarb(veg,bgc,met,canopy) + +!calculate canopy%frs +CALL soilcarb(soil, ssnow, veg, bgc, met, canopy) + +CALL carbon_pl(dels, soil, ssnow, veg, canopy, bgc) + +canopy%fnpp = -1.0* canopy%fpn - canopy%frp +canopy%fnee = canopy%fpn + canopy%frs + canopy%frp + +RETURN +END SUBROUTINE cbm_impl + + + + +END MODULE cable_cbm_module + + diff --git a/src/coupled/AM3/control/cable/CM3/climate_type.F90 b/src/coupled/AM3/control/cable/CM3/climate_type.F90 new file mode 100644 index 000000000..5431b2170 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/climate_type.F90 @@ -0,0 +1,306 @@ +MODULE cable_climate_type_mod + +USE cable_other_constants_mod, ONLY: r_2 + +IMPLICIT NONE + +PUBLIC :: climate_type +PUBLIC :: climate_data_type +PUBLIC :: alloc_climate_type +PUBLIC :: dealloc_climate_type +PUBLIC :: assoc_climate_type +PUBLIC :: nullify_climate_cbl + +! Climate data: +TYPE climate_data_type + + INTEGER :: nyear_average = 20 + INTEGER :: nday_average = 31 + INTEGER :: nyears ! number of years in climate record + INTEGER :: doy ! day of year + + INTEGER, ALLOCATABLE :: chilldays (:) ! length of chilling period (period with T<5deg) + INTEGER, ALLOCATABLE :: iveg (:) ! potential vegetation type based on climatic constraints + INTEGER, ALLOCATABLE :: biome (:) + + REAL, ALLOCATABLE :: dtemp (:) ! daily temperature + REAL, ALLOCATABLE :: dmoist (:) ! daily moisture availability + REAL, ALLOCATABLE :: mtemp (:) ! mean temperature over the last 31 days + REAL, ALLOCATABLE :: qtemp (:) ! mean temperature over the last 91 days + REAL, ALLOCATABLE :: mmoist (:) ! monthly moisture availability + REAL, ALLOCATABLE :: mtemp_min (:) ! minimum monthly temperature + REAL, ALLOCATABLE :: mtemp_max (:) ! maximum monhtly temperature + REAL, ALLOCATABLE :: qtemp_max (:) ! mean temperature of the warmest quarter (so far this year) + REAL, ALLOCATABLE :: mtemp_min20 (:) ! minimum monthly temperature, averaged over 20 y + REAL, ALLOCATABLE :: mtemp_max20 (:) ! maximum monhtly temperature, averaged over 20 y + REAL, ALLOCATABLE :: atemp_mean (:) ! annual average temperature + REAL, ALLOCATABLE :: AGDD5 (:) + REAL, ALLOCATABLE :: GDD5 (:) ! growing degree day sum relative to 5deg base temperature + REAL, ALLOCATABLE :: AGDD0 (:) + REAL, ALLOCATABLE :: GDD0 (:) ! growing degree day sum relative to 0deg base temperature + REAL, ALLOCATABLE :: alpha_PT (:) ! ratio of annual evap to annual PT evap + REAL, ALLOCATABLE :: evap_PT (:) ! annual PT evap [mm] + REAL, ALLOCATABLE :: aevap (:) ! annual evap [mm] + REAL, ALLOCATABLE :: alpha_PT20 (:) + REAL, ALLOCATABLE :: qtemp_max_last_year (:) ! mean temperature of the warmest quarter (last calendar year) + + REAL, ALLOCATABLE :: mtemp_min_20 (:,:) ! mimimum monthly temperatures for the last 20 y + REAL, ALLOCATABLE :: mtemp_max_20 (:,:) ! maximum monthly temperatures for the last 20 y + REAL, ALLOCATABLE :: dtemp_31 (:,:) ! daily temperature for the last 31 days + REAL, ALLOCATABLE :: dmoist_31 (:,:) ! daily moisture availability for the last 31 days + REAL, ALLOCATABLE :: alpha_PT_20 (:,:) ! priestley Taylor Coefft for last 20 y + REAL, ALLOCATABLE :: dtemp_91 (:,:) ! daily temperature for the last 91 days + +END TYPE climate_data_type + +TYPE climate_type + + INTEGER, POINTER :: nyear_average + INTEGER, POINTER :: nday_average + INTEGER, POINTER :: nyears ! number of years in climate record + INTEGER, POINTER :: doy ! day of year + + INTEGER, POINTER :: chilldays (:) ! length of chilling period (period with T<5deg) + INTEGER, POINTER :: iveg (:) ! potential vegetation type based on climatic constraints + INTEGER, POINTER :: biome (:) + + REAL, POINTER :: dtemp (:) ! daily temperature + REAL, POINTER :: dmoist (:) ! daily moisture availability + REAL, POINTER :: mtemp (:) ! mean temperature over the last 31 days + REAL, POINTER :: qtemp (:) ! mean temperature over the last 91 days + REAL, POINTER :: mmoist (:) ! monthly moisture availability + REAL, POINTER :: mtemp_min (:) ! minimum monthly temperature + REAL, POINTER :: mtemp_max (:) ! maximum monhtly temperature + REAL, POINTER :: qtemp_max (:) ! mean temperature of the warmest quarter (so far this year) + REAL, POINTER :: mtemp_min20 (:) ! minimum monthly temperature, averaged over 20 y + REAL, POINTER :: mtemp_max20 (:) ! maximum monhtly temperature, averaged over 20 y + REAL, POINTER :: atemp_mean (:) ! annual average temperature + REAL, POINTER :: AGDD5 (:) + REAL, POINTER :: GDD5 (:) ! growing degree day sum relative to 5deg base temperature + REAL, POINTER :: AGDD0 (:) + REAL, POINTER :: GDD0 (:) ! growing degree day sum relative to 0deg base temperature + REAL, POINTER :: alpha_PT (:) ! ratio of annual evap to annual PT evap + REAL, POINTER :: evap_PT (:) ! annual PT evap [mm] + REAL, POINTER :: aevap (:) ! annual evap [mm] + REAL, POINTER :: alpha_PT20 (:) + REAL, POINTER :: qtemp_max_last_year (:) ! mean temperature of the warmest quarter (last calendar year) + + REAL, POINTER :: mtemp_min_20 (:,:) ! mimimum monthly temperatures for the last 20 y + REAL, POINTER :: mtemp_max_20 (:,:) ! maximum monthly temperatures for the last 20 y + REAL, POINTER :: dtemp_31 (:,:) ! daily temperature for the last 31 days + REAL, POINTER :: dmoist_31 (:,:) ! daily moisture availability for the last 31 days + REAL, POINTER :: alpha_PT_20 (:,:) ! priestley Taylor Coefft for last 20 y + REAL, POINTER :: dtemp_91 (:,:) ! daily temperature for the last 91 days + +END TYPE climate_type + +CONTAINS + +SUBROUTINE alloc_climate_type(climate, mp) + +USE grid_constants_mod_cbl, ONLY: mf ! # leaves (sunlit/shaded) +USE grid_constants_mod_cbl, ONLY: nsl ! # soil layers +USE grid_constants_mod_cbl, ONLY: niter ! number of iterations for za/L + +IMPLICIT NONE + +TYPE(climate_data_type), INTENT(INOUT) :: climate +INTEGER, INTENT(IN) :: mp + +ALLOCATE( climate% chilldays (1) ) +ALLOCATE( climate% iveg (1) ) +ALLOCATE( climate% biome (1) ) +ALLOCATE( climate% dtemp (1) ) +ALLOCATE( climate% dmoist (1) ) +ALLOCATE( climate% mtemp (1) ) +ALLOCATE( climate% qtemp (1) ) +ALLOCATE( climate% mmoist (1) ) +ALLOCATE( climate% mtemp_min (1) ) +ALLOCATE( climate% mtemp_max (1) ) +ALLOCATE( climate% qtemp_max (1) ) +ALLOCATE( climate% mtemp_min20 (1) ) +ALLOCATE( climate% mtemp_max20 (1) ) +ALLOCATE( climate% atemp_mean (1) ) +ALLOCATE( climate% AGDD5 (1) ) +ALLOCATE( climate% GDD5 (1) ) +ALLOCATE( climate% AGDD0 (1) ) +ALLOCATE( climate% GDD0 (1) ) +ALLOCATE( climate% alpha_PT (1) ) +ALLOCATE( climate% evap_PT (1) ) +ALLOCATE( climate% aevap (1) ) +ALLOCATE( climate% alpha_PT20 (1) ) +ALLOCATE( climate% qtemp_max_last_year (1) ) +ALLOCATE( climate% mtemp_min_20 (1,1) ) +ALLOCATE( climate% mtemp_max_20 (1,1) ) +ALLOCATE( climate% dtemp_31 (1,1) ) +ALLOCATE( climate% dmoist_31 (1,1) ) +ALLOCATE( climate% alpha_PT_20 (1,1) ) +ALLOCATE( climate% dtemp_91 (1,1) ) + +climate% chilldays (:) = 0.0 +climate% iveg (:) = 0.0 +climate% biome (:) = 0.0 +climate% dtemp (:) = 0.0 +climate% dmoist (:) = 0.0 +climate% mtemp (:) = 0.0 +climate% qtemp (:) = 0.0 +climate% mmoist (:) = 0.0 +climate% mtemp_min (:) = 0.0 +climate% mtemp_max (:) = 0.0 +climate% qtemp_max (:) = 0.0 +climate% mtemp_min20 (:) = 0.0 +climate% mtemp_max20 (:) = 0.0 +climate% atemp_mean (:) = 0.0 +climate% AGDD5 (:) = 0.0 +climate% GDD5 (:) = 0.0 +climate% AGDD0 (:) = 0.0 +climate% GDD0 (:) = 0.0 +climate% alpha_PT (:) = 0.0 +climate% evap_PT (:) = 0.0 +climate% aevap (:) = 0.0 +climate% alpha_PT20 (:) = 0.0 +climate% qtemp_max_last_year (:) = 0.0 +climate% mtemp_min_20 (:,:) = 0.0 +climate% mtemp_max_20 (:,:) = 0.0 +climate% dtemp_31 (:,:) = 0.0 +climate% dmoist_31 (:,:) = 0.0 +climate% alpha_PT_20 (:,:) = 0.0 +climate% dtemp_91 (:,:) = 0.0 + +RETURN +END SUBROUTINE alloc_climate_type + +SUBROUTINE dealloc_climate_type(climate) + +TYPE(climate_type), INTENT(inout) :: climate + +DEALLOCATE ( climate% chilldays ) +DEALLOCATE ( climate% iveg ) +DEALLOCATE ( climate% biome ) +DEALLOCATE ( climate% dtemp ) +DEALLOCATE ( climate% dmoist ) +DEALLOCATE ( climate% mtemp ) +DEALLOCATE ( climate% qtemp ) +DEALLOCATE ( climate% mmoist ) +DEALLOCATE ( climate% mtemp_min ) +DEALLOCATE ( climate% mtemp_max ) +DEALLOCATE ( climate% qtemp_max ) +DEALLOCATE ( climate% mtemp_min20 ) +DEALLOCATE ( climate% mtemp_max20 ) +DEALLOCATE ( climate% atemp_mean ) +DEALLOCATE ( climate% AGDD5 ) +DEALLOCATE ( climate% GDD5 ) +DEALLOCATE ( climate% AGDD0 ) +DEALLOCATE ( climate% GDD0 ) +DEALLOCATE ( climate% alpha_PT ) +DEALLOCATE ( climate% evap_PT ) +DEALLOCATE ( climate% aevap ) +DEALLOCATE ( climate% alpha_PT20 ) +DEALLOCATE ( climate % qtemp_max_last_year ) +DEALLOCATE ( climate % mtemp_min_20 ) +DEALLOCATE ( climate % mtemp_max_20 ) +DEALLOCATE ( climate % dtemp_31 ) +DEALLOCATE ( climate % dmoist_31 ) +DEALLOCATE ( climate % alpha_PT_20 ) +DEALLOCATE ( climate % dtemp_91 ) + +RETURN +END SUBROUTINE dealloc_climate_type + +SUBROUTINE assoc_climate_type(climate, climate_data ) + +! Description: +! Associate the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(climate_type), INTENT(IN OUT) :: climate +TYPE(climate_data_type), INTENT(IN OUT), TARGET :: climate_data + +CHARACTER(LEN=*), PARAMETER :: RoutineName='' +!End of header + +CALL nullify_climate_cbl(climate) + +climate% chilldays => climate_data% chilldays +climate% iveg => climate_data% iveg +climate% biome => climate_data% biome +climate% dtemp => climate_data% dtemp +climate% dmoist => climate_data% dmoist +climate% mtemp => climate_data% mtemp +climate% qtemp => climate_data% qtemp +climate% mmoist => climate_data% mmoist +climate% mtemp_min => climate_data% mtemp_min +climate% mtemp_max => climate_data% mtemp_max +climate% qtemp_max => climate_data% qtemp_max +climate% mtemp_min20 => climate_data% mtemp_min20 +climate% mtemp_max20 => climate_data% mtemp_max20 +climate% atemp_mean => climate_data% atemp_mean +climate% AGDD5 => climate_data% AGDD5 +climate% GDD5 => climate_data% GDD5 +climate% AGDD0 => climate_data% AGDD0 +climate% GDD0 => climate_data% GDD0 +climate% alpha_PT => climate_data% alpha_PT +climate% evap_PT => climate_data% evap_PT +climate% aevap => climate_data% aevap +climate% alpha_PT20 => climate_data% alpha_PT20 +climate% qtemp_max_last_year => climate_data% qtemp_max_last_year +climate% mtemp_min_20 => climate_data% mtemp_min_20 +climate% mtemp_max_20 => climate_data% mtemp_max_20 +climate% dtemp_31 => climate_data% dtemp_31 +climate% dmoist_31 => climate_data% dmoist_31 +climate% alpha_PT_20 => climate_data% alpha_PT_20 +climate% dtemp_91 => climate_data% dtemp_91 + +RETURN +END SUBROUTINE assoc_climate_type + +SUBROUTINE nullify_climate_cbl( climate ) + +! Description: +! Nullify the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(climate_type), INTENT(IN OUT) :: climate + +CHARACTER(LEN=*), PARAMETER :: RoutineName='NULLIFY_ASSOC_CBL_TYPES' +!End of header + +NULLIFY( climate% chilldays ) +NULLIFY( climate% iveg ) +NULLIFY( climate% biome ) +NULLIFY( climate% dtemp ) +NULLIFY( climate% dmoist ) +NULLIFY( climate% mtemp ) +NULLIFY( climate% qtemp ) +NULLIFY( climate% mmoist ) +NULLIFY( climate% mtemp_min ) +NULLIFY( climate% mtemp_max ) +NULLIFY( climate% qtemp_max ) +NULLIFY( climate% mtemp_min20 ) +NULLIFY( climate% mtemp_max20 ) +NULLIFY( climate% atemp_mean ) +NULLIFY( climate% AGDD5 ) +NULLIFY( climate% GDD5 ) +NULLIFY( climate% AGDD0 ) +NULLIFY( climate% GDD0 ) +NULLIFY( climate% alpha_PT ) +NULLIFY( climate% evap_PT ) +NULLIFY( climate% aevap ) +NULLIFY( climate% alpha_PT20 ) +NULLIFY( climate % qtemp_max_last_year ) +NULLIFY( climate % mtemp_min_20 ) +NULLIFY( climate % mtemp_max_20 ) +NULLIFY( climate % dtemp_31 ) +NULLIFY( climate % dmoist_31 ) +NULLIFY( climate % alpha_PT_20 ) +NULLIFY( climate % dtemp_91 ) + +RETURN + +END SUBROUTINE nullify_climate_cbl + +END MODULE cable_climate_type_mod diff --git a/src/coupled/AM3/control/cable/CM3/met_type_cbl.F90 b/src/coupled/AM3/control/cable/CM3/met_type_cbl.F90 new file mode 100644 index 000000000..9e8414515 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/met_type_cbl.F90 @@ -0,0 +1,227 @@ +MODULE cable_met_type_mod + +IMPLICIT NONE + +PUBLIC :: met_type +PUBLIC :: met_data_type +PUBLIC :: alloc_met_type +PUBLIC :: dealloc_met_type +PUBLIC :: assoc_met_type +PUBLIC :: nullify_met_cbl + +! Meterological data: +TYPE met_data_type + + INTEGER, ALLOCATABLE :: year (:) ! local time year AD + INTEGER, ALLOCATABLE :: moy (:) ! local time month of year + REAL, ALLOCATABLE :: ca (:) ! CO2 concentration (mol/mol) + REAL, ALLOCATABLE :: doy (:) ! local time day of year = days since + REAL, ALLOCATABLE :: hod (:) ! local hour of day + REAL, ALLOCATABLE :: ofsd (:) ! downward SW radiation (W/m2) + REAL, ALLOCATABLE :: fld (:) ! downward LW radiation (W/m2) + REAL, ALLOCATABLE :: precip (:) ! rainfall (liquid+solid)(mm/dels) + REAL, ALLOCATABLE :: precip_sn (:) ! solid preipitation only (mm/dels) + REAL, ALLOCATABLE :: tk (:) ! surface air temperature (oK) + REAL, ALLOCATABLE :: tvair (:) ! within canopy air temperature (oK) + REAL, ALLOCATABLE :: tvrad (:) ! radiative veg. temperature (K) + REAL, ALLOCATABLE :: pmb (:) ! surface air pressure (mbar) + REAL, ALLOCATABLE :: ua (:) ! surface wind speed (m/s) + REAL, ALLOCATABLE :: qv (:) ! surface specific humidity (g/g) + REAL, ALLOCATABLE :: coszen (:) ! cos(zenith angle of sun) + REAL, ALLOCATABLE :: Ndep (:) ! nitrogen deposition (gN m-2 d-1) + REAL, ALLOCATABLE :: qvair (:) ! in canopy specific humidity (g/g) + REAL, ALLOCATABLE :: da (:) ! H2O vap pres deficit at ref height (Pa) + REAL, ALLOCATABLE :: dva (:) ! H2O vap pres deficit in canopy + REAL, ALLOCATABLE :: fsd (:,:) ! downward SW radiation (W/m2) + +END TYPE met_data_type + +TYPE met_type + + INTEGER, POINTER :: year (:) ! local time year AD + INTEGER, POINTER :: moy (:) ! local time month of year + REAL, POINTER :: ca (:) ! CO2 concentration (mol/mol) + REAL, POINTER :: doy (:) ! local time day of year = days since + REAL, POINTER :: hod (:) ! local hour of day + REAL, POINTER :: ofsd (:) ! downward SW radiation (W/m2) + REAL, POINTER :: fld (:) ! downward LW radiation (W/m2) + REAL, POINTER :: precip (:) ! rainfall (liquid+solid)(mm/dels) + REAL, POINTER :: precip_sn (:) ! solid preipitation only (mm/dels) + REAL, POINTER :: tk (:) ! surface air temperature (oK) + REAL, POINTER :: tvair (:) ! within canopy air temperature (oK) + REAL, POINTER :: tvrad (:) ! radiative veg. temperature (K) + REAL, POINTER :: pmb (:) ! surface air pressure (mbar) + REAL, POINTER :: ua (:) ! surface wind speed (m/s) + REAL, POINTER :: qv (:) ! surface specific humidity (g/g) + REAL, POINTER :: coszen (:) ! cos(zenith angle of sun) + REAL, POINTER :: Ndep (:) ! nitrogen deposition (gN m-2 d-1) + REAL, POINTER :: qvair (:) ! in canopy specific humidity (g/g) + REAL, POINTER :: da (:) ! H2O vap pres deficit at ref height (Pa) + REAL, POINTER :: dva (:) ! H2O vap pres deficit in canopy + REAL, POINTER :: fsd (:,:) ! downward SW radiation (W/m2) + +END TYPE met_type + +CONTAINS + +SUBROUTINE alloc_met_type(met, mp) +USE grid_constants_mod_cbl, ONLY: swb ! # SW bands +IMPLICIT NONE + +TYPE(met_data_type), INTENT(INOUT) :: met +INTEGER, INTENT(IN) :: mp + +ALLOCATE( met% year (mp) ) +ALLOCATE( met% moy (mp) ) +ALLOCATE( met% ca (mp) ) +ALLOCATE( met% doy (mp) ) +ALLOCATE( met% hod (mp) ) +ALLOCATE( met% ofsd (mp) ) +ALLOCATE( met% fld (mp) ) +ALLOCATE( met% precip (mp) ) +ALLOCATE( met% precip_sn (mp) ) +ALLOCATE( met% tk (mp) ) +ALLOCATE( met% tvair (mp) ) +ALLOCATE( met% tvrad (mp) ) +ALLOCATE( met% pmb (mp) ) +ALLOCATE( met% ua (mp) ) +ALLOCATE( met% qv (mp) ) +ALLOCATE( met% coszen (mp) ) +ALLOCATE( met% Ndep (mp) ) +ALLOCATE( met% qvair (mp) ) +ALLOCATE( met% da (mp) ) +ALLOCATE( met% dva (mp) ) +ALLOCATE( met% fsd (mp,swb) ) + +met % year (:) = 0.0 +met % moy (:) = 0.0 +met % ca (:) = 0.0 +met % doy (:) = 0.0 +met % hod (:) = 0.0 +met % ofsd (:) = 0.0 +met % fld (:) = 0.0 +met % precip (:) = 0.0 +met % precip_sn (:) = 0.0 +met % tk (:) = 0.0 +met % tvair (:) = 0.0 +met % tvrad (:) = 0.0 +met % pmb (:) = 0.0 +met % ua (:) = 0.0 +met % qv (:) = 0.0 +met % coszen (:) = 0.0 +met % Ndep (:) = 0.0 +met % qvair (:) = 0.0 +met % da (:) = 0.0 +met % dva (:) = 0.0 +met % fsd (:,:) = 0.0 + +RETURN +END SUBROUTINE alloc_met_type + +SUBROUTINE dealloc_met_type(met) +IMPLICIT NONE + +TYPE(met_type), INTENT(inout) :: met + +DEALLOCATE ( met % year ) +DEALLOCATE ( met % moy ) +DEALLOCATE ( met % ca ) +DEALLOCATE ( met % doy ) +DEALLOCATE ( met % hod ) +DEALLOCATE ( met % ofsd ) +DEALLOCATE ( met % fld ) +DEALLOCATE ( met % precip ) +DEALLOCATE ( met % precip_sn ) +DEALLOCATE ( met % tk ) +DEALLOCATE ( met % tvair ) +DEALLOCATE ( met % tvrad ) +DEALLOCATE ( met % pmb ) +DEALLOCATE ( met % ua ) +DEALLOCATE ( met % qv ) +DEALLOCATE ( met % coszen ) +DEALLOCATE ( met % Ndep ) +DEALLOCATE ( met % qvair ) +DEALLOCATE ( met % da ) +DEALLOCATE ( met % dva ) +DEALLOCATE ( met % fsd ) + +RETURN +END SUBROUTINE dealloc_met_type + +SUBROUTINE assoc_met_type(met, met_data ) +! Description: +! Associate the CABLE work pointers in the derived type structure +IMPLICIT NONE + +!Arguments +TYPE(met_type), INTENT(IN OUT) :: met +TYPE(met_data_type), INTENT(IN OUT), TARGET :: met_data + +CHARACTER(LEN=*), PARAMETER :: RoutineName='' +!End of header + +CALL nullify_met_cbl(met) + +met% year => met_data% year +met% moy => met_data% moy +met% ca => met_data% ca +met% doy => met_data% doy +met% hod => met_data% hod +met% ofsd => met_data% ofsd +met% fld => met_data% fld +met% precip => met_data% precip +met% precip_sn => met_data% precip_sn +met% tk => met_data% tk +met% tvair => met_data% tvair +met% tvrad => met_data% tvrad +met% pmb => met_data% pmb +met% ua => met_data% ua +met% qv => met_data% qv +met% coszen => met_data% coszen +met% Ndep => met_data% Ndep +met% qvair => met_data% qvair +met% da => met_data% da +met% dva => met_data% dva +met% fsd => met_data% fsd + +RETURN +END SUBROUTINE assoc_met_type + +SUBROUTINE nullify_met_cbl( met ) +! Description: +! Nullify the CABLE work pointers in the derived type structure +IMPLICIT NONE + +!Arguments +TYPE(met_type), INTENT(IN OUT) :: met + +CHARACTER(LEN=*), PARAMETER :: RoutineName='NULLIFY_ASSOC_CBL_TYPES' +!End of header + +NULLIFY( met % year ) +NULLIFY( met % moy ) +NULLIFY( met % ca ) +NULLIFY( met % doy ) +NULLIFY( met % hod ) +NULLIFY( met % ofsd ) +NULLIFY( met % fld ) +NULLIFY( met % precip ) +NULLIFY( met % precip_sn ) +NULLIFY( met % tk ) +NULLIFY( met % tvair ) +NULLIFY( met % tvrad ) +NULLIFY( met % pmb ) +NULLIFY( met % ua ) +NULLIFY( met % qv ) +NULLIFY( met % coszen ) +NULLIFY( met % Ndep ) +NULLIFY( met % qvair ) +NULLIFY( met % da ) +NULLIFY( met % dva ) +NULLIFY( met % fsd ) + +RETURN + +END SUBROUTINE nullify_met_cbl + +END MODULE cable_met_type_mod diff --git a/src/coupled/AM3/control/cable/CM3/radiation_type.F90 b/src/coupled/AM3/control/cable/CM3/radiation_type.F90 new file mode 100644 index 000000000..6fd845a91 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/radiation_type.F90 @@ -0,0 +1,311 @@ +MODULE cable_radiation_type_mod + +USE cable_other_constants_mod, ONLY: r_2 + +IMPLICIT NONE + +PUBLIC :: radiation_type +PUBLIC :: radiation_data_type +PUBLIC :: alloc_radiation_type +PUBLIC :: dealloc_radiation_type +PUBLIC :: assoc_radiation_type +PUBLIC :: nullify_radiation_cbl + +! Radiation variables: +TYPE radiation_data_type + + REAL, ALLOCATABLE :: transb (:) ! fraction SW beam tranmitted through canopy + REAL, ALLOCATABLE :: albedo_T (:) ! canopy+soil albedo for VIS+NIR + REAL, ALLOCATABLE :: longitude (:) ! longitude + REAL, ALLOCATABLE :: workp1 (:) ! absorbed short-wave radiation for soil + REAL, ALLOCATABLE :: workp2 (:) ! absorbed short-wave radiation for soil + REAL, ALLOCATABLE :: workp3 (:) ! absorbed short-wave radiation for soil + REAL, ALLOCATABLE :: extkb (:) ! beam radiation extinction coeff + REAL, ALLOCATABLE :: extkd2 (:) ! diffuse 2D radiation extinction coeff + REAL, ALLOCATABLE :: extkd (:) ! diffuse radiation extinction coeff (-) + REAL, ALLOCATABLE :: flws (:) ! soil long-wave radiation + REAL, ALLOCATABLE :: latitude (:) ! latitude + REAL, ALLOCATABLE :: lwabv (:) ! long wave absorbed by vegetation + REAL, ALLOCATABLE :: qssabs (:) ! absorbed short-wave radiation for soil + REAL, ALLOCATABLE :: transd (:) ! frac SW diffuse transmitted through canopy + REAL, ALLOCATABLE :: trad (:) ! radiative temperature (soil and veg) + REAL, ALLOCATABLE :: otrad (:) ! radiative temperature on previous timestep (ACCESS) + + REAL, ALLOCATABLE :: fvlai (:,:) ! leaf area index of big leaf + REAL, ALLOCATABLE :: rhocdf (:,:) ! canopy diffuse reflectance (-) + REAL, ALLOCATABLE :: rniso (:,:) ! sum(rad%qcan, 3) total abs by canopy (W/m2) + REAL, ALLOCATABLE :: scalex (:,:) ! scaling PARAMETER for big leaf + REAL, ALLOCATABLE :: albedo (:,:) ! canopy+soil albedo + REAL, ALLOCATABLE :: reffdf (:,:) ! effective conopy diffuse reflectance + REAL, ALLOCATABLE :: reffbm (:,:) ! effective conopy beam reflectance + REAL, ALLOCATABLE :: extkbm (:,:) ! modified k beam(6.20)(for leaf scattering) + REAL, ALLOCATABLE :: extkdm (:,:) ! modified k diffuse(6.20)(for leaf scattering) + REAL, ALLOCATABLE :: fbeam (:,:) ! beam fraction + REAL, ALLOCATABLE :: cexpkbm (:,:) ! canopy beam transmittance + REAL, ALLOCATABLE :: cexpkdm (:,:) ! canopy diffuse transmittance + REAL, ALLOCATABLE :: rhocbm (:,:) ! modified canopy beam reflectance(6.21) + REAL, ALLOCATABLE :: gradis (:,:) ! radiative conductance + + REAL, ALLOCATABLE :: qcan (:,:,:) ! absorbed radiation for canopy (W/m^2) + +END TYPE radiation_data_type + +TYPE radiation_type + + REAL, POINTER :: transb (:) ! fraction SW beam tranmitted through canopy + REAL, POINTER :: albedo_T (:) ! canopy+soil albedo for VIS+NIR + REAL, POINTER :: longitude (:) ! longitude + REAL, POINTER :: workp1 (:) ! absorbed short-wave radiation for soil + REAL, POINTER :: workp2 (:) ! absorbed short-wave radiation for soil + REAL, POINTER :: workp3 (:) ! absorbed short-wave radiation for soil + REAL, POINTER :: extkb (:) ! beam radiation extinction coeff + REAL, POINTER :: extkd2 (:) ! diffuse 2D radiation extinction coeff + REAL, POINTER :: extkd (:) ! diffuse radiation extinction coeff (-) + REAL, POINTER :: flws (:) ! soil long-wave radiation + REAL, POINTER :: latitude (:) ! latitude + REAL, POINTER :: lwabv (:) ! long wave absorbed by vegetation + REAL, POINTER :: qssabs (:) ! absorbed short-wave radiation for soil + REAL, POINTER :: transd (:) ! frac SW diffuse transmitted through canopy + REAL, POINTER :: trad (:) ! radiative temperature (soil and veg) + REAL, POINTER :: otrad (:) ! radiative temperature on previous timestep (ACCESS) + + REAL, POINTER :: fvlai (:,:) ! leaf area index of big leaf + REAL, POINTER :: rhocdf (:,:) ! canopy diffuse reflectance (-) + REAL, POINTER :: rniso (:,:) ! sum(rad%qcan, 3) total abs by canopy (W/m2) + REAL, POINTER :: scalex (:,:) ! scaling PARAMETER for big leaf + REAL, POINTER :: albedo (:,:) ! canopy+soil albedo + REAL, POINTER :: reffdf (:,:) ! effective conopy diffuse reflectance + REAL, POINTER :: reffbm (:,:) ! effective conopy beam reflectance + REAL, POINTER :: extkbm (:,:) ! modified k beam(6.20)(for leaf scattering) + REAL, POINTER :: extkdm (:,:) ! modified k diffuse(6.20)(for leaf scattering) + REAL, POINTER :: fbeam (:,:) ! beam fraction + REAL, POINTER :: cexpkbm (:,:) ! canopy beam transmittance + REAL, POINTER :: cexpkdm (:,:) ! canopy diffuse transmittance + REAL, POINTER :: rhocbm (:,:) ! modified canopy beam reflectance(6.21) + REAL, POINTER :: gradis (:,:) ! radiative conductance + + REAL, POINTER :: qcan (:,:,:) ! absorbed radiation for canopy (W/m^2) + +END TYPE radiation_type + +CONTAINS + +SUBROUTINE alloc_radiation_type(radiation, mp) + +USE grid_constants_mod_cbl, ONLY: mf ! # leaves (sunlit/shaded) +USE grid_constants_mod_cbl, ONLY: nsl ! # soil layers +USE grid_constants_mod_cbl, ONLY: nrb, swb ! # Radiation/SW bands + +IMPLICIT NONE + +TYPE(radiation_data_type), INTENT(INOUT) :: radiation +INTEGER, INTENT(IN) :: mp + +ALLOCATE( radiation% transb (mp) ) +ALLOCATE( radiation% albedo_T (mp) ) +ALLOCATE( radiation% longitude (mp) ) +ALLOCATE( radiation% workp1 (mp) ) +ALLOCATE( radiation% workp2 (mp) ) +ALLOCATE( radiation% workp3 (mp) ) +ALLOCATE( radiation% extkb (mp) ) +ALLOCATE( radiation% extkd2 (mp) ) +ALLOCATE( radiation% extkd (mp) ) +ALLOCATE( radiation% flws (mp) ) +ALLOCATE( radiation% latitude (mp) ) +ALLOCATE( radiation% lwabv (mp) ) +ALLOCATE( radiation% qssabs (mp) ) +ALLOCATE( radiation% transd (mp) ) +ALLOCATE( radiation% trad (mp) ) +ALLOCATE( radiation% otrad (mp) ) + +ALLOCATE( radiation% fvlai (mp,mf ) ) +ALLOCATE( radiation% rhocdf (mp,nrb) ) +ALLOCATE( radiation% rniso (mp,mf ) ) +ALLOCATE( radiation% scalex (mp,mf ) ) +ALLOCATE( radiation% albedo (mp,nrb) ) +ALLOCATE( radiation% reffdf (mp,nrb) ) +ALLOCATE( radiation% reffbm (mp,nrb) ) +ALLOCATE( radiation% extkbm (mp,nrb) ) +ALLOCATE( radiation% extkdm (mp,nrb) ) +ALLOCATE( radiation% fbeam (mp,nrb) ) +ALLOCATE( radiation% cexpkbm (mp,swb) ) +ALLOCATE( radiation% cexpkdm (mp,swb) ) +ALLOCATE( radiation% rhocbm (mp,nrb) ) +ALLOCATE( radiation% gradis (mp,mf ) ) + +ALLOCATE( radiation% qcan (mp,mf,nrb) ) + +radiation % transb (:) = 0.0 +radiation % albedo_T (:) = 0.0 +radiation % longitude (:) = 0.0 +radiation % workp1 (:) = 0.0 +radiation % workp2 (:) = 0.0 +radiation % workp3 (:) = 0.0 +radiation % extkb (:) = 0.0 +radiation % extkd2 (:) = 0.0 +radiation % extkd (:) = 0.0 +radiation % flws (:) = 0.0 +radiation % latitude (:) = 0.0 +radiation % lwabv (:) = 0.0 +radiation % qssabs (:) = 0.0 +radiation % transd (:) = 0.0 +radiation % trad (:) = 0.0 +radiation % otrad (:) = 0.0 +radiation % fvlai (:,:) = 0.0 +radiation % rhocdf (:,:) = 0.0 +radiation % rniso (:,:) = 0.0 +radiation % scalex (:,:) = 0.0 +radiation % albedo (:,:) = 0.0 +radiation % reffdf (:,:) = 0.0 +radiation % reffbm (:,:) = 0.0 +radiation % extkbm (:,:) = 0.0 +radiation % extkdm (:,:) = 0.0 +radiation % fbeam (:,:) = 0.0 +radiation % cexpkbm (:,:) = 0.0 +radiation % cexpkdm (:,:) = 0.0 +radiation % rhocbm (:,:) = 0.0 +radiation % gradis (:,:) = 0.0 +radiation % qcan (:,:,:) = 0.0 + +RETURN +END SUBROUTINE alloc_radiation_type + +SUBROUTINE dealloc_radiation_type(radiation) + +TYPE(radiation_type), INTENT(inout) :: radiation + +DEALLOCATE ( radiation % transb ) +DEALLOCATE ( radiation % albedo_T ) +DEALLOCATE ( radiation % longitude ) +DEALLOCATE ( radiation % workp1 ) +DEALLOCATE ( radiation % workp2 ) +DEALLOCATE ( radiation % workp3 ) +DEALLOCATE ( radiation % extkb ) +DEALLOCATE ( radiation % extkd2 ) +DEALLOCATE ( radiation % extkd ) +DEALLOCATE ( radiation % flws ) +DEALLOCATE ( radiation % latitude ) +DEALLOCATE ( radiation % lwabv ) +DEALLOCATE ( radiation % qssabs ) +DEALLOCATE ( radiation % transd ) +DEALLOCATE ( radiation % trad ) +DEALLOCATE ( radiation % otrad ) +DEALLOCATE ( radiation % fvlai ) +DEALLOCATE ( radiation % rhocdf ) +DEALLOCATE ( radiation % rniso ) +DEALLOCATE ( radiation % scalex ) +DEALLOCATE ( radiation % albedo ) +DEALLOCATE ( radiation % reffdf ) +DEALLOCATE ( radiation % reffbm ) +DEALLOCATE ( radiation % extkbm ) +DEALLOCATE ( radiation % extkdm ) +DEALLOCATE ( radiation % fbeam ) +DEALLOCATE ( radiation % cexpkbm ) +DEALLOCATE ( radiation % cexpkdm ) +DEALLOCATE ( radiation % rhocbm ) +DEALLOCATE ( radiation % gradis ) +DEALLOCATE ( radiation % qcan ) + +RETURN +END SUBROUTINE dealloc_radiation_type + +SUBROUTINE assoc_radiation_type(radiation, radiation_data ) + +! Description: +! Associate the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(radiation_type), INTENT(IN OUT) :: radiation +TYPE(radiation_data_type), INTENT(IN OUT), TARGET :: radiation_data +CHARACTER(LEN=*), PARAMETER :: RoutineName='' +!End of header + +CALL nullify_radiation_cbl(radiation) + +radiation% transb => radiation_data% transb +radiation% albedo_T => radiation_data% albedo_T +radiation% longitude => radiation_data% longitude +radiation% workp1 => radiation_data% workp1 +radiation% workp2 => radiation_data% workp2 +radiation% workp3 => radiation_data% workp3 +radiation% extkb => radiation_data% extkb +radiation% extkd2 => radiation_data% extkd2 +radiation% extkd => radiation_data% extkd +radiation% flws => radiation_data% flws +radiation% latitude => radiation_data% latitude +radiation% lwabv => radiation_data% lwabv +radiation% qssabs => radiation_data% qssabs +radiation% transd => radiation_data% transd +radiation% trad => radiation_data% trad +radiation% otrad => radiation_data% otrad +radiation% fvlai => radiation_data% fvlai +radiation% rhocdf => radiation_data% rhocdf +radiation% rniso => radiation_data% rniso +radiation% scalex => radiation_data% scalex +radiation% albedo => radiation_data% albedo +radiation% reffdf => radiation_data% reffdf +radiation% reffbm => radiation_data% reffbm +radiation% extkbm => radiation_data% extkbm +radiation% extkdm => radiation_data% extkdm +radiation% fbeam => radiation_data% fbeam +radiation% cexpkbm => radiation_data% cexpkbm +radiation% cexpkdm => radiation_data% cexpkdm +radiation% rhocbm => radiation_data% rhocbm +radiation% gradis => radiation_data% gradis +radiation% qcan => radiation_data% qcan + +RETURN +END SUBROUTINE assoc_radiation_type + +SUBROUTINE nullify_radiation_cbl( radiation ) + +! Description: +! Nullify the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(radiation_type), INTENT(IN OUT) :: radiation + +CHARACTER(LEN=*), PARAMETER :: RoutineName='NULLIFY_ASSOC_CBL_TYPES' +!End of header + +NULLIFY( radiation % transb ) +NULLIFY( radiation % albedo_T ) +NULLIFY( radiation % longitude ) +NULLIFY( radiation % workp1 ) +NULLIFY( radiation % workp2 ) +NULLIFY( radiation % workp3 ) +NULLIFY( radiation % extkb ) +NULLIFY( radiation % extkd2 ) +NULLIFY( radiation % extkd ) +NULLIFY( radiation % flws ) +NULLIFY( radiation % latitude ) +NULLIFY( radiation % lwabv ) +NULLIFY( radiation % qssabs ) +NULLIFY( radiation % transd ) +NULLIFY( radiation % trad ) +NULLIFY( radiation % otrad ) +NULLIFY( radiation % fvlai ) +NULLIFY( radiation % rhocdf ) +NULLIFY( radiation % rniso ) +NULLIFY( radiation % scalex ) +NULLIFY( radiation % albedo ) +NULLIFY( radiation % reffdf ) +NULLIFY( radiation % reffbm ) +NULLIFY( radiation % extkbm ) +NULLIFY( radiation % extkdm ) +NULLIFY( radiation % fbeam ) +NULLIFY( radiation % cexpkbm ) +NULLIFY( radiation % cexpkdm ) +NULLIFY( radiation % rhocbm ) +NULLIFY( radiation % gradis ) +NULLIFY( radiation % qcan ) + +RETURN + +END SUBROUTINE nullify_radiation_cbl + +END MODULE cable_radiation_type_mod diff --git a/src/coupled/AM3/control/cable/CM3/read_cable_namelists_mod.F90 b/src/coupled/AM3/control/cable/CM3/read_cable_namelists_mod.F90 new file mode 100644 index 000000000..6684a35a1 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/read_cable_namelists_mod.F90 @@ -0,0 +1,116 @@ +#if defined(UM_JULES) +! *****************************COPYRIGHT******************************* +! (C) Crown copyright Met Office. All rights reserved. +! For further details please refer to the file COPYRIGHT.txt +! which you should have received as part of this distribution. +! *****************************COPYRIGHT******************************* +! +! Wrapper module containing subroutines for reading cable namelists +! +MODULE read_cable_namelists_mod + +! Description: +! Contains read_cable_ and read_ subroutines +! for reading namelists into cable during a UM-JULES job. +! +! Method: +! The unit number holding the namelist is passed as the sole argument +! to each file. +! +! Code Owner: Please refer to ModuleLeaders.txt and UM file CodeOwners.txt +! This file belongs in section: top_level +! +! Code Description: +! Language: FORTRAN 95. +! This code is written to UMDP3 v8.5 programming standards. + + +USE umPrintMgr , ONLY: & + PrintStatus, PrStatus_Oper + +USE UM_ParCore, ONLY: & + mype + +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook + +IMPLICIT NONE + +INTEGER(KIND=jpim), PARAMETER, PRIVATE :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER, PRIVATE :: zhook_out = 1 + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='READ_CABLE_NAMELISTS_MOD' + +CONTAINS + +! ********************************************************************* + +SUBROUTINE read_cable_surface_types (unitnumber) + +! Description: +! Read the cable_SURFACE_TYPES namelist + +USE cable_surface_types_mod, ONLY: & + print_nlist_cable_surface_types, & + check_cable_surface_types, read_nml_cable_surface_types, & + set_derived_variables_cable_surface_types + + +USE land_tile_ids_mod, ONLY: surface_type_ids_jls => surface_type_ids +USE land_tile_ids_mod_cbl, ONLY: set_surface_type_ids_cbl +USE land_tile_ids_mod_cbl, ONLY: surface_type_ids_cbl => surface_type_ids + +IMPLICIT NONE + +! Subroutine arguments +INTEGER, INTENT(IN) :: unitnumber + +REAL(KIND=jprb) :: zhook_handle +CHARACTER(LEN=*), PARAMETER :: RoutineName='READ_cable_SURFACE_TYPES' + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +CALL read_nml_cable_surface_types(unitnumber) +CALL set_derived_variables_cable_surface_types() +IF (PrintStatus >= PrStatus_Oper .AND. mype == 0) THEN + CALL print_nlist_cable_surface_types() +END IF +! Set the surface_type_ids array and carry out additional checks +CALL set_surface_type_ids_cbl() +surface_type_ids_jls = surface_type_ids_cbl +CALL check_cable_surface_types() + + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE read_cable_surface_types + +SUBROUTINE read_cable_model_environment(unitnumber) + +! Description: +! Read the cable namelist + +USE cable_model_env_mod, ONLY: read_nml_cable_model_env +USE cable_model_env_mod, ONLY: set_derived_variables_cable_model_env + +IMPLICIT NONE + +! Subroutine arguments +INTEGER, INTENT(IN) :: unitnumber + +REAL(KIND=jprb) :: zhook_handle +CHARACTER(LEN=*), PARAMETER :: RoutineName='READ_CABLE_MODEL_ENVIRONMENT' + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +CALL read_nml_cable_model_env(unitnumber) + +CALL set_derived_variables_cable_model_env() + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE read_cable_model_environment + + +END MODULE read_cable_namelists_mod +#endif diff --git a/src/coupled/AM3/control/cable/CM3/roughness_type.F90 b/src/coupled/AM3/control/cable/CM3/roughness_type.F90 new file mode 100644 index 000000000..7f89277b5 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/roughness_type.F90 @@ -0,0 +1,247 @@ +MODULE cable_roughness_type_mod + +USE cable_other_constants_mod, ONLY: r_2 + +IMPLICIT NONE + +PUBLIC :: roughness_type +PUBLIC :: roughness_data_type +PUBLIC :: alloc_roughness_type +PUBLIC :: dealloc_roughness_type +PUBLIC :: assoc_roughness_type +PUBLIC :: nullify_roughness_cbl + +! Roughness variables: +TYPE roughness_data_type + + REAL, ALLOCATABLE :: disp (:) ! zero-plane displacement + REAL, ALLOCATABLE :: hruff (:) ! canopy height above snow level + REAL, ALLOCATABLE :: hruff_grmx (:) ! max ht of canopy from tiles on same grid + REAL, ALLOCATABLE :: rt0us (:) ! eq. 3.54, SCAM manual (CSIRO tech report 132) + REAL, ALLOCATABLE :: rt1usa (:) ! resistance from disp to hruf + REAL, ALLOCATABLE :: rt1usb (:) ! resist fr hruf to zruffs (zref if zref roughness_data% disp +roughness% hruff => roughness_data% hruff +roughness% hruff_grmx => roughness_data% hruff_grmx +roughness% rt0us => roughness_data% rt0us +roughness% rt1usa => roughness_data% rt1usa +roughness% rt1usb => roughness_data% rt1usb +roughness% rt1 => roughness_data% rt1 +roughness% za_uv => roughness_data% za_uv +roughness% za_tq => roughness_data% za_tq +roughness% z0m => roughness_data% z0m +roughness% zref_uv => roughness_data% zref_uv +roughness% zref_tq => roughness_data% zref_tq +roughness% zruffs => roughness_data% zruffs +roughness% z0soilsn => roughness_data% z0soilsn +roughness% z0soil => roughness_data% z0soil +roughness% coexp => roughness_data% coexp +roughness% usuh => roughness_data% usuh +roughness% term2 => roughness_data% term2 +roughness% term3 => roughness_data% term3 +roughness% term5 => roughness_data% term5 +roughness% term6 => roughness_data% term6 +roughness% term6a => roughness_data% term6a + +RETURN +END SUBROUTINE assoc_roughness_type + +SUBROUTINE nullify_roughness_cbl( roughness ) + +! Description: +! Nullify the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(roughness_type), INTENT(IN OUT) :: roughness + +CHARACTER(LEN=*), PARAMETER :: RoutineName='NULLIFY_ASSOC_CBL_TYPES' +!End of header + +NULLIFY( roughness % disp ) +NULLIFY( roughness % hruff ) +NULLIFY( roughness % hruff_grmx ) +NULLIFY( roughness % rt0us ) +NULLIFY( roughness % rt1usa ) +NULLIFY( roughness % rt1usb ) +NULLIFY( roughness % rt1 ) +NULLIFY( roughness % za_uv ) +NULLIFY( roughness % za_tq ) +NULLIFY( roughness % z0m ) +NULLIFY( roughness % zref_uv ) +NULLIFY( roughness % zref_tq ) +NULLIFY( roughness % zruffs ) +NULLIFY( roughness % z0soilsn ) +NULLIFY( roughness % z0soil ) +NULLIFY( roughness % coexp ) +NULLIFY( roughness % usuh ) +NULLIFY( roughness % term2 ) +NULLIFY( roughness % term3 ) +NULLIFY( roughness % term5 ) +NULLIFY( roughness % term6 ) +NULLIFY( roughness % term6a ) + +RETURN + +END SUBROUTINE nullify_roughness_cbl + +END MODULE cable_roughness_type_mod diff --git a/src/coupled/AM3/control/cable/CM3/soil_type_cbl.F90 b/src/coupled/AM3/control/cable/CM3/soil_type_cbl.F90 new file mode 100644 index 000000000..4c0002e11 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/soil_type_cbl.F90 @@ -0,0 +1,517 @@ +MODULE cable_soil_type_mod + +USE cable_other_constants_mod, ONLY: r_2 + +IMPLICIT NONE + +PUBLIC :: soil_type +PUBLIC :: soil_data_type +PUBLIC :: alloc_soil_type +PUBLIC :: dealloc_soil_type +PUBLIC :: assoc_soil_type +PUBLIC :: nullify_soil_cbl + +! Soil parameters: +TYPE soil_data_type + + INTEGER, ALLOCATABLE :: isoilm (:) ! integer soil type + REAL, ALLOCATABLE :: bch (:) ! parameter b in Campbell equation + REAL, ALLOCATABLE :: c3 (:) ! c3 drainage coeff (fraction) + REAL, ALLOCATABLE :: clay (:) ! fraction of soil which is clay + REAL, ALLOCATABLE :: css (:) ! soil specific heat capacity [kJ/kg/K] + REAL, ALLOCATABLE :: hsbh (:) ! difsat * etasat (=hyds*abs(sucs)*bch) + REAL, ALLOCATABLE :: hyds (:) ! hydraulic cond@ saturation [m/s], Ksat + REAL, ALLOCATABLE :: i2bp3 (:) ! par. one in K vis suction (=nint(bch)+2) + REAL, ALLOCATABLE :: ibp2 (:) ! par. two in K vis suction (fn of pbch) + REAL, ALLOCATABLE :: rhosoil (:) ! soil density [kg/m3] + REAL, ALLOCATABLE :: sand (:) ! fraction of soil which is sand + REAL, ALLOCATABLE :: sfc (:) ! vol H2O @ field capacity + REAL, ALLOCATABLE :: silt (:) ! fraction of soil which is silt + REAL, ALLOCATABLE :: ssat (:) ! vol H2O @ saturation + REAL, ALLOCATABLE :: sucs (:) ! suction at saturation (m) + REAL, ALLOCATABLE :: swilt (:) ! vol H2O @ wilting + REAL, ALLOCATABLE :: zse (:) ! soil layer thickness (1=top) [m] + REAL, ALLOCATABLE :: zshh (:) ! dist b/n consecutive layer midpoints (m) + REAL, ALLOCATABLE :: soilcol (:) ! color per patches/tiles Ticket #27 + REAL, ALLOCATABLE :: albsoilf (:) ! soil reflectance Ticket #27 + REAL, ALLOCATABLE :: albsoil (:,:)! soil reflectance + + REAL(r_2), ALLOCATABLE :: heat_cap_lower_limit (:,:) + REAL(r_2), ALLOCATABLE :: zse_vec (:,:) + REAL(r_2), ALLOCATABLE :: css_vec (:,:) + REAL(r_2), ALLOCATABLE :: cnsd_vec (:,:) + REAL(r_2), ALLOCATABLE :: cnsd (:) ! thermal cond dry soil [W/m/K] + REAL(r_2), ALLOCATABLE :: pwb_min (:) ! working var (swilt/ssat)**ibp2 + + REAL(r_2), ALLOCATABLE :: drain_dens (:) ! mean dist to rivers/streams + REAL(r_2), ALLOCATABLE :: elev (:) ! elevation above sea level + REAL(r_2), ALLOCATABLE :: elev_std (:) ! elevation above sea level + REAL(r_2), ALLOCATABLE :: slope (:) ! mean slope of grid cell + REAL(r_2), ALLOCATABLE :: slope_std (:) ! stddev of grid cell slope + + ! Parameters for GW module that vary with soil layer + REAL(r_2), ALLOCATABLE :: sucs_vec (:,:) ! psi at saturation in [mm] + REAL(r_2), ALLOCATABLE :: hyds_vec (:,:) ! sat hydraulic cond [mm/s] + REAL(r_2), ALLOCATABLE :: bch_vec (:,:) ! C and H B [none] + REAL(r_2), ALLOCATABLE :: clay_vec (:,:) ! fraction of soil that is clay + REAL(r_2), ALLOCATABLE :: sand_vec (:,:) ! fraction of soil that is sand + REAL(r_2), ALLOCATABLE :: silt_vec (:,:) ! fraction of soil that is silt + REAL(r_2), ALLOCATABLE :: org_vec (:,:) ! frac soil made of organic soils + REAL(r_2), ALLOCATABLE :: rhosoil_vec (:,:) ! soil density [kg/m3] + REAL(r_2), ALLOCATABLE :: ssat_vec (:,:) ! vol H2O content at sat [mm3/mm3] + REAL(r_2), ALLOCATABLE :: watr (:,:) ! resid soil H2O content [mm3/mm3] + REAL(r_2), ALLOCATABLE :: sfc_vec (:,:) ! field capcacity (hk = 1 mm/day) + REAL(r_2), ALLOCATABLE :: swilt_vec (:,:) ! wilting point (hk = 0.02 mm/day) + + ! Parameters for GW module for the aquifer + REAL(r_2), ALLOCATABLE :: GWsucs_vec (:) ! head in the aquifer [mm] + REAL(r_2), ALLOCATABLE :: GWhyds_vec (:) ! satur hydraulic cond [mm/s] + REAL(r_2), ALLOCATABLE :: GWbch_vec (:) ! clapp and horn b [none] + REAL(r_2), ALLOCATABLE :: GWssat_vec (:) ! saturated water content [mm3/mm3] + REAL(r_2), ALLOCATABLE :: GWwatr (:) ! residual water content [mm3/mm3] + REAL(r_2), ALLOCATABLE :: GWz (:) ! node depth of the aquifer [m] + REAL(r_2), ALLOCATABLE :: GWdz (:) ! thickness of the aquifer [m] + REAL(r_2), ALLOCATABLE :: GWrhosoil_vec(:) ! density of substrate [kg/m3] + + ! Additional SLI parameters + INTEGER(r_2), ALLOCATABLE :: nhorizons (:) ! number of soil horizons + INTEGER(r_2), ALLOCATABLE :: ishorizon (:,:) ! horizon number 1:nhorizons + REAL(r_2), ALLOCATABLE :: clitt (:) ! litter (tC/ha) + REAL(r_2), ALLOCATABLE :: zeta (:) ! macropore parameter + REAL(r_2), ALLOCATABLE :: fsatmax (:) ! variably saturated area parameter + !REAL(r_2), DIMENSION(:,:), POINTER :: swilt_vec ! vol H2O @ wilting + !REAL(r_2), DIMENSION(:,:), POINTER :: ssat_vec ! vol H2O @ sat + !REAL(r_2), DIMENSION(:,:), POINTER :: sfc_vec ! vol H2O @ fc + +END TYPE soil_data_type + +TYPE soil_type + + INTEGER, POINTER :: isoilm (:) ! integer soil type + REAL, POINTER :: bch (:) ! parameter b in Campbell equation + REAL, POINTER :: c3 (:) ! c3 drainage coeff (fraction) + REAL, POINTER :: clay (:) ! fraction of soil which is clay + REAL, POINTER :: css (:) ! soil specific heat capacity [kJ/kg/K] + REAL, POINTER :: hsbh (:) ! difsat * etasat (=hyds*abs(sucs)*bch) + REAL, POINTER :: hyds (:) ! hydraulic cond@ saturation [m/s], Ksat + REAL, POINTER :: i2bp3 (:) ! par. one in K vis suction (=nint(bch)+2) + REAL, POINTER :: ibp2 (:) ! par. two in K vis suction (fn of pbch) + REAL, POINTER :: rhosoil (:) ! soil density [kg/m3] + REAL, POINTER :: sand (:) ! fraction of soil which is sand + REAL, POINTER :: sfc (:) ! vol H2O @ field capacity + REAL, POINTER :: silt (:) ! fraction of soil which is silt + REAL, POINTER :: ssat (:) ! vol H2O @ saturation + REAL, POINTER :: sucs (:) ! suction at saturation (m) + REAL, POINTER :: swilt (:) ! vol H2O @ wilting + REAL, POINTER :: zse (:) ! thickness of each soil layer (1=top) [m] + REAL, POINTER :: zshh (:) ! dist b/n consecutive layer midpoints (m) + REAL, POINTER :: soilcol (:) ! color per patches/tiles Ticket #27 + REAL, POINTER :: albsoilf (:) ! soil reflectance Ticket #27 + REAL, POINTER :: albsoil (:,:) ! soil reflectance + + REAL(r_2), POINTER :: heat_cap_lower_limit (:,:) + REAL(r_2), POINTER :: zse_vec (:,:) + REAL(r_2), POINTER :: css_vec (:,:) + REAL(r_2), POINTER :: cnsd_vec (:,:) + REAL(r_2), POINTER :: cnsd (:) ! thermal cond dry soil [W/m/K] + REAL(r_2), POINTER :: pwb_min (:) ! working var (swilt/ssat)**ibp2 + + REAL(r_2), POINTER :: drain_dens (:) ! mean dist to rivers/streams) + REAL(r_2), POINTER :: elev (:) ! elevation above sea level + REAL(r_2), POINTER :: elev_std (:) ! elevation above sea level + REAL(r_2), POINTER :: slope (:) ! mean slope of grid cell + REAL(r_2), POINTER :: slope_std (:) ! stddev of grid cell slope + + ! Parameters for GW module that vary with soil layer + REAL(r_2), POINTER :: sucs_vec (:,:) ! psi at saturation in [mm] + REAL(r_2), POINTER :: hyds_vec (:,:) ! sat hydraulic cond [mm/s] + REAL(r_2), POINTER :: bch_vec (:,:) ! C and H B [none] + REAL(r_2), POINTER :: clay_vec (:,:) ! fraction of soil that is clay + REAL(r_2), POINTER :: sand_vec (:,:) ! fraction of soil that is sand + REAL(r_2), POINTER :: silt_vec (:,:) ! fraction of soil that is silt + REAL(r_2), POINTER :: org_vec (:,:) ! frac soil made of organic soils + REAL(r_2), POINTER :: rhosoil_vec (:,:) ! soil density [kg/m3] + REAL(r_2), POINTER :: ssat_vec (:,:) ! vol H2O content at sat [mm3/mm3] + REAL(r_2), POINTER :: watr (:,:) ! resid soil H2O content [mm3/mm3] + REAL(r_2), POINTER :: sfc_vec (:,:) ! field capcacity (hk = 1 mm/day) + REAL(r_2), POINTER :: swilt_vec (:,:) ! wilting point (hk = 0.02 mm/day) + + ! Parameters for GW module for the aquifer + REAL(r_2), POINTER :: GWsucs_vec (:) ! head in the aquifer [mm] + REAL(r_2), POINTER :: GWhyds_vec (:) ! satur hydraulic cond [mm/s] + REAL(r_2), POINTER :: GWbch_vec (:) ! clapp and horn b [none] + REAL(r_2), POINTER :: GWssat_vec (:) ! saturated water content [mm3/mm3] + REAL(r_2), POINTER :: GWwatr (:) ! residual water content [mm3/mm3] + REAL(r_2), POINTER :: GWz (:) ! node depth of the aquifer [m] + REAL(r_2), POINTER :: GWdz (:) ! thickness of the aquifer [m] + REAL(r_2), POINTER :: GWrhosoil_vec(:) ! density of substrate [kg/m3] + + ! Additional SLI parameters + INTEGER(r_2), POINTER :: nhorizons (:) ! number of soil horizons + INTEGER(r_2), POINTER :: ishorizon (:,:) ! horizon number 1:nhorizons + REAL(r_2), POINTER :: clitt (:) ! litter (tC/ha) + REAL(r_2), POINTER :: zeta (:) ! macropore parameter + REAL(r_2), POINTER :: fsatmax (:) ! variably saturated area parameter + !REAL(r_2), DIMENSION(:,:), POINTER :: swilt_vec ! vol H2O @ wilting + !REAL(r_2), DIMENSION(:,:), POINTER :: ssat_vec ! vol H2O @ sat + !REAL(r_2), DIMENSION(:,:), POINTER :: sfc_vec ! vol H2O @ fc + +END TYPE soil_type + +CONTAINS + +SUBROUTINE alloc_soil_type(soil, mp) + +USE grid_constants_mod_cbl, ONLY: nsl ! # soil layers +USE grid_constants_mod_cbl, ONLY: swb ! # SW bands + +IMPLICIT NONE + +TYPE(soil_data_type), INTENT(INOUT) :: soil +INTEGER, INTENT(IN) :: mp + +ALLOCATE( soil% isoilm (mp) ) +ALLOCATE( soil% bch (mp) ) +ALLOCATE( soil% c3 (mp) ) +ALLOCATE( soil% clay (mp) ) +ALLOCATE( soil% css (mp) ) +ALLOCATE( soil% hsbh (mp) ) +ALLOCATE( soil% hyds (mp) ) +ALLOCATE( soil% i2bp3 (mp) ) +ALLOCATE( soil% ibp2 (mp) ) +ALLOCATE( soil% rhosoil (mp) ) +ALLOCATE( soil% sand (mp) ) +ALLOCATE( soil% sfc (mp) ) +ALLOCATE( soil% silt (mp) ) +ALLOCATE( soil% ssat (mp) ) +ALLOCATE( soil% sucs (mp) ) +ALLOCATE( soil% swilt (mp) ) +ALLOCATE( soil% zse (nsl) ) +ALLOCATE( soil% zshh (nsl+1) ) +ALLOCATE( soil% soilcol (mp) ) +ALLOCATE( soil% albsoilf (mp) ) +ALLOCATE( soil% albsoil (mp,swb) ) + +ALLOCATE( soil% heat_cap_lower_limit (mp,nsl) ) +ALLOCATE( soil% zse_vec (mp,nsl) ) +ALLOCATE( soil% css_vec (mp,nsl) ) +ALLOCATE( soil% cnsd_vec (mp,nsl) ) +ALLOCATE( soil% cnsd (mp) ) +ALLOCATE( soil% pwb_min (mp) ) + +ALLOCATE( soil% drain_dens (mp) ) ! mean dist to rivers/streams +ALLOCATE( soil% elev (mp) ) ! elevation above sea level +ALLOCATE( soil% elev_std (mp) ) ! elevation above sea level +ALLOCATE( soil% slope (mp) ) ! mean slope of grid cell +ALLOCATE( soil% slope_std (mp) ) ! stddev of grid cell slope + +! Parameters for GW module that vary with soil layer +ALLOCATE( soil% sucs_vec (mp,nsl) ) +ALLOCATE( soil% hyds_vec (mp,nsl) ) +ALLOCATE( soil% bch_vec (mp,nsl) ) +ALLOCATE( soil% clay_vec (mp,nsl) ) +ALLOCATE( soil% sand_vec (mp,nsl) ) +ALLOCATE( soil% silt_vec (mp,nsl) ) +ALLOCATE( soil% org_vec (mp,nsl) ) +ALLOCATE( soil% rhosoil_vec (mp,nsl) ) +ALLOCATE( soil% ssat_vec (mp,nsl) ) +ALLOCATE( soil% watr (mp,nsl) ) +ALLOCATE( soil% sfc_vec (mp,nsl) ) +ALLOCATE( soil% swilt_vec (mp,nsl) ) + +! Parameters for GW module for the aquifer +ALLOCATE( soil% GWhyds_vec (mp) ) +ALLOCATE( soil% GWsucs_vec (mp) ) +ALLOCATE( soil% GWbch_vec (mp) ) +ALLOCATE( soil% GWssat_vec (mp) ) +ALLOCATE( soil% GWwatr (mp) ) +ALLOCATE( soil% GWz (mp) ) +ALLOCATE( soil% GWdz (mp) ) +ALLOCATE( soil% GWrhosoil_vec(mp) ) + +! Additional SLI parameters +ALLOCATE( soil% nhorizons(mp) ) +ALLOCATE( soil% ishorizon(mp,nsl) ) +ALLOCATE( soil% clitt (mp) ) +ALLOCATE( soil% zeta (mp) ) +ALLOCATE( soil% fsatmax (mp) ) + +soil % isoilm (:) = 0.0 +soil % bch (:) = 0.0 +soil % c3 (:) = 0.0 +soil % clay (:) = 0.0 +soil % css (:) = 0.0 +soil % hsbh (:) = 0.0 +soil % hyds (:) = 0.0 +soil % i2bp3 (:) = 0.0 +soil % ibp2 (:) = 0.0 +soil % rhosoil (:) = 0.0 +soil % sand (:) = 0.0 +soil % sfc (:) = 0.0 +soil % silt (:) = 0.0 +soil % ssat (:) = 0.0 +soil % sucs (:) = 0.0 +soil % swilt (:) = 0.0 +soil % zse (:) = 0.0 +soil % zshh (:) = 0.0 +soil % soilcol (:) = 0.0 +soil % albsoilf (:) = 0.0 +soil % albsoil (:,:) = 0.0 +soil % zse_vec (:,:) = 0.0 +soil % css_vec (:,:) = 0.0 +soil % cnsd_vec (:,:) = 0.0 +soil % cnsd (:) = 0.0 +soil % pwb_min (:) = 0.0 +soil % drain_dens (:) = 0.0 +soil % elev (:) = 0.0 +soil % elev_std (:) = 0.0 +soil % slope (:) = 0.0 +soil % slope_std (:) = 0.0 +soil % sucs_vec (:,:) = 0.0 +soil % hyds_vec (:,:) = 0.0 +soil % bch_vec (:,:) = 0.0 +soil % clay_vec (:,:) = 0.0 +soil % sand_vec (:,:) = 0.0 +soil % silt_vec (:,:) = 0.0 +soil % org_vec (:,:) = 0.0 +soil % rhosoil_vec (:,:) = 0.0 +soil % ssat_vec (:,:) = 0.0 +soil % watr (:,:) = 0.0 +soil % sfc_vec (:,:) = 0.0 +soil % swilt_vec (:,:) = 0.0 +soil % GWhyds_vec (:) = 0.0 +soil % GWsucs_vec (:) = 0.0 +soil % GWbch_vec (:) = 0.0 +soil % GWssat_vec (:) = 0.0 +soil % GWwatr (:) = 0.0 +soil % GWz (:) = 0.0 +soil % GWdz (:) = 0.0 +soil % GWrhosoil_vec (:) = 0.0 +soil % nhorizons (:) = 0.0 +soil % ishorizon (:,:) = 0.0 +soil % clitt (:) = 0.0 +soil % zeta (:) = 0.0 +soil % fsatmax (:) = 0.0 +soil % heat_cap_lower_limit(:,:) = 0.0 + +RETURN +END SUBROUTINE alloc_soil_type + +SUBROUTINE dealloc_soil_type(soil) + +TYPE(soil_type), INTENT(inout) :: soil + +DEALLOCATE ( soil % isoilm ) +DEALLOCATE ( soil % bch ) +DEALLOCATE ( soil % c3 ) +DEALLOCATE ( soil % clay ) +DEALLOCATE ( soil % css ) +DEALLOCATE ( soil % hsbh ) +DEALLOCATE ( soil % hyds ) +DEALLOCATE ( soil % i2bp3 ) +DEALLOCATE ( soil % ibp2 ) +DEALLOCATE ( soil % rhosoil ) +DEALLOCATE ( soil % sand ) +DEALLOCATE ( soil % sfc ) +DEALLOCATE ( soil % silt ) +DEALLOCATE ( soil % ssat ) +DEALLOCATE ( soil % sucs ) +DEALLOCATE ( soil % swilt ) +DEALLOCATE ( soil % zse ) +DEALLOCATE ( soil % zshh ) +DEALLOCATE ( soil % soilcol ) +DEALLOCATE ( soil % albsoilf ) +DEALLOCATE ( soil % albsoil ) +DEALLOCATE ( soil % heat_cap_lower_limit ) +DEALLOCATE ( soil % zse_vec ) +DEALLOCATE ( soil % css_vec ) +DEALLOCATE ( soil % cnsd_vec ) +DEALLOCATE ( soil % cnsd ) +DEALLOCATE ( soil % pwb_min ) +DEALLOCATE ( soil % drain_dens ) +DEALLOCATE ( soil % elev ) +DEALLOCATE ( soil % elev_std ) +DEALLOCATE ( soil % slope ) +DEALLOCATE ( soil % slope_std ) +DEALLOCATE ( soil % sucs_vec ) +DEALLOCATE ( soil % hyds_vec ) +DEALLOCATE ( soil % bch_vec ) +DEALLOCATE ( soil % clay_vec ) +DEALLOCATE ( soil % sand_vec ) +DEALLOCATE ( soil % silt_vec ) +DEALLOCATE ( soil % org_vec ) +DEALLOCATE ( soil % rhosoil_vec ) +DEALLOCATE ( soil % ssat_vec ) +DEALLOCATE ( soil % watr ) +DEALLOCATE ( soil % sfc_vec ) +DEALLOCATE ( soil % swilt_vec ) +DEALLOCATE ( soil % GWhyds_vec ) +DEALLOCATE ( soil % GWsucs_vec ) +DEALLOCATE ( soil % GWbch_vec ) +DEALLOCATE ( soil % GWssat_vec ) +DEALLOCATE ( soil % GWwatr ) +DEALLOCATE ( soil % GWz ) +DEALLOCATE ( soil % GWdz ) +DEALLOCATE ( soil % GWrhosoil_vec ) +DEALLOCATE ( soil % nhorizons ) +DEALLOCATE ( soil % ishorizon ) +DEALLOCATE ( soil % clitt ) +DEALLOCATE ( soil % zeta ) +DEALLOCATE ( soil % fsatmax ) + +RETURN +END SUBROUTINE dealloc_soil_type + +SUBROUTINE assoc_soil_type(soil, soil_data ) + +! Description: +! Associate the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(soil_type), INTENT(IN OUT) :: soil +TYPE(soil_data_type), INTENT(IN OUT), TARGET :: soil_data + +CHARACTER(LEN=*), PARAMETER :: RoutineName='' +!End of header + +CALL nullify_soil_cbl(soil) + +soil% isoilm => soil_data% isoilm +soil% bch => soil_data% bch +soil% c3 => soil_data% c3 +soil% clay => soil_data% clay +soil% css => soil_data% css +soil% hsbh => soil_data% hsbh +soil% hyds => soil_data% hyds +soil% i2bp3 => soil_data% i2bp3 +soil% ibp2 => soil_data% ibp2 +soil% rhosoil => soil_data% rhosoil +soil% sand => soil_data% sand +soil% sfc => soil_data% sfc +soil% silt => soil_data% silt +soil% ssat => soil_data% ssat +soil% sucs => soil_data% sucs +soil% swilt => soil_data% swilt +soil% zse => soil_data% zse +soil% zshh => soil_data% zshh +soil% soilcol => soil_data% soilcol +soil% albsoilf => soil_data% albsoilf +soil% albsoil => soil_data% albsoil +soil% heat_cap_lower_limit => soil_data% heat_cap_lower_limit +soil% zse_vec => soil_data% zse_vec +soil% css_vec => soil_data% css_vec +soil% cnsd_vec => soil_data% cnsd_vec +soil% cnsd => soil_data% cnsd +soil% pwb_min => soil_data% pwb_min +soil% drain_dens => soil_data% drain_dens +soil% elev => soil_data% elev +soil% elev_std => soil_data% elev_std +soil% slope => soil_data% slope +soil% slope_std => soil_data% slope_std +soil% sucs_vec => soil_data% sucs_vec +soil% hyds_vec => soil_data% hyds_vec +soil% bch_vec => soil_data% bch_vec +soil% clay_vec => soil_data% clay_vec +soil% sand_vec => soil_data% sand_vec +soil% silt_vec => soil_data% silt_vec +soil% org_vec => soil_data% org_vec +soil% rhosoil_vec => soil_data% rhosoil_vec +soil% ssat_vec => soil_data% ssat_vec +soil% watr => soil_data% watr +soil% sfc_vec => soil_data% sfc_vec +soil% swilt_vec => soil_data% swilt_vec +soil% GWhyds_vec => soil_data% GWhyds_vec +soil% GWsucs_vec => soil_data% GWsucs_vec +soil% GWbch_vec => soil_data% GWbch_vec +soil% GWssat_vec => soil_data% GWssat_vec +soil% GWwatr => soil_data% GWwatr +soil% GWz => soil_data% GWz +soil% GWdz => soil_data% GWdz +soil% GWrhosoil_vec => soil_data% GWrhosoil_vec +soil% nhorizons => soil_data% nhorizons +soil% ishorizon => soil_data% ishorizon +soil% clitt => soil_data% clitt +soil% zeta => soil_data% zeta +soil% fsatmax => soil_data% fsatmax + +RETURN +END SUBROUTINE assoc_soil_type + +SUBROUTINE nullify_soil_cbl( soil ) + +! Description: +! Nullify the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(soil_type), INTENT(IN OUT) :: soil + +CHARACTER(LEN=*), PARAMETER :: RoutineName='NULLIFY_ASSOC_CBL_TYPES' +!End of header + +NULLIFY( soil % isoilm ) +NULLIFY( soil % bch ) +NULLIFY( soil % c3 ) +NULLIFY( soil % clay ) +NULLIFY( soil % css ) +NULLIFY( soil % hsbh ) +NULLIFY( soil % hyds ) +NULLIFY( soil % i2bp3 ) +NULLIFY( soil % ibp2 ) +NULLIFY( soil % rhosoil ) +NULLIFY( soil % sand ) +NULLIFY( soil % sfc ) +NULLIFY( soil % silt ) +NULLIFY( soil % ssat ) +NULLIFY( soil % sucs ) +NULLIFY( soil % swilt ) +NULLIFY( soil % zse ) +NULLIFY( soil % zshh ) +NULLIFY( soil % soilcol ) +NULLIFY( soil % albsoilf ) +NULLIFY( soil % albsoil ) +NULLIFY( soil % heat_cap_lower_limit ) +NULLIFY( soil % zse_vec ) +NULLIFY( soil % css_vec ) +NULLIFY( soil % cnsd_vec ) +NULLIFY( soil % cnsd ) +NULLIFY( soil % pwb_min ) +NULLIFY( soil % drain_dens ) +NULLIFY( soil % elev ) +NULLIFY( soil % elev_std ) +NULLIFY( soil % slope ) +NULLIFY( soil % slope_std ) +NULLIFY( soil % sucs_vec ) +NULLIFY( soil % hyds_vec ) +NULLIFY( soil % bch_vec ) +NULLIFY( soil % clay_vec ) +NULLIFY( soil % sand_vec ) +NULLIFY( soil % silt_vec ) +NULLIFY( soil % org_vec ) +NULLIFY( soil % rhosoil_vec ) +NULLIFY( soil % ssat_vec ) +NULLIFY( soil % watr ) +NULLIFY( soil % sfc_vec ) +NULLIFY( soil % swilt_vec ) +NULLIFY( soil % GWhyds_vec ) +NULLIFY( soil % GWsucs_vec ) +NULLIFY( soil % GWbch_vec ) +NULLIFY( soil % GWssat_vec ) +NULLIFY( soil % GWwatr ) +NULLIFY( soil % GWz ) +NULLIFY( soil % GWdz ) +NULLIFY( soil % GWrhosoil_vec ) +NULLIFY( soil % nhorizons ) +NULLIFY( soil % ishorizon ) +NULLIFY( soil % clitt ) +NULLIFY( soil % zeta ) +NULLIFY( soil % fsatmax ) + +RETURN + +END SUBROUTINE nullify_soil_cbl + +END MODULE cable_soil_type_mod diff --git a/src/coupled/AM3/control/cable/CM3/ssnow_type.F90 b/src/coupled/AM3/control/cable/CM3/ssnow_type.F90 new file mode 100644 index 000000000..c107987a6 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/ssnow_type.F90 @@ -0,0 +1,960 @@ +MODULE cable_soil_snow_type_mod + +USE cable_other_constants_mod, ONLY: r_2 + +IMPLICIT NONE + +PUBLIC :: soil_snow_type +PUBLIC :: soil_snow_data_type +PUBLIC :: alloc_soil_snow_type +PUBLIC :: dealloc_soil_snow_type +PUBLIC :: assoc_soil_snow_type +PUBLIC :: nullify_soil_snow_cbl + +! Soil and snow variables: +TYPE soil_snow_data_type + + INTEGER, ALLOCATABLE :: isflag(:) ! 0 => no snow 1 => snow + REAL, ALLOCATABLE :: iantrct (:) ! pointer to Antarctic land points + REAL, ALLOCATABLE :: pudsto (:) ! puddle storage + REAL, ALLOCATABLE :: pudsmx (:) ! puddle storage + REAL, ALLOCATABLE :: cls (:) ! factor for latent heat + REAL, ALLOCATABLE :: dfn_dtg (:) ! d(canopy%fns)/d(ssnow%tgg) + REAL, ALLOCATABLE :: dfh_dtg (:) ! d(canopy%fhs)/d(ssnow%tgg) + REAL, ALLOCATABLE :: dfe_ddq (:) ! d(canopy%fes)/d(dq) - REV_CORR: no longer necessary + REAL, ALLOCATABLE :: ddq_dtg (:) ! d(dq)/d(ssnow%tgg) - REV_CORR: no longer necessary + REAL, ALLOCATABLE :: dfe_dtg (:) ! d(canopy%fes)/d(ssnow%tgg) - REV_CORR: covers above vars + REAL, ALLOCATABLE :: evapsn (:) ! snow evaporation + REAL, ALLOCATABLE :: fwtop (:) ! water flux to the soil + REAL, ALLOCATABLE :: fwtop1 (:) ! water flux to the soil + REAL, ALLOCATABLE :: fwtop2 (:) ! water flux to the soil + REAL, ALLOCATABLE :: fwtop3 (:) ! water flux to the soil + REAL, ALLOCATABLE :: osnowd (:) ! snow depth from previous time step + REAL, ALLOCATABLE :: potev (:) ! potential evapotranspiration + REAL, ALLOCATABLE :: runoff (:) ! total runoff (mm/dels) + REAL, ALLOCATABLE :: rnof1 (:) ! surface runoff (mm/dels) + REAL, ALLOCATABLE :: rnof2 (:) ! deep drainage (mm/dels) + REAL, ALLOCATABLE :: rtsoil (:) ! turbulent resistance for soil + REAL, ALLOCATABLE :: wbtot1 (:) ! total soil water (mm) + REAL, ALLOCATABLE :: wbtot2 (:) ! total soil water (mm) + REAL, ALLOCATABLE :: wb_lake (:) + REAL, ALLOCATABLE :: totwblake (:) !daily integrated wb_lake: used in ACCESS + REAL, ALLOCATABLE :: sinfil (:) + REAL, ALLOCATABLE :: qstss (:) + REAL, ALLOCATABLE :: wetfac (:) ! surface wetness fact. at current time step + REAL, ALLOCATABLE :: owetfac (:) ! surface wetness fact. at previous time step + REAL, ALLOCATABLE :: t_snwlr (:) ! top snow layer depth in 3 layer snowpack + REAL, ALLOCATABLE :: tggav (:) ! mean soil temperature in K + REAL, ALLOCATABLE :: otgg (:) ! soil temperature in K + REAL, ALLOCATABLE :: otss (:) ! surface temperature (weighted soil, snow) + REAL, ALLOCATABLE :: tprecip (:) + REAL, ALLOCATABLE :: tevap (:) + REAL, ALLOCATABLE :: trnoff (:) + REAL, ALLOCATABLE :: totenbal (:) + REAL, ALLOCATABLE :: totenbal2 (:) + REAL, ALLOCATABLE :: fland (:) ! factor for latent heat + REAL, ALLOCATABLE :: ifland (:) ! integer soil type + REAL, ALLOCATABLE :: qasrf (:) ! heat advected to the snow by precip. + REAL, ALLOCATABLE :: qfsrf (:) ! energy of snowpack phase changes + REAL, ALLOCATABLE :: qssrf (:) ! sublimation + REAL, ALLOCATABLE :: snage (:) ! snow age + REAL, ALLOCATABLE :: snowd (:) ! snow depth (liquid water) + REAL, ALLOCATABLE :: smelt (:) ! snow melt + REAL, ALLOCATABLE :: ssdnn (:) ! average snow density + REAL, ALLOCATABLE :: tss (:) ! surface temperature (weighted soil, snow) + REAL, ALLOCATABLE :: tss_p (:) ! surface temperature (weighted soil, snow) + REAL, ALLOCATABLE :: deltss (:) ! surface temperature (weighted soil, snow) + REAL, ALLOCATABLE :: owb1 (:) ! surface temperature (weighted soil, snow) + + REAL, ALLOCATABLE :: sconds (:,:) ! + REAL, ALLOCATABLE :: sdepth (:,:) ! snow depth + REAL, ALLOCATABLE :: smass (:,:) ! snow mass + REAL, ALLOCATABLE :: ssdn (:,:) ! snow densities + REAL, ALLOCATABLE :: tgg (:,:) ! soil temperature in K + REAL, ALLOCATABLE :: tggsn (:,:) ! snow temperature in K + REAL, ALLOCATABLE :: dtmlt (:,:) ! water flux to the soil + REAL, ALLOCATABLE :: albsoilsn (:,:) ! soil + snow reflectance + REAL, ALLOCATABLE :: evapfbl (:,:) ! + REAL, ALLOCATABLE :: tilefrac (:,:) ! factor for latent heat + + REAL(r_2), ALLOCATABLE :: wbtot (:) ! total soil water (mm) + + REAL(r_2), ALLOCATABLE :: gammzz (:,:) ! heat capacity for each soil layer + REAL(r_2), ALLOCATABLE :: wb (:,:) ! volumetric soil moisture (solid+liq) + REAL(r_2), ALLOCATABLE :: wbice (:,:) ! soil ice + REAL(r_2), ALLOCATABLE :: wblf (:,:) + REAL(r_2), ALLOCATABLE :: wbfice (:,:) + + ! variables for the revised soil moisture + GW scheme + REAL(r_2), ALLOCATABLE :: GWwb (:) ! water content in aquifer [mm3/mm3] + REAL(r_2), ALLOCATABLE :: GWhk (:) ! aquifer hydraulic conductivity [mm/s] + REAL(r_2), ALLOCATABLE :: GWdhkdw (:) ! aquifer d(hk) over d(water content) [(mm/s)/(mm3/mm3)] + REAL(r_2), ALLOCATABLE :: GWdsmpdw (:) ! aquifer d(smp) / dw [(mm)/(mm3/mm3)] + REAL(r_2), ALLOCATABLE :: wtd (:) ! water table depth [mm] + REAL(r_2), ALLOCATABLE :: GWsmp (:) ! aquifer soil matric potential [mm] + REAL(r_2), ALLOCATABLE :: GWwbeq (:) ! equilibrium aquifer water content [mm3/mm3] + REAL(r_2), ALLOCATABLE :: GWzq (:) ! equilibrium aquifer smp [mm] + REAL(r_2), ALLOCATABLE :: qhz (:) ! horizontal hydraulic conductivity in 1D gw model for soil layers [mm/s] + REAL(r_2), ALLOCATABLE :: satfrac (:) + REAL(r_2), ALLOCATABLE :: Qrecharge (:) + REAL(r_2), ALLOCATABLE :: rh_srf (:) + REAL(r_2), ALLOCATABLE :: rtevap_sat (:) + REAL(r_2), ALLOCATABLE :: rtevap_unsat (:) + REAL(r_2), ALLOCATABLE :: rt_qh_sublayer(:) + + REAL(r_2), ALLOCATABLE :: wbeq (:,:) ! equilibrium water content [mm3/mm3] + REAL(r_2), ALLOCATABLE :: zq (:,:) ! equilibrium smp [mm] + REAL(r_2), ALLOCATABLE :: icefrac (:,:) ! ice fraction [none] -> ice mass / total mass + REAL(r_2), ALLOCATABLE :: fracice (:,:) ! alternate ice fraction [none] - parameterized + REAL(r_2), ALLOCATABLE :: hk (:,:) ! hydraulic conductivity for soil layers [mm/s] + REAL(r_2), ALLOCATABLE :: smp (:,:) ! soil matric potential for soil layers [mm] + REAL(r_2), ALLOCATABLE :: dhkdw (:,:) ! d(hydraulic conductivity ) d(water) for soil layers [(mm/s)/(mm3/mm3)] + REAL(r_2), ALLOCATABLE :: dsmpdw (:,:) ! d(smp)/ d(water) for soil layers [(mm)/(mm3/mm3)] + REAL(r_2), ALLOCATABLE :: wbliq (:,:) ! volumetric liquid water content [mm3/mm3] + REAL(r_2), ALLOCATABLE :: wmliq (:,:) ! water mass [mm] liq + REAL(r_2), ALLOCATABLE :: wmice (:,:) ! water mass [mm] ice + REAL(r_2), ALLOCATABLE :: wmtot (:,:) ! water mass [mm] liq+ice ->total + REAL(r_2), ALLOCATABLE :: qhlev (:,:) + + ! Additional SLI variables: + REAL(r_2), ALLOCATABLE :: S (:,:) ! moisture content relative to sat value (edit vh 23/01/08) + REAL(r_2), ALLOCATABLE :: Tsoil (:,:) ! Tsoil (deg C) + REAL(r_2), ALLOCATABLE :: SL (:) ! litter moisture content relative to sat value (edit vh 23/01/08) + REAL(r_2), ALLOCATABLE :: TL (:) ! litter temperature in K (edit vh 23/01/08) + REAL(r_2), ALLOCATABLE :: h0 (:) ! pond height in m (edit vh 23/01/08) + REAL(r_2), ALLOCATABLE :: rex (:,:) ! root extraction from each layer (mm/dels) + REAL(r_2), ALLOCATABLE :: wflux (:,:) ! water flux at layer boundaries (mm s-1) + REAL(r_2), ALLOCATABLE :: delwcol (:) ! change in water column (mm / dels) + REAL(r_2), ALLOCATABLE :: zdelta (:) ! water table depth (edit vh 23/06/08) + REAL(r_2), ALLOCATABLE :: kth (:,:) ! thermal conductivity (edit vh 29/07/08) + REAL(r_2), ALLOCATABLE :: Tsurface (:) ! tepmerature at surface (soil, pond or litter) (edit vh 22/10/08) + REAL(r_2), ALLOCATABLE :: lE (:) ! soil latent heat flux + REAL(r_2), ALLOCATABLE :: evap (:) ! soil evaporation (mm / dels) + REAL(r_2), ALLOCATABLE :: ciso (:,:) ! concentration of minor isotopologue in soil water (kg m-3 water) + REAL(r_2), ALLOCATABLE :: cisoL (:) ! concentration of minor isotopologue in litter water (kg m-3 water) + REAL(r_2), ALLOCATABLE :: rlitt (:) ! resistance to heat/moisture transfer through litter (m-1 s) + REAL(r_2), ALLOCATABLE :: thetai (:,:) ! volumetric ice content (MC) + REAL(r_2), ALLOCATABLE :: snowliq (:,:) ! liquid snow content (mm H2O) + REAL(r_2), ALLOCATABLE :: nsteps (:) ! number of iterations at each timestep + REAL(r_2), ALLOCATABLE :: TsurfaceFR (:) ! tepmerature at surface (soil, pond or litter) (edit vh 22/10/08) + REAL(r_2), ALLOCATABLE :: Ta_daily (:,:) ! air temp averaged over last 24h + INTEGER, ALLOCATABLE :: nsnow (:) ! number of layers in snow-pack (0-nsnow_max) + REAL(r_2), ALLOCATABLE :: Qadv_daily (:) ! advective heat flux into surface , daily average (W m-2) + REAL(r_2), ALLOCATABLE :: G0_daily (:) ! conductive heat flux into surface , daily average (W m-2) + REAL(r_2), ALLOCATABLE :: Qevap_daily (:) ! evaporative flux at surface, daily average (m s-1) + REAL(r_2), ALLOCATABLE :: Qprec_daily (:) ! liquid precip, daily average (m s-1) + REAL(r_2), ALLOCATABLE :: Qprec_snow_daily (:) ! solid precip, daily average (m s-1) + +END TYPE soil_snow_data_type + +TYPE soil_snow_type + + INTEGER, POINTER :: isflag(:) ! 0 => no snow 1 => snow + REAL, POINTER :: iantrct (:) ! pointer to Antarctic land points + REAL, POINTER :: pudsto (:) ! puddle storage + REAL, POINTER :: pudsmx (:) ! puddle storage + REAL, POINTER :: cls (:) ! factor for latent heat + REAL, POINTER :: dfn_dtg (:) ! d(canopy%fns)/d(ssnow%tgg) + REAL, POINTER :: dfh_dtg (:) ! d(canopy%fhs)/d(ssnow%tgg) + REAL, POINTER :: dfe_ddq (:) ! d(canopy%fes)/d(dq) - REV_CORR: no longer necessary + REAL, POINTER :: ddq_dtg (:) ! d(dq)/d(ssnow%tgg) - REV_CORR: no longer necessary + REAL, POINTER :: dfe_dtg (:) ! d(canopy%fes)/d(ssnow%tgg) - REV_CORR: covers above vars + REAL, POINTER :: evapsn (:) ! snow evaporation + REAL, POINTER :: fwtop (:) ! water flux to the soil + REAL, POINTER :: fwtop1 (:) ! water flux to the soil + REAL, POINTER :: fwtop2 (:) ! water flux to the soil + REAL, POINTER :: fwtop3 (:) ! water flux to the soil + REAL, POINTER :: osnowd (:) ! snow depth from previous time step + REAL, POINTER :: potev (:) ! potential evapotranspiration + REAL, POINTER :: runoff (:) ! total runoff (mm/dels) + REAL, POINTER :: rnof1 (:) ! surface runoff (mm/dels) + REAL, POINTER :: rnof2 (:) ! deep drainage (mm/dels) + REAL, POINTER :: rtsoil (:) ! turbulent resistance for soil + REAL, POINTER :: wbtot1 (:) ! total soil water (mm) + REAL, POINTER :: wbtot2 (:) ! total soil water (mm) + REAL, POINTER :: wb_lake (:) + REAL, POINTER :: totwblake (:) !daily integrated wb_lake: used in ACCESS + REAL, POINTER :: sinfil (:) + REAL, POINTER :: qstss (:) + REAL, POINTER :: wetfac (:) ! surface wetness fact. at current time step + REAL, POINTER :: owetfac (:) ! surface wetness fact. at previous time step + REAL, POINTER :: t_snwlr (:) ! top snow layer depth in 3 layer snowpack + REAL, POINTER :: tggav (:) ! mean soil temperature in K + REAL, POINTER :: otgg (:) ! soil temperature in K + REAL, POINTER :: otss (:) ! surface temperature (weighted soil, snow) + REAL, POINTER :: tprecip (:) + REAL, POINTER :: tevap (:) + REAL, POINTER :: trnoff (:) + REAL, POINTER :: totenbal (:) + REAL, POINTER :: totenbal2 (:) + REAL, POINTER :: fland (:) ! factor for latent heat + REAL, POINTER :: ifland (:) ! integer soil type + REAL, POINTER :: qasrf (:) ! heat advected to the snow by precip. + REAL, POINTER :: qfsrf (:) ! energy of snowpack phase changes + REAL, POINTER :: qssrf (:) ! sublimation + REAL, POINTER :: snage (:) ! snow age + REAL, POINTER :: snowd (:) ! snow depth (liquid water) + REAL, POINTER :: smelt (:) ! snow melt + REAL, POINTER :: ssdnn (:) ! average snow density + REAL, POINTER :: tss (:) ! surface temperature (weighted soil, snow) + REAL, POINTER :: tss_p (:) ! surface temperature (weighted soil, snow) + REAL, POINTER :: deltss (:) ! surface temperature (weighted soil, snow) + REAL, POINTER :: owb1 (:) ! surface temperature (weighted soil, snow) + + REAL, POINTER :: sconds (:,:) ! + REAL, POINTER :: sdepth (:,:) ! snow depth + REAL, POINTER :: smass (:,:) ! snow mass + REAL, POINTER :: ssdn (:,:) ! snow densities + REAL, POINTER :: tgg (:,:) ! soil temperature in K + REAL, POINTER :: tggsn (:,:) ! snow temperature in K + REAL, POINTER :: dtmlt (:,:) ! water flux to the soil + REAL, POINTER :: albsoilsn (:,:) ! soil + snow reflectance + REAL, POINTER :: evapfbl (:,:) ! + REAL, POINTER :: tilefrac (:,:) ! factor for latent heat + + REAL(r_2), POINTER :: wbtot (:) ! total soil water (mm) + + REAL(r_2), POINTER :: gammzz (:,:) ! heat capacity for each soil layer + REAL(r_2), POINTER :: wb (:,:) ! volumetric soil moisture (solid+liq) + REAL(r_2), POINTER :: wbice (:,:) ! soil ice + REAL(r_2), POINTER :: wblf (:,:) + REAL(r_2), POINTER :: wbfice (:,:) + + ! variables for the revised soil moisture + GW scheme + REAL(r_2), POINTER :: GWwb (:) ! water content in aquifer [mm3/mm3] + REAL(r_2), POINTER :: GWhk (:) ! aquifer hydraulic conductivity [mm/s] + REAL(r_2), POINTER :: GWdhkdw (:) ! aquifer d(hk) over d(water content) [(mm/s)/(mm3/mm3)] + REAL(r_2), POINTER :: GWdsmpdw (:) ! aquifer d(smp) / dw [(mm)/(mm3/mm3)] + REAL(r_2), POINTER :: wtd (:) ! water table depth [mm] + REAL(r_2), POINTER :: GWsmp (:) ! aquifer soil matric potential [mm] + REAL(r_2), POINTER :: GWwbeq (:) ! equilibrium aquifer water content [mm3/mm3] + REAL(r_2), POINTER :: GWzq (:) ! equilibrium aquifer smp [mm] + REAL(r_2), POINTER :: qhz (:) ! horizontal hydraulic conductivity in 1D gw model for soil layers [mm/s] + REAL(r_2), POINTER :: satfrac (:) + REAL(r_2), POINTER :: Qrecharge (:) + REAL(r_2), POINTER :: rh_srf (:) + REAL(r_2), POINTER :: rtevap_sat (:) + REAL(r_2), POINTER :: rtevap_unsat (:) + REAL(r_2), POINTER :: rt_qh_sublayer(:) + + REAL(r_2), POINTER :: wbeq (:,:) ! equilibrium water content [mm3/mm3] + REAL(r_2), POINTER :: zq (:,:) ! equilibrium smp [mm] + REAL(r_2), POINTER :: icefrac (:,:) ! ice fraction [none] -> ice mass / total mass + REAL(r_2), POINTER :: fracice (:,:) ! alternate ice fraction [none] - parameterized + REAL(r_2), POINTER :: hk (:,:) ! hydraulic conductivity for soil layers [mm/s] + REAL(r_2), POINTER :: smp (:,:) ! soil matric potential for soil layers [mm] + REAL(r_2), POINTER :: dhkdw (:,:) ! d(hydraulic conductivity ) d(water) for soil layers [(mm/s)/(mm3/mm3)] + REAL(r_2), POINTER :: dsmpdw (:,:) ! d(smp)/ d(water) for soil layers [(mm)/(mm3/mm3)] + REAL(r_2), POINTER :: wbliq (:,:) ! volumetric liquid water content [mm3/mm3] + REAL(r_2), POINTER :: wmliq (:,:) ! water mass [mm] liq + REAL(r_2), POINTER :: wmice (:,:) ! water mass [mm] ice + REAL(r_2), POINTER :: wmtot (:,:) ! water mass [mm] liq+ice ->total + REAL(r_2), POINTER :: qhlev (:,:) + + ! Additional SLI variables: + REAL(r_2), POINTER :: S (:,:) ! moisture content relative to sat value (edit vh 23/01/08) + REAL(r_2), POINTER :: Tsoil (:,:) ! Tsoil (deg C) + REAL(r_2), POINTER :: SL (:) ! litter moisture content relative to sat value (edit vh 23/01/08) + REAL(r_2), POINTER :: TL (:) ! litter temperature in K (edit vh 23/01/08) + REAL(r_2), POINTER :: h0 (:) ! pond height in m (edit vh 23/01/08) + REAL(r_2), POINTER :: rex (:,:) ! root extraction from each layer (mm/dels) + REAL(r_2), POINTER :: wflux (:,:) ! water flux at layer boundaries (mm s-1) + REAL(r_2), POINTER :: delwcol (:) ! change in water column (mm / dels) + REAL(r_2), POINTER :: zdelta (:) ! water table depth (edit vh 23/06/08) + REAL(r_2), POINTER :: kth (:,:) ! thermal conductivity (edit vh 29/07/08) + REAL(r_2), POINTER :: Tsurface (:) ! tepmerature at surface (soil, pond or litter) (edit vh 22/10/08) + REAL(r_2), POINTER :: lE (:) ! soil latent heat flux + REAL(r_2), POINTER :: evap (:) ! soil evaporation (mm / dels) + REAL(r_2), POINTER :: ciso (:,:) ! concentration of minor isotopologue in soil water (kg m-3 water) + REAL(r_2), POINTER :: cisoL (:) ! concentration of minor isotopologue in litter water (kg m-3 water) + REAL(r_2), POINTER :: rlitt (:) ! resistance to heat/moisture transfer through litter (m-1 s) + REAL(r_2), POINTER :: thetai (:,:) ! volumetric ice content (MC) + REAL(r_2), POINTER :: snowliq (:,:) ! liquid snow content (mm H2O) + REAL(r_2), POINTER :: nsteps (:) ! number of iterations at each timestep + REAL(r_2), POINTER :: TsurfaceFR (:) ! tepmerature at surface (soil, pond or litter) (edit vh 22/10/08) + REAL(r_2), POINTER :: Ta_daily (:,:) ! air temp averaged over last 24h + INTEGER, POINTER :: nsnow (:) ! number of layers in snow-pack (0-nsnow_max) + REAL(r_2), POINTER :: Qadv_daily (:) ! advective heat flux into surface , daily average (W m-2) + REAL(r_2), POINTER :: G0_daily (:) ! conductive heat flux into surface , daily average (W m-2) + REAL(r_2), POINTER :: Qevap_daily (:) ! evaporative flux at surface, daily average (m s-1) + REAL(r_2), POINTER :: Qprec_daily (:) ! liquid precip, daily average (m s-1) + REAL(r_2), POINTER :: Qprec_snow_daily (:) ! solid precip, daily average (m s-1) + +END TYPE soil_snow_type + +CONTAINS + +SUBROUTINE alloc_soil_snow_type(soil_snow, mp) + +USE grid_constants_mod_cbl, ONLY: nsnl ! # snow layers +USE grid_constants_mod_cbl, ONLY: nsl ! # soil layers +USE grid_constants_mod_cbl, ONLY: nrb ! # radiation bands *2SW, *1LW(legacy) +USE grid_constants_mod_cbl, ONLY: ntype_max ! # PFTs + +IMPLICIT NONE + +TYPE(soil_snow_data_type), INTENT(INOUT) :: soil_snow +INTEGER, INTENT(IN) :: mp + +ALLOCATE( soil_snow% isflag (mp) ) +ALLOCATE( soil_snow% iantrct (mp) ) +ALLOCATE( soil_snow% pudsto (mp) ) +ALLOCATE( soil_snow% pudsmx (mp) ) +ALLOCATE( soil_snow% cls (mp) ) +ALLOCATE( soil_snow% dfn_dtg (mp) ) +ALLOCATE( soil_snow% dfh_dtg (mp) ) +ALLOCATE( soil_snow% dfe_ddq (mp) ) +ALLOCATE( soil_snow% ddq_dtg (mp) ) +ALLOCATE( soil_snow% dfe_dtg (mp) ) +ALLOCATE( soil_snow% evapsn (mp) ) +ALLOCATE( soil_snow% fwtop (mp) ) +ALLOCATE( soil_snow% fwtop1 (mp) ) +ALLOCATE( soil_snow% fwtop2 (mp) ) +ALLOCATE( soil_snow% fwtop3 (mp) ) +ALLOCATE( soil_snow% osnowd (mp) ) +ALLOCATE( soil_snow% potev (mp) ) +ALLOCATE( soil_snow% runoff (mp) ) +ALLOCATE( soil_snow% rnof1 (mp) ) +ALLOCATE( soil_snow% rnof2 (mp) ) +ALLOCATE( soil_snow% rtsoil (mp) ) +ALLOCATE( soil_snow% wbtot1 (mp) ) +ALLOCATE( soil_snow% wbtot2 (mp) ) +ALLOCATE( soil_snow% wb_lake (mp) ) +ALLOCATE( soil_snow% totwblake (mp) ) +ALLOCATE( soil_snow% sinfil (mp) ) +ALLOCATE( soil_snow% qstss (mp) ) +ALLOCATE( soil_snow% wetfac (mp) ) +ALLOCATE( soil_snow% owetfac (mp) ) +ALLOCATE( soil_snow% t_snwlr (mp) ) +ALLOCATE( soil_snow% tggav (mp) ) +ALLOCATE( soil_snow% otgg (mp) ) +ALLOCATE( soil_snow% otss (mp) ) +ALLOCATE( soil_snow% tprecip (mp) ) +ALLOCATE( soil_snow% tevap (mp) ) +ALLOCATE( soil_snow% trnoff (mp) ) +ALLOCATE( soil_snow% totenbal (mp) ) +ALLOCATE( soil_snow% totenbal2 (mp) ) +ALLOCATE( soil_snow% fland (mp) ) +ALLOCATE( soil_snow% ifland (mp) ) +ALLOCATE( soil_snow% qasrf (mp) ) +ALLOCATE( soil_snow% qfsrf (mp) ) +ALLOCATE( soil_snow% qssrf (mp) ) +ALLOCATE( soil_snow% snage (mp) ) +ALLOCATE( soil_snow% snowd (mp) ) +ALLOCATE( soil_snow% smelt (mp) ) +ALLOCATE( soil_snow% ssdnn (mp) ) +ALLOCATE( soil_snow% tss (mp) ) +ALLOCATE( soil_snow% tss_p (mp) ) +ALLOCATE( soil_snow% deltss (mp) ) +ALLOCATE( soil_snow% owb1 (mp) ) +ALLOCATE( soil_snow% sconds (mp,nsnl) ) +ALLOCATE( soil_snow% sdepth (mp,nsnl) ) +ALLOCATE( soil_snow% smass (mp,nsnl) ) +ALLOCATE( soil_snow% ssdn (mp,nsnl) ) +ALLOCATE( soil_snow% tgg (mp,nsl) ) +ALLOCATE( soil_snow% tggsn (mp,nsnl) ) +ALLOCATE( soil_snow% dtmlt (mp,nsnl) ) +ALLOCATE( soil_snow% albsoilsn (mp,nrb) ) +ALLOCATE( soil_snow% evapfbl (mp,nsl) ) +ALLOCATE( soil_snow% tilefrac (mp,ntype_max) ) +ALLOCATE( soil_snow% wbtot (mp) ) +ALLOCATE( soil_snow% gammzz (mp,nsl) ) +ALLOCATE( soil_snow% wb (mp,nsl) ) +ALLOCATE( soil_snow% wbice (mp,nsl) ) +ALLOCATE( soil_snow% wblf (mp,nsl) ) +ALLOCATE( soil_snow% wbfice (mp,nsl) ) +ALLOCATE( soil_snow% GWwb (mp) ) +ALLOCATE( soil_snow% GWhk (mp) ) +ALLOCATE( soil_snow% GWdhkdw (mp) ) +ALLOCATE( soil_snow% GWdsmpdw (mp) ) +ALLOCATE( soil_snow% wtd (mp) ) +ALLOCATE( soil_snow% GWsmp (mp) ) +ALLOCATE( soil_snow% GWwbeq (mp) ) +ALLOCATE( soil_snow% GWzq (mp) ) +ALLOCATE( soil_snow% qhz (mp) ) +ALLOCATE( soil_snow% satfrac (mp) ) +ALLOCATE( soil_snow% Qrecharge (mp) ) +ALLOCATE( soil_snow% rh_srf (mp) ) +ALLOCATE( soil_snow% rtevap_sat (mp) ) +ALLOCATE( soil_snow% rtevap_unsat (mp) ) +ALLOCATE( soil_snow% rt_qh_sublayer(mp) ) +ALLOCATE( soil_snow% wbeq (mp,nsl) ) +ALLOCATE( soil_snow% zq (mp,nsl) ) +ALLOCATE( soil_snow% icefrac (mp,nsl) ) +ALLOCATE( soil_snow% fracice (mp,nsl) ) +ALLOCATE( soil_snow% hk (mp,nsl) ) +ALLOCATE( soil_snow% smp (mp,nsl) ) +ALLOCATE( soil_snow% dhkdw (mp,nsl) ) +ALLOCATE( soil_snow% dsmpdw (mp,nsl) ) +ALLOCATE( soil_snow% wbliq (mp,nsl) ) +ALLOCATE( soil_snow% wmliq (mp,nsl) ) +ALLOCATE( soil_snow% wmice (mp,nsl) ) +ALLOCATE( soil_snow% wmtot (mp,nsl) ) +ALLOCATE( soil_snow% qhlev (mp,nsl+1) ) +ALLOCATE( soil_snow% S (mp,nsl) ) +ALLOCATE( soil_snow% Tsoil (mp,nsl) ) +ALLOCATE( soil_snow% SL (mp) ) +ALLOCATE( soil_snow% TL (mp) ) +ALLOCATE( soil_snow% h0 (mp) ) +ALLOCATE( soil_snow% rex (mp,nsl) ) +ALLOCATE( soil_snow% wflux (mp,0:nsl) ) +ALLOCATE( soil_snow% delwcol (mp) ) +ALLOCATE( soil_snow% zdelta (mp) ) +ALLOCATE( soil_snow% kth (mp,nsl) ) +ALLOCATE( soil_snow% Tsurface (mp) ) +ALLOCATE( soil_snow% lE (mp) ) +ALLOCATE( soil_snow% evap (mp) ) +ALLOCATE( soil_snow% ciso (mp,nsl+1) ) +ALLOCATE( soil_snow% cisoL (mp) ) +ALLOCATE( soil_snow% rlitt (mp) ) +ALLOCATE( soil_snow% thetai (mp,nsl) ) +ALLOCATE( soil_snow% snowliq (mp,nsnl) ) +ALLOCATE( soil_snow% nsteps (mp) ) +ALLOCATE( soil_snow% TsurfaceFR (mp) ) +ALLOCATE( soil_snow% Ta_daily (mp,100) ) +ALLOCATE( soil_snow% nsnow (mp) ) +ALLOCATE( soil_snow% Qadv_daily (mp) ) +ALLOCATE( soil_snow% G0_daily (mp) ) +ALLOCATE( soil_snow% Qevap_daily (mp) ) +ALLOCATE( soil_snow% Qprec_daily (mp) ) +ALLOCATE( soil_snow% Qprec_snow_daily (mp) ) + +soil_snow % isflag (:) = 0.0 +soil_snow % iantrct (:) = 0.0 +soil_snow % pudsto (:) = 0.0 +soil_snow % pudsmx (:) = 0.0 +soil_snow % cls (:) = 0.0 +soil_snow % dfn_dtg (:) = 0.0 +soil_snow % dfh_dtg (:) = 0.0 +soil_snow % dfe_ddq (:) = 0.0 +soil_snow % ddq_dtg (:) = 0.0 +soil_snow % dfe_dtg (:) = 0.0 +soil_snow % evapsn (:) = 0.0 +soil_snow % fwtop (:) = 0.0 +soil_snow % fwtop1 (:) = 0.0 +soil_snow % fwtop2 (:) = 0.0 +soil_snow % fwtop3 (:) = 0.0 +soil_snow % osnowd (:) = 0.0 +soil_snow % potev (:) = 0.0 +soil_snow % runoff (:) = 0.0 +soil_snow % rnof1 (:) = 0.0 +soil_snow % rnof2 (:) = 0.0 +soil_snow % rtsoil (:) = 0.0 +soil_snow % wbtot1 (:) = 0.0 +soil_snow % wbtot2 (:) = 0.0 +soil_snow % wb_lake (:) = 0.0 +soil_snow % totwblake (:) = 0.0 +soil_snow % sinfil (:) = 0.0 +soil_snow % qstss (:) = 0.0 +soil_snow % wetfac (:) = 0.0 +soil_snow % owetfac (:) = 0.0 +soil_snow % t_snwlr (:) = 0.0 +soil_snow % tggav (:) = 0.0 +soil_snow % otgg (:) = 0.0 +soil_snow % otss (:) = 0.0 +soil_snow % tprecip (:) = 0.0 +soil_snow % tevap (:) = 0.0 +soil_snow % trnoff (:) = 0.0 +soil_snow % totenbal (:) = 0.0 +soil_snow % totenbal2 (:) = 0.0 +soil_snow % fland (:) = 0.0 +soil_snow % ifland (:) = 0.0 +soil_snow % qasrf (:) = 0.0 +soil_snow % qfsrf (:) = 0.0 +soil_snow % qssrf (:) = 0.0 +soil_snow % snage (:) = 0.0 +soil_snow % snowd (:) = 0.0 +soil_snow % smelt (:) = 0.0 +soil_snow % ssdnn (:) = 0.0 +soil_snow % tss (:) = 0.0 +soil_snow % tss_p (:) = 0.0 +soil_snow % deltss (:) = 0.0 +soil_snow % owb1 (:) = 0.0 +soil_snow % sconds (:,:) = 0.0 +soil_snow % sdepth (:,:) = 0.0 +soil_snow % smass (:,:) = 0.0 +soil_snow % ssdn (:,:) = 0.0 +soil_snow % tgg (:,:) = 0.0 +soil_snow % tggsn (:,:) = 0.0 +soil_snow % dtmlt (:,:) = 0.0 +soil_snow % albsoilsn (:,:) = 0.0 +soil_snow % evapfbl (:,:) = 0.0 +soil_snow % tilefrac (:,:) = 0.0 +soil_snow % wbtot (:) = 0.0 +soil_snow % gammzz (:,:) = 0.0 +soil_snow % wb (:,:) = 0.0 +soil_snow % wbice (:,:) = 0.0 +soil_snow % wblf (:,:) = 0.0 +soil_snow % wbfice (:,:) = 0.0 +soil_snow % GWwb (:) = 0.0 +soil_snow % GWhk (:) = 0.0 +soil_snow % GWdhkdw (:) = 0.0 +soil_snow % GWdsmpdw (:) = 0.0 +soil_snow % wtd (:) = 0.0 +soil_snow % GWsmp (:) = 0.0 +soil_snow % GWwbeq (:) = 0.0 +soil_snow % GWzq (:) = 0.0 +soil_snow % qhz (:) = 0.0 +soil_snow % satfrac (:) = 0.0 +soil_snow % Qrecharge (:) = 0.0 +soil_snow % rh_srf (:) = 0.0 +soil_snow % rtevap_sat (:) = 0.0 +soil_snow % rtevap_unsat (:) = 0.0 +soil_snow % rt_qh_sublayer (:) = 0.0 +soil_snow % wbeq (:,:) = 0.0 +soil_snow % zq (:,:) = 0.0 +soil_snow % icefrac (:,:) = 0.0 +soil_snow % fracice (:,:) = 0.0 +soil_snow % hk (:,:) = 0.0 +soil_snow % smp (:,:) = 0.0 +soil_snow % dhkdw (:,:) = 0.0 +soil_snow % dsmpdw (:,:) = 0.0 +soil_snow % wbliq (:,:) = 0.0 +soil_snow % wmliq (:,:) = 0.0 +soil_snow % wmice (:,:) = 0.0 +soil_snow % wmtot (:,:) = 0.0 +soil_snow % qhlev (:,:) = 0.0 +soil_snow % S (:,:) = 0.0 +soil_snow % Tsoil (:,:) = 0.0 +soil_snow % SL (:) = 0.0 +soil_snow % TL (:) = 0.0 +soil_snow % h0 (:) = 0.0 +soil_snow % rex (:,:) = 0.0 +soil_snow % wflux (:,:) = 0.0 +soil_snow % delwcol (:) = 0.0 +soil_snow % zdelta (:) = 0.0 +soil_snow % kth (:,:) = 0.0 +soil_snow % Tsurface (:) = 0.0 +soil_snow % lE (:) = 0.0 +soil_snow % evap (:) = 0.0 +soil_snow % ciso (:,:) = 0.0 +soil_snow % cisoL (:) = 0.0 +soil_snow % rlitt (:) = 0.0 +soil_snow % thetai (:,:) = 0.0 +soil_snow % snowliq (:,:) = 0.0 +soil_snow % nsteps (:) = 0.0 +soil_snow % TsurfaceFR (:) = 0.0 +soil_snow % Ta_daily (:,:) = 0.0 +soil_snow % nsnow (:) = 0.0 +soil_snow % Qadv_daily (:) = 0.0 +soil_snow % G0_daily (:) = 0.0 +soil_snow % Qevap_daily (:) = 0.0 +soil_snow % Qprec_daily (:) = 0.0 +soil_snow % Qprec_snow_daily(:) = 0.0 + +RETURN +END SUBROUTINE alloc_soil_snow_type + +SUBROUTINE dealloc_soil_snow_type(soil_snow) + +TYPE(soil_snow_type), INTENT(inout) :: soil_snow + +DEALLOCATE ( soil_snow % isflag ) +DEALLOCATE ( soil_snow % iantrct ) +DEALLOCATE ( soil_snow % pudsto ) +DEALLOCATE ( soil_snow % pudsmx ) +DEALLOCATE ( soil_snow % cls ) +DEALLOCATE ( soil_snow % dfn_dtg ) +DEALLOCATE ( soil_snow % dfh_dtg ) +DEALLOCATE ( soil_snow % dfe_ddq ) +DEALLOCATE ( soil_snow % ddq_dtg ) +DEALLOCATE ( soil_snow % dfe_dtg ) +DEALLOCATE ( soil_snow % evapsn ) +DEALLOCATE ( soil_snow % fwtop ) +DEALLOCATE ( soil_snow % fwtop1 ) +DEALLOCATE ( soil_snow % fwtop2 ) +DEALLOCATE ( soil_snow % fwtop3 ) +DEALLOCATE ( soil_snow % osnowd ) +DEALLOCATE ( soil_snow % potev ) +DEALLOCATE ( soil_snow % runoff ) +DEALLOCATE ( soil_snow % rnof1 ) +DEALLOCATE ( soil_snow % rnof2 ) +DEALLOCATE ( soil_snow % rtsoil ) +DEALLOCATE ( soil_snow % wbtot1 ) +DEALLOCATE ( soil_snow % wbtot2 ) +DEALLOCATE ( soil_snow % wb_lake ) +DEALLOCATE ( soil_snow % totwblake ) +DEALLOCATE ( soil_snow % sinfil ) +DEALLOCATE ( soil_snow % qstss ) +DEALLOCATE ( soil_snow % wetfac ) +DEALLOCATE ( soil_snow % owetfac ) +DEALLOCATE ( soil_snow % t_snwlr ) +DEALLOCATE ( soil_snow % tggav ) +DEALLOCATE ( soil_snow % otgg ) +DEALLOCATE ( soil_snow % otss ) +DEALLOCATE ( soil_snow % tprecip ) +DEALLOCATE ( soil_snow % tevap ) +DEALLOCATE ( soil_snow % trnoff ) +DEALLOCATE ( soil_snow % totenbal ) +DEALLOCATE ( soil_snow % totenbal2 ) +DEALLOCATE ( soil_snow % fland ) +DEALLOCATE ( soil_snow % ifland ) +DEALLOCATE ( soil_snow % qasrf ) +DEALLOCATE ( soil_snow % qfsrf ) +DEALLOCATE ( soil_snow % qssrf ) +DEALLOCATE ( soil_snow % snage ) +DEALLOCATE ( soil_snow % snowd ) +DEALLOCATE ( soil_snow % smelt ) +DEALLOCATE ( soil_snow % ssdnn ) +DEALLOCATE ( soil_snow % tss ) +DEALLOCATE ( soil_snow % tss_p ) +DEALLOCATE ( soil_snow % deltss ) +DEALLOCATE ( soil_snow % owb1 ) +DEALLOCATE ( soil_snow % sconds ) +DEALLOCATE ( soil_snow % sdepth ) +DEALLOCATE ( soil_snow % smass ) +DEALLOCATE ( soil_snow % ssdn ) +DEALLOCATE ( soil_snow % tgg ) +DEALLOCATE ( soil_snow % tggsn ) +DEALLOCATE ( soil_snow % dtmlt ) +DEALLOCATE ( soil_snow % albsoilsn ) +DEALLOCATE ( soil_snow % evapfbl ) +DEALLOCATE ( soil_snow % tilefrac ) +DEALLOCATE ( soil_snow % wbtot ) +DEALLOCATE ( soil_snow % gammzz ) +DEALLOCATE ( soil_snow % wb ) +DEALLOCATE ( soil_snow % wbice ) +DEALLOCATE ( soil_snow % wblf ) +DEALLOCATE ( soil_snow % wbfice ) +DEALLOCATE ( soil_snow % GWwb ) +DEALLOCATE ( soil_snow % GWhk ) +DEALLOCATE ( soil_snow % GWdhkdw ) +DEALLOCATE ( soil_snow % GWdsmpdw ) +DEALLOCATE ( soil_snow % wtd ) +DEALLOCATE ( soil_snow % GWsmp ) +DEALLOCATE ( soil_snow % GWwbeq ) +DEALLOCATE ( soil_snow % GWzq ) +DEALLOCATE ( soil_snow % qhz ) +DEALLOCATE ( soil_snow % satfrac ) +DEALLOCATE ( soil_snow % Qrecharge ) +DEALLOCATE ( soil_snow % rh_srf ) +DEALLOCATE ( soil_snow % rtevap_sat ) +DEALLOCATE ( soil_snow % rtevap_unsat ) +DEALLOCATE ( soil_snow % rt_qh_sublayer ) +DEALLOCATE ( soil_snow % wbeq ) +DEALLOCATE ( soil_snow % zq ) +DEALLOCATE ( soil_snow % icefrac ) +DEALLOCATE ( soil_snow % fracice ) +DEALLOCATE ( soil_snow % hk ) +DEALLOCATE ( soil_snow % smp ) +DEALLOCATE ( soil_snow % dhkdw ) +DEALLOCATE ( soil_snow % dsmpdw ) +DEALLOCATE ( soil_snow % wbliq ) +DEALLOCATE ( soil_snow % wmliq ) +DEALLOCATE ( soil_snow % wmice ) +DEALLOCATE ( soil_snow % wmtot ) +DEALLOCATE ( soil_snow % qhlev ) +DEALLOCATE ( soil_snow % S ) +DEALLOCATE ( soil_snow % Tsoil ) +DEALLOCATE ( soil_snow % SL ) +DEALLOCATE ( soil_snow % TL ) +DEALLOCATE ( soil_snow % h0 ) +DEALLOCATE ( soil_snow % rex ) +DEALLOCATE ( soil_snow % wflux ) +DEALLOCATE ( soil_snow % delwcol ) +DEALLOCATE ( soil_snow % zdelta ) +DEALLOCATE ( soil_snow % kth ) +DEALLOCATE ( soil_snow % Tsurface ) +DEALLOCATE ( soil_snow % lE ) +DEALLOCATE ( soil_snow % evap ) +DEALLOCATE ( soil_snow % ciso ) +DEALLOCATE ( soil_snow % cisoL ) +DEALLOCATE ( soil_snow % rlitt ) +DEALLOCATE ( soil_snow % thetai ) +DEALLOCATE ( soil_snow % snowliq ) +DEALLOCATE ( soil_snow % nsteps ) +DEALLOCATE ( soil_snow % TsurfaceFR ) +DEALLOCATE ( soil_snow % Ta_daily ) +DEALLOCATE ( soil_snow % nsnow ) +DEALLOCATE ( soil_snow % Qadv_daily ) +DEALLOCATE ( soil_snow % G0_daily ) +DEALLOCATE ( soil_snow % Qevap_daily ) +DEALLOCATE ( soil_snow % Qprec_daily ) +DEALLOCATE ( soil_snow % Qprec_snow_daily) + +RETURN +END SUBROUTINE dealloc_soil_snow_type + +SUBROUTINE assoc_soil_snow_type(soil_snow, soil_snow_data ) + +! Description: +! Associate the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(soil_snow_type), INTENT(IN OUT) :: soil_snow +TYPE(soil_snow_data_type), INTENT(IN OUT), TARGET :: soil_snow_data + +CHARACTER(LEN=*), PARAMETER :: RoutineName='' +!End of header + +CALL nullify_soil_snow_cbl(soil_snow) + +soil_snow% isflag => soil_snow_data% isflag +soil_snow% iantrct => soil_snow_data% iantrct +soil_snow% pudsto => soil_snow_data% pudsto +soil_snow% pudsmx => soil_snow_data% pudsmx +soil_snow% cls => soil_snow_data% cls +soil_snow% dfn_dtg => soil_snow_data% dfn_dtg +soil_snow% dfh_dtg => soil_snow_data% dfh_dtg +soil_snow% dfe_ddq => soil_snow_data% dfe_ddq +soil_snow% ddq_dtg => soil_snow_data% ddq_dtg +soil_snow% dfe_dtg => soil_snow_data% dfe_dtg +soil_snow% evapsn => soil_snow_data% evapsn +soil_snow% fwtop => soil_snow_data% fwtop +soil_snow% fwtop1 => soil_snow_data% fwtop1 +soil_snow% fwtop2 => soil_snow_data% fwtop2 +soil_snow% fwtop3 => soil_snow_data% fwtop3 +soil_snow% osnowd => soil_snow_data% osnowd +soil_snow% potev => soil_snow_data% potev +soil_snow% runoff => soil_snow_data% runoff +soil_snow% rnof1 => soil_snow_data% rnof1 +soil_snow% rnof2 => soil_snow_data% rnof2 +soil_snow% rtsoil => soil_snow_data% rtsoil +soil_snow% wbtot1 => soil_snow_data% wbtot1 +soil_snow% wbtot2 => soil_snow_data% wbtot2 +soil_snow% wb_lake => soil_snow_data% wb_lake +soil_snow% totwblake => soil_snow_data% totwblake +soil_snow% sinfil => soil_snow_data% sinfil +soil_snow% qstss => soil_snow_data% qstss +soil_snow% wetfac => soil_snow_data% wetfac +soil_snow% owetfac => soil_snow_data% owetfac +soil_snow% t_snwlr => soil_snow_data% t_snwlr +soil_snow% tggav => soil_snow_data% tggav +soil_snow% otgg => soil_snow_data% otgg +soil_snow% otss => soil_snow_data% otss +soil_snow% tprecip => soil_snow_data% tprecip +soil_snow% tevap => soil_snow_data% tevap +soil_snow% trnoff => soil_snow_data% trnoff +soil_snow% totenbal => soil_snow_data% totenbal +soil_snow% totenbal2 => soil_snow_data% totenbal2 +soil_snow% fland => soil_snow_data% fland +soil_snow% ifland => soil_snow_data% ifland +soil_snow% qasrf => soil_snow_data% qasrf +soil_snow% qfsrf => soil_snow_data% qfsrf +soil_snow% qssrf => soil_snow_data% qssrf +soil_snow% snage => soil_snow_data% snage +soil_snow% snowd => soil_snow_data% snowd +soil_snow% smelt => soil_snow_data% smelt +soil_snow% ssdnn => soil_snow_data% ssdnn +soil_snow% tss => soil_snow_data% tss +soil_snow% tss_p => soil_snow_data% tss_p +soil_snow% deltss => soil_snow_data% deltss +soil_snow% owb1 => soil_snow_data% owb1 +soil_snow% sconds => soil_snow_data% sconds +soil_snow% sdepth => soil_snow_data% sdepth +soil_snow% smass => soil_snow_data% smass +soil_snow% ssdn => soil_snow_data% ssdn +soil_snow% tgg => soil_snow_data% tgg +soil_snow% tggsn => soil_snow_data% tggsn +soil_snow% dtmlt => soil_snow_data% dtmlt +soil_snow% albsoilsn => soil_snow_data% albsoilsn +soil_snow% evapfbl => soil_snow_data% evapfbl +soil_snow% tilefrac => soil_snow_data% tilefrac +soil_snow% wbtot => soil_snow_data% wbtot +soil_snow% gammzz => soil_snow_data% gammzz +soil_snow% wb => soil_snow_data% wb +soil_snow% wbice => soil_snow_data% wbice +soil_snow% wblf => soil_snow_data% wblf +soil_snow% wbfice => soil_snow_data% wbfice +soil_snow% GWwb => soil_snow_data% GWwb +soil_snow% GWhk => soil_snow_data% GWhk +soil_snow% GWdhkdw => soil_snow_data% GWdhkdw +soil_snow% GWdsmpdw => soil_snow_data% GWdsmpdw +soil_snow% wtd => soil_snow_data% wtd +soil_snow% GWsmp => soil_snow_data% GWsmp +soil_snow% GWwbeq => soil_snow_data% GWwbeq +soil_snow% GWzq => soil_snow_data% GWzq +soil_snow% qhz => soil_snow_data% qhz +soil_snow% satfrac => soil_snow_data% satfrac +soil_snow% Qrecharge => soil_snow_data% Qrecharge +soil_snow% rh_srf => soil_snow_data% rh_srf +soil_snow% rtevap_sat => soil_snow_data% rtevap_sat +soil_snow% rtevap_unsat => soil_snow_data% rtevap_unsat +soil_snow% rt_qh_sublayer => soil_snow_data% rt_qh_sublayer +soil_snow% wbeq => soil_snow_data% wbeq +soil_snow% zq => soil_snow_data% zq +soil_snow% icefrac => soil_snow_data% icefrac +soil_snow% fracice => soil_snow_data% fracice +soil_snow% hk => soil_snow_data% hk +soil_snow% smp => soil_snow_data% smp +soil_snow% dhkdw => soil_snow_data% dhkdw +soil_snow% dsmpdw => soil_snow_data% dsmpdw +soil_snow% wbliq => soil_snow_data% wbliq +soil_snow% wmliq => soil_snow_data% wmliq +soil_snow% wmice => soil_snow_data% wmice +soil_snow% wmtot => soil_snow_data% wmtot +soil_snow% qhlev => soil_snow_data% qhlev +soil_snow% S => soil_snow_data% S +soil_snow% Tsoil => soil_snow_data% Tsoil +soil_snow% SL => soil_snow_data% SL +soil_snow% TL => soil_snow_data% TL +soil_snow% h0 => soil_snow_data% h0 +soil_snow% rex => soil_snow_data% rex +soil_snow% wflux => soil_snow_data% wflux +soil_snow% delwcol => soil_snow_data% delwcol +soil_snow% zdelta => soil_snow_data% zdelta +soil_snow% kth => soil_snow_data% kth +soil_snow% Tsurface => soil_snow_data% Tsurface +soil_snow% lE => soil_snow_data% lE +soil_snow% evap => soil_snow_data% evap +soil_snow% ciso => soil_snow_data% ciso +soil_snow% cisoL => soil_snow_data% cisoL +soil_snow% rlitt => soil_snow_data% rlitt +soil_snow% thetai => soil_snow_data% thetai +soil_snow% snowliq => soil_snow_data% snowliq +soil_snow% nsteps => soil_snow_data% nsteps +soil_snow% TsurfaceFR => soil_snow_data% TsurfaceFR +soil_snow% Ta_daily => soil_snow_data% Ta_daily +soil_snow% nsnow => soil_snow_data% nsnow +soil_snow% Qadv_daily => soil_snow_data% Qadv_daily +soil_snow% G0_daily => soil_snow_data% G0_daily +soil_snow% Qevap_daily => soil_snow_data% Qevap_daily +soil_snow% Qprec_daily => soil_snow_data% Qprec_daily +soil_snow% Qprec_snow_daily => soil_snow_data% Qprec_snow_daily + +RETURN +END SUBROUTINE assoc_soil_snow_type + +SUBROUTINE nullify_soil_snow_cbl( soil_snow ) + +! Description: +! Nullify the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(soil_snow_type), INTENT(IN OUT) :: soil_snow + +CHARACTER(LEN=*), PARAMETER :: RoutineName='NULLIFY_ASSOC_CBL_TYPES' +!End of header + +NULLIFY( soil_snow % isflag ) +NULLIFY( soil_snow % iantrct ) +NULLIFY( soil_snow % pudsto ) +NULLIFY( soil_snow % pudsmx ) +NULLIFY( soil_snow % cls ) +NULLIFY( soil_snow % dfn_dtg ) +NULLIFY( soil_snow % dfh_dtg ) +NULLIFY( soil_snow % dfe_ddq ) +NULLIFY( soil_snow % ddq_dtg ) +NULLIFY( soil_snow % dfe_dtg ) +NULLIFY( soil_snow % evapsn ) +NULLIFY( soil_snow % fwtop ) +NULLIFY( soil_snow % fwtop1 ) +NULLIFY( soil_snow % fwtop2 ) +NULLIFY( soil_snow % fwtop3 ) +NULLIFY( soil_snow % osnowd ) +NULLIFY( soil_snow % potev ) +NULLIFY( soil_snow % runoff ) +NULLIFY( soil_snow % rnof1 ) +NULLIFY( soil_snow % rnof2 ) +NULLIFY( soil_snow % rtsoil ) +NULLIFY( soil_snow % wbtot1 ) +NULLIFY( soil_snow % wbtot2 ) +NULLIFY( soil_snow % wb_lake ) +NULLIFY( soil_snow % totwblake ) +NULLIFY( soil_snow % sinfil ) +NULLIFY( soil_snow % qstss ) +NULLIFY( soil_snow % wetfac ) +NULLIFY( soil_snow % owetfac ) +NULLIFY( soil_snow % t_snwlr ) +NULLIFY( soil_snow % tggav ) +NULLIFY( soil_snow % otgg ) +NULLIFY( soil_snow % otss ) +NULLIFY( soil_snow % tprecip ) +NULLIFY( soil_snow % tevap ) +NULLIFY( soil_snow % trnoff ) +NULLIFY( soil_snow % totenbal ) +NULLIFY( soil_snow % totenbal2 ) +NULLIFY( soil_snow % fland ) +NULLIFY( soil_snow % ifland ) +NULLIFY( soil_snow % qasrf ) +NULLIFY( soil_snow % qfsrf ) +NULLIFY( soil_snow % qssrf ) +NULLIFY( soil_snow % snage ) +NULLIFY( soil_snow % snowd ) +NULLIFY( soil_snow % smelt ) +NULLIFY( soil_snow % ssdnn ) +NULLIFY( soil_snow % tss ) +NULLIFY( soil_snow % tss_p ) +NULLIFY( soil_snow % deltss ) +NULLIFY( soil_snow % owb1 ) +NULLIFY( soil_snow % sconds ) +NULLIFY( soil_snow % sdepth ) +NULLIFY( soil_snow % smass ) +NULLIFY( soil_snow % ssdn ) +NULLIFY( soil_snow % tgg ) +NULLIFY( soil_snow % tggsn ) +NULLIFY( soil_snow % dtmlt ) +NULLIFY( soil_snow % albsoilsn ) +NULLIFY( soil_snow % evapfbl ) +NULLIFY( soil_snow % tilefrac ) +NULLIFY( soil_snow % wbtot ) +NULLIFY( soil_snow % gammzz ) +NULLIFY( soil_snow % wb ) +NULLIFY( soil_snow % wbice ) +NULLIFY( soil_snow % wblf ) +NULLIFY( soil_snow % wbfice ) +NULLIFY( soil_snow % GWwb ) +NULLIFY( soil_snow % GWhk ) +NULLIFY( soil_snow % GWdhkdw ) +NULLIFY( soil_snow % GWdsmpdw ) +NULLIFY( soil_snow % wtd ) +NULLIFY( soil_snow % GWsmp ) +NULLIFY( soil_snow % GWwbeq ) +NULLIFY( soil_snow % GWzq ) +NULLIFY( soil_snow % qhz ) +NULLIFY( soil_snow % satfrac ) +NULLIFY( soil_snow % Qrecharge ) +NULLIFY( soil_snow % rh_srf ) +NULLIFY( soil_snow % rtevap_sat ) +NULLIFY( soil_snow % rtevap_unsat ) +NULLIFY( soil_snow % rt_qh_sublayer ) +NULLIFY( soil_snow % wbeq ) +NULLIFY( soil_snow % zq ) +NULLIFY( soil_snow % icefrac ) +NULLIFY( soil_snow % fracice ) +NULLIFY( soil_snow % hk ) +NULLIFY( soil_snow % smp ) +NULLIFY( soil_snow % dhkdw ) +NULLIFY( soil_snow % dsmpdw ) +NULLIFY( soil_snow % wbliq ) +NULLIFY( soil_snow % wmliq ) +NULLIFY( soil_snow % wmice ) +NULLIFY( soil_snow % wmtot ) +NULLIFY( soil_snow % qhlev ) +NULLIFY( soil_snow % S ) +NULLIFY( soil_snow % Tsoil ) +NULLIFY( soil_snow % SL ) +NULLIFY( soil_snow % TL ) +NULLIFY( soil_snow % h0 ) +NULLIFY( soil_snow % rex ) +NULLIFY( soil_snow % wflux ) +NULLIFY( soil_snow % delwcol ) +NULLIFY( soil_snow % zdelta ) +NULLIFY( soil_snow % kth ) +NULLIFY( soil_snow % Tsurface ) +NULLIFY( soil_snow % lE ) +NULLIFY( soil_snow % evap ) +NULLIFY( soil_snow % ciso ) +NULLIFY( soil_snow % cisoL ) +NULLIFY( soil_snow % rlitt ) +NULLIFY( soil_snow % thetai ) +NULLIFY( soil_snow % snowliq ) +NULLIFY( soil_snow % nsteps ) +NULLIFY( soil_snow % TsurfaceFR ) +NULLIFY( soil_snow % Ta_daily ) +NULLIFY( soil_snow % nsnow ) +NULLIFY( soil_snow % Qadv_daily ) +NULLIFY( soil_snow % G0_daily ) +NULLIFY( soil_snow % Qevap_daily ) +NULLIFY( soil_snow % Qprec_daily ) +NULLIFY( soil_snow % Qprec_snow_daily ) + +RETURN + +END SUBROUTINE nullify_soil_snow_cbl + +END MODULE cable_soil_snow_type_mod diff --git a/src/coupled/AM3/control/cable/CM3/sum_flux_type.F90 b/src/coupled/AM3/control/cable/CM3/sum_flux_type.F90 new file mode 100644 index 000000000..d3cc53e86 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/sum_flux_type.F90 @@ -0,0 +1,173 @@ +MODULE cable_sum_flux_type_mod + +USE cable_other_constants_mod, ONLY: r_2 + +IMPLICIT NONE + +PUBLIC :: sum_flux_type +PUBLIC :: sum_flux_data_type +PUBLIC :: alloc_sum_flux_type +PUBLIC :: dealloc_sum_flux_type +PUBLIC :: assoc_sum_flux_type +PUBLIC :: nullify_sum_flux_cbl + +! Cumulative flux variables: +TYPE sum_flux_data_type + + REAL, ALLOCATABLE :: sumpn (:) ! sum of canopy photosynthesis (g C m-2) + REAL, ALLOCATABLE :: sumrp (:) ! sum of plant respiration (g C m-2) + REAL, ALLOCATABLE :: sumrpw (:) ! sum of plant respiration (g C m-2) + REAL, ALLOCATABLE :: sumrpr (:) ! sum of plant respiration (g C m-2) + REAL, ALLOCATABLE :: sumrs (:) ! sum of soil respiration (g C m-2) + REAL, ALLOCATABLE :: sumrd (:) ! sum of daytime respiration (g C m-2) + REAL, ALLOCATABLE :: dsumpn (:) ! daily sumpn + REAL, ALLOCATABLE :: dsumrp (:) ! daily sumrp + REAL, ALLOCATABLE :: dsumrs (:) ! daily sumrs + REAL, ALLOCATABLE :: dsumrd (:) ! daily sumrd + REAL, ALLOCATABLE :: sumxrp (:) ! sum plant resp. modifier + REAL, ALLOCATABLE :: sumxrs (:) ! sum soil resp. modifier + +END TYPE sum_flux_data_type + +TYPE sum_flux_type + + REAL, POINTER :: sumpn (:) ! sum of canopy photosynthesis (g C m-2) + REAL, POINTER :: sumrp (:) ! sum of plant respiration (g C m-2) + REAL, POINTER :: sumrpw (:) ! sum of plant respiration (g C m-2) + REAL, POINTER :: sumrpr (:) ! sum of plant respiration (g C m-2) + REAL, POINTER :: sumrs (:) ! sum of soil respiration (g C m-2) + REAL, POINTER :: sumrd (:) ! sum of daytime respiration (g C m-2) + REAL, POINTER :: dsumpn (:) ! daily sumpn + REAL, POINTER :: dsumrp (:) ! daily sumrp + REAL, POINTER :: dsumrs (:) ! daily sumrs + REAL, POINTER :: dsumrd (:) ! daily sumrd + REAL, POINTER :: sumxrp (:) ! sum plant resp. modifier + REAL, POINTER :: sumxrs (:) ! sum soil resp. modifier + +END TYPE sum_flux_type + +CONTAINS + +SUBROUTINE alloc_sum_flux_type(sum_flux, mp) + +USE grid_constants_mod_cbl, ONLY: mf ! # leaves (sunlit/shaded) +USE grid_constants_mod_cbl, ONLY: nsl ! # soil layers +USE grid_constants_mod_cbl, ONLY: niter ! number of iterations for za/L + +IMPLICIT NONE + +TYPE(sum_flux_data_type), INTENT(INOUT) :: sum_flux +INTEGER, INTENT(IN) :: mp + +ALLOCATE( sum_flux% sumpn (mp) ) +ALLOCATE( sum_flux% sumrp (mp) ) +ALLOCATE( sum_flux% sumrpw (mp) ) +ALLOCATE( sum_flux% sumrpr (mp) ) +ALLOCATE( sum_flux% sumrs (mp) ) +ALLOCATE( sum_flux% sumrd (mp) ) +ALLOCATE( sum_flux% dsumpn (mp) ) +ALLOCATE( sum_flux% dsumrp (mp) ) +ALLOCATE( sum_flux% dsumrs (mp) ) +ALLOCATE( sum_flux% dsumrd (mp) ) +ALLOCATE( sum_flux% sumxrp (mp) ) +ALLOCATE( sum_flux% sumxrs (mp) ) + +sum_flux % sumpn (:) = 0.0 +sum_flux % sumrp (:) = 0.0 +sum_flux % sumrpw (:) = 0.0 +sum_flux % sumrpr (:) = 0.0 +sum_flux % sumrs (:) = 0.0 +sum_flux % sumrd (:) = 0.0 +sum_flux % dsumpn (:) = 0.0 +sum_flux % dsumrp (:) = 0.0 +sum_flux % dsumrs (:) = 0.0 +sum_flux % dsumrd (:) = 0.0 +sum_flux % sumxrp (:) = 0.0 +sum_flux % sumxrs (:) = 0.0 + +RETURN +END SUBROUTINE alloc_sum_flux_type + +SUBROUTINE dealloc_sum_flux_type(sum_flux) + +TYPE(sum_flux_type), INTENT(inout) :: sum_flux + +DEALLOCATE ( sum_flux % sumpn ) +DEALLOCATE ( sum_flux % sumrp ) +DEALLOCATE ( sum_flux % sumrpw ) +DEALLOCATE ( sum_flux % sumrpr ) +DEALLOCATE ( sum_flux % sumrs ) +DEALLOCATE ( sum_flux % sumrd ) +DEALLOCATE ( sum_flux % dsumpn ) +DEALLOCATE ( sum_flux % dsumrp ) +DEALLOCATE ( sum_flux % dsumrs ) +DEALLOCATE ( sum_flux % dsumrd ) +DEALLOCATE ( sum_flux % sumxrp ) +DEALLOCATE ( sum_flux % sumxrs ) + +RETURN +END SUBROUTINE dealloc_sum_flux_type + +SUBROUTINE assoc_sum_flux_type(sum_flux, sum_flux_data ) + +! Description: +! Associate the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(sum_flux_type), INTENT(IN OUT) :: sum_flux +TYPE(sum_flux_data_type), INTENT(IN OUT), TARGET :: sum_flux_data + +CHARACTER(LEN=*), PARAMETER :: RoutineName='' +!End of header + +CALL nullify_sum_flux_cbl(sum_flux) + +sum_flux% sumpn => sum_flux_data% sumpn +sum_flux% sumrp => sum_flux_data% sumrp +sum_flux% sumrpw => sum_flux_data% sumrpw +sum_flux% sumrpr => sum_flux_data% sumrpr +sum_flux% sumrs => sum_flux_data% sumrs +sum_flux% sumrd => sum_flux_data% sumrd +sum_flux% dsumpn => sum_flux_data% dsumpn +sum_flux% dsumrp => sum_flux_data% dsumrp +sum_flux% dsumrs => sum_flux_data% dsumrs +sum_flux% dsumrd => sum_flux_data% dsumrd +sum_flux% sumxrp => sum_flux_data% sumxrp +sum_flux% sumxrs => sum_flux_data% sumxrs + +RETURN +END SUBROUTINE assoc_sum_flux_type + +SUBROUTINE nullify_sum_flux_cbl( sum_flux ) + +! Description: +! Nullify the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(sum_flux_type), INTENT(IN OUT) :: sum_flux + +CHARACTER(LEN=*), PARAMETER :: RoutineName='NULLIFY_ASSOC_CBL_TYPES' +!End of header + +NULLIFY( sum_flux % sumpn ) +NULLIFY( sum_flux % sumrp ) +NULLIFY( sum_flux % sumrpw ) +NULLIFY( sum_flux % sumrpr ) +NULLIFY( sum_flux % sumrs ) +NULLIFY( sum_flux % sumrd ) +NULLIFY( sum_flux % dsumpn ) +NULLIFY( sum_flux % dsumrp ) +NULLIFY( sum_flux % dsumrs ) +NULLIFY( sum_flux % dsumrd ) +NULLIFY( sum_flux % sumxrp ) +NULLIFY( sum_flux % sumxrs ) + +RETURN + +END SUBROUTINE nullify_sum_flux_cbl + +END MODULE cable_sum_flux_type_mod diff --git a/src/coupled/AM3/control/cable/CM3/veg_type.F90 b/src/coupled/AM3/control/cable/CM3/veg_type.F90 new file mode 100644 index 000000000..f886d6466 --- /dev/null +++ b/src/coupled/AM3/control/cable/CM3/veg_type.F90 @@ -0,0 +1,429 @@ +MODULE cable_veg_type_mod + +USE cable_other_constants_mod, ONLY: r_2 + +IMPLICIT NONE + +PUBLIC :: veg_type +PUBLIC :: veg_data_type +PUBLIC :: alloc_veg_type +PUBLIC :: dealloc_veg_type +PUBLIC :: assoc_veg_type +PUBLIC :: nullify_veg_cbl + +! Vegetation parameters: +TYPE veg_data_type + + INTEGER, ALLOCATABLE :: iveg (:) ! vegetation(+nveg) type + INTEGER, ALLOCATABLE :: iLU (:) ! land use type + LOGICAL, ALLOCATABLE :: deciduous (:) ! flag used for phenology fix + + REAL, ALLOCATABLE :: canst1 (:) ! max intercepted water by canopy (mm/LAI) + REAL, ALLOCATABLE :: dleaf (:) ! chararacteristc legnth of leaf (m) + REAL, ALLOCATABLE :: ejmax (:) ! max pot. electron transp rate top leaf(mol/m2/s) + REAL, ALLOCATABLE :: meth (:) ! method for calculation of canopy fluxes and temp. + REAL, ALLOCATABLE :: frac4 (:) ! fraction of c4 plants + REAL, ALLOCATABLE :: hc (:) ! roughness height of canopy (veg - snow) + REAL, ALLOCATABLE :: vlai (:) ! leaf area index + REAL, ALLOCATABLE :: xalbnir (:) + REAL, ALLOCATABLE :: rp20 (:) ! plant respiration coefficient at 20 C + REAL, ALLOCATABLE :: rpcoef (:) ! temperature coef nonleaf plant respiration (1/C) + REAL, ALLOCATABLE :: rs20 (:) ! soil respiration at 20 C [mol m-2 s-1] + REAL, ALLOCATABLE :: shelrb (:) ! sheltering factor (dimensionless) + REAL, ALLOCATABLE :: vegcf (:) ! kdcorbin, 08/10 + REAL, ALLOCATABLE :: tminvj (:) ! min temperature of the start of photosynthesis + REAL, ALLOCATABLE :: toptvj (:) ! opt temperature of the start of photosynthesis + REAL, ALLOCATABLE :: tmaxvj (:) ! max temperature of the start of photosynthesis + REAL, ALLOCATABLE :: vbeta (:) ! + REAL, ALLOCATABLE :: vcmax (:) ! max RuBP carboxylation rate top leaf (mol/m2/s) + REAL, ALLOCATABLE :: xfang (:) ! leaf angle PARAMETER + REAL, ALLOCATABLE :: extkn (:) ! extinction coef for vertical + REAL, ALLOCATABLE :: vlaimax (:) ! extinction coef for vertical + REAL, ALLOCATABLE :: wai (:) ! wood area index (stem+branches+twigs) + REAL, ALLOCATABLE :: a1gs (:) ! a1 parameter in stomatal conductance model + REAL, ALLOCATABLE :: d0gs (:) ! d0 in stomatal conductance model + REAL, ALLOCATABLE :: alpha (:) ! initial slope of J-Q response curve + REAL, ALLOCATABLE :: convex (:) ! convexity of J-Q response curve + REAL, ALLOCATABLE :: cfrd (:) ! ratio of day respiration to vcmax + REAL, ALLOCATABLE :: gswmin (:) ! minimal stomatal conductance + REAL, ALLOCATABLE :: conkc0 (:) ! Michaelis-menton constant for carboxylase + REAL, ALLOCATABLE :: conko0 (:) ! Michaelis-menton constant for oxygenase + REAL, ALLOCATABLE :: ekc (:) ! activation energy for caroxylagse + REAL, ALLOCATABLE :: eko (:) ! acvtivation enegery for oxygenase + REAL, ALLOCATABLE :: g0 (:) ! Belinda's stomatal model intercept, Ticket #56. + REAL, ALLOCATABLE :: g1 (:) ! Belinda's stomatal model slope, Ticket #56. + + REAL, ALLOCATABLE :: refl (:,:) + REAL, ALLOCATABLE :: taul (:,:) + REAL, ALLOCATABLE :: froot (:,:) ! fraction of root in each soil layer + + ! Additional veg parameters: + REAL(r_2), ALLOCATABLE :: rootbeta (:) ! parameter for estimating vertical root mass distribution (froot) + REAL(r_2), ALLOCATABLE :: gamma (:) ! parameter in root efficiency function (Lai and Katul 2000) + REAL(r_2), ALLOCATABLE :: ZR (:) ! maximum rooting depth (cm) + REAL(r_2), ALLOCATABLE :: F10 (:) ! fraction of roots in top 10 cm + REAL(r_2), ALLOCATABLE :: clitt (:) ! + + ! Additional POP veg param + INTEGER, ALLOCATABLE :: disturbance_interval (:,:) + REAL(r_2), ALLOCATABLE :: disturbance_intensity (:,:) ! + +END TYPE veg_data_type + +TYPE veg_type + + INTEGER, POINTER :: iveg (:) ! vegetation(+nveg) type + INTEGER, POINTER :: iLU (:) ! land use type + LOGICAL, POINTER :: deciduous (:) ! flag used for phenology fix + + REAL, POINTER :: canst1 (:) ! max intercepted water by canopy (mm/LAI) + REAL, POINTER :: dleaf (:) ! chararacteristc legnth of leaf (m) + REAL, POINTER :: ejmax (:) ! max pot. electron transp rate top leaf(mol/m2/s) + REAL, POINTER :: meth (:) ! method for calculation of canopy fluxes and temp. + REAL, POINTER :: frac4 (:) ! fraction of c4 plants + REAL, POINTER :: hc (:) ! roughness height of canopy (veg - snow) + REAL, POINTER :: vlai (:) ! leaf area index + REAL, POINTER :: xalbnir (:) + REAL, POINTER :: rp20 (:) ! plant respiration coefficient at 20 C + REAL, POINTER :: rpcoef (:) ! temperature coef nonleaf plant respiration (1/C) + REAL, POINTER :: rs20 (:) ! soil respiration at 20 C [mol m-2 s-1] + REAL, POINTER :: shelrb (:) ! sheltering factor (dimensionless) + REAL, POINTER :: vegcf (:) ! kdcorbin, 08/10 + REAL, POINTER :: tminvj (:) ! min temperature of the start of photosynthesis + REAL, POINTER :: toptvj (:) ! opt temperature of the start of photosynthesis + REAL, POINTER :: tmaxvj (:) ! max temperature of the start of photosynthesis + REAL, POINTER :: vbeta (:) ! + REAL, POINTER :: vcmax (:) ! max RuBP carboxylation rate top leaf (mol/m2/s) + REAL, POINTER :: xfang (:) ! leaf angle PARAMETER + REAL, POINTER :: extkn (:) ! extinction coef for vertical + REAL, POINTER :: vlaimax (:) ! extinction coef for vertical + REAL, POINTER :: wai (:) ! wood area index (stem+branches+twigs) + REAL, POINTER :: a1gs (:) ! a1 parameter in stomatal conductance model + REAL, POINTER :: d0gs (:) ! d0 in stomatal conductance model + REAL, POINTER :: alpha (:) ! initial slope of J-Q response curve + REAL, POINTER :: convex (:) ! convexity of J-Q response curve + REAL, POINTER :: cfrd (:) ! ratio of day respiration to vcmax + REAL, POINTER :: gswmin (:) ! minimal stomatal conductance + REAL, POINTER :: conkc0 (:) ! Michaelis-menton constant for carboxylase + REAL, POINTER :: conko0 (:) ! Michaelis-menton constant for oxygenase + REAL, POINTER :: ekc (:) ! activation energy for caroxylagse + REAL, POINTER :: eko (:) ! acvtivation enegery for oxygenase + REAL, POINTER :: g0 (:) ! Belinda's stomatal model intercept, Ticket #56. + REAL, POINTER :: g1 (:) ! Belinda's stomatal model slope, Ticket #56. + + REAL, POINTER :: refl (:,:) + REAL, POINTER :: taul (:,:) + REAL, POINTER :: froot (:,:) ! fraction of root in each soil layer + + ! Additional veg parameters: + REAL(r_2), POINTER :: rootbeta (:) ! parameter for estimating vertical root mass distribution (froot) + REAL(r_2), POINTER :: gamma (:) ! parameter in root efficiency function (Lai and Katul 2000) + REAL(r_2), POINTER :: ZR (:) ! maximum rooting depth (cm) + REAL(r_2), POINTER :: F10 (:) ! fraction of roots in top 10 cm + REAL(r_2), POINTER :: clitt (:) ! + + ! Additional POP veg param + INTEGER, POINTER :: disturbance_interval (:,:) + REAL(r_2), POINTER :: disturbance_intensity (:,:) ! + +END TYPE veg_type + +CONTAINS + +SUBROUTINE alloc_veg_type(veg, mp) + +USE grid_constants_mod_cbl, ONLY: nsl ! # soil layers +USE grid_constants_mod_cbl, ONLY: swb ! # Radiation SW bands + +IMPLICIT NONE + +TYPE(veg_data_type), INTENT(INOUT) :: veg +INTEGER, INTENT(IN) :: mp + +ALLOCATE( veg% iveg (mp) ) +ALLOCATE( veg% iLU (mp) ) +ALLOCATE( veg% deciduous (mp) ) +ALLOCATE( veg% canst1 (mp) ) +ALLOCATE( veg% dleaf (mp) ) +ALLOCATE( veg% ejmax (mp) ) +ALLOCATE( veg% meth (mp) ) +ALLOCATE( veg% frac4 (mp) ) +ALLOCATE( veg% hc (mp) ) +ALLOCATE( veg% vlai (mp) ) +ALLOCATE( veg% xalbnir (mp) ) +ALLOCATE( veg% rp20 (mp) ) +ALLOCATE( veg% rpcoef (mp) ) +ALLOCATE( veg% rs20 (mp) ) +ALLOCATE( veg% shelrb (mp) ) +ALLOCATE( veg% vegcf (mp) ) +ALLOCATE( veg% tminvj (mp) ) +ALLOCATE( veg% toptvj (mp) ) +ALLOCATE( veg% tmaxvj (mp) ) +ALLOCATE( veg% vbeta (mp) ) +ALLOCATE( veg% vcmax (mp) ) +ALLOCATE( veg% xfang (mp) ) +ALLOCATE( veg% extkn (mp) ) +ALLOCATE( veg% vlaimax (mp) ) +ALLOCATE( veg% wai (mp) ) +ALLOCATE( veg% a1gs (mp) ) +ALLOCATE( veg% d0gs (mp) ) +ALLOCATE( veg% alpha (mp) ) +ALLOCATE( veg% convex (mp) ) +ALLOCATE( veg% cfrd (mp) ) +ALLOCATE( veg% gswmin (mp) ) +ALLOCATE( veg% conkc0 (mp) ) +ALLOCATE( veg% conko0 (mp) ) +ALLOCATE( veg% ekc (mp) ) +ALLOCATE( veg% eko (mp) ) +ALLOCATE( veg% g0 (mp) ) +ALLOCATE( veg% g1 (mp) ) +ALLOCATE( veg% refl (mp,swb) ) +ALLOCATE( veg% taul (mp,swb) ) +ALLOCATE( veg% froot (mp,nsl) ) +ALLOCATE( veg% rootbeta (mp) ) +ALLOCATE( veg% gamma (mp) ) +ALLOCATE( veg% ZR (mp) ) +ALLOCATE( veg% F10 (mp) ) +ALLOCATE( veg% clitt (mp) ) +ALLOCATE( veg% disturbance_interval (mp,2) ) !jhan:2?? +ALLOCATE( veg% disturbance_intensity (mp,2) ) !jhan:2?? + +veg % iveg (:) = 0.0 +veg % iLU (:) = 0.0 +veg % deciduous (:) = .FALSE. +veg % canst1 (:) = 0.0 +veg % dleaf (:) = 0.0 +veg % ejmax (:) = 0.0 +veg % meth (:) = 0.0 +veg % frac4 (:) = 0.0 +veg % hc (:) = 0.0 +veg % vlai (:) = 0.0 +veg % xalbnir (:) = 0.0 +veg % rp20 (:) = 0.0 +veg % rpcoef (:) = 0.0 +veg % rs20 (:) = 0.0 +veg % shelrb (:) = 0.0 +veg % vegcf (:) = 0.0 +veg % tminvj (:) = 0.0 +veg % toptvj (:) = 0.0 +veg % tmaxvj (:) = 0.0 +veg % vbeta (:) = 0.0 +veg % vcmax (:) = 0.0 +veg % xfang (:) = 0.0 +veg % extkn (:) = 0.0 +veg % vlaimax (:) = 0.0 +veg % wai (:) = 0.0 +veg % a1gs (:) = 0.0 +veg % d0gs (:) = 0.0 +veg % alpha (:) = 0.0 +veg % convex (:) = 0.0 +veg % cfrd (:) = 0.0 +veg % gswmin (:) = 0.0 +veg % conkc0 (:) = 0.0 +veg % conko0 (:) = 0.0 +veg % ekc (:) = 0.0 +veg % eko (:) = 0.0 +veg % g0 (:) = 0.0 +veg % g1 (:) = 0.0 +veg % refl (:,:) = 0.0 +veg % taul (:,:) = 0.0 +veg % froot (:,:) = 0.0 +veg % rootbeta (:) = 0.0 +veg % gamma (:) = 0.0 +veg % ZR (:) = 0.0 +veg % F10 (:) = 0.0 +veg % clitt (:) = 0.0 +veg % disturbance_interval (:,:) = 0.0 +veg % disturbance_intensity (:,:) = 0.0 + +RETURN +END SUBROUTINE alloc_veg_type + +SUBROUTINE dealloc_veg_type(veg) + +TYPE(veg_type), INTENT(inout) :: veg + +DEALLOCATE ( veg % iveg ) +DEALLOCATE ( veg % iLU ) +DEALLOCATE ( veg % deciduous ) +DEALLOCATE ( veg % canst1 ) +DEALLOCATE ( veg % dleaf ) +DEALLOCATE ( veg % ejmax ) +DEALLOCATE ( veg % meth ) +DEALLOCATE ( veg % frac4 ) +DEALLOCATE ( veg % hc ) +DEALLOCATE ( veg % vlai ) +DEALLOCATE ( veg % xalbnir ) +DEALLOCATE ( veg % rp20 ) +DEALLOCATE ( veg % rpcoef ) +DEALLOCATE ( veg % rs20 ) +DEALLOCATE ( veg % shelrb ) +DEALLOCATE ( veg % vegcf ) +DEALLOCATE ( veg % tminvj ) +DEALLOCATE ( veg % toptvj ) +DEALLOCATE ( veg % tmaxvj ) +DEALLOCATE ( veg % vbeta ) +DEALLOCATE ( veg % vcmax ) +DEALLOCATE ( veg % xfang ) +DEALLOCATE ( veg % extkn ) +DEALLOCATE ( veg % vlaimax ) +DEALLOCATE ( veg % wai ) +DEALLOCATE ( veg % a1gs ) +DEALLOCATE ( veg % d0gs ) +DEALLOCATE ( veg % alpha ) +DEALLOCATE ( veg % convex ) +DEALLOCATE ( veg % cfrd ) +DEALLOCATE ( veg % gswmin ) +DEALLOCATE ( veg % conkc0 ) +DEALLOCATE ( veg % conko0 ) +DEALLOCATE ( veg % ekc ) +DEALLOCATE ( veg % eko ) +DEALLOCATE ( veg % g0 ) +DEALLOCATE ( veg % g1 ) +DEALLOCATE ( veg % refl ) +DEALLOCATE ( veg % taul ) +DEALLOCATE ( veg % froot ) +DEALLOCATE ( veg % rootbeta ) +DEALLOCATE ( veg % gamma ) +DEALLOCATE ( veg % ZR ) +DEALLOCATE ( veg % F10 ) +DEALLOCATE ( veg % clitt ) +DEALLOCATE ( veg % disturbance_interval ) +DEALLOCATE ( veg % disturbance_intensity) + +RETURN +END SUBROUTINE dealloc_veg_type + +SUBROUTINE assoc_veg_type(veg, veg_data ) + +! Description: +! Associate the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(veg_type), INTENT(IN OUT) :: veg +TYPE(veg_data_type), INTENT(IN OUT), TARGET :: veg_data + +CHARACTER(LEN=*), PARAMETER :: RoutineName='' +!End of header + +CALL nullify_veg_cbl(veg) + +veg% iveg => veg_data% iveg +veg% iLU => veg_data% iLU +veg% deciduous => veg_data% deciduous +veg% canst1 => veg_data% canst1 +veg% dleaf => veg_data% dleaf +veg% ejmax => veg_data% ejmax +veg% meth => veg_data% meth +veg% frac4 => veg_data% frac4 +veg% hc => veg_data% hc +veg% vlai => veg_data% vlai +veg% xalbnir => veg_data% xalbnir +veg% rp20 => veg_data% rp20 +veg% rpcoef => veg_data% rpcoef +veg% rs20 => veg_data% rs20 +veg% shelrb => veg_data% shelrb +veg% vegcf => veg_data% vegcf +veg% tminvj => veg_data% tminvj +veg% toptvj => veg_data% toptvj +veg% tmaxvj => veg_data% tmaxvj +veg% vbeta => veg_data% vbeta +veg% vcmax => veg_data% vcmax +veg% xfang => veg_data% xfang +veg% extkn => veg_data% extkn +veg% vlaimax => veg_data% vlaimax +veg% wai => veg_data% wai +veg% a1gs => veg_data% a1gs +veg% d0gs => veg_data% d0gs +veg% alpha => veg_data% alpha +veg% convex => veg_data% convex +veg% cfrd => veg_data% cfrd +veg% gswmin => veg_data% gswmin +veg% conkc0 => veg_data% conkc0 +veg% conko0 => veg_data% conko0 +veg% ekc => veg_data% ekc +veg% eko => veg_data% eko +veg% g0 => veg_data% g0 +veg% g1 => veg_data% g1 +veg% refl => veg_data% refl +veg% taul => veg_data% taul +veg% froot => veg_data% froot +veg% rootbeta => veg_data% rootbeta +veg% gamma => veg_data% gamma +veg% ZR => veg_data% ZR +veg% F10 => veg_data% F10 +veg% clitt => veg_data% clitt +veg% disturbance_interval => veg_data% disturbance_interval +veg% disturbance_intensity => veg_data% disturbance_intensity + +RETURN +END SUBROUTINE assoc_veg_type + +SUBROUTINE nullify_veg_cbl( veg ) + +! Description: +! Nullify the CABLE work pointers in the derived type structure + +IMPLICIT NONE + +!Arguments +TYPE(veg_type), INTENT(IN OUT) :: veg + +CHARACTER(LEN=*), PARAMETER :: RoutineName='NULLIFY_ASSOC_CBL_TYPES' +!End of header + +NULLIFY( veg % iveg ) +NULLIFY( veg % iLU ) +NULLIFY( veg % deciduous ) +NULLIFY( veg % canst1 ) +NULLIFY( veg % dleaf ) +NULLIFY( veg % ejmax ) +NULLIFY( veg % meth ) +NULLIFY( veg % frac4 ) +NULLIFY( veg % hc ) +NULLIFY( veg % vlai ) +NULLIFY( veg % xalbnir ) +NULLIFY( veg % rp20 ) +NULLIFY( veg % rpcoef ) +NULLIFY( veg % rs20 ) +NULLIFY( veg % shelrb ) +NULLIFY( veg % vegcf ) +NULLIFY( veg % tminvj ) +NULLIFY( veg % toptvj ) +NULLIFY( veg % tmaxvj ) +NULLIFY( veg % vbeta ) +NULLIFY( veg % vcmax ) +NULLIFY( veg % xfang ) +NULLIFY( veg % extkn ) +NULLIFY( veg % vlaimax ) +NULLIFY( veg % wai ) +NULLIFY( veg % a1gs ) +NULLIFY( veg % d0gs ) +NULLIFY( veg % alpha ) +NULLIFY( veg % convex ) +NULLIFY( veg % cfrd ) +NULLIFY( veg % gswmin ) +NULLIFY( veg % conkc0 ) +NULLIFY( veg % conko0 ) +NULLIFY( veg % ekc ) +NULLIFY( veg % eko ) +NULLIFY( veg % g0 ) +NULLIFY( veg % g1 ) +NULLIFY( veg % refl ) +NULLIFY( veg % taul ) +NULLIFY( veg % froot ) +NULLIFY( veg % rootbeta ) +NULLIFY( veg % gamma ) +NULLIFY( veg % ZR ) +NULLIFY( veg % F10 ) +NULLIFY( veg % clitt ) +NULLIFY( veg % disturbance_interval ) +NULLIFY( veg % disturbance_intensity ) + +RETURN + +END SUBROUTINE nullify_veg_cbl + +END MODULE cable_veg_type_mod diff --git a/src/coupled/AM3/control/cable/cable_land/explicit/cable_land_sf_explicit_cbl.F90 b/src/coupled/AM3/control/cable/cable_land/explicit/cable_land_sf_explicit_cbl.F90 new file mode 100644 index 000000000..56fe0626d --- /dev/null +++ b/src/coupled/AM3/control/cable/cable_land/explicit/cable_land_sf_explicit_cbl.F90 @@ -0,0 +1,2931 @@ +! *****************************COPYRIGHT******************************* +! (C) Crown copyright Met Office. All rights reserved. +! For further details please refer to the file COPYRIGHT.txt +! which you should have received as part of this distribution. +! *****************************COPYRIGHT******************************* +MODULE cable_land_sf_explicit_mod + +USE um_types, ONLY: real_jlslsm + +IMPLICIT NONE + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: & + ModuleName='CABLE_LAND_SF_EXPLICIT_MOD' + +CONTAINS +! SUBROUTINE CABLE_LAND_SF_EXPLICIT --------------------------------- +! +! Purpose: Calculate explicit surface fluxes of heat, moisture and +! momentum over land. Also calculates surface exchange +! coefficients required for implicit update of surface +! fluxes and surface information required by the +! explicit boundary layer routine +! +! +! Documentation: UMDP 24. +! +! !CM3#55 - this routine is derived from jules_land_sf_explicit and +! and modified for the purposes of linking CABLE and JULES together +! in the surf_couple_explicit section - work commencing 6/12/2023 +! +! All edits will be accompanied by comments starting with !CM3#55-x +! referring to the git issue - where possible the included number x will +! refer to sub-issue as per the git discussion +! +!--------------------------------------------------------------------- +! Arguments :- +SUBROUTINE cable_land_sf_explicit ( & +! IN date-related values + curr_day_number, & +! IN values defining field dimensions and subset to be processed : + land_pts, & +! IN parameters for iterative SISL scheme + numcycles, cycleno, & +! IN parameters required from boundary-layer scheme : + bq_1,bt_1,z1_uv,z1_uv_top,z1_tq,z1_tq_top,qw_1,tl_1, & +! IN soil/vegetation/land surface data : + land_index,nsurft,sm_levels,canopy,catch,catch_snow,hcon_soilt, & + ho2r2_orog, flandg, & + snow_surft,sil_orog_land,smvccl_soilt,smvcst_soilt,smvcwt_soilt,sthf_soilt, & + sthu_soilt,z0_surft,z0h_surft_bare, z0m_soil_in, & +! IN input data from the wave model + charnock_w, & +! IN everything not covered so far : + pstar,lw_down,sw_surft,zh,ddmfx, & + co2_mmr,co2_3d,l_co2_interactive,l_phenol, & + asteps_since_triffid,cs_pool_soilt,veg_state,frac,canht_pft, & + photosynth_act_rad,lai_pft, & + l_mr_physics,t_soil_soilt,tsurf_elev_surft,tstar_surft,z_land, & + albsoil_soilt,cos_zenith_angle,l_aero_classic,l_dust,l_dust_diag, & + clay_soilt,o3, l_emis_surft_set, & +! INOUT diagnostics + sf_diag, & +! INOUT data : + emis_surft,gs,gc_corr,g_leaf_acc,npp_pft_acc,resp_w_pft_acc,resp_s_acc_soilt, & + rhostar,fqw_1,ftl_1,t1_sd,q1_sd,vshr,vshr_land, & +! OUT Diagnostic not requiring STASH flags : + ftl_surft, & +! OUT variables for message passing + rhokm_land, cdr10m, & +! OUT data required for mineral dust scheme + u_s_std_surft, & +! OUT data required elsewhere in boundary layer or surface code + alpha1,ashtf_prime_surft,fqw_surft,epot_surft,fraca, & + resfs,resft,rhokh_surft,dtstar_surft,z0h_surft, z0m_surft, & + chr1p5m,smc_soilt,hcons_soilt,gpp,npp,resp_p,g_leaf,gpp_pft,npp_pft, & + resp_p_pft,resp_s_soilt,resp_s_tot_soilt,resp_l_pft,resp_r_pft, & + resp_w_pft,n_leaf,n_root,n_stem,lai_bal,gc_surft,canhc_surft,wt_ext_surft, & + flake,surft_index,surft_pts,tile_frac,fsmc_pft,emis_soil, & +! OUT required for classic aerosols + cd_land,rib_surft,ch_surft_classic,cd_std_classic, & +! OUT required for sea and sea-ice calculations + l_cdr10m_snow, & + !New arguments replacing USE statements + !Fluxes (IN) + t_home_gb, t_growth_gb, & + !urban_param (IN) + emisr_gb, emisw_gb, hwr_gb, & + !jules_mod (IN OUT) + albobs_scaling_surft, & + !jules_chemvars_mod (OUT) + isoprene_gb, isoprene_pft, terpene_gb , terpene_pft, & + methanol_gb, methanol_pft, acetone_gb, acetone_pft, & + !trif_vars_mod (OUT) + fapar_diag_pft, apar_diag_pft, apar_diag_gb, gpp_gb_acc, gpp_pft_acc, & + !crop_vars_mod (IN) + rootc_cpft, sthu_irr_soilt, frac_irr_soilt, frac_irr_surft, dvi_cpft, & + !crop_vars_mod (IN OUT) + resfs_irr_surft, & + !crop_vars_mod (OUT) + gs_irr_surft, smc_irr_soilt, wt_ext_irr_surft, gc_irr_surft, & + !p_s_parms (IN) + bexp_soilt, sathh_soilt, v_close_pft, v_open_pft, & + !urban_param (IN) + wrr_gb, & + !Fluxes (IN OUT) + anthrop_heat_surft, & + !prognostics (IN) + nsnow_surft, sice_surft, sliq_surft, snowdepth_surft, & + tsnow_surft, ds_surft, & + !c_elevate (OUT) + surf_hgt_surft, lw_down_elevcorr_surft, & + !jules_mod (OUT) + snowdep_surft, & + !urban_param (IN) + hgt_gb, disp_gb, & + !lake_mod (IN) + lake_t_ice_gb,lake_t_mxl_gb, lake_h_ice_gb,lake_depth_gb, & + g_dt_gb, non_lake_frac, & + !lake_mod (OUT) + nusselt_gb, ts1_lake_gb, hcon_lake, & + !ancil_info + l_lice_point, l_soil_point, & + !jules_surface_types (IN) + diff_frac, & + !chemvars (OUT) + flux_o3_pft, fo3_pft, & + !CABLE_LSM:CM3 + progs_cbl, work_cbl, pars_io_cbl, progs_cnp, & + mype, timestep_number, satcon_soilt, & + latitude, longitude, u_s, ls_rain, ls_snow ) + +USE ancil_info, ONLY: dim_cslayer, l_lice_surft, nsoilt, rad_nband +USE atm_fields_bounds_mod, ONLY: pdims_s, pdims, tdims +USE bl_option_mod, ONLY: l_quick_ap2 +USE c_elevate, ONLY: l_elev_absolute_height +USE c_z0h_z0m, ONLY: z0h_z0m, z0h_z0m_classic +USE calc_air_dens_mod, ONLY: calc_air_dens +USE can_drag_mod, ONLY: can_drag_z0, can_drag_phi_m_h +USE csigma, ONLY: sbcon +USE dust_param, ONLY: z0_soil +USE elevate_mod, ONLY: elevate +USE fcdch_mod, ONLY: fcdch +USE gen_anthrop_heat_mod, ONLY: generate_anthropogenic_heat +USE heat_con_mod, ONLY: heat_con +USE physiol_mod, ONLY: physiol +USE planet_constants_mod, ONLY: cp, vkman, r, c_virtual,epsil=>repsilon +USE qsat_mod, ONLY: qsat, qsat_mix +USE sf_diags_mod, ONLY: strnewsfdiag +USE sf_flux_mod_cbl, ONLY: sf_flux_cbl +USE sf_orog_mod, ONLY: sf_orog +USE sf_resist_mod, ONLY: sf_resist +USE sf_rib_mod, ONLY: sf_rib +USE sfl_int_mod, ONLY: sfl_int +USE snowtherm_mod, ONLY: snowtherm +USE solinc_data, ONLY: sky, l_skyview +USE stdev1_mod, ONLY: stdev1 +USE stochastic_physics_run_mod, ONLY: l_rp2, i_rp_scheme, i_rp2b, z0hm_pft_rp +USE theta_field_sizes, ONLY: t_i_length,t_j_length +USE tilepts_mod, ONLY: tilepts +USE timestep_mod, ONLY: timestep +USE urban_param_mod, ONLY: z0m_mat +USE urbanz0_mod, ONLY: urbanz0 +USE veg_param, ONLY: secs_per_360days +USE veg3_field_mod, ONLY: veg_state_type +USE water_constants_mod, ONLY: lc, rho_ice, tm + +USE jules_soil_biogeochem_mod, ONLY: & +! imported scalar parameters + soil_model_rothc, & +! imported scalar variables (IN) + soil_bgc_model + +USE jules_soil_mod, ONLY: dzsoil, dzsoil_elev, hcice, hcwat, hcondeep + +USE jules_surface_types_mod, ONLY: npft, nnpft, ntype, & + urban_canyon, urban_roof, soil, lake, ncpft + +#if defined(UM_JULES) +USE atm_step_local, ONLY: dim_cs1, co2_dim_len,co2_dim_row +#else +USE ancil_info, ONLY: dim_cs1, co2_dim_len, co2_dim_row +#endif + +USE jules_snow_mod, ONLY: cansnowtile & + ,rho_snow_const & + ,snow_hcon & + ,l_snowdep_surf & + ,l_snow_nocan_hc & + ,nsmax & + ,unload_rate_u + +USE jules_surface_mod, ONLY: l_aggregate, formdrag, l_anthrop_heat_src, & + i_aggregate_opt, cor_mo_iter, & + use_correct_ustar, iscrntdiag, & + l_flake_model,l_elev_lw_down, & + l_mo_buoyancy_calc, effective_z0, & + IP_ScrnDecpl2, IP_ScrnDecpl3, & + l_vary_z0m_soil, l_elev_land_ice, ls + +USE jules_vegetation_mod, ONLY: can_model, can_rad_mod, ilayers, l_triffid, & + l_vegdrag_surft + +USE jules_irrig_mod, ONLY: l_irrig_dmd + +USE jules_sea_seaice_mod, ONLY: l_ctile, charnock, ip_ss_solid + +USE jules_urban_mod, ONLY: l_moruses_rough_surft, l_moruses_storage + +USE jules_science_fixes_mod, ONLY: ctile_orog_fix, correct_sea_adjust_land, & + l_fix_wind_snow, l_accurate_rho, & + l_fix_moruses_roof_rad_coupling + +USE ereport_mod, ONLY: ereport +USE errormessagelength_mod, ONLY: errormessagelength + +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook + +USE progs_cbl_vars_mod, ONLY: progs_cbl_vars_type ! CABLE intro-ed progs +USE work_vars_mod_cbl, ONLY: work_vars_type ! some kept thru timestep +USE params_io_mod_cbl, ONLY: params_io_data_type +USE progs_cnp_vars_mod, ONLY: progs_cnp_vars_type ! CASA-CNP intro-ed progs +USE cable_explicit_main_mod, ONLY: cable_explicit_main + +IMPLICIT NONE +!----------------------------------------------------------------------- +! Inputs :- +!----------------------------------------------------------------------- +! (a) Defining horizontal grid and subset thereof to be processed. +! Checked for consistency. +INTEGER, INTENT(IN) :: & + curr_day_number, & + ! IN current day of year + land_pts, & + ! IN No of land points being processed. + numcycles, & + ! Number of cycles (iterations) for iterative SISL. + cycleno + ! Iteration no + +! Defining vertical grid of model atmosphere. +REAL(KIND=real_jlslsm), INTENT(IN) :: & + bq_1(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! IN A buoyancy parameter + ! (beta q tilde). +,bt_1(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! IN A buoyancy parameter + ! (beta T tilde). +,z1_uv(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! IN Height of lowest uv level (m). +,z1_tq(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! IN Height of lowest tq level (m). + ! Note, if the grid used is + ! staggered in the vertical, + ! Z1_UV and Z1_TQ can be + ! different. +,qw_1(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! IN Total water content +,tl_1(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) + ! IN Ice/liquid water temperature + +REAL(KIND=real_jlslsm), INTENT(IN) :: & + charnock_w(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) +! Charnock's coefficient from wave model + +REAL(KIND=real_jlslsm), INTENT(IN) :: & + z1_uv_top(tdims%i_start:tdims%i_end, & + tdims%j_start:tdims%j_end) + ! Height of top of lowest uv-layer +REAL(KIND=real_jlslsm), INTENT(IN) :: & + z1_tq_top(tdims%i_start:tdims%i_end, & + tdims%j_start:tdims%j_end) + ! Height of top of lowest Tq-layer + +! (c) Soil/vegetation/land surface parameters (mostly constant). +LOGICAL, INTENT(IN) :: & + l_co2_interactive & + ! IN Switch for 3D CO2 field +,l_phenol + ! IN Indicates whether phenology + ! in use + +INTEGER, INTENT(IN) :: & + land_index(land_pts) ! IN LAND_INDEX(I)=J => the Jth + ! point in ROW_LENGTH,ROWS is the + ! land point. + +INTEGER, INTENT(IN) :: & + sm_levels & + ! IN No. of soil moisture levels +,nsurft & + ! IN No. of land-surface tiles +,asteps_since_triffid + ! IN Number of atmospheric + ! timesteps since last call + ! to TRIFFID. + +REAL(KIND=real_jlslsm), INTENT(IN) :: & + canopy(land_pts,nsurft) & + ! IN Surface/canopy water for + ! snow-free land tiles (kg/m2) +,catch(land_pts,nsurft) & + ! IN Surface/canopy water capacity + ! of snow-free land tiles (kg/m2). +,catch_snow(land_pts,nsurft) & + ! IN Snow interception capacity of + ! tiles (kg/m2). +,hcon_soilt(land_pts,nsoilt) & + ! IN Soil thermal conductivity + ! (W/m/K). +,snow_surft(land_pts,nsurft) & + ! IN Lying snow on tiles (kg/m2) +,smvccl_soilt(land_pts,nsoilt,sm_levels) & + ! IN Critical volumetric SMC + ! (cubic m per cubic m of soil). +,smvcst_soilt(land_pts,nsoilt,sm_levels) & + ! IN Volumetric saturation point + ! (m3/m3 of soil). +,smvcwt_soilt(land_pts,nsoilt,sm_levels) & + ! IN Volumetric wilting point + ! (cubic m per cubic m of soil). +,sthf_soilt(land_pts,nsoilt,sm_levels) & + ! IN Frozen soil moisture content of + ! each layer as a fraction of + ! saturation. +,sthu_soilt(land_pts,nsoilt,sm_levels) & + ! IN Unfrozen soil moisture content + ! of each layer as a fraction of + ! saturation. +,z0_surft(land_pts,nsurft) & + ! IN Tile roughness lengths (m). +,z0h_surft_bare(land_pts,nsurft) & + ! IN Tile thermal roughness lengths + ! without snow cover(m). +,z0m_soil_in(land_pts) & + ! IN bare soil momentum z0 (m). +,sil_orog_land(land_pts) & + ! IN Silhouette area of unresolved + ! orography per unit horizontal + ! area on land points only. +,ho2r2_orog(land_pts) & + ! IN Standard Deviation of orography. + ! equivilent to peak to trough + ! height of unresolved orography +,flandg(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) + ! IN Land fraction on all tiles. + ! divided by 2SQRT(2) on land + ! points only (m) + +! (f) Atmospheric + any other data not covered so far, incl control. + +REAL(KIND=real_jlslsm), INTENT(IN) :: & + pstar(pdims%i_start:pdims%i_end,pdims%j_start:pdims%j_end) & + ! IN Surface pressure (Pascals). +,lw_down(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! IN Surface downward LW radiation + ! (W/m2). +,sw_surft(land_pts,nsurft) & + ! IN Surface net SW radiation on + ! land tiles (W/m2). +,zh(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! IN Height above surface of top of + ! boundary layer (metres). +,ddmfx(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! IN Convective downdraught + ! mass-flux at cloud base +,co2_mmr & + ! IN CO2 Mass Mixing Ratio +,co2_3d(co2_dim_len,co2_dim_row) & + ! IN 3D CO2 field if required. +,cs_pool_soilt(land_pts,nsoilt,dim_cslayer,dim_cs1) & + ! IN Soil carbon (kg C/m2). +,frac(land_pts,ntype) & + ! IN Fractions of surface types. +,canht_pft(land_pts,npft) & + ! IN Canopy height (m) +,photosynth_act_rad(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! IN Net downward shortwave radiation + ! in band 1 (w/m2). +,lai_pft(land_pts,npft) & + ! IN Leaf area index +,t_soil_soilt(land_pts,nsoilt,sm_levels) & + ! IN Soil temperatures (K). +,tsurf_elev_surft(land_pts,nsurft) & + ! IN Tiled ice sub-surface temperature (K) +,z_land(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! IN Land height (m). +,albsoil_soilt(land_pts,nsoilt) & + ! IN Soil albedo. +, cos_zenith_angle(tdims%i_start:tdims%i_end, & + tdims%j_start:tdims%j_end) & + ! IN Cosine of the zenith angle +,clay_soilt(land_pts,nsoilt,dim_cslayer) & + ! IN Soil clay fraction. +,o3(land_pts) + ! IN Surface ozone concentration (ppb). + +REAL(KIND=real_jlslsm), INTENT(INOUT) :: & +tstar_surft(land_pts,nsurft) + ! IN Surface tile temperatures + +LOGICAL, INTENT(IN) :: & + l_aero_classic & + ! IN switch for using CLASSIC aerosol + ! scheme +,l_dust & + ! IN switch for mineral dust +,l_dust_diag & + ! IN Switch for diagnostic mineral dust + ! lifting +,l_mr_physics & + ! IN Switch for when mixing ratios are used +,l_emis_surft_set(nsurft) + ! IN Switch for varying grey surface emissivity + +!----------------------------------------------------------------------- +! In/outs :- +!----------------------------------------------------------------------- +!Diagnostics +TYPE (strnewsfdiag), INTENT(IN OUT) :: sf_diag + +REAL(KIND=real_jlslsm), INTENT(IN OUT) :: & + emis_surft(land_pts,nsurft) & + ! INOUT Emissivity for land tiles +,gs(land_pts) & + ! INOUT "Stomatal" conductance to + ! evaporation (m/s). +,g_leaf_acc(land_pts,npft) & + ! INOUT Accumulated G_LEAF +,npp_pft_acc(land_pts,npft) & + ! INOUT Accumulated NPP_pft +,resp_w_pft_acc(land_pts,npft) & + ! INOUT Accum RESP_W_pft +,resp_s_acc_soilt(land_pts,nsoilt,dim_cslayer,dim_cs1) & + ! INOUT Accumulated RESP_S +,rhostar(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! INOUT Surface air density +,fqw_1(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! INOUT Moisture flux between layers + ! (kg per square metre per sec). + ! FQW(,1) is total water flux + ! from surface, 'E'. +,ftl_1(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! INOUT FTL(,K) contains net turbulent + ! sensible heat flux into layer K + ! from below; so FTL(,1) is the + ! surface sensible heat, H.(W/m2) +,t1_sd(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! OUT Standard deviation of turbulent + ! fluctuations of layer 1 temp; + ! used in initiating convection. +,q1_sd(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! OUT Standard deviation of turbulent + ! flucs of layer 1 humidity; + ! used in initiating convection. +,vshr(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! OUT Magnitude of surface-to-lowest + ! atm level wind shear (m per s). +,vshr_land(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) + ! OUT Magnitude of surface-to-lowest + ! atm level wind shear (m per s). + +!----------------------------------------------------------------------- +! Outputs :- +!----------------------------------------------------------------------- +!-1 Diagnostic (or effectively so - includes coupled model requisites):- +INTEGER, INTENT(OUT) :: & + surft_index(land_pts,ntype) & + ! OUT Index of tile points +,surft_pts(ntype) ! OUT Number of tile points + +! (a) Calculated anyway (use STASH space from higher level) :- + +REAL(KIND=real_jlslsm), INTENT(OUT) :: & + ftl_surft(land_pts,nsurft) & + ! OUT Surface FTL for land tiles +,u_s_std_surft(land_pts,nsurft) & + ! OUT Surface friction velocity + ! (standard value) + ! for mineral dust +,emis_soil(land_pts) & + ! OUT Emissivity of underlying soil +,rhokm_land(pdims_s%i_start:pdims_s%i_end, & + pdims_s%j_start:pdims_s%j_end), & + cdr10m(pdims_s%i_start:pdims_s%i_end,pdims_s%j_start:pdims_s%j_end) + +! (b) Not passed between lower-level routines (not in workspace at this +! level) :- + +!-2 Genuinely output, needed by other atmospheric routines :- + +REAL(KIND=real_jlslsm), INTENT(OUT) :: & + alpha1(land_pts,nsurft) & + ! OUT Mean gradient of saturated + ! specific humidity with respect + ! to temperature between the + ! bottom model layer and tile + ! surfaces +,ashtf_prime_surft(land_pts,nsurft) & + ! OUT Coefficient to calculate + ! surface heat flux into land + ! tiles. +,fqw_surft(land_pts,nsurft) & + ! OUT Surface FQW for land tiles +,epot_surft(land_pts,nsurft) & + ! OUT Local EPOT for land tiles. +,fraca(land_pts,nsurft) & + ! OUT Fraction of surface moisture + ! flux with only aerodynamic + ! resistance for snow-free land + ! tiles. +,resfs(land_pts,nsurft) & + ! OUT Combined soil, stomatal + ! and aerodynamic resistance + ! factor for fraction (1-FRACA) + ! of snow-free land tiles. +,resft(land_pts,nsurft) & + ! OUT Total resistance factor. + ! FRACA+(1-FRACA)*RESFS for + ! snow-free land, 1 for snow. +,rhokh_surft(land_pts,nsurft) & + ! OUT Surface exchange coefficients + ! for land tiles +,dtstar_surft(land_pts,nsurft) & + ! OUT Change in TSTAR over timestep + ! for land tiles +,z0h_surft(land_pts,nsurft) & + ! OUT Tile roughness lengths for heat + ! and moisture (m). +,z0m_surft(land_pts,nsurft) & + ! OUT Tile roughness lengths for + ! momentum. +,chr1p5m(land_pts,nsurft) & + ! OUT Ratio of coefffs for + ! calculation of 1.5m temp for + ! land tiles. +,smc_soilt(land_pts,nsoilt) & + ! OUT Available moisture in the + ! soil profile (mm). +,hcons_soilt(land_pts,nsoilt) & + ! OUT Soil thermal conductivity + ! including water and ice +,gpp(land_pts) & + ! OUT Gross primary productivity + ! (kg C/m2/s). +,npp(land_pts) & + ! OUT Net primary productivity + ! (kg C/m2/s). +,resp_p(land_pts) & + ! OUT Plant respiration (kg C/m2/s). +,g_leaf(land_pts,npft) & + ! OUT Leaf turnover rate (/360days). +,gpp_pft(land_pts,npft) & + ! OUT Gross primary productivity + ! on PFTs (kg C/m2/s). +,npp_pft(land_pts,npft) & + ! OUT Net primary productivity + ! (kg C/m2/s). +,resp_p_pft(land_pts,npft) & + ! OUT Plant respiration on PFTs + ! (kg C/m2/s). +,resp_s_soilt(land_pts,nsoilt,dim_cslayer,dim_cs1) & + ! OUT Soil respiration (kg C/m2/s). +,resp_s_tot_soilt(land_pts,nsoilt) & + ! OUT Total soil respiration + ! (kg C/m2/s). +,resp_l_pft(land_pts,npft) & + ! OUT Leaf maintenance respiration + ! (kg C/m2/s). +,resp_r_pft(land_pts,npft) & + ! OUT Root maintenance respiration + ! (kg C/m2/s). +,resp_w_pft(land_pts,npft) & + ! OUT Wood maintenance respiration + ! (kg C/m2/s). +,n_leaf(land_pts,npft) & + ! OUT Leaf N content scaled by LAI + ! (kg N/m2). +,n_root(land_pts,npft) & + ! OUT Root N content scaled by LAI_bal + ! (kg N/m2). +,n_stem(land_pts,npft) & + ! OUT Stem N content scaled by LAI_bal + ! (kg N/m2). +,lai_bal(land_pts,npft) & + ! OUT LAI_bal +,gc_surft(land_pts,nsurft) & + ! OUT "Stomatal" conductance to + ! evaporation for land tiles + ! (m/s). +,canhc_surft(land_pts,nsurft) & + ! OUT Areal heat capacity of canopy + ! for land tiles (J/K/m2). +,wt_ext_surft(land_pts,sm_levels,nsurft) & + ! OUT Fraction of evapotranspiration + ! which is extracted from each + ! soil layer by each tile. +,flake(land_pts,nsurft) & + ! OUT Lake fraction. +,tile_frac(land_pts,nsurft) & + ! OUT Tile fractions including + ! snow cover in the ice tile. +,fsmc_pft(land_pts,npft) & + ! OUT Moisture availability factor. +,gc_corr(land_pts,npft) + ! OUT "Stomatal" conductance + ! without bare soil evaporation + +REAL(KIND=real_jlslsm), INTENT(OUT) :: & + cd_land(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! OUT Bulk transfer coefficient for + ! momentum over land. +,rib_surft(land_pts,nsurft) & + ! OUT RIB for land tiles. +,ch_surft_classic(land_pts,nsurft) & + ! OUT Bulk transfer coefficient for + ! heat for aerosol deposition. +,cd_std_classic(land_pts,nsurft) + ! OUT Bulk transfer coefficient for + ! momentum for aerosol deposition. +LOGICAL, INTENT(OUT) :: & + l_cdr10m_snow + ! OUT Flag indicating if cdr10m + ! (an interpolation coefficient) is + ! to be calculated for use with + ! snow unloading. + +!New arguments replacing USE statements +!urban_param +REAL(KIND=real_jlslsm), INTENT(IN) :: emisr_gb(land_pts) +REAL(KIND=real_jlslsm), INTENT(IN) :: emisw_gb(land_pts) +REAL(KIND=real_jlslsm), INTENT(IN) :: hwr_gb(land_pts) +REAL(KIND=real_jlslsm), INTENT(IN) :: wrr_gb(land_pts) + +!jules_mod +REAL(KIND=real_jlslsm), INTENT(IN OUT) :: & + albobs_scaling_surft(land_pts,ntype,rad_nband) + +!p_s_parms (IN) +REAL(KIND=real_jlslsm), INTENT(IN) :: bexp_soilt(land_pts,nsoilt,sm_levels) +REAL(KIND=real_jlslsm), INTENT(IN) :: sathh_soilt(land_pts,nsoilt,sm_levels) +REAL(KIND=real_jlslsm), INTENT(IN) :: v_close_pft(land_pts,sm_levels,npft) +REAL(KIND=real_jlslsm), INTENT(IN) :: v_open_pft(land_pts,sm_levels,npft) + +!crop_vars_mod (IN) +REAL(KIND=real_jlslsm), INTENT(IN) :: rootc_cpft(land_pts,ncpft) +REAL(KIND=real_jlslsm), INTENT(IN) :: sthu_irr_soilt(land_pts,nsoilt,sm_levels) +REAL(KIND=real_jlslsm), INTENT(IN) :: frac_irr_soilt(land_pts,nsoilt) +REAL(KIND=real_jlslsm), INTENT(IN) :: frac_irr_surft(land_pts,nsurft) +REAL(KIND=real_jlslsm), INTENT(IN) :: dvi_cpft(land_pts,ncpft) +REAL(KIND=real_jlslsm), INTENT(IN OUT) :: resfs_irr_surft(land_pts,nsurft) + +!Fluxes (IN OUT) +REAL(KIND=real_jlslsm), INTENT(IN OUT) :: anthrop_heat_surft(land_pts,nsurft) + +!Fluxes +REAL(KIND=real_jlslsm), INTENT(IN) :: t_home_gb(land_pts) +REAL(KIND=real_jlslsm), INTENT(IN) :: t_growth_gb(land_pts) + +!veg_state +TYPE(veg_state_type), INTENT(IN OUT) :: veg_state + +!jules_chemvars_mod +REAL(KIND=real_jlslsm), INTENT(OUT) :: isoprene_gb(land_pts) +REAL(KIND=real_jlslsm), INTENT(OUT) :: terpene_gb(land_pts) +REAL(KIND=real_jlslsm), INTENT(OUT) :: methanol_gb(land_pts) +REAL(KIND=real_jlslsm), INTENT(OUT) :: acetone_gb(land_pts) +REAL(KIND=real_jlslsm), INTENT(OUT) :: isoprene_pft(land_pts,npft) +REAL(KIND=real_jlslsm), INTENT(OUT) :: terpene_pft(land_pts,npft) +REAL(KIND=real_jlslsm), INTENT(OUT) :: methanol_pft(land_pts,npft) +REAL(KIND=real_jlslsm), INTENT(OUT) :: acetone_pft(land_pts,npft) + +!trif_vars_mod +REAL(KIND=real_jlslsm), INTENT(OUT) :: fapar_diag_pft(land_pts,npft) +REAL(KIND=real_jlslsm), INTENT(OUT) :: apar_diag_pft(land_pts,npft) +REAL(KIND=real_jlslsm), INTENT(OUT) :: apar_diag_gb(land_pts) +REAL(KIND=real_jlslsm), INTENT(OUT) :: gpp_gb_acc(land_pts) +REAL(KIND=real_jlslsm), INTENT(OUT) :: gpp_pft_acc(land_pts,npft) + +!crop_vars_mod (OUT) +REAL(KIND=real_jlslsm), INTENT(OUT) :: gs_irr_surft(land_pts,nsurft) +REAL(KIND=real_jlslsm), INTENT(OUT) :: smc_irr_soilt(land_pts,nsoilt) +REAL(KIND=real_jlslsm), INTENT(OUT) :: & + wt_ext_irr_surft(land_pts,sm_levels,nsurft) +REAL(KIND=real_jlslsm), INTENT(OUT) :: gc_irr_surft(land_pts,nsurft) + +!prognostics (IN) +INTEGER, INTENT(IN) :: nsnow_surft(land_pts,nsurft) +REAL(KIND=real_jlslsm), INTENT(IN) :: sice_surft(land_pts,nsurft,nsmax), & + sliq_surft(land_pts,nsurft,nsmax), & + snowdepth_surft(land_pts,nsurft), & + tsnow_surft(land_pts,nsurft,nsmax), & + ds_surft(land_pts,nsurft,nsmax) + +!c_elevate (OUT) +REAL(KIND=real_jlslsm), INTENT(OUT) :: surf_hgt_surft(land_pts,nsurft), & + lw_down_elevcorr_surft(land_pts,nsurft) + +!jules_mod (OUT) +REAL(KIND=real_jlslsm), INTENT(OUT) :: snowdep_surft(land_pts,nsurft) + +!urban_param (IN) +REAL(KIND=real_jlslsm), INTENT(IN) :: hgt_gb(land_pts), & + disp_gb(land_pts) + +!lake_mod (IN) +REAL(KIND=real_jlslsm), INTENT(IN) :: lake_t_ice_gb(land_pts), & + lake_t_mxl_gb(land_pts), & + lake_h_ice_gb(land_pts), & + lake_depth_gb(land_pts), & + g_dt_gb(land_pts), & + non_lake_frac(land_pts) +REAL(KIND=real_jlslsm), INTENT(OUT) :: ts1_lake_gb(land_pts), & + nusselt_gb(land_pts), & + hcon_lake(land_pts) + +!ancil_info (IN) +LOGICAL, INTENT(IN) :: l_lice_point(land_pts) +LOGICAL, INTENT(IN) :: l_soil_point(land_pts) + +!JULES surface_types_mod (IN) +REAL(KIND=real_jlslsm), INTENT(IN) :: diff_frac(t_i_length * t_j_length) + +!chemvars (OUT) +REAL(KIND=real_jlslsm), INTENT(OUT) :: flux_o3_pft(land_pts,npft) +REAL(KIND=real_jlslsm), INTENT(OUT) :: fo3_pft(land_pts,npft) + + +!----------------------------------------------------------------------- +! LOCAL variables +!----------------------------------------------------------------------- +! Workspace :- +REAL(KIND=real_jlslsm) :: work_clay ! working variable + +REAL(KIND=real_jlslsm) :: & + vfrac_surft(land_pts,nsurft) & + ! Fractional canopy coverage for + ! land tiles. +,radnet_surft(land_pts,nsurft) & + ! Surface net radiation on tiles +,csnow(land_pts,nsmax) & + ! Areal heat capacity of snow (J/K/m2) +,ksnow(land_pts,nsmax) & + ! Thermal conductivity of snow (W/m/K) +,hcons_snow(land_pts,nsurft) & + ! Snow thermal conductivity +,resp_frac(land_pts,dim_cslayer) & + ! respired fraction of RESP_S +,gc_stom_surft(land_pts,nsurft) + ! canopy conductance + +REAL(KIND=real_jlslsm) :: & + lh0 ! Latent heat for snow free surface + ! =LS for sea-ice, =LC otherwise + + +! Workspace for sea-ice and marginal ice zone +REAL(KIND=real_jlslsm) :: & + ch_land(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) + ! Bulk transfer coefficient for + ! het and moisture over land. + +! Workspace for land tiles +REAL(KIND=real_jlslsm) :: & + cd_std(land_pts,nsurft) & + ! Local drag coefficient for calc + ! of interpolation coefficient +,cd_surft(land_pts,nsurft) & + ! Drag coefficient +,ch_surft(land_pts,nsurft) & + ! Transfer coefficient for heat and + ! moisture +,chn(land_pts,nsurft) & + ! Neutral value of CH. +,dq(land_pts) & + ! Sp humidity difference between + ! surface and lowest atmospheric lev +,epdt(land_pts) & + ! "Potential" Evaporation * Timestep +,pstar_land(land_pts) & + ! Surface pressure for land points. +,qstar_surft(land_pts,nsurft) & + !Surface saturated sp humidity. +,rhokh_can(land_pts,nsurft) & + ! Exchange coefficient for canopy + ! air to surface +,rhokm_1_surft(land_pts,nsurft) & + ! Momentum exchange coefficient. +,tsurf(land_pts,nsurft) & + ! Surface layer temp (snow or soil) ( +,lake_ice_mid_temp(land_pts) & + ! Median temperature of the lake ice (K) +,dzsurf(land_pts,nsurft) & + ! Surface layer thickness + ! (snow or soil) (m) +,canhc_surf(land_pts,nsurft) & + ! Surface layer thickness + ! (snow or soil) (m) +,hcons_surf(land_pts,nsurft) & + ! Thermal conductivity + ! (snow or soil) (W/m/K) +,wind_profile_factor(land_pts,nsurft) & + ! For transforming effective surface + ! transfer coefficients to those + ! excluding form drag. +,z0m_eff_surft(land_pts,nsurft) & + ! Effective momentum roughness length +,db_surft(land_pts,nsurft) & + ! Buoyancy difference for surface + ! tile +,v_s_surft(land_pts,nsurft) & + ! Surface layer scaling velocity + ! for tiles (m/s). +,v_s_std(land_pts,nsurft) & + ! Surface layer scaling velocity + ! for tiles excluding orographic + ! form drag (m/s). +,u_s_iter_surft(land_pts,nsurft) & + ! Scaling velocity from middle of + ! MO scheme - picked up in error by + ! dust code! +,recip_l_mo_surft(land_pts,nsurft) & + ! Reciprocal of the Monin-Obukhov + ! length for tiles (m^-1). +,z0m_soil(land_pts,nsurft) & + ! Bare soil momentum roughness length + ! for use in 1 tile dust scheme +,z0h_soil(land_pts,nsurft) & + ! Bare soil roughness length for heat + ! for use in 1 tile dust scheme +,wind_profile_fac_soil(land_pts,nsurft) & + ! Equivalent of wind_profile_factor + ! for use in 1 tile dust scheme +,cd_surft_soil(land_pts,nsurft), ch_surft_soil(land_pts,nsurft) & +,cd_std_soil(land_pts,nsurft), v_s_surft_soil(land_pts,nsurft) & +,recip_l_mo_surft_soil(land_pts,nsurft) & + ! Dummy output variables from extra + ! call to fcdch needed for + ! 1 tile dust scheme +,v_s_std_soil(land_pts,nsurft) & + ! Bare soil surface layer scaling + ! velocity for tiles excluding + ! orographic form drag (m/s) + ! for use in 1 tile dust scheme +,u_s_iter_soil(land_pts,nsurft) & + ! Bare soil scaling velocity from + ! middle of MO scheme for use in + ! 1 tile dust scheme - picked up in + ! error by dust code +,z0h_surft_classic(land_pts,nsurft) & + ! z0h to be used in calculation for + ! CLASSIC aerosol deposition +,cd_surft_classic(land_pts,nsurft) & +,v_s_surft_classic(land_pts,nsurft) & +,recip_l_mo_surft_classic(land_pts,nsurft) & +,v_s_std_classic(land_pts,nsurft) & +,u_s_iter_classic(land_pts,nsurft) & + ! Dummy output variables from extra + ! call to fcdch needed for aerosol + ! deposition with different z0h +,t_elev(land_pts,nsurft) & + ! Temperature at elevated height (k) +,q_elev(land_pts,nsurft) & + ! Specific humidity at elevated + ! height (kg per kg air) +,qs1_elev(land_pts,nsurft) & + ! Saturated specific humidity at elev + ! height (kg per kg air) +,scaling_urban(land_pts,nsurft) & + ! MORUSES: ground heat flux scaling; + ! canyon tile only coupled to soil +,zdt_surft(land_pts,nsurft) & + ! Difference between the canopy height and + ! displacement height (m) +,phi_m(land_pts) & + ! Monin-Obukhov stability function for momentum + ! integrated to the model's lowest wind level. +,phi_h(land_pts) & + ! Monin-Obukhov stability function for scalars + ! integrated to the model's lowest temperature + ! and humidity level. +,rhostar_mom(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! Surface air density for momentum +,ashtf_surft(land_pts,nsurft) & + ! Coefficient to calculate surface + ! heat flux into soil (W/m2/K). +,lw_down_surftsum(land_pts) & + ! Gridbox sum of elevation corrections to + ! downward longwave radiation +,lw_down_surftabs(land_pts) + ! Gridbox sum of absolution changes to downward + ! longwave radiation from elevation corrections + +! dummy arrays required for sea and se-ice to create universal +! routines for all surfaces +REAL(KIND=real_jlslsm) :: & + array_zero(t_i_length * t_j_length) & + ! Array of zeros +,zdt_dummy(t_i_length * t_j_length) + ! Dummy array for zdt + +!Gridbox mean values calculated from soil tiled versions for FLAKE +REAL(KIND=real_jlslsm) :: & + hcons_mean_soil(land_pts), & + tsoil_mean_soil(land_pts) + + +! Local scalars :- + +INTEGER :: & + i,j & + ! Loop counter (horizontal field index). +,k & + ! Loop counter (tile field index). +,l & + ! Loop counter (land point field index). +,n & + ! Loop counter (tile index). +,nn & + ! Loop counter (soil carbon layers) +,m & + ! Index for soil tile +,n_veg + ! Actual or dummy pointer to array + ! defined only on PFTs + +REAL(KIND=real_jlslsm) :: & + ds_ratio & + ! 2 * snowdepth / depth of top soil layer. +,d_t & + ! Temporary in calculation of alpha1. +,zetam & + ! Temporary in calculation of CHN. +,zetah & + ! Temporary in calculation of CHN. +,zeta1 & + ! Work space +,z0 & + ! yet more workspace + + ! Temporary variables for adjustment of downwelling + ! logwave to elevation tiles and correction back to + ! conserve gridbox mean +,t_rad + +LOGICAL :: & + l_vegdrag_active_here & + ! Logical to indicate whether the vegetative drag scheme + ! is active on the current surface tile in cases where + ! l_vegdrag_surft itself may not be applicable +,l_shallow_lake_depth(land_pts) + ! Logical to indicate unsuitable shallow lake depth + +REAL(KIND=real_jlslsm) :: sea_point + +INTEGER :: n_diag + +INTEGER :: errcode +CHARACTER(LEN=errormessagelength) :: cmessage + +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='CABLE_LAND_SF_EXPLICIT' + +!CABLE_LSM:CM2 +!CABLE TYPES containing field data (IN OUT) +TYPE(progs_cbl_vars_type), INTENT(IN OUT) :: progs_cbl +TYPE(work_vars_type), INTENT(IN OUT) :: work_cbl +TYPE(params_io_data_type), INTENT(IN OUT) :: pars_io_cbl +TYPE(progs_cnp_vars_type), INTENT(IN OUT) :: progs_cnp + +INTEGER :: mype, timestep_number +REAL :: satcon_soilt(land_pts, sm_levels) !0:sm_levels +REAL :: latitude(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) +REAL :: longitude(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) +REAL :: u_s(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) +REAL :: ls_rain(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) +REAL :: ls_snow(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) + + +logical, save :: first_call = .true. +!CABLE_LSM: End + +!CM3#55 As of 6/12/2023 no attempt is being made to tidy up the workspace + + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +!CABLE_LSM:initia;lize intent(OUT) - HOWEVER, most of these won't even be req^d in cable_land_expl AND others will get a value from +!CABLE + +IF( first_call ) THEN + dtstar_surft(:,:) = 0.0 + resp_l_pft(:,:) = 0.0 + resp_r_pft(:,:) = 0.0 + resp_w_pft(:,:) = 0.0 + n_leaf(:,:) = 0.0 + n_root(:,:) = 0.0 + n_stem(:,:) = 0.0 + lai_bal(:,:) = 0.0 + wt_ext_surft(:,:,:) = 0.0 + tile_frac(:,:) = 0.0 + fsmc_pft(:,:) = 0.0 + gc_corr(:,:) = 0.0 + isoprene_gb(:) = 0.0 + terpene_gb(:) = 0.0 + methanol_gb(:) = 0.0 + acetone_gb(:) = 0.0 + isoprene_pft(:,:) = 0.0 + terpene_pft(:,:) = 0.0 + methanol_pft(:,:) = 0.0 + acetone_pft(:,:) = 0.0 + fapar_diag_pft(:,:) = 0.0 + apar_diag_pft(:,:) = 0.0 + apar_diag_gb(:) = 0.0 + gpp_gb_acc(:) = 0.0 + gpp_pft_acc(:,:) = 0.0 + gs_irr_surft(:,:) = 0.0 + smc_irr_soilt(:,:) = 0.0 + wt_ext_irr_surft(:,:,:) = 0.0 + gc_irr_surft(:,:) = 0.0 + flux_o3_pft(:,:) = 0.0 + fo3_pft(:,:) = 0.0 + gpp(:) = 0.0 + npp(:) = 0.0 + smc_soilt(:,:) = 0.0 + gpp_pft(:,:) = 0.0 + resp_p(:) = 0.0 + g_leaf(:,:) = 0.0 + first_call = .FALSE. +END IF + +!----------------------------------------------------------------------- +! 0. Initialisations +!----------------------------------------------------------------------- + +!$OMP PARALLEL DEFAULT(NONE) PRIVATE(i, j, l, n) & +!$OMP SHARED(t_i_length, t_j_length, array_zero, tdims, rhokm_land, cd_land, & +!$OMP ch_land, zdt_dummy, land_pts, lake_ice_mid_temp, l_shallow_lake_depth, & +!$OMP zdt_surft, db_surft, rhokh_can, nsurft,ftl_surft,fqw_surft, & +!$OMP rib_surft,z0m_surft,u_s_std_surft,chr1p5m,resfs,alpha1,radnet_surft, & +!$OMP scaling_urban,snowdep_surft,snowdepth_surft,sf_diag) +!$OMP DO SCHEDULE(STATIC) +DO i = 1,t_i_length * t_j_length + array_zero(i) = 0.0 + zdt_dummy(i) = 0.0 +END DO +!$OMP END DO NOWAIT + +!$OMP DO SCHEDULE(STATIC) +DO j = tdims%j_start,tdims%j_end + DO i = tdims%i_start,tdims%i_end + rhokm_land(i,j) = 0.0 + cd_land(i,j) = 0.0 + ch_land(i,j) = 0.0 + END DO +END DO +!$OMP END DO NOWAIT + +!$OMP DO SCHEDULE(STATIC) +DO l = 1,land_pts + lake_ice_mid_temp(l) = 0.0 + l_shallow_lake_depth(l) = .FALSE. +END DO +!$OMP END DO NOWAIT + +!----------------------------------------------------------------------- +! 1. Initialise FTL_SURFT and RIB_SURFT on all tiles at all points, +! to allow STASH to process these as diagnostics. +!----------------------------------------------------------------------- +DO n = 1,nsurft +!$OMP DO SCHEDULE(STATIC) + DO l = 1,land_pts + ! MORUSES Initialise urban roughness array + ftl_surft(l,n) = 0.0 + fqw_surft(l,n) = 0.0 + rib_surft(l,n) = 0.0 + z0m_surft(l,n) = 0.0 !jh:can't 0 this AND cancel roughness + u_s_std_surft(l,n) = 0.0 + chr1p5m(l,n) = 0.0 + resfs(l,n) = 0.0 + alpha1(l,n) = 0.0 + !CN2ish!radnet_surft(l,n) = 0.0 + scaling_urban(l,n) = 1.0 + zdt_surft(l,n) = 0.0 + db_surft(l,n) = 0.0 + rhokh_can(l,n) = 0.0 + ! Equivalent snowdepth for surface calculations. + snowdep_surft(l,n) = snowdepth_surft(l,n) + + IF (sf_diag%l_et_stom .OR. sf_diag%l_et_stom_surft) THEN + sf_diag%resfs_stom(l,n) = 0.0 + END IF + END DO +!$OMP END DO NOWAIT +END DO +IF (sf_diag%l_tau_surft) THEN + DO n = 1,nsurft +!$OMP DO SCHEDULE(STATIC) + DO l = 1,land_pts + sf_diag%tau_surft(l,n) = 0.0 + END DO +!$OMP END DO NOWAIT + END DO +END IF +!$OMP END PARALLEL + +!----------------------------------------------------------------------- +! Call TILEPTS to calculate surft_pts and surft_index for surface types +!----------------------------------------------------------------------- +CALL tilepts(land_pts, frac, surft_pts, surft_index, l_lice_point) + +!CABLE_LSM: following CM2 - dodge OMP here +DO n = 1,nsurft + DO l = 1,land_pts + canhc_surft(l,n) = 0.0 + vfrac_surft(l,n) = 0.0 + IF( frac(l,n) == 0.0 ) THEN + cd_surft(l,n) = 0.0 + ch_surft(l,n) = 0.0 + z0h_surft(l,n) = 0.0 + z0m_eff_surft(l,n) = 0.0 + !not In 7.1!rhokpm(l,n) = 0.0 !doesnt go anywhere + radnet_surft(l,n) = 0.0 + fraca(l,n) = 0.0 + resfs(l,n) = 0.0 + resft(l,n) = 0.0 + END IF + END DO +END DO +!CABLE_LSM: End + +!CM3#55-1 +!!----------------------------------------------------------------------- +!! Generate the anthropogenic heat for surface calculations +!!----------------------------------------------------------------------- +!IF ( l_anthrop_heat_src .AND. .NOT. l_aggregate ) THEN +! CALL generate_anthropogenic_heat( curr_day_number, land_pts, frac, & +! surft_pts, surft_index, & +! !New arguments replacing USE statements +! !urban_param (IN) +! wrr_gb, & +! !Fluxes (IN OUT) +! anthrop_heat_surft) +!END IF + +!CABLE_LSM:CM2! Even if this is left in, crashes immediately in call to alb_pft.. +!CM2! Even if this is left in, crashes immediately in call to alb_pft.. +!CM2!!----------------------------------------------------------------------- +!CM2!! Call physiology routine to calculate surface conductances and carbon +!CM2!! fluxes. +!CM2!!----------------------------------------------------------------------- +!CM2!CALL physiol ( & +!CM2! land_pts,land_index, & +!CM2! sm_levels,nsurft,surft_pts,surft_index, & +!CM2! dim_cs1, & +!CM2! co2_mmr,co2_3d,co2_dim_len, co2_dim_row,l_co2_interactive, & +!CM2! can_model,cs_pool_soilt,veg_state,frac,canht_pft,photosynth_act_rad, & +!CM2! lai_pft,pstar,qw_1,sthu_soilt,sthf_soilt,t_soil_soilt,tstar_surft, & +!CM2! smvccl_soilt,smvcst_soilt,smvcwt_soilt,vshr,z0_surft,z1_uv,o3, & +!CM2! canhc_surft,vfrac_surft,emis_surft,l_emis_surft_set,emis_soil,flake, & +!CM2! g_leaf,gs,gc_surft,gc_stom_surft,gc_corr,gpp,gpp_pft,npp,npp_pft, & +!CM2! resp_p,resp_p_pft,resp_s_soilt,resp_l_pft, & +!CM2! resp_r_pft,resp_w_pft,n_leaf, & +!CM2! n_root,n_stem,lai_bal, & +!CM2! smc_soilt,wt_ext_surft,fsmc_pft, & +!CM2! albsoil_soilt,cos_zenith_angle, & +!CM2! can_rad_mod,ilayers,flux_o3_pft,fo3_pft,sf_diag,asteps_since_triffid, & +!CM2! non_lake_frac, & +!CM2! !New arguments replacing USE statements +!CM2! !Fluxes (IN) +!CM2! t_home_gb,t_growth_gb, & +!CM2! !urban_param (IN) +!CM2! emisr_gb, emisw_gb, hwr_gb, & +!CM2! !jules_mod (IN OUT) +!CM2! albobs_scaling_surft, & +!CM2! !jules_chemvars_mod (OUT) +!CM2! isoprene_gb, isoprene_pft, terpene_gb , terpene_pft, & +!CM2! methanol_gb, methanol_pft, acetone_gb, acetone_pft, & +!CM2! !trif_vars_mod (OUT) +!CM2! fapar_diag_pft, apar_diag_pft, apar_diag_gb, gpp_gb_acc, gpp_pft_acc, & +!CM2! !crop_vars_mod (IN) +!CM2! rootc_cpft, sthu_irr_soilt, frac_irr_soilt, frac_irr_surft, dvi_cpft, & +!CM2! !crop_vars_mod (OUT) +!CM2! gs_irr_surft, smc_irr_soilt, wt_ext_irr_surft, gc_irr_surft, & +!CM2! !p_s_parms (IN) +!CM2! bexp_soilt, sathh_soilt, v_close_pft, v_open_pft, & +!CM2! !ancil_info +!CM2! l_soil_point, & +!CM2! !jules_surface_types (IN) +!CM2! diff_frac) + +!CM3#55-2 +!! Update gc_surft for canopy snow if using the canopy snow scheme +!IF ( .NOT. l_aggregate .AND. can_model == 4) THEN +! DO n = 1,npft +! IF ( cansnowtile(n) ) THEN +!!$OMP PARALLEL DO IF(surft_pts(n) > 1) DEFAULT(NONE) PRIVATE(i, j, k, l) & +!!$OMP SHARED(surft_pts, surft_index, land_index, t_i_length, & +!!$OMP snow_surft, gc_surft, catch_snow, tstar_surft, & +!!$OMP vshr_land, n) SCHEDULE(STATIC) +! DO k = 1,surft_pts(n) +! l = surft_index(k,n) +! IF (snow_surft(l,n) > 0.0) THEN +! j = (land_index(l) - 1) / t_i_length + 1 +! i = land_index(l) - (j-1) * t_i_length +! gc_surft(l,n) = 0.06 * snow_surft(l,n)**0.6 * catch_snow(l,n)**0.4 & +! * 2.06e-5 * (tm / tstar_surft(l,n))**1.75 & +! * (1.79+3 * SQRT(vshr_land(i,j))) & +! / (2 * rho_ice * 5.0e-4**2) +! END IF +! END DO +!!$OMP END PARALLEL DO +! END IF +! END DO +!END IF + +!CM3#55-3 - note that at some point CASA variables need to make their way +! into these TRIFFID vars for output purposes +!!---------------------------------------------------------------------- +!! If TRIFFID is being used apply any correction to the land-atmosphere +!! fluxes on the first timestep after the last TRIFFID call. Such a +!! correction will typically be associated with a total depletion of +!! carbon or with maintanence of the seed fraction. The corrections +!! are stored in the accumulation variables after the call to TRIFFID. +!! The correction is added to the instantaneous land-atmosphere fluxes +!! (so that the atmospheric carbon budget is corrected) but is not +!! included in the accumulation variables which drive TRIFFID, since +!! this has already been dealt with during the last TRIFFID call. +!!---------------------------------------------------------------------- +!IF (l_triffid .AND. (asteps_since_triffid == 1) & +! .AND. ( cycleno == numcycles .OR. l_quick_ap2) ) THEN +!!jhan +! DO n = 1,nnpft +!!$OMP PARALLEL DO SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(l) & +!!$OMP SHARED(land_pts, npp_pft, npp_pft_acc, timestep, resp_p_pft, n) +! DO l = 1,land_pts +! npp_pft(l,n) = npp_pft(l,n) + npp_pft_acc(l,n) / timestep +! resp_p_pft(l,n) = resp_p_pft(l,n) - npp_pft_acc(l,n) / timestep +! npp_pft_acc(l,n)=-npp_pft_acc(l,n) +! END DO +!!$OMP END PARALLEL DO +! END DO +! +! ! Here we have assumed that RothC must be used with TRIFFID, and is called +! ! on the same timestep. +! IF ( soil_bgc_model == soil_model_rothc ) THEN +! DO n = 1,dim_cs1 +! DO nn = 1,dim_cslayer +!!$OMP PARALLEL DO SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(l) & +!!$OMP SHARED(land_pts, resp_s_soilt, resp_s_acc_soilt, timestep, n, nn) +! DO l = 1,land_pts +! !soil tiling is not compatible with triffid. OK to hard-code soil +! !tile index to 1 here +! resp_s_soilt(l,1,nn,n) = resp_s_soilt(l,1,nn,n) & +! + (resp_s_acc_soilt(l,1,nn,n) / timestep) +! resp_s_acc_soilt(l,1,nn,n) = -resp_s_acc_soilt(l,1,nn,n) +! END DO +!!$OMP END PARALLEL DO +! END DO +! END DO +! END IF +! +!END IF + +!CM3#55-4 - note that at some point we need to ensure that CABLE values +! into these JULES vars for output purposes +!!---------------------------------------------------------------------- +!! Increment accumulation of leaf turnover rate. +!! This is required for leaf phenology and/or TRIFFID, either of +!! which can be enabled independently of the other. +!!---------------------------------------------------------------------- +!IF ( cycleno == numcycles .OR. l_quick_ap2 ) THEN +! +! IF (l_phenol .AND. .NOT. l_triffid) THEN +! DO n = 1,nnpft +!!$OMP PARALLEL DO SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(l) & +!!$OMP SHARED(n, land_pts, g_leaf_acc, g_leaf, timestep) +! DO l = 1,land_pts +! g_leaf_acc(l,n) = g_leaf_acc(l,n) + & +! g_leaf(l,n) * ( timestep / secs_per_360days ) +! END DO +!!$OMP END PARALLEL DO +! END DO +! END IF + +!!jhan +! !---------------------------------------------------------------------- +! ! Increment accumulation prognostics for TRIFFID +! !---------------------------------------------------------------------- +! IF (l_triffid) THEN +! DO n = 1,nnpft +!!$OMP PARALLEL DO SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(l) & +!!$OMP SHARED(n, land_pts, g_leaf_acc, g_leaf, timestep, & +!!$OMP npp_pft_acc, npp_pft, resp_w_pft_acc, resp_w_pft) +! DO l = 1,land_pts +! g_leaf_acc(l,n) = g_leaf_acc(l,n) + & +! g_leaf(l,n) * ( timestep / secs_per_360days ) +! npp_pft_acc(l,n) = npp_pft_acc(l,n) + npp_pft(l,n) * timestep +! resp_w_pft_acc(l,n) = resp_w_pft_acc(l,n) & +! + resp_w_pft(l,n) * timestep +! END DO +!!$OMP END PARALLEL DO +! END DO +! END IF +! +!IF ( soil_bgc_model == soil_model_rothc ) THEN +! DO n = 1,dim_cs1 +! DO nn = 1,dim_cslayer +!!$OMP PARALLEL DO SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(l) & +!!$OMP SHARED(n, nn, land_pts,resp_s_soilt, resp_s_acc_soilt, timestep) +! DO l = 1,land_pts +! !soil tiling is not compatible with triffid. OK to hard-code soil +! !tile index to 1 here +! ! calculated before resp_frac applied +! resp_s_acc_soilt(l,1,nn,n) = resp_s_acc_soilt(l,1,nn,n) & +! + resp_s_soilt(l,1,nn,n) * timestep +! END DO +!!$OMP END PARALLEL DO +! END DO +! END DO +! END IF +! +!END IF ! CycleNo == NumCycles + +!CM3#55-5 +!!----------------------------------------------------------------------- +!! calculate CO2:(BIO+HUM) ratio, dependent on soil clay content, and +!! sum soil respiration components +!! (RESP_FRAC here then contains the fraction of soil respiration which +!! is respired to the atmos. the rest is re-partitioned into BIO+HUM) +! +!! resp_s_acc_soilt contains the full amount, and this is carried forward to +!! VEG_CTL for use in updating soil carbon pools. RESP_S_TOT calculated +!! here is passed to BL_TRMIX as the fraction which is respired as CO2 +!! to the atmosphere. RESP_S_TOT, and RESP_S are also passed out for +!! storage in diagnostics 3293, and 3467-470. +! +!!----------------------------------------------------------------------- +!IF ( soil_bgc_model == soil_model_rothc ) THEN +! DO j = 1, nsoilt +! DO i = 1, land_pts +! resp_s_tot_soilt(i,j)=0.0 +! END DO +! END DO +! !soil tiling is not compatible with triffid. OK to hard-code soil tile +! !index to 1 here by setting m = 1 +! m = 1 +! DO nn = 1,dim_cslayer +! DO i = 1,land_pts +! work_clay = EXP(-0.0786 * 100.0 * clay_soilt(i,m,nn)) +! resp_frac(i,nn) = (3.0895+2.672 * work_clay) / & +! (4.0895+2.672 * work_clay) +! resp_s_soilt(i,m,nn,1) = resp_s_soilt(i,m,nn,1) * resp_frac(i,nn) +! resp_s_soilt(i,m,nn,2) = resp_s_soilt(i,m,nn,2) * resp_frac(i,nn) +! resp_s_soilt(i,m,nn,3) = resp_s_soilt(i,m,nn,3) * resp_frac(i,nn) +! resp_s_soilt(i,m,nn,4) = resp_s_soilt(i,m,nn,4) * resp_frac(i,nn) +! resp_s_tot_soilt(i,m) = resp_s_tot_soilt(i,m) & +! + resp_s_soilt(i,m,nn,1) & +! + resp_s_soilt(i,m,nn,2) & +! + resp_s_soilt(i,m,nn,3) & +! + resp_s_soilt(i,m,nn,4) +! END DO ! layers +! END DO ! points +!END IF + +!CM3#55-6 - CABLE always runs with tiles +!!----------------------------------------------------------------------- +!! Reset surft_pts and surft_index and set tile fractions to 1 if aggregate +!! tiles are used (L_AGGREGATE=.T.). +!! Otherwise, set tile fractions to surface type fractions. +!!----------------------------------------------------------------------- +!IF (l_aggregate) THEN +! surft_pts(1) = land_pts +!!$OMP PARALLEL DO SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(l) & +!!$OMP SHARED(land_pts, tile_frac, surft_index) +! DO l = 1,land_pts +! tile_frac(l,1) = 1.0 +! surft_index(l,1) = l +! END DO +!!$OMP END PARALLEL DO +!ELSE + DO n = 1,ntype +!$OMP PARALLEL DO SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(l) & +!$OMP SHARED(land_pts, tile_frac, frac, n) + DO l = 1, land_pts + tile_frac(l,n) = frac(l,n) + END DO +!$OMP END PARALLEL DO + END DO +!END IF + +IF (land_pts > 0) THEN ! Omit if no land points + + !CM3#55-7 - CABLE needs to provide values for hcons_soilt and hcons_snow + ! retain for now but ideally we'd use CABLE science not JULES science + !----------------------------------------------------------------------- + ! Calculate the thermal conductivity of the top soil layer. + !----------------------------------------------------------------------- + DO m = 1, nsoilt + CALL heat_con (land_pts,hcon_soilt,sthu_soilt(:,m,1), & + sthf_soilt(:,m,1),smvcst_soilt(:,m,1),hcons_soilt(:,m)) + END DO + + ! Thermal conductvity of top snow layer if nsmax > 0 + !CM2!IF (nsmax > 0) THEN + !CM2! DO n = 1,nsurft + !CM2! CALL snowtherm(land_pts,surft_pts(n),nsnow_surft(:,n), & + !CM2! surft_index(:,n),ds_surft(:,n,:),sice_surft(:,n,:), & + !CM2! sliq_surft(:,n,:),csnow,ksnow) + !CM2! DO l = 1,land_pts + !CM2! hcons_snow(l,n) = ksnow(l,1) + !CM2! END DO + !CM2! END DO + !CM2!END IF + +END IF ! End test on land points + +!CM3#55-8 - correctly removed already +!----------------------------------------------------------------------- +! Calculate net radiation on land tiles +!----------------------------------------------------------------------- +!CM2!$OMP PARALLEL & +!CM2!$OMP DEFAULT(NONE) & +!CM2!$OMP PRIVATE(l,k,j,i,n) & +!CM2!$OMP SHARED(surft_pts,surft_index,land_index,pdims,radnet_surft,sw_surft, & +!CM2!$OMP emis_surft,sky,lw_down,tstar_surft,nsurft,l_skyview) +!CABLE_LSM:CM2 +!CM2IF (l_skyview) THEN +!CM2 DO n = 1,nsurft +!CM2!$OMP DO SCHEDULE(STATIC) +!CM2 DO k = 1,surft_pts(n) +!CM2 l = surft_index(k,n) +!CM2 j=(land_index(l) - 1) / pdims%i_end + 1 +!CM2 i = land_index(l) - (j-1) * pdims%i_end +!CM2 radnet_surft(l,n) = sw_surft(l,n) + emis_surft(l,n) * & +!CM2 sky(i,j) * ( lw_down(i,j) - sbcon * tstar_surft(l,n)**4 ) +!CM2 END DO +!CM2!$OMP END DO NOWAIT +!CM2 END DO +!CM2ELSE +!CM2 DO n = 1,nsurft +!CM2!$OMP DO SCHEDULE(STATIC) +!CM2 DO k = 1,surft_pts(n) +!CM2 l = surft_index(k,n) +!CM2 j=(land_index(l) - 1) / pdims%i_end + 1 +!CM2 i = land_index(l) - (j-1) * pdims%i_end +!CM2 radnet_surft(l,n) = sw_surft(l,n) + emis_surft(l,n) * & +!CM2 ( lw_down(i,j) - sbcon * tstar_surft(l,n)**4 ) +!CM2 END DO +!CM2!$OMP END DO NOWAIT +!CM2 END DO +!CM2END IF +!CM2!!$OMP END PARALLEL + + +!----------------------------------------------------------------------- +! 4. Surface turbulent exchange coefficients and "explicit" fluxes +! (P243a, routine SF_EXCH). +! Wind mixing "power" and some values required for other, later, +! diagnostic calculations, are also evaluated if requested. +!----------------------------------------------------------------------- + +!CM3#55-9 +!IF ( l_rp2 .AND. i_rp_scheme == i_rp2b) THEN +! DO n = 1,npft +! z0h_z0m(n) = z0hm_pft_rp(n) +! END DO +!END IF + +!CM3#55-10 - note that snowdep_surft needs to take CABLE value - check + +!$OMP PARALLEL PRIVATE(i,j,l,n) DEFAULT(NONE) IF(land_pts>1) & +!$OMP SHARED(land_pts,nsurft,land_index, flandg,z_land,t_i_length, & +!$OMP can_model,cansnowtile,l_snowdep_surf,snow_surft,rho_snow_const, & +!$OMP snowdep_surft,surf_hgt_surft,ctile_orog_fix,l_ctile) +!DO n = 1,nsurft +! IF ( (can_model == 4) .AND. cansnowtile(n) .AND. l_snowdep_surf ) THEN +!!$OMP DO SCHEDULE(STATIC) +! DO l = 1,land_pts +! snowdep_surft(l,n) = snow_surft(l,n) / rho_snow_const +! END DO +!!$OMP END DO NOWAIT +! END IF +!END DO + +!CM3#55-11 +IF (ctile_orog_fix == correct_sea_adjust_land .AND. l_ctile) THEN +!$OMP DO SCHEDULE(STATIC) + DO l = 1,land_pts + j=(land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + IF (flandg(i,j) > 0.0 .AND. flandg(i,j) < 1.0) THEN + ! calculate height of orography relative to grid-box mean + ! limit this to 1000m. z_land already limited to be > 0 + ! in ni_bl_ctl + surf_hgt_surft(l,:) = MIN(z_land(i,j) * (1.0 / flandg(i,j) - 1.0),1000.0) + END IF + END DO +!$OMP END DO NOWAIT +END IF +!$OMP END PARALLEL + +!CM3#55-12 +! Calculate temperature and specific humidity for elevation bands +CALL elevate( & + land_pts,nsurft,surft_pts,land_index,surft_index, & + tl_1,qw_1,pstar,surf_hgt_surft,l_elev_absolute_height,z_land, & + t_elev,q_elev) + + +!----------------------------------------------------------------------- +! 2. Calculate QSAT values required later. +!----------------------------------------------------------------------- +!CM3#55-13 + +!$OMP PARALLEL DO IF(land_pts > 1) DEFAULT(NONE) PRIVATE(i, j, l) & +!$OMP SHARED(land_index, land_pts, pstar, pstar_land, t_i_length) & +!$OMP SCHEDULE(STATIC) +DO l = 1,land_pts + j=(land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + pstar_land(l) = pstar(i,j) +END DO +!$OMP END PARALLEL DO + +IF (l_mr_physics) THEN +!$OMP PARALLEL DO IF(nsurft > 1) DEFAULT(NONE) PRIVATE(n) & +!$OMP SHARED(nsurft,qstar_surft,tstar_surft,pstar_land,land_pts, & +!$OMP qs1_elev,t_elev) SCHEDULE(STATIC) + DO n = 1,nsurft + CALL qsat_mix(qstar_surft(:,n),tstar_surft(:,n),pstar_land,land_pts) + CALL qsat_mix(qs1_elev(:,n),t_elev(:,n),pstar_land,land_pts) + END DO +!$OMP END PARALLEL DO +ELSE +!$OMP PARALLEL DO IF(nsurft > 1) DEFAULT(NONE) PRIVATE(n) & +!$OMP SHARED(nsurft,qstar_surft,tstar_surft,pstar_land,land_pts, & +!$OMP qs1_elev,t_elev) SCHEDULE(STATIC) + DO n = 1,nsurft + CALL qsat(qstar_surft(:,n),tstar_surft(:,n),pstar_land,land_pts) + CALL qsat(qs1_elev(:,n),t_elev(:,n),pstar_land,land_pts) + END DO +!$OMP END PARALLEL DO +END IF + +!CM3#55-14 +!----------------------------------------------------------------------- +!! Calculate gradient of saturated specific humidity for use in +!! calculation of surface fluxes +!----------------------------------------------------------------------- +!$OMP PARALLEL DEFAULT(NONE) PRIVATE(k,l,n,d_t, i, j) & +!$OMP SHARED(nsurft,surft_pts,surft_index,tstar_surft,t_elev,alpha1, & +!$OMP qstar_surft,qs1_elev,epsil,c_virtual,r, tdims,rhostar_mom,rhostar) +DO n = 1,nsurft +!$OMP DO SCHEDULE(STATIC) + DO k = 1,surft_pts(n) + l = surft_index(k,n) + d_t = tstar_surft(l,n) - t_elev(l,n) + IF (d_t > 0.05 .OR. d_t < -0.05) THEN + alpha1(l,n) = (qstar_surft(l,n) - qs1_elev(l,n)) / d_t + ELSE IF (t_elev(l,n) > tm) THEN + alpha1(l,n) = epsil * lc * qs1_elev(l,n) * & + (1.0 + c_virtual * qs1_elev(l,n)) / & + ( r * t_elev(l,n) * t_elev(l,n)) + ELSE + alpha1(l,n) = epsil * ls * qs1_elev(l,n) * & + (1.0 + c_virtual * qs1_elev(l,n)) / & + ( r * t_elev(l,n) * t_elev(l,n)) + END IF + END DO +!$OMP END DO NOWAIT +END DO + +!----------------------------------------------------------------------- +! If requested, improve accuracy of air density, rhostar +! On input rhostar = pstar/R*Tstar +!----------------------------------------------------------------------- +!$OMP DO SCHEDULE(STATIC) +DO j = tdims%j_start,tdims%j_end + DO i = tdims%i_start,tdims%i_end + ! original approximation for surface air density + rhostar_mom(i,j) = rhostar(i,j) + END DO +END DO +!$OMP END DO +!$OMP END PARALLEL + +IF (l_accurate_rho) THEN + ! More accurate expressions for surface air density. + ! Use bottom level vapour as a better approximation over land + ! than qsat(tstar) + CALL calc_air_dens(l_mr_physics,qw_1,rhostar,rhostar_mom) + +END IF ! l_accurate_rho + +!CM3#55-16 +!! Initialise scaling_urban to 1.0 so that it only affects urban tiles when +!! MORUSES used with no aggregation. +!IF ( .NOT. l_aggregate .AND. l_moruses_storage ) THEN +! n = urban_canyon +!!$OMP PARALLEL DO IF(land_pts > 1) DEFAULT(NONE) PRIVATE(l) SHARED(land_pts, & +!!$OMP n, scaling_urban, tile_frac, urban_roof) SCHEDULE(STATIC) +! DO l = 1, land_pts +! IF ( tile_frac(l,n) > 0.0 ) THEN +! scaling_urban(l,n) = & +! ( tile_frac(l,n) + tile_frac(l,urban_roof) ) / & +! tile_frac(l,n) +! END IF +! END DO +!!$OMP END PARALLEL DO +!END IF + +!CM3#55-17 +!! Calculate average layer temperature and conductivity for lakes. +!! This is a fudge - a layer with average properties won't +!! really behave like a stack of layers with different properties. +!! +!IF ( l_flake_model & +! .AND. ( .NOT. l_aggregate)) THEN +! +! !============================================================================== +! ! *NOTICE REGARDING SOIL TILING** +! ! +! !The following section facilitates the use of soil tiling. As implemented, +! !there are two soil tiling options: +! ! +! !nsoilt == 1 +! !Operate as with a single soil tile, functionally identical to JULES upto +! ! at least vn4.7 (Oct 2016) +! ! This means that a soilt variable being passed 'up' to the surface is +! ! broadcast to the surft variable (with weighting by frac if requred) +! ! +! !nsoilt > 1 +! !Operate with nsoilt = nsurft, with a direct mapping between them +! ! This means that a soilt variable being passed 'up' to the surface is simply +! ! copied into the surft variable +! ! +! ! This will need to be refactored for other tiling approaches. This note +! ! will be replicated elsewhere in the code as required +! ! +! !These comments apply until **END NOTICE REGARDING SOIL TILING** +! !============================================================================== +! +!!$OMP PARALLEL DEFAULT(NONE) PRIVATE(l, m) & +!!$OMP SHARED(l_flake_model, l_aggregate, land_pts, nsoilt, hcon_lake, & +!!$OMP dzsoil, hcons_mean_soil, hcons_soilt, t_soil_soilt, tile_frac, & +!!$OMP lake_h_ice_gb, snow_hcon, lake_depth_gb, nusselt_gb, & +!!$OMP g_dt_gb, ts1_lake_gb, lake_t_mxl_gb, lake_t_ice_gb, & +!!$OMP tsoil_mean_soil, lake_ice_mid_temp, l_shallow_lake_depth) +! +! ! Initialise thermal variables to zero and then set to mean soil values +!!$OMP DO SCHEDULE(STATIC) +! DO l = 1, land_pts +! hcons_mean_soil(l) = 0.0 +! tsoil_mean_soil(l) = 0.0 +! hcon_lake(l) = 0.0 +! ts1_lake_gb(l) = 0.0 +! END DO +!!$OMP END DO +! IF (nsoilt == 1) THEN +! !Just 1 soil tile +! m = 1 +!!$OMP DO SCHEDULE(STATIC) +! DO l = 1, land_pts +! hcons_mean_soil(l) = hcons_soilt(l,m) +! tsoil_mean_soil(l) = t_soil_soilt(l,m,1) +! END DO +!!$OMP END DO +! ELSE +! !Surface tiles map directly on to soil tiles +!!$OMP DO SCHEDULE(STATIC) +! DO m = 1,nsoilt +! DO l = 1, land_pts +! hcons_mean_soil(l) = hcons_mean_soil(l) & +! + (tile_frac(l,m) * hcons_soilt(l,m)) +! tsoil_mean_soil(l) = tsoil_mean_soil(l) & +! + (tile_frac(l,m) * t_soil_soilt(l,m,1)) +! END DO +! END DO +!!$OMP END DO +! END IF +! +! !============================================================================== +! ! *END NOTICE REGARDING SOIL TILING** +! !============================================================================== +! +! IF (dzsoil(1) <= 0.0) THEN +! ! +! ! catch-all for sillies - just use soil value +! ! +!!$OMP DO SCHEDULE(STATIC) +! DO l = 1, land_pts +! hcon_lake(l) = hcons_mean_soil(l) +! ts1_lake_gb(l) = tsoil_mean_soil(l) +! END DO +!!$OMP END DO NOWAIT +! +! ELSE +! +!!$OMP DO SCHEDULE(STATIC) +! DO l = 1, land_pts +! +! IF ( dzsoil(1) <= lake_h_ice_gb(l) ) THEN +! +! ! Near surface layer is entirely within the ice. Set conductivity +! ! to ice value and use piecewise linear interpolation to find +! ! temperature at midpoint of near surface layer. +! hcon_lake(l) = hcice +! ts1_lake_gb(l) = lake_t_ice_gb(l) + (dzsoil(1) / 2.0) * & +! (lake_t_mxl_gb(l) - lake_t_ice_gb(l)) & +! / lake_h_ice_gb(l) +! +! ELSE IF ( (dzsoil(1) > lake_h_ice_gb(l)) & +! .AND. (dzsoil(1) <= (lake_h_ice_gb(l) & +! +lake_depth_gb( l)))) THEN +! +! ! Set conductivity as weighted average of ice and water based upon +! ! realtive thicknesses and the Nusselt number +! nusselt_gb(l) = g_dt_gb(l) * (dzsoil(1) - lake_h_ice_gb(l) ) & +! / ( 2.0 * hcwat ) +! nusselt_gb(l) = MAX( nusselt_gb(l), 1.0 ) +! hcon_lake(l) = ( hcice * lake_h_ice_gb(l) & +! +hcwat * (dzsoil(1) - lake_h_ice_gb(l))) & +! * nusselt_gb(l) & +! / dzsoil(1) +! +! ! Find temperature mid-way through the ice layer +! ! (temperature varies linearly across ice layer) +! lake_ice_mid_temp(l) = lake_t_ice_gb(l) + 0.5 * (lake_t_mxl_gb(l) & +! - lake_t_ice_gb(l)) +! +! ! Calculate temperature as weighted average of temperature in ice layer +! ! and mixed layer temp for near surface water beneath the ice. +! ts1_lake_gb(l) = (lake_ice_mid_temp(l) * lake_h_ice_gb(l) & +! + lake_t_mxl_gb(l) * (dzsoil(1) - lake_h_ice_gb(l))) & +! / dzsoil(1) +! +! ELSE +! +! ! Lake depth is less than first soil layer thickness so set logical +! ! to write our warning message. +! l_shallow_lake_depth(l) = .TRUE. +! +! ! Set conductivity as weighted average of ice and water and soil +! ! based upon realtive thicknesses and the Nusselt number +! ! Use soil value for the temperature +! nusselt_gb(l) = g_dt_gb(l) * lake_depth_gb(l) & +! / ( 2.0 * hcwat ) +! nusselt_gb(l) = MAX( nusselt_gb(l), 1.0 ) +! hcon_lake(l) = ( hcice * lake_h_ice_gb(l) & +! + hcwat * lake_depth_gb(l) * nusselt_gb(l) & +! + hcons_mean_soil(l) * (dzsoil(1) & +! - lake_h_ice_gb(l) - lake_depth_gb(l))) & +! / dzsoil(1) +! ts1_lake_gb(l) = tsoil_mean_soil(l) +! +! END IF +! END DO +!!$OMP END DO NOWAIT +! END IF +!!$OMP END PARALLEL +! +! ! Write out warning message for negative top soil layer thinkness +! ! or lake depth less than first soil layer thinkness +! IF (dzsoil(1) <= 0.0) THEN +! errcode = -1 +! WRITE(cmessage, '(A,F16.4)') 'Negative value of dzsoil = ', dzsoil(1) +! CALL ereport(routinename, errcode, cmessage) +! END IF +! +! IF ( ANY(l_shallow_lake_depth(1:land_pts)) ) THEN +! errcode = -1 +! WRITE(cmessage, '(A,F16.4)') 'Unusual value of lake depth found '// & +! 'when computing hcon_lake. Found ' // & +! 'lake depth comparable to first ' // & +! 'soil layer: dzsoil= ', dzsoil(1) +! CALL ereport(routinename, errcode, cmessage) +! END IF +! +!END IF + +!CM3#55-18 +DO n = 1,nsurft +!$OMP PARALLEL DO SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(l) & +!$OMP SHARED(n, land_pts, lw_down_elevcorr_surft) + DO l = 1,land_pts + lw_down_elevcorr_surft(l,n) = 0.0 + END DO +!$OMP END PARALLEL DO +END DO + +!CM3#55-19 - moving the necessary parts to after the call to CABLE +!IF( first_call ) THEN +! emis_surft = 1.0 +! emis_soil = 1.0 +! hcons_snow = hcons_soilt(1,1) +! first_call = .FALSE. +!END IF +!hcons_surf = hcons_soilt(1,1) +!hcons_snow = hcons_soilt(1,1) + +!CM3#55-20 +IF (l_elev_lw_down) THEN + + ! for tiles at different elevations, adjust downwelling longwave + ! according to the anomaly in surface temperature that has been + ! calculated with LW ~ T^4 + DO l = 1,land_pts + lw_down_surftsum(l) = 0.0 + lw_down_surftabs(l) = 0.0 + END DO + + DO n = 1,nsurft + DO l = 1,land_pts + j = (land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + IF (lw_down(i,j) > 0.0) THEN + + ! Adjust radiative temperature and net longwave + t_rad = 0.0 + IF (t_elev(l,n) > 0.0 ) THEN + t_rad = (lw_down(i,j) / sbcon)**(1.0 / 4.0) + t_rad = t_rad + t_elev(l,n) - tl_1(i,j) + lw_down_elevcorr_surft(l,n) = sbcon * (t_rad**4) - lw_down(i,j) + END IF + + ! Keep track of total adjustments to longwave + lw_down_surftsum(l) = lw_down_surftsum(l) + & + lw_down_elevcorr_surft(l,n) * tile_frac(l,n) + lw_down_surftabs(l) = lw_down_surftabs(l) + & + ABS(lw_down_elevcorr_surft(l,n)) * tile_frac(l,n) + END IF + END DO + END DO + + DO l = 1,land_pts + j = (land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + IF (lw_down(i,j) > 0.0) THEN + IF (lw_down_surftabs(l) > EPSILON(0.0)) THEN + ! correct each adjustment to preserve the gridbox mean. + ! size of correction in proportion to the size of adjustment + ! so that unadjusted tiles remain unaffected + DO n = 1,nsurft + lw_down_elevcorr_surft(l,n) = lw_down_elevcorr_surft(l,n) & + - lw_down_surftsum(l) & + * ABS(lw_down_elevcorr_surft(l,n)) & + / lw_down_surftabs(l) + END DO + END IF + END IF + END DO + + !CM3#55-20 - these lines are correctly removed +!CM2! ! Adjust the net radiation +!CM2! DO n = 1,nsurft +!CM2! DO l = 1,land_pts +!CM2! j = (land_index(l) - 1) / t_i_length + 1 +!CM2! i = land_index(l) - (j-1) * t_i_length +!CM2! IF (lw_down(i,j) > 0.0) THEN +!CM2! IF (l_skyview) THEN +!CM2! radnet_surft(l,n) = radnet_surft(l,n) & +!CM2! + sky(i,j) * emis_surft(l,n) & +!CM2! * lw_down_elevcorr_surft(l,n) +!CM2! ELSE +!CM2! radnet_surft(l,n) = radnet_surft(l,n) & +!CM2! + emis_surft(l,n) * lw_down_elevcorr_surft(l,n) +!CM2! END IF +!CM2! END IF +!CM2! END DO +!CM2! END DO +END IF + +!============================================================================= +!CM3#55 - at this point all of the forcing for CABLE has been created - +! so call CABLE and then map remaining values back to JULES variables +! where needed. + +!CABLE_LSM:CM2.5 Oddly tstar_surft is declared as INTENT(IN) above!! +! This is important may need to be followed up as the INTENTs are likely inherited +! - the simplest work around would be to not UNPACK %trad to tstar_surft +! in the explicit section. +! +! However we do NEED to provide a value for dtstar_surft - this is missing +! +! Also we may wish to force cable with lw_down_elevcorr_surft not lw_down +CALL cable_explicit_main( & + ! IN: UM/JULES model/grid parameters, fields, mappings + mype, timestep, timestep_number, tdims%i_end, tdims%j_end, land_pts, & + nsurft, npft, sm_levels, dzsoil, land_index, surft_pts, surft_index, & + cos_zenith_angle, latitude, longitude, Flandg, tile_frac, & + + ! IN: soil parameters !1 is only allowable index in UM + bexp_soilt(:,1,:), hcon_soilt(:,1), satcon_soilt(:,:), & + sathh_soilt(:,1,:), smvcst_soilt(:,1,:), smvcwt_soilt(:,1,:), & + smvccl_soilt(:,1,:), albsoil_soilt(:,1), & + + ! IN: Met forcing: + lw_down, sw_surft, ls_rain, ls_snow, & + tl_1, qw_1, vshr_land, pstar, z1_tq, z1_uv, canopy, & + ! This an outlier IN here. INOUT @ implicit. (was)OUT at extras + ! I think we are dealing with it OK now but confusion could be removed + snow_surft, & + + ! IN: canopy height, LAI seasonally presecribed, potentially prognostic + ! IN: CO2 mass mixing ratio + canht_pft, lai_pft, co2_mmr, & + + ! TYPEs passed from top_level to maintain scope, access to UM STASH + ! IN: tiled soil/snow prognostics - IN here. INOUT @ implicit + ! INOUT: Carries fields needed by CABLE b/n pathways (rad, explicit etc) + ! Currently carrying CABLE TYPEs (canopy%, rad% etc). + ! IN: pars carries vegin/soilin - potentially redundant + progs_cbl, work_cbl, pars_io_cbl, & + + ! OUT: UM fields UNPACKed from CABLE (@ explicit) + ftl_surft, fqw_surft, tstar_surft, dtstar_surft, u_s, u_s_std_surft, & + cd_surft, ch_surft, radnet_surft, fraca, resfs, resft, z0h_surft, & + z0m_surft, recip_l_MO_surft, epot_surft, npp_pft_acc, resp_w_pft_acc ) + +! hard-wire CABLE emissivities into respective JULES vars - CM3#55-19 +! hcons_surf and hcons_snow should not need filling again +DO l=1,land_pts + emis_soil(l) = 1.0 +END DO + +DO n=1,nsurft + DO l=1,land_pts + emis_surft(l,n) = 1.0 + flake(l,n) = 0.0 !CM2-era overwrite - CM#55-24 + END DO +END DO + +!pass CABLE non-topography impacted values for drag & fr velo into JULES variables +DO n=1,nsurft + DO l=1,land_pts + cd_std(l,n) = cd_surft(l,n) + v_s_surft(l,n) = u_s_std_surft(l,n) !estimate of fr vel with topography + v_s_std(l,n) = u_s_std_surft(l,n) !value of fraction velocity no topography + z0m_eff_surft(l,n) = z0m_surft(l,n) !default topograhic roughness (?needed) + END DO +END DO + + +!CM3#55-22 CM3#55-23 +!recip_l_mo_surft = 1.0 !? +!v_s_std = 1.0e-6 !? +!CM3#55-24 - noting the link to resfs +!flake =0.0 !CABLE_LSM:CM2clobbered flake + +!CM3#55 - from here on goes a set of mappings from CABLE to JULES and/or from +! JULES to JULES given a CABLE variable has been given earlier. +! +! variables that need thought are resft, hcons_soilt, hcons_snow, cd_surft, ch_surft, +! other parts of classic aerosol and dust code, ashtf_surft and ashtf_prime_surft +! +! we are looking to avoid any calls to fcdch (the science is complicated and does not +! follow CABLE science) and sf_flux +!CABLE_LSM: End +!============================================================================== + +!============================================================================== +! *NOTICE REGARDING SOIL TILING** +! +!The following section facilitates the use of soil tiling. As implemented, +!there are two soil tiling options: +! +!nsoilt == 1 +!Operate as with a single soil tile, functionally identical to JULES upto +! at least vn4.7 (Oct 2016) +! This means that a soilt variable being passed 'up' to the surface is +! broadcast to the surft variable (with weighting by frac if requred) +! +!nsoilt > 1 +!Operate with nsoilt = nsurft, with a direct mapping between them +! This means that a soilt variable being passed 'up' to the surface is simply +! copied into the surft variable +! +! This will need to be refactored for other tiling approaches. This note +! will be replicated elsewhere in the code as required +! +!These comments apply until **END NOTICE REGARDING SOIL TILING** +!============================================================================== + +!CM3#55-21 - hoping to be able to set ashtf_surft = 1.0 and ahstf_prime_surft=1.0 +! and bypass all of this +!DO n = 1,nsurft +! +! !Set the current soil tile (see notice above) +! IF (nsoilt == 1) THEN +! !There is only 1 soil tile +! m = 1 +! ELSE ! nsoilt == nsurft +! !Soil tiles map directly on to surface tiles +! m = n +! END IF !nsoilt +! +! ! Set up soil and surface thermal properties +!!$OMP PARALLEL DO IF(land_pts > 1) DEFAULT(NONE) & +!!!$OMP PRIVATE(i, j, l, ds_ratio) & +!!$OMP SHARED(land_pts, land_index, t_i_length, tsurf, t_soil_soilt, t_elev, & +!!$OMP tl_1, & +!!$OMP dzsurf, dzsoil, hcons_surf, hcons_soilt, canhc_surf, canhc_surft, & +!!$OMP nsmax, nsnow_surft, tsnow_surft, ds_surft, hcons_snow, & +!!$OMP cansnowtile, snowdepth_surft, snow_hcon, & +!!$OMP l_snow_nocan_hc, l_flake_model, l_aggregate, lake, & +!!$OMP n, m, ts1_lake_gb, hcon_lake, l_elev_land_ice, l_lice_point, & +!!$OMP tsurf_elev_surft, dzsoil_elev, l_lice_surft, hcondeep, & +!!$OMP l_moruses_storage, urban_roof, l_fix_moruses_roof_rad_coupling, & +!!$OMP vfrac_surft, ashtf_surft, scaling_urban, l_soil_point) & +!!$OMP SCHEDULE(STATIC) +! DO l = 1,land_pts +! j = (land_index(l) - 1) / t_i_length + 1 +! i = land_index(l) - (j-1) * t_i_length +! hcons_surf(l,n) = hcons_soilt(l,m) +! IF (l_elev_land_ice .AND. l_lice_point(l)) THEN +! +! ! Land ice +! tsurf(l,n) = tsurf_elev_surft(l,n) +! dzsurf(l,n) = dzsoil_elev +! canhc_surf(l,n) = 0.0 +! IF (l_lice_surft(n)) THEN +! hcons_surf(l,n) = snow_hcon +! ELSE +! hcons_surf(l,n) = hcondeep +! END IF +! ELSE +! +! ! Soil +! tsurf(l,n) = t_soil_soilt(l,m,1) + t_elev(l,n) - tl_1(i,j) +! dzsurf(l,n) = dzsoil(1) +! hcons_surf(l,n) = hcons_soilt(l,m) +! canhc_surf(l,n) = canhc_surft(l,n) +! END IF +! IF ( (l_flake_model ) & +! .AND. ( .NOT. l_aggregate) & +! .AND. (n == lake )) THEN +! +! ! Lake +! tsurf(l,n) = ts1_lake_gb(l) + t_elev(l,n) - tl_1(i,j) +! hcons_surf(l,n) = hcon_lake(l) +! dzsurf(l,n) = dzsoil(1) +! END IF +! IF ((nsmax > 0) .AND. (nsnow_surft(l,n) > 0)) THEN +! +! ! Snow +! tsurf(l,n) = tsnow_surft(l,n,1) +! ! change the effective surface layer thickness for snow +! dzsurf(l,n) = ds_surft(l,n,1) +! hcons_surf(l,n) = hcons_snow(l,n) +! IF ( ( .NOT. cansnowtile(n)) .AND. l_snow_nocan_hc .AND. & +! (nsmax > 0) .AND. (nsnow_surft(l,n) > 0) ) canhc_surf(l,n) = 0.0 +! END IF +! +! ! MORUSES: Uncouple the roof for perfect insulation. hcons should only be zero +! ! to change the "conductive" coupling to "uncoupled" otherwise it is radiatively +! ! coupled. +! IF ( .NOT. l_aggregate .AND. l_moruses_storage .AND. n == urban_roof ) THEN +! IF ( l_fix_moruses_roof_rad_coupling ) THEN +! IF (vfrac_surft(l,n) == 0.0) THEN +! hcons_surf(l,n) = 0.0 +! END IF +! ELSE +! hcons_surf(l,n) = 0.0 +! END IF +! END IF +! +! ! Set up surface soil condictivity +! ashtf_surft(l,n) = 2.0 *hcons_surf(l,n) / MAX( dzsurf(l,n), dzsoil(1) ) +! ! Except when n == urban_canyon when MORUSES is used +! ! scaling_urban(l) = 1.0 +! ashtf_surft(l,n) = ashtf_surft(l,n) * scaling_urban(l,n) +! +! ! Adjust surface soil condictivity for snow +! IF (snowdepth_surft(l,n) > 0.0 .AND. l_soil_point(l) & +! .AND. nsnow_surft(l,n) == 0 ) THEN +! IF ( l_moruses_storage .AND. n == urban_roof ) THEN +! ! This required as HCONS(L) = 0 in this case. +! ashtf_surft(l,n) = 0.0 +! ELSE +! ds_ratio = 2.0 * snowdepth_surft(l,n) / dzsurf(l,n) +! IF (ds_ratio <= 1.0) THEN +! ashtf_surft(l,n) = ashtf_surft(l,n) / & +! (1.0 + ds_ratio * (hcons_surf(l,n) / snow_hcon - 1.0)) +! ELSE +! ashtf_surft(l,n) = ashtf_surft(l,n) * & +! snow_hcon / hcons_surf(l,n) +! END IF +! END IF +! END IF +! +! END DO +!!$OMP END PARALLEL DO +!END DO +!============================================================================== +! *END NOTICE REGARDING SOIL TILING** +!============================================================================== + + +!----------------------------------------------------------------------- +! 3. Calculation of transfer coefficients and surface layer stability +!----------------------------------------------------------------------- + +!----------------------------------------------------------------------- +! 3.1 Calculate neutral roughness lengths +!----------------------------------------------------------------------- + +! Land tiles +!jh:could be able to dodge all these roughness calcs - test re-instating them +!jh!alla CM2 +!jh! Z0_SURFT contains the appropriate value for land-ice points, but has to +!jh! be modified for snow-cover on non-land-ice points. Thermal roughness +!jh! lengths are set to be proportional to the tiled roughness length in +!jh! the case of multiple tiles, but if tiled properties have already +!jh! been aggregated, an adjustment for snow cover is required. In this case +!jh! a ratio of 0.1 between the thermal and momentum roughness lengths over +!jh! snow is assumed; to do otherwise would require reaggregation. In the +!jh! case of multiple tiles, the assignment is delayed until the urban +!jh! options have been considered. +!jh! +!jh!$OMP PARALLEL DO IF(nsurft > 1) DEFAULT(NONE) PRIVATE(k, l, n, z0, zeta1) & +!jh!$OMP SHARED(nsurft, surft_pts, surft_index, snow_surft, & +!jh!$OMP l_soil_point, z0_surft, snowdep_surft, l_aggregate, & +!jh!$OMP i_aggregate_opt, z0h_surft_bare, z0m_surft, & +!jh!$OMP l_moruses_rough_surft, z0h_z0m, z0h_surft, & +!jh!$OMP z0h_surft_classic, & +!jh!$OMP z0h_z0m_classic) SCHEDULE(STATIC) +!jh +!jh!CM3#55-22 - only need to fill a value for classic stuff here +!jh!DO n = 1,nsurft +!jh !! MORUSES parameterises z0m and z0h differently and are not affected by snow +!jh !! in the same way so are dealt with independently +!jh !IF ( .NOT. l_moruses_rough_surft(n) ) THEN +!jh ! DO k = 1,surft_pts(n) +!jh ! l = surft_index(k,n) +!jh !IF ( snow_surft(l,n) > 0.0 .AND. l_soil_point(l) ) THEN +!jh ! z0 = z0_surft(l,n) - 0.1 * snowdep_surft(l,n) +!jh ! zeta1 = MIN( 5.0e-4 , z0_surft(l,n) ) +!jh ! z0m_surft(l,n) = MAX( zeta1 , z0 ) +!jh ! ! Set z0h_surft explicitly if this option is selected, +!jh ! ! otherwise, it will be set for the first tile below. +!jh ! IF (l_aggregate .AND. i_aggregate_opt == 1) THEN +!jh ! z0 = z0h_surft_bare(l,n) - 0.1 * 0.1 * snowdep_surft(l,n) +!jh ! zeta1 = MIN( 5.0e-5 , z0h_surft_bare(l,n) ) +!jh ! z0h_surft(l,n) = MAX( zeta1 , z0 ) +!jh ! END IF +!jh !ELSE +!jh ! z0m_surft(l,n) = z0_surft(l,n) +!jh ! ! Set z0h_surft explicitly if this option is selected, +!jh ! ! otherwise, it will be set for the first tile below. +!jh ! IF (l_aggregate .AND. i_aggregate_opt == 1) & +!jh ! z0h_surft(l,n) = z0h_surft_bare(l,n) +!jh !END IF +!jh +!jh !! Set the thermal roughness length if aggregation is not being +!jh !! carried out, or if the original scheme is being used. +!jh !! It must be done here for consistency with the urban options. +!jh !IF ( ( .NOT. l_aggregate) .OR. & +!jh ! (l_aggregate .AND. i_aggregate_opt == 0) ) & +!jh ! z0h_surft(l,n) = z0h_z0m(n) * z0m_surft(l,n) +!jh +!jh ! Also set additional roughness length for use in CLASSIC aerosol +!jh ! deposition scheme - CM3 retain - now done later +!jh !z0h_surft_classic(l,n) = z0h_z0m_classic(n) * z0m_surft(l,n) +!jh ! END DO +!jh !END IF +!jh!END DO +!jh!$OMP END PARALLEL DO +!jh +!jh!CM3#55-22 +!jh!! MORUSES does not yet contain a parametrisation for snow, which should not +!jh!! affect the behaviour of bluff bodies. It will instead affect the material +!jh!! roughness of the road & roof and not the walls, which are essentially +!jh!! snow-free. Snow could be added to the material roughness length for +!jh!! momentum before passing to urbanz0, which calculates roughness length for heat +!jh!! Two calls are required; one for urban_canyon and one for urban_roof. +!jh!! +!jh!! If l_aggregate MORUSES roughness lengths are set in the usual way above with +!jh!! z0_surft = ztm in sparm +!jh!IF ( .NOT. l_aggregate ) THEN +!jh! IF ( ANY( l_moruses_rough_surft(1:nsurft) ) ) THEN +!jh! n = urban_canyon +!jh!!$OMP PARALLEL DO SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(k,l,j,i) & +!jh!!$OMP SHARED(surft_pts,n,surft_index,land_index,t_i_length,z1_uv,z1_tq,hgt_gb, & +!jh!!$OMP hwr_gb,disp_gb,z0m_surft,z0_surft,z0h_surft,urban_roof, & +!jh!!$OMP z0h_surft_classic) +!jh! DO k = 1,surft_pts(n) +!jh! l = surft_index(k,n) +!jh! z0m_surft(l,n) = z0_surft(l,n) +!jh! z0m_surft(l,urban_roof) = z0_surft(l,urban_roof) +!jh! j = ( land_index(l) - 1 ) / t_i_length + 1 +!jh! i = land_index(l) - ( j - 1 ) * t_i_length +!jh! CALL urbanz0( & +!jh! n, z1_uv(i,j), z1_tq(i,j), hgt_gb(l), hwr_gb(l), disp_gb(l), & +!jh! z0m_mat, z0m_surft(l,n), z0h_surft(l,n) ) +!jh! CALL urbanz0( & +!jh! urban_roof, z1_uv(i,j), z1_tq(i,j), hgt_gb(l), hwr_gb(l), disp_gb(l), & +!jh! z0m_mat, z0m_surft(l,urban_roof), z0h_surft(l,urban_roof) ) +!jh! ! Make CLASSIC aerosol roughness length for urban tiles consistent +!jh! ! with those for heat and momentum +!jh! z0h_surft_classic(l,n) = z0h_surft(l,n) +!jh! z0h_surft_classic(l,urban_roof) = z0h_surft(l,urban_roof) +!jh! END DO +!jh!!$OMP END PARALLEL DO +!jh! END IF +!jh!END IF +!jh +!jh!CM3#55-22 +!jh!! Calculate roughness length affected by roughness sublayer in neutral +!jh!! conditions. +!jh!DO n = 1,nsurft +!jh! IF (l_vegdrag_surft(n)) THEN +!jh! CALL can_drag_z0( & +!jh! land_pts, surft_pts(n), surft_index(:,n), & +!jh! array_zero, canht_pft(:,n), lai_pft(:,n), & +!jh! z0m_surft(:,n), z0h_surft(:,n), zdt_surft(:,n)) +!jh! END IF +!jh!END DO + +! Calculate orographic effective parameter for neutral conditions +! if using orographic roughness scheme +IF (formdrag == effective_z0) THEN + DO n = 1,nsurft + CALL sf_orog ( & + land_pts,surft_pts(n),land_index,surft_index(:,n), & + ho2r2_orog,rib_surft(:,n),sil_orog_land,z0m_surft(:,n),z1_uv, & + wind_profile_factor(:,n),z0m_eff_surft(:,n) & + ) + END DO +ELSE + wind_profile_factor(:,:) = 1.0 + z0m_eff_surft(:,:) = z0m_surft(:,:) +END IF + + +!CM3#55 - CABLE now called earlier +!!CABLE_LSM:CM2.5 Oddly tstar_surft is declared as INTENT(IN) above!! +!CALL cable_explicit_main( & +! mype, timestep, timestep_number, & +! tdims%i_end,tdims%j_end, land_pts, nsurft, npft, sm_levels, dzsoil, & +! land_index, surft_pts, surft_index, canht_pft, lai_pft, Flandg, & +! co2_mmr, tile_frac, cos_zenith_angle, latitude, longitude, & +! bexp_soilt(:,1,:), hcon_soilt(:,1), satcon_soilt(:,:), & +! sathh_soilt(:,1,:), smvcst_soilt(:,1,:), smvcwt_soilt(:,1,:), & +! smvccl_soilt(:,1,:), sthu_soilt(:,1,:), albsoil_soilt(:,1), & +! lw_down, sw_surft, & +! ls_rain, ls_snow, & +! !not fully checked. iup to here all IN ! unpacked ? +! tl_1, qw_1, vshr_land, pstar, z1_tq, z1_uv, canopy, snow_surft, & +! progs_cbl, work_cbl, pars_io_cbl, & +! ftl_surft, fqw_surft, & +! tstar_surft, u_s, u_s_std_surft, cd_surft, ch_surft, & +! radnet_surft, fraca, resfs, resft, z0h_surft, z0m_surft, & +! recip_l_MO_surft, epot_surft, & +! npp_pft_acc, resp_w_pft_acc ) +! +!CD_STD = CD_surft +!V_S_surft = U_S_STD_surft +!V_S_STD = U_S_STD_surft +!z0m_eff_surft(:,:) = z0m_surft(:,:) +! +!recip_l_mo_surft = 1.0 !? +!v_s_std = 1.0e-6 !? +!flake =0.0 !CABLE_LSM:CM2clobbered flake +!!CABLE_LSM: End + +!----------------------------------------------------------------------- +! Calculate RESFT with neutral CH and EPDT = 0 for use in calculation +! of Richardson number. RESFT=1 for snow and land-ice. +!----------------------------------------------------------------------- + +!CM3#55-25 - noting that ideally we'd move the evaluation of resft to earlier +!DO n = 1,nsurft + !IF (l_vegdrag_surft(n)) THEN + ! CALL can_drag_phi_m_h( & + ! land_pts, surft_pts(n), surft_index(:,n), land_index, & + ! array_zero, z1_uv, z1_tq, canht_pft(:,n), lai_pft(:,n), & + ! z0m_surft(:,n), z0h_surft(:,n), & + ! phi_m, phi_h) + ! +!!$OMP PARALLEL DO IF(surft_pts(n)>1) DEFAULT(NONE) & +!!$OMP PRIVATE(i, j, k, l) & +!!$OMP SHARED(surft_pts, surft_index, t_i_length, land_index, & +!!$OMP phi_m, phi_h, chn, wind_profile_factor, dq, qw_1, & +!!$OMP qstar_surft, epdt, n, resft, resfs, flake, fraca) SCHEDULE(STATIC) +! DO k = 1,surft_pts(n) +! l = surft_index(k,n) +! j=(land_index(l) - 1) / t_i_length + 1 +! i = land_index(l) - (j-1) * t_i_length +! chn(l,n) = vkman**2 / (phi_m(l) * phi_h(l)) * wind_profile_factor(l,n) +! dq(l) = qw_1(i,j) - qstar_surft(l,n) +! epdt(l) = 0.0 +! !CABLE_LSM:CM2 +! resft(l,n) = MIN(1.,flake(l,n) + (1. - flake(l,n)) * & +! ( fraca(l,n) + (1. - fraca(l,n))*resfs(l,n) )) +! END DO +!!$OMP END PARALLEL DO + +! ELSE ! l_vegdrag_surft = F + +!!$OMP PARALLEL DO IF(surft_pts(n)>1) DEFAULT(NONE) & +!!$OMP PRIVATE(i, j, k, l, zetah, zetam) & +!!$OMP SHARED(surft_pts, surft_index, t_i_length, land_index, z1_uv, resft, & +!!$OMP z0m_surft, z1_tq, z0h_surft, chn, wind_profile_factor, dq, qw_1, & +!!$OMP qstar_surft, epdt,resfs,fraca, flake,n) SCHEDULE(STATIC) + !DO k = 1,surft_pts(n) + ! l = surft_index(k,n) + ! j=(land_index(l) - 1) / t_i_length + 1 + ! i = land_index(l) - (j-1) * t_i_length + ! !zetam = LOG ( (z1_uv(i,j) + z0m_surft(l,n)) / z0m_surft(l,n) ) + ! !zetah = LOG ( (z1_tq(i,j) + z0m_surft(l,n)) / z0h_surft(l,n) ) + ! !chn(l,n) = (vkman / zetah) * (vkman / zetam) * & + ! ! wind_profile_factor(l,n) + ! !dq(l) = qw_1(i,j) - qstar_surft(l,n) + ! !epdt(l) = 0.0 + ! !CABLE_LSM: from 8.5 + ! !CM3#55-25 - now done later + ! !resft(l,n) = MIN(1.,flake(l,n) + (1. - flake(l,n)) * & + ! ! ( fraca(l,n) + (1. - fraca(l,n))*resfs(l,n) )) + ! END DO +!!$OMP END PARALLEL DO + +! END IF + +! ! We should only attempt to access sf_diag%resfs_stom(:,n) if it has +! ! been fully allocated. +! IF (sf_diag%l_et_stom .OR. sf_diag%l_et_stom_surft) THEN +! n_diag = n +! ELSE +! n_diag = 1 +! END IF + +!CABLE_LSM:CM2 +!CM2! CALL sf_resist ( & +!CM2! land_pts,surft_pts(n),land_index,surft_index(:,n),cansnowtile(n), & +!CM2! canopy(:,n),catch(:,n),chn(:,n),dq,epdt,flake(:,n),gc_surft(:,n), & +!CM2! gc_stom_surft(:,n),snowdep_surft(:,n),snow_surft(:,n),vshr_land, & +!CM2! fraca(:,n),resfs(:,n),resft(:,n), & +!CM2! sf_diag%resfs_stom(:,n_diag),sf_diag%l_et_stom,sf_diag%l_et_stom_surft) + +!END DO + +!CM3#55-26 +!----------------------------------------------------------------------- +! 3.2 Calculate bulk Richardson number for the lowest model level. +!----------------------------------------------------------------------- + +! Land tiles +DO n = 1,nsurft + CALL sf_rib ( & + land_pts,surft_pts(n),land_index,surft_index(:,n), & + bq_1,bt_1,qstar_surft(:,n),q_elev(:,n),resft(:,n),t_elev(:,n), & + tstar_surft(:,n),vshr_land,z0h_surft(:,n),z0m_surft(:,n),zdt_surft(:,n), & + z1_tq,z1_uv,l_vegdrag_surft(n), & + rib_surft(:,n),db_surft(:,n) & + ) +END DO + +!----------------------------------------------------------------------- +! 3.3 Calculate stability corrected effective roughness length. +! Stability correction only applies to land points. +!----------------------------------------------------------------------- + +IF (formdrag == effective_z0) THEN + DO n = 1,nsurft + CALL sf_orog ( & + land_pts,surft_pts(n),land_index,surft_index(:,n), & + ho2r2_orog,rib_surft(:,n),sil_orog_land,z0m_surft(:,n),z1_uv, & + wind_profile_factor(:,n),z0m_eff_surft(:,n) & + ) + END DO +END IF + +!CM3#53 - once the roughnesses have been fully evaluated including topograhpic effects +!then cd_surft, driction velocities etc. needs to be revised here +! also do ashtf_surft and ashtf_prime_surft here for readability (could go ealier) +! +!what appears to be needed is +! 1. cd_surft needs to be adjusted to reflect topographic effects. +! 2. cd_std remains unimpacted by topography (may not be needed) +! 3. u_s_std_surft needs to be unimpacted by topgraphic effects +! 4. _classic variables need to use the classic values where +! z0h is replaced by z0h_classic and z0m is replaced by z0m_eff +! +! the equations in fcdch() are that +! v_s = v_s_std / windfactor +! cd_surft = cd_std * v_s/v_s_std * windfactor +! where v_s_std and cd_std are those provided by CABLE (tiled, no topography) +! +! and u_s_std_surft = v_s_std +! +! since we don't know whether z0h from CABLE = z0h_classic we will +! need to recalculate the classic outputs but chose to approximate this as +! cd_std_classic = cd_std = cd_surft (from CABLE) but +! ch_surft_classic = ch_surft * log(z1_tq/z0h_surft) / log(z1_tq/z0h_classic) + +! first, evaluations that are needed regardless of configuration +! - these could go earlier +DO n=1,nsurft + DO l=1,land_pts + !fill ashtf_surft and ashtf_prime with default value + !this needs to be non-zero to function with im_sf_pt2 + ashtf_surft(l,n) = 1.0 + ashtf_prime_surft(l,n) = 1.0 + + !fill in resft + resft(l,n) = MIN(1.,flake(l,n) + (1. - flake(l,n)) * & + ( fraca(l,n) + (1. - fraca(l,n))*resfs(l,n) )) + END DO +END DO + +!if topographic form drag enabled revise the tile drag coefficient +IF (formdrag == effective_z0) THEN + DO n=1,nsurft + DO l=1,land_pts + v_s_surft(l,n) = v_s_std(l,n) / wind_profile_factor(l,n) + cd_surft(l,n) = cd_std(l,n) * v_s_surft(l,n) / v_s_std(l,n) * & + wind_profile_factor(l,n) + END DO + END DO +END IF + +!if classic aerosol scheme used evaluate the tile aerosol deposition coefficients +IF (l_aero_classic) THEN + DO n=1,nsurft + DO k = 1,surft_pts(n) + l = surft_index(k,n) + j=(land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + z0h_surft_classic(l,n) = z0h_z0m_classic(n) * z0m_surft(l,n) + + !using zetam and zetah as temporary vars + zetam = LOG ( (z1_tq(i,j) + z0m_surft(l,n)) / z0h_surft(l,n) ) + zetah = LOG ( (z1_tq(i,j) + z0m_surft(l,n)) / z0h_surft_classic(l,n) ) + + cd_std_classic(l,n) = cd_std(l,n) + ch_surft_classic(l,n) = ch_surft(l,n) * zetam / zetah + END DO + END DO +END IF + + +!----------------------------------------------------------------------- +! 3.4 Calculate CD, CH via routine FCDCH. +!----------------------------------------------------------------------- + +!CABLE_LSM:CM2 +!CM2!! Land tiles +!CM2!DO n = 1,nsurft +!CM2! IF (l_vegdrag_surft(n)) THEN +!CM2! n_veg = n +!CM2! z0m_eff_surft(:,n) = z0m_surft(:,n) +!CM2! ELSE +!CM2! n_veg = 1 +!CM2! END IF +!CM2! CALL fcdch ( & +!CM2! cor_mo_iter,land_pts,surft_pts(n), & +!CM2! surft_index(:,n),land_index, & +!CM2! db_surft(:,n),vshr_land, & +!CM2! z0m_eff_surft(:,n),z0h_surft(:,n),zdt_surft(:,n),zh, & +!CM2! z1_uv,z1_uv_top,z1_tq,z1_tq_top,wind_profile_factor(:,n), & +!CM2! ddmfx,ip_ss_solid,charnock, & +!CM2! charnock_w, & +!CM2! l_vegdrag_surft(n),canht_pft(:,n_veg),lai_pft(:,n_veg), & +!CM2! nsnow_surft(:,n),n,l_mo_buoyancy_calc,cansnowtile(n),l_soil_point, & +!CM2! canopy(:,n),catch(:,n),flake(:,n),gc_surft(:,n), & +!CM2! snowdep_surft(:,n),snow_surft(:,n),canhc_surf(:,n), & +!CM2! dzsurf(:,n),qstar_surft(:,n),q_elev(:,n),radnet_surft(:,n), & +!CM2! snowdepth_surft(:,n),timestep,t_elev(:,n),tsurf(:,n),tstar_surft(:,n), & +!CM2! vfrac_surft(:,n),emis_surft(:,n),emis_soil,anthrop_heat_surft(:,n), & +!CM2! scaling_urban(:,n),alpha1(:,n),hcons_surf(:,n),ashtf_surft(:,n), & +!CM2! rhostar,bq_1,bt_1, & +!CM2! cd_surft(:,n),ch_surft(:,n),cd_std(:,n), & +!CM2! v_s_surft(:,n),v_s_std(:,n),recip_l_mo_surft(:,n), & +!CM2! u_s_iter_surft(:,n) & +!CM2! ) +!CM2!END DO +!CM2! +!CM2!! As roughness length have been changed by vegetation drag effect, effective +!CM2!! roughness length should be updated. +!CM2!DO n = 1,nsurft +!CM2! IF (l_vegdrag_surft(n)) THEN +!CM2! z0m_surft(:,n) = z0m_eff_surft(:,n) +!CM2! IF (formdrag == effective_z0) THEN +!CM2! CALL sf_orog ( & +!CM2! land_pts,surft_pts(n),land_index,surft_index(:,n), & +!CM2! ho2r2_orog,rib_surft(:,n),sil_orog_land,z0m_surft(:,n),z1_uv, & +!CM2! wind_profile_factor(:,n),z0m_eff_surft(:,n) & +!CM2! ) +!CM2! END IF +!CM2! END IF +!CM2!END DO +!CM2! +!CM2!!$OMP PARALLEL IF(nsurft > 1) DEFAULT(NONE) PRIVATE(k, l, n) & +!CM2!!$OMP SHARED(cor_mo_iter, nsurft, surft_pts, surft_index, & +!CM2!!$OMP u_s_iter_surft, u_s_std_surft, v_s_std) +!CM2!IF ( cor_mo_iter >= use_correct_ustar ) THEN +!CM2! ! Use correct "standard" ustar +!CM2!!$OMP DO SCHEDULE(STATIC) +!CM2! DO n = 1,nsurft +!CM2! DO k = 1,surft_pts(n) +!CM2! l = surft_index(k,n) +!CM2! u_s_std_surft(l,n) = v_s_std(l,n) +!CM2! END DO +!CM2! END DO +!CM2!!$OMP END DO +!CM2!ELSE +!CM2! ! Use ustar from mid-iteration +!CM2!!$OMP DO SCHEDULE(STATIC) +!CM2! DO n = 1,nsurft +!CM2! DO k = 1,surft_pts(n) +!CM2! l = surft_index(k,n) +!CM2! u_s_std_surft(l,n) = u_s_iter_surft(l,n) +!CM2! END DO +!CM2! END DO +!CM2!!$OMP END DO +!CM2!END IF +!CM2!!$OMP END PARALLEL + +!----------------------------------------------------------------------- +! 3.5 Recalculate friction velocity for the dust scheme using the +! bare soil roughness length if using only 1 aggregated tile +!----------------------------------------------------------------------- + +!CM3#55-27 +!IF ((l_dust .OR. l_dust_diag) .AND. l_aggregate) THEN +! +! n = 1 +! ! Calculate z0m and z0h for bare soil +! IF (l_vary_z0m_soil) THEN +!!$OMP PARALLEL DO IF(surft_pts(n) > 1) DEFAULT(NONE) PRIVATE(k, l) & +!!$OMP SHARED(n, soil, surft_pts, surft_index, z0m_soil_in, & +!!$OMP z0h_soil,z0h_z0m, z0m_soil, wind_profile_fac_soil) & +!!$OMP SCHEDULE(STATIC) +! DO k = 1, surft_pts(n) +! l = surft_index(k,n) +! z0m_soil(l,n) = z0m_soil_in(l) +! z0h_soil(l,n) = z0h_z0m(soil) * z0m_soil(l,n) +! ! Set wind profile factor to 1 as not using orog term in z0m +! wind_profile_fac_soil(l,n) = 1.0 +! END DO +!!$OMP END PARALLEL DO +! ELSE +!!$OMP PARALLEL DO IF(surft_pts(n) > 1) DEFAULT(NONE) PRIVATE(k, l) & +!!$OMP SHARED(n, soil, surft_pts, surft_index, z0_soil, z0h_soil, & +!!$OMP z0h_z0m, z0m_soil, wind_profile_fac_soil) & +!!$OMP SCHEDULE(STATIC) +! DO k = 1, surft_pts(n) +! l = surft_index(k,n) +! z0m_soil(l,n) = z0_soil +! z0h_soil(l,n) = z0h_z0m(soil) * z0m_soil(l,n) +! ! Set wind profile factor to 1 as not using orog term in z0m +! wind_profile_fac_soil(l,n) = 1.0 +! END DO +!!$OMP END PARALLEL DO +! END IF + +! ! Call fcdch again to calculate dust friction velocity on bare soil. +! ! The canopy drag scheme is not available on the aggregated tile +! ! and is disabled. +! l_vegdrag_active_here = .FALSE. +! CALL fcdch ( & +! cor_mo_iter,land_pts,surft_pts(n), & +! surft_index(:,n),land_index, & +! db_surft(:,n),vshr_land, & +! z0m_soil(:,n),z0h_soil(:,n),zdt_dummy,zh, & +! z1_uv,z1_uv_top,z1_tq,z1_tq_top,wind_profile_fac_soil(:,n), & +! ddmfx,ip_ss_solid,charnock, & +! charnock_w, & +! l_vegdrag_active_here,array_zero,array_zero, & +! nsnow_surft(:,n),n,.FALSE.,cansnowtile(n),l_soil_point, & +! canopy(:,n),catch(:,n),flake(:,n),gc_surft(:,n), & +! snowdep_surft(:,n),snow_surft(:,n),canhc_surf(:,n), & +! dzsurf(:,n),qstar_surft(:,n),q_elev(:,n),radnet_surft(:,n), & +! snowdepth_surft(:,n),timestep,t_elev(:,n),tsurf(:,n),tstar_surft(:,n), & +! vfrac_surft(:,n),emis_surft(:,n),emis_soil,anthrop_heat_surft(:,n), & +! scaling_urban(:,n),alpha1(:,n),hcons_surf(:,n),ashtf_surft(:,n), & +! rhostar,bq_1,bt_1, & +! ! Following tiled outputs (except v_s_std_soil and u_s_iter_soil) +! ! are dummy variables not needed from this call +! cd_surft_soil(:,n),ch_surft_soil(:,n),cd_std_soil(:,n), & +! v_s_surft_soil(:,n),v_s_std_soil(:,n),recip_l_mo_surft_soil(:,n), & +! u_s_iter_soil(:,n) & +! ) + +!!$OMP PARALLEL IF(nsurft > 1) DEFAULT(NONE) PRIVATE(k, l, n) & +!!$OMP SHARED(cor_mo_iter, nsurft, surft_index, surft_pts, & +!!$OMP u_s_iter_soil, u_s_std_surft, v_s_std_soil) +! IF ( cor_mo_iter >= use_correct_ustar ) THEN +! ! Use correct "standard" ustar +!!$OMP DO SCHEDULE(STATIC) +! DO n = 1,nsurft +! DO k = 1,surft_pts(n) +! l = surft_index(k,n) +! u_s_std_surft(l,n) = v_s_std_soil(l,n) +! END DO +! END DO +!!$OMP END DO +! ELSE +! ! Use ustar from mid-iteration +!!$OMP DO SCHEDULE(STATIC) +! DO n = 1,nsurft +! DO k = 1,surft_pts(n) +! l = surft_index(k,n) +! u_s_std_surft(l,n) = u_s_iter_soil(l,n) +! END DO +! END DO +!!$OMP END DO +! END IF +!!$OMP END PARALLEL +! +!END IF + +!----------------------------------------------------------------------- +! 3.6 Recalculate cd, ch etc. using z0h=z0h_classic. The parameters +! calculated using this additional roughness length are for +! CLASSIC aerosol deposition only. +!----------------------------------------------------------------------- +!CM3#55-28 - we've implemented CABLE estimates for this earlier +! remove to facilitate simplification of ashtf evaluations +!IF (l_aero_classic) THEN +! ! The canopy drag scheme is not supported for this aerosol scheme and +! ! is turned off. +! l_vegdrag_active_here = .FALSE. +! ! Land tiles +! DO n = 1,nsurft +! CALL fcdch ( & +! ! Input variables identical to main call except using different z0h +! cor_mo_iter,land_pts,surft_pts(n), & +! surft_index(:,n),land_index, & +! db_surft(:,n),vshr_land, & +! z0m_eff_surft(:,n),z0h_surft_classic(:,n),zdt_dummy,zh, & +! z1_uv,z1_uv_top,z1_tq,z1_tq_top, & +! wind_profile_factor(:,n), & +! ddmfx,ip_ss_solid,charnock, & +! charnock_w, & +! l_vegdrag_active_here,array_zero,array_zero, & +! nsnow_surft(:,n),n,.FALSE.,cansnowtile(n),l_soil_point, & +! canopy(:,n),catch(:,n),flake(:,n),gc_surft(:,n), & +! snowdep_surft(:,n),snow_surft(:,n),canhc_surf(:,n), & +! dzsurf(:,n),qstar_surft(:,n),q_elev(:,n),radnet_surft(:,n), & +! snowdepth_surft(:,n),timestep,t_elev(:,n),tsurf(:,n),tstar_surft(:,n), & +! vfrac_surft(:,n),emis_surft(:,n),emis_soil,anthrop_heat_surft(:,n), & +! scaling_urban(:,n),alpha1(:,n),hcons_surf(:,n),ashtf_surft(:,n), & +! rhostar,bq_1,bt_1, & +! ! Following tiled outputs (except cd_std_classic and ch_surft_classic) +! ! are dummy variables not needed from this call +! cd_surft_classic(:,n),ch_surft_classic(:,n), & +! cd_std_classic(:,n),v_s_surft_classic(:,n), & +! v_s_std_classic(:,n),recip_l_mo_surft_classic(:,n), & +! u_s_iter_classic(:,n) & +! ) +! END DO +!END IF + +!----------------------------------------------------------------------- +! Calculate gridbox-means of transfer coefficients. +!----------------------------------------------------------------------- + +! Land tiles +DO n = 1,nsurft + DO k = 1,surft_pts(n) + l = surft_index(k,n) + j=(land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + cd_land(i,j) = cd_land(i,j) + tile_frac(l,n) * cd_surft(l,n) + ch_land(i,j) = ch_land(i,j) + tile_frac(l,n) * ch_surft(l,n) + END DO +END DO + +! aerodynamic resistance diagnostic +IF (sf_diag%l_ra) THEN + DO l = 1,land_pts + j=(land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + sf_diag%ra(l) = 1.0 / (ch_land(i,j) * vshr_land(i,j)) + END DO +END IF + +!----------------------------------------------------------------------- +! 4.3 Calculate the surface exchange coefficients RHOK(*) and +! resistances for use in CLASSIC aerosol scheme +! (Note that CD_STD, CH and VSHR should never = 0) +! RHOSTAR * CD * VSHR stored for diagnostic output before +! horizontal interpolation. +!----------------------------------------------------------------------- + +! Land tiles +DO n = 1,nsurft + DO k = 1,surft_pts(n) + l = surft_index(k,n) + j=(land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + rhokm_1_surft(l,n) = rhostar_mom(i,j) * cd_surft(l,n) * vshr_land(i,j) + ! ! P243.124 + rhokm_land(i,j) = rhokm_land(i,j) + & + tile_frac(l,n) * rhokm_1_surft(l,n) + rhokh_surft(l,n) = rhostar_mom(i,j) * ch_surft(l,n) * vshr_land(i,j) + ! ! P243.125 + END DO +END DO + +!----------------------------------------------------------------------- +! Calculate local and gridbox-average surface fluxes of heat and +! moisture. +!----------------------------------------------------------------------- + +! Adjust ASHTF for sens. heat flux to ground beneath coniferous canopy +!CM3#55-missed in first pass - remove as can_model==4 not relevant to CABLE +!IF ( .NOT. l_aggregate .AND. can_model == 4) THEN +! DO n = 1,npft +! IF ( cansnowtile(n) ) THEN +!!$OMP PARALLEL DO IF(surft_pts(n) > 1) DEFAULT(NONE) PRIVATE( k, l, j, i) & +!!$OMP SHARED(n, cd_surft, land_index, rhokh_can, rhostar, surft_pts, & +!!$OMP surft_index, t_i_length, vshr_land, cp) SCHEDULE(STATIC) +! DO k = 1,surft_pts(n) +! l = surft_index(k,n) +! j=(land_index(l) - 1) / t_i_length + 1 +! i = land_index(l) - (j-1) * t_i_length +! rhokh_can(l,n) = rhostar(i,j) * cp / & +! (43.0 / (SQRT(cd_surft(l,n)) * vshr_land(i,j))) +! END DO +!!$OMP END PARALLEL DO +! END IF +! END DO +!END IF + +!----------------------------------------------------------------------- +! 4.1 Recalculate RESFT using "true" CH and EPDT for land tiles +!----------------------------------------------------------------------- + +lh0 = lc +sea_point = 0.0 + +DO n = 1,nsurft +!!$OMP PARALLEL DO IF(surft_pts(n) > 1) DEFAULT(NONE) PRIVATE(i, j, k, l) & +!!$OMP SHARED(ch_surft, land_index, qstar_surft, qw_1, dq, epdt,n, & +!!$OMP rhostar, surft_pts, surft_index, timestep, t_i_length, & +!!$OMP vshr_land) SCHEDULE(STATIC) + + !CM3#55-29 - we do not need ashtf_surft or ashtf_prime_surft to take a true value + ! only non-zero is needed - see above - remove sf_flux_cbl + !! Calcualte humidity gradient and rate of change of potential evaporation + !! with time + !DO k = 1,surft_pts(n) + ! l = surft_index(k,n) + ! j = (land_index(l) - 1) / t_i_length + 1 + ! i = land_index(l) - (j-1) * t_i_length + ! dq(l) = qw_1(i,j) - qstar_surft(l,n) + ! epdt(l) = - rhostar(i,j) * ch_surft(l,n) * vshr_land(i,j) & + ! *dq(l) * timestep + !END DO +!!$OMP END PARALLEL DO + +! ! We should only attempt to access sf_diag%resfs_stom(:,n) if it has +! ! been fully allocated. +! IF (sf_diag%l_et_stom .OR. sf_diag%l_et_stom_surft) THEN +! n_diag = n +! ELSE +! n_diag = 1 +! END IF + +!CABLE_LSM:CM2{ This is all being done above BUT to ashtf_surft - in CM2 we used +!elements of sf_flux to update ashtf_prime and others, however it seems the +!others were unnecessary +!CM2! CALL sf_resist ( & +!CM2! land_pts,surft_pts(n),land_index,surft_index(:,n),cansnowtile(n), & +!CM2! canopy(:,n),catch(:,n),ch_surft(:,n),dq,epdt,flake(:,n),gc_surft(:,n), & +!CM2! gc_stom_surft(:,n),snowdep_surft(:,n),snow_surft(:,n),vshr_land, & +!CM2! fraca(:,n),resfs(:,n),resft(:,n), & +!CM2! sf_diag%resfs_stom(:,n_diag),sf_diag%l_et_stom,sf_diag%l_et_stom_surft) + +! CALL sf_flux_cbl ( & +! land_pts,surft_pts(n), & +! land_index,surft_index(:,n), & +! nsnow_surft(:,n),n,canhc_surf(:,n),dzsurf(:,n),hcons_surf(:,n), & +! ashtf_surft(:,n),qstar_surft(:,n),q_elev(:,n), & +! radnet_surft(:,n),resft(:,n),rhokh_surft(:,n),l_soil_point, & +! snowdepth_surft(:,n),timestep,t_elev(:,n),tsurf(:,n), & +! tstar_surft(:,n),vfrac_surft(:,n),rhokh_can(:,n),z0h_surft(:,n), & +! z0m_eff_surft(:,n),zdt_surft(:,n),z1_tq,lh0,emis_surft(:,n),emis_soil, & +! 1.0,anthrop_heat_surft(:,n),scaling_urban(:,n),l_vegdrag_surft(n), & +! alpha1(:,n),ashtf_prime_surft(:,n),fqw_surft(:,n), & +! epot_surft(:,n),ftl_surft(:,n),dtstar_surft(:,n),sea_point & +! ) + + ! update gridbox means and diagnostics +!$OMP PARALLEL DO IF(surft_pts(n) > 1) DEFAULT(NONE) PRIVATE(i, j, k, l) & +!$OMP SHARED(n, surft_pts, surft_index, land_index, t_i_length, & +!$OMP l_irrig_dmd, l_aggregate, can_model, cansnowtile, & +!$OMP snow_surft, resfs_irr_surft, resfs, gc_irr_surft, & +!$OMP ftl_1, flandg, tile_frac, ftl_surft, fqw_1, fqw_surft, & +!$OMP ch_surft, vshr_land) SCHEDULE(STATIC) + DO k = 1,surft_pts(n) + l = surft_index(k,n) + j = (land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + + ! Calculate gridbox mean fluxes of heat and moisture + ftl_1(i,j) = ftl_1(i,j) + flandg(i,j) * tile_frac(l,n) * ftl_surft(l,n) + fqw_1(i,j) = fqw_1(i,j) + flandg(i,j) * tile_frac(l,n) * fqw_surft(l,n) + + !CM3#55-29 - may need the OMP directives changed + !! Calculate surface resistance term for irrigated surfaces + !IF (l_irrig_dmd) THEN + ! IF ( .NOT. l_aggregate .AND. can_model == 4 .AND. cansnowtile(n) .AND. & + ! snow_surft(l,n) > 0.0) THEN + ! resfs_irr_surft(l,n) = resfs(l,n) + ! ELSE + ! resfs_irr_surft(l,n) = gc_irr_surft(l,n) / & + ! ( gc_irr_surft(l,n) + ch_surft(l,n) * vshr_land(i,j) ) + ! END IF + !END IF + END DO +!$OMP END PARALLEL DO + +END DO + +! Calculate surface momentum flux +IF (sf_diag%l_tau_surft) THEN + DO n = 1,nsurft +!$OMP PARALLEL DO IF(surft_pts(n) > 1) DEFAULT(NONE) PRIVATE(i, j, k, l) & +!$OMP SHARED(n, surft_pts, surft_index, land_index, t_i_length, & +!$OMP rhokm_1_surft, vshr_land, sf_diag) SCHEDULE(STATIC) + DO k = 1,surft_pts(n) + l = surft_index(k,n) + j = (land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + sf_diag%tau_surft(l,n) = rhokm_1_surft(l,n) * vshr_land(i,j) + END DO +!$OMP END PARALLEL DO + END DO +END IF + +! Set surface stress on tiles diagnostic +IF (sf_diag%l_tau_1) THEN + DO n = 1,nsurft +!$OMP PARALLEL DO IF(surft_pts(n) > 1) DEFAULT(NONE) PRIVATE(i, j, k, l) & +!$OMP SHARED(n, surft_pts, surft_index, land_index, t_i_length, & +!$OMP flandg, tile_frac, rhokm_1_surft, vshr_land, & +!$OMP sf_diag) SCHEDULE(STATIC) + DO k = 1,surft_pts(n) + l = surft_index(k,n) + j=(land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + sf_diag%tau_1(i,j) = sf_diag%tau_1(i,j) + & + flandg(i,j) * tile_frac(l,n) * & + rhokm_1_surft(l,n) * vshr_land(i,j) + END DO +!$OMP END PARALLEL DO + END DO +END IF + + +!----------------------------------------------------------------------- +! 4.4 Calculate the standard deviations of layer 1 turbulent +! fluctuations of temperature and humidity using approximate +! formulae from first order closure. +!----------------------------------------------------------------------- + +! Land tiles +DO n = 1,nsurft + CALL stdev1 ( & + land_pts,surft_pts(n),land_index,surft_index(:,n),flandg, & + bq_1,bt_1,fqw_surft(:,n),ftl_surft(:,n),rhokm_1_surft(:,n), & + rhostar,vshr_land,z0m_surft(:,n),z1_tq,tile_frac(:,n), & + q1_sd,t1_sd & + ) +END DO + +!----------------------------------------------------------------------- +! Call SFL_INT to calculate CDR10M and CHR1P5M - interpolation coeffs +! used to calculate screen temperature, humidity and 10m winds. +!----------------------------------------------------------------------- + +! Set flag if cdr10m is to be calculated for use with snow unloading. +! If l_fix_wind_snow=F this calculation will depend on the su10 and sv10 +! switches in sf_diag. +l_cdr10m_snow = .FALSE. +!CM3#55-31 +!IF ( l_fix_wind_snow ) THEN +! DO n = 1,nsurft +! IF ( canSnowTile(n) .AND. unload_rate_u(n) /= 0.0 ) l_cdr10m_snow = .TRUE. +! END DO +!END IF + +IF (sf_diag%suv10m_n) THEN +!$OMP PARALLEL DO SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(i,j) & +!$OMP SHARED(pdims,sf_diag) + DO j = pdims%j_start,pdims%j_end + DO i = pdims%i_start,pdims%i_end + sf_diag%cdr10m_n(i,j) = 0.0 + sf_diag%cd10m_n(i,j) = 0.0 + END DO + END DO +!$OMP END PARALLEL DO +END IF + +! Land tiles +IF (sf_diag%su10 .OR. sf_diag%sv10 .OR. sf_diag%sq1p5 .OR. & + sf_diag%st1p5 .OR. sf_diag%suv10m_n .OR. & + l_cdr10m_snow .OR. & + (IScrnTDiag == IP_ScrnDecpl2) .OR. & + (IScrnTDiag == IP_ScrnDecpl3) ) THEN + DO n = 1,nsurft + + !CM2!!CABLE_LSM:land_pts=0 crashes + !CM3#55 - need to look at this in more detail - not convinced this is correct + CALL sfl_int ( & + land_pts,surft_pts(n),l_cdr10m_snow,surft_index(:,n),land_index,flandg, & + vshr_land,cd_std(:,n),cd_surft(:,n),ch_surft(:,n), & + tile_frac(:,n), & + z0m_eff_surft(:,n),z0m_surft(:,n),z0h_surft(:,n), & + recip_l_mo_surft(:,n), & + v_s_surft(:,n),v_s_std(:,n), & + z1_uv,z1_tq,db_surft(:,n), & + sf_diag, & + cdr10m,sf_diag%cdr10m_n,sf_diag%cd10m_n,chr1p5m(:,n) & + ) + END DO + +END IF + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) + +RETURN +END SUBROUTINE cable_land_sf_explicit +END MODULE cable_land_sf_explicit_mod diff --git a/src/coupled/AM3/control/cable/cable_land/explicit/sf_flux_mod_cbl.F90 b/src/coupled/AM3/control/cable/cable_land/explicit/sf_flux_mod_cbl.F90 new file mode 100644 index 000000000..0cf1d952f --- /dev/null +++ b/src/coupled/AM3/control/cable/cable_land/explicit/sf_flux_mod_cbl.F90 @@ -0,0 +1,270 @@ +! *****************************COPYRIGHT******************************* +! (C) Crown copyright Met Office. All rights reserved. +! For further details please refer to the file COPYRIGHT.txt +! which you should have received as part of this distribution. +! *****************************COPYRIGHT******************************* +! SUBROUTINE SF_FLUX ----------------------------------------------- +! Description: +! Subroutines SF_FLUX to calculate explicit surface fluxes of +! heat and moisture +!----------------------------------------------------------------------- +MODULE sf_flux_mod_cbl +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='SF_FLUX_MOD' + +CONTAINS +SUBROUTINE sf_flux_cbl ( & + points,surft_pts,pts_index,surft_index, & + nsnow,n,canhc,dzsurf,hcons,ashtf,qstar,q_elev,radnet,resft, & + rhokh_1,l_soil_point,snowdepth,timestep, & + t_elev,ts1_elev,tstar,vfrac,rhokh_can, & + z0h,z0m_eff,zdt,z1_tq,lh0,emis_surft,emis_soil, & + salinityfactor,anthrop_heat,scaling_urban,l_vegdrag, & + alpha1,ashtf_prime,fqw_1,epot,ftl_1,dtstar,sea_point & + ) + +USE atm_fields_bounds_mod, ONLY: tdims +USE theta_field_sizes, ONLY: t_i_length + +USE csigma, ONLY: sbcon +USE planet_constants_mod, ONLY: grcp, cp +USE jules_snow_mod, ONLY: snow_hcon +USE jules_surface_mod, ONLY: ls +USE jules_surface_types_mod, ONLY: urban_roof +USE jules_vegetation_mod, ONLY: l_vegcan_soilfx +USE jules_urban_mod, ONLY: l_moruses_storage +USE jules_surface_mod, ONLY: l_aggregate, l_epot_corr +USE jules_science_fixes_mod, ONLY: l_fix_moruses_roof_rad_coupling + +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook +USE um_types, ONLY: real_jlslsm + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: & + points & + ! IN Total number of points. +,surft_pts & + ! IN Number of tile points. +,pts_index(points) & + ! IN Index of points. +,surft_index(points) & + ! IN Index of tile points. +,nsnow(points) & + ! IN Number of snow layers +,n ! IN Tile number. + ! For sea and sea-ice this = 0 + +LOGICAL, INTENT(IN) :: & + l_soil_point(points) & + ! IN Boolean to test for soil points +,l_vegdrag + ! IN Option for vegetation canopy drag scheme. + +REAL(KIND=real_jlslsm), INTENT(IN) :: & + canhc(points) & + ! IN Areal heat capacity of canopy (J/K/m2). +,dzsurf(points) & + ! IN Surface layer thickness (m). +,ashtf(points) & + ! IN Coefficient to calculate surface + ! heat flux into soil (W/m2/K). +,qstar(points) & + ! IN Surface qsat. +,q_elev(points) & + ! IN Total water content of lowest + ! atmospheric layer (kg per kg air). +,radnet(points) & + ! IN Net surface radiation (W/m2) positive + ! downwards +,resft(points) & + ! IN Total resistance factor. +,rhokh_1(points) & + ! IN Surface exchange coefficient. +,snowdepth(points) & + ! IN Snow depth (on ground) (m) +,timestep & + ! IN Timestep (s). +,t_elev(points) & + ! IN Liquid/frozen water temperature for + ! lowest atmospheric layer (K). +,ts1_elev(points) & + ! IN Temperature of surface layer (K). +,tstar(points) & + ! IN Surface temperature (K). +,vfrac(points) & + ! IN Fractional canopy coverage. +,rhokh_can(points) & + ! IN Exchange coefficient for canopy air + ! to surface +,z0h(points) & + ! IN Roughness length for heat and moisture +,z0m_eff(points) & + ! IN Effective roughness length for momentum +,zdt(points) & + ! IN Difference between the canopy height and + ! displacement height (m) +,z1_tq(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! IN Height of lowest atmospheric level (m). +,emis_surft(points) & + ! IN Emissivity for land tiles +,emis_soil(points) & + ! IN Emissivity of underlying soil +,lh0 & + ! IN Latent heat for snow free surface + ! =LS for sea-ice, =LC otherwise +,salinityfactor & + ! IN Factor allowing for the effect of the + ! salinity of sea water on the + ! evaporative flux. +,anthrop_heat(points) & + ! IN Anthropogenic contribution to surface + ! heat flux (W/m2). Zero except for + ! urban and L_ANTHROP_HEAT=.true. + ! or for urban_canyon & urban_roof when + ! l_urban2t=.true. +,scaling_urban(points) & + ! IN MORUSES: ground heat flux scaling; + ! canyon tile only coupled to soil. + ! This equals 1.0 except for urban tiles when + ! MORUSES is used. +,alpha1(points) + ! IN Gradient of saturated specific humidity + ! with respect to temperature between the + ! bottom model layer and the surface. + +REAL(KIND=real_jlslsm) :: & + hcons(points) + ! IN Soil thermal conductivity (W/m/K). + +REAL(KIND=real_jlslsm), INTENT(IN OUT) :: & + ashtf_prime(points) + ! INOUT Adjusted SEB coefficient + +REAL(KIND=real_jlslsm), INTENT(OUT) :: & + fqw_1(points) & + ! OUT Local surface flux of QW (kg/m2/s). +,epot(points) & + ! OUT +,ftl_1(points) & + ! OUT Local surface flux of TL. +,dtstar(points) ! OUT Change in TSTAR over timestep + +REAL(KIND=real_jlslsm) :: & + sea_point ! =1.0 IF SEA POINT, =0.0 OTHERWISE + + +! Workspace +REAL(KIND=real_jlslsm) :: & +dtstar_pot(points) & + ! Change in TSTAR over timestep that is + ! appropriate for the potential evaporation +,surf_ht_flux ! Flux of heat from surface to sub-surface + +! Scalars +INTEGER :: & + i,j & + ! Horizontal field index. +,k & + ! Tile field index. +,l ! Points field index. + +REAL(KIND=real_jlslsm) :: & + lh ! Latent heat (J/K/kg). + +REAL(KIND=real_jlslsm) :: lambda + ! Attenuation factor for influence of soil + ! temperature + +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='SF_FLUX' + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +!jh!!$OMP PARALLEL & +!jh!!$OMP DEFAULT(SHARED) & +!jh!!$OMP PRIVATE(l,k,lambda,lh,surf_ht_flux,i,j) + +!----------------------------------------------------------------------- +!! 0 initialise +!----------------------------------------------------------------------- +!jh!!$OMP DO SCHEDULE(STATIC) +!jh!DO l = 1,points +!jh! ftl_1(l) = 0.0 +!jh! epot(l) = 0.0 +!jh!END DO +!jh!!$OMP END DO + +! If conduction in the soil beneath the vegetative canopy is not +! explicitly considered, the attentuation facor may be set equal +! to 1 everywhere. +lambda = 1.0 + +!jh!!$OMP DO SCHEDULE(STATIC) +DO k = 1,surft_pts + l = surft_index(k) + j=(pts_index(l) - 1) / t_i_length + 1 + i = pts_index(l) - (j-1) * t_i_length + + ! Calculate the attenuation factor if different from 1. + IF (l_vegcan_soilfx) & + lambda = 2.0 * hcons(l) / dzsurf(l) / & + ( 2.0 * hcons(l) / dzsurf(l) + rhokh_can(l) + & + 4.0 * emis_soil(l) * emis_surft(l) * sbcon * & + tstar(l)**3 ) + + lh = lh0 + IF (snowdepth(l) > 0.0) lh = ls + + !jh!IF (l_vegdrag) THEN + !jh! ftl_1(l) = rhokh_1(l) * (tstar(l) - t_elev(l) - & + !jh! grcp * (z1_tq(i,j) + zdt(l) - z0h(l))) + !jh!ELSE + !jh! ftl_1(l) = rhokh_1(l) * (tstar(l) - t_elev(l) - & + !jh! grcp * (z1_tq(i,j) + z0m_eff(l) - z0h(l))) + !jh!END IF + !jh!epot(l) = rhokh_1(l) * (salinityfactor * qstar(l) - q_elev(l)) + !jh!fqw_1(l) = resft(l) * epot(l) + + !jh!surf_ht_flux = ((1.0 - vfrac(l)) * ashtf(l) + & + !jh! vfrac(l) * rhokh_can(l) * lambda ) * & + !jh! (tstar(l) - ts1_elev(l)) + & + !jh! vfrac(l) * emis_soil(l) * emis_surft(l) * sbcon * & + !jh! lambda * (tstar(l)**4.0 - ts1_elev(l)**4.0) + + + ashtf_prime(l) = 4.0 * (1.0 + lambda * emis_soil(l) * vfrac(l)) * & + emis_surft(l) * sbcon * tstar(l)**3.0 + & + lambda * vfrac(l) * rhokh_can(l) + & + (1.0 - vfrac(l)) * ashtf(l) + canhc(l) / timestep + + !jh!dtstar(l) = (radnet(l) + anthrop_heat(l) - cp * ftl_1(l) - & + !jh! lh * fqw_1(l) - surf_ht_flux) / & + !jh! ( rhokh_1(l) * (cp + lh * alpha1(l) * resft(l)) + & + !jh! ashtf_prime(l) ) + + !jh!! Correction to surface fluxes due to change in surface temperature + !jh!ftl_1(l) = ftl_1(l) + rhokh_1(l) * dtstar(l) * (1.0 - sea_point) + !jh!fqw_1(l) = fqw_1(l) + resft(l) * rhokh_1(l) * alpha1(l) * & + !jh! dtstar(l) * (1.0 - sea_point) + + !jh!IF (l_epot_corr) THEN + !jh! dtstar_pot(l) = (radnet(l) + anthrop_heat(l) - cp * ftl_1(l) - & + !jh! lh * epot(l) - surf_ht_flux) / & + !jh! ( rhokh_1(l) * (cp + lh * alpha1(l)) + ashtf_prime(l) ) + !jh! epot(l) = epot(l) + rhokh_1(l) * alpha1(l) * dtstar_pot(l) + !jh!ELSE + !jh! epot(l) = epot(l) + rhokh_1(l) * alpha1(l) * dtstar(l) + !jh!END IF + +END DO +!jh!!$OMP END DO +!jh!!$OMP END PARALLEL + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE sf_flux_cbl +END MODULE sf_flux_mod_cbl diff --git a/src/coupled/AM3/control/cable/cable_land/extra/hydrol_mod_cbl.F90 b/src/coupled/AM3/control/cable/cable_land/extra/hydrol_mod_cbl.F90 new file mode 100644 index 000000000..7545728a0 --- /dev/null +++ b/src/coupled/AM3/control/cable/cable_land/extra/hydrol_mod_cbl.F90 @@ -0,0 +1,1075 @@ +MODULE hydrol_mod_cbl +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='HYDROL_MOD' + +CONTAINS + +SUBROUTINE hydrol_cbl ( & + land_pts, soil_pts, lice_pts, sm_levels, npft, nsurft, dim_cs1, & + asteps_since_triffid, timestep, & + l_inland, l_pdm, l_soil_sat_down, l_top, stf_sub_surf_roff, & + soil_index, lice_index, & + surft_pts, surft_index, nsnow_surft, & + bexp_soilt, hcap_soilt, hcon_soilt, & + satcon_soilt, sathh_soilt, & + smvcst_soilt, smvcwt_soilt, & + catch_surft, frac_irr_soilt, infil_surft, & + non_lake_frac, slope_gb, tile_frac, & + con_rainfrac_land, con_rain_land, ls_rainfrac_land, ls_rain_land, & + surf_ht_flux_ld, & + ecan_surft, ext_irr_soilt, ext_soilt, & + snowdepth_surft, melt_surft, snow_melt, & + snow_soil_htf, & + a_fsat_soilt, c_fsat_soilt, a_fwet_soilt, c_fwet_soilt, & + fexp_soilt, ti_mean_soilt, & + npp_soilt, inlandout_atm_gb, & + canopy_surft, smcl_soilt, sthf_soilt, & + sthu_soilt, sthu_irr_soilt, tsoil_deep_gb, & + t_soil_soilt, t_soil_soilt_acc, tsurf_elev_surft, & + fsat_soilt, fwetl_soilt, sthzw_soilt, zw_soilt, & + cs_pool_soilt,resp_s_soilt, & + cs_ch4_soilt, fch4_wetl_acc_soilt, & + substr_ch4, mic_ch4, mic_act_ch4, acclim_ch4, & + n_inorg_avail_pft, n_inorg_soilt_lyrs, & + n_leach_gb_acc, & + canopy_gb, smc_soilt, & + drain_soilt, dun_roff_soilt, sub_surf_roff_gb, & + surf_roff_gb, tot_tfall_gb, tot_tfall_surft, & + w_flux_soilt, qbase_soilt, qbase_l_soilt, qbase_zw_soilt, & + fch4_wetl_soilt, fch4_wetl_cs_soilt, & + fch4_wetl_npp_soilt, fch4_wetl_resps_soilt, & + n_leach_soilt, & + progs_snow_surft, snow_mass_gb, work_cbl ) + +!Use in relevant subroutines +USE ancil_info, ONLY: dim_cslayer, nsoilt +USE calc_baseflow_jules_mod, ONLY: calc_baseflow_jules +USE calc_zw_inund_mod, ONLY: calc_zw_inund +USE ch4_wetl_mod, ONLY: ch4_wetl +USE elev_htc_mod, ONLY: elev_htc +USE ereport_mod, ONLY: ereport +USE ice_htc_mod, ONLY: ice_htc +USE n_leach_mod, ONLY: n_leach +USE soil_hyd_wt_mod, ONLY: soil_hyd_wt +USE soil_hyd_update_mod, ONLY: soil_hyd_update +USE soil_hyd_mod, ONLY: soil_hyd +USE soil_htc_mod, ONLY: soil_htc +USE soilmc_mod, ONLY: soilmc +USE soilt_mod, ONLY: soilt +USE surf_hyd_mod, ONLY: surf_hyd +USE um_types, ONLY: real_jlslsm +USE water_constants_mod, ONLY: rho_water ! Density of pure water (kg/m3). + +USE jules_hydrology_mod, ONLY: l_wetland_unfrozen, ti_max, zw_max +USE jules_vegetation_mod, ONLY: l_nitrogen +USE jules_irrig_mod, ONLY: l_irrig_dmd +USE jules_surface_mod, ONLY: l_elev_land_ice + +USE jules_soil_biogeochem_mod, ONLY: & + ! imported scalar parameters + soil_model_ecosse, soil_model_rothc, soil_model_1pool, & + ! imported scalar variables + soil_bgc_model, l_ch4_tlayered, l_layeredc, dim_ch4layer + +USE jules_soil_mod, ONLY: & + dzsoil, & + ! Thicknesses of the soil layers (m). + dzsoil_elev, ns_deep + + +#if !defined(UM_JULES) +USE update_mod, ONLY: l_imogen +USE model_time_mod, ONLY: timestep_len +#endif + +!CABLE_LSM: Make avail CABLE hydrology interface subr to CALL +USE cable_hyd_main_mod, ONLY: cable_hyd_main +USE work_vars_mod_cbl, ONLY: work_vars_type ! and some kept thru timestep + +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook + +IMPLICIT NONE + +!----------------------------------------------------------------------------- +! The order of arguments and declarations should follow UMDP3. +! Within that, where possible variables should be grouped so that related +! variables (e.g. from the same area of science) are together. +!----------------------------------------------------------------------------- + +!----------------------------------------------------------------------------- +! Scalar arguments with INTENT(IN): +!----------------------------------------------------------------------------- +INTEGER, INTENT(IN) :: & + land_pts, & + ! Number of gridpoints. + soil_pts, & + ! Number of soil points. + lice_pts, & + ! Number of land ice points. + sm_levels, & + ! Number of soil moisture levels. + npft, & + ! Number of plant functional types + nsurft, & + ! Number of tiles + dim_cs1, & + ! Number of soil carbon pools + asteps_since_triffid + ! Number of atmospheric timesteps since last call to TRIFFID. + +REAL(KIND=real_jlslsm), INTENT(IN) :: & + timestep + ! Model timestep (s). + +LOGICAL , INTENT(IN) :: & + l_inland, & + ! True if re-routing inland basin flow to soil moisture. + l_pdm, & + ! Flag for PDM hydrology. + l_soil_sat_down, & + ! Switch controlling direction of movement of + ! soil moisture in excess of saturation. + l_top, & + ! Flag for TOPMODEL-based hydrology. + stf_sub_surf_roff + ! Stash flag for sub-surface runoff. + +TYPE(work_vars_type), INTENT(IN) :: work_cbl +!----------------------------------------------------------------------------- +! Array arguments with INTENT(IN): +!----------------------------------------------------------------------------- +INTEGER, INTENT(IN) :: & + soil_index(land_pts), & + ! Array of soil points. + lice_index(land_pts), & + ! Array of land ice points. + surft_pts(nsurft), & + ! Number of tile points. + surft_index(land_pts,nsurft), & + ! Index of tile points. + nsnow_surft(land_pts,nsurft) + ! Number of snow layers + +! Soil characteristics. +REAL(KIND=real_jlslsm), INTENT(IN) :: & + bexp_soilt(land_pts,nsoilt,sm_levels), & + ! Brooks & Corey exponent. + hcap_soilt(land_pts,nsoilt,sm_levels), & + ! Soil heat capacity (J/K/m3). + hcon_soilt(land_pts,nsoilt,0:sm_levels), & + ! Soil thermal conductivity (W/m/K). + satcon_soilt(land_pts,nsoilt,0:sm_levels), & + ! Saturated hydraulic conductivity (kg/m2/s). + sathh_soilt(land_pts,nsoilt,sm_levels), & + ! Saturated soil water pressure (m). + smvcst_soilt(land_pts,nsoilt,sm_levels), & + ! Volumetric soil moisture concentration at saturation (m3 H2O/m3 soil). + smvcwt_soilt(land_pts,nsoilt,sm_levels) + ! Volumetric soil moisture concentration below which + ! stomata close (m3 H2O/m3 soil). + +! Surface characteristics. +REAL(KIND=real_jlslsm), INTENT(IN) :: & + catch_surft(land_pts,nsurft), & + ! Canopy/surface capacity of land tiles (kg/m2). + frac_irr_soilt(land_pts, nsoilt), & + ! Irrigation fraction for each soil tile. + infil_surft(land_pts,nsurft), & + ! Maximum surface infiltration (kg m-2 s-1). + non_lake_frac(land_pts), & + ! Sum of fractions of surface tiles linked to soil (i.e. not using FLake) + slope_gb(land_pts), & + ! Terrain slope. + tile_frac(land_pts,nsurft) + ! Tile fractions. + +! Precipitation variables and heat fluxes. +REAL(KIND=real_jlslsm), INTENT(IN) :: & + con_rainfrac_land(land_pts), & + ! Convective rain fraction + con_rain_land(land_pts), & + ! Convective rain (kg/m2/s). + ls_rain_land(land_pts), & + ! Large-scale rain (kg/m2/s). + ls_rainfrac_land(land_pts), & + ! large scale rain fraction + surf_ht_flux_ld(land_pts) + ! Net downward surface heat flux (W/m2). + +! Evaporation variables. +REAL(KIND=real_jlslsm), INTENT(IN) :: & + ecan_surft(land_pts,nsurft), & + ! Canopy evaporation from land tiles (kg/m2/s). + ext_irr_soilt(land_pts,nsoilt,sm_levels), & + ! Extraction of water from each soil layer over irrigation (kg m-2 s-1). + ext_soilt(land_pts,nsoilt,sm_levels) + ! Extraction of water from each soil layer (kg/m2/s). + +! Snow and melt +REAL(KIND=real_jlslsm), INTENT(IN) :: & + snowdepth_surft(land_pts,nsurft), & + ! Snow depth (on ground) (m). + melt_surft(land_pts,nsurft), & + ! Snowmelt on tiles (kg/m2/s). + !snow_melt(land_pts), & + ! ! Snowmelt (kg/m2/s). + ! ! for CABLE this needs to be an INOUT var + snow_soil_htf(land_pts,nsurft) + ! Tiled snowpack-> soil heat flux. +REAL(KIND=real_jlslsm), INTENT(INOUT) :: & + snow_melt(land_pts) + ! Snowmelt (kg/m2/s) + +! TOPMODEL variables. +REAL(KIND=real_jlslsm), INTENT(IN) :: & + a_fsat_soilt(land_pts,nsoilt), & + ! Fitting parameter for Fsat in LSH model. + c_fsat_soilt(land_pts,nsoilt), & + ! Fitting parameter for Fsat in LSH model. + a_fwet_soilt(land_pts,nsoilt), & + ! Fitting parameter for Fwet in LSH model. + c_fwet_soilt(land_pts,nsoilt), & + ! Fitting parameter for Fwet in LSH model. + fexp_soilt(land_pts,nsoilt), & + ! Decay factor in Sat. Conductivity in deep LSH/TOPMODEL layer. + ti_mean_soilt(land_pts,nsoilt) + ! Mean topographic index. + +! Variables related to methane calculation. +REAL(KIND=real_jlslsm), INTENT(IN) :: & + npp_soilt(land_pts,nsoilt) + ! Gridbox mean net primary productivity (kg C/m2/s). + +! Other variables. +REAL(KIND=real_jlslsm), INTENT(IN) :: & + inlandout_atm_gb(land_pts) + ! IN TRIP INLAND BASIN OUTFLOW FOR LAND POINTS ONLY,kg/m2/s=mm. +!----------------------------------------------------------------------------- +! Array arguments with INTENT(IN OUT): +!----------------------------------------------------------------------------- + +! Canopy water. +REAL(KIND=real_jlslsm), INTENT(IN OUT) :: & + canopy_surft(land_pts,nsurft) + ! Canopy water content for land tiles (kg/m2). + +! Soil water and temperature. +REAL(KIND=real_jlslsm), INTENT(IN OUT) :: & + smcl_soilt(land_pts,nsoilt,sm_levels), & + ! Soil moisture content of each +! ! layer (kg/m2). + sthf_soilt(land_pts,nsoilt,sm_levels), & + ! Frozen soil moisture content of +! ! each layer as a fraction of +! ! saturation. + sthu_soilt(land_pts,nsoilt,sm_levels), & + ! Unfrozen soil moisture content of +! ! each layer as a fraction of +! ! saturation. + sthu_irr_soilt(land_pts, nsoilt, sm_levels), & + ! Unfrozen soil wetness over irrigation. + tsoil_deep_gb(land_pts,ns_deep), & + ! Deep soil temperature (K). + t_soil_soilt(land_pts,nsoilt,sm_levels), & + ! Sub-surface temperatures (K). + t_soil_soilt_acc(land_pts,nsoilt,sm_levels), & + ! Sub-surface temperature on layers and soil tiles + ! accumulated over TRIFFID timestep (K). + tsurf_elev_surft(land_pts,nsurft) + ! Tiled sub-surface temperatures (K). + +! TOPMODEL variables. +REAL(KIND=real_jlslsm), INTENT(IN OUT) :: & + fsat_soilt(land_pts,nsoilt), & + ! Surface saturation fraction. + fwetl_soilt(land_pts,nsoilt), & + ! Wetland fraction. + sthzw_soilt(land_pts,nsoilt), & + ! Soil moisture fraction in deep LSH/TOPMODEL layer. + zw_soilt(land_pts,nsoilt) + ! Water table depth (m). + +! Soil carbon variables. +REAL(KIND=real_jlslsm), INTENT(IN OUT) :: & + cs_pool_soilt(land_pts,nsoilt,dim_cslayer,dim_cs1), & + ! Soil carbon (kg C/m2). +! ! For RothC (dim_cs1=4), the pools +! ! are DPM, RPM, biomass and humus. + resp_s_soilt(land_pts,nsoilt,dim_cslayer,dim_cs1) + ! Soil respiration in pools (kg C/m2/s). + +! Methane variables. +REAL(KIND=real_jlslsm), INTENT(IN OUT) :: & + cs_ch4_soilt(land_pts,nsoilt), & + ! Soil carbon used in CH4 wetlands if TRIFFID is switched off (kg C/m2). + fch4_wetl_acc_soilt(land_pts,nsoilt), & + ! Accumulated scaled wetland methane flux (kg C/m2). + substr_ch4(land_pts,dim_ch4layer), & + ! Dissolved substrate that methaogens consume (kg C/m2) + mic_ch4(land_pts,dim_ch4layer), & + ! Methanogenic biomass (kg C/m2) + mic_act_ch4(land_pts,dim_ch4layer), & + ! Activity level of methanogenic biomass (fraction) + acclim_ch4(land_pts,dim_ch4layer) + ! Acclimation factor for microbial trait adaptation + +! Nitrogen variables. +REAL(KIND=real_jlslsm), INTENT(IN OUT) :: & + n_inorg_avail_pft(land_pts,npft,dim_cslayer), & + ! Available inorganic N for PFTs (kg N m-2). + n_inorg_soilt_lyrs(land_pts,nsoilt,dim_cslayer), & + ! Inorganic N pool on soil levels (kg N m-2). + n_leach_gb_acc(land_pts) + ! Accumulated leached nitrogen diagnostic on TRIFFID timesteps + ! (kg m-2 (360days)-1). + +!----------------------------------------------------------------------------- +! Array arguments with INTENT(OUT): +!----------------------------------------------------------------------------- +! Canopy water and soil moisture. +REAL(KIND=real_jlslsm), INTENT(OUT) :: & + canopy_gb(land_pts), & + ! Gridbox canopy water content (kg/m2). + smc_soilt(land_pts,nsoilt) + ! Available soil moisture in a layer at the surface (kg/m2) + +REAL(KIND=real_jlslsm), INTENT(INOUT) :: & + tot_tfall_surft(land_pts,nsurft), & + ! Surface-tiled contributions to throughfall. + dun_roff_soilt(land_pts,nsoilt) + ! Dunne part of sfc runoff (kg/m2/s). + +! Water fluxes. +REAL(KIND=real_jlslsm), INTENT(OUT) :: & + drain_soilt(land_pts,nsoilt), & + ! Drainage out of sm_levels'th level (kg/m2/s). + sub_surf_roff_gb(land_pts), & + ! Sub-surface runoff (kg/m2/s). + surf_roff_gb(land_pts), & + ! Surface runoff (kg/m2/s). + tot_tfall_gb(land_pts), & + ! Total throughfall (kg/m2/s). + w_flux_soilt(land_pts,nsoilt,0:sm_levels) + ! Fluxes of water between layers (kg/m2/s). + +! TOPMODEL variables. +REAL(KIND=real_jlslsm), INTENT(OUT) :: & + qbase_soilt(land_pts,nsoilt), & + ! Base flow (kg/m2/s). + qbase_l_soilt(land_pts,nsoilt,sm_levels+1), & + ! Base flow from each level (kg/m2/s). + qbase_zw_soilt(land_pts,nsoilt) + ! Base flow from deep LSH/TOPMODEL layer (kg/m2/s). + +! Methane and nitrigen variables. +REAL(KIND=real_jlslsm), INTENT(OUT) :: & + fch4_wetl_soilt(land_pts,nsoilt), & + ! Scaled wetland methane flux (default substrate) for use in + ! atmos chemistry model (10^-9 kg C/m2/s). + fch4_wetl_cs_soilt(land_pts,nsoilt), & + ! Scaled methane flux (soil carbon substrate) (kg C/m2/s). + fch4_wetl_npp_soilt(land_pts,nsoilt), & + ! Scaled methane flux (npp substrate) (kg C/m2/s). + fch4_wetl_resps_soilt(land_pts,nsoilt), & + ! Scaled methane flux (soil respiration substrate) (kg C/m2/s). + n_leach_soilt(land_pts,nsoilt) + ! Leached N (kg m-2 s-1). + +!CABLE +REAL, INTENT(OUT) :: progs_snow_surft(land_pts,nsurft) +REAL, INTENT(OUT) :: snow_mass_gb(land_pts) ! OUT Gridbox snowmass (kg/m2) +!----------------------------------------------------------------------------- +! Local parameters: +!----------------------------------------------------------------------------- +REAL(KIND=real_jlslsm), PARAMETER :: to_kg_conversion = 1.0e-9 + ! multiplier for converting to kgC for wetland CH4 and IMOGEN + +!----------------------------------------------------------------------------- +! Local scalar variables: +!----------------------------------------------------------------------------- +INTEGER :: & + i, j, & + n, & + ! Counter for soil level. + m, & + ! Counter for soil tile. + errorstatus + +!----------------------------------------------------------------------------- +! Local array variables: +!----------------------------------------------------------------------------- +REAL(KIND=real_jlslsm) :: & + dsmc_dt_soilt(land_pts,nsoilt), & + ! Rate of change of soil moisture due to water falling onto the + ! surface after surface runoff (kg/m2/s). + ksz_soilt(land_pts,nsoilt,0:sm_levels), & + ! Saturated hydraulic conductivity in layer (kg/m2/s). + qbase_unfr_soilt(land_pts,nsoilt), & + ! Base flow in unfrozen soil (kg/m2/s). + qbase_l_unfr_soilt(land_pts,nsoilt,sm_levels+1), & + ! As qbase_l but for unfrozen soil (kg/m2/s). + top_crit_soilt(land_pts,nsoilt), & + ! Critical TI when ZW <=0.0 + dumtop_crit_soilt(land_pts,nsoilt), & + ! Dummy for top_crit_soilt + dumsthf_soilt(land_pts,nsoilt,sm_levels), & + ! Dummy Frozen soil moisture content of each layer as a fraction of + ! saturation (always set to 0). + zdepth(0:sm_levels), & + ! Lower soil layer boundary depth (m). + tsoil_d_soilt(land_pts,nsoilt), & + ! Soil temperature in the top metre + zw_inund_soilt(land_pts,nsoilt), & + ! Water table depth used + wutot_soilt(land_pts,nsoilt), & + ! Ratio of unfrozen to total soil moisture at ZW. + surf_roff_inc_soilt(land_pts,nsoilt), & + ! Increment to tiled surface runoff (kg m-2 s-1). + surf_roff_soilt(land_pts,nsoilt), & + ! Soil-tiled contributions to surface runoff (kg m-2 s-1). + sub_surf_roff_soilt(land_pts,nsoilt), & + ! Soil-tiled contributions to subsurface runoff (kg m-2 s-1). + smcl_old_soilt(land_pts,nsoilt,sm_levels) + ! Retain oriignal soil moisture for leaching code + +! Variables required for irrigation code +REAL(KIND=real_jlslsm) :: & + w_flux_irr_soilt(land_pts,nsoilt,0:sm_levels), & + ! The fluxes of water between layers in irrigated fraction (kg/m2/s). + w_flux_nir_soilt(land_pts,nsoilt,0:sm_levels), & + ! The fluxes of water between layers in non-irrigated fraction (kg/m2/s). + smcl_irr_soilt(land_pts,nsoilt,sm_levels), & + ! Total soil moisture contents of each layer in irrigated + ! fraction (kg/m2). + smcl_nir_soilt(land_pts,nsoilt,sm_levels), & + ! Total soil moisture contents of each layer in non-irrigated + ! fraction (kg/m2). + sthu_nir_soilt(land_pts,nsoilt,sm_levels), & + ! Unfrozen soil moisture content of each layer as a fraction of + ! saturation in irrigated fraction. + ext_nir_soilt(land_pts,nsoilt,sm_levels), & + ! Extraction of water from each soil layer in non-irrigated fraction + ! (kg/m2/s). + smclsat_soilt(land_pts,nsoilt,sm_levels), & + ! The saturation moisture content of each layer (kg/m2). + smclzw_soilt(land_pts,nsoilt), & + ! moisture content in deep layer(kg/m2). + smclsatzw_soilt(land_pts,nsoilt) + ! moisture content in deep layer (kg/m2). + +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='HYDROL_cable' + +! End of header-------------------------------------------------------- +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +#if !defined(UM_JULES) + timestep = REAL(timestep_len) +#endif + +canopy_gb = canopy_gb +!CM2.1!!CABLE_LSM: call CABLE hydrology +call cable_hyd_main( land_pts, nsurft, tile_frac, timestep, & + snow_mass_gb, progs_snow_surft, snow_melt, & + surf_roff_gb, sub_surf_roff_gb, & + tot_tfall_gb, work_cbl%snow_surft, melt_surft, & + work_cbl%lying_snow, work_cbl%surf_roff, & + work_cbl%sub_surf_roff, work_cbl%tot_tfall ) + + +! Calculate soil carbon for use in the wetland CH4 scheme only +! (only used if single-pool C model is used): +IF ( soil_bgc_model == soil_model_1pool ) THEN +!$OMP PARALLEL DO SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(i,j,m,n) & +!$OMP SHARED(soil_pts, nsoilt, soil_index, cs_ch4_soilt, dim_cslayer, & +!$OMP cs_pool_soilt) + DO m = 1, nsoilt + DO j = 1, soil_pts + i = soil_index(j) + cs_ch4_soilt(i,m) = 0.0 + DO n = 1,dim_cslayer + cs_ch4_soilt(i,m) = cs_ch4_soilt(i,m) + cs_pool_soilt(i,m,n,1) + END DO + END DO + END DO +!$OMP END PARALLEL DO +END IF + +!$OMP PARALLEL DEFAULT(NONE) PRIVATE(i,m,n) & +!$OMP SHARED(sm_levels, nsoilt, smcl_old_soilt, smcl_soilt, w_flux_soilt, & +!$OMP w_flux_irr_soilt, land_pts) +! smcl_old_soilt calculated for leaching code +DO n = 1, sm_levels + DO m = 1, nsoilt +!$OMP DO SCHEDULE(STATIC) + DO i = 1, land_pts + smcl_old_soilt(i,m,n) = smcl_soilt(i,m,n) + END DO +!$OMP END DO NOWAIT + END DO +END DO + +! Initialise w_flux variables that are used in irrigation code +DO n = 0, sm_levels + DO m = 1, nsoilt +!$OMP DO SCHEDULE(STATIC) + DO i = 1, land_pts + w_flux_soilt(i,m,n) = 0.0 + w_flux_irr_soilt(i,m,n) = 0.0 + ! to prevent random values reported over areas + ! that are not included as soil points (i.e. ice points) + END DO +!$OMP END DO NOWAIT + END DO +END DO +!$OMP END PARALLEL +!CABLE_LSM: call CABLE hydrology +!!call cable_hyd_main( npnts, nsurft, lying_snow, snow_surft, surf_roff, & + !! sub_surf_roff, tot_tfall ) + +!CM2 vn starts aboout here +!----------------------------------------------------------------------------- +! Set up variables required for LSH scheme: +!----------------------------------------------------------------------------- +! set level zero depth to 0 +zdepth(0) = 0.0 + +DO n = 1, sm_levels + zdepth(n) = zdepth(n-1) + dzsoil(n) +END DO +!jhan:fudge +dsmc_dt_soilt(:,:) = 0.0 +!----------------------------------------------------------------------------- +! Calculate throughfall and surface runoff, and update the canopy water +! content +!----------------------------------------------------------------------------- +!!CABLE_LSM: omit for CABLE: BUT initialize dsmc_dt for fpe0, otherwise? +!!CALL surf_hyd (land_pts, nsurft, sm_levels, soil_pts, timestep, l_top, l_pdm, & +!! surft_pts, surft_index, soil_index, & +!! catch_surft, ecan_surft, tile_frac, non_lake_frac, infil_surft, & +!! con_rain_land, ls_rain_land, con_rainfrac_land, & +!! ls_rainfrac_land, melt_surft, slope_gb, snow_melt, & +!! fsat_soilt, smvcst_soilt, & +!! sthf_soilt, sthu_soilt, & +!! canopy_surft, canopy_gb, dsmc_dt_soilt, & +!! surf_roff_gb, tot_tfall_gb, tot_tfall_surft, & +!! dun_roff_soilt, surf_roff_soilt) +! +!----------------------------------------------------------------------------- +! Specify the reduction of hydraulic conductivity with depth. +! Initialiase base flow to zero. +!----------------------------------------------------------------------------- +!$OMP PARALLEL DEFAULT(NONE) PRIVATE(i, j, m, n) & +!$OMP SHARED(sm_levels, nsoilt, soil_pts, soil_index, ksz_soilt, satcon_soilt, & +!$OMP smclsat_soilt, qbase_l_soilt, qbase_l_unfr_soilt, dumsthf_soilt, & +!$OMP dzsoil, smvcst_soilt, land_pts, qbase_soilt, & +!$OMP qbase_zw_soilt, wutot_soilt, drain_soilt, qbase_unfr_soilt, & +!$OMP zw_inund_soilt, surf_roff_inc_soilt) +DO n = 0, sm_levels + DO m = 1, nsoilt +!$OMP DO SCHEDULE(STATIC) + DO j = 1, soil_pts + i = soil_index(j) + ksz_soilt(i,m,n) = satcon_soilt(i,m,n) + END DO +!$OMP END DO NOWAIT + END DO +END DO + +DO n = 1, sm_levels + DO m = 1, nsoilt +!$OMP DO SCHEDULE(STATIC) + DO j = 1,soil_pts + i = soil_index(j) + smclsat_soilt(i,m,n) = rho_water * dzsoil(n) * smvcst_soilt(i,m,n) + qbase_l_soilt(i,m,n) = 0.0 + qbase_l_unfr_soilt(i,m,n) = 0.0 + dumsthf_soilt(i,m,n) = 0.0 + END DO +!$OMP END DO NOWAIT + END DO +END DO + +DO m = 1, nsoilt +!$OMP DO SCHEDULE(STATIC) + DO i = 1,land_pts + qbase_soilt(i,m) = 0.0 + qbase_zw_soilt(i,m) = 0.0 + wutot_soilt(i,m) = 0.0 + drain_soilt(i,m) = 0.0 + qbase_unfr_soilt(i,m) = 0.0 + zw_inund_soilt(i,m) = 0.0 + ! Initialise runoff increment. + surf_roff_inc_soilt(i,m) = 0.0 + END DO +!$OMP END DO NOWAIT +END DO +!$OMP END PARALLEL + +!!CABLE_LSM: omit for CABLE +!IF (l_top) THEN +! IF (soil_pts /= 0) THEN +! DO m = 1, nsoilt +! CALL calc_baseflow_jules( & +! land_pts, sm_levels, soil_pts, soil_index, & +! bexp_soilt(:,m,:), fexp_soilt(:,m), sthf_soilt(:,m,:), & +! ti_mean_soilt(:,m), zdepth, zw_soilt(:,m), ksz_soilt(:,m,:), & +! qbase_soilt(:,m), qbase_l_soilt(:,m,:), dumtop_crit_soilt(:,m) ) +! END DO +! +! IF (l_wetland_unfrozen) THEN +! DO m = 1,nsoilt +! CALL calc_zw_inund(land_pts, sm_levels, soil_pts, soil_index, zdepth, & +! bexp_soilt(:,m,:), sathh_soilt(:,m,:), smclsat_soilt(:,m,:), & +! smcl_soilt(:,m,:), sthu_soilt(:,m,:), sthzw_soilt(:,m), & +! zw_soilt(:,m), zw_inund_soilt(:,m), wutot_soilt(:,m)) +! +! ! Now call again to get the unfrozen equivalents to calculate fsat and +! ! fwet: +! CALL calc_baseflow_jules( & +! land_pts, sm_levels, soil_pts, soil_index, & +! bexp_soilt(:,m,:), fexp_soilt(:,m), dumsthf_soilt(:,m,:), & +! ti_mean_soilt(:,m), zdepth, zw_inund_soilt(:,m), ksz_soilt(:,m,:), & +! qbase_unfr_soilt(:,m), qbase_l_unfr_soilt(:,m,:), & +! top_crit_soilt(:,m) ) +! END DO +! ELSE +! DO m = 1, nsoilt +!!$OMP PARALLEL DO SCHEDULE(STATIC) DEFAULT(NONE) PRIVATE(i) & +!!$OMP SHARED(m, land_pts, top_crit_soilt, dumtop_crit_soilt) +! DO i = 1,land_pts +! top_crit_soilt(i,m) = dumtop_crit_soilt(i,m) +! END DO +!!$OMP END PARALLEL DO +! END DO +! END IF +! +! END IF +!END IF ! l_top +!!CABLE_LSM:End + +IF (l_inland) THEN + DO i = 1,land_pts + + ! Add inland basin outflow to change in soil moisture store. + ! Note for soil tiling- this is only used by the riv_intctl_1a, which is + ! not compatible with nsoilt > 1. + dsmc_dt_soilt(i,1) = dsmc_dt_soilt(i,1) + inlandout_atm_gb(i) + END DO +END IF + +!----------------------------------------------------------------------------- +! Update the layer soil moisture contents and calculate the +! gravitational drainage. +!----------------------------------------------------------------------------- +!!!CABLE_LSM: omit for CABLE +!!!CM2IF (soil_pts /= 0) THEN +!! +!! !CM2IF (l_irrig_dmd) THEN +!! +!! !CM2 !------------------------------------------------------------------------- +!! !CM2 ! If l_irrig_dmd = TRUE, call soil_hyd separately for irrigated and +!! !CM2 ! non-irrigated fraction +!! !CM2 ! afterwards, call soil_hyd ONLY to update water table/drainage with +!! !CM2 ! gridbox total w_flux_soilt, smcl_soilt +!! !CM2 !------------------------------------------------------------------------- +!! +!! !CM2 !-------------------------------------------------------------------------- +!! !CM2 ! Split tile values into values for irrigated and non-irrigated fractions. +!! !CM2 !-------------------------------------------------------------------------- +!! !CM2 DO n = 1,sm_levels +!! !CM2 DO m = 1, nsoilt +!! !CM2 DO j = 1,soil_pts +!! !CM2 i = soil_index(j) +!! +!! !CM2 ! hadrd - gridbox sthu_soilt is assumed to be combination of +!! !CM2 ! sthu_soilt of non-irrigated fraction and sthu_irr_soilt, i.e. +!! !CM2 ! sthu_soilt = frac_irr_soilt*sthu_irr_soilt + (1-frac_irr_soilt) +!! !CM2 ! *sthu_nir_soilt +!! !CM2 IF ( frac_irr_soilt(i,m) < 1.0 ) THEN +!! !CM2 sthu_nir_soilt(i,m,n) = (sthu_soilt(i,m,n) - frac_irr_soilt(i,m) & +!! !CM2 * sthu_irr_soilt(i,m,n)) & +!! !CM2 / (1.0 - frac_irr_soilt(i,m)) +!! !CM2 ext_nir_soilt(i,m,n) = (ext_soilt(i,m,n) - frac_irr_soilt(i,m) & +!! !CM2 * ext_irr_soilt(i,m,n)) & +!! !CM2 / (1.0 - frac_irr_soilt(i,m)) +!! !CM2 ELSE +!! !CM2 sthu_nir_soilt(i,m,n) = sthu_soilt(i,m,n) +!! !CM2 ext_nir_soilt(i,m,n) = ext_soilt(i,m,n) +!! !CM2 END IF +!! +!! !CM2 smcl_irr_soilt(i,m,n) = smcl_soilt(i,m,n) & +!! !CM2 + (sthu_irr_soilt(i,m,n) & +!! !CM2 - sthu_soilt(i,m,n)) & +!! !CM2 * smclsat_soilt(i,m,n) +!! !CM2 smcl_nir_soilt(i,m,n) = smcl_soilt(i,m,n) & +!! !CM2 + (sthu_nir_soilt(i,m,n) & +!! !CM2 - sthu_soilt(i,m,n)) & +!! !CM2 * smclsat_soilt(i,m,n) +!! !CM2 END DO +!! !CM2 END DO +!! !CM2 END DO +!! +!! !CM2 DO m = 1, nsoilt +!! !CM2 ! First call soil_hyd for non-irrigated fraction. +!! !CM2 ! Note that the values of smclsat_soilt, smclzw_soilt and smclsatzw_soilt +!! !CM2 ! calculated here and in the next call are later replaced by the +!! !CM2 ! recalculated values from soil_hyd_update. +!! !CM2 CALL soil_hyd ( & +!! !CM2 land_pts, sm_levels, soil_pts, timestep, l_top, l_soil_sat_down, & +!! !CM2 soil_index, bexp_soilt(:,m,:), dzsoil, & +!! !CM2 ext_nir_soilt(:,m,:), dsmc_dt_soilt(:,m), ksz_soilt(:,m,:), & +!! !CM2 sathh_soilt(:,m,:), sthzw_soilt(:,m), smvcst_soilt(:,m,:), & +!! !CM2 qbase_l_soilt(:,m,:), zdepth, & +!! !CM2 smcl_nir_soilt(:,m,:), sthu_nir_soilt(:,m,:), smclsat_soilt(:,m,:), & +!! !CM2 w_flux_nir_soilt(:,m,:), smclzw_soilt(:,m), smclsatzw_soilt(:,m)) +!! +!! !CM2 ! Next call soil_hyd for irrigated fraction. +!! !CM2 CALL soil_hyd ( & +!! !CM2 land_pts, sm_levels, soil_pts, timestep, l_top, l_soil_sat_down, & +!! !CM2 soil_index, bexp_soilt(:,m,:), dzsoil, & +!! !CM2 ext_irr_soilt(:,m,:), dsmc_dt_soilt(:,m), ksz_soilt(:,m,:), & +!! !CM2 sathh_soilt(:,m,:), sthzw_soilt(:,m), smvcst_soilt(:,m,:), & +!! !CM2 qbase_l_soilt(:,m,:), zdepth, & +!! !CM2 smcl_irr_soilt(:,m,:), sthu_irr_soilt(:,m,:), smclsat_soilt(:,m,:), & +!! !CM2 w_flux_irr_soilt(:,m,:), smclzw_soilt(:,m), smclsatzw_soilt(:,m)) +!! !CM2 END DO +!! +!! !CM2 !-------------------------------------------------------------------------- +!! !CM2 ! Calculate values for the whole soil tile by combining irrigated and +!! !CM2 ! non-irrigated values. +!! !CM2 !-------------------------------------------------------------------------- +!! !CM2 DO m = 1,nsoilt +!! !CM2 DO n = 0,sm_levels +!! !CM2 DO j = 1,soil_pts +!! !CM2 i = soil_index(j) +!! +!! !CM2 ! Ensure sensible values if irrigation fraction is very small by +!! !CM2 ! using values from the non-irrigated fraction. +!! !CM2 IF ( frac_irr_soilt(i,m) <= EPSILON(1.0) ) THEN +!! !CM2 w_flux_soilt(i,m,n) = w_flux_nir_soilt(i,m,n) +!! !CM2 IF ( n >= 1 ) THEN +!! !CM2 sthu_irr_soilt(i,m,n) = sthu_nir_soilt(i,m,n) +!! !CM2 smcl_soilt(i,m,n) = smcl_nir_soilt(i,m,n) +!! !CM2 sthu_soilt(i,m,n) = sthu_nir_soilt(i,m,n) +!! !CM2 END IF +!! !CM2 ELSE +!! !CM2 w_flux_soilt(i,m,n) = frac_irr_soilt(i,m) & +!! !CM2 * w_flux_irr_soilt(i,m,n) & +!! !CM2 + ( 1.0 - frac_irr_soilt(i,m) ) & +!! !CM2 * w_flux_nir_soilt(i,m,n) +!! !CM2 IF ( n >= 1 ) THEN +!! !CM2 smcl_soilt(i,m,n) = frac_irr_soilt(i,m) * smcl_irr_soilt(i,m,n) & +!! !CM2 + ( 1.0 - frac_irr_soilt(i,m) ) & +!! !CM2 * smcl_nir_soilt(i,m,n) +!! !CM2 sthu_soilt(i,m,n) = frac_irr_soilt(i,m) * sthu_irr_soilt(i,m,n) & +!! !CM2 + ( 1.0 - frac_irr_soilt(i,m) ) & +!! !CM2 * sthu_nir_soilt(i,m,n) +!! !CM2 END IF +!! !CM2 END IF +!! !CM2 END DO ! soil points +!! !CM2 END DO ! layers +!! !CM2 END DO ! tiles +!! +!! !CM2 !-------------------------------------------------------------------------- +!! !CM2 ! Recalculate values for the whole soil tile that were over-written by the +!! !CM2 ! separate calls to soil_hyd above. +!! !CM2 !-------------------------------------------------------------------------- +!! !CM2 DO m = 1, nsoilt +!! !CM2 CALL soil_hyd_update(land_pts, sm_levels, soil_pts, soil_index, dzsoil, & +!! !CM2 smvcst_soilt(:,m,:), zdepth, smclzw_soilt(:,m), & +!! !CM2 sthzw_soilt(:,m), smclsat_soilt(:,m,:), & +!! !CM2 smclsatzw_soilt(:,m)) +!! !CM2 END DO +!! +!! !CM2ELSE +!! ! .NOT. l_irrig_dmd +!! +!! !CM2DO m = 1, nsoilt +!! !CM2 CALL soil_hyd ( & +!! !CM2 land_pts, sm_levels, soil_pts, timestep, l_top, l_soil_sat_down, & +!! !CM2 soil_index, bexp_soilt(:,m,:), dzsoil, & +!! !CM2 ext_soilt(:,m,:), dsmc_dt_soilt(:,m), ksz_soilt(:,m,:), & +!! !CM2 sathh_soilt(:,m,:), sthzw_soilt(:,m), smvcst_soilt(:,m,:), & +!! !CM2 qbase_l_soilt(:,m,:), zdepth, & +!! !CM2 smcl_soilt(:,m,:), sthu_soilt(:,m,:), smclsat_soilt(:,m,:), & +!! !CM2 w_flux_soilt(:,m,:), smclzw_soilt(:,m), smclsatzw_soilt(:,m)) +!! !CM2END DO +!! +!! !CM2END IF ! l_irrig_dmd + + !---------------------------------------------------------------------------- + ! Update further stores and fluxes. + !---------------------------------------------------------------------------- + !!IF (nsoilt == 1) THEN + !! !To maintain bit-comparability, we need to call with the _gb version of + !! !surface runoff. + !! m = 1 + !! CALL soil_hyd_wt ( & + !! land_pts, sm_levels, soil_pts, timestep, stf_sub_surf_roff, & + !! l_top, soil_index, & + !! bexp_soilt(:,m,:), dsmc_dt_soilt(:,m), sathh_soilt(:,m,:), & + !! smclsat_soilt(:,m,:), smclsatzw_soilt(:,m), smvcst_soilt(:,m,:), & + !! w_flux_soilt(:,m,:), smcl_soilt(:,m,:), & + !! surf_roff_gb, & + !! qbase_l_soilt(:,m,:), smclzw_soilt(:,m), zw_soilt(:,m), & + !! sub_surf_roff_soilt(:,m), drain_soilt(:,m), qbase_soilt(:,m), & + !! sthzw_soilt(:,m), surf_roff_inc_soilt(:,m) ) + + !! ! For a single soil tile, simply copy across to the output variable. + !! sub_surf_roff_gb(:) = sub_surf_roff_soilt(:,m) + !! ! Update the tiled surface runoff. + !! surf_roff_soilt(:,m) = surf_roff_soilt(:,m) + surf_roff_inc_soilt(:,m) + !!ELSE + + !! ! Initialise output variable + !! DO i = 1, land_pts + !! sub_surf_roff_gb(i) = 0.0 + !! END DO + !! DO m = 1, nsoilt + !! CALL soil_hyd_wt ( & + !! land_pts, sm_levels, soil_pts, timestep, stf_sub_surf_roff, & + !! l_top, soil_index, & + !! bexp_soilt(:,m,:), dsmc_dt_soilt(:,m), sathh_soilt(:,m,:), & + !! smclsat_soilt(:,m,:), smclsatzw_soilt(:,m), smvcst_soilt(:,m,:), & + !! w_flux_soilt(:,m,:), smcl_soilt(:,m,:), & + !! surf_roff_soilt(:,m), & + !! qbase_l_soilt(:,m,:), smclzw_soilt(:,m), zw_soilt(:,m), & + !! sub_surf_roff_soilt(:,m), drain_soilt(:,m), qbase_soilt(:,m), & + !! sthzw_soilt(:,m), surf_roff_inc_soilt(:,m) ) + + !! ! For multiple soil tiles, add up the contributions, allowing for frac + !! sub_surf_roff_gb(:) = sub_surf_roff_gb(:) & + !! + ( tile_frac(:,m) * sub_surf_roff_soilt(:,m)) + !! surf_roff_gb(:) = surf_roff_gb(:) + tile_frac(:,m) & + !! * surf_roff_inc_soilt(:,m) + + !! END DO + !!END IF !nsoilt == 1 + + !--------------------------------------------------------------------------- + ! Calculate surface saturation and wetland fractions: + !--------------------------------------------------------------------------- + !CM2IF (l_top) THEN + !CM2 DO m = 1, nsoilt + + !CM2 DO i = 1,land_pts + !CM2 fsat_soilt(i,m) = 0.0 + !CM2 fwetl_soilt(i,m) = 0.0 + + !CM2 ! Zero soil porosity over land ice: + !CM2 IF (smvcst_soilt(i,m,sm_levels) <= 0.0) THEN + !CM2 zw_soilt(i,m) = zw_max + !CM2 END IF + !CM2 END DO + + !CM2 DO j = 1,soil_pts + !CM2 i = soil_index(j) + !CM2 qbase_zw_soilt(i,m) = qbase_l_soilt(i,m,sm_levels+1) + + !CM2 !Now use fit for fsat_soilt and fwet: + !CM2 IF (l_wetland_unfrozen) THEN + !CM2 fsat_soilt(i,m) = wutot_soilt(i,m) * a_fsat_soilt(i,m) & + !CM2 * EXP(-c_fsat_soilt(i,m) * top_crit_soilt(i,m)) + !CM2 fwetl_soilt(i,m) = wutot_soilt(i,m) * a_fwet_soilt(i,m) & + !CM2 * EXP(-c_fwet_soilt(i,m) * top_crit_soilt(i,m)) + !CM2 ELSE + !CM2 fsat_soilt(i,m) = a_fsat_soilt(i,m) & + !CM2 * EXP(-c_fsat_soilt(i,m) * top_crit_soilt(i,m)) + !CM2 fwetl_soilt(i,m) = a_fwet_soilt(i,m) & + !CM2 * EXP(-c_fwet_soilt(i,m) * top_crit_soilt(i,m)) + !CM2 END IF + + !CM2 IF (top_crit_soilt(i,m) >= ti_max) THEN + !CM2 fsat_soilt(i,m) = 0.0 + !CM2 fwetl_soilt(i,m) = 0.0 + !CM2 END IF + + !CM2 END DO + !CM2 END DO + !CM2END IF ! l_top + +!CM2ELSE ! soil pts + + !--------------------------------------------------------------------------- + ! If required by STASH flag and there are no soil points, + ! set sub-surface runoff to zero. + !--------------------------------------------------------------------------- + !CM2IF (stf_sub_surf_roff) THEN + !CM2 DO i = 1,land_pts + !CM2 sub_surf_roff_gb(i) = 0.0 + !CM2 END DO + !CM2END IF + +!CM2END IF ! soil_pts + +!----------------------------------------------------------------------------- +! Update the soil temperatures and the frozen moisture fractions +!----------------------------------------------------------------------------- + +!============================================================================= +! *NOTICE REGARDING SOIL TILING** +! +!The following section facilitates the use of soil tiling. As implemented, +!there are two soil tiling options: +! +!nsoilt == 1 +!Operate as with a single soil tile, functionally identical to JULES upto +! at least vn4.7 (Oct 2016) +! This means that a soilt variable being passed 'up' to the surface is +! broadcast to the surft variable (with weighting by frac if requred) +! +!nsoilt > 1 +!Operate with nsoilt = nsurft, with a direct mapping between them +! This means that a soilt variable being passed 'up' to the surface is simply +! copied into the surft variable +! +! This will need to be refactored for other tiling approaches. This note +! will be replicated elsewhere in the code as required +! +!These comments apply until **END NOTICE REGARDING SOIL TILING** +!============================================================================= +!CM2IF (soil_pts /= 0) THEN +!CM2 ! When using soil tiling, we can use the surface tiled version of +!CM2 ! surf_ht_flux_ld, snow_soil_htf. The _ld version is a gridbox mean +!CM2 ! calculated in snow and passed through. +!CM2 IF (nsoilt == 1) THEN +!CM2 m = 1 +!CM2 CALL soil_htc ( & +!CM2 land_pts, sm_levels, nsurft, soil_pts, timestep, soil_index, & +!CM2 surft_pts, surft_index, nsnow_surft, & +!CM2 bexp_soilt(:,m,:), dzsoil, tile_frac, & +!CM2 non_lake_frac, hcap_soilt(:,m,:), hcon_soilt(:,m,:), & +!CM2 sathh_soilt(:,m,:), smcl_soilt(:,m,:), snowdepth_surft, & +!CM2 surf_ht_flux_ld, smvcst_soilt(:,m,:), w_flux_soilt(:,m,:), & +!CM2 sthf_soilt(:,m,:), sthu_soilt(:,m,:), sthu_irr_soilt(:,m,:), & +!CM2 t_soil_soilt(:,m,:), tsoil_deep_gb ) +!CM2 ELSE +!CM2 ! Surface and soil tiles map directly on to each other. +!CM2 DO m = 1, nsoilt +!CM2 n = m +!CM2 CALL soil_htc ( & +!CM2 land_pts, sm_levels, nsurft, soil_pts, timestep, soil_index, & +!CM2 surft_pts, surft_index, nsnow_surft, & +!CM2 bexp_soilt(:,m,:), dzsoil, tile_frac, & +!CM2 non_lake_frac, hcap_soilt(:,m,:), hcon_soilt(:,m,:), & +!CM2 sathh_soilt(:,m,:), smcl_soilt(:,m,:), snowdepth_surft, & +!CM2 snow_soil_htf(:,n), smvcst_soilt(:,m,:), w_flux_soilt(:,m,:), & +!CM2 sthf_soilt(:,m,:), sthu_soilt(:,m,:), sthu_irr_soilt(:,m,:), & +!CM2 t_soil_soilt(:,m,:), tsoil_deep_gb ) +!CM2 END DO +!CM2 END IF +!CM2END IF +!CM2!============================================================================= +!CM2! *END NOTICE REGARDING SOIL TILING** +!CM2!============================================================================= +!CM2 +!CM2!----------------------------------------------------------------------------- +!CM2! Update the sub-surface temperatures for land ice. +!CM2!----------------------------------------------------------------------------- +!CM2IF (lice_pts /= 0) THEN +!CM2 IF ( .NOT. l_elev_land_ice) THEN +!CM2 DO m = 1, nsoilt +!CM2 CALL ice_htc (lice_pts, land_pts, sm_levels, timestep, lice_index, & +!CM2 dzsoil, surf_ht_flux_ld, t_soil_soilt(:,m,:)) +!CM2 END DO +!CM2 ELSE +!CM2 CALL elev_htc (lice_pts, land_pts, nsurft, dzsoil_elev, timestep, & +!CM2 lice_index, snow_soil_htf, tsurf_elev_surft) +!CM2 END IF +!CM2END IF +!CABLE_LSM:End +!jhan:up to here +!----------------------------------------------------------------------------- +! Diagnose the available soil moisture in a layer at the surface. +!----------------------------------------------------------------------------- +DO m = 1, nsoilt + CALL soilmc ( land_pts,sm_levels,soil_pts,soil_index, & + dzsoil,sthu_soilt(:,m,:),smvcst_soilt(:,m,:), & + smvcwt_soilt(:,m,:),smc_soilt(:,m) ) +END DO + +!----------------------------------------------------------------------------- +! Calculate mean soil temperature and scaled CH4 flux: +!----------------------------------------------------------------------------- +DO m = 1, nsoilt + DO i = 1,land_pts + fch4_wetl_soilt(i,m) = 0.0 + fch4_wetl_cs_soilt(i,m) = 0.0 + fch4_wetl_npp_soilt(i,m) = 0.0 + fch4_wetl_resps_soilt(i,m) = 0.0 + END DO +END DO +!!!CABLE_LSM: omit for CABLE +!! IF ( l_top .AND. soil_pts /= 0 ) THEN +!! SELECT CASE ( soil_bgc_model ) +!! CASE ( soil_model_1pool, soil_model_rothc ) +!! IF ( l_ch4_tlayered ) THEN +!! ! This variable is not used with layered CH4 calc. +!! tsoil_d_soilt(:,m) = 0.0 +!! ELSE +!! CALL soilt(land_pts, sm_levels, soil_pts, soil_index, & +!! dzsoil, t_soil_soilt(:,m,:), tsoil_d_soilt(:,m)) +!! END IF +!! CALL ch4_wetl(land_pts, sm_levels, soil_pts, dim_cs1, timestep, & +!! l_ch4_tlayered, soil_index, & +!! t_soil_soilt(:,m,:), tsoil_d_soilt(:,m), cs_ch4_soilt(:,m),& +!! resp_s_soilt(:,m,:,:), npp_soilt(:,m), fwetl_soilt(:,m), & +!! sthu_soilt(:,m,:), bexp_soilt(:,m,:), & +!! fch4_wetl_soilt(:,m), fch4_wetl_cs_soilt(:,m), & +!! fch4_wetl_npp_soilt(:,m), fch4_wetl_resps_soilt(:,m), & +!! substr_ch4, mic_ch4, mic_act_ch4, acclim_ch4, & +!! cs_pool_soilt(:,m,:,:)) +!!#if !defined(UM_JULES) +!! IF (l_imogen) THEN +!! DO i = 1,land_pts +!! ! fch4_wetl_acc_soilt in kg/m2 and fch4_wetl_soilt in 10e9kg/m2/s +!! fch4_wetl_acc_soilt(i,m) = fch4_wetl_acc_soilt(i,m) + & +!! (fch4_wetl_soilt(i,m) * to_kg_conversion * timestep_len) +!! END DO +!! END IF +!!#endif +!! END SELECT +!! END IF +!!END DO ! tiles +!! +!!IF ( (soil_bgc_model == soil_model_rothc .AND. l_layeredc ) & +!! .OR. soil_bgc_model == soil_model_ecosse ) THEN +!! !----------------------------------------------------------------------- +!! !accumulate soil temperature for layered soil carbon and nitrogen +!! !----------------------------------------------------------------------- +!! DO m = 1, nsoilt +!! IF (asteps_since_triffid == 1) THEN +!! t_soil_soilt_acc(:,m,:) = 0.0 +!! END IF +!! DO j = 1,soil_pts +!! i = soil_index(j) +!! t_soil_soilt_acc(i,m,:) = t_soil_soilt_acc(i,m,:) + t_soil_soilt(i,m,:) +!! END DO +!! END DO +!!END IF +!CABLE_LSM: omit for CABLE + +!----------------------------------------------------------------------- +! Calculate Nitrogen Leaching +!----------------------------------------------------------------------- +IF (soil_bgc_model == soil_model_rothc .AND. l_nitrogen) THEN + IF (nsoilt > 1) THEN + errorstatus = 101 + CALL ereport("check hydrol_jls", errorstatus, & + "nsoilt>1 and l_nitrogen - n_leach not currently coded") + END IF + CALL n_leach(land_pts, asteps_since_triffid, dim_cslayer, timestep, & + w_flux_soilt, qbase_l_soilt, sub_surf_roff_gb, smcl_soilt, & + smcl_old_soilt, n_inorg_avail_pft, n_inorg_soilt_lyrs, & + n_leach_gb_acc, n_leach_soilt) +END IF + +!----------------------------------------------------------------------------- +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE hydrol_cbl +END MODULE hydrol_mod_cbl diff --git a/src/coupled/AM3/control/cable/cable_land/implicit/cable_land_sf_implicit_cbl.F90 b/src/coupled/AM3/control/cable/cable_land/implicit/cable_land_sf_implicit_cbl.F90 new file mode 100644 index 000000000..07626e9b4 --- /dev/null +++ b/src/coupled/AM3/control/cable/cable_land/implicit/cable_land_sf_implicit_cbl.F90 @@ -0,0 +1,931 @@ +MODULE cable_land_sf_implicit_mod + +USE sf_melt_mod, ONLY: sf_melt +USE screen_tq_mod, ONLY: screen_tq +USE sf_evap_mod, ONLY: sf_evap +USE sice_htf_mod, ONLY: sice_htf + +USE um_types, ONLY: real_jlslsm + +IMPLICIT NONE + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: & + ModuleName='CABLE_LAND_SF_IMPLICIT_MOD' + +CONTAINS +! SUBROUTINE CABLE_LAND_SF_IMPLICIT -------------------------------- +! +! Purpose: Calculate implicit correction for land point to surface +! fluxes of heat,moisture and momentum, to be used by +! the unconditionally stable and non-oscillatory BL +! numerical solver. +! +! edits associated with creation of CM3 denoted by CM3#56 +!-------------------------------------------------------------------- +! Arguments :- +SUBROUTINE cable_land_sf_implicit ( & +! IN values defining field dimensions and subset to be processed : + land_pts,land_index,nsurft,surft_index,surft_pts,sm_levels, & + canhc_surft,canopy,flake,smc_soilt,tile_frac,wt_ext_surft,fland,flandg, & +! IN everything not covered so far : + lw_down,sw_surft,t_soil_soilt,r_gamma,alpha1,ashtf_prime_surft, & + dtrdz_charney_grid_1,fraca,resfs,resft,rhokh_surft, & + emis_surft,snow_surft,dtstar_surft, & +! INOUT data : + tstar_surft,fqw_surft,fqw_1,ftl_1,ftl_surft,sf_diag, & +! OUT Diagnostic not requiring STASH flags : + ecan,ei_surft,esoil_surft,surf_ht_flux_land,ei_land,surf_htf_surft, & +! OUT data required elsewhere in UM system : + tstar_land,le_surft,radnet_surft,ecan_surft,esoil_soilt, & + ext_soilt,melt_surft,tstar_surft_old,ERROR, & + !New arguments replacing USE statements + ! lake_mod (IN) + lake_h_ice_gb, & + ! lake_mod (OUT) + surf_ht_flux_lake_ij, non_lake_frac, & + ! fluxes (IN) + anthrop_heat_surft, & + ! fluxes (OUT) + surf_ht_store_surft, & + ! c_elevate (IN) + lw_down_elevcorr_surft, & + ! prognostics (IN) + nsnow_surft, & + ! jules_mod (IN) + snowdep_surft, & + ! JULES Types containing field data (IN OUT) + crop_vars, & +!!!CABLE_LSM: + progs_cbl, work_cbl, progs_cnp, & + !CM3: + cycleno, numcycles, npft, dim_cs1, smvcst, & + ls_rain, ls_snow, con_rain, con_snow, & + tl_1, dtl1_1, qw_1, dqw1_1, ctctq1, & + canopy_gb, canopy_surft, smcl_soilt, sthf_soilt, sthu_soilt, & + gs, gs_surft, & + npp_gb, npp_PFT, npp_acc_pft, gpp_gb, gpp_pft, & + resp_s, resp_s_tot, & !resp_s_tile, !Kathy intro-ed as diag & + resp_p, resp_p_pft, g_leaf_pft ) +!!!CABLE_LSM: End + +!TYPE definitions +USE crop_vars_mod, ONLY: crop_vars_type + +USE csigma, ONLY: sbcon + +USE planet_constants_mod, ONLY: cp + +USE atm_fields_bounds_mod, ONLY: tdims, pdims + +USE theta_field_sizes, ONLY: t_i_length, t_j_length + +USE jules_surface_mod, ONLY: l_aggregate, l_flake_model, ls + +USE jules_snow_mod, ONLY: & + nsmax, rho_snow_const, cansnowtile, l_snow_nocan_hc + +USE jules_surface_types_mod, ONLY: lake + +USE sf_diags_mod, ONLY: strnewsfdiag + +#if defined(UM_JULES) +USE timestep_mod, ONLY: timestep, timestep_number +USE submodel_mod, ONLY: atmos_im +USE UM_parcore, ONLY: mype +#else +USE model_time_mod, ONLY: timestep_number => timestep +USE model_time_mod, ONLY: timestep => timestep_len +USE model_grid_mod, ONLY: latitude, longitude +#endif + +USE ancil_info, ONLY: nsoilt + +USE jules_surface_mod, ONLY: l_neg_tstar + +USE water_constants_mod, ONLY: lc, lf, rho_ice + +USE solinc_data, ONLY: sky, l_skyview + +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook + +USE jules_print_mgr, ONLY: jules_message, jules_print + +! In general CABLE utilizes a required subset of tbe JULES types, however; +USE progs_cbl_vars_mod, ONLY: progs_cbl_vars_type ! CABLE requires extra progs +USE work_vars_mod_cbl, ONLY: work_vars_type ! and some kept thru timestep +USE progs_cnp_vars_mod, ONLY: progs_cnp_vars_type ! CASA requires extra progs +!CABLE_LSM:Make avail call to CABLE implicit version +USE cable_implicit_main_mod, ONLY: cable_implicit_main + +IMPLICIT NONE +!-------------------------------------------------------------------- +! Inputs :- +! (a) Defining horizontal grid and subset thereof to be processed. +! Checked for consistency. +!-------------------------------------------------------------------- +INTEGER, INTENT(IN) :: & + land_pts ! IN No of land points + +! (c) Soil/vegetation/land surface parameters (mostly constant). +INTEGER, INTENT(IN) :: & + land_index(land_pts) ! IN LAND_INDEX(I)=J => the Jth + ! point in ROW_LENGTH,ROWS is the + ! Ith land point. + +INTEGER, INTENT(IN) :: & + sm_levels & + ! IN No. of soil moisture levels +,nsurft & + ! IN No. of land tiles +,surft_index(land_pts,nsurft) & + ! IN Index of tile points +,surft_pts(nsurft) + ! IN Number of tile points + +REAL(KIND=real_jlslsm), INTENT(IN) :: & + canhc_surft(land_pts,nsurft) & + ! IN Areal heat capacity of canopy + ! for land tiles (J/K/m2). +,canopy(land_pts,nsurft) & + ! IN Surface/canopy water for + ! snow-free land tiles (kg/m2) +,flake(land_pts,nsurft) & + ! IN Lake fraction. +,smc_soilt(land_pts,nsoilt) & + ! IN Available soil moisture (kg/m2). +,tile_frac(land_pts,nsurft) & + ! IN Tile fractions including + ! snow cover in the ice tile. +,wt_ext_surft(land_pts,sm_levels,nsurft) & + ! IN Fraction of evapotranspiration + ! extracted from each soil layer + ! by each tile. +,fland(land_pts) & + ! IN Land fraction on land pts. +,flandg(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! IN Land fraction on all pts. +,emis_surft(land_pts,nsurft) + ! IN Emissivity for land tiles + ! IN Lying snow on tiles (kg/m2) + + +! (f) Atmospheric + any other data not covered so far, incl control. + +REAL(KIND=real_jlslsm), INTENT(IN) :: & + lw_down(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! IN Surface downward LW radiation + ! (W/m2). +,sw_surft(land_pts,nsurft) + ! IN Surface net SW radiation on + ! land tiles (W/m2). + +REAL(KIND=real_jlslsm), INTENT(IN) :: r_gamma + ! IN implicit weight in level 1 + +REAL(KIND=real_jlslsm), INTENT(IN) :: & + alpha1(land_pts,nsurft) & + ! IN Mean gradient of saturated + ! specific humidity with respect + ! to temperature between the + ! bottom model layer and tile + ! surfaces +,ashtf_prime_surft(land_pts,nsurft) & + ! IN Adjusted SEB coefficient for + ! land tiles. +,dtrdz_charney_grid_1(pdims%i_start:pdims%i_end, & + pdims%j_start:pdims%j_end) & + ! IN -g.dt/dp for model layers. +,fraca(land_pts,nsurft) & + ! IN Fraction of surface moisture + ! flux with only aerodynamic + ! resistance for snow-free land + ! tiles. +,resfs(land_pts,nsurft) & + ! IN Combined soil, stomatal + ! and aerodynamic resistance + ! factor for fraction (1-FRACA) of + ! snow-free land tiles. +,resft(land_pts,nsurft) & + ! IN Total resistance factor. + ! FRACA+(1-FRACA)*RESFS for + ! snow-free land, 1 for snow. +,rhokh_surft(land_pts,nsurft) + ! IN Surface exchange coefficients + ! for land tiles + + +REAL(KIND=real_jlslsm), INTENT(OUT) :: t_soil_soilt(land_pts,nsoilt,sm_levels) + ! Soil temperatures (K). +REAL(KIND=real_jlslsm), INTENT(OUT) :: snow_surft(land_pts,nsurft) +!!!CABLE_LSM: +INTEGER, INTENT(IN) :: npft +INTEGER, INTENT(IN) :: dim_cs1 +INTEGER, INTENT(IN) :: cycleno, numcycles +REAL, INTENT(IN) :: smvcst(land_pts,sm_levels) + ! IN Volumetric saturation point +!forcing +REAL, INTENT(IN) :: ls_rain(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) +REAL, INTENT(IN) :: ls_snow(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) +REAL, INTENT(IN) :: con_rain(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) +REAL, INTENT(IN) :: con_snow(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) +REAL, INTENT(IN) :: tl_1(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) ! temperature +REAL, INTENT(IN) :: qw_1(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) ! humidity +REAL, INTENT(IN) :: dtl1_1(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) ! increment to temp +REAL, INTENT(IN) :: dqw1_1(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) ! increment to humidity +REAL, INTENT(IN) :: ctctq1(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) ! temp/humidity increment +!re-declared as IN OUT as CABLE OUTs dtstar +REAL, INTENT(IN OUT) :: dtstar_surft(land_pts,nsurft) + ! Change in TSTAR over timestep +!!!CABLE_LSM: End + +!-------------------------------------------------------------------- +! In/outs :- +!-------------------------------------------------------------------- +TYPE (strnewsfdiag), INTENT(IN OUT) :: sf_diag +REAL(KIND=real_jlslsm), INTENT(IN OUT) :: & + tstar_surft(land_pts,nsurft) & + ! INOUT Surface tile temperatures +,fqw_1(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! INOUT Moisture flux between layers + ! (kg per square metre per sec) + ! FQW(,1) is total water flux + ! from surface, 'E'. +,ftl_1(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! INOUT FTL(,K) contains net + ! turbulent sensible heat flux + ! into layer K from below; so + ! FTL(,1) is the surface + ! sensible heat, H.(W/m2) +,ftl_surft(land_pts,nsurft) & + ! INOUT Surface FTL for land tiles +,fqw_surft(land_pts,nsurft) + ! INOUT Surface FQW for land tiles + +!!!CABLE_LSM:CM3 +!CM3#56 Potentially problematically - while these additional variables are available +! some of the CNP vars would not be available in the implicit sectio. This implies +! either partner changes through the UM boundary-layer scheme, USE of data modules +! and/or the work_cbl TYPE to pass stuff around in the longer term. +! +! As of 12/12/2023 - INH thinks it's okay +REAL(KIND=real_jlslsm), INTENT(INOUT) :: smcl_soilt(land_pts,nsoilt,sm_levels) + ! INOUT Soil Moisture +REAL(KIND=real_jlslsm), INTENT(INOUT) :: sthf_soilt(land_pts,nsoilt,sm_levels) + ! INOUT Soil Frozen fraction +REAL(KIND=real_jlslsm), INTENT(INOUT) :: sthu_soilt(land_pts,nsoilt,sm_levels) + ! INOUT Soil Unfrozen +REAL(KIND=real_jlslsm), INTENT(INOUT) ::ext_soilt(land_pts,nsoilt,sm_levels) + ! OUT Extraction of water from each + ! soil layer (kg/m2/s). +REAL, INTENT(OUT) :: canopy_gb(land_pts) +REAL, INTENT(OUT) :: canopy_surft(land_pts, nsurft) +REAL, INTENT(OUT) :: gs( land_pts ) +REAL, INTENT(OUT) :: gs_surft( land_pts, nsurft ) +REAL, INTENT(OUT) :: npp_acc_pft(land_pts,nsurft) +REAL, INTENT(OUT) :: npp_gb(land_pts) +REAL, INTENT(OUT) :: npp_pft(land_pts,nsurft) +REAL, INTENT(OUT) :: gpp_gb(land_pts) +REAL, INTENT(OUT) :: gpp_pft(land_pts,nsurft) +REAL, INTENT(OUT) :: resp_s(land_pts, dim_cs1) ! Soil respiration (kg C/m2/s) +REAL, INTENT(OUT) :: resp_s_tot(land_pts) ! Total soil resp'n (kg C/m2/s) +REAL, INTENT(OUT) :: resp_p(land_pts) +REAL, INTENT(OUT) :: resp_p_pft(land_pts,nsurft) +REAL, INTENT(OUT) :: g_leaf_pft(land_pts,npft) +!CABLE TYPES containing field data (IN OUT) +TYPE(progs_cbl_vars_type), INTENT(IN OUT) :: progs_cbl +TYPE(work_vars_type), INTENT(IN OUT) :: work_cbl +TYPE(progs_cnp_vars_type), INTENT(IN OUT) :: progs_cnp +!!!CABLE_LSM: End + +!-------------------------------------------------------------------- +! Outputs :- +!-1 Diagnostic (or effectively so - includes coupled model requisites):- + +! (a) Calculated anyway (use STASH space from higher level) :- +!-------------------------------------------------------------------- +REAL(KIND=real_jlslsm), INTENT(OUT) :: & + ecan(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! OUT Gridbox mean evaporation from + ! canopy/surface store (kg/m2/s). + ! Zero over sea. +,esoil_surft(land_pts,nsurft) & + ! OUT ESOIL for snow-free land tiles +,surf_ht_flux_land(tdims%i_start:tdims%i_end, & + tdims%j_start:tdims%j_end) & + ! OUT Net downward heat flux at + ! surface over land + ! fraction of gridbox (W/m2). +,ei_land(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! OUT Sublimation from lying snow + ! (kg/m2/s). +,surf_htf_surft(land_pts,nsurft) + ! OUT Net downward surface heat flux + ! on tiles (W/m2) + +!-2 Genuinely output, needed by other atmospheric routines :- + +REAL(KIND=real_jlslsm), INTENT(OUT) :: & + tstar_land(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) & + ! OUT Land mean sfc temperature (K) +,le_surft(land_pts,nsurft) & + ! OUT Surface latent heat flux for + ! land tiles +,radnet_surft(land_pts,nsurft) & + ! OUT Surface net radiation on + ! land tiles (W/m2) +,ei_surft(land_pts,nsurft) & + ! OUT EI for land tiles. +,ecan_surft(land_pts,nsurft) & + ! OUT ECAN for snow-free land tiles +,esoil_soilt(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end,nsoilt) & + ! OUT Surface evapotranspiration + ! from soil moisture store + ! (kg/m2/s). +,melt_surft(land_pts,nsurft) & + ! OUT Snowmelt on land tiles (kg/m2/s +,tstar_surft_old(land_pts,nsurft) & + ! OUT Tile surface temperatures at + ! beginning of timestep. +,non_lake_frac(land_pts) + ! OUT total tile fraction for surface types + ! other than inland water + +INTEGER, INTENT(OUT) :: & + ERROR ! OUT 0 - AOK; + ! 1 to 7 - bad grid definition detected; + +!New arguments replacing USE statements +! lake_mod (IN) +REAL(KIND=real_jlslsm), INTENT(IN) :: lake_h_ice_gb(land_pts) +! lake_mod (OUT) +REAL(KIND=real_jlslsm) :: surf_ht_flux_lake_ij(t_i_length,t_j_length) +! fluxes (IN) +REAL(KIND=real_jlslsm), INTENT(IN) :: anthrop_heat_surft(land_pts,nsurft) +! fluxes (OUT) +REAL(KIND=real_jlslsm), INTENT(OUT) :: surf_ht_store_surft(land_pts,nsurft) +! c_elevate (IN) +REAL(KIND=real_jlslsm), INTENT(IN) :: lw_down_elevcorr_surft(land_pts,nsurft) +! prognostics (IN) +INTEGER, INTENT(IN) :: nsnow_surft(land_pts,nsurft) +! jules_mod (IN) +REAL(KIND=real_jlslsm), INTENT(IN) :: snowdep_surft(land_pts,nsurft) + +!TYPES containing field data (IN OUT) +TYPE(crop_vars_type), INTENT(IN OUT) :: crop_vars + +!-------------------------------------------------------------------- +! Workspace :- +!-------------------------------------------------------------------- +REAL(KIND=real_jlslsm) :: & + elake_surft(land_pts,nsurft) & + ! Lake evaporation. +,melt_ice_surft(land_pts,nsurft) & + ! Ice melt on FLake lake tile (kg/m2/s) +,lake_ice_mass(land_pts) & + ! areal density equivalent to + ! lake ice of a given depth (kg/m2) +,snowmelt(tdims%i_start:tdims%i_end,tdims%j_start:tdims%j_end) + ! Snowmelt (kg/m2/s). + +REAL(KIND=real_jlslsm) :: & + canhc_surf(land_pts) + ! Areal heat capacity of canopy + ! for land tiles (J/K/m2). + +! Local scalars :- + +INTEGER :: & + i,j & + ! LOCAL Loop counter (horizontal field index). +,k & + ! LOCAL Tile pointer +,l & + ! LOCAL Land pointer +,n & + ! LOCAL Loop counter (tile index). +,m + ! Loop counter for soil tiles + +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='CABLE_LAND_SF_IMPLICIT' + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +!----------------------------------------------------------------------- + +! Calculate surface scalar fluxes, temperatures only at the 1st call +! of the subroutine (first stage of the new BL solver) using standard +! MOSES2 physics and equations. These are the final values for this +! timestep and there is no need to repeat the calculation. +!----------------------------------------------------------------------- + +ERROR = 0 + +!----------------------------------------------------------------------- +! 6.1 Convert FTL to sensible heat flux in Watts per square metre. +!----------------------------------------------------------------------- + +DO n = 1,nsurft + DO k = 1,surft_pts(n) + l = surft_index(k,n) + ftl_surft(l,n) = cp * ftl_surft(l,n) + END DO +END DO + +!----------------------------------------------------------------------- +! Land surface calculations +!----------------------------------------------------------------------- +!CABLE_LSM:likely unecessary initialization of radnet_surft +! initialise diagnostics to 0 to avoid packing problems +DO n = 1, nsurft + DO l = 1, land_pts + radnet_surft(l,n) = 0.0 + le_surft(l,n) = 0.0 + END DO +END DO + + + +!----------------------------------------------------------------------- +! Land surface calculations +!----------------------------------------------------------------------- +!CABLE_LSM: +DO N=1,Nsurft + DO L=1,LAND_PTS + MELT_surft(L,N) = 0. + ENDDO +ENDDO +!CABLE_LSM: End + +!CM3#56 - need to take a copy of tstart_surft prior to CABLE +! not needed to evaluate surf_ht_store_surft BUT it is an output needed by the UM +DO n = 1,nsurft +!$OMP DO SCHEDULE(STATIC) + DO k = 1,surft_pts(n) + l = surft_index(k,n) + tstar_surft_old(l,n) = tstar_surft(l,n) + END DO +!$OMP END DO NOWAIT +END DO + +!CM3#56 - use of REAL() in the call +! - ideally map %fe to the output le_surft in the unpack +! - check whether dtstar_surft is needed +! - this impacts on the CABLE redeclaration so cannot be a long-term fix +! - at some point we will need to sort out the CASA variables +call cable_implicit_main( tdims%i_end, tdims%j_end, land_pts, nsurft, npft, & + sm_levels, dim_cs1, cycleno, numcycles, & + timestep, timestep_number, land_index, & + surft_pts, surft_index, & + Fland, tile_frac, smvcst, & + ls_rain, ls_snow, con_rain, con_snow, & + tl_1, dtl1_1, qw_1, dqw1_1, ctctq1, & + canopy_gb, canopy_surft, t_soil_soilt(:,1,:), & + smcl_soilt(:,1,:), sthf_soilt(:,1,:), & + sthu_soilt(:,1,:), snow_surft, & + !returned fluxes etc + ftl_1, ftl_surft, fqw_1, fqw_surft, le_surft, & + tstar_surft, dtstar_surft, surf_ht_flux_land, surf_htf_surft, & + ecan_surft, esoil_surft, ei_surft, radnet_surft, & + gs, gs_surft, sf_diag% t1p5m_surft, & + sf_diag% q1p5m_surft, melt_surft, & + npp_gb, npp_pft, npp_acc_pft, gpp_gb, gpp_pft, & + resp_s, resp_s_tot, resp_p, resp_p_pft, g_leaf_pft, & + progs_cbl, work_cbl ) + +!!CABLE_LSM:End + +!$OMP PARALLEL & +!$OMP DEFAULT(NONE) & +!$OMP PRIVATE(l,n,j,i,k) & +!$OMP SHARED(tdims,nsurft,surft_pts,surft_index, & +!$OMP ftl_surft,nsoilt,land_pts,t_soil_soilt, & +!$OMP tstar_surft_old,tstar_surft,dtstar_surft,cp,error,tile_frac, & +!$OMP non_lake_frac,lake,l_flake_model,l_aggregate) + + +!----------------------------------------------------------------------- +! Optional error check : test for negative top soil layer temperature +!----------------------------------------------------------------------- +IF (l_neg_tstar) THEN + DO m = 1,nsoilt +!$OMP DO SCHEDULE(STATIC) + DO l = 1,land_pts + IF (t_soil_soilt(l,m,1) < 0) THEN + ERROR = 1 + WRITE(jules_message,*) & + '*** ERROR DETECTED BY ROUTINE JULES_LAND_SF_IMPLICIT ***' + CALL jules_print('jules_land_sf_implicit_jls',jules_message) + WRITE(jules_message,*) 'NEGATIVE TEMPERATURE IN TOP SOIL LAYER AT ' + CALL jules_print('jules_land_sf_implicit_jls',jules_message) + WRITE(jules_message,*) 'LAND POINT ',l + CALL jules_print('jules_land_sf_implicit_jls',jules_message) + END IF + END DO +!$OMP END DO NOWAIT + END DO +END IF + +!----------------------------------------------------------------------- +! Diagnose the land surface temperature +!----------------------------------------------------------------------- + +!CM3#56 - if needed this evaluation of tstart_surft_old should be before cable. +!DO n = 1,nsurft +!!$OMP DO SCHEDULE(STATIC) +! DO k = 1,surft_pts(n) +! l = surft_index(k,n) +! tstar_surft_old(l,n) = tstar_surft(l,n) +!!CABLE_LSM: use CABLE's tstar_tile +!!C! tstar_surft(l,n) = tstar_surft_old(l,n) + dtstar_surft(l,n) +! END DO +!!$OMP END DO NOWAIT +!END DO + +!----------------------------------------------------------------------- +! Calculate non_lake_frac +!----------------------------------------------------------------------- +!CM3#56 - this needs some thought and follow through as to where non_lake_frac is used +! - this appears to be linked solely to use of FLAKE so should remain as 1.0 +!$OMP DO SCHEDULE(STATIC) +DO l = 1,land_pts + ! initialise the non-lake fraction to one, not zero, + ! in case there should ever be more than one lake tile, see below + non_lake_frac(l) = 1.0 +END DO +!$OMP END DO NOWAIT + +!IF ( ( l_flake_model ) .AND. ( .NOT. l_aggregate) ) THEN +!!$OMP DO SCHEDULE(STATIC) +! DO l = 1,land_pts +! ! Remove FLake tile fraction. +! non_lake_frac(l) = non_lake_frac(l) - tile_frac(l,lake) +! END DO +!!$OMP END DO NOWAIT +!END IF + +!$OMP END PARALLEL + +!----------------------------------------------------------------------- +! 7. Surface evaporation components and updating of surface +! temperature (P245, routine SF_EVAP). +!----------------------------------------------------------------------- +!CABLE_LSM: +!CM2!CALL sf_evap ( & +!CM2! land_pts,nsurft, & +!CM2! land_index,surft_index,surft_pts,sm_levels,fland, & +!CM2! ashtf_prime_surft,canopy,dtrdz_charney_grid_1,flake,fraca, & +!CM2! snow_surft,resfs,resft,rhokh_surft,tile_frac,smc_soilt,wt_ext_surft, & +!CM2! timestep,r_gamma,fqw_1,fqw_surft,ftl_1,ftl_surft,tstar_surft, & +!CM2! ecan,ecan_surft,elake_surft,esoil_soilt,esoil_surft,ei_surft,ext_soilt, & +!CM2! sf_diag, non_lake_frac, & +!CM2! ! crop_vars_mod (IN) +!CM2! crop_vars%frac_irr_soilt, crop_vars%frac_irr_surft, & +!CM2! crop_vars%wt_ext_irr_surft, crop_vars%resfs_irr_surft, & +!CM2! ! crop_vars_mod (IN OUT) +!CM2! crop_vars%smc_irr_soilt, & +!CM2! ! crop_vars_mod (OUT) +!CM2! crop_vars%ext_irr_soilt) + +DO N=1,Nsurft + DO L=1,LAND_PTS + ELAKE_surft(L,N) = 0. + ENDDO +ENDDO + +DO j=tdims%j_start,tdims%j_end + DO i=tdims%i_start,tdims%i_end + ecan(i,j) = 0. + esoil_soilt(i,j,1) = 0. + ENDDO +ENDDO + +DO N=1,Nsurft + DO K=1,surft_PTS(N) + L = surft_INDEX(K,N) + j=(land_index(l)-1)/tdims%i_end + 1 + i = land_index(l) - (j-1)*tdims%i_end + ecan(i,j) = ecan(i,j) + tile_frac(l,n)*ecan_surft(l,n) + esoil_soilt(i,j,1) = esoil_soilt(i,j,1) + tile_frac(l,n)*esoil_surft(l,n) + ENDDO +ENDDO +!CABLE_LSM:End + +!----------------------------------------------------------------------- +! Surface melting of sea-ice and snow on land tiles. +!----------------------------------------------------------------------- + +!$OMP PARALLEL & +!$OMP DEFAULT(NONE) & +!$OMP PRIVATE(l,n,j,i) & +!$OMP SHARED(tdims,ei_land,snowmelt,nsurft,land_pts,melt_ice_surft) + +!$OMP DO SCHEDULE(STATIC) +DO j = tdims%j_start,tdims%j_end + DO i = tdims%i_start,tdims%i_end + ei_land(i,j) = 0.0 + snowmelt(i,j) = 0.0 + END DO +END DO +!$OMP END DO NOWAIT + +! Lake initialisation +DO n = 1,nsurft +!$OMP DO SCHEDULE(STATIC) + DO l = 1,land_pts + melt_ice_surft(l,n) = 0.0 + END DO +!$OMP END DO NOWAIT +END DO + +!$OMP END PARALLEL + +!CABLE_LSM: +DO n = 1,nsurft +!CM2! CALL sf_melt ( & +!CM2! land_pts,land_index, & +!CM2! surft_index(:,n),surft_pts(n),flandg, & +!CM2! alpha1(:,n),ashtf_prime_surft(:,n),dtrdz_charney_grid_1, & +!CM2! resft(:,n),rhokh_surft(:,n),tile_frac(:,n),timestep,r_gamma, & +!CM2! ei_surft(:,n),fqw_1,ftl_1,fqw_surft(:,n),ftl_surft(:,n), & +!CM2! tstar_surft(:,n),snow_surft(:,n),snowdep_surft(:,n), & +!CM2! melt_surft(:,n) & +!CM2! ) +!CM2! +!CM2! !----------------------------------------------------------------------- +!CM2! ! thermodynamic, flux contribution of melting ice on the FLake lake tile +!CM2! !----------------------------------------------------------------------- +!CM2! IF ( (l_flake_model ) & +!CM2! .AND. ( .NOT. l_aggregate) & +!CM2! .AND. (n == lake ) ) THEN +!CM2! +!CM2! ! lake_h_ice_gb is only initialised if FLake is on. +!CM2! +!CM2!!$OMP PARALLEL DO & +!CM2!!$OMP SCHEDULE(STATIC) & +!CM2!!$OMP DEFAULT(NONE) & +!CM2!!$OMP PRIVATE(l) & +!CM2!!$OMP SHARED(land_pts,lake_ice_mass,lake_h_ice_gb) +!CM2! DO l = 1, land_pts +!CM2! lake_ice_mass(l) = lake_h_ice_gb(l) * rho_ice +!CM2! END DO +!CM2!!$OMP END PARALLEL DO +!CM2! +!CM2! CALL sf_melt ( & +!CM2! land_pts,land_index, & +!CM2! surft_index(:,n),surft_pts(n),flandg, & +!CM2! alpha1(:,n),ashtf_prime_surft(:,n),dtrdz_charney_grid_1, & +!CM2! resft(:,n),rhokh_surft(:,n),tile_frac(:,n),timestep,r_gamma, & +!CM2! ei_surft(:,n),fqw_1,ftl_1,fqw_surft(:,n),ftl_surft(:,n), & +!CM2! tstar_surft(:,n),lake_ice_mass,lake_ice_mass / rho_snow_const, & +!CM2! melt_ice_surft(:,n) & +!CM2! ) +!CM2! END IF + + !----------------------------------------------------------------------- + ! Increment snow by sublimation and melt + !----------------------------------------------------------------------- + +!$OMP PARALLEL DO & +!$OMP SCHEDULE(STATIC) & +!$OMP DEFAULT(NONE) & +!$OMP PRIVATE(k,l,j,i) & +!$OMP SHARED(surft_pts,surft_index,land_index,t_i_length,ei_land,tile_frac, & +!$OMP ei_surft,snowmelt,melt_surft,n) + DO k = 1,surft_pts(n) + l = surft_index(k,n) + j=(land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + ei_land(i,j) = ei_land(i,j) + tile_frac(l,n) * ei_surft(l,n) + snowmelt(i,j) = snowmelt(i,j) + & + tile_frac(l,n) * melt_surft(l,n) + END DO +!$OMP END PARALLEL DO + +END DO + +!$OMP PARALLEL & +!$OMP DEFAULT(SHARED) & +!$OMP PRIVATE(l,n,j,i,k) + +IF (sf_diag%smlt) THEN +!$OMP DO SCHEDULE(STATIC) + DO j = tdims%j_start,tdims%j_end + DO i = tdims%i_start,tdims%i_end + sf_diag%snomlt_surf_htf(i,j) = lf * snowmelt(i,j) + END DO + END DO +!$OMP END DO NOWAIT +END IF + +!$OMP DO SCHEDULE(STATIC) +DO j = tdims%j_start,tdims%j_end + DO i = tdims%i_start,tdims%i_end + surf_ht_flux_land(i,j) = 0.0 + END DO +END DO +!$OMP END DO NOWAIT + +!CM3#56 - remove FLAKE model +!IF ( (l_flake_model ) & +! .AND. ( .NOT. l_aggregate) ) THEN +!!$OMP DO SCHEDULE(STATIC) +! DO j = tdims%j_start,tdims%j_end +! DO i = tdims%i_start,tdims%i_end +! surf_ht_flux_lake_ij(i,j) = 0.0 +! END DO +! END DO +!!$OMP END DO NOWAIT +!END IF + +!$OMP DO SCHEDULE(STATIC) +DO l = 1,land_pts + j=(land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + tstar_land(i,j) = 0.0 +END DO +!$OMP END DO NOWAIT + +!CABLE_LSM: +! initialise diagnostics to 0 to avoid packing problems +IF (sf_diag%l_lw_surft) THEN + DO n = 1, nsurft +!$OMP DO SCHEDULE(STATIC) + DO l = 1, land_pts + sf_diag%lw_up_surft(l,n) = 0.0 + sf_diag%lw_down_surft(l,n) = 0.0 + END DO +!$OMP END DO NOWAIT + END DO +END IF + +!$OMP BARRIER + +!CM3#56 - remove option for skyview +!IF (l_skyview) THEN +!CABLE_LSM: +!CM2! DO n = 1,nsurft +!CM2!!$OMP DO SCHEDULE(STATIC) +!CM2! DO k = 1,surft_pts(n) +!CM2! l = surft_index(k,n) +!CM2! j=(land_index(l) - 1) / tdims%i_end + 1 +!CM2! i = land_index(l) - (j-1) * tdims%i_end +!CM2! radnet_surft(l,n) = sw_surft(l,n) + emis_surft(l,n) * & +!CM2! sky(i,j) * ( lw_down(i,j) + lw_down_elevcorr_surft(l,n) & +!CM2! - sbcon * tstar_surft(l,n)**4 ) +!CM2! END DO +!CM2!!$OMP END DO +!CM2! END DO +! IF (sf_diag%l_lw_surft) THEN +! DO n = 1,nsurft +!!$OMP DO SCHEDULE(STATIC) +! DO k = 1,surft_pts(n) +! l = surft_index(k,n) +! j=(land_index(l) - 1) / tdims%i_end + 1 +! i = land_index(l) - (j-1) * tdims%i_end +! sf_diag%lw_up_surft(l,n) = emis_surft(l,n) * sky(i,j) * & +! sbcon * tstar_surft(l,n)**4 & +! + (1.0 - emis_surft(l,n)) * & +! sky(i,j) * (lw_down(i,j) + & +! lw_down_elevcorr_surft(l,n)) +! sf_diag%lw_down_surft(l,n) = sky(i,j) * (lw_down(i,j) + & +! lw_down_elevcorr_surft(l,n)) +! END DO +!!$OMP END DO +! END DO +! END IF +!ELSE +!CABLE_LSM: +!! DO n = 1,nsurft +!!!$OMP DO SCHEDULE(STATIC) +!! DO k = 1,surft_pts(n) +!! l = surft_index(k,n) +!! j=(land_index(l) - 1) / tdims%i_end + 1 +!! i = land_index(l) - (j-1) * tdims%i_end +!! radnet_surft(l,n) = sw_surft(l,n) + emis_surft(l,n) * & +!! ( lw_down(i,j) + lw_down_elevcorr_surft(l,n) & +!! - sbcon * tstar_surft(l,n)**4 ) +!! END DO +!!!$OMP END DO +!! END DO + IF (sf_diag%l_lw_surft) THEN + DO n = 1,nsurft +!$OMP DO SCHEDULE(STATIC) + DO k = 1,surft_pts(n) + l = surft_index(k,n) + j=(land_index(l) - 1) / tdims%i_end + 1 + i = land_index(l) - (j-1) * tdims%i_end + sf_diag%lw_up_surft(l,n) = emis_surft(l,n) * sbcon * & + tstar_surft(l,n)**4 & + + (1.0 - emis_surft(l,n)) * & + (lw_down(i,j) + & + lw_down_elevcorr_surft(l,n)) + sf_diag%lw_down_surft(l,n) = lw_down(i,j) + & + lw_down_elevcorr_surft(l,n) + END DO +!$OMP END DO + END DO + END IF +!END IF !CM3#56 + +!CM3#56 - remove surf_ht_store_surft and look to fill inside CABLE if needed +! - remove FLAKE code +! - remove evaluation of any tiled flux and look to fill from CABLE +DO n = 1,nsurft +!$OMP DO SCHEDULE(STATIC) + DO k = 1,surft_pts(n) + l = surft_index(k,n) + j=(land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + !canhc_surf(l) = canhc_surft(l,n) + !IF ( ( .NOT. cansnowtile(n)) .AND. l_snow_nocan_hc .AND. & + ! (nsmax > 0) .AND. (nsnow_surft(l,n) > 0) ) canhc_surf(l) = 0.0 + + !CM3#56 - set to zero for now - should be coming from CABLE anyway + surf_ht_store_surft(l,n) = 0.0 +! surf_ht_store_surft(l,n) = (canhc_surf(l) / timestep) * & +! (tstar_surft(l,n) - tstar_surft_old(l,n)) +!!!CABLE_LSM: Replaced with CABLE field +!! surf_htf_surft(l,n) = radnet_surft(l,n) + anthrop_heat_surft(l,n) - & +!! ftl_surft(l,n) - & +!! le_surft(l,n) - & +!! lf * (melt_surft(l,n) + melt_ice_surft(l,n)) - & +!! surf_ht_store_surft(l,n) + ! separate out the lake heat flux for FLake + ! and replace the snow-melt (NSMAX=0 only) and ice-melt heat fluxes + ! so Flake can do its melting + !IF ( (l_flake_model ) & + ! .AND. ( .NOT. l_aggregate) & + ! .AND. (n == lake ) ) THEN + ! IF (nsmax == 0) THEN + ! surf_ht_flux_lake_ij(i,j) = surf_htf_surft(l,n) & + ! + lf * (melt_surft(l,n) + melt_ice_surft(l,n)) + ! ELSE + ! surf_ht_flux_lake_ij(i,j) = surf_htf_surft(l,n) & + ! + lf * melt_ice_surft(l,n) + ! END IF + !ELSE + surf_ht_flux_land(i,j) = surf_ht_flux_land(i,j) & + + tile_frac(l,n) * surf_htf_surft(l,n) + !END IF + tstar_land(i,j) = tstar_land(i,j) & + + tile_frac(l,n) * tstar_surft(l,n) + END DO +!$OMP END DO +END DO + + ! normalise the non-lake surface heat flux +!CABLE_LSM: +!CM2!IF ( l_flake_model .AND. ( .NOT. l_aggregate) ) THEN +!CM2!!$OMP DO SCHEDULE(STATIC) +!CM2! DO l = 1,land_pts +!CM2! j=(land_index(l) - 1) / t_i_length + 1 +!CM2! i = land_index(l) - (j-1) * t_i_length +!CM2! ! be careful about gridboxes that are all lake +!CM2! IF (non_lake_frac(l) > EPSILON(0.0)) THEN +!CM2! surf_ht_flux_land(i,j) = surf_ht_flux_land(i,j) / non_lake_frac(l) +!CM2! END IF +!CM2! END DO +!CM2!!$OMP END DO +!CM2!END IF + +IF (sf_diag%l_lh_land) THEN +!$OMP DO SCHEDULE(STATIC) + DO l = 1,land_pts + sf_diag%lh_land(l) = SUM((tile_frac(l,:) * le_surft(l,:))) + END DO +!$OMP END DO +END IF + +!----------------------------------------------------------------------- +! Optional error check : test for negative surface temperature +!----------------------------------------------------------------------- +!CM3#56 revise to refer to CABLE not JULES +IF (l_neg_tstar) THEN +!$OMP DO SCHEDULE(STATIC) + DO l = 1,land_pts + j=(land_index(l) - 1) / t_i_length + 1 + i = land_index(l) - (j-1) * t_i_length + IF (tstar_land(i,j) < 0) THEN + ERROR = 1 + WRITE(jules_message,*) & + '*** ERROR DETECTED BY ROUTINE CABLE_LAND_SF_IMPLICIT ***' + CALL jules_print('cable_land_sf_implicit_cbl',jules_message) + WRITE(jules_message,*) 'NEGATIVE SURFACE TEMPERATURE AT LAND POINT ',l + CALL jules_print('cable_land_sf_implicit_cbl',jules_message) + END IF + END DO +!$OMP END DO +END IF + +!$OMP END PARALLEL + + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE cable_land_sf_implicit +END MODULE cable_land_sf_implicit_mod diff --git a/src/coupled/AM3/control/cable/cable_land/radiation/alloc_rad_albedo_vars_cbl.F90 b/src/coupled/AM3/control/cable/cable_land/radiation/alloc_rad_albedo_vars_cbl.F90 new file mode 100644 index 000000000..7c30b5c02 --- /dev/null +++ b/src/coupled/AM3/control/cable/cable_land/radiation/alloc_rad_albedo_vars_cbl.F90 @@ -0,0 +1,267 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** +MODULE alloc_rad_albedo_vars_mod + +!----------------------------------------------------------------------------- +! Description: +! Allocate and deallocate variables in the rad structure +! +! This MODULE is USEd in: +! cable_land_albedo_mod_cbl.F90 (JULES) +! +! This MODULE contains 2 public Subroutine: +! alloc_local_vars, +! flush_local_vars +! +! Code owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!----------------------------------------------------------------------------- + +IMPLICIT NONE +PUBLIC :: alloc_local_vars +PUBLIC :: flush_local_vars +PRIVATE + +CONTAINS + +! Allocate vars in mp format +SUBROUTINE alloc_local_vars( EffSurfRefl_beam, EffSurfRefl_dif, mp, nrb, & + reducedLAIdue2snow, HeightAboveSnow, coszen, & + ExtCoeff_beam, ExtCoeff_dif, EffExtCoeff_beam, & + EffExtCoeff_dif, CanopyTransmit_beam, & + CanopyTransmit_dif, CanopyRefl_beam, & + CanopyRefl_dif, RadFbeam, RadAlbedo, AlbSnow, c1, & + rhoch, xk, metDoY, SnowDepth, SnowDensity, & + SoilTemp, SnowAge, SW_down, veg_mask ) + +! Description: +! Allocate variables in the rad structure + +IMPLICIT NONE + +INTEGER :: mp, nrb +REAL, INTENT(OUT), ALLOCATABLE :: EffSurfRefl_dif(:,:) +REAL, INTENT(OUT), ALLOCATABLE :: EffSurfRefl_beam(:,:) +REAL, INTENT(OUT), ALLOCATABLE :: SnowDepth(:) +REAL, INTENT(OUT), ALLOCATABLE :: SnowDensity(:) +REAL, INTENT(OUT), ALLOCATABLE :: SoilTemp(:) +REAL, INTENT(OUT), ALLOCATABLE :: SnowAge( :) +REAL, INTENT(OUT), ALLOCATABLE :: reducedLAIdue2snow(:) ! Eff. LAI given snow +REAL, INTENT(OUT), ALLOCATABLE :: HeightAboveSnow(:) ! Canopy hgt above snow +REAL, INTENT(OUT), ALLOCATABLE :: coszen(:) +REAL, INTENT(OUT), ALLOCATABLE :: ExtCoeff_beam(:) +REAL, INTENT(OUT), ALLOCATABLE :: ExtCoeff_dif(:) +REAL, INTENT(OUT), ALLOCATABLE :: EffExtCoeff_beam(:,:) +REAL, INTENT(OUT), ALLOCATABLE :: EffExtCoeff_dif(:,:) +REAL, INTENT(OUT), ALLOCATABLE :: CanopyTransmit_dif(:,:) +REAL, INTENT(OUT), ALLOCATABLE :: CanopyTransmit_beam(:,:) +REAL, INTENT(OUT), ALLOCATABLE :: CanopyRefl_dif(:,:) +REAL, INTENT(OUT), ALLOCATABLE :: CanopyRefl_beam(:,:) +REAL, INTENT(OUT), ALLOCATABLE :: AlbSnow(:,:) +REAL, INTENT(OUT), ALLOCATABLE :: c1(:,:) +REAL, INTENT(OUT), ALLOCATABLE :: rhoch(:,:) +REAL, INTENT(OUT), ALLOCATABLE :: xk(:,:) +! these are dummies in JULES rad call but req'd to load arg lists +REAL, INTENT(OUT), ALLOCATABLE :: SW_down(:,:) ! dummy +REAL, INTENT(OUT), ALLOCATABLE :: RadFbeam(:,:) +REAL, INTENT(OUT), ALLOCATABLE :: RadAlbedo(:,:) +INTEGER, INTENT(OUT), ALLOCATABLE :: metDoY(:) ! can pass DoY from current_time +! vegetated mask required on albedo pathway +LOGICAL, INTENT(OUT), ALLOCATABLE :: veg_mask(:) + +IF ( .NOT. ALLOCATED(reducedLAIdue2snow) ) THEN + ALLOCATE( reducedLAIdue2snow(mp) ) +END IF +IF ( .NOT. ALLOCATED(HeightAboveSnow) ) THEN + ALLOCATE( HeightAboveSnow(mp) ) +END IF +IF ( .NOT. ALLOCATED(coszen) ) THEN + ALLOCATE( coszen(mp) ) +END IF +IF ( .NOT. ALLOCATED(EffSurfRefl_dif) ) THEN + ALLOCATE( EffSurfRefl_dif(mp, nrb) ) +END IF +IF ( .NOT. ALLOCATED(EffSurfRefl_beam) ) THEN + ALLOCATE( EffSurfRefl_beam(mp, nrb) ) +END IF +IF ( .NOT. ALLOCATED(SnowDepth) ) THEN + ALLOCATE( SnowDepth(mp) ) +END IF +IF ( .NOT. ALLOCATED(SnowDensity) ) THEN + ALLOCATE( SnowDensity(mp) ) +END IF +IF ( .NOT. ALLOCATED(SoilTemp) ) THEN + ALLOCATE( SoilTemp(mp) ) +END IF +IF ( .NOT. ALLOCATED(SnowAge) ) THEN + ALLOCATE( SnowAge(mp) ) +END IF +IF ( .NOT. ALLOCATED(ExtCoeff_beam) ) THEN + ALLOCATE( ExtCoeff_beam(mp) ) +END IF +IF ( .NOT. ALLOCATED(ExtCoeff_dif) ) THEN + ALLOCATE( ExtCoeff_dif(mp) ) +END IF +IF ( .NOT. ALLOCATED(EffExtCoeff_beam) ) THEN + ALLOCATE( EffExtCoeff_beam(mp, nrb) ) +END IF +IF ( .NOT. ALLOCATED(EffExtCoeff_dif) ) THEN + ALLOCATE( EffExtCoeff_dif(mp, nrb) ) +END IF +IF ( .NOT. ALLOCATED(CanopyTransmit_dif) ) THEN + ALLOCATE( CanopyTransmit_dif(mp, nrb)) +END IF +IF ( .NOT. ALLOCATED(CanopyTransmit_beam) ) THEN + ALLOCATE( CanopyTransmit_beam(mp,nrb) ) +END IF +IF ( .NOT. ALLOCATED(CanopyRefl_dif) ) THEN + ALLOCATE( CanopyRefl_dif(mp, nrb) ) +END IF +IF ( .NOT. ALLOCATED(CanopyRefl_beam) ) THEN + ALLOCATE( CanopyRefl_beam(mp, nrb) ) +END IF +IF ( .NOT. ALLOCATED(AlbSnow) ) THEN + ALLOCATE( AlbSnow(mp, nrb) ) +END IF +IF ( .NOT. ALLOCATED(c1) ) THEN + ALLOCATE( c1(mp, nrb) ) +END IF +IF ( .NOT. ALLOCATED(rhoch) ) THEN + ALLOCATE( rhoch(mp, nrb) ) +END IF +IF ( .NOT. ALLOCATED(xk) ) THEN + ALLOCATE( xk(mp, nrb) ) +END IF +IF ( .NOT. ALLOCATED(metDoY) ) THEN + ALLOCATE( metDoY(mp) ) +END IF +IF ( .NOT. ALLOCATED(SW_down) ) THEN + ALLOCATE( SW_down(mp,nrb) ) +END IF +IF ( .NOT. ALLOCATED(RadFbeam) ) THEN + ALLOCATE( RadFbeam(mp, nrb) ) +END IF +IF ( .NOT. ALLOCATED(RadAlbedo) ) THEN + ALLOCATE( RadAlbedo(mp, nrb) ) +END IF +IF (.NOT. ALLOCATED(veg_mask) ) THEN + ALLOCATE( veg_mask(mp) ) +END IF + +EffSurfRefl_dif(:,:) = 0.0 +EffSurfRefl_beam(:,:) = 0.0 +SnowDepth = 0.0 +SnowDensity = 0.0 +SoilTemp = 0.0 +SnowAge = 0.0 +coszen(:) = 0.0 +reducedLAIdue2snow(:) = 0.0 +HeightAboveSnow(:) = 0.0 +ExtCoeff_beam(:) = 0.0 +ExtCoeff_dif(:) = 0.0 +EffExtCoeff_beam(:,:) = 0.0 +EffExtCoeff_dif(:,:) = 0.0 +CanopyTransmit_dif(:,:) = 0.0 +CanopyTransmit_beam(:,:) = 0.0 +CanopyRefl_dif(:,:) = 0.0 +CanopyRefl_beam(:,:) = 0.0 +AlbSnow(:,:) = 0.0 +rhoch(:,:) = 0.0 +xk(:,:) = 0.0 +c1(:,:) = 0.0 +RadFbeam(:,:) = 0.0 +RadAlbedo(:,:) = 0.0 +SW_down(:,:) = 0.0 +metDoY(:) = 0 !can pass DoY from current_time% +veg_mask(:) = .FALSE. + +RETURN + +END SUBROUTINE alloc_local_vars + +!flush memory +SUBROUTINE flush_local_vars( EffSurfRefl_beam, EffSurfRefl_dif, SnowDepth, & + SnowDensity, SoilTemp, SnowAge, & + reducedLAIdue2snow, HeightAboveSnow, coszen, & + ExtCoeff_beam, ExtCoeff_dif, EffExtCoeff_beam, & + EffExtCoeff_dif, CanopyTransmit_beam, & + CanopyTransmit_dif, CanopyRefl_beam, & + CanopyRefl_dif, RadFbeam, RadAlbedo, AlbSnow, c1, & + rhoch, xk, metDoY, SW_down, veg_mask ) + +! Description: +! Deallocate variables in the rad structure + +IMPLICIT NONE + +REAL, INTENT(IN OUT), ALLOCATABLE :: EffSurfRefl_dif(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: EffSurfRefl_beam(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: SnowDepth(:) +REAL, INTENT(IN OUT), ALLOCATABLE :: SnowDensity(:) +REAL, INTENT(IN OUT), ALLOCATABLE :: SoilTemp(:) +REAL, INTENT(IN OUT), ALLOCATABLE :: SnowAge( :) +REAL, INTENT(IN OUT), ALLOCATABLE :: reducedLAIdue2snow(:) +REAL, INTENT(IN OUT), ALLOCATABLE :: HeightAboveSnow(:) +REAL, INTENT(IN OUT), ALLOCATABLE :: coszen(:) +!these local to CABLE and can be flushed every timestep +REAL, INTENT(IN OUT), ALLOCATABLE :: ExtCoeff_beam(:) +REAL, INTENT(IN OUT), ALLOCATABLE :: ExtCoeff_dif(:) +REAL, INTENT(IN OUT), ALLOCATABLE :: EffExtCoeff_beam(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: EffExtCoeff_dif(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: CanopyTransmit_dif(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: CanopyTransmit_beam(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: CanopyRefl_dif(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: CanopyRefl_beam(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: RadFbeam(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: RadAlbedo(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: AlbSnow(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: c1(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: rhoch(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: xk(:,:) +REAL, INTENT(IN OUT), ALLOCATABLE :: SW_down(:,:) ! dummy +LOGICAL, INTENT(IN OUT), ALLOCATABLE :: veg_mask(:) +INTEGER, INTENT(IN OUT), ALLOCATABLE :: metDoY(:) ! pass DoY from current_time + +IF ( ALLOCATED(EffSurfRefl_dif) ) DEALLOCATE ( EffSurfRefl_dif ) +IF ( ALLOCATED(EffSurfRefl_beam) ) DEALLOCATE ( EffSurfRefl_beam ) +IF ( ALLOCATED(SnowDepth) ) DEALLOCATE( SnowDepth ) +IF ( ALLOCATED(SnowDensity) ) DEALLOCATE( SnowDensity ) +IF ( ALLOCATED(SoilTemp) ) DEALLOCATE( SoilTemp ) +IF ( ALLOCATED(SnowAge) ) DEALLOCATE( SnowAge ) +IF ( ALLOCATED(reducedLAIdue2snow) ) DEALLOCATE( reducedLAIdue2snow ) +IF ( ALLOCATED(HeightAboveSnow) ) DEALLOCATE( HeightAboveSnow ) +IF ( ALLOCATED(coszen) ) DEALLOCATE( coszen ) +IF ( ALLOCATED (ExtCoeff_beam) ) DEALLOCATE (ExtCoeff_beam ) +IF ( ALLOCATED (ExtCoeff_dif) ) DEALLOCATE (ExtCoeff_dif ) +IF ( ALLOCATED (EffExtCoeff_beam) ) DEALLOCATE (EffExtCoeff_beam ) +IF ( ALLOCATED (EffExtCoeff_dif) ) DEALLOCATE (EffExtCoeff_dif ) +IF ( ALLOCATED (CanopyTransmit_dif) ) DEALLOCATE (CanopyTransmit_dif ) +IF ( ALLOCATED (CanopyTransmit_beam)) DEALLOCATE (CanopyTransmit_beam ) +IF ( ALLOCATED (CanopyRefl_dif) ) DEALLOCATE (CanopyRefl_dif ) +IF ( ALLOCATED (CanopyRefl_beam) ) DEALLOCATE (CanopyRefl_beam ) +IF ( ALLOCATED (RadFbeam) ) DEALLOCATE (RadFbeam ) +IF ( ALLOCATED (RadAlbedo) ) DEALLOCATE (RadAlbedo ) +IF ( ALLOCATED (AlbSnow) ) DEALLOCATE (AlbSnow ) +IF ( ALLOCATED (c1) ) DEALLOCATE (c1 ) +IF ( ALLOCATED (rhoch) ) DEALLOCATE (rhoch ) +IF ( ALLOCATED (xk) ) DEALLOCATE (xk ) +IF ( ALLOCATED (SW_down) ) DEALLOCATE (SW_down ) +IF ( ALLOCATED (MetDoY) ) DEALLOCATE (MetDoY ) +IF ( ALLOCATED (veg_mask) ) DEALLOCATE (veg_mask) + +RETURN +END SUBROUTINE flush_local_vars + +END MODULE alloc_rad_albedo_vars_mod diff --git a/src/coupled/AM3/control/cable/cable_land/radiation/cable_land_albedo_mod_cbl.F90 b/src/coupled/AM3/control/cable/cable_land/radiation/cable_land_albedo_mod_cbl.F90 new file mode 100644 index 000000000..b4ef968e8 --- /dev/null +++ b/src/coupled/AM3/control/cable/cable_land/radiation/cable_land_albedo_mod_cbl.F90 @@ -0,0 +1,386 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** + +MODULE cable_land_albedo_mod + +!----------------------------------------------------------------------------- +! Description: +! Computes the albedo for CABLE and returns it to JULES +! +! This MODULE is USEd in: +! surf_couple_radiation_mod.F90 (JULES) +! +! This MODULE contains 1 public Subroutine: +! cable_land_albedo +! Other Subroutines: +! cable_pack_Albsoil, +! cable_pack_progs +! +! Code owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!----------------------------------------------------------------------------- + +IMPLICIT NONE +PUBLIC :: cable_land_albedo +PRIVATE + +CONTAINS + +SUBROUTINE cable_land_albedo ( & + !OUT: JULES (per rad band) albedos [GridBoxMean & per tile albedo] + land_albedo , alb_surft, & + !IN: JULES dimensions and associated + row_length, rows, land_pts, nsurft, npft, & + surft_pts, surft_index, land_index, & + !IN: JULES Surface descriptions generally parametrized + tile_frac, LAI_pft_um, HGT_pft_um, soil_alb, & + !IN: JULES timestep varying fields + cosine_zenith_angle, snow_tile, & + !IN:CABLE dimensions from grid_constants_cbl + nrb, nrs, mp, & + !IN: CABLE specific surface_type indexes + ICE_Surfacetype, lakes_SurfaceType, ICE_SoilType, & + !IN: CABLE constants + Cz0surf_min, Clai_thresh, Ccoszen_tols, Cgauss_w, Cpi, Cpi180, & + !IN: CABLE prognostics. decl in progs_cbl_vars_mod.F90 + SoilTemp_CABLE, OneLyrSnowDensity_CABLE, SnowAge_CABLE, work, pars & +) +!------------------------------------------------------------------------------- +! Description: +! Provide (return) albedo(s) to JULES [land_albedo , alb_surft] +! per rad stream (VIS/NIR, Direct&Diffuse) [GridBoxMean & per tile albedo] +! Three main sections: +! 1. Pack CABLE variables from those passed from surf_couple_radiation() +! 2. Call CABLE's radiation/albedo scheme +! 3. Unpack albedos to send back to JULES +!------------------------------------------------------------------------------- + +! USE subroutines +! Route into CABLE & UNPACKING what we have computed for JULES +USE cable_rad_driv_mod, ONLY: cable_rad_driver +USE cable_rad_unpack_mod, ONLY: cable_rad_unpack + +! PACKING from JULES array dims to CABLE active tile 1-D vector +USE init_active_tile_mask_mod, ONLY: init_active_tile_mask_cbl +USE cable_pack_mod, ONLY: cable_pack_rr + +! Define CABLE grid, sunlit/veg masks & initialize surface type params +USE map_cable_parms_mod, ONLY: map_cable_parms +USE alloc_rad_albedo_vars_mod, ONLY: alloc_local_vars, flush_local_vars +USE cbl_masks_mod, ONLY: fveg_mask + +!Compute canopy exposed above (potential) snow +USE cbl_LAI_canopy_height_mod, ONLY: limit_HGT_LAI +USE hruff_eff_LAI_mod_cbl, ONLY: HgtAboveSnow, LAI_eff + +USE work_vars_mod_cbl, ONLY: work_vars_type ! and some kept thru timestep + +USE jules_soil_mod, ONLY: dzsoil +USE grid_constants_mod_cbl, ONLY: nsl +USE params_io_mod_cbl, ONLY: params_io_data_type + +IMPLICIT NONE +! re-decl dims necessary to declare OUT fields +!-- IN: JULES model dimensions +INTEGER, INTENT(IN) :: row_length, rows !# grid cell x, y +INTEGER, INTENT(IN) :: nsurft !# surface types, PFTS +INTEGER, INTENT(IN) :: land_pts !# land points on x,y grid +!--- IN: CABLE declared in grid_cell_constants_cbl +INTEGER, INTENT(IN) :: nrs !# rad streams + !(:,:,1) direct beam VIS + !(:,:,2) diffuse visible + !(:,:,3) direct beam NIR + !(:,:,4) diffuse NIR +!--- OUT: JULES (per rad band) albedos [GridBoxMean & per tile albedo] +REAL, INTENT(OUT) :: land_albedo(row_length,rows,nrs) ! [land_albedo_ij] +REAL, INTENT(OUT) :: alb_surft(Land_pts,nsurft,nrs) ! [alb_tile] + +!-- IN: JULES model dimensions +INTEGER, INTENT(IN) :: npft !# surface types, PFTS + +!---IN: JULES model associated +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points per PFT +INTEGER, INTENT(IN) :: surft_index(land_pts,nsurft) ! Index in land_pts array +INTEGER, INTENT(IN) :: land_index(land_pts) ! Index in (x,y) array + +!-- IN: JULES Surface descriptions generally parametrized +REAL, INTENT(IN) :: tile_frac(land_pts,nsurft) ! fraction of each surf type +REAL, INTENT(IN) :: LAI_pft_um(land_pts, npft) ! Leaf area index. +REAL, INTENT(IN) :: HGT_pft_um(land_pts, npft) ! Canopy height +REAL, INTENT(IN) :: soil_alb(land_pts) ! Snow-free, soil albedo + +!---IN: JULES timestep varying fields +REAL, INTENT(IN) :: cosine_zenith_angle(row_length,rows) ! zenith angle of sun +REAL, INTENT(IN) :: snow_tile(land_pts,nsurft) ! snow depth (units?) + +!--- IN: CABLE declared in grid_cell_constants_cbl +INTEGER, INTENT(IN) :: nrb !# rad bands VIS/NIR + Legacy LW +INTEGER, INTENT(OUT) :: mp ! curr. NOT requ'd OUT, however it likely will + +!--- IN: CABLE specific Surface/Soil type indexes +INTEGER, INTENT(IN) :: ICE_SurfaceType +INTEGER, INTENT(IN) :: lakes_SurfaceType +INTEGER, INTENT(IN) :: ICE_SoilType + +!---IN: CABLE constants +REAL, INTENT(IN) :: Cz0surf_min ! the minimum roughness of bare soil +REAL, INTENT(IN) :: Clai_thresh ! min. LAI signalling a cell is vegetated +REAL, INTENT(IN) :: Cgauss_w(nrb) ! Gaussian integration weights +REAL, INTENT(IN) :: Cpi ! PI +REAL, INTENT(IN) :: Cpi180 ! PI in radians +REAL, INTENT(IN) :: Ccoszen_tols ! sun rise/set threshold for zenith angle + ! signals daylit + +!---IN: CABLE prognostics. decl in progs_cbl_vars_mod.F90 +REAL, INTENT(IN) :: SoilTemp_CABLE(land_pts, nsurft ) +REAL, INTENT(IN) :: OneLyrSnowDensity_CABLE(land_pts, nsurft ) +REAL, INTENT(IN) :: SnowAge_CABLE(land_pts, nsurft ) + +TYPE(work_vars_type), INTENT(IN OUT) :: work +TYPE(params_io_data_type), INTENT(IN) :: pars + + +!--- local vars - Neither IN nor OUT (passed to subrs) + +LOGICAL, ALLOCATABLE :: L_tile_pts(:,:) ! TRUE where tile_frac > 0 + +! Albedos req'd by JULES - Effective Surface Relectance as seen by atmosphere +REAL, ALLOCATABLE :: EffSurfRefl_dif(:,:) +REAL, ALLOCATABLE :: EffSurfRefl_beam(:,:) + +! vegetated mask required on albedo pathway +LOGICAL, ALLOCATABLE :: veg_mask(:) + +! Formerly canopy%vlaiw, rough%hruff SAVEd after explicit call to CABLE +REAL, ALLOCATABLE :: reducedLAIdue2snow(:) ! Eff. LAI IF snow [canopy%vlaiw] +REAL, ALLOCATABLE :: HeightAboveSnow(:) ! Canopy Hgt above snow (rough%hruff) + +! arrays to map IN progs to CABLE vector length +REAL, ALLOCATABLE :: SnowDepth(:) ! Total Snow depth - water eqivalent - + ! ssnow%snowd +REAL, ALLOCATABLE :: SnowDensity(:) ! Total Snow density (assumes 1 layer +REAL, ALLOCATABLE :: SoilTemp(:) ! Soil Temperature of top layer (soil%tgg) +REAL, ALLOCATABLE :: SnowAge(:) ! Snow age (assumes 1 layer describes snow + ! ssnow%isflag + +REAL, ALLOCATABLE :: coszen(:) + +REAL, ALLOCATABLE :: ExtCoeff_beam(:) +REAL, ALLOCATABLE :: ExtCoeff_dif(:) +REAL, ALLOCATABLE :: EffExtCoeff_beam(:,:) +REAL, ALLOCATABLE :: EffExtCoeff_dif(:,:) +REAL, ALLOCATABLE :: CanopyTransmit_dif(:,:) +REAL, ALLOCATABLE :: CanopyTransmit_beam(:,:) +REAL, ALLOCATABLE :: CanopyRefl_dif(:,:) +REAL, ALLOCATABLE :: CanopyRefl_beam(:,:) +REAL, ALLOCATABLE :: RadFbeam(:,:) +REAL, ALLOCATABLE :: RadAlbedo(:,:) +REAL, ALLOCATABLE :: AlbSnow(:,:) +REAL, ALLOCATABLE :: c1(:,:) +REAL, ALLOCATABLE :: rhoch(:,:) +REAL, ALLOCATABLE :: xk(:,:) +! used in Calc of Beam calculation NOT on rad/albedo path. +! However Needed to fulfill arg list with dummy +REAL, ALLOCATABLE :: SW_down(:, :) ! NA at surf_couple_rad layer +INTEGER, ALLOCATABLE :: metDoY(:) ! can pass DoY from current_time + +LOGICAL :: jls_standalone = .FALSE. +LOGICAL :: jls_radiation = .TRUE. !um_radiation = jls_radiation +LOGICAL, SAVE :: first_call = .TRUE. !only initialize params on first call + +INTEGER :: i +CHARACTER(LEN=*), PARAMETER :: subr_name = "cable_rad_main" +! End header + +! initialise INTENT(OUT) fields +land_albedo = 0.0; alb_surft = 0.0 + +! Determine the number of active tiles +mp = SUM(surft_pts) + +! Define mapping mask. i.e. l_tile_pts =TRUE (active) , where tile_frac > 0 +CALL init_active_tile_mask_cbl(l_tile_pts, land_pts, nsurft, tile_frac ) + +! alloc/zero each timestep +! metDoY, SW_down, RadFbeaam, RadAlbedo NOT used on rad/albedo path. +! Nevertheless, need to fulfill later arg list(s) with dumies +CALL alloc_local_vars( EffSurfRefl_beam, EffSurfRefl_dif, mp, nrb, & + reducedLAIdue2snow, HeightAboveSnow, coszen, & + ExtCoeff_beam, ExtCoeff_dif, EffExtCoeff_beam, & + EffExtCoeff_dif, CanopyTransmit_beam, & + CanopyTransmit_dif, CanopyRefl_beam, CanopyRefl_dif, & + RadFbeam, RadAlbedo, AlbSnow, c1, rhoch, xk, metDoY, & + SnowDepth, SnowDensity, SoilTemp, SnowAge, & + SW_down, veg_mask ) +! ----------------------------------------------------------------------------- +! 1. PACK CABLE fields +! ----------------------------------------------------------------------------- + +! map PFT/soil parameters to mp format +IF( first_call) THEN + CALL map_cable_parms( mp, nsl, nrb, land_pts, nsurft, l_tile_pts, & + ICE_SurfaceType,ICE_SoilType, dzsoil, work%veg, & + work%soil, pars, tile_frac ) + + ! Pack UM spatial (per landpoint) bare soil albedo to mp vector for CABLE + CALL cable_pack_Albsoil( work%soil%albsoil, soil_alb, mp, nrb, l_tile_pts, & + nsurft, land_pts ) + + first_call = .FALSE. +END IF +! Pack UM spatial (per cell) zenith angle to mp vector for CABLE +CALL cable_pack_rr( coszen, cosine_zenith_angle, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +! Pack UM spatial (per landpoint,ntile) CABLE prognostics to mp vector +CALL cable_pack_progs( SnowDepth, SnowDensity, SoilTemp, SnowAge, mp, & + land_pts, nsurft, l_tile_pts, snow_tile, & + OneLyrSnowDensity_CABLE, SoilTemp_CABLE, SnowAge_CABLE ) +! ----------------------------------------------------------------------------- + +! limit IN height, LAI and initialize some existing cable % types +CALL limit_HGT_LAI( work%veg%vlai, work%veg%hc, mp, land_pts, nsurft, npft, & + surft_pts, surft_index, tile_frac, l_tile_pts, & + LAI_pft_um, HGT_pft_um, CLAI_thresh ) + +! set Height of Canopy above snow (rough%hruff) +CALL HgtAboveSnow( HeightAboveSnow, mp, Cz0surf_min, work%veg%hc, & + SnowDepth, SnowDensity ) + +! set Effective LAI considering potential snow coverage [cabopy%vlaiw] +CALL LAI_eff( mp, work%veg%vlai, work%veg%hc, HeightAboveSnow, reducedLAIdue2snow) + +! Define logical mask for vegetated mp cell +CALL fveg_mask( veg_mask, mp, Clai_thresh, reducedLAIdue2snow ) + +work%reducedLAIdue2snow(1:mp) = reducedLAIdue2snow(:) + +!------------------------------------------------------------------------------ +! 2. Call CABLE_rad_driver to run specific and necessary components of CABLE +!------------------------------------------------------------------------------ +CALL cable_rad_driver( EffSurfRefl_beam, EffSurfRefl_dif, land_pts, & + mp, nrb, ICE_SoilType, lakes_SurfaceType, Clai_thresh, & + Ccoszen_tols, CGauss_w, Cpi, Cpi180, Cz0surf_min, & + veg_mask, jls_standalone, jls_radiation, work%veg%iveg, & + work%soil%isoilm, work%veg%vlai, work%veg%hc, & + SnowDepth, SnowDensity, SoilTemp, SnowAge, & + work%soil%albsoil, coszen, work%veg%Xfang, & + work%veg%Taul, work%veg%Refl, HeightAboveSnow, & + reducedLAIdue2snow, ExtCoeff_beam, ExtCoeff_dif, & + EffExtCoeff_beam, EffExtCoeff_dif, CanopyTransmit_beam,& + CanopyTransmit_dif, CanopyRefl_beam,CanopyRefl_dif, c1, & + rhoch, xk, AlbSnow, RadFbeam, RadAlbedo, metDoY, SW_down) + +!------------------------------------------------------------------------------ +! 3. Unpack variables (CABLE computed albedos) to JULES +!------------------------------------------------------------------------------ +CALL cable_rad_unpack( land_albedo, alb_surft, mp, nrs, row_length, rows, & + land_pts, nsurft, surft_pts, surft_index, & + land_index, tile_frac, l_tile_pts, & + EffSurfRefl_beam, EffSurfRefl_dif ) + +CALL flush_local_vars( EffSurfRefl_beam, EffSurfRefl_dif,SnowDepth, & + SnowDensity, SoilTemp, SnowAge, reducedLAIdue2snow, & + HeightAboveSnow, coszen, ExtCoeff_beam, ExtCoeff_dif, & + EffExtCoeff_beam, EffExtCoeff_dif, CanopyTransmit_beam, & + CanopyTransmit_dif, CanopyRefl_beam, CanopyRefl_dif, & + RadFbeam, RadAlbedo, AlbSnow, c1, rhoch, xk, metDoY, & + SW_down, veg_mask ) + +! for completeness flick switches before leaving +jls_radiation= .FALSE. + +RETURN + +END SUBROUTINE cable_land_albedo + +!============================================================================== +SUBROUTINE cable_pack_Albsoil( AlbSoil, soil_alb, mp, nrb, l_tile_pts, & + nsurft, land_pts ) + +! Description: +! Pack spatial UM bare soil albedo to CABLE dimensions, HOWEVER limited by +! JULES typically has one soil type per cell & no distiction b//n rad bands + +IMPLICIT NONE + +REAL, INTENT(OUT) :: AlbSoil(:, :) +INTEGER, INTENT(IN) :: mp, nsurft, land_pts, nrb +LOGICAL, INTENT(IN) :: L_tile_pts(land_pts, nsurft) +REAL, INTENT(IN) :: soil_alb(land_pts) +!local vars: +REAL :: fvar(land_pts, nsurft) +INTEGER :: n,l + +AlbSoil(:,:) = 0.0 ! albsoil(:,3) stays = 0.0 +fvar(:, :) = 0.0 + +DO n = 1, nsurft + DO l = 1, land_pts + fvar(l,n) = soil_alb(l) + END DO +END DO + +AlbSoil(:,1) = PACK(fvar, l_tile_pts) +AlbSoil(:,2) = AlbSoil(:,1) + +RETURN +END SUBROUTINE cable_pack_Albsoil + +SUBROUTINE cable_pack_progs( SnowDepth, SnowDensity,SoilTemp, SnowAge, & + mp, land_pts, nsurft, l_tile_pts, & + snow_tile, OneLyrSnowDensity_CABLE, & + SoilTemp_CABLE, SnowAge_CABLE ) + +! Description: +! Pack CABLE prognostics n CABLE dimensions from passed JULES vars + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: land_pts, nsurft, mp + +! map IN progs to CABLE veector length +REAL, INTENT(OUT), ALLOCATABLE :: SnowDepth(:) ! Tot Snow depth - water eqiv. +REAL, INTENT(OUT), ALLOCATABLE :: SnowDensity(:) ! Snow density-assumes 1 layer +REAL, INTENT(OUT), ALLOCATABLE :: SoilTemp(:) ! Soil Temp. of top layer +REAL, INTENT(OUT), ALLOCATABLE :: SnowAge(:) ! Snow age (assumes 1 layer) + +LOGICAL, INTENT(IN) :: l_tile_pts(land_pts, nsurft ) + +!---IN: CABLE prognostics. decl in progs_cbl_vars_mod.F90 +REAL, INTENT(IN) :: SoilTemp_CABLE(land_pts, nsurft ) +REAL, INTENT(IN) :: OneLyrSnowDensity_CABLE(land_pts, nsurft ) +REAL, INTENT(IN) :: SnowAge_CABLE(land_pts, nsurft ) +REAL, INTENT(IN) :: snow_tile(land_pts,nsurft) ! snow depth (units?) + +IF ( .NOT. ALLOCATED(SnowDepth) ) ALLOCATE( SnowDepth(mp) ) +IF ( .NOT. ALLOCATED(SnowDensity) ) ALLOCATE( SnowDensity(mp) ) +IF ( .NOT. ALLOCATED(SoilTemp) ) ALLOCATE( SoilTemp(mp) ) +IF ( .NOT. ALLOCATED(SnowAge) ) ALLOCATE( SnowAge(mp) ) + +!Store Snow Depth from previous timestep. Treat differently on 1st timestep +SnowDepth = PACK( snow_tile, l_tile_pts ) +SnowDensity = PACK( OneLyrSnowDensity_CABLE, l_tile_pts ) + +!Surface skin/top layer Soil/Snow temperature +SoilTemp = PACK( SoilTemp_CABLE(:,:), l_tile_pts ) +SnowAge = PACK( SnowAge_CABLE(:,:), l_tile_pts ) + +RETURN + +END SUBROUTINE cable_pack_progs + +END MODULE cable_land_albedo_mod + diff --git a/src/coupled/AM3/control/cable/interface/explicit/cable_explicit_driver.F90 b/src/coupled/AM3/control/cable/interface/explicit/cable_explicit_driver.F90 new file mode 100644 index 000000000..ef2d3d401 --- /dev/null +++ b/src/coupled/AM3/control/cable/interface/explicit/cable_explicit_driver.F90 @@ -0,0 +1,280 @@ +MODULE cable_explicit_driv_mod + +CONTAINS + +SUBROUTINE cable_explicit_driver( & + ! IN: UM/JULES/CABLE model/grid parameters, fields, mappings + mype, row_length, rows, land_pts, nsurft, npft, sm_levels, dzsoil, & + timestep, timestep_number, mp, nrb, land_index, surft_pts, surft_index, & + l_tile_pts, latitude, longitude, cos_zenith_angle, Fland, tile_frac, & + + ! IN: soil parameters !1 is only allowable index in UM + bexp, hcon, satcon, sathh, smvcst, smvcwt, smvccl, albsoil, & + + ! IN: SW forcing: manipulated for CABLE + sw_down_VIS, sw_down_NIR, beamFrac_VIS, beamFrac_NIR, beamFrac_TOT, & + + ! IN: Met forcing: + lw_down, ls_rain, ls_snow, & + tl_1, qw_1, vshr_land, pstar, z1_tq, z1_uv, canopy_tile, & + ! This an outlier IN here. INOUT @ implicit. (was)OUT at extras + ! I think we are dealing with it OK now but confusion could be removed + snow_tile, & + + ! IN: canopy height, LAI seasonally presecribed, potentially prognostic + ! IN: CO2 mass mixing ratio + canht_pft, lai_pft, CO2_MMR, & + + ! IN: carries vegin/soilin - potentially redundant + pars, & + + ! IN: tiled soil/snow prognostics - IN here. INOUT @ implicit + progs_soiltemp, progs_soilmoisture, progs_FrozenSoilFrac, & + progs_ThreeLayerSnowFlag, progs_SnowDepth, progs_SnowMass, & + progs_SnowTemp, progs_SnowDensity, progs_snowage, progs_snowosurft, & + progs_OneLyrSnowDensity, & + + ! INOUT: CABLE TYPEs roughly grouped fields per module + rad, met, rough, canopy, veg, soil, ssnow, bal, air, bgc, sum_flux, & + + !OUT: currently being passed back to UM in veg%iveg, soil%isoilm + SurfaceType, SoilType, & + !OUT: currently being passed back to UM in veg%hc, veg%vlai + HGT_pft_cbl, LAI_pft_cbl, & + + !IN: currently being passed from prev radiation call through work% + ! jhan:quirky, snow (in turn reduced LAI due to snow) can evolve through a + ! constant rad dt. However reducedLAIdue2snow used ubiquitously as trigger + ! Further, snow does NOT evolve in explicit AND reducedLAIdue2snow absent + ! in implicit + reducedLAIdue2snow, & + + !GW + !visc_sublayer_depth, smgw_tile, slope_avg, slope_std, + !dz_gw, perm_gw, drain_gw, + !casa progs + !CPOOL_TILE, NPOOL_TILE, PPOOL_TILE, SOIL_ORDER, NIDEP, + !NIFIX, PWEA, PDUST, GLAI, PHENPHASE, + + !IN: if not passed a dangling argument would ensue + npp_pft_acc, resp_w_pft_acc ) + +! subrs called +USE cbl_um_init_mod, ONLY: init_data +USE cbl_um_update_mod, ONLY: update_data +USE cable_cbm_module, ONLY: cbm_expl + +! data +USE grid_constants_mod_cbl, ONLY: ICE_SoilType, nsl, nsnl +USE cable_phys_constants_mod, ONLY: density_liq, density_ice, tfrz +USE cable_surface_types_mod, ONLY: ICE_SurfaceType => ICE_cable + + +USE params_io_mod_cbl, ONLY: params_io_data_type +USE params_io_mod_cbl, ONLY: params_io_type + + +USE cable_def_types_mod, ONLY : climate_type +USE cable_def_types_mod, ONLY : met_type, radiation_type, veg_parameter_type, & + soil_parameter_type, roughness_type, & + canopy_type, soil_snow_type, balances_type, & + air_type, bgc_pool_type, sum_flux_type + +!--- processor number, timestep number, timestep width !ultimately get rid of these - pass %runtime through parent +USE cable_common_module, ONLY : knode_gl, ktau_gl, kwidth_gl, cable_runtime, cable_user, redistrb, satuparam,wiltparam +!block!USE casavariable +!block!USE casa_types_mod + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: mype +INTEGER, INTENT(IN) :: timestep_number +REAL, INTENT(IN) :: timestep +INTEGER, INTENT(IN) :: row_length ! # columns in spatial grid +INTEGER, INTENT(IN) :: rows ! # rows in spatial grid +INTEGER, INTENT(IN) :: land_pts ! # land points +INTEGER, INTENT(IN) :: nsurft ! # tiles +INTEGER, INTENT(IN) :: npft ! # plant functional types +INTEGER, INTENT(IN) :: sm_levels ! # soil layers +REAL, INTENT(IN) :: dzsoil(sm_levels) ! soil layer thicknesses +INTEGER, INTENT(IN) :: mp ! # active land points +INTEGER, INTENT(IN) :: nrb ! # radiation bands +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points on each tile +INTEGER, INTENT(IN) :: land_index(land_pts) ! index of land points +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! index of tile points +LOGICAL, INTENT(IN) :: l_tile_pts(land_pts, nsurft) + +REAL, INTENT(IN) :: canht_pft(land_pts, npft) +REAL, INTENT(IN) :: lai_pft(land_pts, npft) +REAL, INTENT(IN) :: fland(land_pts) + +REAL, INTENT(IN) :: co2_mmr +REAL, INTENT(IN) :: tile_frac(land_pts, nsurft) +REAL, INTENT(IN) :: cos_zenith_angle(row_length,rows) + +REAL, INTENT(IN) :: latitude(row_length,rows) +REAL, INTENT(IN) :: longitude(row_length,rows) + +REAL, INTENT(IN) :: bexp (land_pts, sm_levels) + ! => parameter b in Campbell equation +REAL, INTENT(IN) :: satcon(land_pts, sm_levels) + ! hydraulic conductivity @ saturation [mm/s] +REAL, INTENT(IN) :: sathh(land_pts, sm_levels) +REAL, INTENT(IN) :: smvcst(land_pts, sm_levels) +REAL, INTENT(IN) :: smvcwt(land_pts, sm_levels) +REAL, INTENT(IN) :: smvccl(land_pts, sm_levels) + +REAL, INTENT(IN) :: hcon(land_pts) ! Soil thermal conductivity (W/m/K). +REAL, INTENT(IN) :: albsoil(land_pts) +REAL, INTENT(IN) :: reducedLAIdue2snow(mp) + +TYPE(params_io_data_type), INTENT(IN) :: pars +TYPE(met_type), INTENT(OUT) :: met +TYPE(radiation_type), INTENT(OUT) :: rad +TYPE(roughness_type), INTENT(OUT) :: rough +TYPE(soil_snow_type), INTENT(OUT) :: ssnow +TYPE(balances_type), INTENT(OUT) :: bal +TYPE(canopy_type), INTENT(OUT) :: canopy +TYPE(air_type), INTENT(OUT) :: air +TYPE(bgc_pool_type), INTENT(OUT) :: bgc +TYPE(sum_flux_type), INTENT(OUT) :: sum_flux +TYPE(veg_parameter_type), INTENT(OUT) :: veg ! vegetation parameters +TYPE(soil_parameter_type), INTENT(OUT) :: soil ! soil parameters + +! "forcing" +REAL, INTENT(IN) :: lw_down(row_length,rows) +REAL, INTENT(IN) :: ls_rain(row_length,rows) +REAL, INTENT(IN) :: ls_snow(row_length,rows) +REAL, INTENT(IN) :: tl_1(row_length,rows) +REAL, INTENT(IN) :: qw_1(row_length,rows) +REAL, INTENT(IN) :: vshr_land(row_length,rows) +REAL, INTENT(IN) :: pstar(row_length,rows) +REAL, INTENT(IN) :: z1_tq(row_length,rows) +REAL, INTENT(IN) :: z1_uv(row_length,rows) + +REAL, INTENT(IN) :: sw_down_VIS(row_length,rows) +REAL, INTENT(IN) :: sw_down_NIR(row_length,rows) +REAL, INTENT(IN) :: beamFrac_VIS(row_length,rows) +REAL, INTENT(IN) :: beamFrac_NIR(row_length,rows) +REAL, INTENT(IN) :: beamFrac_TOT(row_length,rows) + +! prognostics +REAL, INTENT(IN) :: canopy_tile(land_pts, nsurft) +REAL, INTENT(IN) :: snow_tile(land_pts, nsurft) +REAL, INTENT(IN) :: progs_soiltemp(land_pts, nsurft, sm_levels) +REAL, INTENT(IN) :: progs_soilmoisture(land_pts, nsurft, sm_levels) +REAL, INTENT(IN) :: progs_FrozenSoilFrac(land_pts, nsurft, sm_levels) +REAL, INTENT(IN) :: progs_SnowDepth(land_pts, nsurft,nsnl) +REAL, INTENT(IN) :: progs_SnowTemp(land_pts, nsurft,nsnl) +REAL, INTENT(IN) :: progs_SnowMass(land_pts, nsurft,nsnl) +REAL, INTENT(IN) :: progs_SnowDensity(land_pts, nsurft,nsnl) +REAL, INTENT(IN) :: progs_snowosurft(land_pts, nsurft) +REAL, INTENT(IN) :: progs_OneLyrSnowDensity(land_pts, nsurft) +REAL, INTENT(IN) :: progs_snowage(land_pts, nsurft) +INTEGER, INTENT(IN) :: progs_ThreeLayerSnowFlag(land_pts, nsurft) + +INTEGER, INTENT(IN) :: SurfaceType(mp) !CABLE surface tile PFT/nveg +INTEGER, INTENT(IN) :: SoilType(mp) !CABLE soil type per tile +REAL, INTENT(OUT) :: HGT_pft_cbl(mp) +REAL, INTENT(OUT) :: LAI_pft_cbl(mp) + +!!jh:8/23 this was a problem BUT was never an issue because it is defined before it is used in soilsnow() +!!snow_cond, & +!GW progs: +!! REAL, DIMENSION(land_pts) :: & +!! slope_avg,& +!! slope_std,& +!! dz_gw,sy_gw,perm_gw,drain_gw +!!REAL :: smgw_tile(land_pts,nsurft) +!!REAL, DIMENSION(land_pts, nsurft) :: & +!! !visc_sublayer_depth +!GW progs: End + +!CASA progs: +!!REAL, DIMENSION(land_pts,nsurft,10) :: & +!! CPOOL_TILE, & ! Carbon Pools +!! NPOOL_TILE ! Nitrogen Pools + +!!REAL, DIMENSION(land_pts,nsurft,12) :: & +!! PPOOL_TILE ! Phosphorus Pools + +!!REAL, DIMENSION(land_pts) :: & +!! SOIL_ORDER, & ! Soil Order (1 to 12) +!! NIDEP, & ! Nitrogen Deposition +!! NIFIX, & ! Nitrogen Fixation +!! PWEA, & ! Phosphorus from Weathering +!! PDUST ! Phosphorus from Dust + +!! GLAI, & ! Leaf Area Index for Prognostics LAI +!! PHENPHASE, & ! Phenology Phase for Casa-CNP +REAL, INTENT(IN) :: npp_pft_acc(land_pts,npft) +REAL, INTENT(IN) :: resp_w_pft_acc(land_pts,npft) +!CASA progs: End + +!___ local vars +!jhan: this can be moved and USEd - needed to pass arg +TYPE (climate_type) :: climate ! climate variables +REAL :: rho_water, rho_ice + +LOGICAL, SAVE :: first_call = .TRUE. +CHARACTER(LEN=*), PARAMETER :: subr_name = "cable_explicit_driver" + +rho_water = density_liq +rho_ice = density_liq + +IF (cable_user%GW_model) then + rho_ice = density_ice +ENDIF + +IF(first_call) THEN + !--- fill CABLE fields from UM ancillaries/fields, CABLE prognostics + CALL init_data( row_length, rows, land_pts, nsurft, npft, sm_levels, & + nsnl, dzsoil, mp, nrb, CO2_MMR, tfrz, ICE_SurfaceType, & + ICE_SoilType, land_index, surft_pts, surft_index, tile_frac, & + L_tile_pts, albsoil, bexp, hcon, satcon, sathh, smvcst, & + smvcwt, smvccl, pars, tl_1, snow_tile, progs_soiltemp, & + progs_soilmoisture, progs_FrozenSoilFrac, & + progs_OneLyrSnowDensity, progs_snowage, & + progs_ThreeLayerSnowFlag, progs_SnowDensity, progs_SnowDepth,& + progs_SnowTemp, progs_SnowMass, rad%trad, met%tk, veg, soil, & + canopy, ssnow, bgc, sum_flux, SurfaceType, SoilType, & + npp_pft_acc,resp_w_pft_acc ) + + !CALL init_data_sci( nsl, nsnl, soil%zse, mp, tfrz, ICE_SoilType, rad%trad, & + ! met%tk, veg, soil, canopy, ssnow ) + + first_call = .FALSE. + +ENDIF + +!--- update CABLE fields from UM forcings and equivalent fields at tis timestep + +CALL update_data( row_length, rows, land_pts, nsurft, npft, sm_levels, & + nsnl, timestep, timestep_number, mp, nrb, CO2_MMR, canht_pft,& + lai_pft, land_index, surft_pts, surft_index, tile_frac, & + L_tile_pts, cos_zenith_angle, latitude, longitude, & + sw_down_VIS, sw_down_NIR, beamFrac_VIS, beamFrac_NIR, & + beamFrac_TOT, lw_down, ls_rain, ls_snow, tl_1, qw_1, & + vshr_land, pstar, z1_tq, z1_uv, canopy_tile, rad, met, & + veg, soil, rough, canopy, ssnow, HGT_pft_cbl, LAI_pft_cbl, & + reducedLAIdue2snow ) + +!CALL update_data_sci( mp, rad, met, veg, soil, canopy, ssnow, & +! canopy%vlaiw ) + +!---------------------------------------------------------------------! +!--- Feedback prognostic vcmax and daily LAI from casaCNP to CABLE ---! +!---------------------------------------------------------------------! +!block!IF(l_vcmaxFeedbk) call casa_feedback(ktau_gl,veg,casabiome,casapool,casamet) +!block!IF(l_laiFeedbk) veg%vlai(:) = casamet%glai(:) + +!---------------------------------------------------------------------! +!--- cbm "mainly" controls the calling of model components ---! +!---------------------------------------------------------------------! +CALL cbm_expl( mp, nrb, timestep_number, timestep, air, bgc, canopy, met, bal, & + rad, rough, soil, ssnow, sum_flux, veg, climate ) + +RETURN +END SUBROUTINE cable_explicit_driver + +END MODULE cable_explicit_driv_mod diff --git a/src/coupled/AM3/control/cable/interface/explicit/cable_explicit_main.F90 b/src/coupled/AM3/control/cable/interface/explicit/cable_explicit_main.F90 new file mode 100644 index 000000000..7c57e032f --- /dev/null +++ b/src/coupled/AM3/control/cable/interface/explicit/cable_explicit_main.F90 @@ -0,0 +1,385 @@ +MODULE cable_explicit_main_mod + +CONTAINS + +SUBROUTINE cable_explicit_main( & + ! IN: UM/JULES model/grid parameters, fields, mappings + mype, timestep_len, timestep_number, row_length, rows, land_pts, & + nsurft, npft, sm_levels, dzsoil, land_index, surft_pts, surft_index, & + cosine_zenith_angle, latitude, longitude, Fland, tile_frac, & + + ! IN: soil parameters !1 is only allowable index in UM + bexp, hcon, satcon, sathh, smvcst, smvcwt, smvccl, albsoil, & + + ! IN: Met forcing: + lw_down, sw_surft, ls_rain, ls_snow, & + tl_1, qw_1, vshr_land, pstar, z1_tq, z1_uv, canopy_tile, & + ! This an outlier IN here. INOUT @ implicit. (was)OUT at extras + ! I think we are dealing with it OK now but confusion could be removed + snow_tile, & + + ! IN: canopy height, LAI seasonally presecribed, potentially prognostic + ! IN: CO2 mass mixing ratio + canht_pft, lai_pft, CO2_MMR, & + + ! TYPEs passed from top_level to maintain scope, access to UM STASH + ! IN: tiled soil/snow prognostics - IN here. INOUT @ implicit + ! INOUT: Carries fields needed by CABLE b/n pathways (rad, explicit etc) + ! Currently carrying CABLE TYPEs (canopy%, rad% etc). + ! IN: pars carries vegin/soilin - potentially redundant + progs, work, pars, & + + ! OUT: UM fields UNPACKed from CABLE (@ explicit) + ftl_tile, fqw_tile, tstar_tile, dtstar_surft, & + u_s, u_s_std_tile, cd_tile, ch_tile, & + radnet_tile, fraca, resfs, resft, z0h_tile, z0m_tile, & + recip_l_mo_tile, epot_tile, npp_pft_acc, resp_w_pft_acc ) + +! subrs +USE cable_explicit_driv_mod, ONLY: cable_explicit_driver +USE cable_expl_unpack_mod, ONLY: cable_expl_unpack +USE init_active_tile_mask_mod, ONLY: init_active_tile_mask_cbl + +! data: TYPE definitions of passed asarguments +USE progs_cbl_vars_mod, ONLY: progs_cbl_vars_type ! CABLE requires extra progs +USE work_vars_mod_cbl, ONLY: work_vars_type ! and some kept thru timestep +USE params_io_mod_cbl, ONLY: params_io_data_type +USE params_io_mod_cbl, ONLY: params_io_type + +! data: Scalars +USE grid_constants_mod_cbl, ONLY: nrb, nrs, mp +USE cable_common_module, ONLY: knode_gl, ktau_gl, kwidth_gl, cable_runtime, & + cable_user, redistrb, satuparam, wiltparam, & + l_casacnp_cd => l_casacnp +USE cable_model_env_opts_mod, ONLY: icycle ! 0=No CASA- [1=C,2=CN,3=CNP] +USE cable_model_env_opts_mod, ONLY: l_casacnp +USE casadimension, ONLY: icycle_cd => icycle +!Leave for reference +!! USE atm_fields_real_mod, ONLY : soil_temp_cable, soil_moist_cable, etc & +!! C_pool_casa, N_pool_casa, P_pool_casa, & +!! SOIL_ORDER_casa, N_DEP_casa, N_FIX_casa, & +!! P_DUST_casa, P_weath_casa, LAI_casa, & +!! PHENPHASE_casa, NPP_PFT_ACC, RSP_W_PFT_ACC, & +!! aquifer_moist_cable,aquifer_thickness_cable, & +!! slope_avg_cable,slope_std_cable,& +!! visc_sublayer_depth,aquifer_perm_cable,& +!! aquifer_draindens_cable + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: mype ! # processor +REAL, INTENT(IN) :: timestep_len ! # seconds (cucurrently 1200) +INTEGER, INTENT(IN) :: timestep_number ! # timestep (cucurrently 3 per hr) +INTEGER, INTENT(IN) :: row_length ! # columns in spatial grid +INTEGER, INTENT(IN) :: rows ! # rows in spatial grid +INTEGER, INTENT(IN) :: land_pts ! # land points being processed +INTEGER, INTENT(IN) :: nsurft ! # tiles +INTEGER, INTENT(IN) :: npft ! # plant functional types +INTEGER, INTENT(IN) :: sm_levels ! # soil layers +REAL, INTENT(IN) :: dzsoil(sm_levels) ! soil layer thicknesses + +INTEGER, INTENT(IN) :: land_index(land_pts) ! land point indices + ! recipe back to (i,j) cell +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points per tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! tile points indices + ! recipe back to land_index + +REAL, INTENT(IN) :: canht_pft(land_pts, npft) ! canopy height (seasonal) +REAL, INTENT(IN) :: lai_pft(land_pts, npft) ! LAI (seasonal) +REAL, INTENT(IN) :: fland(land_pts) ! land fraction (<1 for coastal) +REAL, INTENT(IN) :: co2_mmr ! prescribed MMR +REAL, INTENT(IN) :: tile_frac(land_pts, nsurft) ! tile fraction + +REAL, INTENT(IN) :: cosine_zenith_angle(row_length,rows) +REAL, INTENT(IN) :: latitude (row_length,rows) +REAL, INTENT(IN) :: longitude(row_length,rows) + +! soil parameters +REAL, INTENT(IN) :: bexp (land_pts, sm_levels) ! parameter b in Campbell eqn +REAL, INTENT(IN) :: sathh(land_pts, sm_levels) ! +REAL, INTENT(IN) :: smvcst(land_pts, sm_levels) ! +REAL, INTENT(IN) :: smvcwt(land_pts, sm_levels) ! +REAL, INTENT(IN) :: smvccl(land_pts, sm_levels) ! +REAL, INTENT(IN) :: hcon(land_pts) ! Soil thermal conductivity (W/m/K). +REAL, INTENT(IN) :: albsoil(land_pts) ! bare soil albedo +REAL, INTENT(IN) :: satcon(land_pts, sm_levels) ! hydraulic conductivity + ! @ saturation [mm/s] + +! "forcing" +REAL, INTENT(IN) :: lw_down(row_length,rows) +REAL, INTENT(IN) :: ls_rain(row_length,rows) +REAL, INTENT(IN) :: ls_snow(row_length,rows) +REAL, INTENT(IN) :: sw_surft(land_pts, nsurft) +REAL, INTENT(IN) :: tl_1(row_length,rows) +REAL, INTENT(IN) :: qw_1(row_length,rows) +REAL, INTENT(IN) :: vshr_land(row_length,rows) +REAL, INTENT(IN) :: pstar(row_length,rows) +REAL, INTENT(IN) :: z1_tq(row_length,rows) +REAL, INTENT(IN) :: z1_uv(row_length,rows) + +! prognostics +REAL, INTENT(IN) :: canopy_tile(land_pts, nsurft) +REAL, INTENT(IN) :: snow_tile(land_pts, nsurft) ! Lying snow [kg/m2] + +! TYPEs passed from top_level to maintain scope, access to UM STASH +! IN: tiled soil/snow prognostics - IN here. INOUT @ implicit +! INOUT: Carries fields needed by CABLE b/n pathways (rad, explicit etc) +! Currently carrying CABLE TYPEs (canopy%, rad% etc). +! IN: pars carries vegin/soilin - potentially redundant +TYPE(progs_cbl_vars_type), INTENT(IN) :: progs +TYPE(params_io_data_type), INTENT(IN) :: pars +TYPE(work_vars_type), INTENT(INOUT) :: work + +! OUT: UM fields UNPACKed from CABLE (@ explicit) +REAL, INTENT(OUT) :: ftl_tile(land_pts,nsurft) ! surface FTL for land tiles +REAL, INTENT(OUT) :: fqw_tile(land_pts,nsurft) ! surface FQW for land tiles +REAL, INTENT(OUT) :: tstar_tile(land_pts,nsurft) ! radiative surf. temperature +REAL, INTENT(OUT) :: dtstar_surft(land_pts,nsurft) ! +REAL, INTENT(OUT) :: u_s(row_length,rows) ! friction velocity (m/s) +REAL, INTENT(OUT) :: u_s_std_tile(land_pts,nsurft)! +REAL, INTENT(OUT) :: cd_tile(land_pts,nsurft) ! Drag coefficient +REAL, INTENT(OUT) :: ch_tile(land_pts,nsurft) ! Transfer coefficient +REAL, INTENT(OUT) :: radnet_tile(land_pts,nsurft) ! Surface net radiation +REAL, INTENT(OUT) :: z0h_tile(land_pts,nsurft) ! roughness +REAL, INTENT(OUT) :: z0m_tile(land_pts,nsurft) ! roughness +REAL, INTENT(OUT) :: epot_tile(land_pts,nsurft) ! +REAL, INTENT(OUT) :: recip_l_mo_tile(land_pts,nsurft) ! Reciprocal:Monin-Obukhov + ! length for tiles (m^-1) +REAL, INTENT(OUT) :: fraca(land_pts,nsurft) ! Fraction - surface moisture +REAL, INTENT(OUT) :: RESFS(land_pts,nsurft) + ! Combined soil, stomatal & aerodynamic resistance + ! factor for fraction (1-FRACA) of snow-free land tiles +REAL, INTENT(OUT) :: RESFT(land_pts,nsurft) + ! Total resistance factor. + ! FRACA+(1-FRACA)*RESFS for snow-free l_tile_pts, + ! 1 for snow. +REAL, INTENT(IN) :: npp_pft_acc(land_pts,npft) +REAL, INTENT(IN) :: resp_w_pft_acc (land_pts,npft) + +!___ local vars, may be passed as args downstream +LOGICAL :: cbl_standalone = .FALSE. !needs to be set from namelist +LOGICAL :: jls_standalone = .FALSE. !needs to be set from namelist +LOGICAL :: jls_radiation = .FALSE. !needs to be set from n amelist + +INTEGER :: isnow_flg_cable(land_pts, nsurft) +REAL :: radians_degrees +REAL :: latitude_deg(row_length,rows) +REAL :: longitude_deg(row_length,rows) +REAL :: sw_down_ij(row_length,rows,nrs) +REAL :: sw_down_TOT(row_length,rows) +REAL :: sw_down_DIR(row_length,rows) +REAL :: sw_down_VIS(row_length,rows) +REAL :: sw_down_NIR(row_length,rows) +REAL :: beamFrac_VIS(row_length,rows) +REAL :: beamFrac_NIR(row_length,rows) +REAL :: beamFrac_TOT(row_length,rows) + +LOGICAL, ALLOCATABLE :: l_tile_pts(:,:) + +INTEGER :: i,j,k,l,n +LOGICAL, SAVE :: zero_points_warning = .TRUE. + +CHARACTER(LEN=*), PARAMETER :: subr_name = "cable_explicit_main" + +IF( land_pts == 0 ) THEN + IF( zero_points_warning ) THEN + WRITE(6,*) "Reached CABLE ", subr_name, & + " even though zero land_points on processor ", mype + END IF + zero_points_warning = .FALSE. + RETURN +END IF + +!--- Set up some cable-globals ------------------------------------------------- +cable_runtime%um = .TRUE. +cable_runtime%um_explicit = .TRUE. + +! this done every call (maybe we hould pass this through work%) +!------------------------------------------------------------------------------ +! Determine the number of active tiles +mp = SUM(surft_pts) + +IF( .NOT. ALLOCATED(l_tile_pts) ) ALLOCATE( l_tile_pts(land_pts, nsurft) ) + +! Define mapping mask. i.e. l_tile_pts =TRUE (active) , where tile_frac > 0 +CALL init_active_tile_mask_cbl( l_tile_pts, land_pts, nsurft, tile_frac ) +!------------------------------------------------------------------------------- + +!!extracted from ap/um/rose-app.conf au-aa809@2729 +![namelist:cable] +cable_user%diag_soil_resp='ON' +cable_user%fwsoil_switch='Haverd2013' +cable_user%gs_switch='medlyn' +cable_user%gw_model=.false. +cable_user%l_rev_corr=.true. +cable_user%l_revised_coupling=.true. +cable_user%or_evap=.false. +!cable_user%soil_thermal_fix=.true. +cable_user%soil_thermal_fix=.false.! fudge - worked to dt=4 +cable_user%ssnow_potev='HDM' +redistrb=.false. +satuparam=0.8 +wiltparam=0.5 +! set icycle/lcasacnp seen thru-out model from namelist read version +icycle_cd = icycle +l_casacnp_cd = l_casacnp + +! initialize processor number, timestep len +knode_gl = mype +kwidth_gl = INT(timestep_len) +ktau_gl = timestep_number + +!--- Convert lat/long to degrees +radians_degrees = 180.0 / ( 4.0*atan(1.0) ) ! 180 / PI +latitude_deg = latitude * radians_degrees +longitude_deg = longitude * radians_degrees + +isnow_flg_cable = INT(progs%ThreeLayerSnowFlag_CABLE) + +!--- Fix SW for CABLE ---------------------------------------------------------------------------- +sw_down_ij(:,:,:) = 0.0 +sw_down_TOT(:,:) = 0.0 +sw_down_DIR(:,:) = 0.0 +sw_down_VIS(:,:) = 0.0 +sw_down_NIR(:,:) = 0.0 +beamFrac_VIS(:,:) = 0.0 +beamFrac_NIR(:,:) = 0.0 +beamFrac_TOT(:,:) = 0.0 + +IF(jls_standalone) THEN + + DO n = 1, nsurft + ! loop over number of points per tile + DO k = 1, surft_pts(n) + l = surft_index(k, n) + j = (land_index(l) - 1) / row_length + 1 + i = land_index(l) - (j-1) * row_length + sw_down_VIS(i, j) = sw_surft(l,n) / 2.0 + END DO + END DO + sw_down_NIR(:,:) = sw_down_VIS(:,:) + +ELSE + + ! in all cases zenith angle needs to be applied + DO n = 1, nrs + sw_down_ij(:,:,n) = work%sw_down_ij(:,:,n) * cosine_zenith_angle(:,:) + END DO + + ! SUM over ALL components of sw_down_ij + sw_down_TOT(:,:) = sw_down_ij(:,:,1) + sw_down_ij(:,:,2) + & + sw_down_ij(:,:,3) + sw_down_ij(:,:,4) + + ! SUM DIRect components of sw_down_ij(in VIS & NIR ) + sw_down_DIR(:,:) = sw_down_ij(:,:,1) + sw_down_ij(:,:,3) + + ! SUM VIS components of sw_down_ij(incl DIR & DIF ) + sw_down_VIS(:,:) = sw_down_ij(:,:,1) + sw_down_ij(:,:,2) + + ! SUM NIR components of sw_down_ij(incl DIR & DIF ) + sw_down_NIR(:,:) = sw_down_ij(:,:,3) + sw_down_ij(:,:,4) + + ! beam(DIR) fraction in VISible spectrum + beamFrac_VIS(:,:) = sw_down_ij(:,:,1) / MAX( 0.1, sw_down_VIS(:,:) ) + + ! beam(DIR) fraction in NIR spectrum + beamFrac_NIR(:,:) = sw_down_ij(:,:,3) / MAX( 0.1, sw_down_NIR(:,:) ) + + ! beam(DIR) fraction for all solar + beamFrac_TOT(:,:) = sw_down_DIR(:,:) / MAX( 0.1, sw_down_TOT(:,:) ) + +ENDIF + +!---------------------------------------------------------------------------- +!--- CALL _driver to run specific and necessary components of CABLE with IN - +!--- args PACKED to force CABLE +!------------------------------------------------------------------------------- +CALL cable_explicit_driver( & + ! IN: UM/JULES/CABLE model/grid parameters, fields, mappings + mype, row_length, rows, land_pts, nsurft, npft, sm_levels, dzsoil, & + timestep_len, timestep_number, mp, nrb, land_index, surft_pts, surft_index, & + l_tile_pts, latitude_deg, longitude_deg, cosine_zenith_angle, Fland, & + tile_frac, & + + ! IN: soil parameters !1 is only allowable index in UM + bexp, hcon, satcon, sathh, smvcst, smvcwt, smvccl, albsoil, & + + ! IN: SW forcing: manipulated for CABLE + sw_down_VIS, sw_down_NIR, beamFrac_VIS, beamFrac_NIR, beamFrac_TOT, & + + ! IN: Met forcing: + lw_down, ls_rain, ls_snow, & + tl_1, qw_1, vshr_land, pstar, z1_tq, z1_uv, canopy_tile, & + ! This an outlier IN here. INOUT @ implicit. (was)OUT at extras + ! I think we are dealing with it OK now but confusion could be removed + snow_tile, & + + ! IN: canopy height, LAI seasonally presecribed, potentially prognostic + ! IN: CO2 mass mixing ratio + canht_pft, lai_pft, CO2_MMR, & + + ! IN: carries vegin/soilin - potentially redundant + pars, & + + ! IN: tiled soil/snow prognostics - IN here. INOUT @ implicit + progs%soiltemp_CABLE, progs%soilmoisture_CABLE, progs%FrozenSoilFrac_CABLE, & + isnow_flg_cable, progs%SnowDepth_CABLE, progs%SnowMass_CABLE, & + progs%SnowTemp_CABLE, progs%SnowDensity_CABLE, progs%snowage_CABLE, & + progs%snowosurft, progs%OneLyrSnowDensity_CABLE, & + + ! INOUT: CABLE TYPEs roughly grouped fields per module + work%rad, work%met, work%rough, work%canopy, work%veg, work%soil, & + work%ssnow, work%bal, work%air, work%bgc, work%sum_flux, & + + !IN: persistent veg%iveg, soil%isoilm are initialized on first rad/alb call + work%veg%iveg, work%soil%isoilm, & + !OUT: currently being passed back to UM in veg%hc, veg%vlai + work%veg%hc, work%veg%vlai, & + + !IN: currently being passed from prev radiation call through work% + ! jhan:quirky, snow (in turn reduced LAI due to snow) can evolve through a + ! constant rad dt. However reducedLAIdue2snow used ubiquitously as trigger + ! Further, snow does NOT evolve in explicit AND reducedLAIdue2snow absent + ! in implicit + work%reducedLAIdue2snow, & + + !GW + !visc_sublayer_depth, smgw_tile, slope_avg, slope_std, + !dz_gw, perm_gw, drain_gw, + !casa progs + !CPOOL_TILE, NPOOL_TILE, PPOOL_TILE, SOIL_ORDER, NIDEP, + !NIFIX, PWEA, PDUST, GLAI, PHENPHASE, + + !IN: if not passed a dangling argument would ensue + npp_pft_acc, resp_w_pft_acc ) + +!---------------------------------------------------------------------------- +!--- CALL _unpack to unpack variables from CABLE back to UM format to return +!---------------------------------------------------------------------------- +call cable_expl_unpack( & + ! IN: UM/JULES/CABLE model/grid parameters, fields, mappings + row_length, rows, land_pts, nsurft, npft, mp, land_index, surft_pts, & + surft_index, l_tile_pts, fland, tile_frac, latitude, longitude, & + + !OUT: UM fields to be updated + ftl_tile, fqw_tile, tstar_tile, dtstar_surft , u_s, u_s_std_tile, cd_tile, & + ch_tile, radnet_tile, fraca, resfs, resft, z0h_tile, z0m_tile, & + recip_l_mo_tile, epot_tile, & + + !IN: UM fields to be updated FROM these CABLE fields + work%canopy%fh, work%canopy%fes, work%canopy%fev, work%canopy%us, & + work%canopy%cdtq,work%canopy%fwet, work%canopy%wetfac_cs, & + work%canopy%rnet, work%canopy%zetar, work%canopy%epot, work%rad%trad, & + work%rad%otrad, work%rad%transd, work%rough%z0m, work%rough%zref_tq, & + + !IN: UM fields used in derivation of fields to be updated + work%ssnow%snowd, work%ssnow%cls, work%air%rlam, work%air%rho, work%met%ua ) + +cable_runtime%um_explicit = .FALSE. + +RETURN + +END SUBROUTINE cable_explicit_main + +END MODULE cable_explicit_main_mod + diff --git a/src/coupled/AM3/control/cable/interface/explicit/cable_explicit_main.F90.cnp b/src/coupled/AM3/control/cable/interface/explicit/cable_explicit_main.F90.cnp new file mode 100644 index 000000000..f5e4263f6 --- /dev/null +++ b/src/coupled/AM3/control/cable/interface/explicit/cable_explicit_main.F90.cnp @@ -0,0 +1,401 @@ +MODULE cable_explicit_main_mod + +CONTAINS + +SUBROUTINE cable_explicit_main( & + ! IN: UM/JULES model/grid parameters, fields, mappings + mype, timestep_len, timestep_number, row_length, rows, land_pts, & + nsurft, npft, sm_levels, dzsoil, land_index, surft_pts, surft_index, & + cosine_zenith_angle, latitude, longitude, Fland, tile_frac, & + + ! IN: soil parameters !1 is only allowable index in UM + bexp, hcon, satcon, sathh, smvcst, smvcwt, smvccl, albsoil, & + + ! IN: Met forcing: + lw_down, sw_surft, ls_rain, ls_snow, & + tl_1, qw_1, vshr_land, pstar, z1_tq, z1_uv, canopy_tile, & + ! This an outlier IN here. INOUT @ implicit. (was)OUT at extras + ! I think we are dealing with it OK now but confusion could be removed + snow_tile, & + + ! IN: canopy height, LAI seasonally presecribed, potentially prognostic + ! IN: CO2 mass mixing ratio + canht_pft, lai_pft, CO2_MMR, & + + ! TYPEs passed from top_level to maintain scope, access to UM STASH + ! ------------------------------------------------------------------ + ! IN: tiled soil/snow prognostics - IN here. INOUT @ implicit + ! INOUT: Carries fields needed by CABLE b/n pathways (rad, explicit etc) + ! Currently carrying CABLE TYPEs (canopy%, rad% etc). + ! IN: pars carries vegin/soilin - potentially redundant + progs, work, pars, & + + ! IN: CASA-CNP prognostics - IN here. INOUT @ implicit + progs_cnp, & + + ! OUT: UM fields UNPACKed from CABLE (@ explicit) + ftl_tile, fqw_tile, tstar_tile, dtstar_surft, & + u_s, u_s_std_tile, cd_tile, ch_tile, & + radnet_tile, fraca, resfs, resft, z0h_tile, z0m_tile, & + recip_l_mo_tile, epot_tile, npp_pft_acc, resp_w_pft_acc ) + +! subrs +USE cable_explicit_driv_mod, ONLY: cable_explicit_driver +USE cable_expl_unpack_mod, ONLY: cable_expl_unpack +USE init_active_tile_mask_mod, ONLY: init_active_tile_mask_cbl + +! data: TYPE definitions of passed asarguments +USE progs_cbl_vars_mod, ONLY: progs_cbl_vars_type ! CABLE requires extra progs +USE work_vars_mod_cbl, ONLY: work_vars_type ! and some kept thru timestep +USE params_io_mod_cbl, ONLY: params_io_data_type +USE params_io_mod_cbl, ONLY: params_io_type +USE progs_cnp_vars_mod, ONLY: progs_cnp_vars_type ! CASA requires progs + +! data: Scalars +USE grid_constants_mod_cbl, ONLY: nrb, nrs, mp +USE cable_common_module, ONLY: knode_gl, ktau_gl, kwidth_gl, cable_runtime, & + cable_user, redistrb, satuparam, wiltparam, & + l_casacnp +USE casadimension, ONLY: icycle ! 0=No CASA- [1=C,2=CN,3=CNP] +!Leave for reference +!! USE atm_fields_real_mod, ONLY : +!! NPP_PFT_ACC, RSP_W_PFT_ACC, & +!! aquifer_moist_cable,aquifer_thickness_cable, & +!! slope_avg_cable,slope_std_cable,& +!! visc_sublayer_depth,aquifer_perm_cable,& +!! aquifer_draindens_cable + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: mype ! # processor +REAL, INTENT(IN) :: timestep_len ! # seconds (cucurrently 1200) +INTEGER, INTENT(IN) :: timestep_number ! # timestep (cucurrently 3 per hr) +INTEGER, INTENT(IN) :: row_length ! # columns in spatial grid +INTEGER, INTENT(IN) :: rows ! # rows in spatial grid +INTEGER, INTENT(IN) :: land_pts ! # land points being processed +INTEGER, INTENT(IN) :: nsurft ! # tiles +INTEGER, INTENT(IN) :: npft ! # plant functional types +INTEGER, INTENT(IN) :: sm_levels ! # soil layers +REAL, INTENT(IN) :: dzsoil(sm_levels) ! soil layer thicknesses + +INTEGER, INTENT(IN) :: land_index(land_pts) ! land point indices + ! recipe back to (i,j) cell +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points per tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! tile points indices + ! recipe back to land_index + +REAL, INTENT(IN) :: canht_pft(land_pts, npft) ! canopy height (seasonal) +REAL, INTENT(IN) :: lai_pft(land_pts, npft) ! LAI (seasonal) +REAL, INTENT(IN) :: fland(land_pts) ! land fraction (<1 for coastal) +REAL, INTENT(IN) :: co2_mmr ! prescribed MMR +REAL, INTENT(IN) :: tile_frac(land_pts, nsurft) ! tile fraction + +REAL, INTENT(IN) :: cosine_zenith_angle(row_length,rows) +REAL, INTENT(IN) :: latitude (row_length,rows) +REAL, INTENT(IN) :: longitude(row_length,rows) + +! soil parameters +REAL, INTENT(IN) :: bexp (land_pts, sm_levels) ! parameter b in Campbell eqn +REAL, INTENT(IN) :: sathh(land_pts, sm_levels) ! +REAL, INTENT(IN) :: smvcst(land_pts, sm_levels) ! +REAL, INTENT(IN) :: smvcwt(land_pts, sm_levels) ! +REAL, INTENT(IN) :: smvccl(land_pts, sm_levels) ! +REAL, INTENT(IN) :: hcon(land_pts) ! Soil thermal conductivity (W/m/K). +REAL, INTENT(IN) :: albsoil(land_pts) ! bare soil albedo +REAL, INTENT(IN) :: satcon(land_pts, sm_levels) ! hydraulic conductivity + ! @ saturation [mm/s] + +! "forcing" +REAL, INTENT(IN) :: lw_down(row_length,rows) +REAL, INTENT(IN) :: ls_rain(row_length,rows) +REAL, INTENT(IN) :: ls_snow(row_length,rows) +REAL, INTENT(IN) :: sw_surft(land_pts, nsurft) +REAL, INTENT(IN) :: tl_1(row_length,rows) +REAL, INTENT(IN) :: qw_1(row_length,rows) +REAL, INTENT(IN) :: vshr_land(row_length,rows) +REAL, INTENT(IN) :: pstar(row_length,rows) +REAL, INTENT(IN) :: z1_tq(row_length,rows) +REAL, INTENT(IN) :: z1_uv(row_length,rows) + +! prognostics +REAL, INTENT(IN) :: canopy_tile(land_pts, nsurft) +REAL, INTENT(IN) :: snow_tile(land_pts, nsurft) ! Lying snow [kg/m2] + +! TYPEs passed from top_level to maintain scope, access to UM STASH +! IN: tiled soil/snow prognostics - IN here. INOUT @ implicit +! INOUT: Carries fields needed by CABLE b/n pathways (rad, explicit etc) +! Currently carrying CABLE TYPEs (canopy%, rad% etc). +! IN: pars carries vegin/soilin - potentially redundant +TYPE(progs_cbl_vars_type), INTENT(IN) :: progs +TYPE(params_io_data_type), INTENT(IN) :: pars +TYPE(work_vars_type), INTENT(INOUT) :: work +! IN: CASA-CNP prognostics - IN here. INOUT @ implicit +TYPE(progs_cnp_vars_type), INTENT(IN) :: progs_cnp + +! OUT: UM fields UNPACKed from CABLE (@ explicit) +REAL, INTENT(OUT) :: ftl_tile(land_pts,nsurft) ! surface FTL for land tiles +REAL, INTENT(OUT) :: fqw_tile(land_pts,nsurft) ! surface FQW for land tiles +REAL, INTENT(OUT) :: tstar_tile(land_pts,nsurft) ! radiative surf. temperature +REAL, INTENT(OUT) :: dtstar_surft(land_pts,nsurft) ! +REAL, INTENT(OUT) :: u_s(row_length,rows) ! friction velocity (m/s) +REAL, INTENT(OUT) :: u_s_std_tile(land_pts,nsurft)! +REAL, INTENT(OUT) :: cd_tile(land_pts,nsurft) ! Drag coefficient +REAL, INTENT(OUT) :: ch_tile(land_pts,nsurft) ! Transfer coefficient +REAL, INTENT(OUT) :: radnet_tile(land_pts,nsurft) ! Surface net radiation +REAL, INTENT(OUT) :: z0h_tile(land_pts,nsurft) ! roughness +REAL, INTENT(OUT) :: z0m_tile(land_pts,nsurft) ! roughness +REAL, INTENT(OUT) :: epot_tile(land_pts,nsurft) ! +REAL, INTENT(OUT) :: recip_l_mo_tile(land_pts,nsurft) ! Reciprocal:Monin-Obukhov + ! length for tiles (m^-1) +REAL, INTENT(OUT) :: fraca(land_pts,nsurft) ! Fraction - surface moisture +REAL, INTENT(OUT) :: RESFS(land_pts,nsurft) + ! Combined soil, stomatal & aerodynamic resistance + ! factor for fraction (1-FRACA) of snow-free land tiles +REAL, INTENT(OUT) :: RESFT(land_pts,nsurft) + ! Total resistance factor. + ! FRACA+(1-FRACA)*RESFS for snow-free l_tile_pts, + ! 1 for snow. +REAL, INTENT(IN) :: npp_pft_acc(land_pts,npft) +REAL, INTENT(IN) :: resp_w_pft_acc (land_pts,npft) + +!___ local vars, may be passed as args downstream +LOGICAL :: cbl_standalone = .FALSE. !needs to be set from namelist +LOGICAL :: jls_standalone = .FALSE. !needs to be set from namelist +LOGICAL :: jls_radiation = .FALSE. !needs to be set from n amelist + +INTEGER :: isnow_flg_cable(land_pts, nsurft) +REAL :: radians_degrees +REAL :: latitude_deg(row_length,rows) +REAL :: longitude_deg(row_length,rows) +REAL :: sw_down_ij(row_length,rows,nrs) +REAL :: sw_down_TOT(row_length,rows) +REAL :: sw_down_DIR(row_length,rows) +REAL :: sw_down_VIS(row_length,rows) +REAL :: sw_down_NIR(row_length,rows) +REAL :: beamFrac_VIS(row_length,rows) +REAL :: beamFrac_NIR(row_length,rows) +REAL :: beamFrac_TOT(row_length,rows) + +LOGICAL, ALLOCATABLE :: l_tile_pts(:,:) + +INTEGER :: i,j,k,l,n +LOGICAL, SAVE :: zero_points_warning = .TRUE. + +CHARACTER(LEN=*), PARAMETER :: subr_name = "cable_explicit_main" + +IF( land_pts == 0 ) THEN + IF( zero_points_warning ) THEN + WRITE(6,*) "Reached CABLE ", subr_name, & + " even though zero land_points on processor ", mype + END IF + zero_points_warning = .FALSE. + RETURN +END IF + +!--- Set up some cable-globals ------------------------------------------------- +cable_runtime%um = .TRUE. +cable_runtime%um_explicit = .TRUE. + +! this done every call (maybe we hould pass this through work%) +!------------------------------------------------------------------------------ +! Determine the number of active tiles +mp = SUM(surft_pts) + +IF( .NOT. ALLOCATED(l_tile_pts) ) ALLOCATE( l_tile_pts(land_pts, nsurft) ) + +! Define mapping mask. i.e. l_tile_pts =TRUE (active) , where tile_frac > 0 +CALL init_active_tile_mask_cbl( l_tile_pts, land_pts, nsurft, tile_frac ) +!------------------------------------------------------------------------------- + +!!extracted from ap/um/rose-app.conf au-aa809@2729 +![namelist:cable] +cable_user%diag_soil_resp='ON' +cable_user%fwsoil_switch='Haverd2013' +cable_user%gs_switch='medlyn' +cable_user%gw_model=.false. +cable_user%l_rev_corr=.true. +cable_user%l_revised_coupling=.true. +cable_user%or_evap=.false. +!cable_user%soil_thermal_fix=.true. +cable_user%soil_thermal_fix=.false.! fudge - worked to dt=4 +cable_user%ssnow_potev='HDM' +icycle=3 !previously blocked?? +l_casacnp=.true. !previously blocked?? +redistrb=.false. +satuparam=0.8 +wiltparam=0.5 + +! initialize processor number, timestep len +knode_gl = mype +kwidth_gl = INT(timestep_len) +ktau_gl = timestep_number + +!--- Convert lat/long to degrees +radians_degrees = 180.0 / ( 4.0*atan(1.0) ) ! 180 / PI +latitude_deg = latitude * radians_degrees +longitude_deg = longitude * radians_degrees + +isnow_flg_cable = INT(progs%ThreeLayerSnowFlag_CABLE) + +!--- Fix SW for CABLE ---------------------------------------------------------------------------- +sw_down_ij(:,:,:) = 0.0 +sw_down_TOT(:,:) = 0.0 +sw_down_DIR(:,:) = 0.0 +sw_down_VIS(:,:) = 0.0 +sw_down_NIR(:,:) = 0.0 +beamFrac_VIS(:,:) = 0.0 +beamFrac_NIR(:,:) = 0.0 +beamFrac_TOT(:,:) = 0.0 + +IF(jls_standalone) THEN + + DO n = 1, nsurft + ! loop over number of points per tile + DO k = 1, surft_pts(n) + l = surft_index(k, n) + j = (land_index(l) - 1) / row_length + 1 + i = land_index(l) - (j-1) * row_length + sw_down_VIS(i, j) = sw_surft(l,n) / 2.0 + END DO + END DO + sw_down_NIR(:,:) = sw_down_VIS(:,:) + +ELSE + + ! in all cases zenith angle needs to be applied + DO n = 1, nrs + sw_down_ij(:,:,n) = work%sw_down_ij(:,:,n) * cosine_zenith_angle(:,:) + END DO + + ! SUM over ALL components of sw_down_ij + sw_down_TOT(:,:) = sw_down_ij(:,:,1) + sw_down_ij(:,:,2) + & + sw_down_ij(:,:,3) + sw_down_ij(:,:,4) + + ! SUM DIRect components of sw_down_ij(in VIS & NIR ) + sw_down_DIR(:,:) = sw_down_ij(:,:,1) + sw_down_ij(:,:,3) + + ! SUM VIS components of sw_down_ij(incl DIR & DIF ) + sw_down_VIS(:,:) = sw_down_ij(:,:,1) + sw_down_ij(:,:,2) + + ! SUM NIR components of sw_down_ij(incl DIR & DIF ) + sw_down_NIR(:,:) = sw_down_ij(:,:,3) + sw_down_ij(:,:,4) + + ! beam(DIR) fraction in VISible spectrum + beamFrac_VIS(:,:) = sw_down_ij(:,:,1) / MAX( 0.1, sw_down_VIS(:,:) ) + + ! beam(DIR) fraction in NIR spectrum + beamFrac_NIR(:,:) = sw_down_ij(:,:,3) / MAX( 0.1, sw_down_NIR(:,:) ) + + ! beam(DIR) fraction for all solar + beamFrac_TOT(:,:) = sw_down_DIR(:,:) / MAX( 0.1, sw_down_TOT(:,:) ) + +ENDIF + +!---------------------------------------------------------------------------- +!--- CALL _driver to run specific and necessary components of CABLE with IN - +!--- args PACKED to force CABLE +!------------------------------------------------------------------------------- +CALL cable_explicit_driver( & + ! IN: UM/JULES/CABLE model/grid parameters, fields, mappings + mype, row_length, rows, land_pts, nsurft, npft, sm_levels, dzsoil, & + timestep_len, timestep_number, mp, nrb, land_index, surft_pts, surft_index, & + l_tile_pts, latitude_deg, longitude_deg, cosine_zenith_angle, Fland, & + tile_frac, L_casacnp, & + + ! IN: soil parameters !1 is only allowable index in UM + bexp, hcon, satcon, sathh, smvcst, smvcwt, smvccl, albsoil, & + + ! IN: SW forcing: manipulated for CABLE + sw_down_VIS, sw_down_NIR, beamFrac_VIS, beamFrac_NIR, beamFrac_TOT, & + + ! IN: Met forcing: + lw_down, ls_rain, ls_snow, & + tl_1, qw_1, vshr_land, pstar, z1_tq, z1_uv, canopy_tile, & + ! This an outlier IN here. INOUT @ implicit. (was)OUT at extras + ! I think we are dealing with it OK now but confusion could be removed + snow_tile, & + + ! IN: canopy height, LAI seasonally presecribed, potentially prognostic + ! IN: CO2 mass mixing ratio + canht_pft, lai_pft, CO2_MMR, & + + ! IN: carries vegin/soilin - potentially redundant + pars, & + + ! IN: tiled soil/snow prognostics - IN here. INOUT @ implicit + progs%soiltemp_CABLE, progs%soilmoisture_CABLE, progs%FrozenSoilFrac_CABLE, & + isnow_flg_cable, progs%SnowDepth_CABLE, progs%SnowMass_CABLE, & + progs%SnowTemp_CABLE, progs%SnowDensity_CABLE, progs%snowage_CABLE, & + progs%snowosurft, progs%OneLyrSnowDensity_CABLE, & + + ! IN: casa-CNP prognostics - IN here. INOUT @ implicit + progs_cnp% C_pool_casa, progs_cnp% N_pool_casa, progs_cnp% P_pool_casa, & + progs_cnp% soil_order_casa, & + progs_cnp% N_dep_casa, progs_cnp% N_fix_casa, & + progs_cnp% P_dust_casa, progs_cnp% P_weath_casa, & + progs_cnp% LAI_casa, progs_cnp% phenphase_casa, & + progs_cnp% wood_flux_C, progs_cnp% wood_flux_N, progs_cnp% wood_flux_P, & + progs_cnp% wood_hvest_C, progs_cnp% wood_hvest_N, progs_cnp% wood_hvest_P, & + progs_cnp% thinning, & + + ! INOUT: CABLE TYPEs roughly grouped fields per module + work%rad, work%met, work%rough, work%canopy, work%veg, work%soil, & + work%ssnow, work%bal, work%air, work%bgc, work%sum_flux, & + + ! INOUT: CASA TYPEs roughly grouped fields per module + work%casapool, work%casaflux, & + work%sum_casapool, work%sum_casaflux, work%casabiome, & + work%casamet, work%casabal, work%phen, & + + !IN: persistent veg%iveg, soil%isoilm are initialized on first rad/alb call + work%veg%iveg, work%soil%isoilm, & + !OUT: currently being passed back to UM in veg%hc, veg%vlai + work%veg%hc, work%veg%vlai, & + + !IN: currently being passed from prev radiation call through work% + ! jhan:quirky, snow (in turn reduced LAI due to snow) can evolve through a + ! constant rad dt. However reducedLAIdue2snow used ubiquitously as trigger + ! Further, snow does NOT evolve in explicit AND reducedLAIdue2snow absent + ! in implicit + work%reducedLAIdue2snow, & + + !GW + !visc_sublayer_depth, smgw_tile, slope_avg, slope_std, + !dz_gw, perm_gw, drain_gw, + !casa progs + !CPOOL_TILE, NPOOL_TILE, PPOOL_TILE, SOIL_ORDER, NIDEP, + !NIFIX, PWEA, PDUST, GLAI, PHENPHASE, + + !IN: if not passed a dangling argument would ensue + npp_pft_acc, resp_w_pft_acc ) + +!---------------------------------------------------------------------------- +!--- CALL _unpack to unpack variables from CABLE back to UM format to return +!---------------------------------------------------------------------------- +call cable_expl_unpack( & + ! IN: UM/JULES/CABLE model/grid parameters, fields, mappings + row_length, rows, land_pts, nsurft, npft, mp, land_index, surft_pts, & + surft_index, l_tile_pts, fland, tile_frac, latitude, longitude, & + + !OUT: UM fields to be updated + ftl_tile, fqw_tile, tstar_tile, dtstar_surft , u_s, u_s_std_tile, cd_tile, & + ch_tile, radnet_tile, fraca, resfs, resft, z0h_tile, z0m_tile, & + recip_l_mo_tile, epot_tile, & + + !IN: UM fields to be updated FROM these CABLE fields + work%canopy%fh, work%canopy%fes, work%canopy%fev, work%canopy%us, & + work%canopy%cdtq,work%canopy%fwet, work%canopy%wetfac_cs, & + work%canopy%rnet, work%canopy%zetar, work%canopy%epot, work%rad%trad, & + work%rad%otrad, work%rad%transd, work%rough%z0m, work%rough%zref_tq, & + + !IN: UM fields used in derivation of fields to be updated + work%ssnow%snowd, work%ssnow%cls, work%air%rlam, work%air%rho, work%met%ua ) + +cable_runtime%um_explicit = .FALSE. + +RETURN + +END SUBROUTINE cable_explicit_main + +END MODULE cable_explicit_main_mod + diff --git a/src/coupled/AM3/control/cable/interface/explicit/cable_explicit_unpack.F90 b/src/coupled/AM3/control/cable/interface/explicit/cable_explicit_unpack.F90 new file mode 100644 index 000000000..2a2f650c4 --- /dev/null +++ b/src/coupled/AM3/control/cable/interface/explicit/cable_explicit_unpack.F90 @@ -0,0 +1,195 @@ +!============================================================================== +! This source code is part of the +! Australian Community Atmosphere Biosphere Land Exchange (CABLE) model. +! This work is licensed under the CABLE Academic User Licence Agreement +! (the "Licence"). +! You may not use this file except in compliance with the Licence. +! A copy of the Licence and registration form can be obtained from +! http://www.accessimulator.org.au/cable +! You need to register and read the Licence agreement before use. +! Please contact cable_help@nf.nci.org.au for any questions on +! registration and the Licence. +! +! Unless required by applicable law or agreed to in writing, +! software distributed under the Licence is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the Licence for the specific language governing permissions and +! limitations under the Licence. +! ============================================================================== +! +! Purpose: Passes UM variables to CABLE, calls cbm, passes CABLE variables +! back to UM. 'Explicit' is the first of two routines that call cbm at +! different parts of the UM timestep. +! +! Called from: cable_explicit_driver +! +! Contact: Jhan.Srbinovsky@csiro.au +! +! History: Developed for CABLE v1.8 +! +! +! ============================================================================== + +MODULE cable_expl_unpack_mod + +!---------------------------------------------------------------------! +!--- pass land-surface quantities calc'd by CABLE in explicit call ---! +!--- back to UM. ---! +!---------------------------------------------------------------------! + +IMPLICIT NONE + +CONTAINS + +SUBROUTINE cable_expl_unpack( & + + ! IN: UM/JULES/CABLE model/grid parameters, fields, mappings + row_length, rows, land_pts, nsurft, npft, mp, land_index, surft_pts, & + surft_index, l_tile_pts, fland, tile_frac, latitude, longitude, & + + !OUT: UM fields to be updated + ftl_tile, fqw_tile, tstar_tile, dtstar_tile , u_s, u_s_std_tile, cd_tile, & + ch_tile, radnet_tile, fraca, resfs, resft, z0h_tile, z0m_tile, & + recip_l_mo_tile, epot_tile, & + + !IN: UM fields to be updated FROM these CABLE fields + canopy_fh, canopy_fes, canopy_fev, canopy_us, canopy_cdtq, canopy_fwet, & + canopy_wetfac_cs, canopy_rnet, canopy_zetar, canopy_epot, & + rad_trad, rad_otrad, rad_transd, rough_z0m, rough_zref_tq, & + + !IN: CABLE fields used in derivation of fields to be updated + ssnow_snowd, ssnow_cls, air_rlam, air_rho, met_ua ) + +USE cable_def_types_mod, ONLY : NITER +USE cable_phys_constants_mod, ONLY: CAPP + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: row_length ! # columns in spatial grid +INTEGER, INTENT(IN) :: rows ! # rows in spatial grid +INTEGER, INTENT(IN) :: land_pts ! # land points being processed +INTEGER, INTENT(IN) :: nsurft ! # tiles +INTEGER, INTENT(IN) :: npft ! # plant functional types +INTEGER, INTENT(IN) :: mp +INTEGER, INTENT(IN) :: land_index(land_pts) ! land point indices + ! recipe back to (i,j) cell +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points per tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! tile points indices + ! recipe back to land_index +LOGICAL, INTENT(IN) :: l_tile_pts(land_pts, nsurft) +REAL, INTENT(IN) :: fland(land_pts) ! Land fraction +REAL, INTENT(IN) :: tile_frac(land_pts, nsurft) +REAL, INTENT(IN) :: latitude(row_length,rows) +REAL, INTENT(IN) :: longitude(row_length,rows) + +!___ return fluxes UM vars recieve unpacked CABLE vars +REAL, INTENT(OUT) :: tstar_tile(land_pts,nsurft) ! surface temperature +REAL, INTENT(OUT) :: dtstar_tile(land_pts,nsurft) ! surface temperature +REAL, INTENT(OUT) :: ftl_tile(land_pts,nsurft) ! Surface FTL for land tiles +REAL, INTENT(OUT) :: fqw_tile(land_pts,nsurft) ! Surface FQW for land tiles +REAL, INTENT(OUT) :: z0h_tile(land_pts,nsurft) ! roughness +REAL, INTENT(OUT) :: z0m_tile(land_pts,nsurft) ! roughness +REAL, INTENT(OUT) :: cd_tile(land_pts,nsurft) ! Drag coefficient +REAL, INTENT(OUT) :: ch_tile(land_pts,nsurft) ! Transfer coefficient for heat & moisture +REAL, INTENT(OUT) :: u_s_std_tile(land_pts,nsurft) ! Surface friction velocity +REAL, INTENT(OUT) :: radnet_tile(land_pts,nsurft) ! Surface net radiation +REAL, INTENT(OUT) :: resfs(land_pts,nsurft) ! Combined soil, stomatal & aero resistance + ! factor for fraction (1-FRACA) of snow-free land tiles +REAL, INTENT(OUT) :: RESFT(land_pts,nsurft) ! Total resistance factor. + ! FRACA+(1-FRACA)*RESFS where NO snow + ! 1 for snow. +REAL, INTENT(OUT) :: FRACA(land_pts,nsurft) ! Fraction of surface moisture +REAL, INTENT(OUT) :: RECIP_L_MO_TILE(land_pts,nsurft) ! Reciprocal Monin-Obukhov len (m^-1) +REAL, INTENT(OUT) :: EPOT_TILE(land_pts,nsurft) +REAL, INTENT(OUT) :: U_S(row_length,rows) ! Surface friction velocity (m/s) + +!___ CABLE variables to be unpacked +REAL, INTENT(IN) :: rad_trad(mp) ! +REAL, INTENT(IN) :: rad_otrad(mp) ! +REAL, INTENT(IN) :: rad_transd(mp) ! rad. temp. (soil and veg) +REAL, INTENT(IN) :: canopy_fh(mp) ! total sensible heat (W/m2) +REAL, INTENT(IN) :: canopy_fes(mp) ! +REAL, INTENT(IN) :: canopy_fev(mp) ! +REAL, INTENT(IN) :: canopy_fwet(mp) ! fraction of canopy wet +REAL, INTENT(IN) :: canopy_wetfac_cs(mp) ! fraction of canopy wet +REAL, INTENT(IN) :: canopy_us(mp) ! friction velocity +REAL, INTENT(IN) :: canopy_cdtq(mp) ! drag coefficient for momentum +REAL, INTENT(IN) :: canopy_rnet(mp) ! net rad. absorbed by surface (W/m2) +REAL, INTENT(IN) :: canopy_epot(mp) ! total potential evaporation +REAL, INTENT(IN) :: rough_z0m(mp) ! roughness length +REAL, INTENT(IN) :: rough_zref_tq(mp) ! Reference height for met forcing +REAL, INTENT(IN) :: canopy_zetar(mp,niter) ! stability correction + +!IN: CABLE fields used in derivation of fields to be updated +REAL, INTENT(IN) :: ssnow_snowd(mp) ! snow depth (liquid water) +REAL, INTENT(IN) :: ssnow_cls(mp) ! factor for latent heat +REAL, INTENT(IN) :: met_ua(mp) ! surface wind speed (m/s) +REAL, INTENT(IN) :: air_rlam(mp) ! latent heat for water (j/kg) +REAL, INTENT(IN) :: air_rho(mp) ! dry air density (kg m-3) + +!___ local vars +REAL :: u_s_tile(land_pts,nsurft) +REAL :: dtrad(mp) ! change in rad%trad over time step +REAL :: cdcab(mp) +REAL :: thetast(mp) +REAL :: fraca_cab(mp) +REAL :: rfsfs_cab(mp) +REAL :: reciplmotile(mp) +REAL :: fe_dlh(mp) +REAL :: miss = 0.0 +REAL :: miss_tiny = 1.0e-9 +INTEGER :: i,j,k,n,L +CHARACTER(LEN=*), PARAMETER :: subr_name = "cable_explicit_unpack" + +!-------- Unique subroutine body ----------- +!___return fluxes +ftl_tile = UNPACK(canopy_fh, l_tile_pts, miss) +ftl_tile = ftl_tile / CAPP +fe_dlh = ( canopy_fes/(air_rlam*ssnow_cls) ) + ( canopy_fev/air_rlam ) +fqw_tile = UNPACK(fe_dlh, l_tile_pts, miss) + +!___return surface temp and roughness +tstar_tile = UNPACK(rad_trad, l_tile_pts, miss ) +dtrad = rad_trad - rad_otrad +dtstar_tile = UNPACK(dtrad, l_tile_pts, miss ) +z0m_tile = UNPACK(rough_z0m, l_tile_pts, miss_tiny) +z0h_tile = z0m_tile + +!___return friction velocities/drags/ etc +u_s_tile = UNPACK( canopy_us, l_tile_pts, miss) +cdcab = canopy_us**2 / met_ua**2 ! met%ua is always above umin = 0.1m/s +cd_tile = UNPACK( cdcab,l_tile_pts, miss) +ch_tile = UNPACK( canopy_cdtq,l_tile_pts, miss) + +u_s_std_tile=u_s_tile + +u_s = 0.0 +DO n=1, nsurft + DO k=1,surft_pts(n) + l = surft_index(K,N) + j = (land_index(l)-1) / row_length + 1 + i = land_index(l) - (j-1)*row_length + u_s(i,j) = u_s(i,j)+fland(l)*tile_frac(l,n)*u_s_tile(l,n) + ENDDO +ENDDO + +!___return miscelaneous +fraca_cab = canopy_fwet * (1.-rad_transd) +WHERE( ssnow_snowd > 1.0 ) fraca_cab = 1.0 + +rfsfs_cab = MIN( 1., MAX( 0.01, canopy_wetfac_cs - fraca_cab ) / & + MAX( 0.01, 1.0 - fraca_cab ) ) +fraca = UNPACK( fraca_cab, l_tile_pts, miss ) +resft = UNPACK( canopy_wetfac_cs,l_tile_pts, miss ) +resfs = UNPACK( rfsfs_cab , l_tile_pts, miss ) +radnet_tile = UNPACK( canopy_rnet , l_tile_pts, miss ) +thetast = ABS( canopy_fh ) / ( air_rho * capp*canopy_us ) +reciplmotile = canopy_zetar(:,niter) / rough_zref_tq +recip_l_mo_tile = UNPACK( reciplmotile, l_tile_pts, miss ) +epot_tile = UNPACK( canopy_epot, l_tile_pts, miss ) + +RETURN + +END SUBROUTINE cable_expl_unpack + +END MODULE cable_expl_unpack_mod diff --git a/src/coupled/AM3/control/cable/interface/hydrology/cable_hyd_driver.F90 b/src/coupled/AM3/control/cable/interface/hydrology/cable_hyd_driver.F90 new file mode 100644 index 000000000..63feee8cf --- /dev/null +++ b/src/coupled/AM3/control/cable/interface/hydrology/cable_hyd_driver.F90 @@ -0,0 +1,38 @@ +MODULE cable_hyd_driv_mod + +CONTAINS + +SUBROUTINE cable_hyd_driver( land_pts, ntiles, tile_frac, lying_snow, SNOW_TILE, SURF_ROFF,& + SUB_SURF_ROFF, TOT_TFALL ) + + implicit none + + !___ re-decl input args + + integer :: land_pts, ntiles + + + REAL, INTENT(OUT), DIMENSION(LAND_PTS,NTILES) :: & + SNOW_TILE ! IN Lying snow on tiles (kg/m2) + + REAL, INTENT(OUT), DIMENSION(LAND_PTS) :: & + LYING_SNOW, & ! OUT Gridbox snowmass (kg/m2) + SUB_SURF_ROFF, & ! + SURF_ROFF, & ! + TOT_TFALL ! + + !___ local vars + + + REAL :: miss =0. + + +return + +END SUBROUTINE cable_hyd_driver + + +End module cable_hyd_driv_mod + + + diff --git a/src/coupled/AM3/control/cable/interface/hydrology/cable_hyd_main.F90 b/src/coupled/AM3/control/cable/interface/hydrology/cable_hyd_main.F90 new file mode 100644 index 000000000..b13eeed40 --- /dev/null +++ b/src/coupled/AM3/control/cable/interface/hydrology/cable_hyd_main.F90 @@ -0,0 +1,150 @@ +MODULE Cable_hyd_main_mod + +CONTAINS + +SUBROUTINE cable_hyd_main(land_pts, nsurft, tile_frac, timestep_len, & + lying_snow, snow_surft, & + snow_melt_gb, surf_roff, sub_surf_roff, & + tot_tfall, work_snow_surft, & + melt_surft, work_lying_snow, work_surf_roff, & + work_sub_surf_roff, work_tot_tfall) + +! This routine passes some of CABLE's hydrology variables to JULES for purpose +! of output. + +USE cable_common_module, ONLY : cable_runtime +USE cable_common_module, ONLY : knode_gl + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: land_pts, nsurft +REAL, INTENT(IN) :: timestep_len +REAL, INTENT(IN) :: tile_frac(land_pts, nsurft) +REAL, INTENT(IN) :: work_snow_surft(land_pts,nsurft) +REAL, INTENT(IN) :: melt_surft(land_pts,nsurft) ! tile snow melt (from implicit) +REAL, INTENT(IN) :: work_lying_snow(land_pts) ! Gridbox snowmass (kg/m2) +REAL, INTENT(IN) :: work_sub_surf_roff(land_pts) ! Sub-surface runoff (kg/m2/s). +REAL, INTENT(IN) :: work_surf_roff(land_pts) ! Surface runoff (kg/m2/s). +REAL, INTENT(IN) :: work_tot_tfall(land_pts) ! Total throughfall (kg/m2/s). + +REAL, INTENT(OUT) :: snow_surft(land_pts,nsurft) +REAL, INTENT(OUT) :: snow_melt_gb(land_pts) ! OUT gridbox snow melt (kg/m2/s) +REAL, INTENT(OUT) :: lying_snow(land_pts) ! OUT Gridbox snowmass (kg/m2) +REAL, INTENT(OUT) :: sub_surf_roff(land_pts) ! OUT Sub-surface runoff (kg/m2/s). +REAL, INTENT(OUT) :: surf_roff(land_pts) ! OUT Surface runoff (kg/m2/s). +REAL, INTENT(OUT) :: tot_tfall(land_pts) ! OUT Total throughfall (kg/m2/s). + +CHARACTER(LEN=*), PARAMETER :: subr_name = "cable_hyd_main" +LOGICAL, SAVE :: zero_points_warning = .true. + +IF( land_pts == 0 ) THEN + IF( zero_points_warning ) THEN + WRITE(6,*) "Reached CABLE ", subr_name, & + " even though zero land_points on processor ", knode_gl + END IF + zero_points_warning = .FALSE. + RETURN +END IF + +!--- initialize cable_runtime% switches +cable_runtime%um = .TRUE. +cable_runtime%um_hydrology =.TRUE. + +!jhan:This is all very dubious - mixing up depth and mass +!snow_surft = work_snow_surft !this is overwriting with zero +lying_snow = work_lying_snow + +surf_roff = work_surf_roff +sub_surf_roff = work_sub_surf_roff +tot_tfall = work_tot_tfall + +!CM3 new variables +! melt_surft unpacked in cable_implicit from ssnow%smelt +snow_melt_gb = SUM(tile_frac * melt_surft,2) + +cable_runtime%um_hydrology =.FALSE. + +RETURN + +END SUBROUTINE cable_hyd_main + +!!jhan:we'll have to organize ho we will get the right thigs here +! For CM2 we have to pass mp & %totwblake and TILE_FRAC down through argument list from *extras* +SUBROUTINE cable_lakesrivers(land_pts, nsurft, mp, totwblake, TILE_FRAC, & + TOT_WB_LAKE, L_tile_pts) + + IMPLICIT NONE + + !routine extracts daily integrated ssnow%totwblake - water added to keep + !lake tiles saturated - and grid cell averages (over land fraction) + !for use in river flow scaling routines + + !This routine is called from riv_intcl-riv_ic1a + + INTEGER, INTENT(IN) :: land_pts, nsurft, mp + LOGICAL :: l_tile_pts(land_pts, nsurft) + REAL, INTENT(INOUT), DIMENSION(mp) :: totwblake + REAL, INTENT(IN) :: TILE_FRAC(land_pts, nsurft) + REAL, INTENT(OUT), DIMENSION(land_pts) :: TOT_WB_LAKE + + !working variables + REAL :: miss = 0. + REAL, DIMENSION(LAND_PTS, nsurft) :: TOT_WB_LAKE_TILE + + !CM2 era code + !TOT_WB_LAKE_TILE = UNPACK(ssnow%totwblake, L_TILE_PTS, miss) + + !updated for CM3 + TOT_WB_LAKE_TILE = UNPACK(totwblake, L_TILE_PTS, miss) + TOT_WB_LAKE = SUM(TILE_FRAC * TOT_WB_LAKE_TILE,2) + + !zero the current integration + totwblake = 0. + +END SUBROUTINE cable_lakesrivers + + +End module cable_hyd_main_mod + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coupled/AM3/control/cable/interface/hydrology/cable_wblake_fix.F90 b/src/coupled/AM3/control/cable/interface/hydrology/cable_wblake_fix.F90 new file mode 100644 index 000000000..e96981671 --- /dev/null +++ b/src/coupled/AM3/control/cable/interface/hydrology/cable_wblake_fix.F90 @@ -0,0 +1,19 @@ +module cable_wblake_mod + implicit none + + real :: wblake_ratio ! ratio of wblake/subroff + + real, allocatable, save :: & + WBLAKE_cable(:,:), TOT_WBLAKE_cable(:), TOT_SUBRUN_cable(:) + +contains + +subroutine cable_wblake_fix_alloc( land_points, ntiles ) + integer :: land_points, ntiles + + if(.NOT. allocated( wblake_cable ) ) & + allocate ( WBLAKE_cable(land_points,ntiles) ) + +End subroutine cable_wblake_fix_alloc + +End module cable_wblake_mod diff --git a/src/coupled/AM3/control/cable/interface/implicit/cable_implicit_driver.F90 b/src/coupled/AM3/control/cable/interface/implicit/cable_implicit_driver.F90 new file mode 100644 index 000000000..af137d28d --- /dev/null +++ b/src/coupled/AM3/control/cable/interface/implicit/cable_implicit_driver.F90 @@ -0,0 +1,249 @@ +MODULE Cable_implicit_driv_mod + +CONTAINS + +SUBROUTINE cable_implicit_driver( cycleno, numcycles, i_day_number, & + timestep, timestep_number, row_length, & + rows, land_pts, nsurft, npft, sm_levels, & + dim_cs1, mp, nrb, land_index, surft_pts, & + surft_index, l_tile_pts, ls_rain, conv_rain, & + ls_snow, conv_snow, tl_1, qw_1, ftl_1,fqw_1, & + dtl1_1, dqw1_1, ctctq1, rad, met, rough, & + canopy, veg, soil, ssnow, bal, air, bgc, & + sum_flux ) + !CPOOL_TILE, NPOOL_TILE, PPOOL_TILE, & + !GLAI, PHENPHASE) + + +!subrs called +USE cable_pack_mod, ONLY: cable_pack_rr +USE cable_cbm_module, ONLY: cbm_impl + +! data: TYPE definitions of passed asarguments +USE cable_def_types_mod, ONLY : met_type, radiation_type, veg_parameter_type, & + soil_parameter_type, roughness_type, & + canopy_type, soil_snow_type, balances_type, & + air_type, bgc_pool_type, sum_flux_type, & + climate_type + +! data: Scalars +USE cable_def_types_mod, ONLY: msn, ncs, ncp +USE cable_phys_constants_mod, ONLY: TFRZ, CAPP +USE cable_common_module, ONLY: l_casacnp, l_vcmaxFeedbk, knode_gl, & + ktau_gl, kend_gl + +USE cable_common_module, ONLY : cable_runtime, cable_user !jhan:have to sort this out for JAC + +!jhan: Leave for reference +!USE casavariable +!USE phenvariable +!USE casa_types_mod +!USE casa_um_inout_mod +!use POP_TYPES, only : pop_type +!CM3-standaloneUSE river_inputs_mod, ONLY: river_step + +!CM3 - updating CABLE-JULES rivers +USE jules_rivers_mod, ONLY: nstep_rivers + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: cycleno +INTEGER, INTENT(IN) :: numcycles +INTEGER, INTENT(IN) :: i_day_number ! day of year (1:365) counter for CASA-CNP +REAL , INTENT(IN) :: timestep ! timestep length [s] +INTEGER, INTENT(IN) :: timestep_number +INTEGER, INTENT(IN) :: row_length,rows, land_pts, nsurft, npft, sm_levels +INTEGER, INTENT(IN) :: dim_cs1 +INTEGER, INTENT(IN) :: mp +INTEGER, INTENT(IN) :: nrb + +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points per tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! land_pt index of point +INTEGER, INTENT(IN) :: land_index(land_pts) ! tangled cell index of land_pt +LOGICAL, INTENT(IN) :: l_tile_pts(:,:) + +REAL, INTENT(IN) :: ls_rain(row_length,rows) ! Large scale rain +REAL, INTENT(IN) :: ls_snow(row_length,rows) ! Large scale snow +REAL, INTENT(IN) :: conv_rain(row_length,rows) ! Convective rain +REAL, INTENT(IN) :: conv_snow(row_length,rows) ! Convective snow +REAL, INTENT(IN) :: tl_1(row_length,rows) ! +REAL, INTENT(IN) :: qw_1(row_length,rows) ! +REAL, INTENT(IN) :: dtl1_1(row_length,rows) ! Level 1 increment to T field +REAL, INTENT(IN) :: dqw1_1(row_length,rows) ! Level 1 increment to q field +REAL, INTENT(IN) :: ctctq1(row_length,rows) ! information needed for increment to T an q field +REAL, INTENT(IN) :: ftl_1(row_length,rows) ! sensible heat flux to layer 1 H.(W/m2) +REAL, INTENT(IN) :: fqw_1(row_length,rows) ! Moisture flux to layer 1 (kg/m^2/sec). + +TYPE(met_type), INTENT(INOUT) :: met +TYPE(radiation_type), INTENT(INOUT) :: rad +TYPE(roughness_type), INTENT(INOUT) :: rough +TYPE(soil_snow_type), INTENT(INOUT) :: ssnow +TYPE(balances_type), INTENT(INOUT) :: bal +TYPE(canopy_type), INTENT(INOUT) :: canopy +TYPE(air_type), INTENT(INOUT) :: air +TYPE(bgc_pool_type), INTENT(INOUT) :: bgc +TYPE(sum_flux_type), INTENT(INOUT) :: sum_flux +TYPE(veg_parameter_type), INTENT(INOUT) :: veg ! vegetation parameters +TYPE(soil_parameter_type), INTENT(INOUT) :: soil ! soil parameters +TYPE (climate_type) :: climate ! climate variables + +!jhan: Leave for reference +!REAL, INTENT(OUT) :: CPOOL_TILE(LAND_PTS,nsurft,10) +!REAL, INTENT(OUT) :: NPOOL_TILE(LAND_PTS,nsurft,10) +!REAL, INTENT(OUT) :: PPOOL_TILE(LAND_PTS,nsurft,12) +!REAL, INTENT(OUT) :: GLAI(LAND_PTS,nsurft) +!REAL, INTENT(OUT) :: PHENPHASE(LAND_PTS,nsurft) + +INTEGER :: & + ktauday, & ! day counter for CASA-CNP + idoy ! day of year (1:365) counter for CASA-CNP +INTEGER, SAVE :: & + kstart = 1 + +REAL :: dtl_mp(mp) +REAL :: dqw_mp(mp) +!Ticket 132 - need ctctq1, incoming values of ftl_1 and fqw_1 on tiles +REAL :: ctctq1_mp(mp) ! UM boundary layer coefficient +REAL :: ftl1_mp(mp) ! grid box averaged FTL +REAL :: fqw1_mp(mp) ! gird box averaged FQW + + REAL, DIMENSION(LAND_PTS) :: & + LYING_SNOW, & ! OUT Gridbox snowmass (kg/m2) + SUB_SURF_ROFF, & ! + SURF_ROFF, & ! + TOT_TFALL ! +!this is NA for single-site standalone +INTEGER, parameter :: river_step = 1 + +!___ local vars +!jhan: Leave for reference +!This is a quick fix. These can be organised through namelists +LOGICAL :: spinup=.FALSE., spinconv=.FALSE., & + dump_read=.FALSE., dump_write=.FALSE. +INTEGER :: loy=365, lalloc=0 + +!___ 1st call in RUN (!=ktau_gl -see below) +REAL, ALLOCATABLE:: fwork(:,:,:) +REAL :: dummy_rr(row_length,rows) + +LOGICAL, SAVE :: first_cable_call = .TRUE. +CHARACTER(LEN=*), PARAMETER :: subr_name = "cable_implicit_driver" + +!Prog Bank copies all prognostic and other variables whose +!values need to be retain from UM timestep to UM timestep. +!NOTE that canopy%cansto is a prognostic variable but is handled +!differently through the canopy%oldcansto variable + +!-------- Unique subroutine body ----------- + +dtl_mp = 0. ; dqw_mp = 0. + +!--- All these subrs do is pack a CABLE var with a UM var. +!------------------------------------------------------------------- +!--- UM met forcing vars needed by CABLE which have UM dimensions +!---(rowlength,rows)[_rr], which is no good to CABLE. These have to be +!--- re-packed in a single vector of active tiles. Hence we use +!--- conditional "mask" l_tile_pts(land_pts,nsurft) which is .true. +!--- if the land point is/has an active tile +!--- generic format: +!--- cable_pack_rr( UM var, default value for snow tile, CABLE var, mask ) +!--- where mask tells cable_pack_rr whether or not to use default value +!--- for snow tile +!------------------------------------------------------------------- + +dummy_rr(:,:) = 0.0 +dummy_rr(:,:) = ( ls_rain(:,:) + conv_rain(:,:) ) * timestep +CALL cable_pack_rr( met%precip, dummy_rr, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +dummy_rr(:,:) = 0.0 +dummy_rr(:,:) = ( ls_snow(:,:) + conv_snow(:,:) ) * timestep +CALL cable_pack_rr( met%precip_sn, dummy_rr, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( met%tk, TL_1, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( met%qv, QW_1, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( dtl_mp, dtl1_1, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( dqw_mp, dqw1_1, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +!Ticket #132 implementation +!dtl_mp, dqw_mp found on tiles above - these are the corrected dtl_mp and dqw_mp +IF (cable_user%l_revised_coupling) THEN + + CALL cable_pack_rr( ctctq1_mp, ctctq1, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + + CALL cable_pack_rr( ftl1_mp, ftl_1, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + + CALL cable_pack_rr( fqw1_mp, fqw_1, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + + dtl_mp = dtl_mp - ctctq1_mp * ftl1_mp/CAPP !NB FTL_1 is in W/m2 hence / CAPP + dqw_mp = dqw_mp - ctctq1_mp * fqw1_mp + +ENDIF + +met%precip = met%precip + met%precip_sn +met%tk = met%tk + dtl_mp +met%qv = met%qv + dqw_mp +met%tvair = met%tk +met%tvrad = met%tk + +CALL cbm_impl( cycleno, numcycles, mp, nrb, timestep_number, timestep, & + air, bgc, canopy, met, bal, rad, rough, & + soil, ssnow, sum_flux, veg, climate ) + +! Integrate wb_lake over the river timestep. +! Used to scale river flow within ACCESS +! Zeroed each river step in subroutine cable_lakesriver and on restarts. +! ssnow_wb_lake in kg/m^2 +! CM3 - updated to use JULES7.x vars +if (cycleno == numcycles) THEN + ssnow%totwblake = ssnow%totwblake + ssnow%wb_lake/nstep_rivers +end if + + ! Lestevens - temporary ? + ktauday = int(24.0*3600.0/TIMESTEP) + idoy=i_day_number + + !Jan 2018: Only call carbon cycle prognostics updates on the last call to + !cable_implicit per atmospheric time step + if (cycleno==numcycles) then + !Call CASA-CNP + !CM2!if (l_casacnp) & + !CM2! CALL bgcdriver(ktau_gl,kstart,kend_gl,timestep,met,ssnow,canopy,veg,soil, & + !CM2! climate,casabiome,casapool,casaflux,casamet,casabal,phen, & + !CM2! pop, spinConv,spinup, ktauday, idoy,loy, dump_read, & + !CM2! dump_write, LALLOC) + + !CM2!CALL sumcflux(ktau_gl,kstart,kend_gl,TIMESTEP,bgc,canopy,soil,ssnow, & + !CM2! sum_flux,veg,met,casaflux,l_vcmaxFeedbk) + endif + +!GLAI = 0.0 +!PHENPHASE = 0.0 + ! Only call carbon cycle prognostics updates on the last call to + ! cable_implicit per atmospheric time step + ! Call CASA-CNP collect pools + !block!if (cycleno==numcycles .AND. l_casacnp) & + !block! CALL casa_poolout_unpk(casapool,casaflux,casamet,casabal,phen, & + !block! CPOOL_TILE,NPOOL_TILE,PPOOL_TILE, & + !block! GLAI,PHENPHASE) + + !-------- End Unique subroutine body ----------- + +!End Testing puroses: + +RETURN + +END SUBROUTINE cable_implicit_driver + +END module cable_implicit_driv_mod diff --git a/src/coupled/AM3/control/cable/interface/implicit/cable_implicit_main.F90 b/src/coupled/AM3/control/cable/interface/implicit/cable_implicit_main.F90 new file mode 100644 index 000000000..87e1d3e60 --- /dev/null +++ b/src/coupled/AM3/control/cable/interface/implicit/cable_implicit_main.F90 @@ -0,0 +1,242 @@ +MODULE cable_implicit_main_mod + +CONTAINS + +SUBROUTINE Cable_implicit_main( row_length, rows, land_pts, nsurft, npft, & + sm_levels, dim_cs1, cycleno, numcycles, & + timestep, timestep_number, land_index, & + surft_pts, surft_index, & + Fland, tile_frac, smvcst, & + ls_rain, ls_snow, conv_rain, conv_snow, & + tl_1, dtl1_1, qw_1, dqw1_1, ctctq1, & + canopy_gb, canopy_surft, t_soil, & + smcl, sthf, sthu, snow_surft, & + ftl_1, ftl_surft, fqw_1, fqw_surft, le_surft, & + tstar_surft, dtstar_surft, & + surf_ht_flux_land, surf_htf_surft, & + ecan_surft, esoil_surft, ei_surft, & + radnet_surft, gs, gs_surft, & + t1p5m_surft, q1p5m_surft, melt_surft, & + NPP_gb, NPP_pft, NPP_acc_pft, GPP_gb, GPP_pft, & + resp_s, resp_s_tot, resp_p, resp_p_pft, & + g_leaf_pft, &!RESP_S_TILE, !Kathy-ed as diag + progs, work) + +!subrs called +USE cable_implicit_driv_mod, ONLY: cable_implicit_driver +USE cable_implicit_unpack_mod, ONLY: implicit_unpack +USE prognostic_bank_mod_cbl, ONLY: cable_reinstate_prognostics +USE prognostic_bank_mod_cbl, ONLY: cable_store_prognostics +USE init_active_tile_mask_mod, ONLY: init_active_tile_mask_cbl + +! data: TYPE definitions of passed asarguments +USE progs_cbl_vars_mod, ONLY: progs_cbl_vars_type ! CABLE's extra progs +USE work_vars_mod_cbl, ONLY: work_vars_type ! CABLE's types etc + ! kept thru timestep +USE prognostic_bank_mod_cbl, ONLY: ProgBank + +! data: Scalars +USE cable_common_module, ONLY: knode_gl +USE grid_constants_mod_cbl, ONLY: nrb, nsnl, mp +USE grid_constants_mod_cbl, ONLY: nsCs ! # soil carbon stores +USE grid_constants_mod_cbl, ONLY: nvCs ! # vegetation carbon stores + +USE cable_common_module, ONLY : cable_runtime !jhan:have to sort this out for JAC +!jhan: Leave for reference +!# if defined(UM_JULES) +! ! CABLE prognostics declared at top_level +! USE atm_fields_real_mod, ONLY : soil_temp_cable, soil_moist_cable, & +! soil_froz_frac_cable, snow_dpth_cable, & +! snow_mass_cable, snow_temp_cable, & +! snow_rho_cable, +! snow_age_cable, snow_flg_cable, & +! aquifer_moist_cable +! ! CASA prognostics declared at top_level +! USE atm_fields_real_mod, ONLY : C_pool_casa, N_pool_casa, P_pool_casa, & +! SOIL_ORDER_casa, N_DEP_casa, N_FIX_casa, & +! P_DUST_casa, P_weath_casa, LAI_casa, & +! PHENPHASE_casa, RSP_W_PFT_ACC +! !UM: time info +! USE model_time_mod, ONLY: target_end_stepim, i_day + +! USE atmos_physics2_alloc_mod, ONLY : resp_s_tile + +# if defined(UM_JULES) +USE model_time_mod, ONLY: i_day_number +#else +USE model_time_mod, ONLY: timesteps_in_day +#endif + +IMPLICIT NONE + +!___ re-decl input args (INTENT?) +INTEGER :: row_length, rows, land_pts, nsurft, npft, sm_levels +INTEGER :: dim_cs1 +INTEGER :: cycleno, numcycles +REAL :: timestep +INTEGER :: timestep_number +INTEGER :: surft_pts(nsurft) ! # land points per tile +INTEGER :: surft_index(land_pts, nsurft) ! land_pt index of point +INTEGER :: land_index(land_pts) ! tangled cell index of land_pt + +REAL :: tile_frac(land_pts, nsurft) +REAL :: Fland(land_pts) +REAL :: smvcst(land_pts,sm_levels) + ! IN Volumetric saturation point + +REAL :: ls_rain(row_length,rows) !forcing%rain precip: large scale +REAL :: ls_snow(row_length,rows) !forcing%snow precip: large scale +REAL :: conv_rain(row_length,rows) !forcing%rain precip: convective +REAL :: conv_snow(row_length,rows) !forcing%snow precip: convective + +!prog: canopy water stores +REAL :: canopy_gb(land_pts) !prog: aggregate over tiles +REAL :: canopy_surft(land_pts, nsurft) !prog: per tile + +REAL :: tl_1(row_length,rows) !forcing: temp +REAL :: qw_1(row_length,rows) !forcing: humidity +REAL :: dtl1_1(row_length,rows) !forcing: increment to temp +REAL :: dqw1_1(row_length,rows) !forcing: increment to humidity +!Ticket #132 needs ctctq1 +REAL :: ctctq1(row_length,rows) !forcing: temp/humidity increment + +REAL :: ftl_1(row_length,rows) +REAL :: fqw_1(row_length,rows) + +REAL, INTENT(OUT) :: ftl_surft( land_pts, nsurft ) +REAL, INTENT(OUT) :: fqw_surft( land_pts, nsurft ) +REAL, INTENT(OUT) :: le_surft ( land_pts, nsurft ) ! latent heat flux + +!prog: UM soil quantities, per land_pt +REAL, INTENT(OUT) :: t_soil(land_pts,sm_levels) +REAL, INTENT(OUT) :: smcl(land_pts,sm_levels) +REAL, INTENT(OUT) :: sthf(land_pts,sm_levels) +REAL, INTENT(OUT) :: sthu(land_pts,sm_levels) +REAL, INTENT(OUT) :: snow_surft( land_pts, nsurft ) ! Lying snow [kg/m2] + +REAL, INTENT(OUT) :: tstar_surft( land_pts, nsurft ) +REAL, INTENT(OUT) :: dtstar_surft( land_pts, nsurft ) + +REAL, INTENT(OUT) :: surf_htf_surft( land_pts, nsurft ) +REAL, INTENT(OUT) :: surf_ht_flux_land(row_length,rows) +REAL, INTENT(OUT) :: ecan_surft( land_pts, nsurft ) +REAL, INTENT(OUT) :: esoil_surft( land_pts, nsurft ) +REAL, INTENT(OUT) :: ei_surft( land_pts, nsurft ) +REAL, INTENT(OUT) :: radnet_surft( land_pts, nsurft ) +REAL, INTENT(OUT) :: gs_surft( land_pts, nsurft ) +REAL, INTENT(OUT) :: t1p5m_surft( land_pts, nsurft ) +REAL, INTENT(OUT) :: q1p5m_surft( land_pts, nsurft ) +REAL, INTENT(OUT) :: melt_surft( land_pts, nsurft ) + +REAL, INTENT(OUT) :: gs( land_pts ) ! conductance for use in dust scheme + +REAL, INTENT(OUT) :: npp_acc_pft(land_pts,nsurft) +REAL, INTENT(OUT) :: npp_gb(land_pts) +REAL, INTENT(OUT) :: npp_pft(land_pts,nsurft) +REAL, INTENT(OUT) :: gpp_gb(land_pts) +REAL, INTENT(OUT) :: gpp_pft(land_pts,nsurft) +REAL, INTENT(OUT) :: resp_s(land_pts, dim_cs1) ! Soil respiration (kg C/m2/s) +REAL, INTENT(OUT) :: resp_s_tot(land_pts) ! Total soil resp'n (kg C/m2/s) +REAL, INTENT(OUT) :: resp_p(land_pts) +REAL, INTENT(OUT) :: resp_p_pft(land_pts,nsurft) +REAL, INTENT(OUT) :: g_leaf_pft(land_pts,npft) + +TYPE(progs_cbl_vars_type), INTENT(IN OUT) :: progs +TYPE(work_vars_type), INTENT(IN OUT) :: work + +!___ local vars +!Instantiate prognostic storage (bank) +TYPE (ProgBank) :: pb + +# if !defined(UM_JULES) +INTEGER :: i_day_number +#endif +REAL, ALLOCATABLE :: dtrad(:) +LOGICAL, ALLOCATABLE :: l_tile_pts(:,:) +LOGICAL, SAVE :: first_call = .true. +LOGICAL, SAVE :: zero_points_warning= .true. +CHARACTER(LEN=*), PARAMETER :: subr_name = "cable_implicit_main" + +IF( land_pts == 0 ) THEN + IF( zero_points_warning ) THEN + WRITE(6,*) "Reached CABLE ", subr_name, & + " even though zero land_points on processor ", knode_gl + END IF + zero_points_warning = .FALSE. + RETURN +END IF + +cable_runtime%um = .TRUE. +cable_runtime%um_implicit = .TRUE. + +! this done every call (maybe we hould pass this through work%) +!------------------------------------------------------------------------------ +! Determine the number of active tiles +mp = SUM(surft_pts) + +IF( .NOT. ALLOCATED(l_tile_pts) ) ALLOCATE( l_tile_pts(land_pts, nsurft) ) + +! Define mapping mask. i.e. l_tile_pts =TRUE (active) , where tile_frac > 0 +CALL init_active_tile_mask_cbl(l_tile_pts, land_pts, nsurft, tile_frac ) +!------------------------------------------------------------------------------ + +IF( .NOT. ALLOCATED(dtrad) ) ALLOCATE( dtrad(mp) ) + +# if !defined(UM_JULES) +i_day_number = FLOOR( REAL(timestep_number) / REAL(timesteps_in_day) ) +#endif + +!Due to ENDGAME, CABLE(any LSM) is called twice on implicit step. +CALL cable_store_prognostics( pb, mp, sm_levels, nsCs,nvCs, work%ssnow, & + work%canopy, work%bgc ) + +!jhan:check - in CM2 but left out here? do this closer to evaluation +IF (first_call ) THEN + T1P5M_surft = 0.0 + Q1P5M_surft = 0.0 +ENDIF + +CALL cable_implicit_driver( cycleno, numcycles, i_day_number, & + timestep, timestep_number, & + row_length, rows, land_pts, nsurft, npft, & + sm_levels, dim_cs1, mp, nrb, & + land_index, surft_pts, surft_index, l_tile_pts, & + ls_rain, conv_rain, ls_snow, conv_snow, & + tl_1, qw_1, ftl_1, fqw_1, dtl1_1, dqw1_1, ctctq1, & + work%rad, work%met, work%rough, work%canopy, & + work%veg, work%soil, work%ssnow, work%bal, & + work%air, work%bgc, work%sum_flux ) + !CPOOL_TILE, NPOOL_TILE, PPOOL_TILE, & + !GLAI, PHENPHASE) + +IF (cycleno .NE. numcycles ) THEN + CALL cable_reinstate_prognostics( pb, work%ssnow, work%canopy, work%bgc ) +ENDIF + +CALL implicit_unpack( cycleno, row_length, rows, land_pts, nsurft, npft, & + sm_levels, dim_cs1, timestep, mp, nsnl, land_index, & + surft_pts, surft_index, tile_frac, l_tile_pts, smvcst, & + t_soil, smcl, sthf, sthu, snow_surft, & + FTL_1, FTL_surft, FQW_1, FQW_surft, le_surft, & + TSTAR_surft, SURF_HT_FLUX_LAND, ECAN_surft, & + ESOIL_surft, EI_surft, RADNET_surft, & + canopy_surft, gs, gs_surft, t1p5m_surft, q1p5m_surft, & + canopy_gb, fland, melt_surft, & + NPP_gb, npp_pft, GPP_gb, GPP_pft, resp_s, resp_s_tot, & + RESP_P, resp_p_pft, g_leaf_pft, & + NPP_acc_pft, surf_htf_surft, & + dtstar_surft, progs, work, & + work%rad, work%met, work%rough, work%canopy, & + work%veg, work%soil, work%ssnow, work%bal, & + work%air, work%bgc, work%sum_flux ) + +first_call = .FALSE. +cable_runtime%um_implicit = .FALSE. + +RETURN + +END SUBROUTINE cable_implicit_main + +END MODULE cable_implicit_main_mod + + diff --git a/src/coupled/AM3/control/cable/interface/implicit/cable_implicit_unpack.F90 b/src/coupled/AM3/control/cable/interface/implicit/cable_implicit_unpack.F90 new file mode 100644 index 000000000..ff4360a0c --- /dev/null +++ b/src/coupled/AM3/control/cable/interface/implicit/cable_implicit_unpack.F90 @@ -0,0 +1,400 @@ +MODULE cable_implicit_unpack_mod + +CONTAINS + +SUBROUTINE implicit_unpack( cycleno, row_length, rows, land_pts, nsurft, npft, & + sm_levels, dim_cs1, timestep, mp, nsnl, land_index,& + surft_pts, surft_index, tile_frac, l_tile_pts, & + smvcst, tsoil, smcl, sthf, sthu, snow_surft, & + ftl_1, ftl_tile, fqw_1, fqw_tile, le_surft, & + tstar_tile, surf_ht_flux_land, ecan_tile, & + esoil_tile, ei_tile, radnet_tile, canopy_tile, & + gs, gs_tile, t1p5m_tile, q1p5m_tile, canopy_gb, & + fland, melt_tile, npp, npp_ft, gpp, gpp_ft, & + resp_s, resp_s_tot, resp_p, resp_p_ft, g_leaf, & + npp_ft_acc, surf_htf_tile, dtstar_tile, & + progs, work, rad, met, rough, canopy, veg, soil, & + ssnow, bal, air, bgc, sum_flux ) + +USE progs_cbl_vars_mod, ONLY: progs_cbl_vars_type ! CABLE requires extra progs +USE work_vars_mod_cbl, ONLY: work_vars_type ! and some kept thru timestep + +!processor number, timestep number / width, endstep +USE cable_common_module, ONLY : knode_gl, ktau_gl, kwidth_gl, kend_gl +USE cable_common_module, ONLY : cable_runtime +USE cable_common_module!, ONLY : cable_runtime, cable_user, fudge_out, & + ! L_fudge, ktau_gl +USE cable_def_types_mod, ONLY: air_type, bgc_pool_type, met_type, & + balances_type, radiation_type, roughness_type, & + soil_parameter_type, soil_snow_type, & + sum_flux_type, veg_parameter_type, canopy_type + +USE cable_phys_constants_mod, ONLY: density_liq, density_ice, tfrz + +IMPLICIT NONE + +!___ re-decl input args +INTEGER, INTENT(IN) :: cycleno +INTEGER, INTENT(IN) :: row_length,rows, land_pts, nsurft, npft, sm_levels +INTEGER, INTENT(IN) :: dim_cs1 +INTEGER, INTENT(IN) :: mp +INTEGER, INTENT(IN) :: nsnl +REAL, INTENT(IN) :: timestep + +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points per tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! land_pt index of point +INTEGER, INTENT(IN) :: land_index(land_pts) ! tangled cell index of land_pt +REAL, INTENT(IN) :: tile_frac(land_pts, nsurft) +LOGICAL, INTENT(IN) :: l_tile_pts(:,:) + +TYPE(progs_cbl_vars_type), INTENT(OUT) :: progs +TYPE(work_vars_type), INTENT(INOUT) :: work + +REAL, INTENT(IN) :: smvcst(land_pts,sm_levels) ! IN Volumetric saturation point + +REAL, INTENT(IN) :: fland(land_pts) ! IN Land fraction on land tiles +REAL, INTENT(OUT) :: gs(land_pts) ! OUT "Stomatal" conductance to + +!--- FQW(,1) is total water flux from surface, 'E'. +!--- Moisture flux between layers. (kg/m^2/sec). +REAL, INTENT(OUT) :: fqw_1(row_length,rows) + +!--- FTL(,K) =net turbulent sensible heat flux into layer K +!--- from below; so FTL(,1) = surface sensible heat, H.(W/m2) +REAL, INTENT(OUT) :: ftl_1(row_length,rows) + +!--- Net downward heat flux at surface over land. +!--- fraction of gridbox (W/m2). +REAL :: SURF_HT_FLUX_LAND(ROW_LENGTH,ROWS) + +REAL, INTENT(OUT) :: melt_tile(land_pts,nsurft) +REAL, INTENT(OUT) :: smcl(land_pts,sm_levels) +REAL, INTENT(OUT) :: sthf(land_pts,sm_levels) +REAL, INTENT(OUT) :: sthu(land_pts,sm_levels) +REAL, INTENT(OUT) :: tsoil(land_pts,sm_levels) +REAL, INTENT(OUT) :: snow_surft(land_pts,nsurft) +REAL, INTENT(OUT) :: le_surft( land_pts, nsurft ) ! latent heat flux + + REAL, DIMENSION(land_pts,nsurft) :: & + SURF_HTF_TILE,& + !___Surface FTL, FQL for land tiles + FTL_TILE, FQW_TILE, & + !___(tiled) latent heat flux, melting, stomatatal conductance + GS_TILE, & + RADNET_TILE, & ! INOUT Surface net radiation on tiles (W/m2) + EI_TILE, & ! OUT EI for land tiles. + ECAN_TILE, & ! OUT ECAN for snow-free land tiles + ESOIL_TILE, & ! evapotranspiration from soil moisture store (kg/m2/s) + RESP_P_FT, & ! + G_LEAF, & ! + GPP_FT, & ! + NPP_FT, & ! + NPP_FT_ACC, & ! sresp for CASA-CNP + CANOPY_TILE, & ! + T1P5M_TILE, & + Q1P5M_TILE, & + TSTAR_TILE, & + RESP_S_TILE, & + DTSTAR_TILE !change in tstar_tile over time step + + REAL, dimension(land_pts) :: & + RESP_P, & ! + NPP, & ! + GPP, & ! + SNOW_GRD, & + CANOPY_GB, & + T1P5M + + !___(tiled, 3 layer) Snow depth (m), mass, density, temp., conductivity + REAL, dimension(land_pts,nsurft) :: & + NEE_TILE + + REAL :: & + RESP_S(LAND_PTS,DIM_CS1), & ! + RESP_S_old(LAND_PTS,DIM_CS1), & ! + RESP_S_TOT(land_pts) ! + + !___ local vars + REAL :: DTRAD(mp) ! CABLE change in rad%trad over time step + + INTEGER :: i,j,l,k,n,m + !___(tiled) soil prognostics: as above + REAL :: smcl_tile(land_pts,nsurft,sm_levels) + REAL :: sthu_tile(land_pts,nsurft,sm_levels) + REAL :: sthf_tile(land_pts,nsurft,sm_levels) + REAL :: tsoil_tile(land_pts,nsurft,sm_levels) + REAL :: smcl_ln(land_pts,nsurft,sm_levels) + REAL :: sthu_ln(land_pts,nsurft,sm_levels) + REAL :: sthf_ln(land_pts,nsurft,sm_levels) + REAL :: tsoil_ln(land_pts,nsurft,sm_levels) + REAL :: SNOW_COND(land_pts,nsurft,nsnl) + + REAL :: TOT_ALB(land_pts,nsurft) ! total albedo + REAL :: RESP_W_FT_ACC(land_pts,nsurft) ! presp for CASA-CNP + REAL :: SURF_CAB_ROFF(land_pts,nsurft) + REAL :: canopy_through_UM(land_pts,nsurft) + REAL :: TOT_TFALL_TILE(land_pts,nsurft) + +TYPE(met_type) :: met +TYPE(radiation_type) :: rad +TYPE(roughness_type) :: rough +TYPE(soil_snow_type) :: ssnow +TYPE(balances_type) :: bal +TYPE(canopy_type) :: canopy +TYPE(air_type) :: air +TYPE(bgc_pool_type) :: bgc +TYPE(sum_flux_type) :: sum_flux +TYPE(veg_parameter_type) :: veg ! vegetation parameters +TYPE(soil_parameter_type) :: soil ! soil parameters + +REAL :: fe_dlh(mp) +REAL :: fes_dlh(mp) +REAL :: fev_dlh(mp) + +!--- Local buffer surface FTL, FQL @ prev dt +REAL :: ftl_tile_old(land_pts,nsurft) +REAL :: fqw_tile_old(land_pts,nsurft) + +INTEGER:: i_miss = 0 +REAL :: miss = 0.0 +INTEGER :: isnow_flg_cable(land_pts,nsurft) +REAL :: dmdA_liq +REAL :: dmdA_ice +REAL :: gpp_ft_mp(mp) + +!-------- Unique subroutine body ----------- +!jhan: should fland be applied or not? - maybe we shouldnt even be dealing with +!any i,j fields +smcl = 0.0 +sthf = 0.0 +sthu = 0.0 +tsoil = 0.0 +smcl_tile = 0.0 +sthf_tile = 0.0 +sthu_tile = 0.0 +tsoil_tile = 0.0 +snow_cond = 0.0 +!smgw_tile = 0.0 + +DO j = 1,sm_levels + + tsoil_tile(:,:,j)= UNPACK( ssnow%tgg(:,j), L_tile_pts, miss) + !liquid mass first + smcl_tile(:,:,j) = UNPACK( REAL( ssnow%wbliq(:,j)), L_tile_pts, miss) + smcl_tile(:,:,j) = smcl_tile(:,:,j) * soil%zse(j) * density_liq + !ice volumetric + sthf_tile(:,:,j) = UNPACK( REAL( ssnow%wbice(:,j)), L_tile_pts, miss) + +ENDDO ! SM_LEVELS + +DO j = 1,sm_levels + !calcualte sthu_tilebefore smcl_tile incoudes ice mass + DO N=1,Nsurft + + DO K=1,surft_PTS(N) + + I = surft_INDEX(K,N) + + ! Exclude permanent ice + IF ( SMVCST(I,j) > 0. ) & !liq mass relaative to max + STHU_TILE(I,N,J)= MAX( 0., SMCL_TILE(I,N,J) / & + (soil%zse(j)*SMVCST(I,j)*density_liq ) ) + + !add ice mass to liq mass + SMCL_TILE(I,N,j) = SMCL_TILE(I,N,j) + & + STHF_TILE(I,N,j) * soil%zse(j) * density_ice + !relative ice vol + IF ( SMVCST(I,j) > 0. ) & + STHF_TILE(I,N,j)= STHF_TILE(I,N,j)/SMVCST(I,j) + + ENDDO ! TILE_PTS(N) + + ENDDO ! NTILES + + SMCL(:,j) = SUM(TILE_FRAC * SMCL_TILE(:,:,j),2) + TSOIL(:,j) = SUM(TILE_FRAC * TSOIL_TILE(:,:,j),2) + + STHF(:,J) = SUM(TILE_FRAC * STHF_TILE(:,:,J),2) + STHU(:,J) = SUM(TILE_FRAC * STHU_TILE(:,:,J),2) + +ENDDO ! SM_LEVELS + + +progs%SoilMoisture_CABLE(:,:,:) = smcl_tile(:,:,:) +progs%FrozenSoilFrac_CABLE(:,:,:) = sthf_tile(:,:,:) +progs%SoilTemp_CABLE(:,:,:) = tsoil_tile(:,:,:) + +isnow_flg_cable = UNPACK(ssnow%isflag, L_TILE_PTS, i_miss) +progs%OneLyrSnowDensity_CABLE = UNPACK(ssnow%ssdnn, l_tile_pts, miss) +progs%ThreeLayerSnowFlag_CABLE(:,:) = REAL( isnow_flg_cable(:,:) ) + +!--- unpack layered snow vars +DO k = 1,3 + progs%SnowTemp_CABLE(:,:,k) = UNPACK(ssnow%tggsn(:,k), L_TILE_PTS, miss) + progs%SnowMass_CABLE(:,:,k) = UNPACK(ssnow%smass(:,k), L_TILE_PTS, miss) + progs%SnowDensity_CABLE(:,:,k) = UNPACK(ssnow%ssdn(:,k), L_TILE_PTS, miss) + progs%SnowDepth_CABLE(:,:,k) = UNPACK(ssnow%sdepth(:,k),L_TILE_PTS,miss) + progs%SnowAge_CABLE(:,:) = UNPACK(ssnow%snage, L_TILE_PTS, miss) + !snow_cond(:,:,k) = UNPACK(ssnow%sconds(:,k),L_TILE_PTS,miss)i !this + !doesn't go anywhere +END DO + +!--- unpack snow vars +melt_tile = UNPACK(ssnow%smelt, l_tile_pts, miss) +snow_surft = UNPACK(ssnow%snowd, l_tile_pts, miss) +snow_grd = SUM(tile_frac * snow_surft,2) ! gridbox snow mass & snow below canopy + +work%lying_snow(:) = snow_grd(:) !jh:this sis done twice AND differently +canopy%gswx_T = canopy%gswx_T/air%cmolar +gs_tile = UNPACK(canopy%gswx_T,L_TILE_PTS,miss) +gs = SUM(tile_frac * GS_TILE,2) + +!---preserve fluxes from the explicit step for the coastal grids +ftl_tile_old = ftl_tile +fqw_tile_old = fqw_tile + +fes_dlh = canopy%fes / ( air%rlam * ssnow%cls ) +fev_dlh = canopy%fev / air%rlam +fe_dlh = fev_dlh + fes_dlh + +ftl_tile = UNPACK(canopy%fh, l_tile_pts, miss) +le_surft = UNPACK(canopy%fe, l_tile_pts, miss) +fqw_tile = UNPACK(fe_dlh, l_tile_pts, miss) + +!retain sea/ice contribution and remove land contribution j +!anymore +DO n=1,nsurft + DO k=1,surft_pts(n) + l = surft_index(K,N) + j=(land_index(l)-1)/row_length + 1 + i = land_index(l) - (j-1)*row_length + + IF( fland(l) == 1.0) THEN + ftl_1(i,j) = 0.0 + fqw_1(i,j) = 0.0 + ELSE + ftl_1(i,j) = ftl_1(i,j) - ( fland(l)* tile_frac(l,n) * ftl_tile_old(l,n) ) + fqw_1(i,j) = fqw_1(i,j) - ( fland(l)* tile_frac(l,n) * fqw_tile_old(l,n) ) + ENDIF + + ENDDO !surft_pts(n) +ENDDO !nsurft +!update with this ftl +DO n=1,nsurft + DO k=1,surft_pts(n) + l = surft_index(K,N) + j=(land_index(l)-1)/row_length + 1 + i = land_index(l) - (j-1)*row_length + + ftl_1(i,j) = ftl_1(i,j) + ( fland(l)* tile_frac(l,n) * ftl_tile(l,n) ) + fqw_1(i,j) = fqw_1(i,j) + ( fland(l)* tile_frac(l,n) * fqw_tile(l,n) ) + + ENDDO !surft_pts(n) +ENDDO !nsurft + +tstar_tile = UNPACK(rad%trad, l_tile_pts, miss) +radnet_tile = UNPACK( canopy%rnet , l_tile_pts, miss) +ecan_tile = UNPACK(fev_dlh, L_TILE_PTS, miss) + +! need to split %fes into evaporation and sublimation +fes_dlh = 0. +WHERE (ssnow%cls==1.) fes_dlh = canopy%fes/(air%rlam*ssnow%cls) +esoil_tile = UNPACK(fes_dlh, L_tile_pts, miss) + +fes_dlh = 0. +WHERE (ssnow%cls==1.1335) fes_dlh = canopy%fes/(air%rlam*ssnow%cls) +ei_tile = UNPACK(fes_dlh, L_TILE_PTS, miss) + +dtrad = rad%trad - rad%otrad +dtstar_tile = UNPACK(dtrad, L_tile_pts, miss) + +!CM3 - internal diag only +!CM3 TRANSP_TILE = UNPACK(canopy%fevc, L_TILE_PTS, miss) +tot_alb = UNPACK(rad%albedo_T,L_TILE_PTS, miss) + +!unpack screen level (1.5m) variables - Convert back to K +t1p5m_tile = UNPACK(canopy%tscrn+tfrz, L_TILE_PTS, miss) +q1p5m_tile = UNPACK(canopy%qscrn, L_TILE_PTS, miss) + +canopy_tile = UNPACK(canopy%cansto, L_TILE_PTS, miss) +canopy_gb = SUM(tile_frac * canopy_tile,2) !fland? + + +!initialse full land grids and retain coastal grid fluxes +!initialse full land grids and retain coastal grid fluxes + +surf_htf_tile = UNPACK(canopy%ga,L_TILE_PTS,miss) +surf_ht_flux_land(:,:) = 0. +!fland? +DO n=1,nsurft + DO K=1,surft_pts(N) + + l = surft_index(K,N) + j=(land_index(l)-1)/row_length + 1 + i = land_index(l) - (j-1)*row_length + + surf_ht_flux_land(i,j) = surf_ht_flux_land(i,j) + & + tile_frac(l,n) * surf_htf_tile(l,n) + + ENDDO +ENDDO + +! Initialise grid-cell carbon fields that are accumulated over tiles +resp_p = 0.; npp = 0.; gpp = 0.; resp_s = 0. + +resp_s_tile = UNPACK(canopy%frs, L_tile_pts, miss) !see ISSUE#51 +nee_tile = UNPACK(canopy%fnee, L_tile_pts, miss) +npp_ft = UNPACK(canopy%fnpp, L_tile_pts, miss) +g_leaf = UNPACK(canopy%frday,L_tile_pts, miss) +resp_p_ft = UNPACK(canopy%frp, L_tile_pts, miss) +gpp_ft_mp = canopy%fnpp + canopy%frp + canopy%frday +gpp_ft = UNPACK(gpp_ft_mp, L_tile_pts, miss) + +! convert from CABLE units (gC/m2/s) to UM units (kgC/m2/s) +resp_s_tile = resp_s_tile * 1.e-3 +g_leaf = g_leaf * 1.e-3 +npp_ft = npp_ft * 1.e-3 +gpp_ft = gpp_ft * 1.e-3 +resp_p_ft = resp_p_ft * 1.e-3 + +! If CASA-CNP used, plant and soil resp need to be passed into +! variables that are dumped to restart, because CASA-CNP only run daily +npp_ft_acc = resp_s_tile !see ISSUE#51 +resp_w_ft_acc = resp_p_ft !see ISSUE#51 +!fland ? +DO n=1,nsurft + DO k=1,surft_pts(N) + l = surft_index(K,N) + npp(l)=npp(l)+fland(l)*tile_frac(l,n)*npp_ft(l,n) + gpp(l)=gpp(l)+fland(l)*tile_frac(l,n)*gpp_ft(l,n) + resp_p(l)=resp_p(l)+fland(l)*tile_frac(l,n)*resp_p_ft(l,n) + + !loop for soil resp. although DIM_CS1=1 (not 1 for triffid) + DO i=1,dim_cs1 + resp_s(l,i) = resp_s(l,i) + & + fland(l)*tile_frac(l,n)*resp_s_tile(l,n) + ENDDO + resp_s_tot(l)=SUM(resp_s(l,:)) !in CM2 this doesnt actually do anything !see ISSUE#51 + t1p5m(L)=SUM(t1p5m_tile(L,:)) + ENDDO +ENDDO +!jhan?fland? +work%lying_snow = SUM(TILE_FRAC * snow_surft,2) !gridbox snow mass + +surf_cab_roff = UNPACK(ssnow%rnof1, L_tile_pts, miss) +work%surf_roff = SUM(tile_frac * surf_cab_roff,2) + +surf_cab_roff = UNPACK(ssnow%rnof2, L_TILE_PTS, miss) +work%sub_surf_roff = SUM(tile_frac * surf_cab_roff,2) + +! %through is /dels in UM app. for STASH output +canopy_through_UM = UNPACK(canopy%through, L_tile_pts, miss) +tot_tfall_tile = canopy_through_UM / timestep +work%tot_tfall = SUM(tile_frac * tot_tfall_tile,2) + + +RETURN + +END SUBROUTINE Implicit_unpack + +End module cable_implicit_unpack_mod diff --git a/src/coupled/AM3/control/cable/interface/implicit/cbl_prognostic_bank.F90 b/src/coupled/AM3/control/cable/interface/implicit/cbl_prognostic_bank.F90 new file mode 100644 index 000000000..ec5b0f866 --- /dev/null +++ b/src/coupled/AM3/control/cable/interface/implicit/cbl_prognostic_bank.F90 @@ -0,0 +1,167 @@ +MODULE prognostic_bank_mod_cbl + +TYPE ProgBank + + REAL, DIMENSION(:,:), ALLOCATABLE :: & + tsoil, smcl, sthf, & + snow_depth, & + snow_mass, snow_tmp, snow_rho , & + sli_s, sli_tsoil, sli_sconds, sli_snowliq, & + cplant, csoil !carbon variables + + REAL, DIMENSION(:), ALLOCATABLE :: & + snow_rho1l, snow_age, snow_tile, & + ocanopy, & + fes_cor,fhs_cor, osnowd,owetfac,otss,gwwb,tss0, & + puddle, rtsoil, wblake, gwaq, & + sli_h0, sli_tsurf + + INTEGER, DIMENSION(:), ALLOCATABLE :: & + snow_flg3l, sli_nsnow + +END TYPE ProgBank + +CONTAINS + +SUBROUTINE cable_store_prognostics( pb, mp, nsl, nsCs,nvCs, ssnow, canopy, bgc ) + +USE cable_common_module, ONLY: cable_user +USE cable_def_types_mod, ONLY: soil_snow_type, bgc_pool_type +USE cable_canopy_type_mod, ONLY: canopy_type + +IMPLICIT NONE +INTEGER, INTENT(IN) :: mp ! # active tiles +INTEGER, INTENT(IN) :: nsl ! # soil layers +INTEGER, INTENT(IN) :: nsCs ! # soil carbon stores +INTEGER, INTENT(IN) :: nvCs ! # vegetation carbon stores + +TYPE (ProgBank), INTENT(INOUT):: pb +TYPE(soil_snow_type), INTENT(INOUT) :: ssnow +TYPE(canopy_type), INTENT(INOUT) :: canopy +TYPE(bgc_pool_type), INTENT(INOUT) :: bgc + +IF (.NOT. ALLOCATED(pb%tsoil) ) then + + ALLOCATE( pb%tsoil(mp,nsl) ) + ALLOCATE( pb%smcl(mp,nsl) ) + ALLOCATE( pb%sthf(mp,nsl) ) + ALLOCATE( pb%snow_depth(mp,3) ) + ALLOCATE( pb%snow_mass(mp,3) ) + ALLOCATE( pb%snow_tmp(mp,3) ) + ALLOCATE( pb%snow_rho(mp,3) ) + ALLOCATE( pb%snow_rho1l(mp) ) + ALLOCATE( pb%snow_age(mp) ) + ALLOCATE( pb%snow_flg3l(mp) ) + ALLOCATE( pb%snow_tile(mp) ) + ALLOCATE( pb%puddle(mp) ) + ALLOCATE( pb%owetfac(mp) ) + ALLOCATE( pb%rtsoil(mp) ) + ALLOCATE( pb%wblake(mp) ) + ALLOCATE(pb%tss0(mp) ) + ALLOCATE( pb%ocanopy(mp) ) + ALLOCATE( pb%fes_cor(mp) ) + !carbon variables - may not be needed unless CASA + ALLOCATE( pb%cplant(mp,nvcs) ) + ALLOCATE( pb%csoil(mp,nscs) ) + !GW model variables no need to test always has a value + !so do not introduce issues with restarting a GW run + ALLOCATE (pb%GWaq(mp) ) + + !SLI variables - Jhan please check the second dimension + IF (cable_user%soil_struc=='sli') THEN + ALLOCATE(pb%sli_nsnow(mp) ) + ALLOCATE(pb%sli_s(mp,nsl) ) + ALLOCATE(pb%sli_tsoil(mp,nsl) ) + ALLOCATE(pb%sli_sconds(mp,3) ) + ALLOCATE(pb%sli_h0(mp) ) + ALLOCATE(pb%sli_tsurf(mp) ) + ALLOCATE(pb%sli_snowliq(mp,3) ) + ENDIF + +ENDIF !.NOT. allocated + +pb%tsoil = ssnow%tgg +pb%smcl = ssnow%wb +pb%sthf = ssnow%wbice +pb%snow_depth = ssnow%sdepth +pb%snow_mass = ssnow%smass +pb%snow_tmp = ssnow%tggsn +pb%snow_rho = ssnow%ssdn +pb%snow_rho1l = ssnow%ssdnn +pb%snow_age = ssnow%snage +pb%snow_flg3l = ssnow%isflag +pb%snow_tile = ssnow%snowd +pb%puddle = ssnow%pudsto +pb%rtsoil = ssnow%rtsoil !?needed in restart? +pb%owetfac = ssnow%owetfac +pb%wblake = ssnow%wb_lake +pb%tss0 = ssnow%tss +pb%ocanopy = canopy%oldcansto +pb%fes_cor = canopy%fes_cor +pb%cplant = bgc%cplant ! may not be needed unless CASA +pb%csoil = bgc%csoil ! may not be needed unless CASA +pb%gwaq = ssnow%gwwb !GW model ?issues with restarting? + +!SLI variables +IF (cable_user%soil_struc=='sli') THEN + pb%sli_nsnow = ssnow%nsnow + pb%sli_s = ssnow%s + pb%tsoil = ssnow%tsoil + pb%sli_sconds = ssnow%sconds + pb%sli_h0 = ssnow%h0 + pb%sli_Tsurf = ssnow%tsurface + pb%sli_snowliq = ssnow%snowliq +ENDIF + +RETURN +END SUBROUTINE cable_store_prognostics + +SUBROUTINE cable_reinstate_prognostics( pb, ssnow, canopy, bgc ) + +USE cable_def_types_mod, ONLY: soil_snow_type, bgc_pool_type +USE cable_canopy_type_mod, ONLY: canopy_type +USE cable_common_module, ONLY: cable_user + +IMPLICIT NONE +TYPE (ProgBank), INTENT(INOUT) :: pb +TYPE(soil_snow_type), INTENT(INOUT) :: ssnow +TYPE(canopy_type), INTENT(INOUT) :: canopy +TYPE(bgc_pool_type), INTENT(INOUT) :: bgc + +ssnow%tgg = pb%tsoil +ssnow%wb = pb%smcl +ssnow%wbice = pb%sthf +ssnow%sdepth = pb%snow_depth +ssnow%smass = pb%snow_mass +ssnow%tggsn = pb%snow_tmp +ssnow%ssdn = pb%snow_rho +ssnow%ssdnn = pb%snow_rho1l +ssnow%snage = pb%snow_age +ssnow%isflag = pb%snow_flg3l +ssnow%snowd = pb%snow_tile +ssnow%pudsto = pb%puddle +ssnow%rtsoil = pb%rtsoil !?needed +ssnow%owetfac = pb%owetfac +ssnow%wb_lake = pb%wblake +ssnow%tss = pb%tss0 +canopy%oldcansto = pb%ocanopy +canopy%fes_cor = pb%fes_cor +bgc%cplant = pb%cplant ! may not be needed unless CASA +bgc%csoil = pb%csoil ! may not be needed unless CASA +ssnow%GWwb = pb%GWaq! GW model variables + +!SLI variables +IF (cable_user%soil_struc=='sli') THEN + ssnow%nsnow = pb%sli_nsnow + ssnow%S = pb%sli_s + ssnow%Tsoil = pb%sli_tsoil + ssnow%sconds = pb%sli_sconds + ssnow%h0 = pb%sli_h0 + ssnow%Tsurface = pb%sli_tsurf + ssnow%snowliq = pb%sli_snowliq +ENDIF + +RETURN +END SUBROUTINE cable_reinstate_prognostics + +END MODULE prognostic_bank_mod_cbl diff --git a/src/coupled/AM3/control/cable/interface/radiation/rad_driver_cbl.F90 b/src/coupled/AM3/control/cable/interface/radiation/rad_driver_cbl.F90 new file mode 100644 index 000000000..29befd375 --- /dev/null +++ b/src/coupled/AM3/control/cable/interface/radiation/rad_driver_cbl.F90 @@ -0,0 +1,192 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** +MODULE cable_rad_driv_mod + +!----------------------------------------------------------------------------- +! Description: +! Initialises radiation specific variables and computes the albedo for +! CABLE. +! +! This MODULE is USEd in: +! cable_land_albedo_mod_cbl.F90 (JULES) +! +! This MODULE contains 1 public Subroutine: +! cable_rad_driver +! +! Code owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!----------------------------------------------------------------------------- + +IMPLICIT NONE +PUBLIC :: cable_rad_driver + +CONTAINS + +SUBROUTINE cable_rad_driver( EffSurfRefl_beam, EffSurfRefl_dif, land_pts, & + mp, nrb, ICE_SoilType, lakes_type, Clai_thresh, & + Ccoszen_tols, CGauss_w, Cpi, Cpi180, z0surf_min, & + veg_mask, jls_standalone, jls_radiation, & + SurfaceType, SoilType, & + LAI_pft_cbl, HGT_pft_cbl, SnowDepth, & + SnowDensity, SoilTemp, SnowAge, AlbSoil, & + coszen, VegXfang, VegTaul, VegRefl, & + HeightAboveSnow, reducedLAIdue2snow, & + ExtCoeff_beam, ExtCoeff_dif, EffExtCoeff_beam, & + EffExtCoeff_dif, CanopyTransmit_beam, & + CanopyTransmit_dif, CanopyRefl_beam, & + CanopyRefl_dif, c1, rhoch, xk, AlbSnow, RadFbeam, & + RadAlbedo, metDoY, SW_down ) + +! Description: +! Nothing further to add to module description. + +!subrs: +USE cbl_albedo_mod, ONLY: albedo +USE cbl_init_radiation_module, ONLY: init_radiation +USE cable_common_module, ONLY : cable_runtime +USE UM_ParCore, ONLY: mype + +IMPLICIT NONE + +!model dimensions +INTEGER, INTENT(IN) :: land_pts !# land points on x,y grid +INTEGER, INTENT(IN) :: mp ! total number of "tiles" (calc. in cable_land) +INTEGER, INTENT(IN) :: nrb ! # radiation bands[ 1=VIS,2=NIR,3=LW(legacy) + +! Albedos req'd by JULES - Effective Surface Relectance as seen by atmosphere +REAL, INTENT(OUT) :: EffSurfRefl_dif(mp,nrb) ! Refl to Diffuse component of rad + ! formerly rad%reffdf +REAL, INTENT(OUT) :: EffSurfRefl_beam(mp,nrb) ! Refl to Beam component of rad + ! formerly rad%reffbm + +!--- IN: CABLE specific surface_type indexes +INTEGER, INTENT(IN) :: ICE_SoilType +INTEGER, INTENT(IN) :: lakes_type + +!constants +REAL, INTENT(IN) :: Ccoszen_tols ! threshold cosine of sun's zenith angle, + ! below which considered SUNLIT +REAL, INTENT(IN) :: Cgauss_w(nrb) ! Gaussian integration weights +REAL, INTENT(IN) :: Clai_thresh ! The minimum LAI below which a "cell" is + ! considred NOT vegetated +REAL, INTENT(IN) :: Cpi ! PI +REAL, INTENT(IN) :: Cpi180 ! PI in radians +REAL, INTENT(IN) :: z0surf_min ! the minimum roughness of bare soil + +LOGICAL, INTENT(IN) :: jls_standalone ! local runtime switch for JULES(/UM) run +LOGICAL, INTENT(IN) :: jls_radiation ! local runtime switch for radiation path + +!masks +LOGICAL, INTENT(IN) :: veg_mask(:) ! vegetated (uses min LAI) + +!recieved as spatial maps from the UM. remapped to "mp" +REAL, INTENT(IN) :: LAI_pft_cbl(mp) ! LAI - "limited" and remapped +REAL, INTENT(IN) :: HGT_pft_cbl(mp) ! canopy height - "limited", remapped +REAL, INTENT(IN) :: coszen(mp) ! cosine zenith angle (met%coszen) +REAL, INTENT(IN) :: AlbSoil(mp, nrb) ! soil%AlbSoil + +!computed for CABLE model +REAL, INTENT(IN):: HeightAboveSnow(mp) ! Height of Canopy above snow + ! (rough%hruff) computed from + ! z0surf_min, HGT_pft_cbl, + ! SnowDepth, SnowDensity +REAL, INTENT(IN) :: reducedLAIdue2snow(mp) ! Reduced LAI given snow coverage + +!Prognostics !recieved as spatial maps from the UM. remapped to "mp" +REAL, INTENT(IN) :: SnowDepth(mp) ! Total Snow depth - water eqivalent - + ! packed from snow_surft (ssnow%snowd) + ! this timestep (ssnow%Osnowd) +REAL, INTENT(IN) :: SnowDensity(mp) ! Total Snow density (assumes 1 layer + ! describes snow cover) (ssnow%ssdnn) +REAL, INTENT(IN) :: SoilTemp(mp) ! Soil Temperature of top layer (soil%tgg) +REAL, INTENT(IN) :: SnowAge(mp) ! Snow age (assumes 1 layer describes snow + ! cover) (ssnow%snage) + +!Vegetation parameters !recieved as per PFT params from the UM. remapped to "mp" +INTEGER, INTENT(IN) :: SurfaceType(mp) +INTEGER, INTENT(IN) :: SoilType(mp) +REAL, INTENT(IN) :: VegXfang(mp) ! leaf angle PARAMETER (veg%xfang) +REAL, INTENT(IN) :: VegTaul(mp,nrb) ! PARAM leaf transmisivity (veg%taul) +REAL, INTENT(IN) :: VegRefl(mp,nrb) ! PARAM leaf reflectivity (veg%refl) + +!local to Rad/Albedo pathway: +REAL, INTENT(IN OUT) :: ExtCoeff_beam(mp) ! nee. rad%extkb, +REAL, INTENT(IN OUT) :: ExtCoeff_dif(mp) ! nee. rad%extkd +REAL, INTENT(IN OUT) :: EffExtCoeff_beam(mp, nrb) ! nee. rad%extkbm +REAL, INTENT(IN OUT) :: EffExtCoeff_dif(mp, nrb) ! nee. rad%extkdm, +REAL, INTENT(IN OUT) :: CanopyTransmit_dif(mp, nrb) ! nee. rad%cexpkdm +REAL, INTENT(IN OUT) :: CanopyTransmit_beam(mp, nrb) ! nee. rad%cexpkbm +REAL, INTENT(IN OUT) :: CanopyRefl_dif(mp, nrb) ! nee. rad%rhocdf +REAL, INTENT(IN OUT) :: CanopyRefl_beam(mp, nrb) ! nee. rad%rhocbm +REAL, INTENT(IN OUT) :: RadFbeam(mp, nrb) ! nee. rad%fbeam +REAL, INTENT(IN OUT) :: RadAlbedo(mp, nrb) ! nee. rad%albedo +REAL, INTENT(IN OUT) :: AlbSnow(mp, nrb) ! nee. ssnow%AlbSoilsn +REAL, INTENT(IN OUT) :: c1(mp, nrb) ! common rad scalings +REAL, INTENT(IN OUT) :: rhoch(mp, nrb) ! common rad scalings +REAL, INTENT(IN OUT) :: xk(mp, nrb) ! common rad scalings +! used in Calc of Beam calculation NOT on rad/albedo path. +! However Needed to fulfill arg list with dummy +INTEGER, INTENT(IN OUT) :: metDoY(mp) ! can pass DoY from current_time +REAL, INTENT(IN OUT) :: SW_down(mp, nrb) ! NA at surf_couple_rad layer + +CHARACTER(LEN=*), PARAMETER :: subr_name = "cable_rad_driver" +LOGICAL :: cbl_standalone = .FALSE. +LOGICAL, SAVE :: zero_points_warning = .true. + +IF( land_pts == 0 ) THEN + IF( zero_points_warning ) THEN + WRITE(6,*) "Reached CABLE ", subr_name, & + " even though zero land_points on processor ", mype + END IF + zero_points_warning = .FALSE. + RETURN +END IF + +cable_runtime%um = .TRUE. +cable_runtime%um_radiation = .TRUE. + +!Defines Extinction Coefficients to use in calculation of Canopy +!Reflectance/Transmitance. +CALL init_radiation( ExtCoeff_beam, ExtCoeff_dif, EffExtCoeff_beam, & + EffExtCoeff_dif, RadFbeam, c1, rhoch, xk, & + mp,nrb, Clai_thresh, Ccoszen_tols, CGauss_w, Cpi, Cpi180, & + cbl_standalone, jls_standalone, jls_radiation, subr_name, & + veg_mask, VegXfang, VegTaul, VegRefl, coszen, metDoY, & + SW_down, reducedLAIdue2snow ) + +!Finally call albedo to get what we really need to fulfill contract with JULES +!Defines 4-stream albedos [VIS/NIR bands. direct beam/diffuse components] from +!considering albedo of Ground (snow?) and Canopy Reflectance/Transmitance. +CALL Albedo( AlbSnow, AlbSoil, & + mp, nrb, ICE_SoilType, lakes_type, jls_radiation, veg_mask, & + Ccoszen_tols, cgauss_w, & + SurfaceType, SoilType ,VegRefl, VegTaul, & + coszen, reducedLAIdue2snow, & + SnowDepth, SnowDensity, SoilTemp, SnowAge, & + xk, c1, rhoch, & + RadFbeam, RadAlbedo, & + ExtCoeff_beam, ExtCoeff_dif, & + EffExtCoeff_beam, EffExtCoeff_dif, & + CanopyRefl_beam, CanopyRefl_dif, & + CanopyTransmit_beam, CanopyTransmit_dif, & + EffSurfRefl_beam, EffSurfRefl_dif) + +cable_runtime%um_radiation = .FALSE. +RETURN + +END SUBROUTINE cable_rad_driver + +END MODULE cable_rad_driv_mod + diff --git a/src/coupled/AM3/control/cable/interface/radiation/rad_unpack_cbl.F90 b/src/coupled/AM3/control/cable/interface/radiation/rad_unpack_cbl.F90 new file mode 100644 index 000000000..5bbe78c9b --- /dev/null +++ b/src/coupled/AM3/control/cable/interface/radiation/rad_unpack_cbl.F90 @@ -0,0 +1,137 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** +MODULE cable_rad_unpack_mod + +!----------------------------------------------------------------------------- +! Description: +! Unpack JULES variables into CABLE variables as needed for the +! radiation calculations. +! +! This MODULE is USEd in: +! cable_land_albedo_mod_cbl.F90 (JULES) +! +! This MODULE contains 1 public Subroutine: +! cable_rad_unpack +! +! Code owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!----------------------------------------------------------------------------- + +IMPLICIT NONE +PUBLIC :: cable_rad_unpack + +CONTAINS + +SUBROUTINE cable_rad_unpack( land_albedo, alb_surft, & + mp, nrs, row_length, rows, land_pts, & + nsurft, tile_pts, tile_index, & + land_index, tile_frac, L_tile_pts, & + EffSurfRefl_beam, EffSurfRefl_dif) + +! Description: +! Nothing further to add to module description. + +IMPLICIT NONE + +! Model(field) dimensions +INTEGER, INTENT(IN) :: mp !total number of "tiles" +INTEGER, INTENT(IN) :: nrs !# rad bands VIS,NIR. 3rd WAS LW +INTEGER, INTENT(IN) :: row_length !grid cell x +INTEGER, INTENT(IN) :: rows !grid cell y +INTEGER, INTENT(IN) :: land_pts !grid cell land points -x,y grid +INTEGER, INTENT(IN) :: nsurft !grid cell # surface types + +! Return Albedos CABLE to fulfill contract with JULES +REAL, INTENT(OUT) :: land_albedo(row_length,rows,nrs) +REAL, INTENT(OUT) :: alb_surft(land_pts,nsurft,nrs) + +! Inherited dimensions from JULES +INTEGER, INTENT(IN) :: tile_pts(nsurft) !Number of land points per PFT +INTEGER, INTENT(IN) :: land_index(land_pts) !land point Index in (x,y) array +INTEGER, INTENT(IN) :: tile_index(land_pts,nsurft) !Index of land point in (land_pts) array + +!recieved as spatial maps from the UM. +REAL, INTENT(IN) :: tile_frac(land_pts,nsurft) !fraction of each surface type per land point +LOGICAL, INTENT(IN) :: L_tile_pts( land_pts, nsurft ) !mask:=TRUE where tile_frac>0, else FALSE. pack mp according to this mask + +! Albedos +REAL, INTENT(IN) :: EffSurfRefl_beam(mp,nrs) !Effective Surface Relectance as seen by atmosphere [Direct Beam SW] (rad%reffbm) +REAL, INTENT(IN) :: EffSurfRefl_dif(mp,nrs) !Effective Surface Relectance as seen by atmosphere [Diffuse SW] (rad%reffdf) + +!___ local vars +INTEGER :: i,j,k,l,n +REAL :: miss = 0.0 + +! std template args +CHARACTER(LEN=*), PARAMETER :: subr_name = "cable_rad_unpack" +REAL :: Sumreffbm(mp) +REAL :: Sumreffdf(mp) + +! UNPACK Albedo (per rad stream) per surface tile +alb_surft(:,:,:) = 0.0 ! guarantee flushed +! Direct beam, visible / near-IR +alb_surft(:,:,1) = UNPACK(EffSurfRefl_beam(:,1),l_tile_pts, miss) +alb_surft(:,:,3) = UNPACK(EffSurfRefl_beam(:,2),l_tile_pts, miss) +! Diffuse, visible / near-IR +alb_surft(:,:,2) = UNPACK(EffSurfRefl_dif(:,1),l_tile_pts, miss) +alb_surft(:,:,4) = UNPACK(EffSurfRefl_dif(:,2),l_tile_pts, miss) + +! ERROR trap: Model stopped as albedo is unphysical +DO i = 1,land_pts + DO j = 1,nsurft + + IF ( alb_surft(i,j,1) > 1.0 .OR. alb_surft(i,j,1) < 0.0) THEN + WRITE(6,*) 'albedo(i,j,1) is unphysical ',alb_surft(i,j,1) + STOP 'CABLE ERROR' + ELSE IF ( alb_surft(i,j,2) > 1.0 .OR. alb_surft(i,j,2) < 0.0) THEN + WRITE(6,*) 'albedo(i,j,2) is unphysical ',alb_surft(i,j,2) + STOP 'CABLE ERROR' + ELSE IF ( alb_surft(i,j,3) > 1.0 .OR. alb_surft(i,j,3) < 0.0) THEN + WRITE(6,*) 'albedo(i,j,3) is unphysical ',alb_surft(i,j,3) + STOP 'CABLE ERROR' + ELSE IF ( alb_surft(i,j,4) > 1.0 .OR. alb_surft(i,j,4) < 0.0) THEN + WRITE(6,*) 'albedo(i,j,4) is unphysical ',alb_surft(i,j,4) + STOP 'CABLE ERROR' + END IF + + END DO +END DO + +! Aggregate albedo (per rad stream) OVER surface tiles to get per cell value +land_albedo(:,:,:) = 0.0 ! guarantee flushed +DO n = 1,nsurft + DO k = 1,tile_pts(n) + + l = tile_index(k,n) + j=(land_index(l) - 1) / row_length + 1 + i = land_index(l) - (j-1) * row_length + + ! Direct beam, visible + land_albedo(i,j,1) = land_albedo(i,j,1) + tile_frac(l,n) * ALB_surft(l,n,1) + ! Diffuse, visible + land_albedo(i,j,2) = land_albedo(i,j,2) + tile_frac(l,n) * ALB_surft(l,n,2) + ! Direct beam, nearinfrared + land_albedo(i,j,3) = land_albedo(i,j,3) + tile_frac(l,n) * ALB_surft(l,n,3) + ! Diffuse, nearinfrared + land_albedo(i,j,4) = land_albedo(i,j,4) + tile_frac(l,n) * ALB_surft(l,n,4) + + END DO +END DO + +RETURN + +END SUBROUTINE cable_rad_unpack + +END MODULE cable_rad_unpack_mod diff --git a/src/coupled/AM3/control/cable/shared/LAI_canopy_height_cbl.F90 b/src/coupled/AM3/control/cable/shared/LAI_canopy_height_cbl.F90 new file mode 100644 index 000000000..2d305c0ab --- /dev/null +++ b/src/coupled/AM3/control/cable/shared/LAI_canopy_height_cbl.F90 @@ -0,0 +1,100 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** +MODULE cbl_LAI_canopy_height_mod + +!----------------------------------------------------------------------------- +! Description: +! Restricts the range of canopy height and LAI inherited from JULES/UM +! spatial maps +! +! This MODULE is USEd by: +! cable_land_albedo_mod_cbl.F90 +! +! This MODULE contains 1 public Subroutine: +! limit_HGT_LAI +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!----------------------------------------------------------------------------- + +IMPLICIT NONE +PUBLIC :: limit_HGT_LAI +PRIVATE + +CONTAINS + +SUBROUTINE limit_HGT_LAI( LAI_pft_cbl, HGT_pft_cbl, mp, land_pts, ntiles, & + npft, tile_pts, tile_index, tile_frac,L_tile_pts, & + LAI_pft, HGT_pft, CLAI_thresh ) + +! Description: +! Nothing further to add to module description. + +IMPLICIT NONE +INTEGER, INTENT(IN) :: mp +REAL, INTENT(OUT) :: LAI_pft_cbl(mp) +REAL, INTENT(OUT) :: HGT_pft_cbl(mp) +INTEGER, INTENT(IN) :: land_pts, ntiles, npft +REAL, INTENT(IN) :: LAI_pft(land_pts, npft) +REAL, INTENT(IN) :: HGT_pft(land_pts, npft) +REAL, INTENT(IN):: tile_frac(land_pts,ntiles) +REAL, INTENT(IN) :: Clai_thresh !The minimum LAI below which a "cell" is considred NOT vegetated +INTEGER, INTENT(IN) :: tile_pts(ntiles) +INTEGER, INTENT(IN):: tile_index(land_pts,ntiles) +LOGICAL, INTENT(IN) :: L_tile_pts(land_pts,ntiles) + +!local vars +REAL :: HGT_pft_temp(land_pts,ntiles) ! needed to filter spatail map +REAL :: LAI_pft_temp(land_pts,ntiles) ! needed to filter spatail map + +INTEGER :: i,j, n + +! init everywhere, even where tile_frac=0 +LAI_pft_temp(:,:) = 0.0 +HGT_pft_temp(:,:) = 0.0 + +DO n=1,ntiles + DO j=1,tile_pts(n) + + i = tile_index(j,n) ! It must be landpt index + + IF ( tile_frac(i,n) > 0.0 ) THEN + + ! hard-wired vegetation type numbers need to be removed + ! LAI set either just below threshold OR from INput field + IF (n < 14) THEN + LAI_pft_temp(i,n) = MAX(CLAI_thresh*.99,LAI_pft(i,n)) + ENDIF + + ! sse. height + IF (n < 5 ) THEN + HGT_pft_temp(i,n) = MAX(1.0,HGT_pft(i,n)) ! trees + ELSE IF (n > 4 .AND. n < 14 ) THEN + HGT_pft_temp(i,n) = MAX(0.1, HGT_pft(i,n)) ! shrubs/grass + END IF + + END IF + + END DO +END DO + +! pack filtered JULE/UM maps to CABLE variables +LAI_pft_cbl = PACK(LAI_pft_temp, l_tile_pts) +HGT_pft_cbl = PACK(HGT_pft_temp, l_tile_pts) + +END SUBROUTINE limit_HGT_LAI + +END MODULE cbl_LAI_canopy_height_mod + diff --git a/src/coupled/AM3/control/cable/shared/cable_fields_mod.F90 b/src/coupled/AM3/control/cable/shared/cable_fields_mod.F90 new file mode 100644 index 000000000..323b211fd --- /dev/null +++ b/src/coupled/AM3/control/cable/shared/cable_fields_mod.F90 @@ -0,0 +1,61 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** + +MODULE cable_fields_mod + +!------------------------------------------------------------------------------ +! Description: +! Module containing instances of the data types for CABLE in jules standalone +! analagous to jules_fields_mod. This is the central place where ubiquitous +! fields are distributed and USEd from throughout the model are instantiated. +! Currently only prognostic fields are here but many more are on the way +! +! This MODULE is USEd by: +! surf_couple_radiation_mod.F90, +! jules.F90, +! init_soilin_cbl.inc, +! init_vegin_cbl.inc, +! populate_var.inc +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!------------------------------------------------------------------------------ + + +!type definitions +USE progs_cbl_vars_mod, ONLY: progs_cbl_vars_type, & + progs_cbl_vars_data_type +USE work_vars_mod_cbl, ONLY: work_vars_data_type, & + work_vars_type +!These are dimensionally in per PFT format +USE params_io_mod_cbl, ONLY: params_io_type, & + params_io_data_type + +PUBLIC + +!TYPES to hold the data +TYPE(progs_cbl_vars_data_type), TARGET :: progs_cbl_vars_data +TYPE(work_vars_data_type), TARGET :: work_vars_data_cbl +!These are dimensionally in per PFT format +TYPE(params_io_data_type), TARGET :: pars_io_data_cbl + +!TYPES we pass around. These happen to be pointers to the data types above +!but this should be transparent +TYPE(progs_cbl_vars_type) :: progs_cbl_vars +TYPE(work_vars_type) :: work_vars_cbl +!These are dimensionally in per PFT format +TYPE(params_io_type) :: pars_io_cbl + +END MODULE cable_fields_mod diff --git a/src/coupled/AM3/control/cable/shared/cable_model_env.F90 b/src/coupled/AM3/control/cable/shared/cable_model_env.F90 new file mode 100644 index 000000000..66b47fb43 --- /dev/null +++ b/src/coupled/AM3/control/cable/shared/cable_model_env.F90 @@ -0,0 +1,105 @@ +MODULE cable_model_env_mod + +USE cable_model_env_opts_mod, ONLY: icycle + +IMPLICIT NONE + +NAMELIST / cable_model_environment / & + icycle + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='CABLE_MODEL_ENV_MOD' + +CONTAINS + +SUBROUTINE set_derived_variables_cable_model_env + +USE cable_model_env_opts_mod, ONLY: l_casacnp + +IMPLICIT NONE + +IF( icycle == 1 ) THEN + l_casacnp = .TRUE. + WRITE(6,*) "CABLE-CASA-CNP configured for Carbon cycle" +ELSEIF( icycle == 2 ) THEN + l_casacnp = .TRUE. + WRITE(6,*) "CABLE-CASA-CNP configured for Carbon, Nitrogen cycle" +ELSEIF( icycle == 3 ) THEN + l_casacnp = .TRUE. + WRITE(6,*) "CABLE-CASA-CNP configured for Carbon, Nitrogen, Phosphorus cycle" +ELSE + l_casacnp = .FALSE. + WRITE(6,*) "CABLE-CASA-CNP configured for NO biogeochemical cycle" +ENDIF + +RETURN + +END SUBROUTINE set_derived_variables_cable_model_env + +SUBROUTINE read_nml_cable_model_env(unitnumber) + +! Description: +! Read the cable_model_env namelist + +USE setup_namelist, ONLY: setup_nml_type +USE check_iostat_mod, ONLY: check_iostat +USE UM_parcore, ONLY: mype +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook +USE errormessagelength_mod, ONLY: errormessagelength + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: unitnumber +INTEGER :: my_comm +INTEGER :: mpl_nml_type +INTEGER :: ErrorStatus +INTEGER :: icode +CHARACTER(LEN=errormessagelength) :: iomessage +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='READ_NML_CABLE_MODEL_ENV' +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 + +! set number of each type of variable in my_namelist type +INTEGER, PARAMETER :: no_of_types = 1 +INTEGER, PARAMETER :: n_int = 1 + +TYPE my_namelist + !!SEQUENCE + INTEGER :: icycle +END TYPE my_namelist + +TYPE (my_namelist) :: my_nml + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +CALL gc_get_communicator(my_comm, icode) + +CALL setup_nml_type(no_of_types, mpl_nml_type, n_int_in = n_int) + +IF (mype == 0) THEN + + READ (UNIT = unitnumber, NML = cable_model_environment, IOSTAT = errorstatus, & + IOMSG = iomessage) + CALL check_iostat(errorstatus, "namelist cable_model_environment",iomessage) + + my_nml % icycle = icycle +END IF + +CALL mpl_bcast(my_nml,1,mpl_nml_type,0,my_comm,icode) + +IF (mype /= 0) THEN + + icycle = my_nml % icycle + +END IF + +CALL mpl_type_free(mpl_nml_type,icode) + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE read_nml_cable_model_env + +END MODULE cable_model_env_mod + diff --git a/src/coupled/AM3/control/cable/shared/cable_surface_types_mod.F90 b/src/coupled/AM3/control/cable/shared/cable_surface_types_mod.F90 new file mode 100644 index 000000000..1c1f808c0 --- /dev/null +++ b/src/coupled/AM3/control/cable/shared/cable_surface_types_mod.F90 @@ -0,0 +1,377 @@ +! *****************************COPYRIGHT******************************* +! (C) Crown copyright Met Office. All rights reserved. +! For further details please refer to the file COPYRIGHT.txt +! which you should have received as part of this distribution. +! *****************************COPYRIGHT******************************* + +MODULE cable_surface_types_mod + +!----------------------------------------------------------------------------- +! Description: +! Contains CABLE surface type information and a namelist for setting them +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in TECHNICAL +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!----------------------------------------------------------------------------- + +USE max_dimensions, ONLY: & + elev_tile_max, & + ntype_max + +USE missing_data_mod, ONLY: imdi + +!----------------------------------------------------------------------------- +! Module variables. +!----------------------------------------------------------------------------- +USE jules_surface_types_mod, ONLY: & + nnpft, & + ncpft, & + npft, & + nnvg, & + ntype, & + urban, & + lake, & + soil, & + ice + +IMPLICIT NONE + +! Index of the various surface types used by CABLE" +INTEGER :: & + evergreen_needleleaf = imdi, & + evergreen_broadleaf = imdi, & + deciduous_needleleaf = imdi, & + deciduous_broadleaf = imdi, & + shrub_cable = imdi, & + c3_grassland = imdi, & + c4_grassland = imdi, & + tundra = imdi, & + c3_cropland = imdi, & + c4_cropland = imdi, & + wetland = imdi, & + empty1 = imdi, & + empty2 = imdi, & + barren_cable = imdi, & + urban_cable = imdi, & + lakes_cable = imdi, & + ice_cable = imdi + +!----------------------------------------------------------------------------- +! Single namelist definition for UM and standalone +!----------------------------------------------------------------------------- +NAMELIST / cable_surface_types/ & + npft, nnvg, & + evergreen_needleleaf, evergreen_broadleaf, deciduous_needleleaf, & + deciduous_broadleaf, shrub_cable, c3_grassland, c4_grassland, & + tundra, c3_cropland, c4_cropland, wetland, empty1, empty2, & + barren_cable, urban_cable, lakes_cable, ice_cable + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='CABLE_SURFACE_TYPES_MOD' + +CONTAINS + +SUBROUTINE check_surface_type_value ( surface_type, surface_type_name, & + min_value, max_value, RoutineName, errorstatus, nchecks ) + +USE jules_print_mgr, ONLY: jules_print + +IMPLICIT NONE + +INTEGER :: surface_type, min_value, max_value, errorstatus, nchecks +CHARACTER(LEN=*) :: surface_type_name, RoutineName + +IF ( surface_type > 0 ) THEN + nchecks = nchecks + 1 + IF ( surface_type < min_value .OR. surface_type > max_value ) THEN + errorstatus = 101 + CALL jules_print(RoutineName, & + TRIM(surface_type_name) // " tile is given but is out of range") + END IF +END IF + +END SUBROUTINE check_surface_type_value + +SUBROUTINE print_nlist_cable_surface_types() + +USE jules_print_mgr, ONLY: jules_print + +IMPLICIT NONE + +INTEGER :: i, n ! Loop counter + +CHARACTER(LEN=50000) :: lineBuffer + + +!----------------------------------------------------------------------------- +! This needs to be implemented corresponding to cable_surface_types +CALL jules_print('cable_surface_types', & + 'Contents of namelist cable_surface_types') + +!WRITE(lineBuffer, *) ' npft = ', npft +!CALL jules_print('cable_surface_types', lineBuffer) + +!IF ( brd_leaf > 0 ) THEN +! WRITE(lineBuffer, *) ' brd_leaf = ', brd_leaf +! CALL jules_print('cable_surface_types', lineBuffer) +!END IF + +!WRITE(lineBuffer, *) ' = ', +!CALL jules_print('cable_surface_types', lineBuffer) + +!IF ( > 0 ) THEN +! WRITE(lineBuffer, *) ' = ', +! CALL jules_print('cable_surface_types', lineBuffer) +!END IF + +CALL jules_print('cable_surface_types', & + '- - - - - - end of namelist - - - - - -') + +END SUBROUTINE print_nlist_cable_surface_types + + + +SUBROUTINE set_derived_variables_cable_surface_types() + +USE jules_print_mgr, ONLY: jules_print, jules_message + +IMPLICIT NONE + +!----------------------------------------------------------------------------- +! Derive ntype and nnpft from the namelist values +!----------------------------------------------------------------------------- +ntype = npft + nnvg +nnpft = npft - ncpft + +CALL jules_print('set_derived_variables_cable_surface_types', & + 'Derived variables from cable_surface_types') + +!WRITE(jules_message, *) ' ntype = ', ntype +!CALL jules_print('set_derived_variables_cable_surface_types', jules_message) +! +!WRITE(jules_message, *) ' nnpft = ', nnpft +!CALL jules_print('set_derived_variables_cable_surface_types', jules_message) + +CALL jules_print('set_derived_variables_cable_surface_types', & + '- - - - - - end of derived variables - - - - - -') + +RETURN + +END SUBROUTINE set_derived_variables_cable_surface_types + + + +SUBROUTINE check_cable_surface_types() + +USE max_dimensions, ONLY: npft_max, ncpft_max, nnvg_max + +USE ereport_mod, ONLY: ereport +USE jules_print_mgr, ONLY: jules_print, jules_message + +!----------------------------------------------------------------------------- +! Description: +! Checks cable_surface_types namelist for consistency +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in TECHNICAL +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!----------------------------------------------------------------------------- + +IMPLICIT NONE + +INTEGER :: i, nchecks ! Loop counter + +INTEGER :: errorstatus + +CHARACTER(LEN=*), PARAMETER :: & + RoutineName = 'CHECK_CABLE_SURFACE_TYPES' +!----------------------------------------------------------------------------- +! Check that the given values are less than the fixed values for IO +!----------------------------------------------------------------------------- +IF ( npft > npft_max ) THEN + errorstatus = 101 + CALL ereport(RoutineName, errorstatus, & + "npft > npft_max - increase npft_max and recompile") +END IF + +IF ( nnvg > nnvg_max ) THEN + errorstatus = 101 + CALL ereport(RoutineName, errorstatus, & + "nnvg > nnvg_max - increase nnvg_max and recompile") +END IF + +!----------------------------------------------------------------------------- +! Check values for the specific surface types are sensible +!----------------------------------------------------------------------------- +! PFTs +errorstatus = 0 +nchecks = 0 + +!!CALL check_surface_type_value ( brd_leaf, "brd_leaf", 1, npft, & +!! RoutineName, errorstatus, nchecks ) +!!CALL check_surface_type_value ( , "", 1, npft, & +!! RoutineName, errorstatus, nchecks ) +! +!! PFT surface types must come before non-veg types, so if urban, lake, soil, +!! ice, urban_canyon or urban_roof are given (i.e. > 0) then they must be > npft +!! A soil type is required +!!CALL check_surface_type_value ( urban, "urban", npft+1, ntype, & +!! RoutineName, errorstatus, nchecks ) +!!CALL check_surface_type_value ( , "", npft+1, ntype, & +!! RoutineName, errorstatus, nchecks ) + +!jhan:this will need to be properly implemented +nchecks = 17 +! Check that all present surface types have been checked for range compliance +! This check should also ensure that a check is added for each new surface type +IF ( nchecks /= ntype ) THEN + errorstatus = 101 + CALL jules_print(RoutineName, & + "At least one surface type in namelist does not have a range check.") + WRITE(jules_message,'(A,I0,A,I0)') & + "These should be the same; ntype = ", ntype, ", nchecks = ", nchecks + CALL jules_print(RoutineName, jules_message) +END IF + +! Now that all surface types have been checked issue abort if required +IF ( errorstatus > 0 ) THEN + CALL ereport(RoutineName, errorstatus, & + "Error(s) found. Please see job.out for information ") +END IF + +END SUBROUTINE check_cable_surface_types + +SUBROUTINE read_nml_cable_surface_types (unitnumber) + +! Description: +! Read the CABLE_SURFACE_TYPES namelist + +USE setup_namelist, ONLY: setup_nml_type +USE check_iostat_mod, ONLY: check_iostat +USE UM_parcore, ONLY: mype +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook +USE errormessagelength_mod, ONLY: errormessagelength + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: unitnumber +INTEGER :: my_comm +INTEGER :: mpl_nml_type +INTEGER :: ErrorStatus +INTEGER :: icode +CHARACTER(LEN=errormessagelength) :: iomessage +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='READ_NML_CABLE_SURFACE_TYPES' +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 + +! set number of each type of variable in my_namelist type +INTEGER, PARAMETER :: no_of_types = 1 +INTEGER, PARAMETER :: n_int = 19 !+ ntype_max + +TYPE my_namelist + !!SEQUENCE + INTEGER :: npft + INTEGER :: nnvg + INTEGER :: evergreen_needleleaf + INTEGER :: evergreen_broadleaf + INTEGER :: deciduous_needleleaf + INTEGER :: deciduous_broadleaf + INTEGER :: shrub_cable + INTEGER :: c3_grassland + INTEGER :: c4_grassland + INTEGER :: tundra + INTEGER :: c3_cropland + INTEGER :: c4_cropland + INTEGER :: wetland + INTEGER :: empty1 + INTEGER :: empty2 + INTEGER :: barren_cable + INTEGER :: urban_cable + INTEGER :: lakes_cable + INTEGER :: ice_cable + !INTEGER :: tile_map_ids(ntype_max) +END TYPE my_namelist + +TYPE (my_namelist) :: my_nml + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +CALL gc_get_communicator(my_comm, icode) + +CALL setup_nml_type(no_of_types, mpl_nml_type, n_int_in = n_int) + +IF (mype == 0) THEN + + READ (UNIT = unitnumber, NML = cable_surface_types, IOSTAT = errorstatus, & + IOMSG = iomessage) + CALL check_iostat(errorstatus, "namelist cable_surface_types",iomessage) + + my_nml % npft = npft + my_nml % nnvg = nnvg + my_nml % evergreen_needleleaf = evergreen_needleleaf + my_nml % evergreen_broadleaf = evergreen_broadleaf + my_nml % deciduous_needleleaf = deciduous_needleleaf + my_nml % deciduous_broadleaf = deciduous_broadleaf + my_nml % shrub_cable = shrub_cable + my_nml % c3_grassland = c3_grassland + my_nml % c4_grassland = c4_grassland + my_nml % tundra = tundra + my_nml % c3_cropland = c3_cropland + my_nml % c4_cropland = c4_cropland + my_nml % wetland = wetland + my_nml % empty1 = empty1 + my_nml % empty2 = empty2 + my_nml % barren_cable = barren_cable + my_nml % urban_cable = urban_cable + my_nml % lakes_cable = lakes_cable + my_nml % ice_cable = ice_cable + +END IF + +CALL mpl_bcast(my_nml,1,mpl_nml_type,0,my_comm,icode) + +IF (mype /= 0) THEN + + npft = my_nml % npft + nnvg = my_nml % nnvg + evergreen_needleleaf = my_nml % evergreen_needleleaf + evergreen_broadleaf = my_nml % evergreen_broadleaf + deciduous_needleleaf = my_nml % deciduous_needleleaf + deciduous_broadleaf = my_nml % deciduous_broadleaf + shrub_cable = my_nml % shrub_cable + c3_grassland = my_nml % c3_grassland + c4_grassland = my_nml % c4_grassland + tundra = my_nml % tundra + c3_cropland = my_nml % c3_cropland + c4_cropland = my_nml % c4_cropland + wetland = my_nml % wetland + empty1 = my_nml % empty1 + empty2 = my_nml % empty2 + barren_cable = my_nml %barren_cable + urban_cable = my_nml % urban_cable + lakes_cable = my_nml % lakes_cable + ice_cable = my_nml % ice_cable + +END IF + +CALL mpl_type_free(mpl_nml_type,icode) + +soil = barren_cable +ice = ice_cable +lake = lakes_cable +urban = urban_cable + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE read_nml_cable_surface_types + +END MODULE cable_surface_types_mod diff --git a/src/coupled/AM3/control/cable/shared/land_tile_ids_mod_cbl.F90 b/src/coupled/AM3/control/cable/shared/land_tile_ids_mod_cbl.F90 new file mode 100644 index 000000000..7d9f0f80d --- /dev/null +++ b/src/coupled/AM3/control/cable/shared/land_tile_ids_mod_cbl.F90 @@ -0,0 +1,121 @@ +! *****************************COPYRIGHT******************************* +! (C) Crown copyright Met Office. All rights reserved. +! For further details please refer to the file COPYRIGHT.txt +! which you should have received as part of this distribution. +! *****************************COPYRIGHT******************************* +! +! Module setting Tile ID numbers, which are used to identify which land +! surface tiles are present. + +! Code Description: +! Language: FORTRAN 90 +! This code is written to UMDP3 v8.2 programming standards. + +MODULE land_tile_ids_mod_cbl + +USE max_dimensions, ONLY: & + ntype_max, & + snow_layers_max, & + elev_tile_max + +USE missing_data_mod, ONLY: imdi + +IMPLICIT NONE + +!----------------------------------------------------------------------- + +INTEGER, PRIVATE :: i ! Loop counter + +INTEGER :: surface_type_ids(ntype_max) = imdi + ! Array which maps pseudo levels to tile types + +INTEGER :: ml_snow_type_ids(ntype_max * snow_layers_max) = imdi + ! Array which maps pseudo levels to tile types + +INTEGER :: tile_ids_in(ntype_max * snow_layers_max) = imdi + ! Tile IDs in the input header + +CONTAINS + +SUBROUTINE set_surface_type_ids_cbl( ) +USE ereport_mod, ONLY: ereport + +USE jules_print_mgr, ONLY: & + jules_message, & + jules_print, & + jules_format + +USE errormessagelength_mod, ONLY: errormessagelength + +USE cable_surface_types_mod, ONLY: & + ntype, & + evergreen_needleleaf, & + evergreen_broadleaf, & + deciduous_needleleaf, & + deciduous_broadleaf, & + shrub_cable, & + c3_grassland, & + c4_grassland, & + tundra, & + c3_cropland, & + c4_cropland, & + wetland, & + empty1, & + empty2, & + barren_cable, & + urban_cable, & + lakes_cable, & + ice_cable + +IMPLICIT NONE + +INTEGER :: i ! Loop counter +INTEGER :: errorstatus +CHARACTER(LEN=18), PARAMETER :: routinename='set_tile_id_arrays' + +!There is presently no other option for CABLE surface type indexing +surface_type_ids( evergreen_needleleaf ) = 1 +surface_type_ids( evergreen_broadleaf ) = 2 +surface_type_ids( deciduous_needleleaf ) = 3 +surface_type_ids( deciduous_broadleaf ) = 4 +surface_type_ids( shrub_cable ) = 5 +surface_type_ids( c3_grassland ) = 6 +surface_type_ids( c4_grassland ) = 7 +surface_type_ids( tundra ) = 8 +surface_type_ids( c3_cropland ) = 9 +surface_type_ids( c4_cropland ) = 10 +surface_type_ids( wetland ) = 11 +surface_type_ids( empty1 ) = 12 +surface_type_ids( empty2 ) = 13 +surface_type_ids( barren_cable ) = 14 +surface_type_ids( urban_cable ) = 15 +surface_type_ids( lakes_cable ) = 16 +surface_type_ids( ice_cable ) = 17 + +! Print the surface types that are present +WRITE(jules_format,'(a3,i3,a8)') '(a,',ntype,'(1x,i6))' +WRITE(jules_message,jules_format) ' Surface types present =', & + surface_type_ids(1:ntype) +CALL jules_print(routinename, jules_message) + +! Check that all surface types have been specified +IF ( ANY( surface_type_ids(1:ntype) == imdi ) ) THEN + errorstatus = 30 + WRITE(jules_message, '(A,I6)') & + ' All surface types need to be specified. Please see job.out.' + CALL ereport ( routinename, errorstatus, jules_message ) +END IF + +! Check that tile IDs are unique +DO i = 1, ntype + IF ( COUNT( surface_type_ids(:) == surface_type_ids(i) ) /= 1 ) THEN + errorstatus = 30 + WRITE(jules_message, '(A,I6)') & + ' Surface type ID not unique :', surface_type_ids(i) + CALL ereport ( routinename, errorstatus, jules_message ) + END IF +END DO + +END SUBROUTINE set_surface_type_ids_cbl + +END MODULE land_tile_ids_mod_cbl diff --git a/src/coupled/AM3/control/cable/shared/params_io_cbl.F90 b/src/coupled/AM3/control/cable/shared/params_io_cbl.F90 new file mode 100644 index 000000000..68e206a4f --- /dev/null +++ b/src/coupled/AM3/control/cable/shared/params_io_cbl.F90 @@ -0,0 +1,355 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** +MODULE params_io_mod_cbl + +!----------------------------------------------------------------------------- +! Description: +! Defines variable types and variables for veg and soil parameters. +! We only define the pointer associations relevant to TYPES to be parssed +! around (following JULES params*_io). The allocation is unecessary as these +! input parameters are read in from namelist (following JULES params *_io), +! these are initialized in corresponding section +! Based on cable_def_types_mod.F90 from the CABLE trunk. +! +! This MODULE is USEd by: +! cable_fields_mod.F90, +! init_vegin_cbl.inc +! +! This MODULE contains 2 public Subroutines: +! params_io_assoc_cbl, +! params_io_nullify_cbl +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!----------------------------------------------------------------------------- + +USE grid_constants_mod_cbl, ONLY: & + ntype_max, & ! # veg types [13],non-veg=4,ntiles=17 + nsoil_max, & ! # of soil types [9] + nrb, & ! # spectral bANDS VIS/NIR/(LW-not used) + nsl, & ! # soil layers + nscs, & ! # soil carbon stores + nvcs ! # vegetation carbon stores + +PUBLIC :: params_io_data_type +PUBLIC :: params_io_type +PUBLIC :: params_io_assoc_cbl + +PRIVATE +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='PARAMS_IO_MOD_CBL' + +! Vegetation/Soil parameters I/O: +TYPE :: params_io_data_type + + ! Veg parameters I/O: + REAL :: & + vegin_canst1(ntype_max), & + vegin_dleaf(ntype_max), & + vegin_length(ntype_max), & + vegin_width(ntype_max), & + vegin_vcmax(ntype_max), & + vegin_ejmax(ntype_max), & + vegin_hc(ntype_max), & + vegin_xfang(ntype_max), & + vegin_rp20(ntype_max), & + vegin_rpcoef(ntype_max), & + vegin_rs20(ntype_max), & + vegin_wai(ntype_max), & + vegin_rootbeta(ntype_max), & + vegin_shelrb(ntype_max), & + vegin_vegcf(ntype_max), & + vegin_frac4(ntype_max), & + vegin_xalbnir(ntype_max), & + vegin_extkn(ntype_max), & + vegin_tminvj(ntype_max), & + vegin_tmaxvj(ntype_max), & + vegin_vbeta(ntype_max), & + vegin_a1gs(ntype_max), & + vegin_d0gs(ntype_max), & + vegin_alpha(ntype_max), & + vegin_convex(ntype_max), & + vegin_cfrd(ntype_max), & + vegin_gswmin(ntype_max), & + vegin_conkc0(ntype_max), & + vegin_conko0(ntype_max), & + vegin_ekc(ntype_max), & + vegin_eko(ntype_max), & + vegin_g0(ntype_max), & + vegin_g1(ntype_max), & + vegin_zr(ntype_max), & + vegin_clitt(ntype_max), & + vegin_froot(nsl,ntype_max), & + vegin_csoil(nscs,ntype_max), & + vegin_ratecs(nscs,ntype_max), & + vegin_cplant(nvcs,ntype_max), & + vegin_ratecp(nvcs,ntype_max), & + vegin_refl(nrb,ntype_max), & + vegin_taul(nrb,ntype_max) + + ! Soil parameters I/O: + REAL :: & + soilin_silt(nsoil_max), & + soilin_clay(nsoil_max), & + soilin_sand(nsoil_max), & + soilin_swilt(nsoil_max), & + soilin_sfc(nsoil_max), & + soilin_ssat(nsoil_max), & + soilin_bch(nsoil_max), & + soilin_hyds(nsoil_max), & + soilin_sucs(nsoil_max), & + soilin_rhosoil(nsoil_max), & + soilin_css(nsoil_max) + +END TYPE params_io_data_type + +TYPE :: params_io_type + + ! Veg parameters I/O: + REAL, POINTER, PUBLIC :: & + vegin_canst1(:), & + vegin_dleaf(:), & + vegin_length(:), & + vegin_width(:), & + vegin_vcmax(:), & + vegin_ejmax(:), & + vegin_hc(:), & + vegin_xfang(:), & + vegin_rp20(:), & + vegin_rpcoef(:), & + vegin_rs20(:), & + vegin_wai(:), & + vegin_rootbeta(:), & + vegin_shelrb(:), & + vegin_vegcf(:), & + vegin_frac4(:), & + vegin_xalbnir(:), & + vegin_extkn(:), & + vegin_tminvj(:), & + vegin_tmaxvj(:), & + vegin_vbeta(:), & + vegin_a1gs(:), & + vegin_d0gs(:), & + vegin_alpha(:), & + vegin_convex(:), & + vegin_cfrd(:), & + vegin_gswmin(:), & + vegin_conkc0(:), & + vegin_conko0(:), & + vegin_ekc(:), & + vegin_eko(:), & + vegin_g0(:), & + vegin_g1(:), & + vegin_zr(:), & + vegin_clitt(:), & + vegin_froot(:,:), & + vegin_csoil(:,:), & + vegin_ratecs(:,:), & + vegin_cplant(:,:), & + vegin_ratecp(:,:), & + vegin_refl(:,:), & + vegin_taul(:,:) + + ! Soil parameters I/O: + REAL, POINTER, PUBLIC :: & + soilin_silt(:), & + soilin_clay(:), & + soilin_sand(:), & + soilin_swilt(:), & + soilin_sfc(:), & + soilin_ssat(:), & + soilin_bch(:), & + soilin_hyds(:), & + soilin_sucs(:), & + soilin_rhosoil(:), & + soilin_css(:) + +END TYPE params_io_type + +CONTAINS +!============================================================================== +SUBROUTINE params_io_assoc_cbl(pars_io, pars_io_data) + +! Description: +! Associate veg. and soil parameters pointer types + + !No USE statements other than Dr Hook +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook + +IMPLICIT NONE + +!Arguments +TYPE(params_io_type), INTENT(IN OUT) :: pars_io +TYPE(params_io_data_type), INTENT(IN OUT), TARGET :: pars_io_data +!local:needed by dr_hook +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle +CHARACTER(LEN=*), PARAMETER :: RoutineName='PARAMS_IO_ASSOC_CBL' +!End of header + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +CALL params_io_nullify_cbl(pars_io) + +! Veg parameters I/O: +pars_io % vegin_canst1 => pars_io_data % vegin_canst1 +pars_io % vegin_dleaf => pars_io_data % vegin_dleaf +pars_io % vegin_length => pars_io_data % vegin_length +pars_io % vegin_width => pars_io_data % vegin_width +pars_io % vegin_vcmax => pars_io_data % vegin_vcmax +pars_io % vegin_ejmax => pars_io_data % vegin_ejmax +pars_io % vegin_hc => pars_io_data % vegin_hc +pars_io % vegin_xfang => pars_io_data % vegin_xfang +pars_io % vegin_rp20 => pars_io_data % vegin_rp20 +pars_io % vegin_rpcoef => pars_io_data % vegin_rpcoef +pars_io % vegin_rs20 => pars_io_data % vegin_rs20 +pars_io % vegin_wai => pars_io_data % vegin_wai +pars_io % vegin_rootbeta => pars_io_data % vegin_rootbeta +pars_io % vegin_shelrb => pars_io_data % vegin_shelrb +pars_io % vegin_vegcf => pars_io_data % vegin_vegcf +pars_io % vegin_frac4 => pars_io_data % vegin_frac4 +pars_io % vegin_xalbnir => pars_io_data % vegin_xalbnir +pars_io % vegin_extkn => pars_io_data % vegin_extkn +pars_io % vegin_tminvj => pars_io_data % vegin_tminvj +pars_io % vegin_tmaxvj => pars_io_data % vegin_tmaxvj +pars_io % vegin_vbeta => pars_io_data % vegin_vbeta +pars_io % vegin_a1gs => pars_io_data % vegin_a1gs +pars_io % vegin_d0gs => pars_io_data % vegin_d0gs +pars_io % vegin_alpha => pars_io_data % vegin_alpha +pars_io % vegin_convex => pars_io_data % vegin_convex +pars_io % vegin_cfrd => pars_io_data % vegin_cfrd +pars_io % vegin_gswmin => pars_io_data % vegin_gswmin +pars_io % vegin_conkc0 => pars_io_data % vegin_conkc0 +pars_io % vegin_conko0 => pars_io_data % vegin_conko0 +pars_io % vegin_ekc => pars_io_data % vegin_ekc +pars_io % vegin_eko => pars_io_data % vegin_eko +pars_io % vegin_g0 => pars_io_data % vegin_g0 +pars_io % vegin_g1 => pars_io_data % vegin_g1 +pars_io % vegin_zr => pars_io_data % vegin_zr +pars_io % vegin_clitt => pars_io_data % vegin_clitt +pars_io % vegin_froot => pars_io_data % vegin_froot +pars_io % vegin_csoil => pars_io_data % vegin_csoil +pars_io % vegin_ratecs => pars_io_data % vegin_ratecs +pars_io % vegin_cplant => pars_io_data % vegin_cplant +pars_io % vegin_ratecp => pars_io_data % vegin_ratecp +pars_io % vegin_refl => pars_io_data % vegin_refl +pars_io % vegin_taul => pars_io_data % vegin_taul + +! Soil params_io_type % parameters I/O: +pars_io % soilin_silt => pars_io_data % soilin_silt +pars_io % soilin_clay => pars_io_data % soilin_clay +pars_io % soilin_sand => pars_io_data % soilin_sand +pars_io % soilin_swilt => pars_io_data % soilin_swilt +pars_io % soilin_sfc => pars_io_data % soilin_sfc +pars_io % soilin_ssat => pars_io_data % soilin_ssat +pars_io % soilin_bch => pars_io_data % soilin_bch +pars_io % soilin_hyds => pars_io_data % soilin_hyds +pars_io % soilin_sucs => pars_io_data % soilin_sucs +pars_io % soilin_rhosoil => pars_io_data % soilin_rhosoil +pars_io % soilin_css => pars_io_data % soilin_css + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) + +RETURN +END SUBROUTINE params_io_assoc_cbl + +SUBROUTINE params_io_nullify_cbl(pars_io) + +! Description: +! Nullify veg. and soil parameters pointer types + +!No USE statements other than Dr Hook +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook + +IMPLICIT NONE + +!Arguments +TYPE(params_io_type), INTENT(IN OUT) :: pars_io +!local:needed by dr_hook +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle +CHARACTER(LEN=*), PARAMETER :: RoutineName='PARAMS_IO_NULLIFY_CBL' +!End of header + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +! Veg parameters I/O: +NULLIFY( pars_io%vegin_canst1 ) +NULLIFY( pars_io%vegin_dleaf ) +NULLIFY( pars_io%vegin_length ) +NULLIFY( pars_io%vegin_width ) +NULLIFY( pars_io%vegin_vcmax ) +NULLIFY( pars_io%vegin_ejmax ) +NULLIFY( pars_io%vegin_hc ) +NULLIFY( pars_io%vegin_xfang ) +NULLIFY( pars_io%vegin_rp20 ) +NULLIFY( pars_io%vegin_rpcoef ) +NULLIFY( pars_io%vegin_rs20 ) +NULLIFY( pars_io%vegin_wai ) +NULLIFY( pars_io%vegin_rootbeta ) +NULLIFY( pars_io%vegin_shelrb ) +NULLIFY( pars_io%vegin_vegcf ) +NULLIFY( pars_io%vegin_frac4 ) +NULLIFY( pars_io%vegin_xalbnir ) +NULLIFY( pars_io%vegin_extkn ) +NULLIFY( pars_io%vegin_tminvj ) +NULLIFY( pars_io%vegin_tmaxvj ) +NULLIFY( pars_io%vegin_vbeta ) +NULLIFY( pars_io%vegin_a1gs ) +NULLIFY( pars_io%vegin_d0gs ) +NULLIFY( pars_io%vegin_alpha ) +NULLIFY( pars_io%vegin_convex ) +NULLIFY( pars_io%vegin_cfrd ) +NULLIFY( pars_io%vegin_gswmin ) +NULLIFY( pars_io%vegin_conkc0 ) +NULLIFY( pars_io%vegin_conko0 ) +NULLIFY( pars_io%vegin_ekc ) +NULLIFY( pars_io%vegin_eko ) +NULLIFY( pars_io%vegin_g0 ) +NULLIFY( pars_io%vegin_g1 ) +NULLIFY( pars_io%vegin_zr ) +NULLIFY( pars_io%vegin_clitt ) +NULLIFY( pars_io%vegin_froot ) +NULLIFY( pars_io%vegin_csoil ) +NULLIFY( pars_io%vegin_ratecs ) +NULLIFY( pars_io%vegin_cplant ) +NULLIFY( pars_io%vegin_ratecp ) +NULLIFY( pars_io%vegin_refl ) +NULLIFY( pars_io%vegin_taul ) + +! Soil parameters I/O: +NULLIFY( pars_io%soilin_silt ) +NULLIFY( pars_io%soilin_clay ) +NULLIFY( pars_io%soilin_sand ) +NULLIFY( pars_io%soilin_swilt ) +NULLIFY( pars_io%soilin_sfc ) +NULLIFY( pars_io%soilin_ssat ) +NULLIFY( pars_io%soilin_bch ) +NULLIFY( pars_io%soilin_hyds ) +NULLIFY( pars_io%soilin_sucs ) +NULLIFY( pars_io%soilin_rhosoil ) +NULLIFY( pars_io%soilin_css ) + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) + +RETURN +END SUBROUTINE params_io_nullify_cbl + +END MODULE params_io_mod_cbl + + diff --git a/src/coupled/AM3/control/cable/shared/progs_cbl_vars_mod.F90 b/src/coupled/AM3/control/cable/shared/progs_cbl_vars_mod.F90 new file mode 100644 index 000000000..2dcd3f7d3 --- /dev/null +++ b/src/coupled/AM3/control/cable/shared/progs_cbl_vars_mod.F90 @@ -0,0 +1,386 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** +MODULE progs_cbl_vars_mod + +!------------------------------------------------------------------------------ +! Description: +! Declares/(de)allocates/assigns CABLE prognostic variables +! +! This MODULE is USEd by: +! cable_fields_mod.F90, +! surf_couple_explicit_mod.F90, +! surf_couple_implicit_mod.F90, +! surf_couple_radiation_mod.F90, +! control.F90, +! init_cable_progs.F90, +! init.F90 +! +! This MODULE contains 4 public Subroutines: +! progs_cbl_vars_alloc, +! progs_cbl_vars_dealloc, +! progs_cbl_vars_assoc, +! progs_cbl_vars_nullify +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!------------------------------------------------------------------------------ + +IMPLICIT NONE + +PUBLIC :: progs_cbl_vars_alloc +PUBLIC :: progs_cbl_vars_assoc +PUBLIC :: progs_cbl_vars_data_type +PUBLIC :: progs_cbl_vars_type +PRIVATE + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='PROGS_CBL_VARS_MOD' +! Tiled soil prognostics to be initialized from IO +TYPE :: progs_cbl_vars_data_type + + REAL, ALLOCATABLE, PUBLIC :: & + SoilTemp_CABLE(:,:,:), & + SoilMoisture_CABLE(:,:,:), & + FrozenSoilFrac_CABLE(:,:,:), & + SnowDepth_CABLE(:,:,:), & + SnowMass_CABLE(:,:,:), & + SnowTemp_CABLE(:,:,:), & + SnowDensity_CABLE(:,:,:), & + ThreeLayerSnowFlag_CABLE(:,:), & + OneLyrSnowDensity_CABLE(:,:), & + SnowAge_CABLE(:,:), & + snowOsurft(:,:) + +END TYPE progs_cbl_vars_data_type + +TYPE :: progs_cbl_vars_type + + REAL, POINTER, PUBLIC :: & + SoilTemp_CABLE(:,:,:), & + SoilMoisture_CABLE(:,:,:), & + FrozenSoilFrac_CABLE(:,:,:), & + SnowDepth_CABLE(:,:,:), & + SnowMass_CABLE(:,:,:), & + SnowTemp_CABLE(:,:,:), & + SnowDensity_CABLE(:,:,:), & + ThreeLayerSnowFlag_CABLE(:,:), & + OneLyrSnowDensity_CABLE(:,:), & + SnowAge_CABLE(:,:), & + snowOsurft(:,:) +END TYPE progs_cbl_vars_type + +CONTAINS + +!=============================================================================== +SUBROUTINE progs_cbl_vars_alloc(land_pts, nsurft, sm_levels, lsm_id, cable, & + progs_cbl_vars_data ) + +! Description: +! Allocate the CABLE prognostic data variables in the derived type structure + +!Replacements for the argument list +USE grid_constants_mod_cbl, ONLY: nsnl + +!Common Non-science modules +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook +USE jules_print_mgr, ONLY: jules_message, jules_print, PrNorm +USE ereport_mod, ONLY: ereport + +IMPLICIT NONE + +!Arguments +INTEGER, INTENT(IN) :: land_pts, nsurft,sm_levels +INTEGER, INTENT(IN) :: lsm_id, cable + +TYPE(progs_cbl_vars_data_type), INTENT(IN OUT) :: progs_cbl_vars_data + +!----------------------------------------------------------------------- +! Local variables for error trapping +!----------------------------------------------------------------------- +INTEGER :: & + ERROR = 0, & + ! Variable for trapping the error from each + ! individual call to allocate + error_sum = 0, & + + ! Variable to track the sum of all errors + ! resulting from calls to allocate. Hence we + ! know that everything was successful if and + ! only if this is zero at the end + errcode + ! Variable to use in error report + +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='PROGS_CBL_VARS_ALLOC' + +!End of header + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +! CABLE vars to be initialized via JULES i/o +IF ( lsm_id == cable ) THEN + + ALLOCATE( progs_cbl_vars_data%SoilTemp_CABLE(land_pts, nsurft, sm_levels), & + STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%SoilMoisture_CABLE(land_pts, nsurft, & + sm_levels), STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%FrozenSoilFrac_CABLE(land_pts, nsurft, & + sm_levels), STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%SnowDepth_CABLE(land_pts, nsurft, nsnl), & + STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%SnowMass_CABLE(land_pts,nsurft, nsnl), & + STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%SnowTemp_CABLE(land_pts, nsurft, nsnl), & + STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%SnowDensity_CABLE(land_pts,nsurft,nsnl), & + STAT = ERROR) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%ThreeLayerSnowFlag_CABLE(land_pts,nsurft), & + STAT = ERROR) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%OneLyrSnowDensity_CABLE(land_pts,nsurft), & + STAT = ERROR) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%SnowAge_CABLE(land_pts, nsurft), & + STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%snowOsurft(land_pts, nsurft), STAT = ERROR ) + error_sum = error_sum + ERROR + + !----------------------------------------------------------------------- + ! Write out an error if there was one + !----------------------------------------------------------------------- + IF ( error_sum /= 0 ) & + CALL ereport(RoutineName, errcode, & + "Error allocating CABLE prognostic array") + +ELSE + + ALLOCATE( progs_cbl_vars_data%SoilTemp_CABLE(1, 1, 1), STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%SoilMoisture_CABLE(1, 1, 1), STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%FrozenSoilFrac_CABLE(1, 1, 1), STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%SnowDepth_CABLE(1, 1, 1), STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%SnowMass_CABLE(1,1, 1),STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%SnowTemp_CABLE(1, 1, 1), STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%SnowDensity_CABLE(1,1,1),STAT = ERROR) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%ThreeLayerSnowFlag_CABLE(1,1),STAT = ERROR) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%OneLyrSnowDensity_CABLE(1,1),STAT = ERROR) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%SnowAge_CABLE(1, 1), STAT = ERROR ) + error_sum = error_sum + ERROR + + ALLOCATE( progs_cbl_vars_data%snowOsurft(1, 1), STAT = ERROR ) + error_sum = error_sum + ERROR + + !----------------------------------------------------------------------- + ! Write out an error if there was one + !----------------------------------------------------------------------- + IF ( error_sum /= 0 ) & + CALL ereport(RoutineName, errcode, & + "Error allocating CABLE prognostic array") + +END IF + +progs_cbl_vars_data%SoilTemp_CABLE(:,:,:) = 0.0 +progs_cbl_vars_data%SoilMoisture_CABLE(:,:,:) = 0.0 +progs_cbl_vars_data%FrozenSoilFrac_CABLE(:,:,:) = 0.0 +progs_cbl_vars_data%SnowDepth_CABLE(:,:,:) = 0.0 +progs_cbl_vars_data%SnowMass_CABLE(:,:,:) = 0.0 +progs_cbl_vars_data%SnowTemp_CABLE(:,:,:) = 0.0 +progs_cbl_vars_data%SnowDensity_CABLE(:,:,:) = 0.0 +progs_cbl_vars_data%SnowAge_CABLE(:,:) = 0.0 +progs_cbl_vars_data%snowOsurft(:,:) = 0.0 +progs_cbl_vars_data%ThreeLayerSnowFlag_CABLE(:,:) = 0.0 +progs_cbl_vars_data%OneLyrSnowDensity_CABLE(:,:) = 0.0 + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE progs_cbl_vars_alloc + +!=============================================================================== +SUBROUTINE progs_cbl_vars_dealloc(progs_cbl_vars_data ) + +! Description: +! Deallocate the CABLE prognostic data variables in the derived type structure + + !Common Non-science modules +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook + +IMPLICIT NONE + +!Arguments +TYPE(progs_cbl_vars_data_type), INTENT(IN OUT) :: progs_cbl_vars_data + +!----------------------------------------------------------------------- +! Local variables +!----------------------------------------------------------------------- +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='PROGS_CBL_VARS_DEALLOC' + +!End of header + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + + +! CABLE vars to be initialized via JULES i/o +DEALLOCATE( progs_cbl_vars_data%snowOsurft) +DEALLOCATE( progs_cbl_vars_data%SnowAge_CABLE) +DEALLOCATE( progs_cbl_vars_data%OneLyrSnowDensity_CABLE) +DEALLOCATE( progs_cbl_vars_data%ThreeLayerSnowFlag_CABLE) +DEALLOCATE( progs_cbl_vars_data%SnowDensity_CABLE) +DEALLOCATE( progs_cbl_vars_data%SnowTemp_CABLE) +DEALLOCATE( progs_cbl_vars_data%SnowMass_CABLE) +DEALLOCATE( progs_cbl_vars_data%SnowDepth_CABLE) +DEALLOCATE( progs_cbl_vars_data%FrozenSoilFrac_CABLE) +DEALLOCATE( progs_cbl_vars_data%SoilMoisture_CABLE) +DEALLOCATE( progs_cbl_vars_data%SoilTemp_CABLE) + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE progs_cbl_vars_dealloc + +!=============================================================================== +SUBROUTINE progs_cbl_vars_assoc(progs_cbl_vars, progs_cbl_vars_data ) + +! Description: +! Associate the CABLE prognostic pointers in the derived type structure + +!No USE statements other than Dr Hook +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook + +IMPLICIT NONE + +!Arguments +TYPE(progs_cbl_vars_type), INTENT(IN OUT) :: progs_cbl_vars +TYPE(progs_cbl_vars_data_type), INTENT(IN OUT), TARGET :: progs_cbl_vars_data + +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='PROGS_CBL_VARS_ASSOC' + +!End of header + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +CALL progs_cbl_vars_nullify(progs_cbl_vars) + +progs_cbl_vars%SoilTemp_CABLE => progs_cbl_vars_data%SoilTemp_CABLE +progs_cbl_vars%SoilMoisture_CABLE => & + progs_cbl_vars_data%SoilMoisture_CABLE +progs_cbl_vars%FrozenSoilFrac_CABLE => & + progs_cbl_vars_data%FrozenSoilFrac_CABLE +progs_cbl_vars%SnowDepth_CABLE => progs_cbl_vars_data%SnowDepth_CABLE +progs_cbl_vars%SnowMass_CABLE => progs_cbl_vars_data%SnowMass_CABLE +progs_cbl_vars%SnowTemp_CABLE => progs_cbl_vars_data%SnowTemp_CABLE +progs_cbl_vars%SnowDensity_CABLE => & + progs_cbl_vars_data%SnowDensity_CABLE +progs_cbl_vars%SnowAge_CABLE => progs_cbl_vars_data%SnowAge_CABLE +progs_cbl_vars%snowOsurft => progs_cbl_vars_data%snowOsurft +progs_cbl_vars%ThreeLayerSnowFlag_CABLE => & + progs_cbl_vars_data%ThreeLayerSnowFlag_CABLE +progs_cbl_vars%OneLyrSnowDensity_CABLE => & + progs_cbl_vars_data%OneLyrSnowDensity_CABLE + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE progs_cbl_vars_assoc + +!=============================================================================== +SUBROUTINE progs_cbl_vars_nullify(progs_cbl_vars) + +! Description: +! Nullify the CABLE prognostic pointers in the derived type structure + + !No USE statements other than Dr Hook +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook + +IMPLICIT NONE + +!Arguments +TYPE(progs_cbl_vars_type), INTENT(IN OUT) :: progs_cbl_vars + +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='PROGS_CBL_VARS_NULLIFY' + +!End of header + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +NULLIFY(progs_cbl_vars%SoilTemp_CABLE) +NULLIFY(progs_cbl_vars%SoilMoisture_CABLE) +NULLIFY(progs_cbl_vars%FrozenSoilFrac_CABLE) +NULLIFY(progs_cbl_vars%SnowDepth_CABLE) +NULLIFY(progs_cbl_vars%SnowMass_CABLE) +NULLIFY(progs_cbl_vars%SnowTemp_CABLE) +NULLIFY(progs_cbl_vars%SnowDensity_CABLE) +NULLIFY(progs_cbl_vars%SnowAge_CABLE) +NULLIFY(progs_cbl_vars%snowOsurft) +NULLIFY(progs_cbl_vars%ThreeLayerSnowFlag_CABLE) +NULLIFY(progs_cbl_vars%OneLyrSnowDensity_CABLE) + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN + +END SUBROUTINE progs_cbl_vars_nullify + +END MODULE progs_cbl_vars_mod + diff --git a/src/coupled/AM3/control/cable/shared/work_vars_mod_cbl.F90 b/src/coupled/AM3/control/cable/shared/work_vars_mod_cbl.F90 new file mode 100644 index 000000000..c342950ee --- /dev/null +++ b/src/coupled/AM3/control/cable/shared/work_vars_mod_cbl.F90 @@ -0,0 +1,361 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** +MODULE work_vars_mod_cbl + +!------------------------------------------------------------------------------ +! Description: +! Declares/(de)allocates/assigns CABLE "working" variables +! These are vars reqested to be kept across the surf_couple* pathways +! and/or timesteps. Some will be elevated to prognostics, others will be +! removed via rewriting of the algorithm where requested +! +! This MODULE is USEd by: +! cable_fields_mod.F90, +! surf_couple_explicit_mod.F90, +! surf_couple_extra_mod.F90, +! surf_couple_implicit_mod.F90, +! control.F90, +! init_cable_working_vars.F90, +! init.F90 +! +! This MODULE contains 4 public Subroutines: +! alloc_work_vars_cbl, +! dealloc_work_vars_cbl, +! assoc_work_vars_cbl, +! nullify_assoc_work_vars_cbl +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!------------------------------------------------------------------------------ + +USE cable_canopy_type_mod, ONLY: canopy_type +USE cable_canopy_type_mod, ONLY: canopy_data_type +USE cable_air_type_mod, ONLY: air_type +USE cable_air_type_mod, ONLY: air_data_type +USE cable_met_type_mod, ONLY: met_type +USE cable_met_type_mod, ONLY: met_data_type +USE cable_balances_type_mod, ONLY: balances_type +USE cable_balances_type_mod, ONLY: balances_data_type +USE cable_soil_type_mod, ONLY: soil_type +USE cable_soil_type_mod, ONLY: soil_data_type +USE cable_veg_type_mod, ONLY: veg_type +USE cable_veg_type_mod, ONLY: veg_data_type +USE cable_soil_snow_type_mod, ONLY: soil_snow_type +USE cable_soil_snow_type_mod, ONLY: soil_snow_data_type +USE cable_radiation_type_mod, ONLY: radiation_type +USE cable_radiation_type_mod, ONLY: radiation_data_type +USE cable_roughness_type_mod, ONLY: roughness_type +USE cable_roughness_type_mod, ONLY: roughness_data_type +USE cable_climate_type_mod, ONLY: climate_type +USE cable_climate_type_mod, ONLY: climate_data_type +USE cable_bgc_pool_type_mod, ONLY: bgc_pool_type +USE cable_bgc_pool_type_mod, ONLY: bgc_pool_data_type +USE cable_sum_flux_type_mod, ONLY: sum_flux_type +USE cable_sum_flux_type_mod, ONLY: sum_flux_data_type + +IMPLICIT NONE + +PUBLIC :: alloc_work_vars_cbl +PUBLIC :: assoc_work_vars_cbl +PUBLIC :: work_vars_data_type +PUBLIC :: work_vars_type +PRIVATE + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='WORK_VARS_MOD_CBL' + +TYPE :: work_vars_data_type + + !fields returned @ hydrology (surf_couple_extra) level of JULES + !computed in CABLE @ implicit (surf_couple_implicit) level + REAL, ALLOCATABLE, PUBLIC :: snow_surft(:,:) + REAL, ALLOCATABLE, PUBLIC :: lying_snow(:) + REAL, ALLOCATABLE, PUBLIC :: surf_roff(:) + REAL, ALLOCATABLE, PUBLIC :: sub_surf_roff(:) + REAL, ALLOCATABLE, PUBLIC :: tot_tfall(:) + REAL, ALLOCATABLE, PUBLIC :: sw_down_ij(:,:,:) + REAL, ALLOCATABLE, PUBLIC :: reducedLAIdue2snow(:) +!check dims +REAL, ALLOCATABLE, PUBLIC :: tot_wb_lake(:) + +END TYPE work_vars_data_type + +TYPE :: work_vars_type + + !fields returned @ hydrology (surf_couple_extra) level of JULES + !computed in CABLE @ implicit (surf_couple_implicit) level + REAL, POINTER, PUBLIC :: snow_surft(:,:) + REAL, POINTER, PUBLIC :: lying_snow(:) + REAL, POINTER, PUBLIC :: surf_roff(:) + REAL, POINTER, PUBLIC :: sub_surf_roff(:) + REAL, POINTER, PUBLIC :: tot_tfall(:) + REAL, POINTER, PUBLIC :: sw_down_ij(:,:,:) + REAL, POINTER, PUBLIC :: reducedLAIdue2snow(:) + + TYPE(canopy_type) :: canopy + TYPE(air_type) :: air + TYPE(met_type) :: met + TYPE(balances_type) :: bal + TYPE(soil_type) :: soil + TYPE(veg_type) :: veg + TYPE(soil_snow_type) :: ssnow + TYPE(radiation_type) :: rad + TYPE(roughness_type) :: rough + TYPE(climate_type) :: climate + TYPE(bgc_pool_type) :: bgc + TYPE(sum_flux_type) :: sum_flux + +END TYPE work_vars_type + +! data arrays need to be declared outside of the work% TYPE +TYPE(canopy_data_type), PUBLIC, TARGET :: canopy_data +TYPE(air_data_type), PUBLIC, TARGET :: air_data +TYPE(met_data_type), PUBLIC, TARGET :: met_data +TYPE(balances_data_type), PUBLIC, TARGET :: bal_data +TYPE(veg_data_type), PUBLIC, TARGET :: veg_data +TYPE(soil_data_type), PUBLIC, TARGET :: soil_data +TYPE(soil_snow_data_type), PUBLIC, TARGET :: soil_snow_data +TYPE(radiation_data_type), PUBLIC, TARGET :: rad_data +TYPE(roughness_data_type), PUBLIC, TARGET :: rough_data +TYPE(climate_data_type), PUBLIC, TARGET :: climate_data +TYPE(bgc_pool_data_type), PUBLIC, TARGET :: bgc_data +TYPE(sum_flux_data_type), PUBLIC, TARGET :: sum_flux_data + +CONTAINS + +!=============================================================================== +SUBROUTINE alloc_work_vars_cbl( row_length, rows, land_pts, nsurft, sm_levels, & + lsm_id, cable, work_data_cbl ) + +! Description: +! Allocate the CABLE work data variables in the derived type structure + +!Replacements for the argument list +USE grid_constants_mod_cbl, ONLY: nsnl + +!Common Non-science modules +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook +USE jules_print_mgr, ONLY: jules_message, jules_print, PrNorm +USE ereport_mod, ONLY: ereport + +IMPLICIT NONE + +!Arguments +INTEGER, INTENT(IN) :: row_length, rows +INTEGER, INTENT(IN) :: land_pts, nsurft,sm_levels +INTEGER, INTENT(IN) :: lsm_id, cable + +TYPE(work_vars_data_type), INTENT(IN OUT) :: work_data_cbl + +!----------------------------------------------------------------------- +! Local variables for error trapping +!----------------------------------------------------------------------- +INTEGER :: & + ERROR = 0, & + ! Variable for trapping the error from each + ! individual call to allocate + error_sum = 0, & + + ! Variable to track the sum of all errors + ! resulting from calls to allocate. Hence we + ! know that everything was successful if and + ! only if this is zero at the end + errcode + ! Variable to use in error report + +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='ALLOC_WORK_VARS_CBL' + +!End of header + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +! CABLE vars to be initialized +IF ( lsm_id == cable ) THEN + + ALLOCATE( work_data_cbl%snow_surft(land_pts, nsurft), STAT = ERROR ) + ALLOCATE( work_data_cbl%lying_snow(land_pts), STAT = ERROR ) + ALLOCATE( work_data_cbl%surf_roff(land_pts), STAT = ERROR ) + ALLOCATE( work_data_cbl%tot_tfall(land_pts), STAT = ERROR ) + ALLOCATE( work_data_cbl%sub_surf_roff(land_pts), STAT = ERROR ) + !CM3 + ALLOCATE( work_data_cbl%sw_down_ij(row_length, rows,4), STAT = ERROR ) + ALLOCATE( work_data_cbl%reducedLAIdue2snow(land_pts * nsurft), STAT = ERROR ) + !mp=sum(surft_pts) would do it + error_sum = error_sum + ERROR + + !----------------------------------------------------------------------- + ! Write out an error if there was one + !----------------------------------------------------------------------- + IF ( error_sum /= 0 ) & + CALL ereport(RoutineName, errcode, & + "Error allocating CABLE work type") + +ELSE + + ALLOCATE( work_data_cbl%snow_surft(1,1), STAT = ERROR ) + ALLOCATE( work_data_cbl%lying_snow(1), STAT = ERROR ) + ALLOCATE( work_data_cbl%surf_roff(1), STAT = ERROR ) + ALLOCATE( work_data_cbl%tot_tfall(1), STAT = ERROR ) + ALLOCATE( work_data_cbl%sub_surf_roff(1), STAT = ERROR ) + !CM3 + ALLOCATE( work_data_cbl%sw_down_ij(1,1,1), STAT = ERROR ) + error_sum = error_sum + ERROR + + !----------------------------------------------------------------------- + ! Write out an error if there was one + !----------------------------------------------------------------------- + IF ( error_sum /= 0 ) & + CALL ereport(RoutineName, errcode, & + "Error allocating CABLE work type") + +END IF + +work_data_cbl% snow_surft (:,:) = 0.0 +work_data_cbl% lying_snow (:) = 0.0 +work_data_cbl% surf_roff (:) = 0.0 +work_data_cbl% sub_surf_roff (:) = 0.0 +work_data_cbl% tot_tfall (:) = 0.0 +work_data_cbl% sw_down_ij(:,:,:) = 0.0 +work_data_cbl%reducedLAIdue2snow(:) = 0.0 + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE alloc_work_vars_cbl + +!=============================================================================== +SUBROUTINE dealloc_work_vars_cbl(work_data_cbl ) + +! Description: +! Deallocate the CABLE work data variables in the derived type structure + +!Common Non-science modules +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook + +IMPLICIT NONE + +!Arguments +TYPE(work_vars_data_type), INTENT(IN OUT) :: work_data_cbl + +!----------------------------------------------------------------------- +! Local variables +!----------------------------------------------------------------------- +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='DEALLOC_WORK_VARS_CBL' + +!End of header + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +! CABLE vars to be initialized via JULES i/o +DEALLOCATE( work_data_cbl %snow_surft ) +DEALLOCATE( work_data_cbl %lying_snow ) +DEALLOCATE( work_data_cbl %surf_roff ) +DEALLOCATE( work_data_cbl %sub_surf_roff ) +DEALLOCATE( work_data_cbl %tot_tfall ) +DEALLOCATE( work_data_cbl %sw_down_ij ) + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE dealloc_work_vars_cbl + +!=============================================================================== +SUBROUTINE assoc_work_vars_cbl(work_cbl, work_data_cbl ) + +! Description: +! Associate the CABLE work pointers in the derived type structure + +!No USE statements other than Dr Hook +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook + +IMPLICIT NONE + +!Arguments +TYPE(work_vars_type), INTENT(IN OUT) :: work_cbl +TYPE(work_vars_data_type), INTENT(IN OUT), TARGET :: work_data_cbl + +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='ASSOC_WORK_VARS_CBL' + +!End of header + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +CALL nullify_assoc_work_vars_cbl(work_cbl) + +work_cbl% snow_surft => work_data_cbl% snow_surft +work_cbl% lying_snow => work_data_cbl% lying_snow +work_cbl% surf_roff => work_data_cbl% surf_roff +work_cbl% sub_surf_roff => work_data_cbl% sub_surf_roff +work_cbl% tot_tfall => work_data_cbl% tot_tfall +work_cbl% sw_down_ij => work_data_cbl% sw_down_ij +work_cbl% reducedLAIdue2snow => work_data_cbl% reducedLAIdue2snow + + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN +END SUBROUTINE assoc_work_vars_cbl + +!=============================================================================== +SUBROUTINE nullify_assoc_work_vars_cbl(work_cbl) + +! Description: +! Nullify the CABLE work pointers in the derived type structure + + !No USE statements other than Dr Hook +USE parkind1, ONLY: jprb, jpim +USE yomhook, ONLY: lhook, dr_hook + +IMPLICIT NONE + +!Arguments +TYPE(work_vars_type), INTENT(IN OUT) :: work_cbl + +INTEGER(KIND=jpim), PARAMETER :: zhook_in = 0 +INTEGER(KIND=jpim), PARAMETER :: zhook_out = 1 +REAL(KIND=jprb) :: zhook_handle + +CHARACTER(LEN=*), PARAMETER :: RoutineName='NULLIFY_ASSOC_WORK_VARS_CBL' + +!End of header + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_in,zhook_handle) + +NULLIFY( work_cbl% snow_surft ) +NULLIFY( work_cbl% lying_snow ) +NULLIFY( work_cbl% surf_roff ) +NULLIFY( work_cbl% sub_surf_roff ) +NULLIFY( work_cbl% tot_tfall ) +NULLIFY( work_cbl% sw_down_ij ) +NULLIFY( work_cbl% reducedLAIdue2snow ) + +IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) +RETURN + +END SUBROUTINE nullify_assoc_work_vars_cbl + +END MODULE work_vars_mod_cbl + diff --git a/src/coupled/AM3/control/cable/util/activeTile_mask_cbl.F90 b/src/coupled/AM3/control/cable/util/activeTile_mask_cbl.F90 new file mode 100644 index 000000000..f294bf6a0 --- /dev/null +++ b/src/coupled/AM3/control/cable/util/activeTile_mask_cbl.F90 @@ -0,0 +1,100 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** + +MODULE init_active_tile_mask_mod + +!------------------------------------------------------------------------------ +! Description: +! Initialises the JULES/CABLE grid array, which aligns JULES grid points +! with CABLE land points +! +! This MODULE is USEd by: +! cable_land_albedo_mod.F90 +! +! This MODULE contains 1 public Subroutine: +! init_active_tile_mask_cbl +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!------------------------------------------------------------------------------ + +IMPLICIT NONE +PUBLIC :: cable_mp +PUBLIC :: init_active_tile_mask_cbl +PRIVATE + +CONTAINS + +SUBROUTINE cable_mp(mp, land_pts, nsurft, tile_frac ) + +! Description: +! Nothing further to add to module description. + +IMPLICIT NONE + +INTEGER, INTENT(OUT) :: mp +INTEGER, INTENT(IN) :: land_pts, nsurft +REAL, INTENT(IN) :: tile_frac(land_pts,nsurft) !fraction of each surf type + +!Local vars: +INTEGER :: i, j, k + +k=0 +DO j = 1, nsurft + DO i = 1, land_pts + IF ( tile_frac(i,j) > 0.0 ) THEN + k = k + 1 + END IF + END DO +END DO +mp = k + +RETURN + +END SUBROUTINE cable_mp + + +SUBROUTINE init_active_tile_mask_cbl(l_tile_pts, land_pts, nsurft, tile_frac ) + +! Description: +! Nothing further to add to module description. + +IMPLICIT NONE + +LOGICAL, INTENT(OUT), ALLOCATABLE :: L_tile_pts(:,:) +INTEGER, INTENT(IN) :: land_pts, nsurft +REAL, INTENT(IN) :: tile_frac(land_pts,nsurft) !fraction of each surf type + +!Local vars: +INTEGER :: i, j + +! Determine active tiles map +IF ( .NOT. ALLOCATED(l_tile_pts)) ALLOCATE( l_tile_pts(land_pts, nsurft) ) + +l_tile_pts(:,:) = .FALSE. + +DO j = 1, nsurft + DO i = 1, land_pts + IF ( tile_frac(i,j) > 0.0 ) THEN + l_tile_pts(i,j) = .TRUE. + END IF + END DO +END DO + +RETURN + +END SUBROUTINE init_active_tile_mask_cbl + +END MODULE init_active_tile_mask_mod diff --git a/src/coupled/AM3/control/cable/util/cable_jules_links_mod.F90 b/src/coupled/AM3/control/cable/util/cable_jules_links_mod.F90 new file mode 100644 index 000000000..d45b9fd67 --- /dev/null +++ b/src/coupled/AM3/control/cable/util/cable_jules_links_mod.F90 @@ -0,0 +1,196 @@ +!============================================================================== +! This source code is part of the +! Australian Community Atmosphere Biosphere Land Exchange (CABLE) model. +! This work is licensed under the CSIRO Open Source Software License +! Agreement (variation of the BSD / MIT License). +! +! You may not use this file except in compliance with this License. +! A copy of the License (CSIRO_BSD_MIT_License_v2.0_CABLE.txt) is located +! in each directory containing CABLE code. +! +! ============================================================================== +! Purpose: Reorders JULES and Unified Model tiled parameters to an order +! appropriate for CABLE and ACCESS-CM2 +! +! assumes input from JULES/UM is on 17 tiles with order: +! (1) dec broadlf, (2) evgn broadlf tropics, (3) evgn broadlf temp, +! (4) dec needlelf, (5) evgn needlelf, (6) grass c3, (7)crop c3, +! (8) pasture c3, (9) grass c4, (10) crop c4, (11) pasture c4, +! (12) dec shrub, (13) evgn shrub, (14) urban, (15) lakes, +! (16) baresoil, (17) permanent ice +! +! mapping at time of writing is: +! +! CABLE egnneedle tile 1 -> ndl_leaf_eg tile 5 JULES +! egnbroad 2 -> brd_leaf_evg_ 0.5*(2+3) [special case] +! decneedle 3 -> ndl_leaf_dec 4 +! decbroad 4 -> brd_leaf_dec 1 +! shrub 5 -> shrub_dec/evg 12 or 13 +! grass c3 6 -> c3_grass 6 +! grass c4 7 -> c4_grass 9 +! tundra 8 -> c3_grass 6 or evg shrub 13 +! crop c3 9 -> c3_crop 7 +! crop_c4 10 -> c4_crop 10 +! wetland 11 -> lake 15 or c3 grass 6 or c4 grass 9 +! empty 12 -> c3_grass 6 +! empty 13 -> c3_grass 6 +! bare soil 14 -> soil 16 +! urban 15 -> urban 14 +! lakes 16 -> lakes 15 +! ice 17 -> ice 17 +! +! CABLE shrub map largely coincides with JULES tile 12 map +! CABLE tundra map largely conincides with JULES tile 13 map +! +! integer switch shrub permits CABLE shrub to take another value +! +! integer switch tundra permits CABLE tundra to take another value +! +! integer switch wetland13/17 permits CABLE wetlands to take another value e.g. +! lake (15), c3 grass (6) or c4 grass (9) (ideally it depends on the process) +! note cannot take a lake value if only veg pfts are available. +! +! Future development needed to permit external/namelist prescription of the +! integer switches for shrub, tundra, wetland13/17 +! +! Called from: ukca routines surfddr, ddepaer & ddepaer_inc_sedi +! +! 2024-04-22 Edits for 27 tile configuration of CABLE +! As of coding - we will assume the current 17 tile ordering applies for tiles +! 1:13 of the 27 tile configuration, with the 4 non-veg tiles appended into +! tiles 24:27. The additional tiles are filled with bare soil values. +! +! The current hard-wired ordering is retained in all other aspects. +! +! =============================================================================== + +MODULE cable_jules_links_mod + + IMPLICIT NONE + + PUBLIC tile_resort_1D, tile_resort_2D + PRIVATE tile_order + +CONTAINS + SUBROUTINE tile_order(ntiles,t_sort) + !sets new order of tiles + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: ntiles !number of tiles - should be 4, 13 or 17 + INTEGER, DIMENSION(ntiles), INTENT(OUT) :: t_sort + + INTEGER :: shrub !switch to specify shrub tile values + INTEGER :: tundra !switch to specify tundra tile values + INTEGER :: wetland13 !switch to specify wetland tile values + INTEGER :: wetland17 !switch to specify wetland tile values + + !edit shrub, tundra and wetland mapping - other tile mapping is hard-wired + shrub = 12 !to be 12 (default) or 13 + tundra = 13 !to be 6, 12 or 13 (default) + wetland13 = 6 !to be 6 (default for 13 tiles) or 9 + wetland17 = 15 !to be 6, 9 or 15 (default for 13 tiles) + + !set the tile order ----------------------------------------------------- + IF (ntiles == 27) THEN !all tiles 27 tile version (CM3) + t_sort = (/5,2,4,1,shrub,6,9,tundra,7,10,wetland17,6,6, & + 16,16,16,16,16,16,16,16,16,16, 16,14,15,17/) + + ELSEIF (ntiles == 17) THEN !all tiles 17 tile version (CM2) + t_sort = (/5,2,4,1,shrub,6,9,tundra,7,10,wetland17,6,6,16,14,15,17/) + + ELSEIF (ntiles == 13) THEN !veg tiles only (17 or 27 tiles) + t_sort = (/5,2,4,1,shrub,6,9,tundra,7,10,wetland13,6,6/) + + ELSEIF (ntiles == 4) THEN !non-veg tiles only + t_sort = (/3,1,2,4/) + + ELSE + !error message + t_sort(:) = MAX(1,MIN(ntiles-1,6)) !catch all as c3 grass, bare soil + ENDIF + + RETURN + END SUBROUTINE + + SUBROUTINE tile_resort_2D(ntiles, nvar, t_params) + !2D array case + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: ntiles !number of tiles - should be 13 or 17 + INTEGER, INTENT(IN) :: nvar !number of variables in array to sort + + REAL, DIMENSION(ntiles,nvar), INTENT (INOUT) :: t_params + !variable array to resort + + INTEGER :: i !looping variable + INTEGER, DIMENSION(:), ALLOCATABLE :: t_sort + !ordering of tiles + REAL, DIMENSION(:,:), ALLOCATABLE :: t_params_new + !resorted variable array + !END header + ALLOCATE(t_sort(ntiles)) + ALLOCATE(t_params_new(ntiles,nvar)) + + !set the tile order ----------------------------------------------------- + CALL tile_order(ntiles, t_sort) + + !reorder ---------------------------------------------------------------- + + DO i = 1,ntiles + t_params_new(i,:) = t_params(t_sort(i),:) + !special cases + IF ((ntiles==13) .or. (ntiles==17) .or. (ntiles==27)) THEN + t_params_new(2,:) = 0.5*(t_params(2,:)+t_params(3,:)) + END IF + END DO + t_params(:,:) = t_params_new(:,:) + + DEALLOCATE(t_sort,t_params_new) + + RETURN + + END SUBROUTINE tile_resort_2D + + SUBROUTINE tile_resort_1D(ntiles, t_params) + !1D array case + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: ntiles !number of tiles - should be 13 or 17 + + REAL, DIMENSION(ntiles), INTENT (INOUT) :: t_params + !variable array to resort + + !working variables + INTEGER :: i !looping variable + INTEGER, DIMENSION(:), ALLOCATABLE :: t_sort + !ordering of tiles + REAL, DIMENSION(:), ALLOCATABLE :: t_params_new + !resorted variable array + !END header + ALLOCATE(t_sort(ntiles)) + ALLOCATE(t_params_new(ntiles)) + + !set the tile order ----------------------------------------------------- + CALL tile_order(ntiles, t_sort) + + !reordering ------------------------------------------------------------- + DO i = 1,ntiles + t_params_new(i) = t_params(t_sort(i)) + !special cases + IF ((ntiles==13) .or. (ntiles==17) .or. (ntiles==27)) THEN + t_params_new(2) = 0.5*(t_params(2)+t_params(3)) + END IF + END DO + t_params(:) = t_params_new(:) + + DEALLOCATE(t_sort,t_params_new) + + RETURN + + END SUBROUTINE tile_resort_1D +END MODULE + + \ No newline at end of file diff --git a/src/coupled/AM3/control/cable/util/cable_model_env_opts.F90 b/src/coupled/AM3/control/cable/util/cable_model_env_opts.F90 new file mode 100644 index 000000000..64eb45b96 --- /dev/null +++ b/src/coupled/AM3/control/cable/util/cable_model_env_opts.F90 @@ -0,0 +1,12 @@ +MODULE cable_model_env_opts_mod + +USE missing_data_mod, ONLY: imdi + +IMPLICIT NONE + +INTEGER :: icycle = imdi +LOGICAL :: l_casacnp = .FALSE. + +END MODULE cable_model_env_opts_mod + + diff --git a/src/coupled/AM3/control/cable/util/init/cable_um_init_bgc.F90 b/src/coupled/AM3/control/cable/util/init/cable_um_init_bgc.F90 new file mode 100644 index 000000000..88256659c --- /dev/null +++ b/src/coupled/AM3/control/cable/util/init/cable_um_init_bgc.F90 @@ -0,0 +1,35 @@ +MODULE cable_um_init_bgc_mod + +IMPLICIT NONE +PUBLIC init_bgc_vars + +CONTAINS + +SUBROUTINE init_bgc_vars( pars, bgc, veg ) +USE cable_def_types_mod, ONLY : ncs, ncp +USE cable_def_types_mod, ONLY: bgc_pool_type, veg_parameter_type +USE params_io_mod_cbl, ONLY: params_io_data_type +IMPLICIT NONE +TYPE(params_io_data_type), INTENT(IN) :: pars +TYPE(veg_parameter_type), INTENT(IN) :: veg ! vegetation parameters +TYPE(bgc_pool_type), INTENT(OUT) :: bgc + +INTEGER :: k + +! note that ratecp and ratecs are the same for all veg at the moment. (BP) +DO k=1,ncp + bgc%cplant(:,k) = pars%vegin_cplant(k,veg%iveg) + bgc%ratecp(k) = pars%vegin_ratecp(k,1) +ENDDO +DO k=1,ncs + bgc%csoil(:,k) = pars%vegin_csoil(k,veg%iveg) + bgc%ratecs(k) = pars%vegin_ratecs(k,1) +ENDDO + +END SUBROUTINE init_bgc_vars + +END MODULE cable_um_init_bgc_mod + + + + diff --git a/src/coupled/AM3/control/cable/util/init/cable_um_init_respiration.F90 b/src/coupled/AM3/control/cable/util/init/cable_um_init_respiration.F90 new file mode 100644 index 000000000..78b2f843c --- /dev/null +++ b/src/coupled/AM3/control/cable/util/init/cable_um_init_respiration.F90 @@ -0,0 +1,44 @@ +MODULE cable_um_init_respiration_mod + +IMPLICIT NONE +PUBLIC init_respiration + +CONTAINS + +SUBROUTINE init_respiration( land_pts, ntiles, npft, l_tilepts, & + npp_pft_acc, resp_w_pft_acc, canopy ) +USE cable_def_types_mod, ONLY: canopy_type + +INTEGER, INTENT(IN) :: land_pts ! # land points being processed +INTEGER, INTENT(IN) :: ntiles ! # tiles +INTEGER, INTENT(IN) :: npft ! # plant functional types +LOGICAL, INTENT(IN) :: L_tilepts(land_pts, ntiles) ! TRUE if active tile +TYPE(canopy_type), INTENT(OUT) :: canopy +REAL, INTENT(IN) :: npp_pft_acc(land_pts, npft) +REAL, INTENT(IN) :: resp_w_pft_acc(land_pts, npft) + +REAL :: fnpp_pft_acc(land_pts, ntiles) +REAL :: fresp_w_pft_acc(land_pts, ntiles) + +! make ntile versions of npp_pft_acc/resp_w_pft_acc +fnpp_pft_acc(:,1:ntiles) = 0.0 +fresp_w_pft_acc(:,1:ntiles) = 0.0 +fnpp_pft_acc(:,1:npft) = npp_pft_acc(:,1:npft) +fresp_w_pft_acc(:,1:npft) = resp_w_pft_acc(:,1:npft) + +!---set soil & plant respiration (now in dim(land_pts,ntiles)) +canopy%frs = PACK(fnpp_pft_acc , l_tilepts) +canopy%frp = PACK(fresp_w_pft_acc, l_tilepts) + +!---convert units to g C m-2 s-1 +canopy%frs = canopy%frs * 1000. +canopy%frp = canopy%frp * 1000. + +RETURN +END SUBROUTINE init_respiration + +END MODULE cable_um_init_respiration_mod + + + + diff --git a/src/coupled/AM3/control/cable/util/init/cable_um_init_sumflux.F90 b/src/coupled/AM3/control/cable/util/init/cable_um_init_sumflux.F90 new file mode 100644 index 000000000..3eb1f681f --- /dev/null +++ b/src/coupled/AM3/control/cable/util/init/cable_um_init_sumflux.F90 @@ -0,0 +1,35 @@ +MODULE cable_um_init_sumflux_mod + +IMPLICIT NONE +PUBLIC init_sumflux_zero + +CONTAINS + +SUBROUTINE init_sumflux_zero( sum_flux ) + +USE cable_def_types_mod, ONLY: sum_flux_type + +IMPLICIT NONE + +TYPE(sum_flux_type), INTENT(OUT) :: sum_flux + +sum_flux%sumpn = 0.0 +sum_flux%sumrp = 0.0 +sum_flux%sumrpw = 0.0 +sum_flux%sumrpr = 0.0 +sum_flux%sumrs = 0.0 +sum_flux%sumrd = 0.0 +sum_flux%dsumpn = 0.0 +sum_flux%dsumrp = 0.0 +sum_flux%dsumrs = 0.0 +sum_flux%dsumrd = 0.0 +sum_flux%sumxrp = 0.0 +sum_flux%sumxrs = 0.0 +RETURN +END SUBROUTINE init_sumflux_zero + +END MODULE cable_um_init_sumflux_mod + + + + diff --git a/src/coupled/AM3/control/cable/util/init/cbl_um_init.F90 b/src/coupled/AM3/control/cable/util/init/cbl_um_init.F90 new file mode 100644 index 000000000..be07a734c --- /dev/null +++ b/src/coupled/AM3/control/cable/util/init/cbl_um_init.F90 @@ -0,0 +1,134 @@ +MODULE cbl_um_init_mod + +IMPLICIT NONE +PUBLIC :: init_data +PRIVATE + +CONTAINS + +SUBROUTINE init_data( row_length, rows, land_pts, nsurft, npft, ms, msn, & + soil_zse, mp, nrb, CO2_MMR, tfrz, ICE_SurfaceType, & + ICE_SoilType, land_index, surft_pts, surft_index, & + tile_frac, L_tile_pts, albsoil, bexp, hcon, satcon, & + sathh, smvcst, smvcwt, smvccl, pars, tl_1, snow_tile, & + SoilTemp, SoilMoisture, FrozenSoilFrac, & + OneLyrSnowDensity, SnowAge, ThreeLayerSnowFlag, & + SnowDensity, SnowDepth, SnowTemp, SnowMass, rad_trad, & + met_tk, veg, soil, canopy, ssnow, bgc, sum_flux, & + SurfaceType, SoilType, npp_pft_acc, resp_w_pft_acc ) +! subrs +USE cbl_um_init_veg_mod, ONLY: initialize_veg +USE cbl_um_init_soil_mod, ONLY: initialize_soil +USE cbl_um_init_soilsnow_mod, ONLY: initialize_soilsnow +USE cable_um_init_respiration_mod, ONLY: init_respiration +USE cable_um_init_bgc_mod, ONLY: init_bgc_vars +USE cable_um_init_sumflux_mod, ONLY: init_sumflux_zero +USE cable_pack_mod, ONLY: cable_pack_rr + +! data +USE cable_other_constants_mod, ONLY: LAI_THRESH +USE grid_constants_mod_cbl, ONLY: nsnl, nsoil_max +USE cable_def_types_mod, ONLY: veg_parameter_type, canopy_type, & + soil_parameter_type, soil_snow_type, & + bgc_pool_type, sum_flux_type +USE params_io_mod_cbl, ONLY: params_io_data_type + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: row_length ! # columns in spatial grid +INTEGER, INTENT(IN) :: rows ! # rows in spatial grid +INTEGER, INTENT(IN) :: land_pts ! # land points being processed +INTEGER, INTENT(IN) :: nsurft ! # tiles +INTEGER, INTENT(IN) :: npft ! # plant functional types +INTEGER, INTENT(IN) :: ms ! # soil layers +INTEGER, INTENT(IN) :: msn ! # snow layers +REAL, INTENT(IN) :: soil_zse(ms) ! soil layer thicknesses +REAL, INTENT(IN) :: tfrz +INTEGER, INTENT(IN) :: mp ! # active land points +INTEGER, INTENT(IN) :: nrb +INTEGER, INTENT(IN) :: ICE_SoilType +REAL, INTENT(IN) :: co2_mmr +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points per tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! land_pt index of point +INTEGER, INTENT(IN) :: land_index(land_pts) ! cell index of land_pt +LOGICAL, INTENT(IN) :: L_tile_pts(land_pts, nsurft) ! TRUE if active tile +REAL, INTENT(IN) :: tile_frac(land_pts, nsurft) +REAL, INTENT(IN) :: bexp (land_pts, ms) ! b in Campbell equation +REAL, INTENT(IN) :: satcon(land_pts, ms) + ! hydraulic conductivity @ saturation [mm/s] +REAL, INTENT(IN) :: sathh(land_pts, ms) +REAL, INTENT(IN) :: smvcst(land_pts, ms) +REAL, INTENT(IN) :: smvcwt(land_pts, ms) +REAL, INTENT(IN) :: smvccl(land_pts, ms) +REAL, INTENT(IN) :: hcon(land_pts) ! Soil thermal conductivity (W/m/K). +REAL, INTENT(IN) :: albsoil(land_pts) +REAL, INTENT(IN) :: tl_1(row_length,rows) +REAL, INTENT(IN) :: snow_tile(land_pts, nsurft) +REAL, INTENT(IN) :: SoilTemp(land_pts, nsurft, ms) +REAL, INTENT(IN) :: SoilMoisture(land_pts, nsurft, ms) +REAL, INTENT(IN) :: FrozenSoilFrac(land_pts, nsurft, ms) +REAL, INTENT(IN) :: SnowDepth(land_pts, nsurft,nsnl) +REAL, INTENT(IN) :: SnowTemp(land_pts, nsurft,nsnl) +REAL, INTENT(IN) :: SnowMass(land_pts, nsurft,nsnl) +REAL, INTENT(IN) :: SnowDensity(land_pts, nsurft,nsnl) +REAL, INTENT(IN) :: OneLyrSnowDensity(land_pts, nsurft) +REAL, INTENT(IN) :: SnowAge(land_pts, nsurft) +REAL, INTENT(IN) :: npp_pft_acc(land_pts,npft) +REAL, INTENT(IN) :: resp_w_pft_acc(land_pts,npft) +INTEGER, INTENT(IN) :: ThreeLayerSnowFlag(land_pts, nsurft) +INTEGER, INTENT(IN) :: ICE_SurfaceType !CABLE surface tile PFT/nveg +INTEGER, INTENT(IN) :: SurfaceType(mp) ! surface tile PFT/nveg +INTEGER, INTENT(IN) :: SoilType(mp) ! soil type per tile +REAL, INTENT(OUT) :: rad_trad(mp) +REAL, INTENT(OUT) :: met_tk(mp) + +TYPE(canopy_type), INTENT(OUT) :: canopy +TYPE(veg_parameter_type), INTENT(OUT) :: veg ! vegetation parameters +TYPE(soil_parameter_type), INTENT(OUT) :: soil ! soil parameters +TYPE(soil_snow_type), INTENT(OUT) :: ssnow ! +TYPE(params_io_data_type), INTENT(IN) :: pars +TYPE(bgc_pool_type), INTENT(OUT) :: bgc +TYPE(sum_flux_type), INTENT(OUT) :: sum_flux + +! only needed to set rad%otrad on the first timestep. +canopy%ga = 0.0 +canopy%fes_cor = 0.0 +canopy%fhs_cor = 0.0 +canopy%us = 0.01 +canopy%fwsoil = 1.0 + +CALL initialize_veg( SurfaceType, SoilType, mp, ms, & + nrb, npft, nsurft, land_pts, l_tile_pts, ICE_SurfaceType, & + ICE_SoilType, LAI_thresh, soil_zse, surft_pts, & + surft_index, tile_frac, & + veg, soil, pars ) + + +CALL initialize_soil( nsurft, land_pts, ms, mp, nsoil_max, ICE_soiltype, & + surft_pts, surft_index, L_tile_pts, soiltype, & + bexp, hcon, satcon, sathh, smvcst, smvcwt, & + smvccl, albsoil, soil_zse, pars, soil ) + +! def met_tk on first call as is needed in wetfac calc ( which should be +! replaced with tss) approximating surface temp of lake and to init trad below +CALL cable_pack_rr( met_tk, tl_1, mp, l_tile_pts, row_length, rows, nsurft, & + land_pts, land_index, surft_pts, surft_index ) + +CALL initialize_soilsnow( mp, msn, ms, TFRZ, land_pts, nsurft, row_length, & + rows, ICE_SoilType, l_tile_pts, surft_pts, & + surft_index, smvcst, SoilTemp, FrozenSoilFrac, & + SoilMoisture, snow_tile, OneLyrSnowDensity, SnowAge, & + ThreeLayerSnowFlag, SnowDensity, SnowDepth, & + SnowMass, SnowTemp, soil, ssnow, veg%iveg, met_tk ) + +CALL init_bgc_vars( pars, bgc, veg ) +CALL init_sumflux_zero( sum_flux ) +CALL init_respiration( land_pts, nsurft, npft, L_tile_pts, & + npp_pft_acc, resp_w_pft_acc, canopy ) + +rad_trad = met_tk + +RETURN +END SUBROUTINE init_data + +END MODULE cbl_um_init_mod diff --git a/src/coupled/AM3/control/cable/util/init/cbl_um_init_soil.F90 b/src/coupled/AM3/control/cable/util/init/cbl_um_init_soil.F90 new file mode 100644 index 000000000..78d5ea2b5 --- /dev/null +++ b/src/coupled/AM3/control/cable/util/init/cbl_um_init_soil.F90 @@ -0,0 +1,236 @@ +MODULE cbl_um_init_soil_mod + +IMPLICIT NONE +PUBLIC initialize_soil + +CONTAINS + +SUBROUTINE initialize_soil( nsurft, land_pts, ms, mp, nsoil_max, ICE_soiltype, & + surft_pts, surft_index, L_tile_pts, soiltype, & + bexp, hcon, satcon, sathh, smvcst, smvcwt, & + smvccl, albsoil, dzsoil, pars, soil ) + +! subrs +USE cable_pack_mod, ONLY: pack_landpts2mp_ICE, pack_landpts2mp + +! data +USE cable_def_types_mod, ONLY: soil_parameter_type, r_2 +USE params_io_mod_cbl, ONLY: params_io_data_type +USE cable_common_module, ONLY : cable_user, gw_params +IMPLICIT NONE + +INTEGER, INTENT(IN) :: nsurft ! # tiles +INTEGER, INTENT(IN) :: land_pts ! # land points being processed +INTEGER, INTENT(IN) :: ms +INTEGER, INTENT(IN) :: mp ! # active land points +INTEGER, INTENT(IN) :: nsoil_max +REAL, INTENT(IN) :: dzsoil(ms) ! soil layer thicknesses +INTEGER, INTENT(IN) :: ICE_soiltype +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points on each tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! index of tile points +LOGICAL, INTENT(IN) :: L_tile_pts(land_pts, nsurft) +INTEGER, INTENT(IN) :: SoilType(mp) !CABLE soil type per tile +REAL, INTENT(IN) :: bexp(land_pts) +REAL, INTENT(IN) :: hcon(land_pts) +REAL, INTENT(IN) :: satcon(land_pts) +REAL, INTENT(IN) :: sathh(land_pts) +REAL, INTENT(IN) :: smvcst(land_pts) +REAL, INTENT(IN) :: smvcwt(land_pts) +REAL, INTENT(IN) :: smvccl(land_pts) +REAL, INTENT(IN) :: albsoil(land_pts) + +TYPE(soil_parameter_type), INTENT(INOUT) :: soil ! soil parameters +TYPE(params_io_data_type), INTENT(IN) :: pars + +!__ local vars +INTEGER :: i,j,k +REAL :: hcon_ICE(nsoil_max) +REAL :: soilCnsd_real(mp) +REAL :: sucs_sign_factor, hyds_unit_factor, sucs_min_magnitude +REAL, PARAMETER :: ssat_lo = 0.15 +REAL, PARAMETER :: ssat_hi = 0.65 +REAL, PARAMETER :: rhob_lo = 810.0 +REAL, PARAMETER :: rhob_hi = 2300.0 +REAL, ALLOCATABLE :: znode(:), ssat_bounded(:,:),rho_soil_bulk(:,:) + +! defined in namelist in UM + +soil%zse_vec = spread(dzsoil,1,mp) +soil%watr(:,:) = 0.05 +soil%GWwatr(:) = 0.05 + +! distance between consecutive layer midpoints +soil%zshh(1) = 0.5 * soil%zse(1) +soil%zshh(ms+1) = 0.5 * soil%zse(ms) +soil%zshh(2:ms) = 0.5 * (soil%zse(1:ms-1) + soil%zse(2:ms)) + +! albsoil -> soil%albsoil +CALL pack_landpts2mp( nsurft, land_pts, mp, surft_pts, surft_index, & + L_tile_pts, albsoil, soil%albsoil(:,1) ) + +! bexp -> soil%bch: parameter b in Campbell equation +CALL pack_landpts2mp_ICE( nsurft, land_pts, mp, nsoil_max, ICE_soiltype, & + surft_pts, surft_index, L_tile_pts, BEXP, SoilType, & + pars%soilin_bch, soil%bch ) + +hcon_ICE(:) = ( pars%soilin_sand(ICE_SoilType) * 0.3 ) & + + ( pars%soilin_clay(ICE_SoilType) * 0.25 ) & + + ( pars%soilin_silt(ICE_SoilType) * 0.265 ) + +! hcon -> soil%cnsd +CALL pack_landpts2mp_ICE( nsurft, land_pts, mp, nsoil_max, ICE_soiltype, & + surft_pts, surft_index, L_tile_pts, hcon, soiltype, & + hcon_ICE, soilCnsd_real ) + +soil%cnsd = REAL( soilCnsd_real, r_2 ) + +! CABLE soil parameters are in general PACKed from UM spatial fields +! *EXCEPT* for permanent ice points where we overwrite with parametrs read from +! cable_soil_params (pars%) + +! soil%hyds = hydraulic conductivity @saturation is PACKed from satcon[mm/s] +! *EXCEPT* at permanent ice points where we overwrite with parametrs read from +! pars%soilin_hyds[m/s] which are already in correct units. Dividing by 1000 +! soil%hyds is correct for tiles 1:8. Would be 1000* too small, hence *1000 first +CALL pack_landpts2mp_ICE( nsurft, land_pts, mp, nsoil_max, ICE_soiltype, & + surft_pts, surft_index, L_tile_pts, satcon, soiltype,& + pars%soilin_hyds * 1000.0, soil%hyds ) +soil%hyds = soil%hyds / 1000.0 + +! sathh -> soil%sucs +CALL pack_landpts2mp_ICE( nsurft, land_pts, mp, nsoil_max, ICE_soiltype, & + surft_pts, surft_index, L_tile_pts, sathh, soiltype, & + pars%soilin_sucs, soil%sucs ) + +! smvcst -> soil%ssat +CALL pack_landpts2mp_ICE( nsurft, land_pts, mp, nsoil_max, ICE_soiltype, & + surft_pts, surft_index, L_tile_pts, smvcst, soiltype,& + pars%soilin_ssat, soil%ssat ) + +! smvcwt -> soil%swilt +CALL pack_landpts2mp_ICE( nsurft, land_pts, mp, nsoil_max, ICE_soiltype, & + surft_pts, surft_index, L_tile_pts, smvcwt, soiltype,& + pars%soilin_swilt, soil%swilt ) + +! smvccl -> soil%sfc +CALL pack_landpts2mp_ICE( nsurft, land_pts, mp, nsoil_max, ICE_soiltype, & + surft_pts, surft_index, L_tile_pts, smvccl, soiltype,& + pars%soilin_sfc, soil%sfc ) + +!--- (re)set values for CABLE +soil%ibp2 = NINT(soil%bch) + 2 +soil%i2bp3 = 2 * NINT(soil%bch) + 3 + +soil%ssat = MAX( soil%ssat, soil%sfc + 0.01 ) +soil%sucs = ABS( soil%sucs ) +WHERE( soil%ssat > 0. ) + soil%pwb_min = (soil%swilt / soil%ssat )**soil%ibp2 +END WHERE +sucs_min_magnitude = 106.0/1000.0 +soil%sucs = MAX(sucs_min_magnitude,soil%sucs) +soil%hsbh = soil%hyds * ABS(soil%sucs) * soil%bch + +!from CM2 - BUT i don't think even necessary here. CM2 has a LOT of GW +!stuff here and cable_user%soil_thermal_fix stuff +DO k=1,ms + soil%ssat_vec(:,k) = real(soil%ssat(:) ,r_2) + soil%sucs_vec(:,k) = real(soil%sucs(:) ,r_2) + soil%hyds_vec(:,k) = real(soil%hyds(:) ,r_2) + soil%swilt_vec(:,k) = real(soil%swilt(:) ,r_2) + soil%bch_vec(:,k) = real(soil%bch(:) ,r_2) + soil%sfc_vec(:,k) = real(soil%sfc(:) ,r_2) + soil%rhosoil_vec(:,k) = real(soil%rhosoil(:),r_2) + soil%cnsd_vec(:,k) = real(soil%cnsd ,r_2) + soil%css_vec(:,k) = real(soil%css ,r_2) + soil%watr(:,k) = 0.001_r_2 +END DO + +WHERE (soil%ssat_vec .LE. 0.0 .AND. soil%sfc_vec .GT. 0.0) + soil%ssat_vec = soil%sfc_vec + 0.05 +END WHERE + +! review:: good chance we want some of this is CM3 +!jhan!IF (cable_user%soil_thermal_fix) THEN +!jhan! +!jhan!if (allocated(ssat_bounded)) deallocate(ssat_bounded) +!jhan!if (allocated(rho_soil_bulk)) deallocate(rho_soil_bulk) +!jhan! +!jhan!allocate(ssat_bounded(size(soil%ssat_vec,dim=1),& +!jhan! size(soil%ssat_vec,dim=2) ) ) +!jhan! +!jhan!ssat_bounded(:,:) = min( ssat_hi, max(ssat_lo, & +!jhan! soil%ssat_vec(:,:) ) ) +!jhan! +!jhan!allocate(rho_soil_bulk(size(soil%rhosoil_vec,dim=1),& +!jhan! size(soil%rhosoil_vec,dim=2) ) ) +!jhan! +!jhan!rho_soil_bulk(:,:) = min(rhob_hi, max(rhob_lo , & +!jhan! (2700.0*(1.0 - ssat_bounded(:,:)) ) ) ) +!jhan! +!jhan! +!jhan!do k=1,ms +!jhan! do i=1,mp +!jhan! +!jhan! +!jhan! if (soil%isoilm(i) .ne. 9) then +!jhan! +!jhan! soil%rhosoil_vec(i,k) = 2700.0 +!jhan! +!jhan! soil%cnsd_vec(i,k) = ( (0.135*(1.0-ssat_bounded(i,k))) +& +!jhan! (64.7/rho_soil_bulk(i,k)) ) / & +!jhan! (1.0 - 0.947*(1.0-ssat_bounded(i,k))) +!jhan! +!jhan! end if +!jhan! +!jhan! end do +!jhan!end do +!jhan! +!jhan!k=1 +!jhan!do i=1,mp +!jhan! if (soil%isoilm(i) .ne. 9) then +!jhan! soil%rhosoil(i) = soil%rhosoil_vec(i,1) +!jhan! soil%cnsd(i) = soil%cnsd_vec(i,1) +!jhan! end if +!jhan!end do +!jhan! +!jhan! if (allocated(ssat_bounded)) deallocate(ssat_bounded) +!jhan! if (allocated(rho_soil_bulk)) deallocate(rho_soil_bulk) +!jhan! +!jhan!END IF +!jhan! +!jhan!!node depths +!jhan!IF (allocated(znode)) deallocate(znode) +!jhan!allocate(znode(ms)) +!jhan! +!jhan!znode(1) = soil%zshh(1) +!jhan!do k=2,ms +!jhan! znode(k) = znode(k-1) * 0.5*(soil%zse(k-1)+soil%zse(k)) +!jhan!end do +!jhan! +!jhan!IF (cable_user%gw_model) THEN +!jhan! +!jhan! DO k=1,ms +!jhan! +!jhan! do i=1,mp !from reversing pedotransfer functions +!jhan! !,ay cause io issues because not passed into um +!jhan! +!jhan! if (soil%isoilm(i) .ne. 9) then +!jhan! +!jhan! soil%hyds_vec(i,k) = soil%hyds_vec(i,k) * & !change in hyds +!jhan! exp(-gw_params%hkrz*( znode(k)-gw_params%zdepth) ) +!jhan! +!jhan! end if +!jhan! +!jhan! +!jhan! end do +!jhan! end do +!jhan! +!jhan! k=1 +!jhan! soil%hyds(:) = soil%hyds_vec(:,k) +!jhan! +!jhan!END IF + +RETURN +END SUBROUTINE initialize_soil + +END MODULE cbl_um_init_soil_mod diff --git a/src/coupled/AM3/control/cable/util/init/cbl_um_init_soilsnow.F90 b/src/coupled/AM3/control/cable/util/init/cbl_um_init_soilsnow.F90 new file mode 100644 index 000000000..c199527ca --- /dev/null +++ b/src/coupled/AM3/control/cable/util/init/cbl_um_init_soilsnow.F90 @@ -0,0 +1,157 @@ +MODULE cbl_um_init_soilsnow_mod + +IMPLICIT NONE + +CONTAINS + +SUBROUTINE initialize_soilsnow( mp, msn, ms, TFRZ, land_pts, nsurft, & + row_length, rows, ICE_SoilType,l_surft_pts, & + surft_pts, surft_index, smvcst, tsoil_tile, & + sthf_tile, smcl_tile, snow_tile, snow_rho1l, & + snow_age, isnow_flg3l, snow_rho3l, & + snow_depth3l, snow_mass3l, snow_tmp3l, soil, & + ssnow, veg_iveg, met_tk ) + +! subrs +USE cable_init_wetfac_mod, ONLY: initialize_wetfac + +! data +USE cable_def_types_mod, ONLY : r_2 +USE cable_def_types_mod, ONLY: soil_parameter_type, veg_parameter_type +USE cable_def_types_mod, ONLY: met_type, soil_snow_type +USE cable_phys_constants_mod, ONLY: density_ice, density_liq + +INTEGER, INTENT(IN) :: row_length ! # columns in spatial grid +INTEGER, INTENT(IN) :: rows ! # rows in spatial grid +INTEGER, INTENT(IN) :: land_pts ! # land points being processed +INTEGER, INTENT(IN) :: nsurft ! # tiles +INTEGER, INTENT(IN) :: ms ! # soil layers +INTEGER, INTENT(IN) :: msn ! # snow layers +INTEGER, INTENT(IN) :: mp ! # active land points +INTEGER, INTENT(IN) :: ICE_SoilType ! ice soil type index +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points per tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! land_pt index of point +LOGICAL, INTENT(IN) :: l_surft_pts(land_pts, nsurft) +REAL, INTENT(IN) :: smvcst(land_pts) +REAL, INTENT(IN) :: sthf_tile(land_pts, nsurft, ms) +REAL, INTENT(IN) :: smcl_tile(land_pts, nsurft, ms) +REAL, INTENT(IN) :: tsoil_tile(land_pts, nsurft, ms) +REAL, INTENT(IN) :: snow_rho1l(land_pts, nsurft) +REAL, INTENT(IN) :: snow_tile(land_pts, nsurft) +REAL, INTENT(IN) :: snow_age(land_pts, nsurft) +REAL, INTENT(IN) :: snow_rho3l(land_pts, nsurft, msn) +REAL, INTENT(IN) :: snow_depth3l(land_pts, nsurft, msn) +REAL, INTENT(IN) :: snow_mass3l(land_pts, nsurft, msn) +REAL, INTENT(IN) :: snow_tmp3l(land_pts, nsurft, msn) +INTEGER, INTENT(IN) :: isnow_flg3l(land_pts, nsurft) +REAL, INTENT(IN) :: TFRZ +INTEGER, INTENT(IN) :: veg_iveg(mp) +REAL, INTENT(IN) :: met_tk(mp) + +TYPE(soil_parameter_type), INTENT(IN) :: soil ! soil parameters +TYPE(soil_snow_type), INTENT(OUT) :: ssnow ! + +!local vars +INTEGER :: i,j,k,L,n +REAL :: zsetot +REAL :: ice_vol_tmp(land_pts, nsurft, ms) +REAL :: wbtot_mp(mp, ms) +REAL :: wbice_mp(mp, ms) + +ssnow%pudsto = 0.0 +ssnow%pudsmx = 0.0 +ssnow%wbtot = 0.0 +ssnow%totwblake = 0.0 ! wb_lake integrated over river timestep +ssnow%tggav = 0.0 +ssnow%qhz = 0.0 +ssnow%qhlev = 0.0 +ssnow%qrecharge = 0.0 +ssnow%rtevap_sat = 0.0 +ssnow%rtevap_unsat = 0.0 + +! identify module parameters here and recast (NOT ssnow% state variables) +ssnow%t_snwlr = 0.05 +ssnow%rtsoil = 50.0 +ssnow%satfrac = 0.5 +ssnow%wtd = 1.0 + +ssnow%snowd = PACK( snow_tile, l_surft_pts ) +ssnow%snage = PACK( snow_age, l_surft_pts ) +ssnow%ssdnn = PACK( snow_rho1l, l_surft_pts ) +ssnow%isflag = PACK( isnow_flg3L, l_surft_pts ) +ssnow%ssdnn = PACK( snow_rho1l, l_surft_pts ) +ssnow%isflag = PACK( isnow_flg3l, l_surft_pts ) + +! over snow layers +DO j=1, msn + ssnow%sdepth(:,j)= PACK( snow_depth3l(:,:,j), l_surft_pts ) + ssnow%smass(:,j) = PACK( snow_mass3l(:,:,j), l_surft_pts ) + ssnow%ssdn(:,j) = PACK( snow_rho3l(:,:,j), l_surft_pts ) + ssnow%tggsn(:,j) = PACK( snow_tmp3l(:,:,j), l_surft_pts ) +ENDDO + +! over soil layers +DO j=1, ms + ssnow%tgg(:,j) = PACK( tsoil_tile(:,:,j), l_surft_pts ) +ENDDO + +ssnow%osnowd = ssnow%snowd + +zsetot = sum(soil%zse) +DO k = 1, ms + ssnow%tggav = ssnow%tggav + soil%zse(k)*ssnow%tgg(:,k)/zsetot +END DO + +ice_vol_tmp(:,:,:) = 0.0 +DO n=1,nsurft + DO k=1,surft_pts(n) + i = surft_index(k,n) + DO j = 1, ms + ice_vol_tmp(i,n,j) = sthf_tile(i,n,j) * smvcst(i) + ENDDO ! J + ENDDO +ENDDO + +DO j = 1, ms + !liq volume from (tot_mass - ice_mass) / (dz*rho_liq) + wbtot_mp(:,j) = PACK( smcl_tile(:,:,j), l_surft_pts ) + + ssnow%wbice(:,J) = PACK( ice_vol_tmp(:,:,j), l_surft_pts ) + ssnow%wbice(:,J) = MAX ( 0.0 , ssnow%wbice(:,j) ) + wbice_mp(:,j) = ssnow%wbice(:,j) * ( soil%zse(j) * density_ice ) + + ssnow%wbliq(:,j) = ( wbtot_mp(:,j) - wbice_mp(:,j) ) / ( soil%zse(j) * density_liq ) + ssnow%wb(:,j) = ssnow%wbice(:,j) + ssnow%wbliq(:,j) +END DO + +! wetfac initialized here as used to init owetfac on firstimestep in cbm +! add to startdump? includes Temporay fix for accounting for reduction of +! soil evaporation due to freezing. Also includes specific lakes case +! Prevents divide by zero at glaciated points where both wb and wbice=0. +CALL initialize_wetfac( mp, ssnow%wetfac, soil%swilt, soil%sfc, & + ssnow%wb(:,1), ssnow%wbice(:,1), ssnow%snowd, & + veg_iveg, met_tk, tfrz ) + +! initialized here on first call +ssnow%tss=(1-ssnow%isflag)*ssnow%tgg(:,1) + ssnow%isflag*ssnow%tggsn(:,1) + +!jhan: do we want to do this before %owetfac is set +DO J = 1, ms + !should be removed!!!!!!!! This cannot conserve if there are any + !dynamics + WHERE( soil%isoilm == ICE_SoilType) + ssnow%wb(:,j) = 0.95 * soil%ssat + ssnow%wbice(:,j) = 0.85 * ssnow%wb(:,j) + ENDWHERE + + !no not force rho_water==rho_ice==1000.0 + ssnow%wbtot = ssnow%wbtot + soil%zse(j) * & + ( ssnow%wbliq(:,j) * density_liq + & + ssnow%wbice(:,j) * density_ice ) +ENDDO + +RETURN +END SUBROUTINE initialize_soilsnow + +END MODULE cbl_um_init_soilsnow_mod + diff --git a/src/coupled/AM3/control/cable/util/init/cbl_um_init_veg.F90 b/src/coupled/AM3/control/cable/util/init/cbl_um_init_veg.F90 new file mode 100644 index 000000000..fe1fe67b9 --- /dev/null +++ b/src/coupled/AM3/control/cable/util/init/cbl_um_init_veg.F90 @@ -0,0 +1,71 @@ +MODULE cbl_um_init_veg_mod + +IMPLICIT NONE + +PUBLIC initialize_veg + +CONTAINS + +SUBROUTINE initialize_veg( SurfaceType, SoilType, mp,& + ms, nrb, npft, nsurft, land_pts, l_tile_pts, & + ICE_SurfaceType, ICE_SoilType, LAI_thresh, & + soil_zse, surft_pts, surft_index, tile_frac, & + veg, soil, pars ) + +USE params_io_mod_cbl, ONLY: params_io_data_type +USE cable_def_types_mod, ONLY: veg_parameter_type +USE cable_def_types_mod, ONLY: soil_parameter_type, r_2 + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: mp +INTEGER, INTENT(IN) :: ms +INTEGER, INTENT(IN) :: nrb +INTEGER, INTENT(IN) :: nsurft +INTEGER, INTENT(IN) :: npft +INTEGER, INTENT(IN) :: land_pts +INTEGER, INTENT(IN) :: ICE_SurfaceType ! index ICE surface type +INTEGER, INTENT(IN) :: ICE_SoilType ! index soil type +REAL, INTENT(IN) :: lai_thresh +REAL, INTENT(IN) :: soil_zse(ms) ! soil depth per layer +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points per tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! land_pt index of point +LOGICAL, INTENT(IN) :: L_tile_pts(land_pts, nsurft) ! TRUE if active tile +REAL, INTENT(IN) :: tile_frac(land_pts,nsurft) + +INTEGER, INTENT(IN) :: SurfaceType(mp) ! surface tile PFT/nveg +INTEGER, INTENT(IN) :: SoilType(mp) ! soil type per tile + +TYPE(veg_parameter_type), INTENT(OUT) :: veg ! vegetation parameters +TYPE(soil_parameter_type), INTENT(OUT) :: soil ! soil parameters +TYPE(params_io_data_type), INTENT(IN) :: pars + +! local vars +INTEGER :: i +REAL :: totdepth + +veg%meth = 1 ! review !should be namelist config if even used +veg%ejmax = 2.0 * veg%vcmax +veg%gamma = 3.e-2 ! for Haverd2013 switch ! offline init _parameters +veg%F10 = 0.85 ! offline set init _parameters + +! calculate veg%froot from using rootbeta and soil depth +! (Jackson et al. 1996, Oceologica, 108:389-411) +totdepth = 0.0 +DO i = 1, ms-1 + totdepth = totdepth + soil_zse(i) * 100.0 ! unit in centimetres + veg%froot(:, i) = MIN( 1.0_r_2, 1.0-veg%rootbeta(:)**totdepth ) +END DO +veg%froot(:, ms) = 1.0 - veg%froot(:, ms-1) +DO i = ms-1, 2, -1 + veg%froot(:, i) = veg%froot(:, i)-veg%froot(:,i-1) +END DO + +RETURN +END SUBROUTINE initialize_veg + +END MODULE cbl_um_init_veg_mod + + + + diff --git a/src/coupled/AM3/control/cable/util/init/cbl_um_init_veg.F90.manual b/src/coupled/AM3/control/cable/util/init/cbl_um_init_veg.F90.manual new file mode 100644 index 000000000..b1548b0d8 --- /dev/null +++ b/src/coupled/AM3/control/cable/util/init/cbl_um_init_veg.F90.manual @@ -0,0 +1,77 @@ +MODULE cbl_um_init_veg_mod + +IMPLICIT NONE + +PUBLIC initialize_veg + +CONTAINS + +SUBROUTINE initialize_veg( SurfaceType, SoilType, mp,& + ms, nrb, npft, nsurft, land_pts, l_tile_pts, & + ICE_SurfaceType, ICE_SoilType, LAI_thresh, & + soil_zse, surft_pts, surft_index, tile_frac, & + veg, soil, pars ) + +USE init_cable_parms_mod, ONLY: init_cable_parms_expl +USE params_io_mod_cbl, ONLY: params_io_data_type +USE cable_def_types_mod, ONLY: veg_parameter_type +USE cable_def_types_mod, ONLY: soil_parameter_type, r_2 + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: mp +INTEGER, INTENT(IN) :: ms +INTEGER, INTENT(IN) :: nrb +INTEGER, INTENT(IN) :: nsurft +INTEGER, INTENT(IN) :: npft +INTEGER, INTENT(IN) :: land_pts +INTEGER, INTENT(IN) :: ICE_SurfaceType ! index ICE surface type +INTEGER, INTENT(IN) :: ICE_SoilType ! index soil type +REAL, INTENT(IN) :: lai_thresh +REAL, INTENT(IN) :: soil_zse(ms) ! soil depth per layer +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points per tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! land_pt index of point +LOGICAL, INTENT(IN) :: L_tile_pts(land_pts, nsurft) ! TRUE if active tile +REAL, INTENT(IN) :: tile_frac(land_pts,nsurft) + +INTEGER, INTENT(OUT) :: SurfaceType(mp) ! surface tile PFT/nveg +INTEGER, INTENT(OUT) :: SoilType(mp) ! soil type per tile + +TYPE(veg_parameter_type), INTENT(OUT) :: veg ! vegetation parameters +TYPE(soil_parameter_type), INTENT(OUT) :: soil ! soil parameters +TYPE(params_io_data_type), INTENT(IN) :: pars + +! local vars +INTEGER :: i +REAL :: totdepth + +CALL init_cable_parms_expl( SurfaceType, SoilType, mp, ms, nrb, land_pts, & + nsurft, l_tile_pts, ICE_SurfaceType, & + ICE_SoilType, soil_zse, veg, soil, pars, tile_frac ) + +veg%meth = 1 ! review !should be namelist config if even used +veg%ejmax = 2.*veg%vcmax +veg%gamma = 3.e-2 ! for Haverd2013 switch ! offline set init _parameters +veg%F10 = 0.85 ! offline set init _parameters + +! calculate veg%froot from using rootbeta and soil depth +! (Jackson et al. 1996, Oceologica, 108:389-411) +totdepth = 0.0 +DO i = 1, ms-1 + totdepth = totdepth + soil_zse(i) * 100.0 ! unit in centimetres + veg%froot(:, i) = MIN( 1.0_r_2, 1.0-veg%rootbeta(:)**totdepth ) +END DO +veg%froot(:, ms) = 1.0 - veg%froot(:, ms-1) +DO i = ms-1, 2, -1 + veg%froot(:, i) = veg%froot(:, i)-veg%froot(:,i-1) +END DO + + +RETURN +END SUBROUTINE initialize_veg + +END MODULE cbl_um_init_veg_mod + + + + diff --git a/src/coupled/AM3/control/cable/util/map_paramaters_cbl.F90 b/src/coupled/AM3/control/cable/util/map_paramaters_cbl.F90 new file mode 100644 index 000000000..2f7219516 --- /dev/null +++ b/src/coupled/AM3/control/cable/util/map_paramaters_cbl.F90 @@ -0,0 +1,230 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** + +MODULE map_cable_parms_mod + +!------------------------------------------------------------------------------ +! Description: +! Initialises CABLE parameter variables from values read in namelist +! +! This MODULE is USEd in: +! cable_land_albedo_mod_cbl.F90 +! +! This MODULE contains 1 public Subroutine: +! map_cable_parms_rad +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +!------------------------------------------------------------------------------ + +IMPLICIT NONE + +PUBLIC map_cable_parms + +CONTAINS + +SUBROUTINE map_cable_parms( mp, ms, nrb, land_pts, nsurft, l_tile_pts, & + ICE_SurfaceType, ICE_SoilType, soil_zse, veg, & + soil, pars, tile_frac ) + +! Description: +! Nothing further to add to the module description. + +USE params_io_mod_cbl, ONLY: params_io_data_type +USE cable_def_types_mod, ONLY: veg_parameter_type +USE cable_def_types_mod, ONLY: soil_parameter_type + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: mp +INTEGER, INTENT(IN) :: ms +INTEGER, INTENT(IN) :: nrb +INTEGER, INTENT(IN) :: nsurft +INTEGER, INTENT(IN) :: land_pts +INTEGER, INTENT(IN) :: ICE_SurfaceType !index ICE surface type +INTEGER, INTENT(IN) :: ICE_SoilType !index soil type +LOGICAL, INTENT(IN) :: l_tile_pts(land_pts,nsurft) ! TRUE if active tile +REAL, INTENT(IN) :: soil_zse(ms) ! soil depth per layer +REAL, INTENT(IN) :: tile_frac(land_pts,nsurft) + +TYPE(veg_parameter_type), INTENT(OUT) :: veg ! vegetation parameters +TYPE(soil_parameter_type), INTENT(OUT) :: soil ! soil parameters +TYPE(params_io_data_type), INTENT(IN) :: pars + + +!local vars +INTEGER :: JSurfaceTypeID(land_pts,nsurft) +INTEGER :: i, j, h + +CALL DefinePatchType( veg%iveg, soil%isoilm, mp, land_pts, nsurft, & + ICE_SurfaceType, ICE_SoilType, tile_frac, L_tile_pts ) + +CALL init_ALLveg( veg%iveg, mp, ms, nrb, veg, pars ) + +CALL init_ALLsoil( soil%isoilm, mp, ms, soil_zse, soil, pars ) + +RETURN +END SUBROUTINE map_cable_parms + +SUBROUTINE DefinePatchType( SurfaceType, SoilType, mp, land_pts, nsurft, & + ICE_SurfaceType, ICE_SoilType, tile_frac, L_tile_pts) + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: mp +INTEGER, INTENT(OUT) :: SurfaceType(mp) !CABLE surface tile PFT/nveg +INTEGER, INTENT(OUT) :: SoilType(mp) !CABLE soil type per tile + +INTEGER, INTENT(IN) :: nsurft +INTEGER, INTENT(IN) :: land_pts +INTEGER, INTENT(IN) :: ICE_SurfaceType ! index ICE surface type +INTEGER, INTENT(IN) :: ICE_SoilType ! index soil type +LOGICAL, INTENT(IN) :: l_tile_pts(land_pts,nsurft) ! TRUE if active tile +REAL, INTENT(IN) :: tile_frac(land_pts,nsurft) + +!local vars +INTEGER :: JSurfaceTypeID(land_pts,nsurft) +INTEGER :: i, j + +!local var to pack surface type: +JSurfaceTypeID = 0 +DO j = 1, land_pts + DO i = 1, nsurft + IF ( tile_frac(j,i) > 0 ) JSurfaceTypeID(j,i) = i + END DO +END DO + +SurfaceType = 0 +SurfaceType = PACK( JSurfaceTypeID, L_tile_pts) + +SoilType(:)=2 +DO j=1,mp + IF (SurfaceType(j) == ICE_SurfaceType) THEN + SoilType(j)= ICE_SoilType + END IF +END DO + +END SUBROUTINE DefinePatchType + +SUBROUTINE init_ALLveg( SurfaceType, mp, ms, nrb, veg, pars ) + +! Description: Map per PFT parameters onto CABLE vectors of length mp +! Note: Canopy height (%hc) & LAI (%vlai) are clobbered by +! range limited UM/JULES spatial fields in limit_HGT_LAI() + +USE params_io_mod_cbl, ONLY: params_io_data_type +USE cable_def_types_mod, ONLY: veg_parameter_type, r_2 + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: mp +INTEGER, INTENT(IN) :: SurfaceType(mp) ! CABLE surface tile PFT/nveg +INTEGER, INTENT(IN) :: ms +INTEGER, INTENT(IN) :: nrb + +TYPE(veg_parameter_type), INTENT(OUT) :: veg ! vegetation parameters +TYPE(params_io_data_type), INTENT(IN) :: pars + +!local vars +INTEGER :: i, h + +DO h = 1, mp ! over each patch in current grid + + veg%frac4(h) = pars%vegin_frac4(SurfaceType(h)) + veg%taul(h,1) = pars%vegin_taul(1,SurfaceType(h)) + veg%taul(h,2) = pars%vegin_taul(2,SurfaceType(h)) + veg%refl(h,1) = pars%vegin_refl(1,SurfaceType(h)) + veg%refl(h,2) = pars%vegin_refl(2,SurfaceType(h)) + veg%canst1(h) = pars%vegin_canst1(SurfaceType(h)) + veg%dleaf(h) = pars%vegin_dleaf(SurfaceType(h)) + veg%vcmax(h) = pars%vegin_vcmax(SurfaceType(h)) + veg%ejmax(h) = pars%vegin_ejmax(SurfaceType(h)) + veg%hc(h) = pars%vegin_hc(SurfaceType(h)) + veg%xfang(h) = pars%vegin_xfang(SurfaceType(h)) + veg%vbeta(h) = pars%vegin_vbeta(SurfaceType(h)) + veg%xalbnir(h) = pars%vegin_xalbnir(SurfaceType(h)) + veg%rp20(h) = pars%vegin_rp20(SurfaceType(h)) + veg%rpcoef(h) = pars%vegin_rpcoef(SurfaceType(h)) + veg%rs20(h) = pars%vegin_rs20(SurfaceType(h)) + veg%shelrb(h) = pars%vegin_shelrb(SurfaceType(h)) + veg%wai(h) = pars%vegin_wai(SurfaceType(h)) + veg%a1gs(h) = pars%vegin_a1gs(SurfaceType(h)) + veg%d0gs(h) = pars%vegin_d0gs(SurfaceType(h)) + veg%vegcf(h) = pars%vegin_vegcf(SurfaceType(h)) + veg%extkn(h) = pars%vegin_extkn(SurfaceType(h)) + veg%tminvj(h) = pars%vegin_tminvj(SurfaceType(h)) + veg%tmaxvj(h) = pars%vegin_tmaxvj(SurfaceType(h)) + veg%g0(h) = pars%vegin_g0(SurfaceType(h)) ! Ticket #56 + veg%g1(h) = pars%vegin_g1(SurfaceType(h)) ! Ticket #56 + veg%a1gs(h) = pars%vegin_a1gs(SurfaceType(h)) + veg%d0gs(h) = pars%vegin_d0gs(SurfaceType(h)) + veg%alpha(h) = pars%vegin_alpha(SurfaceType(h)) + veg%convex(h) = pars%vegin_convex(SurfaceType(h)) + veg%cfrd(h) = pars%vegin_cfrd(SurfaceType(h)) + veg%gswmin(h) = pars%vegin_gswmin(SurfaceType(h)) + veg%conkc0(h) = pars%vegin_conkc0(SurfaceType(h)) + veg%conko0(h) = pars%vegin_conko0(SurfaceType(h)) + veg%ekc(h) = pars%vegin_ekc(SurfaceType(h)) + veg%eko(h) = pars%vegin_eko(SurfaceType(h)) + veg%rootbeta(h) = pars%vegin_rootbeta(SurfaceType(h)) + veg%zr(h) = pars%vegin_zr(SurfaceType(h)) + veg%clitt(h) = pars%vegin_clitt(SurfaceType(h)) + +END DO ! over each veg patch in land point + +RETURN +END SUBROUTINE init_ALLveg + +SUBROUTINE init_ALLsoil( SoilType, mp, ms, soil_zse, soil, pars ) + +! Description: UM/JULES spatial fields are used later in initialize_soil() to +! define soil properties. However note these are per landpoint as +! JULES doesn't have soil per tile. We use PFT=ICE to define +! Soil=ICE and use values from here. Also, there is no soil density +! field in the UM, we effectively use density @ soil%isoilm=2 + +USE params_io_mod_cbl, ONLY: params_io_data_type +USE cable_def_types_mod, ONLY: soil_parameter_type + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: mp +INTEGER, INTENT(IN) :: ms +INTEGER, INTENT(IN) :: SoilType(mp) !CABLE soil type per tile +REAL, INTENT(IN) :: soil_zse(ms) ! soil depth per layer + +TYPE(soil_parameter_type), INTENT(OUT) :: soil ! vegetation parameters +TYPE(params_io_data_type), INTENT(IN) :: pars + +!local vars +INTEGER :: h + +soil%zse(:) = soil_zse(:) + +DO h = 1, mp ! over each patch in current grid + + soil%swilt(h) = pars%soilin_swilt(SoilType(h)) + soil%sfc(h) = pars%soilin_sfc(SoilType(h)) + soil%ssat(h) = pars%soilin_ssat(SoilType(h)) + soil%bch(h) = pars%soilin_bch(SoilType(h)) + soil%hyds(h) = pars%soilin_hyds(SoilType(h)) + soil%sucs(h) = pars%soilin_sucs(SoilType(h)) + soil%rhosoil(h) = pars%soilin_rhosoil(SoilType(h)) + soil%css(h) = pars%soilin_css(SoilType(h)) + soil%silt(h) = pars%soilin_silt(SoilType(h)) + soil%clay(h) = pars%soilin_clay(SoilType(h)) + soil%sand(h) = pars%soilin_sand(SoilType(h)) + +END DO + +END SUBROUTINE init_ALLsoil + +END MODULE map_cable_parms_mod diff --git a/src/coupled/AM3/control/cable/util/pack_mod_cbl.F90 b/src/coupled/AM3/control/cable/util/pack_mod_cbl.F90 new file mode 100644 index 000000000..eec8c407f --- /dev/null +++ b/src/coupled/AM3/control/cable/util/pack_mod_cbl.F90 @@ -0,0 +1,164 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** + +MODULE cable_pack_mod + +!----------------------------------------------------------------------------- +! Description: +! JULES met forcing vars needed by CABLE commonly have JULES dimensions +! (row_length,rows), which are no good for CABLE. These have to be +! re-packed in a single vector of active tiles. Hence we use +! conditional "mask" l_tile_pts(land_pts,ntiles) which is .true. +! if the land point is/has an active tile. A packing routine for +! land_point dimensioned JULES fields is to be included as required on the +! subsequent (e.g. explicit) CALLs to CABLE +! +! This MODULE is USEd by: +! cable_land_albedo_mod.F90 +! +! This MODULE contains 1 public Subroutine: +! cable_pack_rr, +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!----------------------------------------------------------------------------- + +IMPLICIT NONE +PUBLIC :: cable_pack_rr, pack_landpts2mp_ICE, pack_landpts2mp +PRIVATE + +CONTAINS + +SUBROUTINE cable_pack_rr( cable_var, jules_var, mp, l_tile_pts, row_length, & + rows, ntype, land_pts, land_index, surft_pts, & + surft_index ) + +! Description: +! Nothing further to add to module description. + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: mp, row_length, rows, ntype, land_pts +REAL, INTENT(OUT) :: cable_var(mp) +LOGICAL, INTENT(IN) :: l_tile_pts(land_pts, ntype) +INTEGER, INTENT(IN) :: land_index(land_pts) !Index in (x,y) array +INTEGER, INTENT(IN) :: surft_pts(ntype) !# land points per PFT +INTEGER, INTENT(IN) :: surft_index(land_pts,ntype) !Index in land_pts array +REAL, INTENT(IN) :: jules_var(row_length, rows) +!local vars +REAL :: fvar(land_pts, ntype) +INTEGER :: n, k, l, j, i + +fvar(:, :) = 0.0 +DO n = 1, ntype + ! loop over number of points per tile + DO k = 1, surft_pts(n) + l = surft_index(k, n) + j = (land_index(l) - 1) / row_length + 1 + i = land_index(l) - (j-1) * row_length + fvar(l, n) = jules_var(i, j) + END DO +END DO +cable_var = PACK(fvar, l_tile_pts) + +RETURN +END SUBROUTINE cable_pack_rr + +!--- UM met forcing vars needed by CABLE which have UM dimensions +!---(land_points)[_lp], which is no good to cable. These have to be +!--- re-packed in a single vector of active tiles. Hence we use +!--- conditional "mask" l_tile_pts(land_pts,ntiles) which is .true. +!--- if the land point is/has an active tile +SUBROUTINE pack_landpts2mp_ICE( nsurft, land_pts, mp, nsoil_max, ICE_soiltype, & + tile_pts, tile_index, L_tile_pts, umvar, & + soiltype, ICE_value, cablevar ) + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: nsurft +INTEGER, INTENT(IN) :: land_pts +INTEGER, INTENT(IN) :: mp +INTEGER, INTENT(IN) :: nsoil_max +INTEGER, INTENT(IN) :: ICE_soiltype +INTEGER, INTENT(IN) :: soiltype(mp) +INTEGER, INTENT(IN) :: tile_pts(nsurft) +INTEGER, INTENT(IN) :: tile_index(land_pts, nsurft) +LOGICAL, INTENT(IN) :: L_tile_pts(land_pts, nsurft) +REAL, INTENT(IN) :: umvar(land_pts) +REAL, INTENT(IN) :: ICE_value(nsoil_max) +REAL, INTENT(INOUT) :: cablevar(mp) +!local vars +REAL :: fvar(land_pts, nsurft) +INTEGER :: n,k,l,i + +fvar(:,:) = 0.0 +DO n=1, nsurft + + ! loop over number of points per nth tile + DO k=1,tile_pts(n) + ! land pt index of point + L = tile_index(k,n) + ! at this point fvar=umvar, ELSE=0.0 + fvar(l,n) = umvar(l) + ENDDO + +ENDDO + +cablevar = PACK(fvar,L_tile_pts) + +DO i=1,mp + + IF(soiltype(i)==ICE_soiltype) THEN + cablevar(i) = ICE_value(ICE_soiltype) + END IF + +ENDDO + +END SUBROUTINE pack_landpts2mp_ICE + +SUBROUTINE pack_landpts2mp( nsurft, land_pts, mp, tile_pts, tile_index, & + L_tile_pts, umvar, cablevar ) + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: nsurft +INTEGER, INTENT(IN) :: land_pts +INTEGER, INTENT(IN) :: mp +LOGICAL, INTENT(IN) :: L_tile_pts(land_pts, nsurft) +INTEGER, INTENT(IN) :: tile_pts(nsurft) +INTEGER, INTENT(IN) :: tile_index(land_pts, nsurft) +REAL, INTENT(IN) :: umvar(land_pts) +REAL, INTENT(INOUT) :: cablevar(mp) +!local vars +REAL :: fvar(land_pts, nsurft) +INTEGER :: n,k,l + +fvar(:,:) = 0.0 +DO n=1, nsurft + ! loop over number of points per nth tile + DO k=1,tile_pts(n) + ! land pt index of point + l = tile_index(k,n) + ! at this point fvar=umvar, ELSE=0.0 + fvar(l,n) = umvar(l) + ENDDO +ENDDO + +cablevar = PACK(fvar,L_tile_pts) + +END SUBROUTINE pack_landpts2mp + + +END MODULE cable_pack_mod diff --git a/src/coupled/AM3/control/cable/util/update/cbl_um_update.F90 b/src/coupled/AM3/control/cable/util/update/cbl_um_update.F90 new file mode 100644 index 000000000..a290eed7d --- /dev/null +++ b/src/coupled/AM3/control/cable/util/update/cbl_um_update.F90 @@ -0,0 +1,117 @@ +MODULE cbl_um_update_mod + +IMPLICIT NONE +PUBLIC :: update_data +PRIVATE + +CONTAINS + +SUBROUTINE update_data( row_length, rows, land_pts, nsurft, npft, ms, msn, & + timestep, timestep_number, mp, nrb, CO2_MMR, & + HGT_pft_um, lai_pft_um, land_index, surft_pts, & + surft_index, tile_frac, L_tile_pts, cos_zenith_angle, & + latitude, longitude, sw_down_VIS, sw_down_NIR, & + beamFrac_VIS, beamFrac_NIR, beamFrac_TOT, lw_down, & + ls_rain, ls_snow, tl_1, qw_1, vshr_land, pstar, z1_tq, & + z1_uv, canopy_tile, rad, met, veg, soil, rough,canopy, & + ssnow, HGT_pft_cbl, LAI_pft_cbl, reducedLAIdue2snow ) + +USE cbl_um_update_met_mod, ONLY: update_met +USE cbl_um_update_radiation_mod, ONLY: update_radiation +USE cbl_um_update_roughness_mod, ONLY: update_roughness +USE cbl_um_update_canopy_mod, ONLY: update_canopy +USE cbl_um_update_soilsnow_mod, ONLY: update_soilsnow +USE cbl_LAI_canopy_height_mod, ONLY: limit_HGT_LAI +USE params_io_mod_cbl, ONLY: params_io_data_type +USE cable_other_constants_mod, ONLY: LAI_THRESH +USE cable_def_types_mod, ONLY: radiation_type, met_type, & + veg_parameter_type, & + soil_parameter_type, roughness_type, & + canopy_type, soil_snow_type + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: row_length ! # columns in spatial grid +INTEGER, INTENT(IN) :: rows ! # rows in spatial grid +INTEGER, INTENT(IN) :: land_pts ! # land points being processed +INTEGER, INTENT(IN) :: nsurft ! # tiles +INTEGER, INTENT(IN) :: npft ! # plant functional types +INTEGER, INTENT(IN) :: ms ! # soil layers +INTEGER, INTENT(IN) :: msn ! # snow layers +REAL, INTENT(IN) :: timestep +INTEGER, INTENT(IN) :: timestep_number +INTEGER, INTENT(IN) :: mp ! # active land points +INTEGER, INTENT(IN) :: nrb +REAL, INTENT(IN) :: co2_mmr +REAL, INTENT(IN) :: HGT_pft_um(land_pts, npft) +REAL, INTENT(IN) :: lai_pft_um(land_pts, npft) +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points per tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! land_pt index of point +INTEGER, INTENT(IN) :: land_index(land_pts) ! tangled cell index of land_pt +LOGICAL, INTENT(IN) :: L_tile_pts(land_pts, nsurft) ! TRUE if active tile +REAL, INTENT(IN) :: tile_frac(land_pts, nsurft) +REAL, INTENT(IN) :: cos_zenith_angle(row_length,rows) +REAL, INTENT(IN) :: latitude(row_length,rows) +REAL, INTENT(IN) :: longitude(row_length,rows) +REAL, INTENT(IN) :: lw_down(row_length,rows) +REAL, INTENT(IN) :: ls_rain(row_length,rows) +REAL, INTENT(IN) :: ls_snow(row_length,rows) +REAL, INTENT(IN) :: tl_1(row_length,rows) +REAL, INTENT(IN) :: qw_1(row_length,rows) +REAL, INTENT(IN) :: vshr_land(row_length,rows) +REAL, INTENT(IN) :: pstar(row_length,rows) +REAL, INTENT(IN) :: z1_tq(row_length,rows) +REAL, INTENT(IN) :: z1_uv(row_length,rows) +REAL, INTENT(IN) :: sw_down_VIS(row_length,rows) +REAL, INTENT(IN) :: sw_down_NIR(row_length,rows) +REAL, INTENT(IN) :: beamFrac_VIS(row_length,rows) +REAL, INTENT(IN) :: beamFrac_NIR(row_length,rows) +REAL, INTENT(IN) :: beamFrac_TOT(row_length,rows) +REAL, INTENT(IN) :: canopy_tile(land_pts, nsurft) +REAL, INTENT(IN) :: reducedLAIdue2snow(mp) +REAL, INTENT(OUT) :: HGT_pft_cbl(mp) +REAL, INTENT(OUT) :: LAI_pft_cbl(mp) + +TYPE(soil_parameter_type), INTENT(IN) :: soil ! soil parameters +TYPE(radiation_type), INTENT(OUT) :: rad +TYPE(met_type), INTENT(OUT) :: met +TYPE(roughness_type), INTENT(OUT) :: rough +TYPE(canopy_type), INTENT(OUT) :: canopy +TYPE(soil_snow_type), INTENT(INOUT) :: ssnow ! +TYPE(veg_parameter_type), INTENT(INOUT) :: veg ! vegetation parameters + +! Even when prescribed LAI, canopy height are seasonal so this cant be done ONLY +! on first call limit IN height, LAI and initialize veg% equivalents +CALL limit_HGT_LAI( LAI_pft_cbl, HGT_pft_cbl, mp, land_pts, nsurft, npft, & + surft_pts, surft_index, tile_frac, l_tile_pts, LAI_pft_um, & + HGT_pft_um, LAI_thresh ) + +! def veg% as they are what is USEd used in core science code +veg%vlai = LAI_pft_cbl +veg%hc = HGT_pft_cbl + +!--- Met. forcing +CALL update_met( mp, row_length, rows, timestep, land_pts, nsurft, & + surft_pts, surft_index,land_index,L_tile_pts, co2_mmr, & + ls_rain, ls_snow, tl_1, qw_1, vshr_land, pstar, met ) + +CALL update_radiation( mp, row_length, rows, timestep, land_pts, nsurft, & + surft_pts, surft_index,land_index, L_tile_pts, & + latitude, longitude, cos_zenith_angle, sw_down_VIS, & + sw_down_NIR, beamFrac_VIS, beamFrac_NIR, & + beamFrac_TOT, lw_down, rad, met ) + +CALL update_roughness( row_length, rows, mp, land_pts, nsurft, npft, & + lai_thresh, surft_pts, surft_index, land_index, & + L_tile_pts, z1_tq, z1_uv, HGT_pft_um, HGT_pft_cbl, & + rough, veg ) + +CALL update_canopy( mp, land_pts, nsurft, L_tile_pts, canopy_tile, & + reducedLAIdue2snow, canopy ) + +CALL update_soilsnow( mp, soil, ssnow, veg%iveg ) + +RETURN +END SUBROUTINE update_data + +END MODULE cbl_um_update_mod diff --git a/src/coupled/AM3/control/cable/util/update/cbl_um_update_canopy.F90 b/src/coupled/AM3/control/cable/util/update/cbl_um_update_canopy.F90 new file mode 100644 index 000000000..dc5de2c3d --- /dev/null +++ b/src/coupled/AM3/control/cable/util/update/cbl_um_update_canopy.F90 @@ -0,0 +1,36 @@ +MODULE cbl_um_update_canopy_mod + +IMPLICIT NONE + +PUBLIC update_canopy + +CONTAINS + +SUBROUTINE update_canopy( mp, land_pts, nsurft, L_tile_pts, canopy_tile, & + reducedLAIdue2snow, canopy ) + +USE cable_def_types_mod, ONLY: canopy_type + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: mp ! # active land points +INTEGER, INTENT(IN) :: land_pts ! # land points +INTEGER, INTENT(IN) :: nsurft ! # tiles +LOGICAL, INTENT(IN) :: L_tile_pts(land_pts, nsurft) +REAL, INTENT(IN) :: canopy_tile(land_pts, nsurft) +REAL, INTENT(IN) :: reducedLAIdue2snow(mp) +TYPE(canopy_type), INTENT(OUT) :: canopy + +!---set canopy storage (already in dim(land_pts,ntiles) ) +canopy%cansto = PACK(CANOPY_TILE, l_tile_pts) +canopy%oldcansto = canopy%cansto +canopy%vlaiw = reducedLAIdue2snow + +RETURN +END SUBROUTINE update_canopy + +END MODULE cbl_um_update_canopy_mod + + + + diff --git a/src/coupled/AM3/control/cable/util/update/cbl_um_update_met.F90 b/src/coupled/AM3/control/cable/util/update/cbl_um_update_met.F90 new file mode 100644 index 000000000..39576370c --- /dev/null +++ b/src/coupled/AM3/control/cable/util/update/cbl_um_update_met.F90 @@ -0,0 +1,111 @@ +MODULE cbl_um_update_met_mod + + IMPLICIT NONE + +CONTAINS + +SUBROUTINE update_met( mp, row_length, rows, timestep, land_pts, nsurft, & + surft_pts, surft_index, land_index, L_tile_pts, co2_mmr,& + ls_rain, ls_snow, tl_1, qw_1, vshr_land, pstar, met ) + !block!CO2_MMR,CO2_3D,CO2_DIM_LEN,CO2_DIM_ROW, + !block!L_CO2_INTERACTIVE ) + +USE cable_pack_mod, ONLY: cable_pack_rr +USE cable_phys_constants_mod, ONLY: UMIN +USE cable_def_types_mod, ONLY: met_type + +INTEGER, INTENT(IN) :: mp ! # active land points +INTEGER, INTENT(IN) :: row_length ! # columns in spatial grid +INTEGER, INTENT(IN) :: rows ! # rows in spatial grid +INTEGER, INTENT(IN) :: land_pts ! # land points being processed +INTEGER, INTENT(IN) :: nsurft ! # tiles +REAL, INTENT(IN) :: timestep +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # points on each tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! index of tile points +INTEGER, INTENT(IN) :: land_index(land_pts) ! index of land points +LOGICAL, INTENT(IN) :: L_tile_pts(land_pts, nsurft) + +! "forcing" +REAL, INTENT(IN) :: co2_mmr +REAL, INTENT(IN) :: ls_rain(row_length,rows) +REAL, INTENT(IN) :: ls_snow(row_length,rows) +REAL, INTENT(IN) :: tl_1(row_length,rows) +REAL, INTENT(IN) :: qw_1(row_length,rows) +REAL, INTENT(IN) :: vshr_land(row_length,rows) +REAL, INTENT(IN) :: pstar(row_length,rows) + +TYPE(met_type), INTENT(OUT) :: met + +!local decs +REAL :: ls_rain_dt(row_length,rows) +REAL :: ls_snow_dt(row_length,rows) +REAL :: precip_dt(row_length,rows) +REAL :: CO2_3D(row_length,rows) ! co2 mass mixing ratio +LOGICAL :: L_CO2_INTERACTIVE = .FALSE. ! namelist? + +!block!! rml 2/7/13 Extra atmospheric co2 variables +!block! LOGICAL, INTENT(IN) :: L_CO2_INTERACTIVE +!block! INTEGER, INTENT(IN) :: CO2_DIM_LEN, CO2_DIM_ROW +!block! REAL, INTENT(IN) :: CO2_3D(:,:) ! co2 mass mixing ratio + +met%DoY = 1.0 !jhan: fudged initialization to prevent dangling arg to init_rad + +!jhan:implies precip is given as per second +ls_rain_dt = ls_rain * timestep +ls_snow_dt = ls_snow * timestep +precip_dt = ls_rain_dt + ls_snow_dt +CALL cable_pack_rr( met%precip, precip_dt, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( met%precip_sn, ls_snow_dt, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( met%tk, tl_1, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( met%qv, qw_1, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( met%ua, vshr_land, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +met%ua = MAX( UMIN, met%ua ) !---this is necessary cloberring at present + +CALL cable_pack_rr( met%pmb, pstar, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +met%pmb = 0.01 * met%pmb ! what is this .01? Units conversion? + +!block!IF( .NOT. ALLOCATED( conv_rain_prevstep(mp) ) ) THEN +!block! ALLOCATE( conv_rain_prevstep(mp ) +!block! ALLOCATE( conv_snow_prevstep(mp) ) +!block! conv_rain_prevstep = 0. +!block! conv_snow_prevstep = 0. +!block!ENDIF +!block!we would need to get conv_*_from prev step for a start +!block!met%precip = (met%precip + conv_rain_prevstep) & +!block! + (met%precip_sn + conv_snow_prevstep) +!block! + (met%precip_sn + conv_rain_prevstep) + +!jhan:This might be peculiar to the UM? and if so presents a problem +met%tvair = met%tk +met%tvrad = met%tk + +!******************clobbered by a hard-wired number ********************! +! rml 24/2/11 Set atmospheric CO2 seen by cable to CO2_MMR (value seen +! by radiation scheme). Option in future to have cable see interactive +! (3d) CO2 field Convert CO2 from kg/kg to mol/mol ( m_air, +! 28.966 taken from include/constant/ccarbon.h file ) +! r935 rml 2/7/13 Add in co2_interactive option +IF (L_CO2_INTERACTIVE) THEN + CALL cable_pack_rr( met%ca, CO2_3D, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) +ELSE + met%ca = CO2_MMR +ENDIF +!jhan:WTF +met%ca = met%ca * 28.966/44. + +END SUBROUTINE update_met + +END MODULE cbl_um_update_met_mod diff --git a/src/coupled/AM3/control/cable/util/update/cbl_um_update_radiation.F90 b/src/coupled/AM3/control/cable/util/update/cbl_um_update_radiation.F90 new file mode 100644 index 000000000..5d4e0af80 --- /dev/null +++ b/src/coupled/AM3/control/cable/util/update/cbl_um_update_radiation.F90 @@ -0,0 +1,88 @@ +MODULE cbl_um_update_radiation_mod + +IMPLICIT NONE + +CONTAINS + +SUBROUTINE update_radiation( mp, row_length, rows, timestep, land_pts, nsurft, & + surft_pts, surft_index, land_index, L_tile_pts, & + latitude, longitude, cos_zenith_angle, & + sw_down_VIS, sw_down_NIR, beamFrac_VIS, & + beamFrac_NIR, beamFrac_TOT, lw_down, rad, met ) + +USE cable_pack_mod, ONLY: cable_pack_rr +USE cable_other_constants_mod, ONLY: RAD_THRESH +USE cable_def_types_mod, ONLY: radiation_type, met_type +IMPLICIT NONE + +INTEGER, INTENT(IN) :: mp ! # active land points +INTEGER, INTENT(IN) :: row_length ! # columns in spatial grid +INTEGER, INTENT(IN) :: rows ! # rows in spatial grid +REAL, INTENT(IN) :: timestep +INTEGER, INTENT(IN) :: land_pts ! # land points being processed +INTEGER, INTENT(IN) :: nsurft ! # tiles + +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points per tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! land_pt index of point +INTEGER, INTENT(IN) :: land_index(land_pts) ! tangled cell index of land_pt +LOGICAL, INTENT(IN) :: L_tile_pts(land_pts, nsurft) ! TRUE if active tile +REAL, INTENT(IN) :: cos_zenith_angle(row_length,rows) +REAL, INTENT(IN) :: latitude(row_length,rows) +REAL, INTENT(IN) :: longitude(row_length,rows) + +! radiation streams +REAL, INTENT(IN) :: sw_down_VIS(row_length,rows) +REAL, INTENT(IN) :: sw_down_NIR(row_length,rows) +REAL, INTENT(IN) :: beamFrac_VIS(row_length,rows) +REAL, INTENT(IN) :: beamFrac_NIR(row_length,rows) +REAL, INTENT(IN) :: beamFrac_TOT(row_length,rows) +REAL, INTENT(IN) :: lw_down(row_length,rows) + +TYPE(radiation_type), INTENT(OUT) :: rad +TYPE(met_type), INTENT(OUT) :: met + +!local vars +INTEGER :: i + +rad%otrad = rad%trad + +CALL cable_pack_rr( met%coszen, cos_zenith_angle, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +met%coszen = max(met%coszen,1e-8) ! is this really required now + +CALL cable_pack_rr( met%fsd(:,1), sw_down_VIS, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( met%fsd(:,2), sw_down_NIR, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( rad%fbeam(:,1), beamFrac_VIS, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( rad%fbeam(:,2), beamFrac_NIR, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( rad%fbeam(:,3), beamFrac_TOT, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) +DO i=1,mp + IF( met%coszen(i) < RAD_THRESH ) THEN + rad%fbeam(i,1) = REAL(0) + rad%fbeam(i,2) = REAL(0) + rad%fbeam(i,3) = REAL(0) + END IF +END DO + +CALL cable_pack_rr( met%fld, lw_down, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( rad%latitude, latitude, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( rad%longitude, longitude, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +RETURN +END SUBROUTINE update_radiation + +END MODULE cbl_um_update_radiation_mod diff --git a/src/coupled/AM3/control/cable/util/update/cbl_um_update_roughness.F90 b/src/coupled/AM3/control/cable/util/update/cbl_um_update_roughness.F90 new file mode 100644 index 000000000..d8ef7221f --- /dev/null +++ b/src/coupled/AM3/control/cable/util/update/cbl_um_update_roughness.F90 @@ -0,0 +1,73 @@ +MODULE cbl_um_update_roughness_mod + +IMPLICIT NONE + +CONTAINS + +SUBROUTINE update_roughness( row_length, rows, mp, land_pts, nsurft, npft, & + lai_thresh, surft_pts, surft_index, land_index, & + L_tile_pts, z1_tq, z1_uv, HGT_pft_um, HGT_pft_cbl,& + rough, veg ) + +USE cable_pack_mod, ONLY: cable_pack_rr +USE cable_def_types_mod, ONLY: roughness_type, veg_parameter_type + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: row_length +INTEGER, INTENT(IN) :: rows +INTEGER, INTENT(IN) :: mp ! # active land points +INTEGER, INTENT(IN) :: nsurft ! # tiles +INTEGER, INTENT(IN) :: npft +INTEGER, INTENT(IN) :: land_pts ! # land points being processed +REAL, INTENT(IN) :: lai_thresh +INTEGER, INTENT(IN) :: surft_pts(nsurft) ! # land points per tile +INTEGER, INTENT(IN) :: surft_index(land_pts, nsurft) ! land_pt index of point +INTEGER, INTENT(IN) :: land_index(land_pts) ! tangled cell index of land_pt +LOGICAL, INTENT(IN) :: L_tile_pts(land_pts, nsurft) ! TRUE if active tile +REAL, INTENT(IN) :: z1_tq(row_length, rows) +REAL, INTENT(IN) :: z1_uv(row_length, rows) +REAL, INTENT(IN) :: HGT_pft_um(land_pts,nsurft) +REAL, INTENT(IN) :: HGT_pft_cbl(mp) + +TYPE(roughness_type), INTENT(OUT) :: rough +TYPE(veg_parameter_type), INTENT(IN) :: veg ! vegetation parameters + +!local vars +INTEGER :: i,j,k,L,n +REAL :: jhruff(land_pts,nsurft) +REAL :: jhwork(land_pts,nsurft) + +!--- CABLE roughness type forcings +CALL cable_pack_rr( rough%za_tq, z1_tq, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +CALL cable_pack_rr( rough%za_uv, z1_uv, mp, l_tile_pts, row_length, & + rows, nsurft, land_pts, land_index, surft_pts, surft_index ) + +!Veg height changes seasonally in MOSES hence no updates here due to snow +jhwork = 0. +DO n=1,nsurft + DO k=1,surft_pts(n) + l = surft_index(k,n) + jhwork(l,n) = MAX( .01, HGT_pft_um(L,N) ) + ENDDO +ENDDO + +jhruff= 0.01 +DO l=1,land_pts + DO n=1,nsurft + IF( jhruff(L,N) .lt. jhwork(l,n)) THEN + jhruff(L,:) = jhwork(l,n) + END IF + ENDDO +ENDDO + +! CM2 set hruff from veg%hc - will require review with POP implementation +rough%hruff= MAX( 0.01, HGT_pft_cbl ) +rough%hruff_grmx = PACK(jhruff, l_tile_pts) + +RETURN +END SUBROUTINE update_roughness + +END MODULE cbl_um_update_roughness_mod diff --git a/src/coupled/AM3/control/cable/util/update/cbl_um_update_soilsnow.F90 b/src/coupled/AM3/control/cable/util/update/cbl_um_update_soilsnow.F90 new file mode 100644 index 000000000..fb3c5872f --- /dev/null +++ b/src/coupled/AM3/control/cable/util/update/cbl_um_update_soilsnow.F90 @@ -0,0 +1,48 @@ +MODULE cbl_um_update_soilsnow_mod + +IMPLICIT NONE + +CONTAINS + +SUBROUTINE update_soilsnow( mp, soil, ssnow, veg_iveg ) + + +USE cable_def_types_mod, ONLY: soil_parameter_type +USE cable_def_types_mod, ONLY: soil_snow_type +USE cable_phys_constants_mod, ONLY: density_ice, density_liq +USE cable_surface_types_mod, ONLY: lakes_cable +IMPLICIT NONE + +INTEGER, INTENT(IN) :: mp ! # active land points +INTEGER, INTENT(IN) :: veg_iveg(mp) +!jhan:build fudge inOUT +TYPE(soil_snow_type), INTENT(inOUT) :: ssnow ! +TYPE(soil_parameter_type), INTENT(IN) :: soil ! soil parameters + +INTEGER :: j + +ssnow%wb_lake = 0.0 +ssnow%wbtot1 = 0.0 +ssnow%wbtot2 = 0.0 + +ssnow%wbliq = ssnow%wb - ssnow%wbice + +!jhan:this was in a do loop from 1:1 +! lakes: remove hard-wired number in future version +WHERE( veg_iveg == lakes_cable .AND. ssnow%wb(:,1) < soil%sfc ) + + ssnow%wbtot1 = ssnow%wbtot1 + REAL( ssnow%wb(:,1) ) * 1000.0 * & + soil%zse(1) + ssnow%wb(:,1) = soil%sfc + ssnow%wbtot2 = ssnow%wbtot2 + REAL( ssnow%wb(:,1) ) * 1000.0 * & + soil%zse(1) +ENDWHERE + +ssnow%wb_lake = MAX( ssnow%wbtot2 - ssnow%wbtot1, 0.) + +RETURN +END SUBROUTINE update_soilsnow + +END MODULE cbl_um_update_soilsnow_mod + + diff --git a/src/coupled/AM3/control/casa/shared/cnp_fields_mod.F90 b/src/coupled/AM3/control/casa/shared/cnp_fields_mod.F90 new file mode 100644 index 000000000..122a7aebe --- /dev/null +++ b/src/coupled/AM3/control/casa/shared/cnp_fields_mod.F90 @@ -0,0 +1,19 @@ +MODULE cnp_fields_mod + +! TYPE definitions +USE progs_cnp_vars_mod, ONLY: progs_cnp_vars_type, & + progs_cnp_vars_data_type + +USE work_vars_mod_cnp, ONLY: work_vars_type + +PUBLIC + +! instantiated TYPES to hold the data +TYPE(progs_cnp_vars_data_type), TARGET :: progs_cnp_vars_data + +! instantiated TYPES we pass around. These happen to be pointers to the data +! types above but this should be transparent +TYPE(progs_cnp_vars_type) :: progs_cnp_vars +TYPE(work_vars_type) :: work_vars_cnp + +END MODULE cnp_fields_mod diff --git a/src/coupled/AM3/control/casa/shared/progs_cnp_vars_mod.F90 b/src/coupled/AM3/control/casa/shared/progs_cnp_vars_mod.F90 new file mode 100644 index 000000000..419990e3d --- /dev/null +++ b/src/coupled/AM3/control/casa/shared/progs_cnp_vars_mod.F90 @@ -0,0 +1,182 @@ +MODULE progs_cnp_vars_mod + +IMPLICIT NONE + +PUBLIC :: progs_cnp_vars_alloc +PUBLIC :: progs_cnp_vars_assoc +PUBLIC :: progs_cnp_vars_data_type +PUBLIC :: progs_cnp_vars_type +PRIVATE + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='PROGS_CNP_VARS_MOD' +! Prognostic Fields for CASA-CNP to be initialized from IO +TYPE :: progs_cnp_vars_data_type + + REAL, ALLOCATABLE :: C_pool_casa(:,:,:) + REAL, ALLOCATABLE :: N_pool_casa(:,:,:) + REAL, ALLOCATABLE :: P_pool_casa(:,:,:) + REAL, ALLOCATABLE :: soil_order_casa(:) + REAL, ALLOCATABLE :: N_dep_casa(:) + REAL, ALLOCATABLE :: N_fix_casa(:) + REAL, ALLOCATABLE :: P_dust_casa(:) + REAL, ALLOCATABLE :: P_weath_casa(:) + REAL, ALLOCATABLE :: LAI_casa(:,:) + REAL, ALLOCATABLE :: phenphase_casa(:,:) + REAL, ALLOCATABLE :: wood_hvest_C(:,:,:) + REAL, ALLOCATABLE :: wood_hvest_N(:,:,:) + REAL, ALLOCATABLE :: wood_hvest_P(:,:,:) + REAL, ALLOCATABLE :: thinning(:,:) + REAL, ALLOCATABLE :: prev_yr_sfrac(:,:) + +END TYPE progs_cnp_vars_data_type + +TYPE :: progs_cnp_vars_type + + REAL, POINTER, PUBLIC :: C_pool_casa(:,:,:) + REAL, POINTER, PUBLIC :: N_pool_casa(:,:,:) + REAL, POINTER, PUBLIC :: P_pool_casa(:,:,:) + REAL, POINTER, PUBLIC :: soil_order_casa(:) + REAL, POINTER, PUBLIC :: N_dep_casa(:) + REAL, POINTER, PUBLIC :: N_fix_casa(:) + REAL, POINTER, PUBLIC :: P_dust_casa(:) + REAL, POINTER, PUBLIC :: P_weath_casa(:) + REAL, POINTER, PUBLIC :: LAI_casa(:,:) + REAL, POINTER, PUBLIC :: phenphase_casa(:,:) + REAL, POINTER, PUBLIC :: wood_hvest_C(:,:,:) + REAL, POINTER, PUBLIC :: wood_hvest_N(:,:,:) + REAL, POINTER, PUBLIC :: wood_hvest_P(:,:,:) + REAL, POINTER, PUBLIC :: thinning(:,:) + REAL, POINTER, PUBLIC :: prev_yr_sfrac(:,:) + +END TYPE progs_cnp_vars_type + +CONTAINS + +SUBROUTINE progs_cnp_vars_alloc(land_pts, nsurft, progs_cnp_vars_data ) + +USE grid_constants_mod_cbl, ONLY : nCpool_casa, nNpool_casa, nPpool_casa +USE casadimension, ONLY: mwood + +IMPLICIT NONE + +!Arguments +INTEGER, INTENT(IN) :: land_pts, nsurft + +TYPE(progs_cnp_vars_data_type), INTENT(OUT) :: progs_cnp_vars_data + +ALLOCATE ( progs_cnp_vars_data % C_pool_casa ( land_pts, nsurft, nCpool_casa ) ) +ALLOCATE ( progs_cnp_vars_data % N_pool_casa ( land_pts, nsurft, nNpool_casa ) ) +ALLOCATE ( progs_cnp_vars_data % P_pool_casa ( land_pts, nsurft, nPpool_casa ) ) +ALLOCATE ( progs_cnp_vars_data % soil_order_casa ( land_pts ) ) +ALLOCATE ( progs_cnp_vars_data % N_dep_casa ( land_pts ) ) +ALLOCATE ( progs_cnp_vars_data % N_fix_casa ( land_pts ) ) +ALLOCATE ( progs_cnp_vars_data % P_dust_casa ( land_pts ) ) +ALLOCATE ( progs_cnp_vars_data % P_weath_casa ( land_pts ) ) +ALLOCATE ( progs_cnp_vars_data % LAI_casa ( land_pts, nsurft ) ) +ALLOCATE ( progs_cnp_vars_data % phenphase_casa ( land_pts, nsurft ) ) +ALLOCATE ( progs_cnp_vars_data % wood_hvest_C ( land_pts, nsurft, mwood ) ) +ALLOCATE ( progs_cnp_vars_data % wood_hvest_N ( land_pts, nsurft, mwood ) ) +ALLOCATE ( progs_cnp_vars_data % wood_hvest_P ( land_pts, nsurft, mwood ) ) +ALLOCATE ( progs_cnp_vars_data % thinning ( land_pts, nsurft ) ) +ALLOCATE ( progs_cnp_vars_data % prev_yr_sfrac ( land_pts, nsurft ) ) + +progs_cnp_vars_data % C_pool_casa(:,:,:) = 0.0 +progs_cnp_vars_data % N_pool_casa(:,:,:) = 0.0 +progs_cnp_vars_data % P_pool_casa(:,:,:) = 0.0 +progs_cnp_vars_data % soil_order_casa(:) = 0.0 +progs_cnp_vars_data % N_dep_casa(:) = 0.0 +progs_cnp_vars_data % N_fix_casa(:) = 0.0 +progs_cnp_vars_data % P_dust_casa(:) = 0.0 +progs_cnp_vars_data % P_weath_casa(:) = 0.0 +progs_cnp_vars_data % LAI_casa(:,:) = 0.0 +progs_cnp_vars_data % phenphase_casa(:,:) = 0.0 +progs_cnp_vars_data % wood_hvest_C(:,:,:) = 0.0 +progs_cnp_vars_data % wood_hvest_N(:,:,:) = 0.0 +progs_cnp_vars_data % wood_hvest_P(:,:,:) = 0.0 +progs_cnp_vars_data % thinning(:,:) = 0.0 +progs_cnp_vars_data % prev_yr_sfrac(:,:) = 0.0 + +RETURN +END SUBROUTINE progs_cnp_vars_alloc + +SUBROUTINE progs_cnp_vars_dealloc(progs_cnp_vars_data ) + +IMPLICIT NONE + +!Arguments +TYPE(progs_cnp_vars_data_type) :: progs_cnp_vars_data + +DEALLOCATE ( progs_cnp_vars_data % C_pool_casa ) +DEALLOCATE ( progs_cnp_vars_data % N_pool_casa ) +DEALLOCATE ( progs_cnp_vars_data % P_pool_casa ) +DEALLOCATE ( progs_cnp_vars_data % soil_order_casa ) +DEALLOCATE ( progs_cnp_vars_data % N_dep_casa ) +DEALLOCATE ( progs_cnp_vars_data % N_fix_casa ) +DEALLOCATE ( progs_cnp_vars_data % P_dust_casa ) +DEALLOCATE ( progs_cnp_vars_data % P_weath_casa ) +DEALLOCATE ( progs_cnp_vars_data % LAI_casa ) +DEALLOCATE ( progs_cnp_vars_data % phenphase_casa ) +DEALLOCATE ( progs_cnp_vars_data % wood_hvest_C ) +DEALLOCATE ( progs_cnp_vars_data % wood_hvest_N ) +DEALLOCATE ( progs_cnp_vars_data % wood_hvest_P ) +DEALLOCATE ( progs_cnp_vars_data % thinning ) +DEALLOCATE ( progs_cnp_vars_data % prev_yr_sfrac ) + +RETURN +END SUBROUTINE progs_cnp_vars_dealloc + +SUBROUTINE progs_cnp_vars_assoc(progs_cnp_vars, progs_cnp_vars_data ) + +IMPLICIT NONE + +!Arguments +TYPE(progs_cnp_vars_type), INTENT(IN OUT) :: progs_cnp_vars +TYPE(progs_cnp_vars_data_type), INTENT(IN OUT), TARGET :: progs_cnp_vars_data + +progs_cnp_vars % C_pool_casa => progs_cnp_vars_data % C_pool_casa +progs_cnp_vars % N_pool_casa => progs_cnp_vars_data % N_pool_casa +progs_cnp_vars % P_pool_casa => progs_cnp_vars_data % P_pool_casa +progs_cnp_vars % soil_order_casa => progs_cnp_vars_data % soil_order_casa +progs_cnp_vars % N_dep_casa => progs_cnp_vars_data % N_dep_casa +progs_cnp_vars % N_fix_casa => progs_cnp_vars_data % N_fix_casa +progs_cnp_vars % P_dust_casa => progs_cnp_vars_data % P_dust_casa +progs_cnp_vars % P_weath_casa => progs_cnp_vars_data % P_weath_casa +progs_cnp_vars % LAI_casa => progs_cnp_vars_data % LAI_casa +progs_cnp_vars % phenphase_casa => progs_cnp_vars_data % phenphase_casa +progs_cnp_vars % wood_hvest_C => progs_cnp_vars_data % wood_hvest_C +progs_cnp_vars % wood_hvest_N => progs_cnp_vars_data % wood_hvest_N +progs_cnp_vars % wood_hvest_P => progs_cnp_vars_data % wood_hvest_P +progs_cnp_vars % thinning => progs_cnp_vars_data % thinning +progs_cnp_vars % prev_yr_sfrac => progs_cnp_vars_data % prev_yr_sfrac + +RETURN +END SUBROUTINE progs_cnp_vars_assoc + +SUBROUTINE progs_cnp_vars_nullify(progs_cnp_vars) + +IMPLICIT NONE + +!Arguments +TYPE(progs_cnp_vars_type) :: progs_cnp_vars + +NULLIFY ( progs_cnp_vars % C_pool_casa ) +NULLIFY ( progs_cnp_vars % N_pool_casa ) +NULLIFY ( progs_cnp_vars % P_pool_casa ) +NULLIFY ( progs_cnp_vars % soil_order_casa ) +NULLIFY ( progs_cnp_vars % N_dep_casa ) +NULLIFY ( progs_cnp_vars % N_fix_casa ) +NULLIFY ( progs_cnp_vars % P_dust_casa ) +NULLIFY ( progs_cnp_vars % P_weath_casa ) +NULLIFY ( progs_cnp_vars % LAI_casa ) +NULLIFY ( progs_cnp_vars % phenphase_casa ) +NULLIFY ( progs_cnp_vars % wood_hvest_C ) +NULLIFY ( progs_cnp_vars % wood_hvest_N ) +NULLIFY ( progs_cnp_vars % wood_hvest_P ) +NULLIFY ( progs_cnp_vars % thinning ) +NULLIFY ( progs_cnp_vars % prev_yr_sfrac ) + +RETURN + +END SUBROUTINE progs_cnp_vars_nullify + +END MODULE progs_cnp_vars_mod diff --git a/src/coupled/AM3/control/casa/shared/work_vars_mod_cnp.F90 b/src/coupled/AM3/control/casa/shared/work_vars_mod_cnp.F90 new file mode 100644 index 000000000..360ba2777 --- /dev/null +++ b/src/coupled/AM3/control/casa/shared/work_vars_mod_cnp.F90 @@ -0,0 +1,52 @@ +MODULE work_vars_mod_cnp + +!!USE cable_bgc_pool_type_mod, ONLY: bgc_pool_type +!!USE cable_bgc_pool_type_mod, ONLY: bgc_pool_data_type +!!USE cable_sum_flux_type_mod, ONLY: sum_flux_type +!!USE cable_sum_flux_type_mod, ONLY: sum_flux_data_type + +USE casa_biome_type_mod, ONLY: casa_biome_data_type +USE casa_biome_type_mod, ONLY: casa_biome_type +USE casa_pool_type_mod, ONLY: casa_pool_data_type +USE casa_pool_type_mod, ONLY: casa_pool_type +USE casa_flux_type_mod, ONLY: casa_flux_data_type +USE casa_flux_type_mod, ONLY: casa_flux_type +USE casa_met_type_mod, ONLY: casa_met_data_type +USE casa_met_type_mod, ONLY: casa_met_type +USE casa_balance_type_mod, ONLY: casa_bal_data_type +USE casa_balance_type_mod, ONLY: casa_bal_type +USE phenology_type_mod, ONLY: phenology_data_type +USE phenology_type_mod, ONLY: phenology_type + +IMPLICIT NONE + +PUBLIC :: work_vars_type +PRIVATE + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='WORK_VARS_MOD_CNP' + +TYPE :: work_vars_type + + TYPE( casa_biome_type ) :: casabiome + TYPE( casa_pool_type ) :: casapool + TYPE( casa_pool_type ) :: sum_casapool + TYPE( casa_flux_type ) :: casaflux + TYPE( casa_flux_type ) :: sum_casaflux + TYPE( casa_met_type ) :: casamet + TYPE( casa_bal_type ) :: casabal + TYPE( phenology_type ) :: phen + +END TYPE work_vars_type + +! data arrays need to be declared outside of the work% TYPE +TYPE( casa_biome_data_type ), PUBLIC, TARGET :: casabiome_data +TYPE( casa_pool_data_type ), PUBLIC, TARGET :: casapool_data +TYPE( casa_pool_data_type ), PUBLIC, TARGET :: sum_casapool_data +TYPE( casa_flux_data_type ), PUBLIC, TARGET :: casaflux_data +TYPE( casa_flux_data_type ), PUBLIC, TARGET :: sum_casaflux_data +TYPE( casa_met_data_type ), PUBLIC, TARGET :: casamet_data +TYPE( casa_bal_data_type ), PUBLIC, TARGET :: casabal_data +TYPE( phenology_data_type ), PUBLIC, TARGET :: phen_data + +END MODULE work_vars_mod_cnp + diff --git a/src/coupled/AM3/initialisation/cable_pft_params.F90 b/src/coupled/AM3/initialisation/cable_pft_params.F90 new file mode 100644 index 000000000..81cb6fa8e --- /dev/null +++ b/src/coupled/AM3/initialisation/cable_pft_params.F90 @@ -0,0 +1,1033 @@ +MODULE cable_pft_params_mod + + IMPLICIT NONE + +CONTAINS + +subroutine cable_pft_params(pars_io_data_cbl) + + ! Gets parameter values for each vegetation type +USE grid_constants_mod_cbl, ONLY : ms => nsl, nrb +USE grid_constants_mod_cbl, ONLY : ncs => nsCs, ncp => nvCs +USE params_io_mod_cbl, ONLY: params_io_data_type + + IMPLICIT NONE + + TYPE(params_io_data_type), TARGET :: pars_io_data_cbl + + INTEGER :: a, jveg ! do loop counter + + !PFT parameters: description and corresponding variable name in code. + !PFT parameters are assigned as TYPE pars_io_data_cbl%vegin_ but later used as veg% + + !PFT: evergreen_needleleaf + !========================================================= + + pars_io_data_cbl%vegin_canst1(1) = 0.100000 + pars_io_data_cbl%vegin_length(1) = 0.055000 + pars_io_data_cbl%vegin_width(1) = 0.001000 + pars_io_data_cbl%vegin_vcmax(1) = 0.000040 + pars_io_data_cbl%vegin_ejmax(1) = 0.000000 + pars_io_data_cbl%vegin_hc(1) = 17.000000 + pars_io_data_cbl%vegin_xfang(1) = 0.010000 + pars_io_data_cbl%vegin_rp20(1) = 3.000000 + pars_io_data_cbl%vegin_rpcoef(1) = 0.083200 + pars_io_data_cbl%vegin_rs20(1) = 1.000000 + pars_io_data_cbl%vegin_wai(1) = 1.000000 + pars_io_data_cbl%vegin_rootbeta(1) = 0.943000 + pars_io_data_cbl%vegin_shelrb(1) = 2.000000 + pars_io_data_cbl%vegin_vegcf(1) = 9.000000 + pars_io_data_cbl%vegin_frac4(1) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(1) = 1.000000 + pars_io_data_cbl%vegin_extkn(1) = 0.001000 + pars_io_data_cbl%vegin_tminvj(1) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(1) = -10.000000 + pars_io_data_cbl%vegin_vbeta(1) = 2.000000 + pars_io_data_cbl%vegin_froot(1,1) = 0.050000 + pars_io_data_cbl%vegin_froot(2,1) = 0.050000 + pars_io_data_cbl%vegin_froot(3,1) = 0.050000 + pars_io_data_cbl%vegin_froot(4,1) = 0.050000 + pars_io_data_cbl%vegin_froot(5,1) = 0.050000 + pars_io_data_cbl%vegin_froot(6,1) = 0.050000 + pars_io_data_cbl%vegin_refl(1,1) = 0.090000 + pars_io_data_cbl%vegin_taul(1,1) = 0.090000 + pars_io_data_cbl%vegin_refl(2,1) = 0.300000 + pars_io_data_cbl%vegin_taul(2,1) = 0.300000 + pars_io_data_cbl%vegin_refl(3,1) = 0.010000 + pars_io_data_cbl%vegin_taul(3,1) = 0.010000 + pars_io_data_cbl%vegin_csoil(1,1) = 184.000000 + pars_io_data_cbl%vegin_ratecs(1,1) = 2.000000 + pars_io_data_cbl%vegin_csoil(2,1) = 367.000000 + pars_io_data_cbl%vegin_ratecs(2,1) = 0.500000 + pars_io_data_cbl%vegin_cplant(1,1) = 200.000000 + pars_io_data_cbl%vegin_ratecp(1,1) = 1.000000 + pars_io_data_cbl%vegin_cplant(2,1) = 10217.000000 + pars_io_data_cbl%vegin_ratecp(2,1) = 0.030000 + pars_io_data_cbl%vegin_cplant(3,1) = 876.000000 + pars_io_data_cbl%vegin_ratecp(3,1) = 0.140000 + pars_io_data_cbl%vegin_a1gs(1) = 9.000000 + pars_io_data_cbl%vegin_d0gs(1) = 1500.000000 + pars_io_data_cbl%vegin_alpha(1) = 0.200000 + pars_io_data_cbl%vegin_convex(1) = 0.700000 + pars_io_data_cbl%vegin_cfrd(1) = 0.015000 + pars_io_data_cbl%vegin_gswmin(1) = 0.010000 + pars_io_data_cbl%vegin_conkc0(1) = 0.000302 + pars_io_data_cbl%vegin_conko0(1) = 0.256000 + pars_io_data_cbl%vegin_ekc(1) = 59430.000000 + pars_io_data_cbl%vegin_eko(1) = 36000.000000 + pars_io_data_cbl%vegin_g0(1) = 0.000000 + pars_io_data_cbl%vegin_g1(1) = 2.346064 + pars_io_data_cbl%vegin_zr(1) = 1.800000 + pars_io_data_cbl%vegin_clitt(1) = 20.000000 + + !PFT: evergreen_broadleaf + !========================================================= + pars_io_data_cbl%vegin_canst1(2) = 0.100000 + pars_io_data_cbl%vegin_length(2) = 0.100000 + pars_io_data_cbl%vegin_width(2) = 0.050000 + pars_io_data_cbl%vegin_vcmax(2) = 0.000055 + pars_io_data_cbl%vegin_ejmax(2) = 0.000000 + pars_io_data_cbl%vegin_hc(2) = 35.000000 + pars_io_data_cbl%vegin_xfang(2) = 0.100000 + pars_io_data_cbl%vegin_rp20(2) = 0.600000 + pars_io_data_cbl%vegin_rpcoef(2) = 0.083200 + pars_io_data_cbl%vegin_rs20(2) = 1.000000 + pars_io_data_cbl%vegin_wai(2) = 1.000000 + pars_io_data_cbl%vegin_rootbeta(2) = 0.962000 + pars_io_data_cbl%vegin_shelrb(2) = 2.000000 + pars_io_data_cbl%vegin_vegcf(2) = 14.000000 + pars_io_data_cbl%vegin_frac4(2) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(2) = 1.000000 + pars_io_data_cbl%vegin_extkn(2) = 0.001000 + pars_io_data_cbl%vegin_tminvj(2) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(2) = -10.000000 + pars_io_data_cbl%vegin_vbeta(2) = 2.000000 + pars_io_data_cbl%vegin_froot(1,2) = 0.200000 + pars_io_data_cbl%vegin_froot(2,2) = 0.200000 + pars_io_data_cbl%vegin_froot(3,2) = 0.200000 + pars_io_data_cbl%vegin_froot(4,2) = 0.200000 + pars_io_data_cbl%vegin_froot(5,2) = 0.200000 + pars_io_data_cbl%vegin_froot(6,2) = 0.200000 + pars_io_data_cbl%vegin_refl(1,2) = 0.090000 + pars_io_data_cbl%vegin_taul(1,2) = 0.090000 + pars_io_data_cbl%vegin_refl(2,2) = 0.290000 + pars_io_data_cbl%vegin_taul(2,2) = 0.290000 + pars_io_data_cbl%vegin_refl(3,2) = 0.010000 + pars_io_data_cbl%vegin_taul(3,2) = 0.010000 + pars_io_data_cbl%vegin_csoil(1,2) = 303.000000 + pars_io_data_cbl%vegin_ratecs(1,2) = 2.000000 + pars_io_data_cbl%vegin_csoil(2,2) = 606.000000 + pars_io_data_cbl%vegin_ratecs(2,2) = 0.500000 + pars_io_data_cbl%vegin_cplant(1,2) = 300.000000 + pars_io_data_cbl%vegin_ratecp(1,2) = 1.000000 + pars_io_data_cbl%vegin_cplant(2,2) = 16833.000000 + pars_io_data_cbl%vegin_ratecp(2,2) = 0.030000 + pars_io_data_cbl%vegin_cplant(3,2) = 1443.000000 + pars_io_data_cbl%vegin_ratecp(3,2) = 0.140000 + pars_io_data_cbl%vegin_a1gs(2) = 9.000000 + pars_io_data_cbl%vegin_d0gs(2) = 1500.000000 + pars_io_data_cbl%vegin_alpha(2) = 0.200000 + pars_io_data_cbl%vegin_convex(2) = 0.700000 + pars_io_data_cbl%vegin_cfrd(2) = 0.015000 + pars_io_data_cbl%vegin_gswmin(2) = 0.010000 + pars_io_data_cbl%vegin_conkc0(2) = 0.000302 + pars_io_data_cbl%vegin_conko0(2) = 0.256000 + pars_io_data_cbl%vegin_ekc(2) = 59430.000000 + pars_io_data_cbl%vegin_eko(2) = 36000.000000 + pars_io_data_cbl%vegin_g0(2) = 0.000000 + pars_io_data_cbl%vegin_g1(2) = 4.114762 + pars_io_data_cbl%vegin_zr(2) = 3.000000 + pars_io_data_cbl%vegin_clitt(2) = 6.000000 + + !PFT: deciduous_needleleaf + !========================================================= + pars_io_data_cbl%vegin_canst1(3) = 0.100000 + pars_io_data_cbl%vegin_length(3) = 0.040000 + pars_io_data_cbl%vegin_width(3) = 0.001000 + pars_io_data_cbl%vegin_vcmax(3) = 0.000040 + pars_io_data_cbl%vegin_ejmax(3) = 0.000000 + pars_io_data_cbl%vegin_hc(3) = 15.500000 + pars_io_data_cbl%vegin_xfang(3) = 0.010000 + pars_io_data_cbl%vegin_rp20(3) = 3.000000 + pars_io_data_cbl%vegin_rpcoef(3) = 0.083200 + pars_io_data_cbl%vegin_rs20(3) = 1.000000 + pars_io_data_cbl%vegin_wai(3) = 1.000000 + pars_io_data_cbl%vegin_rootbeta(3) = 0.966000 + pars_io_data_cbl%vegin_shelrb(3) = 2.000000 + pars_io_data_cbl%vegin_vegcf(3) = 9.000000 + pars_io_data_cbl%vegin_frac4(3) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(3) = 1.000000 + pars_io_data_cbl%vegin_extkn(3) = 0.001000 + pars_io_data_cbl%vegin_tminvj(3) = 5.000000 + pars_io_data_cbl%vegin_tmaxvj(3) = 10.000000 + pars_io_data_cbl%vegin_vbeta(3) = 2.000000 + pars_io_data_cbl%vegin_froot(1,3) = 0.200000 + pars_io_data_cbl%vegin_froot(2,3) = 0.200000 + pars_io_data_cbl%vegin_froot(3,3) = 0.200000 + pars_io_data_cbl%vegin_froot(4,3) = 0.200000 + pars_io_data_cbl%vegin_froot(5,3) = 0.200000 + pars_io_data_cbl%vegin_froot(6,3) = 0.200000 + pars_io_data_cbl%vegin_refl(1,3) = 0.075000 + pars_io_data_cbl%vegin_taul(1,3) = 0.075000 + pars_io_data_cbl%vegin_refl(2,3) = 0.300000 + pars_io_data_cbl%vegin_taul(2,3) = 0.300000 + pars_io_data_cbl%vegin_refl(3,3) = 0.010000 + pars_io_data_cbl%vegin_taul(3,3) = 0.010000 + pars_io_data_cbl%vegin_csoil(1,3) = 107.000000 + pars_io_data_cbl%vegin_ratecs(1,3) = 2.000000 + pars_io_data_cbl%vegin_csoil(2,3) = 214.000000 + pars_io_data_cbl%vegin_ratecs(2,3) = 0.500000 + pars_io_data_cbl%vegin_cplant(1,3) = 200.000000 + pars_io_data_cbl%vegin_ratecp(1,3) = 1.000000 + pars_io_data_cbl%vegin_cplant(2,3) = 5967.000000 + pars_io_data_cbl%vegin_ratecp(2,3) = 0.030000 + pars_io_data_cbl%vegin_cplant(3,3) = 511.000000 + pars_io_data_cbl%vegin_ratecp(3,3) = 0.140000 + pars_io_data_cbl%vegin_a1gs(3) = 9.000000 + pars_io_data_cbl%vegin_d0gs(3) = 1500.000000 + pars_io_data_cbl%vegin_alpha(3) = 0.200000 + pars_io_data_cbl%vegin_convex(3) = 0.700000 + pars_io_data_cbl%vegin_cfrd(3) = 0.015000 + pars_io_data_cbl%vegin_gswmin(3) = 0.010000 + pars_io_data_cbl%vegin_conkc0(3) = 0.000302 + pars_io_data_cbl%vegin_conko0(3) = 0.256000 + pars_io_data_cbl%vegin_ekc(3) = 59430.000000 + pars_io_data_cbl%vegin_eko(3) = 36000.000000 + pars_io_data_cbl%vegin_g0(3) = 0.000000 + pars_io_data_cbl%vegin_g1(3) = 2.346064 + pars_io_data_cbl%vegin_zr(3) = 2.000000 + pars_io_data_cbl%vegin_clitt(3) = 10.000000 + + !PFT: deciduous_broadleaf + !========================================================= + pars_io_data_cbl%vegin_canst1(4) = 0.100000 + pars_io_data_cbl%vegin_length(4) = 0.150000 + pars_io_data_cbl%vegin_width(4) = 0.080000 + pars_io_data_cbl%vegin_vcmax(4) = 0.000060 + pars_io_data_cbl%vegin_ejmax(4) = 0.000000 + pars_io_data_cbl%vegin_hc(4) = 20.000000 + pars_io_data_cbl%vegin_xfang(4) = 0.250000 + pars_io_data_cbl%vegin_rp20(4) = 2.200000 + pars_io_data_cbl%vegin_rpcoef(4) = 0.083200 + pars_io_data_cbl%vegin_rs20(4) = 1.000000 + pars_io_data_cbl%vegin_wai(4) = 1.000000 + pars_io_data_cbl%vegin_rootbeta(4) = 0.961000 + pars_io_data_cbl%vegin_shelrb(4) = 2.000000 + pars_io_data_cbl%vegin_vegcf(4) = 8.000000 + pars_io_data_cbl%vegin_frac4(4) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(4) = 1.000000 + pars_io_data_cbl%vegin_extkn(4) = 0.001000 + pars_io_data_cbl%vegin_tminvj(4) = 5.000000 + pars_io_data_cbl%vegin_tmaxvj(4) = 15.000000 + pars_io_data_cbl%vegin_vbeta(4) = 2.000000 + pars_io_data_cbl%vegin_froot(1,4) = 0.200000 + pars_io_data_cbl%vegin_froot(2,4) = 0.200000 + pars_io_data_cbl%vegin_froot(3,4) = 0.200000 + pars_io_data_cbl%vegin_froot(4,4) = 0.200000 + pars_io_data_cbl%vegin_froot(5,4) = 0.200000 + pars_io_data_cbl%vegin_froot(6,4) = 0.200000 + pars_io_data_cbl%vegin_refl(1,4) = 0.090000 + pars_io_data_cbl%vegin_taul(1,4) = 0.090000 + pars_io_data_cbl%vegin_refl(2,4) = 0.290000 + pars_io_data_cbl%vegin_taul(2,4) = 0.290000 + pars_io_data_cbl%vegin_refl(3,4) = 0.010000 + pars_io_data_cbl%vegin_taul(3,4) = 0.010000 + pars_io_data_cbl%vegin_csoil(1,4) = 216.000000 + pars_io_data_cbl%vegin_ratecs(1,4) = 2.000000 + pars_io_data_cbl%vegin_csoil(2,4) = 432.000000 + pars_io_data_cbl%vegin_ratecs(2,4) = 0.500000 + pars_io_data_cbl%vegin_cplant(1,4) = 300.000000 + pars_io_data_cbl%vegin_ratecp(1,4) = 1.000000 + pars_io_data_cbl%vegin_cplant(2,4) = 12000.000000 + pars_io_data_cbl%vegin_ratecp(2,4) = 0.030000 + pars_io_data_cbl%vegin_cplant(3,4) = 1029.000000 + pars_io_data_cbl%vegin_ratecp(3,4) = 0.140000 + pars_io_data_cbl%vegin_a1gs(4) = 9.000000 + pars_io_data_cbl%vegin_d0gs(4) = 1500.000000 + pars_io_data_cbl%vegin_alpha(4) = 0.200000 + pars_io_data_cbl%vegin_convex(4) = 0.700000 + pars_io_data_cbl%vegin_cfrd(4) = 0.015000 + pars_io_data_cbl%vegin_gswmin(4) = 0.010000 + pars_io_data_cbl%vegin_conkc0(4) = 0.000302 + pars_io_data_cbl%vegin_conko0(4) = 0.256000 + pars_io_data_cbl%vegin_ekc(4) = 59430.000000 + pars_io_data_cbl%vegin_eko(4) = 36000.000000 + pars_io_data_cbl%vegin_g0(4) = 0.000000 + pars_io_data_cbl%vegin_g1(4) = 4.447321 + pars_io_data_cbl%vegin_zr(4) = 2.000000 + pars_io_data_cbl%vegin_clitt(4) = 13.000000 + + !PFT: shrub + !========================================================= + pars_io_data_cbl%vegin_canst1(5) = 0.100000 + pars_io_data_cbl%vegin_length(5) = 0.100000 + pars_io_data_cbl%vegin_width(5) = 0.005000 + pars_io_data_cbl%vegin_vcmax(5) = 0.000040 + pars_io_data_cbl%vegin_ejmax(5) = 0.000000 + pars_io_data_cbl%vegin_hc(5) = 0.600000 + pars_io_data_cbl%vegin_xfang(5) = 0.010000 + pars_io_data_cbl%vegin_rp20(5) = 1.000000 + pars_io_data_cbl%vegin_rpcoef(5) = 0.083200 + pars_io_data_cbl%vegin_rs20(5) = 1.000000 + pars_io_data_cbl%vegin_wai(5) = 0.000000 + pars_io_data_cbl%vegin_rootbeta(5) = 0.964000 + pars_io_data_cbl%vegin_shelrb(5) = 2.000000 + pars_io_data_cbl%vegin_vegcf(5) = 5.000000 + pars_io_data_cbl%vegin_frac4(5) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(5) = 1.000000 + pars_io_data_cbl%vegin_extkn(5) = 0.001000 + pars_io_data_cbl%vegin_tminvj(5) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(5) = -10.000000 + pars_io_data_cbl%vegin_vbeta(5) = 4.000000 + pars_io_data_cbl%vegin_froot(1,5) = 0.200000 + pars_io_data_cbl%vegin_froot(2,5) = 0.200000 + pars_io_data_cbl%vegin_froot(3,5) = 0.200000 + pars_io_data_cbl%vegin_froot(4,5) = 0.200000 + pars_io_data_cbl%vegin_froot(5,5) = 0.200000 + pars_io_data_cbl%vegin_froot(6,5) = 0.200000 + pars_io_data_cbl%vegin_refl(1,5) = 0.090000 + pars_io_data_cbl%vegin_taul(1,5) = 0.090000 + pars_io_data_cbl%vegin_refl(2,5) = 0.300000 + pars_io_data_cbl%vegin_taul(2,5) = 0.300000 + pars_io_data_cbl%vegin_refl(3,5) = 0.010000 + pars_io_data_cbl%vegin_taul(3,5) = 0.010000 + pars_io_data_cbl%vegin_csoil(1,5) = 100.000000 + pars_io_data_cbl%vegin_ratecs(1,5) = 2.000000 + pars_io_data_cbl%vegin_csoil(2,5) = 250.000000 + pars_io_data_cbl%vegin_ratecs(2,5) = 0.500000 + pars_io_data_cbl%vegin_cplant(1,5) = 159.000000 + pars_io_data_cbl%vegin_ratecp(1,5) = 1.000000 + pars_io_data_cbl%vegin_cplant(2,5) = 5000.000000 + pars_io_data_cbl%vegin_ratecp(2,5) = 0.030000 + pars_io_data_cbl%vegin_cplant(3,5) = 500.000000 + pars_io_data_cbl%vegin_ratecp(3,5) = 0.140000 + pars_io_data_cbl%vegin_a1gs(5) = 9.000000 + pars_io_data_cbl%vegin_d0gs(5) = 1500.000000 + pars_io_data_cbl%vegin_alpha(5) = 0.200000 + pars_io_data_cbl%vegin_convex(5) = 0.700000 + pars_io_data_cbl%vegin_cfrd(5) = 0.015000 + pars_io_data_cbl%vegin_gswmin(5) = 0.010000 + pars_io_data_cbl%vegin_conkc0(5) = 0.000302 + pars_io_data_cbl%vegin_conko0(5) = 0.256000 + pars_io_data_cbl%vegin_ekc(5) = 59430.000000 + pars_io_data_cbl%vegin_eko(5) = 36000.000000 + pars_io_data_cbl%vegin_g0(5) = 0.000000 + pars_io_data_cbl%vegin_g1(5) = 4.694803 + pars_io_data_cbl%vegin_zr(5) = 2.500000 + pars_io_data_cbl%vegin_clitt(5) = 2.000000 + + !PFT: C3 + !========================================================= + pars_io_data_cbl%vegin_canst1(6) = 0.100000 + pars_io_data_cbl%vegin_length(6) = 0.300000 + pars_io_data_cbl%vegin_width(6) = 0.010000 + pars_io_data_cbl%vegin_vcmax(6) = 0.000060 + pars_io_data_cbl%vegin_ejmax(6) = 0.000000 + pars_io_data_cbl%vegin_hc(6) = 0.567000 + pars_io_data_cbl%vegin_xfang(6) = -0.300000 + pars_io_data_cbl%vegin_rp20(6) = 1.500000 + pars_io_data_cbl%vegin_rpcoef(6) = 0.083200 + pars_io_data_cbl%vegin_rs20(6) = 1.000000 + pars_io_data_cbl%vegin_wai(6) = 0.000000 + pars_io_data_cbl%vegin_rootbeta(6) = 0.943000 + pars_io_data_cbl%vegin_shelrb(6) = 2.000000 + pars_io_data_cbl%vegin_vegcf(6) = 7.000000 + pars_io_data_cbl%vegin_frac4(6) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(6) = 1.000000 + pars_io_data_cbl%vegin_extkn(6) = 0.001000 + pars_io_data_cbl%vegin_tminvj(6) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(6) = -10.000000 + pars_io_data_cbl%vegin_vbeta(6) = 4.000000 + pars_io_data_cbl%vegin_froot(1,6) = 0.150000 + pars_io_data_cbl%vegin_froot(2,6) = 0.150000 + pars_io_data_cbl%vegin_froot(3,6) = 0.150000 + pars_io_data_cbl%vegin_froot(4,6) = 0.150000 + pars_io_data_cbl%vegin_froot(5,6) = 0.150000 + pars_io_data_cbl%vegin_froot(6,6) = 0.150000 + pars_io_data_cbl%vegin_refl(1,6) = 0.110000 + pars_io_data_cbl%vegin_taul(1,6) = 0.110000 + pars_io_data_cbl%vegin_refl(2,6) = 0.340000 + pars_io_data_cbl%vegin_taul(2,6) = 0.340000 + pars_io_data_cbl%vegin_refl(3,6) = 0.010000 + pars_io_data_cbl%vegin_taul(3,6) = 0.010000 + pars_io_data_cbl%vegin_csoil(1,6) = 275.000000 + pars_io_data_cbl%vegin_ratecs(1,6) = 2.000000 + pars_io_data_cbl%vegin_csoil(2,6) = 314.000000 + pars_io_data_cbl%vegin_ratecs(2,6) = 0.500000 + pars_io_data_cbl%vegin_cplant(1,6) = 250.000000 + pars_io_data_cbl%vegin_ratecp(1,6) = 1.000000 + pars_io_data_cbl%vegin_cplant(2,6) = 0.000000 + pars_io_data_cbl%vegin_ratecp(2,6) = 0.030000 + pars_io_data_cbl%vegin_cplant(3,6) = 500.000000 + pars_io_data_cbl%vegin_ratecp(3,6) = 0.140000 + pars_io_data_cbl%vegin_a1gs(6) = 9.000000 + pars_io_data_cbl%vegin_d0gs(6) = 1500.000000 + pars_io_data_cbl%vegin_alpha(6) = 0.200000 + pars_io_data_cbl%vegin_convex(6) = 0.700000 + pars_io_data_cbl%vegin_cfrd(6) = 0.015000 + pars_io_data_cbl%vegin_gswmin(6) = 0.010000 + pars_io_data_cbl%vegin_conkc0(6) = 0.000302 + pars_io_data_cbl%vegin_conko0(6) = 0.256000 + pars_io_data_cbl%vegin_ekc(6) = 59430.000000 + pars_io_data_cbl%vegin_eko(6) = 36000.000000 + pars_io_data_cbl%vegin_g0(6) = 0.000000 + pars_io_data_cbl%vegin_g1(6) = 5.248500 + pars_io_data_cbl%vegin_zr(6) = 0.500000 !1.5 in Haverd et al. (2016) + pars_io_data_cbl%vegin_clitt(6) = 2.000000 + + !PFT: C4 + !========================================================= + pars_io_data_cbl%vegin_canst1(7) = 0.100000 + pars_io_data_cbl%vegin_length(7) = 0.300000 + pars_io_data_cbl%vegin_width(7) = 0.010000 + pars_io_data_cbl%vegin_vcmax(7) = 0.000010 + pars_io_data_cbl%vegin_ejmax(7) = 0.000000 + pars_io_data_cbl%vegin_hc(7) = 0.567000 + pars_io_data_cbl%vegin_xfang(7) = -0.300000 + pars_io_data_cbl%vegin_rp20(7) = 2.800000 + pars_io_data_cbl%vegin_rpcoef(7) = 0.083200 + pars_io_data_cbl%vegin_rs20(7) = 1.000000 + pars_io_data_cbl%vegin_wai(7) = 0.000000 + pars_io_data_cbl%vegin_rootbeta(7) = 0.943000 + pars_io_data_cbl%vegin_shelrb(7) = 2.000000 + pars_io_data_cbl%vegin_vegcf(7) = 7.000000 + pars_io_data_cbl%vegin_frac4(7) = 1.000000 + pars_io_data_cbl%vegin_xalbnir(7) = 1.000000 + pars_io_data_cbl%vegin_extkn(7) = 0.001000 + pars_io_data_cbl%vegin_tminvj(7) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(7) = -10.000000 + pars_io_data_cbl%vegin_vbeta(7) = 4.000000 + pars_io_data_cbl%vegin_froot(1,7) = 0.000000 + pars_io_data_cbl%vegin_froot(2,7) = 0.000000 + pars_io_data_cbl%vegin_froot(3,7) = 0.000000 + pars_io_data_cbl%vegin_froot(4,7) = 0.000000 + pars_io_data_cbl%vegin_froot(5,7) = 0.000000 + pars_io_data_cbl%vegin_froot(6,7) = 0.000000 + pars_io_data_cbl%vegin_refl(1,7) = 0.110000 + pars_io_data_cbl%vegin_taul(1,7) = 0.110000 + pars_io_data_cbl%vegin_refl(2,7) = 0.340000 + pars_io_data_cbl%vegin_taul(2,7) = 0.340000 + pars_io_data_cbl%vegin_refl(3,7) = 0.010000 + pars_io_data_cbl%vegin_taul(3,7) = 0.010000 + pars_io_data_cbl%vegin_csoil(1,7) = 275.000000 + pars_io_data_cbl%vegin_ratecs(1,7) = 2.000000 + pars_io_data_cbl%vegin_csoil(2,7) = 314.000000 + pars_io_data_cbl%vegin_ratecs(2,7) = 0.500000 + pars_io_data_cbl%vegin_cplant(1,7) = 250.000000 + pars_io_data_cbl%vegin_ratecp(1,7) = 1.000000 + pars_io_data_cbl%vegin_cplant(2,7) = 0.000000 + pars_io_data_cbl%vegin_ratecp(2,7) = 0.030000 + pars_io_data_cbl%vegin_cplant(3,7) = 500.000000 + pars_io_data_cbl%vegin_ratecp(3,7) = 0.140000 + pars_io_data_cbl%vegin_a1gs(7) = 4.000000 + pars_io_data_cbl%vegin_d0gs(7) = 1500.000000 + pars_io_data_cbl%vegin_alpha(7) = 0.050000 + pars_io_data_cbl%vegin_convex(7) = 0.800000 + pars_io_data_cbl%vegin_cfrd(7) = 0.025000 + pars_io_data_cbl%vegin_gswmin(7) = 0.040000 + pars_io_data_cbl%vegin_conkc0(7) = 0.000302 + pars_io_data_cbl%vegin_conko0(7) = 0.256000 + pars_io_data_cbl%vegin_ekc(7) = 59430.000000 + pars_io_data_cbl%vegin_eko(7) = 36000.000000 + pars_io_data_cbl%vegin_g0(7) = 0.000000 + pars_io_data_cbl%vegin_g1(7) = 1.616178 + pars_io_data_cbl%vegin_zr(7) = 0.500000 !2.4 in Haverd et al. (2016) + pars_io_data_cbl%vegin_clitt(7) = 0.300000 + + !PFT: Tundra + !========================================================= + pars_io_data_cbl%vegin_canst1(8) = 0.100000 + pars_io_data_cbl%vegin_length(8) = 0.300000 + pars_io_data_cbl%vegin_width(8) = 0.010000 + pars_io_data_cbl%vegin_vcmax(8) = 0.000040 + pars_io_data_cbl%vegin_ejmax(8) = 0.000000 + pars_io_data_cbl%vegin_hc(8) = 0.567000 + pars_io_data_cbl%vegin_xfang(8) = -0.300000 + pars_io_data_cbl%vegin_rp20(8) = 2.500000 + pars_io_data_cbl%vegin_rpcoef(8) = 0.083200 + pars_io_data_cbl%vegin_rs20(8) = 1.000000 + pars_io_data_cbl%vegin_wai(8) = 0.000000 + pars_io_data_cbl%vegin_rootbeta(8) = 0.943000 + pars_io_data_cbl%vegin_shelrb(8) = 2.000000 + pars_io_data_cbl%vegin_vegcf(8) = 5.000000 + pars_io_data_cbl%vegin_frac4(8) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(8) = 1.000000 + pars_io_data_cbl%vegin_extkn(8) = 0.001000 + pars_io_data_cbl%vegin_tminvj(8) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(8) = -10.000000 + pars_io_data_cbl%vegin_vbeta(8) = 4.000000 + pars_io_data_cbl%vegin_froot(1,8) = 0.000000 + pars_io_data_cbl%vegin_froot(2,8) = 0.000000 + pars_io_data_cbl%vegin_froot(3,8) = 0.000000 + pars_io_data_cbl%vegin_froot(4,8) = 0.000000 + pars_io_data_cbl%vegin_froot(5,8) = 0.000000 + pars_io_data_cbl%vegin_froot(6,8) = 0.000000 + pars_io_data_cbl%vegin_refl(1,8) = 0.075000 + pars_io_data_cbl%vegin_taul(1,8) = 0.075000 + pars_io_data_cbl%vegin_refl(2,8) = 0.320000 + pars_io_data_cbl%vegin_taul(2,8) = 0.320000 + pars_io_data_cbl%vegin_refl(3,8) = 0.010000 + pars_io_data_cbl%vegin_taul(3,8) = 0.010000 + pars_io_data_cbl%vegin_csoil(1,8) = 275.000000 + pars_io_data_cbl%vegin_ratecs(1,8) = 2.000000 + pars_io_data_cbl%vegin_csoil(2,8) = 314.000000 + pars_io_data_cbl%vegin_ratecs(2,8) = 0.500000 + pars_io_data_cbl%vegin_cplant(1,8) = 250.000000 + pars_io_data_cbl%vegin_ratecp(1,8) = 1.000000 + pars_io_data_cbl%vegin_cplant(2,8) = 0.000000 + pars_io_data_cbl%vegin_ratecp(2,8) = 0.030000 + pars_io_data_cbl%vegin_cplant(3,8) = 500.000000 + pars_io_data_cbl%vegin_ratecp(3,8) = 0.140000 + pars_io_data_cbl%vegin_a1gs(8) = 9.000000 + pars_io_data_cbl%vegin_d0gs(8) = 1500.000000 + pars_io_data_cbl%vegin_alpha(8) = 0.200000 + pars_io_data_cbl%vegin_convex(8) = 0.700000 + pars_io_data_cbl%vegin_cfrd(8) = 0.015000 + pars_io_data_cbl%vegin_gswmin(8) = 0.010000 + pars_io_data_cbl%vegin_conkc0(8) = 0.000302 + pars_io_data_cbl%vegin_conko0(8) = 0.256000 + pars_io_data_cbl%vegin_ekc(8) = 59430.000000 + pars_io_data_cbl%vegin_eko(8) = 36000.000000 + pars_io_data_cbl%vegin_g0(8) = 0.000000 + pars_io_data_cbl%vegin_g1(8) = 2.222156 + pars_io_data_cbl%vegin_zr(8) = 0.500000 + pars_io_data_cbl%vegin_clitt(8) = 0.300000 + + !PFT: C3 + !========================================================= + pars_io_data_cbl%vegin_canst1(9) = 0.100000 + pars_io_data_cbl%vegin_length(9) = 0.300000 + pars_io_data_cbl%vegin_width(9) = 0.010000 + pars_io_data_cbl%vegin_vcmax(9) = 0.000080 + pars_io_data_cbl%vegin_ejmax(9) = 0.000000 + pars_io_data_cbl%vegin_hc(9) = 0.550000 + pars_io_data_cbl%vegin_xfang(9) = -0.300000 + pars_io_data_cbl%vegin_rp20(9) = 1.500000 + pars_io_data_cbl%vegin_rpcoef(9) = 0.083200 + pars_io_data_cbl%vegin_rs20(9) = 1.000000 + pars_io_data_cbl%vegin_wai(9) = 0.000000 + pars_io_data_cbl%vegin_rootbeta(9) = 0.961000 + pars_io_data_cbl%vegin_shelrb(9) = 2.000000 + pars_io_data_cbl%vegin_vegcf(9) = 7.000000 + pars_io_data_cbl%vegin_frac4(9) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(9) = 1.000000 + pars_io_data_cbl%vegin_extkn(9) = 0.001000 + pars_io_data_cbl%vegin_tminvj(9) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(9) = -10.000000 + pars_io_data_cbl%vegin_vbeta(9) = 2.000000 + pars_io_data_cbl%vegin_froot(1,9) = 0.000000 + pars_io_data_cbl%vegin_froot(2,9) = 0.000000 + pars_io_data_cbl%vegin_froot(3,9) = 0.000000 + pars_io_data_cbl%vegin_froot(4,9) = 0.000000 + pars_io_data_cbl%vegin_froot(5,9) = 0.000000 + pars_io_data_cbl%vegin_froot(6,9) = 0.000000 + pars_io_data_cbl%vegin_refl(1,9) = 0.110000 + pars_io_data_cbl%vegin_taul(1,9) = 0.110000 + pars_io_data_cbl%vegin_refl(2,9) = 0.340000 + pars_io_data_cbl%vegin_taul(2,9) = 0.340000 + pars_io_data_cbl%vegin_refl(3,9) = 0.010000 + pars_io_data_cbl%vegin_taul(3,9) = 0.010000 + pars_io_data_cbl%vegin_csoil(1,9) = 149.000000 + pars_io_data_cbl%vegin_ratecs(1,9) = 2.000000 + pars_io_data_cbl%vegin_csoil(2,9) = 300.000000 + pars_io_data_cbl%vegin_ratecs(2,9) = 0.500000 + pars_io_data_cbl%vegin_cplant(1,9) = 150.000000 + pars_io_data_cbl%vegin_ratecp(1,9) = 1.000000 + pars_io_data_cbl%vegin_cplant(2,9) = 0.000000 + pars_io_data_cbl%vegin_ratecp(2,9) = 0.030000 + pars_io_data_cbl%vegin_cplant(3,9) = 607.000000 + pars_io_data_cbl%vegin_ratecp(3,9) = 0.140000 + pars_io_data_cbl%vegin_a1gs(9) = 9.000000 + pars_io_data_cbl%vegin_d0gs(9) = 1500.000000 + pars_io_data_cbl%vegin_alpha(9) = 0.200000 + pars_io_data_cbl%vegin_convex(9) = 0.700000 + pars_io_data_cbl%vegin_cfrd(9) = 0.015000 + pars_io_data_cbl%vegin_gswmin(9) = 0.010000 + pars_io_data_cbl%vegin_conkc0(9) = 0.000302 + pars_io_data_cbl%vegin_conko0(9) = 0.256000 + pars_io_data_cbl%vegin_ekc(9) = 59430.000000 + pars_io_data_cbl%vegin_eko(9) = 36000.000000 + pars_io_data_cbl%vegin_g0(9) = 0.000000 + pars_io_data_cbl%vegin_g1(9) = 5.789377 + pars_io_data_cbl%vegin_zr(9) = 0.500000 !1.5 in Haverd et al. (2016) + pars_io_data_cbl%vegin_clitt(9) = 0.000000 + + !PFT: C4 + !========================================================= + pars_io_data_cbl%vegin_canst1(10) = 0.100000 + pars_io_data_cbl%vegin_length(10) = 0.300000 + pars_io_data_cbl%vegin_width(10) = 0.010000 + pars_io_data_cbl%vegin_vcmax(10) = 0.000080 + pars_io_data_cbl%vegin_ejmax(10) = 0.000000 + pars_io_data_cbl%vegin_hc(10) = 0.550000 + pars_io_data_cbl%vegin_xfang(10) = -0.300000 + pars_io_data_cbl%vegin_rp20(10) = 1.000000 + pars_io_data_cbl%vegin_rpcoef(10) = 0.083200 + pars_io_data_cbl%vegin_rs20(10) = 1.000000 + pars_io_data_cbl%vegin_wai(10) = 0.000000 + pars_io_data_cbl%vegin_rootbeta(10) = 0.961000 + pars_io_data_cbl%vegin_shelrb(10) = 2.000000 + pars_io_data_cbl%vegin_vegcf(10) = 1.000000 + pars_io_data_cbl%vegin_frac4(10) = 1.000000 + pars_io_data_cbl%vegin_xalbnir(10) = 1.000000 + pars_io_data_cbl%vegin_extkn(10) = 0.001000 + pars_io_data_cbl%vegin_tminvj(10) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(10) = -10.000000 + pars_io_data_cbl%vegin_vbeta(10) = 2.000000 + pars_io_data_cbl%vegin_froot( 1,10) = 0.000000 + pars_io_data_cbl%vegin_froot( 2,10) = 0.000000 + pars_io_data_cbl%vegin_froot( 3,10) = 0.000000 + pars_io_data_cbl%vegin_froot( 4,10) = 0.000000 + pars_io_data_cbl%vegin_froot( 5,10) = 0.000000 + pars_io_data_cbl%vegin_froot( 6,10) = 0.000000 + pars_io_data_cbl%vegin_refl( 1,10) = 0.110000 + pars_io_data_cbl%vegin_taul( 1,10) = 0.110000 + pars_io_data_cbl%vegin_refl( 2,10) = 0.340000 + pars_io_data_cbl%vegin_taul( 2,10) = 0.340000 + pars_io_data_cbl%vegin_refl( 3,10) = 0.010000 + pars_io_data_cbl%vegin_taul( 3,10) = 0.010000 + pars_io_data_cbl%vegin_csoil( 1,10) = 149.000000 + pars_io_data_cbl%vegin_ratecs( 1,10) = 2.000000 + pars_io_data_cbl%vegin_csoil( 2,10) = 300.000000 + pars_io_data_cbl%vegin_ratecs( 2,10) = 0.500000 + pars_io_data_cbl%vegin_cplant( 1,10) = 150.000000 + pars_io_data_cbl%vegin_ratecp( 1,10) = 1.000000 + pars_io_data_cbl%vegin_cplant( 2,10) = 0.000000 + pars_io_data_cbl%vegin_ratecp( 2,10) = 0.030000 + pars_io_data_cbl%vegin_cplant( 3,10) = 607.000000 + pars_io_data_cbl%vegin_ratecp( 3,10) = 0.140000 + pars_io_data_cbl%vegin_a1gs(10) = 4.000000 + pars_io_data_cbl%vegin_d0gs(10) = 1500.000000 + pars_io_data_cbl%vegin_alpha(10) = 0.050000 + pars_io_data_cbl%vegin_convex(10) = 0.800000 + pars_io_data_cbl%vegin_cfrd(10) = 0.025000 + pars_io_data_cbl%vegin_gswmin(10) = 0.040000 + pars_io_data_cbl%vegin_conkc0(10) = 0.000302 + pars_io_data_cbl%vegin_conko0(10) = 0.256000 + pars_io_data_cbl%vegin_ekc(10) = 59430.000000 + pars_io_data_cbl%vegin_eko(10) = 36000.000000 + pars_io_data_cbl%vegin_g0(10) = 0.000000 + pars_io_data_cbl%vegin_g1(10) = 1.616178 + pars_io_data_cbl%vegin_zr(10) = 0.500000 !1.5 in Haverd et al. (2016) + pars_io_data_cbl%vegin_clitt(10) = 0.000000 + + !PFT: wetland + !========================================================= + pars_io_data_cbl%vegin_canst1(11) = 0.100000 + pars_io_data_cbl%vegin_length(11) = 0.300000 + pars_io_data_cbl%vegin_width(11) = 0.010000 + pars_io_data_cbl%vegin_vcmax(11) = 0.000060 + pars_io_data_cbl%vegin_ejmax(11) = 0.000000 + pars_io_data_cbl%vegin_hc(11) = 0.567000 + pars_io_data_cbl%vegin_xfang(11) = -0.300000 + pars_io_data_cbl%vegin_rp20(11) = 1.500000 + pars_io_data_cbl%vegin_rpcoef(11) = 0.083200 + pars_io_data_cbl%vegin_rs20(11) = 1.000000 + pars_io_data_cbl%vegin_wai(11) = 0.000000 + pars_io_data_cbl%vegin_rootbeta(11) = 0.943000 + pars_io_data_cbl%vegin_shelrb(11) = 2.000000 + pars_io_data_cbl%vegin_vegcf(11) = 7.000000 + pars_io_data_cbl%vegin_frac4(11) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(11) = 1.000000 + pars_io_data_cbl%vegin_extkn(11) = 0.001000 + pars_io_data_cbl%vegin_tminvj(11) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(11) = -10.000000 + pars_io_data_cbl%vegin_vbeta(11) = 4.000000 + pars_io_data_cbl%vegin_froot( 1,11) = 0.000000 + pars_io_data_cbl%vegin_froot( 2,11) = 0.000000 + pars_io_data_cbl%vegin_froot( 3,11) = 0.000000 + pars_io_data_cbl%vegin_froot( 4,11) = 0.000000 + pars_io_data_cbl%vegin_froot( 5,11) = 0.000000 + pars_io_data_cbl%vegin_froot( 6,11) = 0.000000 + pars_io_data_cbl%vegin_refl( 1,11) = 0.108000 + pars_io_data_cbl%vegin_taul( 1,11) = 0.075000 + pars_io_data_cbl%vegin_refl( 2,11) = 0.343000 + pars_io_data_cbl%vegin_taul( 2,11) = 0.146000 + pars_io_data_cbl%vegin_refl( 3,11) = 0.010000 + pars_io_data_cbl%vegin_taul( 3,11) = 0.010000 + pars_io_data_cbl%vegin_csoil( 1,11) = 275.000000 + pars_io_data_cbl%vegin_ratecs( 1,11) = 2.000000 + pars_io_data_cbl%vegin_csoil( 2,11) = 314.000000 + pars_io_data_cbl%vegin_ratecs( 2,11) = 0.500000 + pars_io_data_cbl%vegin_cplant( 1,11) = 250.000000 + pars_io_data_cbl%vegin_ratecp( 1,11) = 1.000000 + pars_io_data_cbl%vegin_cplant( 2,11) = 0.000000 + pars_io_data_cbl%vegin_ratecp( 2,11) = 0.030000 + pars_io_data_cbl%vegin_cplant( 3,11) = 500.000000 + pars_io_data_cbl%vegin_ratecp( 3,11) = 0.140000 + pars_io_data_cbl%vegin_a1gs(11) = 9.000000 + pars_io_data_cbl%vegin_d0gs(11) = 1500.000000 + pars_io_data_cbl%vegin_alpha(11) = 0.200000 + pars_io_data_cbl%vegin_convex(11) = 0.700000 + pars_io_data_cbl%vegin_cfrd(11) = 0.015000 + pars_io_data_cbl%vegin_gswmin(11) = 0.010000 + pars_io_data_cbl%vegin_conkc0(11) = 0.000302 + pars_io_data_cbl%vegin_conko0(11) = 0.256000 + pars_io_data_cbl%vegin_ekc(11) = 59430.000000 + pars_io_data_cbl%vegin_eko(11) = 36000.000000 + pars_io_data_cbl%vegin_g0(11) = 0.000000 + pars_io_data_cbl%vegin_g1(11) = 5.248500 + pars_io_data_cbl%vegin_zr(11) = 1.800000 + pars_io_data_cbl%vegin_clitt(11) = 2.000000 + + !PFT: empty + !========================================================= + pars_io_data_cbl%vegin_canst1(12) = 0.100000 + pars_io_data_cbl%vegin_length(12) = 0.030000 + pars_io_data_cbl%vegin_width(12) = 0.003000 + pars_io_data_cbl%vegin_vcmax(12) = 0.000017 + pars_io_data_cbl%vegin_ejmax(12) = 0.000000 + pars_io_data_cbl%vegin_hc(12) = 0.200000 + pars_io_data_cbl%vegin_xfang(12) = 0.100000 + pars_io_data_cbl%vegin_rp20(12) = 1.000000 + pars_io_data_cbl%vegin_rpcoef(12) = 0.083200 + pars_io_data_cbl%vegin_rs20(12) = 0.000000 + pars_io_data_cbl%vegin_wai(12) = 0.000000 + pars_io_data_cbl%vegin_rootbeta(12) = 0.975000 + pars_io_data_cbl%vegin_shelrb(12) = 2.000000 + pars_io_data_cbl%vegin_vegcf(12) = 1.000000 + pars_io_data_cbl%vegin_frac4(12) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(12) = 1.000000 + pars_io_data_cbl%vegin_extkn(12) = 0.001000 + pars_io_data_cbl%vegin_tminvj(12) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(12) = -10.000000 + pars_io_data_cbl%vegin_vbeta(12) = 4.000000 + pars_io_data_cbl%vegin_froot( 1,12) = 0.000000 + pars_io_data_cbl%vegin_froot( 2,12) = 0.000000 + pars_io_data_cbl%vegin_froot( 3,12) = 0.000000 + pars_io_data_cbl%vegin_froot( 4,12) = 0.000000 + pars_io_data_cbl%vegin_froot( 5,12) = 0.000000 + pars_io_data_cbl%vegin_froot( 6,12) = 0.000000 + pars_io_data_cbl%vegin_refl( 1,12) = 0.055000 + pars_io_data_cbl%vegin_taul( 1,12) = 0.023000 + pars_io_data_cbl%vegin_refl( 2,12) = 0.190000 + pars_io_data_cbl%vegin_taul( 2,12) = 0.198000 + pars_io_data_cbl%vegin_refl( 3,12) = 0.010000 + pars_io_data_cbl%vegin_taul( 3,12) = 0.010000 + pars_io_data_cbl%vegin_csoil( 1,12) = 1.000000 + pars_io_data_cbl%vegin_ratecs( 1,12) = 2.000000 + pars_io_data_cbl%vegin_csoil( 2,12) = 1.000000 + pars_io_data_cbl%vegin_ratecs( 2,12) = 0.500000 + pars_io_data_cbl%vegin_cplant( 1,12) = 1.000000 + pars_io_data_cbl%vegin_ratecp( 1,12) = 1.000000 + pars_io_data_cbl%vegin_cplant( 2,12) = 0.000000 + pars_io_data_cbl%vegin_ratecp( 2,12) = 0.030000 + pars_io_data_cbl%vegin_cplant( 3,12) = 1.000000 + pars_io_data_cbl%vegin_ratecp( 3,12) = 0.140000 + pars_io_data_cbl%vegin_a1gs(12) = 9.000000 + pars_io_data_cbl%vegin_d0gs(12) = 1500.000000 + pars_io_data_cbl%vegin_alpha(12) = 0.200000 + pars_io_data_cbl%vegin_convex(12) = 0.700000 + pars_io_data_cbl%vegin_cfrd(12) = 0.015000 + pars_io_data_cbl%vegin_gswmin(12) = 0.010000 + pars_io_data_cbl%vegin_conkc0(12) = 0.000302 + pars_io_data_cbl%vegin_conko0(12) = 0.256000 + pars_io_data_cbl%vegin_ekc(12) = 59430.000000 + pars_io_data_cbl%vegin_eko(12) = 36000.000000 + pars_io_data_cbl%vegin_g0(12) = 0.000000 + pars_io_data_cbl%vegin_g1(12) = 5.248500 + pars_io_data_cbl%vegin_zr(12) = 3.100000 + pars_io_data_cbl%vegin_clitt(12) = 2.000000 + + !PFT: empty + !========================================================= + pars_io_data_cbl%vegin_canst1(13) = 0.100000 + pars_io_data_cbl%vegin_length(13) = 0.242000 + pars_io_data_cbl%vegin_width(13) = 0.015000 + pars_io_data_cbl%vegin_vcmax(13) = 0.000001 + pars_io_data_cbl%vegin_ejmax(13) = 0.000000 + pars_io_data_cbl%vegin_hc(13) = 6.017000 + pars_io_data_cbl%vegin_xfang(13) = 0.000000 + pars_io_data_cbl%vegin_rp20(13) = 1.000000 + pars_io_data_cbl%vegin_rpcoef(13) = 0.083200 + pars_io_data_cbl%vegin_rs20(13) = 1.000000 + pars_io_data_cbl%vegin_wai(13) = 0.000000 + pars_io_data_cbl%vegin_rootbeta(13) = 0.961000 + pars_io_data_cbl%vegin_shelrb(13) = 2.000000 + pars_io_data_cbl%vegin_vegcf(13) = 1.000000 + pars_io_data_cbl%vegin_frac4(13) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(13) = 1.000000 + pars_io_data_cbl%vegin_extkn(13) = 0.001000 + pars_io_data_cbl%vegin_tminvj(13) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(13) = -10.000000 + pars_io_data_cbl%vegin_vbeta(13) = 2.000000 + pars_io_data_cbl%vegin_froot( 1,13) = 0.000000 + pars_io_data_cbl%vegin_froot( 2,13) = 0.000000 + pars_io_data_cbl%vegin_froot( 3,13) = 0.000000 + pars_io_data_cbl%vegin_froot( 4,13) = 0.000000 + pars_io_data_cbl%vegin_froot( 5,13) = 0.000000 + pars_io_data_cbl%vegin_froot( 6,13) = 0.000000 + pars_io_data_cbl%vegin_refl( 1,13) = 0.091000 + pars_io_data_cbl%vegin_taul( 1,13) = 0.059000 + pars_io_data_cbl%vegin_refl( 2,13) = 0.310000 + pars_io_data_cbl%vegin_taul( 2,13) = 0.163000 + pars_io_data_cbl%vegin_refl( 3,13) = 0.010000 + pars_io_data_cbl%vegin_taul( 3,13) = 0.010000 + pars_io_data_cbl%vegin_csoil( 1,13) = 0.100000 + pars_io_data_cbl%vegin_ratecs( 1,13) = 2.000000 + pars_io_data_cbl%vegin_csoil( 2,13) = 0.100000 + pars_io_data_cbl%vegin_ratecs( 2,13) = 0.500000 + pars_io_data_cbl%vegin_cplant( 1,13) = 0.100000 + pars_io_data_cbl%vegin_ratecp( 1,13) = 1.000000 + pars_io_data_cbl%vegin_cplant( 2,13) = 0.000000 + pars_io_data_cbl%vegin_ratecp( 2,13) = 0.030000 + pars_io_data_cbl%vegin_cplant( 3,13) = 0.100000 + pars_io_data_cbl%vegin_ratecp( 3,13) = 0.140000 + pars_io_data_cbl%vegin_a1gs(13) = 9.000000 + pars_io_data_cbl%vegin_d0gs(13) = 1500.000000 + pars_io_data_cbl%vegin_alpha(13) = 0.200000 + pars_io_data_cbl%vegin_convex(13) = 0.700000 + pars_io_data_cbl%vegin_cfrd(13) = 0.015000 + pars_io_data_cbl%vegin_gswmin(13) = 0.010000 + pars_io_data_cbl%vegin_conkc0(13) = 0.000302 + pars_io_data_cbl%vegin_conko0(13) = 0.256000 + pars_io_data_cbl%vegin_ekc(13) = 59430.000000 + pars_io_data_cbl%vegin_eko(13) = 36000.000000 + pars_io_data_cbl%vegin_g0(13) = 0.000000 + pars_io_data_cbl%vegin_g1(13) = 0.000000 + pars_io_data_cbl%vegin_zr(13) = 3.000000 + pars_io_data_cbl%vegin_clitt(13) = 0.000000 + + !PFT: barren + !========================================================= + pars_io_data_cbl%vegin_canst1(14) = 0.100000 + pars_io_data_cbl%vegin_length(14) = 0.030000 + pars_io_data_cbl%vegin_width(14) = 0.001000 + pars_io_data_cbl%vegin_vcmax(14) = 0.000017 + pars_io_data_cbl%vegin_ejmax(14) = 0.000000 + pars_io_data_cbl%vegin_hc(14) = 0.200000 + pars_io_data_cbl%vegin_xfang(14) = 0.000000 + pars_io_data_cbl%vegin_rp20(14) = 1.000000 + pars_io_data_cbl%vegin_rpcoef(14) = 0.083200 + pars_io_data_cbl%vegin_rs20(14) = 0.000000 + pars_io_data_cbl%vegin_wai(14) = 0.000000 + pars_io_data_cbl%vegin_rootbeta(14) = 0.961000 + pars_io_data_cbl%vegin_shelrb(14) = 2.000000 + pars_io_data_cbl%vegin_vegcf(14) = 1.000000 + pars_io_data_cbl%vegin_frac4(14) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(14) = 1.000000 + pars_io_data_cbl%vegin_extkn(14) = 0.001000 + pars_io_data_cbl%vegin_tminvj(14) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(14) = -10.000000 + pars_io_data_cbl%vegin_vbeta(14) = 4.000000 + pars_io_data_cbl%vegin_froot( 1,14) = 0.000000 + pars_io_data_cbl%vegin_froot( 2,14) = 0.000000 + pars_io_data_cbl%vegin_froot( 3,14) = 0.000000 + pars_io_data_cbl%vegin_froot( 4,14) = 0.000000 + pars_io_data_cbl%vegin_froot( 5,14) = 0.000000 + pars_io_data_cbl%vegin_froot( 6,14) = 0.000000 + pars_io_data_cbl%vegin_refl( 1,14) = 0.238000 + pars_io_data_cbl%vegin_taul( 1,14) = 0.039000 + pars_io_data_cbl%vegin_refl( 2,14) = 0.457000 + pars_io_data_cbl%vegin_taul( 2,14) = 0.189000 + pars_io_data_cbl%vegin_refl( 3,14) = 0.010000 + pars_io_data_cbl%vegin_taul( 3,14) = 0.010000 + pars_io_data_cbl%vegin_csoil( 1,14) = 1.000000 + pars_io_data_cbl%vegin_ratecs( 1,14) = 2.000000 + pars_io_data_cbl%vegin_csoil( 2,14) = 1.000000 + pars_io_data_cbl%vegin_ratecs( 2,14) = 0.500000 + pars_io_data_cbl%vegin_cplant( 1,14) = 0.000000 + pars_io_data_cbl%vegin_ratecp( 1,14) = 1.000000 + pars_io_data_cbl%vegin_cplant( 2,14) = 0.000000 + pars_io_data_cbl%vegin_ratecp( 2,14) = 0.030000 + pars_io_data_cbl%vegin_cplant( 3,14) = 0.000000 + pars_io_data_cbl%vegin_ratecp( 3,14) = 0.140000 + pars_io_data_cbl%vegin_a1gs(14) = 9.000000 + pars_io_data_cbl%vegin_d0gs(14) = 1500.000000 + pars_io_data_cbl%vegin_alpha(14) = 0.200000 + pars_io_data_cbl%vegin_convex(14) = 0.700000 + pars_io_data_cbl%vegin_cfrd(14) = 0.015000 + pars_io_data_cbl%vegin_gswmin(14) = 0.010000 + pars_io_data_cbl%vegin_conkc0(14) = 0.000302 + pars_io_data_cbl%vegin_conko0(14) = 0.256000 + pars_io_data_cbl%vegin_ekc(14) = 59430.000000 + pars_io_data_cbl%vegin_eko(14) = 36000.000000 + pars_io_data_cbl%vegin_g0(14) = 0.000000 + pars_io_data_cbl%vegin_g1(14) = 5.248500 + pars_io_data_cbl%vegin_zr(14) = 1.000000 + pars_io_data_cbl%vegin_clitt(14) = 0.000000 + + !PFT: urban + !========================================================= + pars_io_data_cbl%vegin_canst1(15) = 0.100000 + pars_io_data_cbl%vegin_length(15) = 0.030000 + pars_io_data_cbl%vegin_width(15) = 0.001000 + pars_io_data_cbl%vegin_vcmax(15) = 0.000017 + pars_io_data_cbl%vegin_ejmax(15) = 0.000000 + pars_io_data_cbl%vegin_hc(15) = 0.200000 + pars_io_data_cbl%vegin_xfang(15) = 0.000000 + pars_io_data_cbl%vegin_rp20(15) = 1.000000 + pars_io_data_cbl%vegin_rpcoef(15) = 0.083200 + pars_io_data_cbl%vegin_rs20(15) = 0.000000 + pars_io_data_cbl%vegin_wai(15) = 0.000000 + pars_io_data_cbl%vegin_rootbeta(15) = 0.961000 + pars_io_data_cbl%vegin_shelrb(15) = 2.000000 + pars_io_data_cbl%vegin_vegcf(15) = 1.000000 + pars_io_data_cbl%vegin_frac4(15) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(15) = 1.000000 + pars_io_data_cbl%vegin_extkn(15) = 0.001000 + pars_io_data_cbl%vegin_tminvj(15) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(15) = -10.000000 + pars_io_data_cbl%vegin_vbeta(15) = 4.000000 + pars_io_data_cbl%vegin_froot( 1,15) = 0.000000 + pars_io_data_cbl%vegin_froot( 2,15) = 0.000000 + pars_io_data_cbl%vegin_froot( 3,15) = 0.000000 + pars_io_data_cbl%vegin_froot( 4,15) = 0.000000 + pars_io_data_cbl%vegin_froot( 5,15) = 0.000000 + pars_io_data_cbl%vegin_froot( 6,15) = 0.000000 + pars_io_data_cbl%vegin_refl( 1,15) = 0.143000 + pars_io_data_cbl%vegin_taul( 1,15) = 0.023000 + pars_io_data_cbl%vegin_refl( 2,15) = 0.275000 + pars_io_data_cbl%vegin_taul( 2,15) = 0.113000 + pars_io_data_cbl%vegin_refl( 3,15) = 0.010000 + pars_io_data_cbl%vegin_taul( 3,15) = 0.010000 + pars_io_data_cbl%vegin_csoil( 1,15) = 1.000000 + pars_io_data_cbl%vegin_ratecs( 1,15) = 2.000000 + pars_io_data_cbl%vegin_csoil( 2,15) = 1.000000 + pars_io_data_cbl%vegin_ratecs( 2,15) = 0.500000 + pars_io_data_cbl%vegin_cplant( 1,15) = 1.000000 + pars_io_data_cbl%vegin_ratecp( 1,15) = 1.000000 + pars_io_data_cbl%vegin_cplant( 2,15) = 0.000000 + pars_io_data_cbl%vegin_ratecp( 2,15) = 0.030000 + pars_io_data_cbl%vegin_cplant( 3,15) = 1.000000 + pars_io_data_cbl%vegin_ratecp( 3,15) = 0.140000 + pars_io_data_cbl%vegin_a1gs(15) = 9.000000 + pars_io_data_cbl%vegin_d0gs(15) = 1500.000000 + pars_io_data_cbl%vegin_alpha(15) = 0.200000 + pars_io_data_cbl%vegin_convex(15) = 0.700000 + pars_io_data_cbl%vegin_cfrd(15) = 0.015000 + pars_io_data_cbl%vegin_gswmin(15) = 0.010000 + pars_io_data_cbl%vegin_conkc0(15) = 0.000302 + pars_io_data_cbl%vegin_conko0(15) = 0.256000 + pars_io_data_cbl%vegin_ekc(15) = 59430.000000 + pars_io_data_cbl%vegin_eko(15) = 36000.000000 + pars_io_data_cbl%vegin_g0(15) = 0.000000 + pars_io_data_cbl%vegin_g1(15) = 5.248500 + pars_io_data_cbl%vegin_zr(15) = 1.000000 + pars_io_data_cbl%vegin_clitt(15) = 0.000000 + + !PFT: lakes + !========================================================= + pars_io_data_cbl%vegin_canst1(16) = 0.100000 + pars_io_data_cbl%vegin_length(16) = 0.030000 + pars_io_data_cbl%vegin_width(16) = 0.001000 + pars_io_data_cbl%vegin_vcmax(16) = 0.000017 + pars_io_data_cbl%vegin_ejmax(16) = 0.000000 + pars_io_data_cbl%vegin_hc(16) = 0.200000 + pars_io_data_cbl%vegin_xfang(16) = 0.000000 + pars_io_data_cbl%vegin_rp20(16) = 1.000000 + pars_io_data_cbl%vegin_rpcoef(16) = 0.083200 + pars_io_data_cbl%vegin_rs20(16) = 0.000000 + pars_io_data_cbl%vegin_wai(16) = 0.000000 + pars_io_data_cbl%vegin_rootbeta(16) = 0.961000 + pars_io_data_cbl%vegin_shelrb(16) = 2.000000 + pars_io_data_cbl%vegin_vegcf(16) = 1.000000 + pars_io_data_cbl%vegin_frac4(16) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(16) = 1.000000 + pars_io_data_cbl%vegin_extkn(16) = 0.001000 + pars_io_data_cbl%vegin_tminvj(16) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(16) = -10.000000 + pars_io_data_cbl%vegin_vbeta(16) = 4.000000 + pars_io_data_cbl%vegin_froot( 1,16) = 0.000000 + pars_io_data_cbl%vegin_froot( 2,16) = 0.000000 + pars_io_data_cbl%vegin_froot( 3,16) = 0.000000 + pars_io_data_cbl%vegin_froot( 4,16) = 0.000000 + pars_io_data_cbl%vegin_froot( 5,16) = 0.000000 + pars_io_data_cbl%vegin_froot( 6,16) = 0.000000 + pars_io_data_cbl%vegin_refl( 1,16) = 0.143000 + pars_io_data_cbl%vegin_taul( 1,16) = 0.023000 + pars_io_data_cbl%vegin_refl( 2,16) = 0.275000 + pars_io_data_cbl%vegin_taul( 2,16) = 0.113000 + pars_io_data_cbl%vegin_refl( 3,16) = 0.010000 + pars_io_data_cbl%vegin_taul( 3,16) = 0.010000 + pars_io_data_cbl%vegin_csoil( 1,16) = 1.000000 + pars_io_data_cbl%vegin_ratecs( 1,16) = 2.000000 + pars_io_data_cbl%vegin_csoil( 2,16) = 1.000000 + pars_io_data_cbl%vegin_ratecs( 2,16) = 0.500000 + pars_io_data_cbl%vegin_cplant( 1,16) = 1.000000 + pars_io_data_cbl%vegin_ratecp( 1,16) = 1.000000 + pars_io_data_cbl%vegin_cplant( 2,16) = 0.000000 + pars_io_data_cbl%vegin_ratecp( 2,16) = 0.030000 + pars_io_data_cbl%vegin_cplant( 3,16) = 1.000000 + pars_io_data_cbl%vegin_ratecp( 3,16) = 0.140000 + pars_io_data_cbl%vegin_a1gs(16) = 9.000000 + pars_io_data_cbl%vegin_d0gs(16) = 1500.000000 + pars_io_data_cbl%vegin_alpha(16) = 0.200000 + pars_io_data_cbl%vegin_convex(16) = 0.700000 + pars_io_data_cbl%vegin_cfrd(16) = 0.015000 + pars_io_data_cbl%vegin_gswmin(16) = 0.010000 + pars_io_data_cbl%vegin_conkc0(16) = 0.000302 + pars_io_data_cbl%vegin_conko0(16) = 0.256000 + pars_io_data_cbl%vegin_ekc(16) = 59430.000000 + pars_io_data_cbl%vegin_eko(16) = 36000.000000 + pars_io_data_cbl%vegin_g0(16) = 0.000000 + pars_io_data_cbl%vegin_g1(16) = 5.248500 + pars_io_data_cbl%vegin_zr(16) = 1.000000 + pars_io_data_cbl%vegin_clitt(16) = 0.000000 + + !PFT: ice + !========================================================= + pars_io_data_cbl%vegin_canst1(17) = 0.100000 + pars_io_data_cbl%vegin_length(17) = 0.030000 + pars_io_data_cbl%vegin_width(17) = 0.001000 + pars_io_data_cbl%vegin_vcmax(17) = 0.000017 + pars_io_data_cbl%vegin_ejmax(17) = 0.000000 + pars_io_data_cbl%vegin_hc(17) = 0.200000 + pars_io_data_cbl%vegin_xfang(17) = 0.000000 + pars_io_data_cbl%vegin_rp20(17) = 1.000000 + pars_io_data_cbl%vegin_rpcoef(17) = 0.083200 + pars_io_data_cbl%vegin_rs20(17) = 0.000000 + pars_io_data_cbl%vegin_wai(17) = 0.000000 + pars_io_data_cbl%vegin_rootbeta(17) = 0.961000 + pars_io_data_cbl%vegin_shelrb(17) = 2.000000 + pars_io_data_cbl%vegin_vegcf(17) = 1.000000 + pars_io_data_cbl%vegin_frac4(17) = 0.000000 + pars_io_data_cbl%vegin_xalbnir(17) = 1.000000 + pars_io_data_cbl%vegin_extkn(17) = 0.001000 + pars_io_data_cbl%vegin_tminvj(17) = -15.000000 + pars_io_data_cbl%vegin_tmaxvj(17) = -10.000000 + pars_io_data_cbl%vegin_vbeta(17) = 4.000000 + pars_io_data_cbl%vegin_froot( 1,17) = 0.000000 + pars_io_data_cbl%vegin_froot( 2,17) = 0.000000 + pars_io_data_cbl%vegin_froot( 3,17) = 0.000000 + pars_io_data_cbl%vegin_froot( 4,17) = 0.000000 + pars_io_data_cbl%vegin_froot( 5,17) = 0.000000 + pars_io_data_cbl%vegin_froot( 6,17) = 0.000000 + pars_io_data_cbl%vegin_refl( 1,17) = 0.159000 + pars_io_data_cbl%vegin_taul( 1,17) = 0.026000 + pars_io_data_cbl%vegin_refl( 2,17) = 0.305000 + pars_io_data_cbl%vegin_taul( 2,17) = 0.113000 + pars_io_data_cbl%vegin_refl( 3,17) = 0.010000 + pars_io_data_cbl%vegin_taul( 3,17) = 0.010000 + pars_io_data_cbl%vegin_csoil( 1,17) = 1.000000 + pars_io_data_cbl%vegin_ratecs( 1,17) = 2.000000 + pars_io_data_cbl%vegin_csoil( 2,17) = 1.000000 + pars_io_data_cbl%vegin_ratecs( 2,17) = 0.500000 + pars_io_data_cbl%vegin_cplant( 1,17) = 0.000000 + pars_io_data_cbl%vegin_ratecp( 1,17) = 1.000000 + pars_io_data_cbl%vegin_cplant( 2,17) = 0.000000 + pars_io_data_cbl%vegin_ratecp( 2,17) = 0.030000 + pars_io_data_cbl%vegin_cplant( 3,17) = 0.000000 + pars_io_data_cbl%vegin_ratecp( 3,17) = 0.140000 + pars_io_data_cbl%vegin_a1gs(17) = 9.000000 + pars_io_data_cbl%vegin_d0gs(17) = 1500.000000 + pars_io_data_cbl%vegin_alpha(17) = 0.200000 + pars_io_data_cbl%vegin_convex(17) = 0.700000 + pars_io_data_cbl%vegin_cfrd(17) = 0.015000 + pars_io_data_cbl%vegin_gswmin(17) = 0.010000 + pars_io_data_cbl%vegin_conkc0(17) = 0.000302 + pars_io_data_cbl%vegin_conko0(17) = 0.256000 + pars_io_data_cbl%vegin_ekc(17) = 59430.000000 + pars_io_data_cbl%vegin_eko(17) = 36000.000000 + pars_io_data_cbl%vegin_g0(17) = 0.000000 + pars_io_data_cbl%vegin_g1(17) = 5.248500 + pars_io_data_cbl%vegin_zr(17) = 1.000000 + pars_io_data_cbl%vegin_clitt(17) = 0.000000 + + ! new calculation dleaf since April 2012 (cable v1.8 did not use width) + pars_io_data_cbl%vegin_dleaf = SQRT(pars_io_data_cbl%vegin_width * pars_io_data_cbl%vegin_length) + +End subroutine cable_pft_params + +END MODULE cable_pft_params_mod + diff --git a/src/coupled/AM3/initialisation/cable_soil_params.F90 b/src/coupled/AM3/initialisation/cable_soil_params.F90 new file mode 100644 index 000000000..9372e1f92 --- /dev/null +++ b/src/coupled/AM3/initialisation/cable_soil_params.F90 @@ -0,0 +1,150 @@ +MODULE cable_soil_params_mod + + IMPLICIT NONE + +CONTAINS + +subroutine cable_soil_params(pars_io_cbl) + + ! Gets parameter values for each vegetation type and soil type. + +USE params_io_mod_cbl, ONLY: params_io_data_type + + IMPLICIT NONE + + TYPE(params_io_data_type), TARGET :: pars_io_cbl + + + !SOIL parameters: description and corresponding variable name in code. + !SOIL parameters are assigned as TYPE pars_io_cbl%soilin_ but later used as soil% + +!SOIL: Coarse sand/Loamy sand +! ========================================================= + pars_io_cbl%soilin_silt( 1) = 0.080000 + pars_io_cbl%soilin_clay( 1) = 0.090000 + pars_io_cbl%soilin_sand( 1) = 0.830000 + pars_io_cbl%soilin_swilt( 1) = 0.072000 + pars_io_cbl%soilin_sfc( 1) = 0.143000 + pars_io_cbl%soilin_ssat( 1) = 0.398000 + pars_io_cbl%soilin_bch( 1) = 4.200000 + pars_io_cbl%soilin_hyds( 1) = 0.000166 + pars_io_cbl%soilin_sucs( 1) = -0.106000 + pars_io_cbl%soilin_rhosoil( 1) = 1600.000000 + pars_io_cbl%soilin_css( 1) = 850.000000 + + !SOIL: Medium clay loam/silty clay loam/silt loam + !========================================================= + pars_io_cbl%soilin_silt( 2) = 0.330000 + pars_io_cbl%soilin_clay( 2) = 0.300000 + pars_io_cbl%soilin_sand( 2) = 0.370000 + pars_io_cbl%soilin_swilt( 2) = 0.216000 + pars_io_cbl%soilin_sfc( 2) = 0.301000 + pars_io_cbl%soilin_ssat( 2) = 0.479000 + pars_io_cbl%soilin_bch( 2) = 7.100000 + pars_io_cbl%soilin_hyds( 2) = 0.000004 + pars_io_cbl%soilin_sucs( 2) = -0.591000 + pars_io_cbl%soilin_rhosoil( 2) = 1600.000000 + pars_io_cbl%soilin_css( 2) = 850.000000 + + !SOIL: Fine clay + !========================================================= + pars_io_cbl%soilin_silt( 3) = 0.170000 + pars_io_cbl%soilin_clay( 3) = 0.670000 + pars_io_cbl%soilin_sand( 3) = 0.160000 + pars_io_cbl%soilin_swilt( 3) = 0.286000 + pars_io_cbl%soilin_sfc( 3) = 0.367000 + pars_io_cbl%soilin_ssat( 3) = 0.482000 + pars_io_cbl%soilin_bch( 3) = 11.400000 + pars_io_cbl%soilin_hyds( 3) = 0.000001 + pars_io_cbl%soilin_sucs( 3) = -0.405000 + pars_io_cbl%soilin_rhosoil( 3) = 1381.000000 + pars_io_cbl%soilin_css( 3) = 850.000000 + + !SOIL: Coarse-medium sandy loam/loam + !========================================================= + pars_io_cbl%soilin_silt( 4) = 0.200000 + pars_io_cbl%soilin_clay( 4) = 0.200000 + pars_io_cbl%soilin_sand( 4) = 0.600000 + pars_io_cbl%soilin_swilt( 4) = 0.135000 + pars_io_cbl%soilin_sfc( 4) = 0.218000 + pars_io_cbl%soilin_ssat( 4) = 0.443000 + pars_io_cbl%soilin_bch( 4) = 5.150000 + pars_io_cbl%soilin_hyds( 4) = 0.000021 + pars_io_cbl%soilin_sucs( 4) = -0.348000 + pars_io_cbl%soilin_rhosoil( 4) = 1373.000000 + pars_io_cbl%soilin_css( 4) = 850.000000 + + !SOIL: Coarse-fine sandy clay + !========================================================= + pars_io_cbl%soilin_silt( 5) = 0.060000 + pars_io_cbl%soilin_clay( 5) = 0.420000 + pars_io_cbl%soilin_sand( 5) = 0.520000 + pars_io_cbl%soilin_swilt( 5) = 0.219000 + pars_io_cbl%soilin_sfc( 5) = 0.310000 + pars_io_cbl%soilin_ssat( 5) = 0.426000 + pars_io_cbl%soilin_bch( 5) = 10.400000 + pars_io_cbl%soilin_hyds( 5) = 0.000002 + pars_io_cbl%soilin_sucs( 5) = -0.153000 + pars_io_cbl%soilin_rhosoil( 5) = 1476.000000 + pars_io_cbl%soilin_css( 5) = 850.000000 + + !SOIL: Medium-fine silty clay + !========================================================= + pars_io_cbl%soilin_silt( 6) = 0.250000 + pars_io_cbl%soilin_clay( 6) = 0.480000 + pars_io_cbl%soilin_sand( 6) = 0.270000 + pars_io_cbl%soilin_swilt( 6) = 0.283000 + pars_io_cbl%soilin_sfc( 6) = 0.370000 + pars_io_cbl%soilin_ssat( 6) = 0.482000 + pars_io_cbl%soilin_bch( 6) = 10.400000 + pars_io_cbl%soilin_hyds( 6) = 0.000001 + pars_io_cbl%soilin_sucs( 6) = -0.490000 + pars_io_cbl%soilin_rhosoil( 6) = 1521.000000 + pars_io_cbl%soilin_css( 6) = 850.000000 + + !SOIL: Coarse-medium-fine sandy clay loam + !========================================================= + pars_io_cbl%soilin_silt( 7) = 0.150000 + pars_io_cbl%soilin_clay( 7) = 0.270000 + pars_io_cbl%soilin_sand( 7) = 0.580000 + pars_io_cbl%soilin_swilt( 7) = 0.175000 + pars_io_cbl%soilin_sfc( 7) = 0.255000 + pars_io_cbl%soilin_ssat( 7) = 0.420000 + pars_io_cbl%soilin_bch( 7) = 7.120000 + pars_io_cbl%soilin_hyds( 7) = 0.000006 + pars_io_cbl%soilin_sucs( 7) = -0.299000 + pars_io_cbl%soilin_rhosoil( 7) = 1373.000000 + pars_io_cbl%soilin_css( 7) = 850.000000 + + !SOIL: Organic peat + !========================================================= + pars_io_cbl%soilin_silt( 8) = 0.700000 + pars_io_cbl%soilin_clay( 8) = 0.170000 + pars_io_cbl%soilin_sand( 8) = 0.130000 + pars_io_cbl%soilin_swilt( 8) = 0.395000 + pars_io_cbl%soilin_sfc( 8) = 0.450000 + pars_io_cbl%soilin_ssat( 8) = 0.451000 + pars_io_cbl%soilin_bch( 8) = 5.830000 + pars_io_cbl%soilin_hyds( 8) = 0.000800 + pars_io_cbl%soilin_sucs( 8) = -0.356000 + pars_io_cbl%soilin_rhosoil( 8) = 1537.000000 + pars_io_cbl%soilin_css( 8) = 1920.000000 + + !SOIL: Permanent ice + !========================================================= + pars_io_cbl%soilin_silt( 9) = 0.330000 + pars_io_cbl%soilin_clay( 9) = 0.300000 + pars_io_cbl%soilin_sand( 9) = 0.370000 + pars_io_cbl%soilin_swilt( 9) = 0.216000 + pars_io_cbl%soilin_sfc( 9) = 0.301000 + pars_io_cbl%soilin_ssat( 9) = 0.479000 + pars_io_cbl%soilin_bch( 9) = 7.100000 + pars_io_cbl%soilin_hyds( 9) = 0.000001 + pars_io_cbl%soilin_sucs( 9) = -0.153000 + pars_io_cbl%soilin_rhosoil( 9) = 917.000000 + pars_io_cbl%soilin_css( 9) = 2100.000000 + +End subroutine cable_soil_params + +END MODULE cable_soil_params_mod + diff --git a/src/coupled/AM3/initialisation/init_cable_working_vars.F90 b/src/coupled/AM3/initialisation/init_cable_working_vars.F90 new file mode 100644 index 000000000..5053cbba4 --- /dev/null +++ b/src/coupled/AM3/initialisation/init_cable_working_vars.F90 @@ -0,0 +1,63 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** + +MODULE init_cable_work_mod + +!------------------------------------------------------------------------------ +! Description: +! Main driver to dec/alloc/initialize CABLE prognostic variables +! +! This MODULE is USEd in: +! init.F90 +! +! This MODULE contains 1 public Subroutine: +! init_cable_work +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +!------------------------------------------------------------------------------ + +IMPLICIT NONE + +PUBLIC :: init_cable_work +PRIVATE + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='INIT_CABLE_WORK_MOD' + +CONTAINS + +SUBROUTINE init_cable_work(row_length, rows, land_pts, nsurft, sm_levels, lsm_id, cable, & + work_cbl, work_cbl_data ) + +! Description: +! Nothing further to add to the module description. + +USE work_vars_mod_cbl, ONLY: work_vars_type, & + work_vars_data_type, & + alloc_work_vars_cbl, & + assoc_work_vars_cbl + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: row_length, rows, land_pts, nsurft,sm_levels +INTEGER, INTENT(IN) :: lsm_id, cable +TYPE(work_vars_data_type), INTENT(IN OUT) :: work_cbl_data +TYPE(work_vars_type), INTENT(IN OUT) :: work_cbl + +CALL alloc_work_vars_cbl(row_length, rows, land_pts, nsurft, sm_levels, & + lsm_id, cable, work_cbl_data ) +CALL assoc_work_vars_cbl(work_cbl, work_cbl_data ) + +RETURN + +END SUBROUTINE init_cable_work + +END MODULE init_cable_work_mod diff --git a/src/coupled/AM3/initialisation/init_soilin_cbl.inc b/src/coupled/AM3/initialisation/init_soilin_cbl.inc new file mode 100644 index 000000000..13b2efbc3 --- /dev/null +++ b/src/coupled/AM3/initialisation/init_soilin_cbl.inc @@ -0,0 +1,187 @@ +! *****************************COPYRIGHT************************************** +! (C) Crown copyright Met Office. All rights reserved. +! For further details please refer to the file COPYRIGHT.txt +! which you should have received as part of this distribution. +! *****************************COPYRIGHT************************************** + +SUBROUTINE init_soilin_cbl(nml_dir) + +!----------------------------------------------------------------------------- +! Description: +! Initialises the non-vegetation parameters +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in TECHNICAL +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!----------------------------------------------------------------------------- + +USE missing_data_mod, ONLY: & +! imported scalar parameters + rmdi + +USE io_constants, ONLY: namelist_unit + +USE string_utils_mod, ONLY: to_string +USE errormessagelength_mod, ONLY: errormessagelength + +USE grid_constants_mod_cbl, ONLY: nsoil_max ! # of soil types [9] +USE cable_fields_mod, ONLY: pars_io_data_cbl + +IMPLICIT NONE + +! Arguments +CHARACTER(LEN=*), INTENT(IN) :: nml_dir ! The directory containing the + ! namelists +! Work variables +INTEGER :: ERROR ! Error indicator +CHARACTER(LEN=errormessagelength) :: iomessage + +CHARACTER(LEN=*), PARAMETER :: routinename='INIT_SOILIN_CABLE' + +!----------------------------------------------------------------------------- + +REAL :: & + silt_io(nsoil_max), & + clay_io(nsoil_max), & + sand_io(nsoil_max), & + swilt_io(nsoil_max), & + sfc_io(nsoil_max), & + ssat_io(nsoil_max), & + bch_io(nsoil_max), & + hyds_io(nsoil_max), & + sucs_io(nsoil_max), & + rhosoil_io(nsoil_max), & + css_io(nsoil_max) + +!----------------------------------------------------------------------------- +! Namelist definition +!----------------------------------------------------------------------------- +NAMELIST / cable_soilparm/ silt_io, clay_io, sand_io, swilt_io, & + sfc_io, ssat_io, bch_io, hyds_io, sucs_io, rhosoil_io, css_io + +!----------------------------------------------------------------------------- +! Initialise namelist values before reading them +!----------------------------------------------------------------------------- +silt_io(:nsoil_max) = rmdi +clay_io(:nsoil_max) = rmdi +sand_io(:nsoil_max) = rmdi +swilt_io(:nsoil_max) = rmdi +sfc_io(:nsoil_max) = rmdi +ssat_io(:nsoil_max) = rmdi +bch_io(:nsoil_max) = rmdi +hyds_io(:nsoil_max) = rmdi +sucs_io(:nsoil_max) = rmdi +rhosoil_io(:nsoil_max) = rmdi +css_io(:nsoil_max) = rmdi + +!----------------------------------------------------------------------------- +! Read namelist +!----------------------------------------------------------------------------- +CALL log_info(routinename, "Reading CABLE_SOILPARM namelist...") + +! Open the CABLE soil parameters namelist file +OPEN(namelist_unit, FILE=(TRIM(nml_dir) // '/' // & + 'cable_soilparm.nml'), & + STATUS='old', POSITION='rewind', ACTION='read', IOSTAT = ERROR, & + IOMSG = iomessage) +IF ( ERROR /= 0 ) & + CALL log_fatal(routinename, & + "Error opening namelist file cable_soilparm.nml " // & + "(IOSTAT=" // TRIM(to_string(ERROR)) // " IOMSG=" // & + TRIM(iomessage) // ")") + +READ(namelist_unit, NML = cable_soilparm, IOSTAT = ERROR, & + IOMSG = iomessage) +IF ( ERROR /= 0 ) & + CALL log_fatal(routinename, & + "Error reading namelist CABLE_SOILPARM " // & + "(IOSTAT=" // TRIM(to_string(ERROR)) // " IOMSG=" // & + TRIM(iomessage) // ")") + +! Close the namelist file +CLOSE(namelist_unit, IOSTAT = ERROR, IOMSG = iomessage) +IF ( ERROR /= 0 ) & + CALL log_fatal(routinename, & + "Error closing namelist file cable_soilparm.nml " // & + "(IOSTAT=" // TRIM(to_string(ERROR)) // " IOMSG=" // & + TRIM(iomessage) // ")") + + +!----------------------------------------------------------------------------- +! Process the namelist values +!----------------------------------------------------------------------------- +! Copy values from dedicated I/O arrays into the soil parameter data type +pars_io_data_cbl%soilin_silt(1:nsoil_max) = silt_io(1:nsoil_max) +pars_io_data_cbl%soilin_clay(1:nsoil_max) = clay_io(1:nsoil_max) +pars_io_data_cbl%soilin_sand(1:nsoil_max) = sand_io(1:nsoil_max) +pars_io_data_cbl%soilin_swilt(1:nsoil_max) = swilt_io(1:nsoil_max) +pars_io_data_cbl%soilin_sfc(1:nsoil_max) = sfc_io(1:nsoil_max) +pars_io_data_cbl%soilin_ssat(1:nsoil_max) = ssat_io(1:nsoil_max) +pars_io_data_cbl%soilin_bch(1:nsoil_max) = bch_io(1:nsoil_max) +pars_io_data_cbl%soilin_hyds(1:nsoil_max) = hyds_io(1:nsoil_max) +pars_io_data_cbl%soilin_sucs(1:nsoil_max) = sucs_io(1:nsoil_max) +pars_io_data_cbl%soilin_rhosoil(1:nsoil_max) = rhosoil_io(1:nsoil_max) +pars_io_data_cbl%soilin_css(1:nsoil_max) = css_io(1:nsoil_max) + +!----------------------------------------------------------------------------- +! Check that all variables were present in the namelist. +! The namelist variables were initialised to rmdi. +!----------------------------------------------------------------------------- +ERROR = 0 +IF ( ANY( ABS( pars_io_data_cbl%soilin_silt(1:nsoil_max) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for silt") +END IF +IF ( ANY( ABS( pars_io_data_cbl%soilin_clay(1:nsoil_max) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for clay") +END IF +IF ( ANY( ABS( pars_io_data_cbl%soilin_sand(1:nsoil_max) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for sand") +END IF +IF ( ANY( ABS( pars_io_data_cbl%soilin_swilt(1:nsoil_max) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for swilt") +END IF +IF ( ANY( ABS( pars_io_data_cbl%soilin_sfc(1:nsoil_max) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for sfc") +END IF +IF ( ANY( ABS( pars_io_data_cbl%soilin_ssat(1:nsoil_max) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for ssat") +END IF +IF ( ANY( ABS( pars_io_data_cbl%soilin_bch(1:nsoil_max) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for bch") +END IF +IF ( ANY( ABS( pars_io_data_cbl%soilin_hyds(1:nsoil_max) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for hyds") +END IF +IF ( ANY( ABS( pars_io_data_cbl%soilin_sucs(1:nsoil_max) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for sucs") +END IF +IF ( ANY( ABS( pars_io_data_cbl%soilin_rhosoil(1:nsoil_max) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for rhosoil") +END IF +IF ( ANY( ABS( pars_io_data_cbl%soilin_css(1:nsoil_max) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for css") +END IF + +IF ( ERROR /= 0 ) & + CALL log_fatal(routinename, & + "Variable(s) missing from namelist - see earlier " // & + "error message(s)") + +RETURN + +END SUBROUTINE init_soilin_cbl + diff --git a/src/coupled/AM3/initialisation/init_vegin_cbl.inc b/src/coupled/AM3/initialisation/init_vegin_cbl.inc new file mode 100644 index 000000000..4ab1b9a7e --- /dev/null +++ b/src/coupled/AM3/initialisation/init_vegin_cbl.inc @@ -0,0 +1,479 @@ + +SUBROUTINE init_vegin_cbl(nml_dir,progs) + +!----------------------------------------------------------------------------- +! Description: +! Reads the JULES_PFT_PARAMS_CABLE namelist for standalone runs +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in TECHNICAL +! +! Code Description: +! Language: Fortran 90. +! This code is written to JULES coding standards v1. +!----------------------------------------------------------------------------- + +USE missing_data_mod, ONLY: & +! imported scalar parameters + rmdi +USE io_constants, ONLY: namelist_unit + +USE string_utils_mod, ONLY: to_string + +USE errormessagelength_mod, ONLY: errormessagelength + +USE logging_mod, ONLY: log_info, log_fatal + +USE jules_surface_types_mod, ONLY: ntype, npft + +USE ancil_info, ONLY: land_pts + +USE grid_constants_mod_cbl, ONLY: nsl, nscs, nvcs, nrb + +USE max_dimensions, ONLY: ntype_max + +USE prognostics, ONLY: progs_type +USE cable_fields_mod, ONLY: pars_io_data_cbl, pars_io_cbl + +USE params_io_mod_cbl, ONLY: params_io_assoc_cbl + +IMPLICIT NONE + +! Arguments +CHARACTER(LEN=*), INTENT(IN) :: nml_dir ! The directory containing the + ! namelists +!TYPES containing the data +TYPE(progs_type), INTENT(IN OUT) :: progs + +! Work variables +INTEGER :: ERROR ! Error indicator +CHARACTER(LEN=errormessagelength) :: iomessage + +CHARACTER(LEN=*), PARAMETER :: routinename='INIT_VEGIN_CABLE' + +! With some compilers, namelists cannot contain multidimensional arrays. +! Therefore, an input type without multidimensional arrays is used to read +! in the the values from the namelist, and these values will then be +! transferred to the desired data type which does contain multidimensional +! arrays + +! Whereas in JULES PFT parameters are only used for veg types, in CABLE they +! are used for both. Therefore CABLE PFT arrays need to be allocated ntype_max, +! which equals (npft_max + nvg_max). + +REAL :: & + canst1_io(ntype_max), & + length_io(ntype_max), & + width_io(ntype_max), & + vcmax_io(ntype_max), & + ejmax_io(ntype_max), & + hc_io(ntype_max), & + xfang_io(ntype_max), & + rp20_io(ntype_max), & + rpcoef_io(ntype_max), & + rs20_io(ntype_max), & + wai_io(ntype_max), & + rootbeta_io(ntype_max), & + shelrb_io(ntype_max), & + vegcf_io(ntype_max), & + frac4_io(ntype_max), & + xalbnir_io(ntype_max), & + extkn_io(ntype_max), & + tminvj_io(ntype_max), & + tmaxvj_io(ntype_max), & + vbeta_io(ntype_max), & + a1gs_io(ntype_max), & + d0gs_io(ntype_max), & + alpha_io(ntype_max), & + convex_io(ntype_max), & + cfrd_io(ntype_max), & + gswmin_io(ntype_max), & + conkc0_io(ntype_max), & + conko0_io(ntype_max), & + ekc_io(ntype_max), & + eko_io(ntype_max), & + g0_io(ntype_max), & + g1_io(ntype_max), & + zr_io(ntype_max), & + clitt_io(ntype_max), & + froot1_io(ntype_max), & + froot2_io(ntype_max), & + froot3_io(ntype_max), & + froot4_io(ntype_max), & + froot5_io(ntype_max), & + froot6_io(ntype_max), & + csoil1_io(ntype_max), & + csoil2_io(ntype_max), & + ratecs1_io(ntype_max), & + ratecs2_io(ntype_max), & + cplant1_io(ntype_max), & + cplant2_io(ntype_max), & + cplant3_io(ntype_max), & + ratecp1_io(ntype_max), & + ratecp2_io(ntype_max), & + ratecp3_io(ntype_max), & + refl1_io(ntype_max), & + refl2_io(ntype_max), & + refl3_io(ntype_max), & + taul1_io(ntype_max), & + taul2_io(ntype_max), & + taul3_io(ntype_max), & + lai_io(ntype_max) + +!----------------------------------------------------------------------------- +! Namelist definition +!----------------------------------------------------------------------------- +NAMELIST / cable_pftparm/ canst1_io, length_io, width_io, vcmax_io, & + ejmax_io, hc_io, xfang_io, rp20_io, rpcoef_io, rs20_io, wai_io, & + rootbeta_io, shelrb_io, vegcf_io, frac4_io, xalbnir_io, extkn_io, & + tminvj_io, tmaxvj_io, vbeta_io, a1gs_io, d0gs_io, alpha_io, & + convex_io, cfrd_io, gswmin_io, conkc0_io, conko0_io, ekc_io, & + eko_io, g0_io, g1_io, zr_io, clitt_io, froot1_io, froot2_io, & + froot3_io, froot4_io, froot5_io, froot6_io, cplant1_io, & + cplant2_io, cplant3_io, csoil1_io, csoil2_io, ratecp1_io, & + ratecp2_io, ratecp3_io, ratecs1_io, ratecs2_io, refl1_io, & + refl2_io, refl3_io, taul1_io, taul2_io, taul3_io, lai_io + +!----------------------------------------------------------------------------- +! Initialise namelist values before reading them +!----------------------------------------------------------------------------- +canst1_io(:ntype) = rmdi +length_io(:ntype) = rmdi +width_io(:ntype) = rmdi +vcmax_io(:ntype) = rmdi +ejmax_io(:ntype) = rmdi +hc_io(:ntype) = rmdi +xfang_io(:ntype) = rmdi +rp20_io(:ntype) = rmdi +rpcoef_io(:ntype) = rmdi +rs20_io(:ntype) = rmdi +wai_io(:ntype) = rmdi +rootbeta_io(:ntype) = rmdi +shelrb_io(:ntype) = rmdi +vegcf_io(:ntype) = rmdi +frac4_io(:ntype) = rmdi +xalbnir_io(:ntype) = rmdi +extkn_io(:ntype) = rmdi +tminvj_io(:ntype) = rmdi +tmaxvj_io(:ntype) = rmdi +vbeta_io(:ntype) = rmdi +a1gs_io(:ntype) = rmdi +d0gs_io(:ntype) = rmdi +alpha_io(:ntype) = rmdi +convex_io(:ntype) = rmdi +cfrd_io(:ntype) = rmdi +gswmin_io(:ntype) = rmdi +conkc0_io(:ntype) = rmdi +conko0_io(:ntype) = rmdi +ekc_io(:ntype) = rmdi +eko_io(:ntype) = rmdi +g0_io(:ntype) = rmdi +g1_io(:ntype) = rmdi +zr_io(:ntype) = rmdi +clitt_io(:ntype) = rmdi +froot1_io(:ntype) = rmdi +froot2_io(:ntype) = rmdi +froot3_io(:ntype) = rmdi +froot4_io(:ntype) = rmdi +froot5_io(:ntype) = rmdi +froot6_io(:ntype) = rmdi +cplant1_io(:ntype) = rmdi +cplant2_io(:ntype) = rmdi +cplant3_io(:ntype) = rmdi +csoil1_io(:ntype) = rmdi +csoil2_io(:ntype) = rmdi +ratecp1_io(:ntype) = rmdi +ratecp2_io(:ntype) = rmdi +ratecp3_io(:ntype) = rmdi +ratecs1_io(:ntype) = rmdi +ratecs2_io(:ntype) = rmdi +refl1_io(:ntype) = rmdi +refl2_io(:ntype) = rmdi +refl3_io(:ntype) = rmdi +taul1_io(:ntype) = rmdi +taul2_io(:ntype) = rmdi +taul3_io(:ntype) = rmdi +lai_io(:ntype) = rmdi + +!----------------------------------------------------------------------------- +! Read namelist +!----------------------------------------------------------------------------- +CALL log_info(routinename, "Reading CABLE_PFTPARM namelist...") + +OPEN(namelist_unit, FILE=(TRIM(nml_dir) // '/' // 'pft_params.nml'), & + STATUS='old', POSITION='rewind', ACTION='read', IOSTAT = ERROR,& + IOMSG = iomessage) +IF ( ERROR /= 0 ) & + CALL log_fatal(routinename, & + "Error opening namelist file pft_params.nml " // & + "(IOSTAT=" // TRIM(to_string(ERROR)) // " IOMSG=" // & + TRIM(iomessage) // ")") + +READ(namelist_unit, NML = cable_pftparm, IOSTAT = ERROR, IOMSG = iomessage) +IF ( ERROR /= 0 ) & + CALL log_fatal(routinename, & + "Error reading namelist CABLE_PFTPARM " // & + "(IOSTAT=" // TRIM(to_string(ERROR)) // " IOMSG=" // & + TRIM(iomessage) // ")") + +CLOSE(namelist_unit, IOSTAT = ERROR, IOMSG = iomessage) +IF ( ERROR /= 0 ) & + CALL log_fatal(routinename, & + "Error closing namelist file pft_params.nml " // & + "(IOSTAT=" // TRIM(to_string(ERROR)) // " IOMSG=" // & + TRIM(iomessage) // ")") + +!----------------------------------------------------------------------------- +! Transfer values from io values to vegin +!----------------------------------------------------------------------------- + +pars_io_data_cbl%vegin_canst1(:ntype) = canst1_io(:ntype) +pars_io_data_cbl%vegin_length(:ntype) = length_io(:ntype) +pars_io_data_cbl%vegin_width(:ntype) = width_io(:ntype) +pars_io_data_cbl%vegin_vcmax(:ntype) = vcmax_io(:ntype) +pars_io_data_cbl%vegin_ejmax(:ntype) = ejmax_io(:ntype) +pars_io_data_cbl%vegin_hc(:ntype) = hc_io(:ntype) +pars_io_data_cbl%vegin_xfang(:ntype) = xfang_io(:ntype) +pars_io_data_cbl%vegin_rp20(:ntype) = rp20_io(:ntype) +pars_io_data_cbl%vegin_rpcoef(:ntype) = rpcoef_io(:ntype) +pars_io_data_cbl%vegin_rs20(:ntype) = rs20_io(:ntype) +pars_io_data_cbl%vegin_wai(:ntype) = wai_io(:ntype) +pars_io_data_cbl%vegin_rootbeta(:ntype) = rootbeta_io(:ntype) +pars_io_data_cbl%vegin_shelrb(:ntype) = shelrb_io(:ntype) +pars_io_data_cbl%vegin_vegcf(:ntype) = vegcf_io(:ntype) +pars_io_data_cbl%vegin_frac4(:ntype) = frac4_io(:ntype) +pars_io_data_cbl%vegin_xalbnir(:ntype) = xalbnir_io(:ntype) +pars_io_data_cbl%vegin_extkn(:ntype) = extkn_io(:ntype) +pars_io_data_cbl%vegin_tminvj(:ntype) = tminvj_io(:ntype) +pars_io_data_cbl%vegin_tmaxvj(:ntype) = tmaxvj_io(:ntype) +pars_io_data_cbl%vegin_vbeta(:ntype) = vbeta_io(:ntype) +pars_io_data_cbl%vegin_a1gs(:ntype) = a1gs_io(:ntype) +pars_io_data_cbl%vegin_d0gs(:ntype) = d0gs_io(:ntype) +pars_io_data_cbl%vegin_alpha(:ntype) = alpha_io(:ntype) +pars_io_data_cbl%vegin_convex(:ntype) = convex_io(:ntype) +pars_io_data_cbl%vegin_cfrd(:ntype) = cfrd_io(:ntype) +pars_io_data_cbl%vegin_gswmin(:ntype) = gswmin_io(:ntype) +pars_io_data_cbl%vegin_conkc0(:ntype) = conkc0_io(:ntype) +pars_io_data_cbl%vegin_conko0(:ntype) = conko0_io(:ntype) +pars_io_data_cbl%vegin_ekc(:ntype) = ekc_io(:ntype) +pars_io_data_cbl%vegin_eko(:ntype) = eko_io(:ntype) +pars_io_data_cbl%vegin_g0(:ntype) = g0_io(:ntype) +pars_io_data_cbl%vegin_g1(:ntype) = g1_io(:ntype) +pars_io_data_cbl%vegin_zr(:ntype) = zr_io(:ntype) +pars_io_data_cbl%vegin_clitt(:ntype) = clitt_io(:ntype) +pars_io_data_cbl%vegin_froot(1,:ntype) = froot1_io(:ntype) +pars_io_data_cbl%vegin_froot(2,:ntype) = froot2_io(:ntype) +pars_io_data_cbl%vegin_froot(3,:ntype) = froot3_io(:ntype) +pars_io_data_cbl%vegin_froot(4,:ntype) = froot4_io(:ntype) +pars_io_data_cbl%vegin_froot(5,:ntype) = froot5_io(:ntype) +pars_io_data_cbl%vegin_froot(6,:ntype) = froot6_io(:ntype) +pars_io_data_cbl%vegin_cplant(1,:ntype) = cplant1_io(:ntype) +pars_io_data_cbl%vegin_cplant(2,:ntype) = cplant2_io(:ntype) +pars_io_data_cbl%vegin_cplant(3,:ntype) = cplant3_io(:ntype) +pars_io_data_cbl%vegin_csoil(1,:ntype) = csoil1_io(:ntype) +pars_io_data_cbl%vegin_csoil(2,:ntype) = csoil2_io(:ntype) +pars_io_data_cbl%vegin_ratecp(1,:ntype) = ratecp1_io(:ntype) +pars_io_data_cbl%vegin_ratecp(2,:ntype) = ratecp2_io(:ntype) +pars_io_data_cbl%vegin_ratecp(3,:ntype) = ratecp3_io(:ntype) +pars_io_data_cbl%vegin_ratecs(1,:ntype) = ratecs1_io(:ntype) +pars_io_data_cbl%vegin_ratecs(2,:ntype) = ratecs2_io(:ntype) +pars_io_data_cbl%vegin_refl(1,:ntype) = refl1_io(:ntype) +pars_io_data_cbl%vegin_refl(2,:ntype) = refl2_io(:ntype) +pars_io_data_cbl%vegin_refl(3,:ntype) = refl3_io(:ntype) +pars_io_data_cbl%vegin_taul(1,:ntype) = taul1_io(:ntype) +pars_io_data_cbl%vegin_taul(2,:ntype) = taul2_io(:ntype) +pars_io_data_cbl%vegin_taul(3,:ntype) = taul3_io(:ntype) +progs%canht_pft(:,:npft) = SPREAD(hc_io(1:npft), 1, land_pts) +progs%lai_pft(:,:npft) = SPREAD(lai_io(1:npft), 1, land_pts) + +!----------------------------------------------------------------------------- +! Check that all required variables were present in the namelist. +! The namelist variables were initialised to rmdi. +! Some configurations don't need all parameters but for now we insist on +! getting all parameters (and that there are not rmdi!). +!----------------------------------------------------------------------------- +ERROR = 0 +IF ( ANY( ABS( pars_io_data_cbl%vegin_canst1(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for canst1") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_length(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for length") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_width(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for width") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_vcmax(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for vcmax") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_ejmax(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for ejmax") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_hc(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for hc") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_xfang(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for xfang") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_rp20(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for rp20") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_rpcoef(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for rpcoef") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_rs20(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for rs20") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_wai(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for wai") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_rootbeta(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for rootbeta") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_shelrb(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for shelrb") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_vegcf(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for vegcf") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_frac4(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for frac4") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_xalbnir(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for xalbnir") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_extkn(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for extkni") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_tminvj(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for tminvj") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_tmaxvj(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for tmaxvj") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_vbeta(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for vbeta") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_a1gs(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for a1hs") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_d0gs(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for d0gs") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_alpha(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for alpha") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_convex(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for convex") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_cfrd(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for cfrd") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_gswmin(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for gswmin") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_conkc0(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for conkc0") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_conko0(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for conko0") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_ekc(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for ekc") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_eko(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for eko") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_g0(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for g0") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_g1(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for g1") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_zr(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for zr") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_clitt(:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for clitt") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_froot(:,:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for froot") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_cplant(:,:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for cplant") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_csoil(:,:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for csoil") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_ratecp(:,:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for ratecp") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_ratecs(:,:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for ratecs") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_refl(:,:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for refl") +END IF +IF ( ANY( ABS( pars_io_data_cbl%vegin_taul(:,:ntype) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for taul") +END IF +IF ( ANY( ABS( progs%canht_pft(:,:) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for hc") +END IF +IF ( ANY( ABS( progs%lai_pft(:,:) - rmdi ) < EPSILON(1.0) ) ) THEN + ERROR = 1 + CALL log_error(routinename, "No value for lai") +END IF + +IF ( ERROR /= 0 ) & + CALL log_fatal(routinename, & + "Variable(s) missing from namelist - see earlier " // & + "error message(s)") + +pars_io_data_cbl%vegin_dleaf(:) = SQRT(pars_io_data_cbl%vegin_width(:) * pars_io_data_cbl%vegin_length(:)) + +CALL params_io_assoc_cbl(pars_io_cbl,pars_io_data_cbl) + +END SUBROUTINE init_vegin_cbl + diff --git a/src/coupled/AM3/initialisation/prognostics/init_cable_progs.F90 b/src/coupled/AM3/initialisation/prognostics/init_cable_progs.F90 new file mode 100644 index 000000000..d06626097 --- /dev/null +++ b/src/coupled/AM3/initialisation/prognostics/init_cable_progs.F90 @@ -0,0 +1,65 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** + +MODULE init_cable_progs_mod + +!------------------------------------------------------------------------------ +! Description: +! Main driver to dec/alloc/initialize CABLE prognostic variables +! +! This MODULE is USEd: +! init.F90 +! +! This MODULE contains 1 public Subroutine: +! init_cable_progs +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +!------------------------------------------------------------------------------ + +IMPLICIT NONE + +PUBLIC :: init_cable_progs +PRIVATE + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='INIT_CABLE_PROGS_MOD' + +CONTAINS + +SUBROUTINE init_cable_progs( land_pts, nsurft, sm_levels, lsm_id, cable, & + progs_cbl_vars, progs_cbl_vars_data ) + +! Description: +! Nothing further to add to the module description + +!USE read_cable_progs_mod, ONLY: read_cable_progs +USE progs_cbl_vars_mod, ONLY: progs_cbl_vars_type, & + progs_cbl_vars_data_type, & + progs_cbl_vars_alloc, & + progs_cbl_vars_assoc + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: land_pts, nsurft,sm_levels +INTEGER, INTENT(IN) :: lsm_id, cable +TYPE(progs_cbl_vars_data_type), INTENT(IN OUT) :: progs_cbl_vars_data +TYPE(progs_cbl_vars_type), INTENT(IN OUT) :: progs_cbl_vars + +CALL progs_cbl_vars_alloc(land_pts, nsurft, sm_levels, lsm_id, cable, & + progs_cbl_vars_data ) +CALL progs_cbl_vars_assoc(progs_cbl_vars, progs_cbl_vars_data ) +!CALL read_cable_progs() + +RETURN + +END SUBROUTINE init_cable_progs + +END MODULE init_cable_progs_mod diff --git a/src/coupled/AM3/initialisation/prognostics/init_cnp_progs.F90 b/src/coupled/AM3/initialisation/prognostics/init_cnp_progs.F90 new file mode 100644 index 000000000..773df3779 --- /dev/null +++ b/src/coupled/AM3/initialisation/prognostics/init_cnp_progs.F90 @@ -0,0 +1,33 @@ +MODULE init_cnp_progs_mod + +IMPLICIT NONE + +PUBLIC :: init_cnp_progs +PRIVATE + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='INIT_CNP_PROGS_MOD' + +CONTAINS + +SUBROUTINE init_cnp_progs( land_pts, nsurft, progs_cnp_vars, & + progs_cnp_vars_data ) + +USE progs_cnp_vars_mod, ONLY: progs_cnp_vars_type, & + progs_cnp_vars_data_type, & + progs_cnp_vars_alloc, & + progs_cnp_vars_assoc + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: land_pts, nsurft +TYPE(progs_cnp_vars_data_type), INTENT(OUT) :: progs_cnp_vars_data +TYPE(progs_cnp_vars_type), INTENT(OUT) :: progs_cnp_vars + +CALL progs_cnp_vars_alloc(land_pts, nsurft, progs_cnp_vars_data ) +CALL progs_cnp_vars_assoc(progs_cnp_vars, progs_cnp_vars_data ) + +RETURN + +END SUBROUTINE init_cnp_progs + +END MODULE init_cnp_progs_mod diff --git a/src/coupled/AM3/initialisation/prognostics/read_cable_progs.F90 b/src/coupled/AM3/initialisation/prognostics/read_cable_progs.F90 new file mode 100644 index 000000000..ad06b4cc1 --- /dev/null +++ b/src/coupled/AM3/initialisation/prognostics/read_cable_progs.F90 @@ -0,0 +1,276 @@ +!******************************COPYRIGHT******************************************** +! (c) CSIRO 2022. +! All rights reserved. +! +! This routine has been licensed to the other JULES partners for use and +! distribution under the JULES collaboration agreement, subject to the terms and +! conditions set out therein. +! +! [Met Office Ref SC0237] +!******************************COPYRIGHT******************************************** + +MODULE read_cable_progs_mod + +!------------------------------------------------------------------------------ +! Description: +! Reads in information about CABLE prognostic variables for their +! initialisation +! +! This MODULE is USEd in: +! init_cable_progs.F90 +! +! This MODULE contains 1 public Subroutine: +! read_cable_progs +! +! Code Owner: Please refer to ModuleLeaders.txt +! This file belongs in CABLE SCIENCE +!------------------------------------------------------------------------------ + +IMPLICIT NONE + +PUBLIC :: read_cable_progs +PRIVATE + +CHARACTER(LEN=*), PARAMETER, PRIVATE :: ModuleName='INIT_CABLE_PROGS_MOD' + +CONTAINS + +SUBROUTINE read_cable_progs() + +! Description: +! Nothing further to add to the module description + +USE errormessagelength_mod, ONLY: errormessagelength + +USE fill_variables_from_file_mod, ONLY: fill_variables_from_file + +USE io_constants, ONLY: max_sdf_name_len, max_file_name_len, namelist_unit + +USE string_utils_mod, ONLY: to_string + +USE templating_mod, ONLY: tpl_has_var_name, tpl_substitute_var + +USE model_interface_mod, ONLY: identifier_len, populate_var, get_var_id + +USE ancil_info, ONLY: land_pts + +USE missing_data_mod, ONLY: rmdi + +USE logging_mod, ONLY: log_info, log_warn, log_fatal + +IMPLICIT NONE + +! Work variables +INTEGER, PARAMETER :: max_cable_vars = 10 + ! The maximum number of CABLE model variables that can be given + +INTEGER :: nvars_required ! The number of prognostic variables that are + ! required in this configuration + +CHARACTER(LEN=identifier_len) :: required_vars(max_cable_vars) + ! The variable identifiers of the required + ! variables + +INTEGER :: nvars_file ! The number of variables that will be set + ! from the given file (template?) + +INTEGER :: i,l ! Index variables + +INTEGER :: ERROR ! Error indicator + +!! Variables passed to fill_variables_from_file +!CHARACTER(LEN=identifier_len) :: file_var(max_cable_vars) +! ! The variable identifiers of the variables to set +! ! from file +!CHARACTER(LEN=max_sdf_name_len) :: file_var_name(max_cable_vars) +! ! The name of each variable in the file +! +!CHARACTER(LEN=max_sdf_name_len) :: file_tpl_name(max_cable_vars) +! ! The name to substitute in a template for each +! ! variable + + +!----------------------------------------------------------------------------- +! Definition of the cable_progs namelist +!----------------------------------------------------------------------------- +CHARACTER(LEN=max_file_name_len) :: FILE + ! The name of the file (or variable name template) to + ! use for variables that need to be filled from file + +INTEGER :: nvars ! The number of variables in this section + +CHARACTER(LEN=identifier_len) :: var(max_cable_vars) + ! The variable identifiers of the variables +CHARACTER(LEN=max_sdf_name_len) :: var_name(max_cable_vars) + ! The name of each variable in the file +CHARACTER(LEN=max_sdf_name_len) :: tpl_name(max_cable_vars) + ! The name to substitute in a template for each + ! variable +LOGICAL :: use_file(max_cable_vars) + ! T - the variable uses the file + ! F - the variable is set using a constant value +CHARACTER(LEN=errormessagelength) :: iomessage + ! I/O error message string +REAL :: const_val(max_cable_vars) +!INTEGER:: iconst_val(max_cable_vars) + ! The constant value to use for each variable if + ! use_file = F for that variable +NAMELIST / cable_progs/ FILE, nvars, var, var_name, use_file, tpl_name, & + const_val + +!----------------------------------------------------------------------------- + + +!----------------------------------------------------------------------------- +! Initialise +!----------------------------------------------------------------------------- +nvars_required = 0 +nvars_file = 0 +nvars = 0 +use_file(:) = .TRUE. ! Default is for every variable to be read from file +FILE(:) = '' ! Empty file names +var_name(:) = '' ! Empty variable names +tpl_name(:) = '' ! Empty template string +const_val(:) = rmdi + +!----------------------------------------------------------------------------- +! Read namelist +!----------------------------------------------------------------------------- +CALL log_info("init_cable_progs", "Reading CABLE_PROGS namelist...") +OPEN(namelist_unit, FILE=('cable_prognostics.nml'), & + STATUS='old', POSITION='rewind', ACTION='read', IOSTAT = ERROR, & + IOMSG = iomessage) + + +! First, we read the cable_progs namelist +READ(namelist_unit, NML = cable_progs, IOSTAT = ERROR) + +IF ( ERROR /= 0 ) & + CALL log_fatal("init_cable_progs", & + "Error reading namelist CABLE_PROGS" // & + "(IOSTAT=" // TRIM(to_string(ERROR)) // " IOMSG=" // & + TRIM(iomessage) // ")") + +!----------------------------------------------------------------------------- +! Set up CABLE prognostics using namelist values +!----------------------------------------------------------------------------- +! Set up the required variables +! All the CABLE variables are always required for CABLE runs +nvars_required = max_cable_vars +required_vars(:) = [ & + 'ThreeLayerSnowFlag_CABLE', & + 'OneLyrSnowDensity_CABLE ', & + 'SnowAge_CABLE ', & + 'SnowDensity_CABLE ', & + 'SnowMass_CABLE ', & + 'SnowDepth_CABLE ', & + 'SnowTemp_CABLE ', & + 'FrozenSoilFrac_CABLE ', & + 'SoilMoisture_CABLE ', & + 'SoilTemp_CABLE ' & + ] +!------------------------------------------------------------------------- +! Check that variable identifiers are not empty. +! Although we might later decide that the identifier is not required, for +! clarity we check here whether the claimed amount of information was +! provided. +!------------------------------------------------------------------------- +DO i = 1,nvars + IF ( LEN_TRIM(var(i)) == 0 ) & + CALL log_fatal("init_cable_progs", & + "Insufficient values for var. " // & + "No name provided for var at position #" // & + TRIM(to_string(i)) ) +END DO + +!----------------------------------------------------------------------------- +! Check that all the required variables are there +!----------------------------------------------------------------------------- + +DO i = 1,nvars_required + IF ( .NOT. ANY(var(1:nvars) == TRIM(required_vars(i))) ) & + CALL log_fatal("init_cable_progs", & + "No value given for required variable '" // & + TRIM(required_vars(i)) // "'") +END DO + + +!----------------------------------------------------------------------------- +! Check which variables we will be using and partition them into variables +! set to constant values and variables set from file +!----------------------------------------------------------------------------- +DO i = 1,nvars + !----------------------------------------------------------------------------- + ! If the variable is one of the required vars, then we will be using it + !----------------------------------------------------------------------------- + IF ( ANY(required_vars(1:nvars_required) == var(i)) ) THEN + IF ( use_file(i) ) THEN + CALL log_info("init_cable_progs", & + "'" // TRIM(var(i)) // "' will be read from file") + + ! If the variable will be filled from file, register it here + nvars_file = nvars_file + 1 + var(nvars_file) = var(i) + var_name(nvars_file) = var_name(i) + tpl_name(nvars_file) = tpl_name(i) + ELSE + ! If the variable is being set as a constant, just populate it here + ! First check that a value has been provided. + IF ( ABS( const_val(i) - rmdi ) < EPSILON(1.0) ) & + CALL log_fatal("init_cable_progs", & + "No constant value provided for variable '" & + // TRIM(var(i)) // "'" ) + + CALL log_info("init_cable_progs", & + "'" // TRIM(var(i)) // "' will be set to a " // & + "constant = " // to_string(const_val(i))) + + CALL populate_var(get_var_id(var(i)), const_val = const_val(i)) + END IF + ELSE + ! If the variable is not a required variable, warn about not using it + CALL log_warn("init_cable_progs", & + "Provided variable '" // TRIM(var(i)) // & + "' is not required, so will be ignored") + END IF +END DO + +!----------------------------------------------------------------------------- +! Set variables from file +!----------------------------------------------------------------------------- +IF ( nvars_file > 0 ) THEN + ! Check that a file name was provided. + IF ( LEN_TRIM(FILE) == 0 ) & + CALL log_fatal("init_cable_progs", "No file name provided") + + IF ( tpl_has_var_name(FILE) ) THEN + ! We are using a file name template, so loop through the variables setting + ! one from each file + DO i = 1,nvars_file + ! If using a variable name template, check that a template string was + !provided for the current variable + IF ( LEN_TRIM(tpl_name(i)) == 0 ) & + CALL log_fatal("init_cable_progs", & + "No variable name template substitution " // & + "(tpl_name) provided for " // TRIM(var(i))) + + + CALL fill_variables_from_file( & + tpl_substitute_var(FILE, tpl_name(i)), & + [ var(i) ], [ var_name(i) ] & + ) + END DO + ELSE + ! We are not using a file name template, so set all variables from the same + ! file + + CALL fill_variables_from_file( & + FILE,var(1:nvars_file), var_name(1:nvars_file) & + ) + END IF +END IF + +RETURN + +END SUBROUTINE read_cable_progs +END MODULE read_cable_progs_mod From 8f62897b6ff6d283565d5df374271425dbce93c7 Mon Sep 17 00:00:00 2001 From: Sean Bryan <39685865+SeanBryan51@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:28:05 +1000 Subject: [PATCH 81/85] Update build-ci version (#409) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The build-ci action has now been fixed (see https://github.com/ACCESS-NRI/build-ci/pull/179). Fixes #408 ---- 📚 Documentation preview 📚: https://cable--409.org.readthedocs.build/en/409/ --- .github/workflows/model-build-test-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/model-build-test-ci.yml b/.github/workflows/model-build-test-ci.yml index fe127f243..96c2b1c9e 100644 --- a/.github/workflows/model-build-test-ci.yml +++ b/.github/workflows/model-build-test-ci.yml @@ -10,6 +10,6 @@ on: jobs: build: name: Build ${{ github.repository }} via spack - uses: access-nri/build-ci/.github/workflows/model-1-build.yml@3c0840d775d8f3d67cfeedb44173caa2682fa27e + uses: access-nri/build-ci/.github/workflows/model-1-build.yml@e90ea37002e4f3aed6515482eb2cca9ac5cd2a94 permissions: packages: read From 66e717a8213edff2556c15070d5241b0146d3135 Mon Sep 17 00:00:00 2001 From: Micael Oliveira Date: Mon, 16 Sep 2024 16:51:46 +1000 Subject: [PATCH 82/85] Fix compilation with gfortran: use the abort defined in cable_abort_module, as gfortran provides a similar function that takes no arguments. --- src/offline/cable_mpiworker.F90 | 1 + src/offline/cable_write.F90 | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/offline/cable_mpiworker.F90 b/src/offline/cable_mpiworker.F90 index f240e557d..bf5e64d7d 100644 --- a/src/offline/cable_mpiworker.F90 +++ b/src/offline/cable_mpiworker.F90 @@ -5655,6 +5655,7 @@ END SUBROUTINE worker_outtype SUBROUTINE worker_time_update (met, kend, dels) + USE cable_abort_module, ONLY: abort USE cable_common_module, ONLY: ktau_gl USE cable_def_types_mod USE cable_IO_vars_module diff --git a/src/offline/cable_write.F90 b/src/offline/cable_write.F90 index 49badaa9a..56a1fb4e8 100644 --- a/src/offline/cable_write.F90 +++ b/src/offline/cable_write.F90 @@ -45,7 +45,7 @@ MODULE cable_write_module - USE cable_abort_module, ONLY: nc_abort + USE cable_abort_module, ONLY: nc_abort, abort USE cable_def_types_mod USE cable_IO_vars_module, ONLY: landpt, patch, max_vegpatches, parID_type, & metGrid, land_x, land_y, logn, output, & From d0e19953399daba8578027a96371a725610abe96 Mon Sep 17 00:00:00 2001 From: Micael Oliveira Date: Tue, 24 Sep 2024 12:27:33 +1000 Subject: [PATCH 83/85] Cleanup of mpi drivers by addressing some compiler warnings, including unused variables and arguments. --- src/offline/cable_mpidrv.F90 | 3 +- src/offline/cable_mpimaster.F90 | 217 +++++---------- src/offline/cable_mpiworker.F90 | 471 +++++++------------------------- 3 files changed, 164 insertions(+), 527 deletions(-) diff --git a/src/offline/cable_mpidrv.F90 b/src/offline/cable_mpidrv.F90 index a3a132e7d..9a0cb6dbf 100644 --- a/src/offline/cable_mpidrv.F90 +++ b/src/offline/cable_mpidrv.F90 @@ -24,8 +24,7 @@ PROGRAM mpi_driver USE cable_mpicommon USE cable_mpimaster USE cable_mpiworker - USE cable_namelist_util, ONLY: get_namelist_file_name,& - CABLE_NAMELIST,arg_not_namelist + USE cable_namelist_util, ONLY: get_namelist_file_name IMPLICIT NONE diff --git a/src/offline/cable_mpimaster.F90 b/src/offline/cable_mpimaster.F90 index 97ab7b30e..c9f75d09b 100644 --- a/src/offline/cable_mpimaster.F90 +++ b/src/offline/cable_mpimaster.F90 @@ -158,19 +158,19 @@ SUBROUTINE mpidrv_master (comm) USE cable_IO_vars_module, ONLY: logn,gswpfile,ncciy,leaps,globalMetfile, & verbose, fixedCO2,output,check,patchout, & patch_type,landpt,soilparmnew,& - defaultLAI, sdoy, smoy, syear, timeunits, exists, output, & - latitude,longitude, calendar, set_group_output_values + timeunits, exists, output, & + calendar, set_group_output_values USE cable_common_module, ONLY: ktau_gl, kend_gl, knode_gl, cable_user, & - cable_runtime, fileName, myhome, & + cable_runtime, fileName, & redistrb, wiltParam, satuParam, CurYear, & IS_LEAPYEAR, calcsoilalbedo, & kwidth_gl, gw_params - USE casa_ncdf_module, ONLY: is_casa_time -! physical constants -USE cable_phys_constants_mod, ONLY : CTFRZ => TFRZ -USE cable_phys_constants_mod, ONLY : CEMLEAF => EMLEAF -USE cable_phys_constants_mod, ONLY : CEMSOIL => EMSOIL -USE cable_phys_constants_mod, ONLY : CSBOLTZ => SBOLTZ + USE casa_ncdf_module, ONLY: is_casa_time + ! physical constants + USE cable_phys_constants_mod, ONLY : CTFRZ => TFRZ + USE cable_phys_constants_mod, ONLY : CEMLEAF => EMLEAF + USE cable_phys_constants_mod, ONLY : CEMSOIL => EMSOIL + USE cable_phys_constants_mod, ONLY : CSBOLTZ => SBOLTZ USE cable_input_module, ONLY: open_met_file,load_parameters, & get_met_data,close_met_file USE cable_output_module, ONLY: create_restart,open_output_file, & @@ -205,12 +205,12 @@ SUBROUTINE mpidrv_master (comm) USE CABLE_CRU, ONLY: CRU_TYPE, CRU_GET_SUBDIURNAL_MET, CRU_INIT USE cable_namelist_util, ONLY : get_namelist_file_name,& - CABLE_NAMELIST,arg_not_namelist + CABLE_NAMELIST USE landuse_constant, ONLY: mstate,mvmax,mharvw USE landuse_variable -USE bgcdriver_mod, ONLY : bgcdriver -USE casa_offline_inout_module, ONLY : WRITE_CASA_RESTART_NC, WRITE_CASA_OUTPUT_NC + USE bgcdriver_mod, ONLY : bgcdriver + USE casa_offline_inout_module, ONLY : WRITE_CASA_RESTART_NC, WRITE_CASA_OUTPUT_NC IMPLICIT NONE ! MPI: @@ -231,12 +231,9 @@ SUBROUTINE mpidrv_master (comm) ktauday, & ! day counter for CASA-CNP idoy, & ! day of year (1:365) counter for CASA-CNP nyear, & ! year counter for CASA-CNP - casa_it, & ! number of calls to CASA-CNP ctime, & ! day count for casacnp YYYY, & ! LOY, & ! Length of Year - count_sum_casa, & ! number of time steps over which casa pools and fluxes are aggregated (for output) - maxdiff(2) ! location of maximum in convergence test REAL :: dels ! time step size in seconds @@ -310,11 +307,10 @@ SUBROUTINE mpidrv_master (comm) LOGICAL :: loop_exit ! MPI: exit flag for bcast to workers INTEGER :: iktau ! read ahead index of time step = 1 .. kend INTEGER :: oktau ! ktau = 1 .. kend for output - INTEGER :: tmp_kgl ! temp for ktau_gl INTEGER :: icomm ! separate dupes of MPI communicator for send and recv INTEGER :: ocomm ! separate dupes of MPI communicator for send and recv INTEGER :: ierr - INTEGER :: rank, count, off, cnt + INTEGER :: rank, off, cnt ! Vars for standard for quasi-bitwise reproducability b/n runs ! Check triggered by cable_user%consistency_check = .TRUE. in cable.nml @@ -364,13 +360,13 @@ SUBROUTINE mpidrv_master (comm) cable_user, & ! additional USER switches gw_params - INTEGER :: i,x,kk,m,np,ivt + INTEGER :: kk,m,np,ivt INTEGER :: LALLOC - INTEGER, PARAMETER :: mloop = 30 ! CASA-CNP PreSpinup loops + INTEGER, PARAMETER :: mloop = 30 ! CASA-CNP PreSpinup loops REAL :: etime ! for landuse - integer mlon,mlat,mpx + integer mlon,mlat real(r_2), dimension(:,:,:), allocatable, save :: luc_atransit real(r_2), dimension(:,:), allocatable, save :: luc_fharvw real(r_2), dimension(:,:,:), allocatable, save :: luc_xluh2cable @@ -534,7 +530,7 @@ SUBROUTINE mpidrv_master (comm) CALL CPU_TIME(etime) CALL CRU_INIT( CRU ) - dels = CRU%dtsecs + dels = CRU%dtsecs koffset = 0 leaps = .FALSE. ! No leap years in CRU-NCEP exists%Snowf = .FALSE. ! No snow in CRU-NCEP, so ensure it will @@ -598,11 +594,11 @@ SUBROUTINE mpidrv_master (comm) ! vh_js ! - CALL load_parameters( met, air, ssnow, veg,climate,bgc, & - soil, canopy, rough, rad, sum_flux, & - bal, logn, vegparmnew, casabiome, casapool, & + CALL load_parameters( met, air, ssnow, veg,climate,bgc, & + soil, canopy, rough, rad, sum_flux, & + bal, logn, vegparmnew, casabiome, casapool, & casaflux, sum_casapool, sum_casaflux, & - casamet, casabal, phen, POP, spinup, & + casamet, casabal, phen, POP, spinup, & CEMSOIL, CTFRZ, LUC_EXPT, POPLUC ) IF (CABLE_USER%POPLUC .AND. TRIM(CABLE_USER%POPLUC_RunType) .EQ. 'static') & @@ -616,7 +612,7 @@ SUBROUTINE mpidrv_master (comm) met%ofsd = 0.1 - IF (.NOT.spinup) spinConv=.TRUE. + IF (.NOT.spinup) spinConv=.TRUE. ! MPI: above was standard serial code ! now it's time to initialize the workers @@ -634,7 +630,7 @@ SUBROUTINE mpidrv_master (comm) CALL find_extents ! MPI: calculate and broadcast landpoint decomposition to the workers - CALL master_decomp(comm, mland, mp) + CALL master_decomp(comm, mland) ! MPI: set up stuff for new irecv isend code that separates completion ! from posting of requests @@ -670,7 +666,7 @@ SUBROUTINE mpidrv_master (comm) CALL master_casa_params (comm,casabiome,casapool,casaflux,casamet,& & casabal,phen) - IF ( CABLE_USER%CALL_POP ) CALL master_pop_types (comm,casamet,pop) + IF ( CABLE_USER%CALL_POP ) CALL master_pop_types (comm,pop) END IF ! MPI: allocate read ahead buffers for input met and veg data @@ -695,7 +691,7 @@ SUBROUTINE mpidrv_master (comm) casamet, casabal, phen) IF ( CABLE_USER%CASA_DUMP_READ .OR. CABLE_USER%CASA_DUMP_WRITE ) & - CALL master_casa_dump_types( comm, casamet, casaflux, phen, climate ) + CALL master_casa_dump_types( comm, casamet, casaflux, phen ) WRITE(*,*) 'cable_mpimaster, POPLUC: ' , CABLE_USER%POPLUC IF ( CABLE_USER%POPLUC ) & CALL master_casa_LUC_types( comm, casapool, casabal) @@ -715,15 +711,15 @@ SUBROUTINE mpidrv_master (comm) IF( icycle>0 .AND. spincasa) THEN PRINT *, 'EXT spincasacnp enabled with mloop= ', mloop, dels, kstart, kend CALL master_spincasacnp(dels,kstart,kend,mloop,veg,soil,casabiome,casapool, & - casaflux,casamet,casabal,phen,POP,climate,LALLOC, icomm, ocomm) + casaflux,casamet,casabal,phen,POP,climate,icomm, ocomm) SPINconv = .FALSE. CASAONLY = .TRUE. ktau_gl = 0 ktau = 0 ELSEIF ( casaonly .AND. (.NOT. spincasa) .AND. cable_user%popluc) THEN - CALL master_CASAONLY_LUC(dels,kstart,kend,veg,soil,casabiome,casapool, & - casaflux,casamet,casabal,phen,POP,climate,LALLOC, LUC_EXPT, POPLUC, & + CALL master_CASAONLY_LUC(dels,kstart,kend,veg,casabiome,casapool, & + casaflux,casamet,casabal,phen,POP,climate,LUC_EXPT, POPLUC, & icomm, ocomm) SPINconv = .FALSE. ktau_gl = 0 @@ -1099,7 +1095,7 @@ SUBROUTINE mpidrv_master (comm) CALL close_met_file IF (icycle>0 .AND. cable_user%CALL_POP) THEN - WRITE(*,*), 'b4 annual calcs' + WRITE(*,*) 'b4 annual calcs' IF (CABLE_USER%POPLUC) THEN @@ -1221,12 +1217,12 @@ SUBROUTINE mpidrv_master (comm) IF (ktau == kend) PRINT*, "sum_fe[Wm-2], sum_fpn[umol/m2/s]", & new_sumfe/count_bal, new_sumfpn/count_bal IF (ktau == kend) WRITE(logn,*) - IF (ktau == kend) WRITE(logn,*), "time-space-averaged energy & water balances" - IF (ktau == kend) WRITE(logn,*),"Ebal_tot[Wm-2], Wbal_tot[mm per timestep]", & + IF (ktau == kend) WRITE(logn,*) "time-space-averaged energy & water balances" + IF (ktau == kend) WRITE(logn,*) "Ebal_tot[Wm-2], Wbal_tot[mm per timestep]", & SUM(bal%ebal_tot)/mp/count_bal, SUM(bal%wbal_tot)/mp/count_bal - IF (ktau == kend) WRITE(logn,*), "time-space-averaged latent heat and & + IF (ktau == kend) WRITE(logn,*) "time-space-averaged latent heat and & net photosynthesis" - IF (ktau == kend) WRITE(logn,*), "sum_fe[Wm-2], sum_fpn[umol/m2/s]", & + IF (ktau == kend) WRITE(logn,*) "sum_fe[Wm-2], sum_fpn[umol/m2/s]", & new_sumfe/count_bal, new_sumfpn/count_bal @@ -1564,17 +1560,16 @@ END SUBROUTINE renameFiles ! MPI: calculates and sends grid decomposition info to the workers - SUBROUTINE master_decomp (comm, mland, mp) + SUBROUTINE master_decomp (comm, mland) USE mpi - USE cable_IO_vars_module, ONLY : landpt, patch + USE cable_IO_vars_module, ONLY : landpt IMPLICIT NONE INTEGER, INTENT(IN) :: comm ! MPI communicator to talk to the workers INTEGER, INTENT(IN) :: mland ! total number of landpoints in the global grid - INTEGER, INTENT(IN) :: mp ! total number of land patches in the global grid INTEGER :: lpw ! average number of landpoints per worker INTEGER :: rank, rest, nxt, pcnt, ierr, i, tmp @@ -1700,7 +1695,7 @@ SUBROUTINE master_cable_params (comm,met,air,ssnow,veg,bgc,soil,canopy,& INTEGER(KIND=MPI_ADDRESS_KIND) :: text, tmplb INTEGER :: tsize, localtotal, remotetotal - INTEGER :: stat(MPI_STATUS_SIZE), ierr + INTEGER :: ierr INTEGER, ALLOCATABLE, DIMENSION(:) :: param_ts INTEGER(KIND=MPI_ADDRESS_KIND) :: r1stride, r2stride, istride @@ -3436,7 +3431,7 @@ SUBROUTINE master_casa_params (comm,casabiome,casapool,casaflux,casamet,& INTEGER(KIND=MPI_ADDRESS_KIND) :: text, tmplb INTEGER :: tsize, localtotal, remotetotal - INTEGER :: stat(MPI_STATUS_SIZE), ierr + INTEGER :: ierr ! INTEGER :: landp_t, patch_t, param_t INTEGER, ALLOCATABLE, DIMENSION(:) :: casa_ts @@ -6223,9 +6218,6 @@ SUBROUTINE master_casa_types (comm, casapool, casaflux, & INTEGER :: last2d, i - ! MPI: block lenghts for hindexed representing all vectors - INTEGER, ALLOCATABLE, DIMENSION(:) :: blen - ! MPI: block lengths and strides for hvector representing matrices INTEGER :: r1len, r2len, I1LEN INTEGER(KIND=MPI_ADDRESS_KIND) :: r1stride, r2stride, istride @@ -6234,7 +6226,7 @@ SUBROUTINE master_casa_types (comm, casapool, casaflux, & INTEGER(KIND=MPI_ADDRESS_KIND) :: text, tmplb INTEGER :: rank, off, cnt - INTEGER :: bidx, midx, vidx, ierr + INTEGER :: bidx, ierr ALLOCATE (casa_ts(wnp)) @@ -6866,10 +6858,7 @@ SUBROUTINE master_climate_types (comm, climate, ktauday) INTEGER, ALLOCATABLE, DIMENSION(:) :: types INTEGER :: ntyp ! number of worker's types - INTEGER :: last2d, i, ktauday - - ! MPI: block lenghts for hindexed representing all vectors - INTEGER, ALLOCATABLE, DIMENSION(:) :: blen + INTEGER :: ktauday ! MPI: block lengths and strides for hvector representing matrices INTEGER :: r1len, r2len, I1LEN @@ -6879,7 +6868,7 @@ SUBROUTINE master_climate_types (comm, climate, ktauday) INTEGER(KIND=MPI_ADDRESS_KIND) :: text, tmplb INTEGER :: rank, off, cnt - INTEGER :: bidx, midx, vidx, ierr, ny, nd, ndq + INTEGER :: bidx, ierr, ny, nd, ndq IF (cable_user%call_climate) CALL climate_init ( climate, mp, ktauday ) IF (cable_user%call_climate .AND.(.NOT.cable_user%climate_fromzero)) & @@ -7344,9 +7333,6 @@ SUBROUTINE master_restart_types (comm, canopy, air) INTEGER :: last2d, i - ! MPI: block lenghts for hindexed representing all vectors - INTEGER, ALLOCATABLE, DIMENSION(:) :: blen - ! MPI: block lengths and strides for hvector representing matrices INTEGER :: r1len, r2len INTEGER(KIND=MPI_ADDRESS_KIND) :: r1stride, r2stride @@ -7355,7 +7341,7 @@ SUBROUTINE master_restart_types (comm, canopy, air) INTEGER(KIND=MPI_ADDRESS_KIND) :: text, tmplb INTEGER :: rank, off, cnt - INTEGER :: bidx, midx, vidx, ierr + INTEGER :: bidx, ierr ALLOCATE (restart_ts(wnp)) @@ -7507,7 +7493,7 @@ SUBROUTINE master_restart_types (comm, canopy, air) END SUBROUTINE master_restart_types ! MPI: Casa - dump read and write - SUBROUTINE master_casa_dump_types(comm, casamet, casaflux, phen, climate ) + SUBROUTINE master_casa_dump_types(comm, casamet, casaflux, phen ) USE mpi @@ -7520,7 +7506,6 @@ SUBROUTINE master_casa_dump_types(comm, casamet, casaflux, phen, climate ) TYPE (casa_flux) , INTENT(INOUT) :: casaflux TYPE (casa_met) , INTENT(INOUT) :: casamet TYPE (phen_variable), INTENT(INOUT) :: phen - TYPE(climate_type):: climate ! local vars @@ -7534,7 +7519,7 @@ SUBROUTINE master_casa_dump_types(comm, casamet, casaflux, phen, climate ) INTEGER :: tsize, localtotal, remotetotal INTEGER(KIND=MPI_ADDRESS_KIND) :: r1stride, r2stride, Istride - INTEGER :: r1len, r2len, I1LEN, llen ! block lengths + INTEGER :: r1len, r2len, I1LEN ! block lengths INTEGER :: bidx ! block index INTEGER :: ntyp ! total number of blocks INTEGER :: rank ! worker rank @@ -7708,7 +7693,7 @@ SUBROUTINE master_casa_LUC_types(comm, casapool, casabal ) INTEGER :: tsize, localtotal, remotetotal INTEGER(KIND=MPI_ADDRESS_KIND) :: r1stride, r2stride, Istride - INTEGER :: r1len, r2len, I1LEN, llen ! block lengths + INTEGER :: r1len, r2len, I1LEN ! block lengths INTEGER :: bidx ! block index INTEGER :: ntyp ! total number of blocks INTEGER :: rank ! worker rank @@ -7876,39 +7861,24 @@ END SUBROUTINE master_casa_LUC_types ! Creates pop_ts types to broadcast/cscatter the default POP parameters ! to all workers - SUBROUTINE master_pop_types(comm, casamet, pop) + SUBROUTINE master_pop_types(comm, pop) USE mpi USE POP_mpi USE POP_types, ONLY: pop_type USE cable_common_module,ONLY: cable_user - USE casavariable, ONLY: casa_met IMPLICIT NONE INTEGER,INTENT(IN) :: comm - TYPE (casa_met) , INTENT(IN) :: casamet TYPE (pop_type) , INTENT(INOUT) :: pop - ! temp arrays for marshalling all fields into a single struct - INTEGER, ALLOCATABLE, DIMENSION(:) :: blocks - INTEGER(KIND=MPI_ADDRESS_KIND), ALLOCATABLE, DIMENSION(:) :: displs - INTEGER, ALLOCATABLE, DIMENSION(:) :: types - - ! temp vars for verifying block number and total length of inp_t - INTEGER(KIND=MPI_ADDRESS_KIND) :: text, tmplb - INTEGER :: tsize, localtotal, remotetotal - - INTEGER(KIND=MPI_ADDRESS_KIND) :: r2stride, ilstride, idstride - INTEGER :: r2len, illen,idlen ! block lengths - INTEGER :: bidx ! block index - INTEGER :: ntyp ! total number of blocks INTEGER :: rank ! worker rank INTEGER :: off ! first patch index for a worker INTEGER :: cnt ! mp for a worker INTEGER :: ierr - INTEGER :: x, l, prev_mp - INTEGER, ALLOCATABLE :: w_iwood(:), nwoodcells(:) + INTEGER :: prev_mp + INTEGER, ALLOCATABLE :: w_iwood(:) ! Also send Pop relevant info to workers. @@ -7969,7 +7939,6 @@ SUBROUTINE master_receive_pop (POP, comm) USE MPI USE POP_mpi USE POP_Types, ONLY: pop_type - USE cable_common_module, ONLY: cable_user IMPLICIT NONE @@ -8159,7 +8128,7 @@ SUBROUTINE master_end (icycle, restart) END SUBROUTINE master_end SUBROUTINE master_spincasacnp( dels,kstart,kend,mloop,veg,soil,casabiome,casapool, & - casaflux,casamet,casabal,phen,POP,climate,LALLOC, icomm, ocomm ) + casaflux,casamet,casabal,phen,POP,climate,icomm, ocomm ) !USE cable_mpimaster USE cable_def_types_mod @@ -8172,7 +8141,7 @@ SUBROUTINE master_spincasacnp( dels,kstart,kend,mloop,veg,soil,casabiome,casapoo USE POP_Types, ONLY: POP_TYPE USE POPMODULE, ONLY: POPStep USE TypeDef, ONLY: i4b, dp -USE casa_offline_inout_module, ONLY : WRITE_CASA_RESTART_NC + USE casa_offline_inout_module, ONLY : WRITE_CASA_RESTART_NC IMPLICIT NONE !CLN CHARACTER(LEN=99), INTENT(IN) :: fcnpspin @@ -8180,7 +8149,6 @@ SUBROUTINE master_spincasacnp( dels,kstart,kend,mloop,veg,soil,casabiome,casapoo INTEGER, INTENT(IN) :: kstart INTEGER, INTENT(IN) :: kend INTEGER, INTENT(IN) :: mloop - INTEGER, INTENT(IN) :: LALLOC TYPE (veg_parameter_type), INTENT(INOUT) :: veg ! vegetation parameters TYPE (soil_parameter_type), INTENT(INOUT) :: soil ! soil parameters TYPE (casa_biome), INTENT(INOUT) :: casabiome @@ -8195,39 +8163,11 @@ SUBROUTINE master_spincasacnp( dels,kstart,kend,mloop,veg,soil,casabiome,casapoo ! communicator for error-messages INTEGER, INTENT(IN) :: icomm, ocomm - TYPE (casa_met) :: casaspin - - ! local variables - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_cleaf2met, avg_cleaf2str, avg_croot2met, avg_croot2str, avg_cwood2cwd - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_nleaf2met, avg_nleaf2str, avg_nroot2met, avg_nroot2str, avg_nwood2cwd - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_pleaf2met, avg_pleaf2str, avg_proot2met, avg_proot2str, avg_pwood2cwd - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_cgpp, avg_cnpp, avg_nuptake, avg_puptake - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_nsoilmin, avg_psoillab, avg_psoilsorb, avg_psoilocc - !chris 12/oct/2012 for spin up casa - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_ratioNCsoilmic, avg_ratioNCsoilslow, avg_ratioNCsoilpass - REAL(r_2), DIMENSION(:), ALLOCATABLE, SAVE :: avg_xnplimit, avg_xkNlimiting,avg_xklitter, avg_xksoil - ! local variables INTEGER :: myearspin,nyear, nloop1 CHARACTER(LEN=99) :: ncfile CHARACTER(LEN=4) :: cyear - INTEGER :: ktau,ktauday,nday,idoy,ktaux,ktauy,nloop - INTEGER, SAVE :: ndays - REAL, DIMENSION(mp) :: cleaf2met, cleaf2str, croot2met, croot2str, cwood2cwd - REAL, DIMENSION(mp) :: nleaf2met, nleaf2str, nroot2met, nroot2str, nwood2cwd - REAL, DIMENSION(mp) :: pleaf2met, pleaf2str, proot2met, proot2str, pwood2cwd - REAL, DIMENSION(mp) :: xcgpp, xcnpp, xnuptake, xpuptake - REAL, DIMENSION(mp) :: xnsoilmin, xpsoillab, xpsoilsorb,xpsoilocc - REAL(r_2), DIMENSION(mp) :: xnplimit, xkNlimiting, xklitter, xksoil,xkleaf, xkleafcold, xkleafdry - - ! more variables to store the spinup pool size over the last 10 loops. Added by Yp Wang 30 Nov 2012 - REAL, DIMENSION(5,mvtype,mplant) :: bmcplant, bmnplant, bmpplant - REAL, DIMENSION(5,mvtype,mlitter) :: bmclitter, bmnlitter, bmplitter - REAL, DIMENSION(5,mvtype,msoil) :: bmcsoil, bmnsoil, bmpsoil - REAL, DIMENSION(5,mvtype) :: bmnsoilmin,bmpsoillab,bmpsoilsorb, bmpsoilocc - REAL, DIMENSION(mvtype) :: bmarea - INTEGER nptx,nvt,kloop - + INTEGER :: ktau,ktauday,nday,idoy,ktauy,nloop ktauday=INT(24.0*3600.0/dels) nday=(kend-kstart+1)/ktauday @@ -8338,16 +8278,16 @@ SUBROUTINE master_spincasacnp( dels,kstart,kend,mloop,veg,soil,casabiome,casapoo END SUBROUTINE master_spincasacnp !============================================================================ - SUBROUTINE master_CASAONLY_LUC( dels,kstart,kend,veg,soil,casabiome,casapool, & - casaflux,casamet,casabal,phen,POP,climate,LALLOC,LUC_EXPT, POPLUC, & + SUBROUTINE master_CASAONLY_LUC( dels,kstart,kend,veg,casabiome,casapool, & + casaflux,casamet,casabal,phen,POP,climate,LUC_EXPT, POPLUC, & icomm, ocomm ) USE cable_def_types_mod USE cable_carbon_module USE cable_common_module, ONLY: CABLE_USER - USE casa_ncdf_module, ONLY: is_casa_time - USE cable_IO_vars_module, ONLY: logn, landpt, patch, output + USE casa_ncdf_module, ONLY: is_casa_time + USE cable_IO_vars_module, ONLY: landpt, output USE casadimension USE casaparm USE casavariable @@ -8361,7 +8301,7 @@ SUBROUTINE master_CASAONLY_LUC( dels,kstart,kend,veg,soil,casabiome,casapool, & USE POPLUC_Module, ONLY: POPLUCStep, POPLUC_weights_Transfer, WRITE_LUC_OUTPUT_NC, & POP_LUC_CASA_transfer, WRITE_LUC_RESTART_NC, READ_LUC_RESTART_NC, & POPLUC_set_patchfrac, WRITE_LUC_OUTPUT_GRID_NC -USE casa_offline_inout_module, ONLY : WRITE_CASA_RESTART_NC + USE casa_offline_inout_module, ONLY : WRITE_CASA_RESTART_NC @@ -8369,9 +8309,7 @@ SUBROUTINE master_CASAONLY_LUC( dels,kstart,kend,veg,soil,casabiome,casapool, & REAL, INTENT(IN) :: dels INTEGER, INTENT(IN) :: kstart INTEGER, INTENT(IN) :: kend - INTEGER, INTENT(IN) :: LALLOC TYPE (veg_parameter_type), INTENT(INOUT) :: veg ! vegetation parameters - TYPE (soil_parameter_type), INTENT(INOUT) :: soil ! soil parameters TYPE (casa_biome), INTENT(INOUT) :: casabiome TYPE (casa_pool), INTENT(INOUT) :: casapool TYPE (casa_flux), INTENT(INOUT) :: casaflux @@ -8386,46 +8324,15 @@ SUBROUTINE master_CASAONLY_LUC( dels,kstart,kend,veg,soil,casabiome,casapool, & !TYPE (casa_flux) , INTENT(INOUT) :: sum_casaflux ! communicator for error-messages INTEGER, INTENT(IN) :: icomm, ocomm - TYPE (casa_met) :: casaspin - - ! local variables - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_cleaf2met, avg_cleaf2str, avg_croot2met, avg_croot2str, avg_cwood2cwd - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_nleaf2met, avg_nleaf2str, avg_nroot2met, avg_nroot2str, avg_nwood2cwd - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_pleaf2met, avg_pleaf2str, avg_proot2met, avg_proot2str, avg_pwood2cwd - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_cgpp, avg_cnpp, avg_nuptake, avg_puptake - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_nsoilmin, avg_psoillab, avg_psoilsorb, avg_psoilocc - !chris 12/oct/2012 for spin up casa - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_ratioNCsoilmic, avg_ratioNCsoilslow, avg_ratioNCsoilpass - REAL(r_2), DIMENSION(:), ALLOCATABLE, SAVE :: avg_xnplimit, avg_xkNlimiting,avg_xklitter, avg_xksoil ! local variables INTEGER :: myearspin,nyear, yyyy, nyear_dump CHARACTER(LEN=99) :: ncfile CHARACTER(LEN=4) :: cyear - INTEGER :: ktau,ktauday,nday,idoy,ktaux,ktauy,nloop - INTEGER, SAVE :: ndays - REAL, DIMENSION(mp) :: cleaf2met, cleaf2str, croot2met, croot2str, cwood2cwd - REAL, DIMENSION(mp) :: nleaf2met, nleaf2str, nroot2met, nroot2str, nwood2cwd - REAL, DIMENSION(mp) :: pleaf2met, pleaf2str, proot2met, proot2str, pwood2cwd - REAL, DIMENSION(mp) :: xcgpp, xcnpp, xnuptake, xpuptake - REAL, DIMENSION(mp) :: xnsoilmin, xpsoillab, xpsoilsorb,xpsoilocc - REAL(r_2), DIMENSION(mp) :: xnplimit, xkNlimiting, xklitter, xksoil,xkleaf, xkleafcold, xkleafdry - - ! more variables to store the spinup pool size over the last 10 loops. Added by Yp Wang 30 Nov 2012 - REAL, DIMENSION(5,mvtype,mplant) :: bmcplant, bmnplant, bmpplant - REAL, DIMENSION(5,mvtype,mlitter) :: bmclitter, bmnlitter, bmplitter - REAL, DIMENSION(5,mvtype,msoil) :: bmcsoil, bmnsoil, bmpsoil - REAL, DIMENSION(5,mvtype) :: bmnsoilmin,bmpsoillab,bmpsoilsorb, bmpsoilocc - REAL, DIMENSION(mvtype) :: bmarea - INTEGER :: nptx,nvt,kloop, ctime, k, j, l - - REAL(dp) :: StemNPP(mp,2) - REAL(dp), ALLOCATABLE, SAVE :: LAImax(:) , Cleafmean(:), Crootmean(:) - REAL(dp), ALLOCATABLE :: NPPtoGPP(:) - INTEGER, ALLOCATABLE :: Iw(:) ! array of indices corresponding to woody (shrub or forest) tiles - INTEGER :: count_sum_casa ! number of time steps over which casa pools & - !and fluxes are aggregated (for output) - INTEGER :: rank, count, off, cnt, ierr + INTEGER :: ktau,ktauday,nday,idoy + + INTEGER :: k, j, l + INTEGER :: rank, off, cnt, ierr !$ if (.NOT.Allocated(LAIMax)) allocate(LAIMax(mp)) !$ if (.NOT.Allocated(Cleafmean)) allocate(Cleafmean(mp)) !$ if (.NOT.Allocated(Crootmean)) allocate(Crootmean(mp)) @@ -8650,9 +8557,9 @@ SUBROUTINE LUCdriver( casabiome,casapool, & USE cable_def_types_mod , ONLY: veg_parameter_type, mland USE cable_carbon_module - USE cable_common_module, ONLY: CABLE_USER, CurYear - USE casa_ncdf_module, ONLY: is_casa_time - USE cable_IO_vars_module, ONLY: logn, landpt, patch + USE cable_common_module, ONLY: CurYear + USE casa_ncdf_module, ONLY: is_casa_time + USE cable_IO_vars_module, ONLY: landpt USE casadimension USE casaparm USE casavariable diff --git a/src/offline/cable_mpiworker.F90 b/src/offline/cable_mpiworker.F90 index bf5e64d7d..6c06f0dea 100644 --- a/src/offline/cable_mpiworker.F90 +++ b/src/offline/cable_mpiworker.F90 @@ -69,7 +69,7 @@ MODULE cable_mpiworker USE cable_common_module, ONLY: cable_user USE casa_inout_module USE casa_cable -USE bgcdriver_mod, ONLY : bgcdriver + USE bgcdriver_mod, ONLY : bgcdriver IMPLICIT NONE @@ -80,12 +80,6 @@ MODULE cable_mpiworker PRIVATE - ! MPI: MPI derived datatype for receiving parameters from the master - INTEGER :: param_t - - ! MPI: MPI derived datatype for receiving casa parameters from the master - INTEGER :: casaparam_t - ! MPI: MPI derived datatype for receiving input from the master INTEGER :: inp_t @@ -127,9 +121,9 @@ SUBROUTINE mpidrv_worker (comm) USE cable_IO_vars_module, ONLY: logn,gswpfile,ncciy,leaps, globalMetfile, & verbose, fixedCO2,output,check,patchout, & patch_type,soilparmnew,& - defaultLAI, NO_CHECK + NO_CHECK USE cable_common_module, ONLY: ktau_gl, kend_gl, knode_gl, cable_user, & - cable_runtime, filename, myhome, & + cable_runtime, filename, & redistrb, wiltParam, satuParam, CurYear, & IS_LEAPYEAR, calcsoilalbedo, & kwidth_gl, gw_params @@ -158,9 +152,9 @@ SUBROUTINE mpidrv_worker (comm) USE CABLE_PLUME_MIP, ONLY: PLUME_MIP_TYPE USE cable_namelist_util, ONLY : get_namelist_file_name,& - CABLE_NAMELIST,arg_not_namelist + CABLE_NAMELIST -USE cbl_soil_snow_init_special_module + USE cbl_soil_snow_init_special_module IMPLICIT NONE ! MPI: @@ -182,14 +176,9 @@ SUBROUTINE mpidrv_worker (comm) ktauday, & ! day counter for CASA-CNP idoy, & ! day of year (1:365) counter for CASA-CNP nyear, & ! year counter for CASA-CNP - casa_it, & ! number of calls to CASA-CNP - ctime, & ! day count for casacnp YYYY, & ! LOY, & ! Length of Year - count_sum_casa, & ! number of time steps over which casa pools & - !and fluxes are aggregated (for output) - rank, & ! Rank of this worker - maxdiff(2) ! location of maximum in convergence test + rank ! Rank of this worker REAL :: dels ! time step size in seconds CHARACTER :: cRank*4 ! for worker-logfiles @@ -219,9 +208,6 @@ SUBROUTINE mpidrv_worker (comm) TYPE (casa_balance) :: casabal TYPE (phen_variable) :: phen TYPE (POP_TYPE) :: POP - TYPE (PLUME_MIP_TYPE) :: PLUME - CHARACTER :: cyear*4 - CHARACTER :: ncfile*99 ! declare vars for switches (default .FALSE.) etc declared thru namelist LOGICAL, SAVE :: & @@ -240,18 +226,12 @@ SUBROUTINE mpidrv_worker (comm) delsoilM, & ! allowed variation in soil moisture for spin up delsoilT ! allowed variation in soil temperature for spin up - ! temporary storage for soil moisture/temp. in spin up mode - REAL, ALLOCATABLE, DIMENSION(:,:) :: & - soilMtemp, & - soilTtemp - ! MPI: LOGICAL :: loop_exit ! MPI: exit flag for bcast to workers INTEGER :: stat(MPI_STATUS_SIZE) INTEGER :: icomm ! separate dupes of MPI communicator for send and recv INTEGER :: ocomm ! separate dupes of MPI communicator for send and recv INTEGER :: ierr - CHARACTER(len=200):: Run ! switches etc defined thru namelist (by default cable.nml) NAMELIST/CABLE/ & @@ -284,12 +264,11 @@ SUBROUTINE mpidrv_worker (comm) cable_user, & ! additional USER switches gw_params - INTEGER :: i,x,kk - INTEGER :: LALLOC, iu -!For consistency w JAC - REAL,ALLOCATABLE, SAVE :: c1(:,:) - REAL,ALLOCATABLE, SAVE :: rhoch(:,:) - REAL,ALLOCATABLE, SAVE :: xk(:,:) + INTEGER :: LALLOC + !For consistency w JAC + REAL,ALLOCATABLE, SAVE :: c1(:,:) + REAL,ALLOCATABLE, SAVE :: rhoch(:,:) + REAL,ALLOCATABLE, SAVE :: xk(:,:) ! END header ! Maciej: make sure the variable does not go out of scope @@ -430,7 +409,7 @@ SUBROUTINE mpidrv_worker (comm) IF ( CALL1 ) THEN - IF (.NOT.spinup) spinConv=.TRUE. + IF (.NOT.spinup) spinConv=.TRUE. ! MPI: bcast to workers so that they don't need to open the met ! file themselves @@ -485,7 +464,7 @@ SUBROUTINE mpidrv_worker (comm) & casabal,phen) ! MPI: POP restart received only if pop module AND casa are active - IF ( CABLE_USER%CALL_POP ) CALL worker_pop_types (comm,veg,casamet,pop) + IF ( CABLE_USER%CALL_POP ) CALL worker_pop_types (comm,veg,pop) END IF @@ -506,7 +485,7 @@ SUBROUTINE mpidrv_worker (comm) casamet,casabal, phen) IF ( CABLE_USER%CASA_DUMP_READ .OR. CABLE_USER%CASA_DUMP_WRITE ) & - CALL worker_casa_dump_types(comm, casamet, casaflux, phen, climate) + CALL worker_casa_dump_types(comm, casamet, casaflux, phen) WRITE(logn,*) 'cable_mpiworker, POPLUC: ', CABLE_USER%POPLUC WRITE(*,*) 'cable_mpiworker, POPLUC: ', CABLE_USER%POPLUC CALL flush(logn) @@ -688,7 +667,7 @@ SUBROUTINE mpidrv_worker (comm) IF ( IS_CASA_TIME("write", yyyy, ktau, kstart, & koffset, kend, ktauday, logn) ) THEN - ! write(logn,*), 'IN IS_CASA', casapool%cplant(:,1) + ! write(logn,*) 'IN IS_CASA', casapool%cplant(:,1) ! CALL MPI_Send (MPI_BOTTOM,1, casa_t,0,ktau_gl,ocomm,ierr) ENDIF @@ -733,10 +712,10 @@ SUBROUTINE mpidrv_worker (comm) IF (CABLE_USER%POPLUC) THEN - WRITE(logn,*), 'before MPI_Send casa_LUC' + WRITE(logn,*) 'before MPI_Send casa_LUC' ! worker sends casa updates required for LUC calculations here CALL MPI_Send (MPI_BOTTOM, 1, casa_LUC_t, 0, 0, ocomm, ierr) - WRITE(logn,*), 'after MPI_Send casa_LUC' + WRITE(logn,*) 'after MPI_Send casa_LUC' ! master calls LUCDriver here ! worker receives casa and POP updates CALL MPI_Recv( POP%pop_grid(1), POP%np, pop_t, 0, 0, icomm, stat, ierr ) @@ -970,7 +949,7 @@ SUBROUTINE worker_cable_params (comm,met,air,ssnow,veg,bgc,soil,canopy,& INTEGER :: bidx ! block index INTEGER :: ntyp ! total number of blocks - INTEGER :: rank, off, ierr2, rcount, pos + INTEGER :: rank, ierr2, rcount, pos CHARACTER, DIMENSION(:), ALLOCATABLE :: rbuf @@ -2480,9 +2459,9 @@ SUBROUTINE worker_cable_params (comm,met,air,ssnow,veg,bgc,soil,canopy,& pos = 0 CALL MPI_Unpack (rbuf, tsize, pos, MPI_BOTTOM, rcount, param_t, & comm, ierr) - IF (ierr /= MPI_SUCCESS) WRITE(*,*),'cable param unpack error, rank: ',rank,ierr + IF (ierr /= MPI_SUCCESS) WRITE(*,*)'cable param unpack error, rank: ',rank,ierr ELSE - WRITE(*,*),'cable param recv rank err err2 rcount: ',rank, ierr, ierr2, rcount + WRITE(*,*)'cable param recv rank err err2 rcount: ',rank, ierr, ierr2, rcount END IF DEALLOCATE(rbuf) @@ -3493,9 +3472,9 @@ SUBROUTINE worker_casa_params (comm,casabiome,casapool,casaflux,casamet,& pos = 0 CALL MPI_Unpack (rbuf, tsize, pos, MPI_BOTTOM, rcount, casa_t, & comm, ierr) - IF (ierr /= MPI_SUCCESS) WRITE(*,*),'casa params unpack error, rank: ',rank,ierr + IF (ierr /= MPI_SUCCESS) WRITE(*,*)'casa params unpack error, rank: ',rank,ierr ELSE - WRITE(*,*),'casa params recv rank err err2 rcount: ',rank, ierr, ierr2, rcount + WRITE(*,*)'casa params recv rank err err2 rcount: ',rank, ierr, ierr2, rcount END IF DEALLOCATE(rbuf) @@ -3723,16 +3702,11 @@ SUBROUTINE worker_outtype (comm,met,canopy,ssnow,rad,bal,air,soil,veg) INTEGER :: r1len, r2len, I1LEN, llen INTEGER :: rank, off, cnt - INTEGER :: bidx, midx, vidx, ierr + INTEGER :: bidx, ierr INTEGER :: tsize INTEGER(KIND=MPI_ADDRESS_KIND) :: text, tmplb - ! base index to make types indexing easier - INTEGER :: istart - - INTEGER :: i - CALL MPI_Comm_rank (comm, rank, ierr) ! MPI: calculate the sizes/extents of Fortran types used by @@ -5653,200 +5627,6 @@ SUBROUTINE worker_outtype (comm,met,canopy,ssnow,rad,bal,air,soil,veg) END SUBROUTINE worker_outtype - SUBROUTINE worker_time_update (met, kend, dels) - - USE cable_abort_module, ONLY: abort - USE cable_common_module, ONLY: ktau_gl - USE cable_def_types_mod - USE cable_IO_vars_module - - IMPLICIT NONE - - TYPE(met_type), INTENT(INOUT) :: met - INTEGER, INTENT(IN) :: kend ! number of time steps in simulation - REAL, INTENT(IN) :: dels ! time step size - - INTEGER :: i - - DO i=1,mland ! over all land points/grid cells - ! First set timing variables: - ! All timing details below are initially written to the first patch - ! of each gridcell, then dumped to all patches for the gridcell. - IF(ktau_gl==1) THEN ! initialise... - SELECT CASE(time_coord) - CASE('LOC')! i.e. use local time by default - ! hour-of-day = starting hod - met%hod(landpt(i)%cstart) = shod - met%doy(landpt(i)%cstart) = sdoy - met%moy(landpt(i)%cstart) = smoy - met%year(landpt(i)%cstart) = syear - CASE('GMT')! use GMT - ! hour-of-day = starting hod + offset from GMT time: - met%hod(landpt(i)%cstart) = shod + (longitude(i)/180.0)*12.0 - ! Note above that all met%* vars have dim mp, - ! while longitude and latitude have dimension mland. - met%doy(landpt(i)%cstart) = sdoy - met%moy(landpt(i)%cstart) = smoy - met%year(landpt(i)%cstart) = syear - CASE DEFAULT - CALL abort('Unknown time coordinate! ' & - //' (SUBROUTINE get_met_data)') - END SELECT - ELSE - ! increment hour-of-day by time step size: - met%hod(landpt(i)%cstart) = met%hod(landpt(i)%cstart) + dels/3600.0 - END IF - ! - IF(met%hod(landpt(i)%cstart)<0.0) THEN ! may be -ve since longitude - ! has range [-180,180] - ! Reduce day-of-year by one and ammend hour-of-day: - met%doy(landpt(i)%cstart) = met%doy(landpt(i)%cstart) - 1 - met%hod(landpt(i)%cstart) = met%hod(landpt(i)%cstart) + 24.0 - ! If a leap year AND we're using leap year timing: - IF(((MOD(syear,4)==0.AND.MOD(syear,100)/=0).OR. & - (MOD(syear,4)==0.AND.MOD(syear,400)==0)).AND.leaps) THEN - SELECT CASE(INT(met%doy(landpt(i)%cstart))) - CASE(0) ! ie Dec previous year - met%moy(landpt(i)%cstart) = 12 - met%year(landpt(i)%cstart) = met%year(landpt(i)%cstart) - 1 - met%doy(landpt(i)%cstart) = 365 ! prev year not leap year as this is - CASE(31) ! Jan - met%moy(landpt(i)%cstart) = 1 - CASE(60) ! Feb - met%moy(landpt(i)%cstart) = 2 - CASE(91) ! Mar - met%moy(landpt(i)%cstart) = 3 - CASE(121) - met%moy(landpt(i)%cstart) = 4 - CASE(152) - met%moy(landpt(i)%cstart) = 5 - CASE(182) - met%moy(landpt(i)%cstart) = 6 - CASE(213) - met%moy(landpt(i)%cstart) = 7 - CASE(244) - met%moy(landpt(i)%cstart) = 8 - CASE(274) - met%moy(landpt(i)%cstart) = 9 - CASE(305) - met%moy(landpt(i)%cstart) = 10 - CASE(335) - met%moy(landpt(i)%cstart) = 11 - END SELECT - ELSE ! not a leap year or not using leap year timing - SELECT CASE(INT(met%doy(landpt(i)%cstart))) - CASE(0) ! ie Dec previous year - met%moy(landpt(i)%cstart) = 12 - met%year(landpt(i)%cstart) = met%year(landpt(i)%cstart) - 1 - ! If previous year is a leap year - IF((MOD(syear,4)==0.AND.MOD(syear,100)/=0).OR. & - (MOD(syear,4)==0.AND.MOD(syear,400)==0)) THEN - met%doy(landpt(i)%cstart) = 366 - ELSE - met%doy(landpt(i)%cstart) = 365 - END IF - CASE(31) ! Jan - met%moy(landpt(i)%cstart) = 1 - CASE(59) ! Feb - met%moy(landpt(i)%cstart) = 2 - CASE(90) - met%moy(landpt(i)%cstart) = 3 - CASE(120) - met%moy(landpt(i)%cstart) = 4 - CASE(151) - met%moy(landpt(i)%cstart) = 5 - CASE(181) - met%moy(landpt(i)%cstart) = 6 - CASE(212) - met%moy(landpt(i)%cstart) = 7 - CASE(243) - met%moy(landpt(i)%cstart) = 8 - CASE(273) - met%moy(landpt(i)%cstart) = 9 - CASE(304) - met%moy(landpt(i)%cstart) = 10 - CASE(334) - met%moy(landpt(i)%cstart) = 11 - END SELECT - END IF ! if leap year or not - ELSE IF(met%hod(landpt(i)%cstart)>=24.0) THEN - ! increment or GMT adj has shifted day - ! Adjust day-of-year and hour-of-day: - met%doy(landpt(i)%cstart) = met%doy(landpt(i)%cstart) + 1 - met%hod(landpt(i)%cstart) = met%hod(landpt(i)%cstart) - 24.0 - ! If a leap year AND we're using leap year timing: - IF(((MOD(syear,4)==0.AND.MOD(syear,100)/=0).OR. & - (MOD(syear,4)==0.AND.MOD(syear,400)==0)).AND.leaps) THEN - SELECT CASE(INT(met%doy(landpt(i)%cstart))) - CASE(32) ! Feb - met%moy(landpt(i)%cstart) = 2 - CASE(61) ! Mar - met%moy(landpt(i)%cstart) = 3 - CASE(92) - met%moy(landpt(i)%cstart) = 4 - CASE(122) - met%moy(landpt(i)%cstart) = 5 - CASE(153) - met%moy(landpt(i)%cstart) = 6 - CASE(183) - met%moy(landpt(i)%cstart) = 7 - CASE(214) - met%moy(landpt(i)%cstart) = 8 - CASE(245) - met%moy(landpt(i)%cstart) = 9 - CASE(275) - met%moy(landpt(i)%cstart) = 10 - CASE(306) - met%moy(landpt(i)%cstart) = 11 - CASE(336) - met%moy(landpt(i)%cstart) = 12 - CASE(367)! end of year; increment - met%year(landpt(i)%cstart) = met%year(landpt(i)%cstart) + 1 - met%moy(landpt(i)%cstart) = 1 - met%doy(landpt(i)%cstart) = 1 - END SELECT - ! ELSE IF not leap year and Dec 31st, increment year - ELSE - SELECT CASE(INT(met%doy(landpt(i)%cstart))) - CASE(32) ! Feb - met%moy(landpt(i)%cstart) = 2 - CASE(60) ! Mar - met%moy(landpt(i)%cstart) = 3 - CASE(91) - met%moy(landpt(i)%cstart) = 4 - CASE(121) - met%moy(landpt(i)%cstart) = 5 - CASE(152) - met%moy(landpt(i)%cstart) = 6 - CASE(182) - met%moy(landpt(i)%cstart) = 7 - CASE(213) - met%moy(landpt(i)%cstart) = 8 - CASE(244) - met%moy(landpt(i)%cstart) = 9 - CASE(274) - met%moy(landpt(i)%cstart) = 10 - CASE(305) - met%moy(landpt(i)%cstart) = 11 - CASE(335) - met%moy(landpt(i)%cstart) = 12 - CASE(366)! end of year; increment - met%year(landpt(i)%cstart) = met%year(landpt(i)%cstart) + 1 - met%moy(landpt(i)%cstart) = 1 - met%doy(landpt(i)%cstart) = 1 - END SELECT - END IF ! if leap year or not - END IF ! if increment has pushed hod to a different day - ! Now copy these values to all veg/soil patches in the current grid cell: - met%hod(landpt(i)%cstart:landpt(i)%cend) = met%hod(landpt(i)%cstart) - met%doy(landpt(i)%cstart:landpt(i)%cend) = met%doy(landpt(i)%cstart) - met%moy(landpt(i)%cstart:landpt(i)%cend) = met%moy(landpt(i)%cstart) - met%year(landpt(i)%cstart:landpt(i)%cend) = met%year(landpt(i)%cstart) - ENDDO - - RETURN - - END SUBROUTINE worker_time_update ! creates MPI types for sending casa results back to the master at ! the end of the simulation @@ -5891,8 +5671,8 @@ SUBROUTINE worker_casa_type (comm, casapool,casaflux, & ! MPI: block lengths and strides for hvector representing matrices INTEGER :: r1len, r2len, I1LEN, llen - INTEGER :: rank, off, cnt - INTEGER :: bidx, midx, vidx, ierr + INTEGER :: off, cnt + INTEGER :: bidx, ierr INTEGER :: tsize INTEGER(KIND=MPI_ADDRESS_KIND) :: text, tmplb @@ -6411,20 +6191,14 @@ SUBROUTINE worker_climate_types (comm, climate, ktauday ) INTEGER, ALLOCATABLE, DIMENSION(:) :: types INTEGER :: ntyp ! number of worker's types - INTEGER :: last2d, i - - ! MPI: block lenghts for hindexed representing all vectors - INTEGER, ALLOCATABLE, DIMENSION(:) :: blen - ! MPI: block lengths and strides for hvector representing matrices INTEGER :: r1len, r2len, I1LEN - INTEGER(KIND=MPI_ADDRESS_KIND) :: r1stride, r2stride - INTEGER :: tsize, totalrecv, totalsend + INTEGER :: tsize, totalrecv INTEGER(KIND=MPI_ADDRESS_KIND) :: text, tmplb - INTEGER :: rank, off, cnt - INTEGER :: bidx, midx, vidx, ierr, ny, nd, ndq + INTEGER :: rank, off + INTEGER :: bidx, ierr, ny, nd, ndq INTEGER :: stat(MPI_STATUS_SIZE), ierr2, rcount, pos @@ -6650,9 +6424,9 @@ SUBROUTINE worker_climate_types (comm, climate, ktauday ) pos = 0 CALL MPI_Unpack (rbuf, tsize, pos, MPI_BOTTOM, rcount, climate_t, & comm, ierr) - IF (ierr /= MPI_SUCCESS) WRITE(*,*),'climate unpack error, rank: ',rank,ierr + IF (ierr /= MPI_SUCCESS) WRITE(*,*)'climate unpack error, rank: ',rank,ierr ELSE - WRITE(*,*),'climate recv rank err err2 rcount: ',rank, ierr, ierr2, rcount + WRITE(*,*)'climate recv rank err err2 rcount: ',rank, ierr, ierr2, rcount END IF DEALLOCATE(rbuf) @@ -6691,7 +6465,7 @@ SUBROUTINE worker_restart_type (comm, canopy, air) INTEGER :: r1len, r2len, I1LEN, llen INTEGER :: rank, off, cnt - INTEGER :: bidx, midx, vidx, ierr, nd, ny + INTEGER :: bidx, ierr INTEGER :: tsize INTEGER(KIND=MPI_ADDRESS_KIND) :: text, tmplb @@ -6810,7 +6584,7 @@ SUBROUTINE worker_restart_type (comm, canopy, air) END SUBROUTINE worker_restart_type - SUBROUTINE worker_casa_dump_types(comm, casamet, casaflux, phen, climate) + SUBROUTINE worker_casa_dump_types(comm, casamet, casaflux, phen) USE mpi @@ -6825,7 +6599,6 @@ SUBROUTINE worker_casa_dump_types(comm, casamet, casaflux, phen, climate) TYPE (casa_flux) , INTENT(INOUT) :: casaflux TYPE (casa_met) , INTENT(INOUT) :: casamet TYPE (phen_variable), INTENT(INOUT) :: phen - TYPE (climate_type):: climate ! local vars @@ -6838,10 +6611,9 @@ SUBROUTINE worker_casa_dump_types(comm, casamet, casaflux, phen, climate) INTEGER(KIND=MPI_ADDRESS_KIND) :: text, tmplb INTEGER :: tsize - INTEGER :: stat(MPI_STATUS_SIZE), ierr - INTEGER :: landp_t, patch_t, param_t + INTEGER :: ierr - INTEGER :: r1len, r2len, I1LEN, llen ! block lengths + INTEGER :: r1len, r2len, I1LEN ! block lengths INTEGER :: bidx ! block index INTEGER :: ntyp ! total number of blocks @@ -6977,10 +6749,9 @@ SUBROUTINE worker_casa_LUC_types(comm, casapool, casabal) INTEGER(KIND=MPI_ADDRESS_KIND) :: text, tmplb INTEGER :: tsize - INTEGER :: stat(MPI_STATUS_SIZE), ierr - INTEGER :: landp_t, patch_t, param_t + INTEGER :: ierr - INTEGER :: r1len, r2len, I1LEN, llen ! block lengths + INTEGER :: r1len, r2len, I1LEN ! block lengths INTEGER :: bidx ! block index INTEGER :: ntyp ! total number of blocks @@ -7089,7 +6860,7 @@ SUBROUTINE worker_casa_LUC_types(comm, casapool, casabal) END SUBROUTINE worker_casa_LUC_types - SUBROUTINE worker_pop_types(comm, veg, casamet, pop) + SUBROUTINE worker_pop_types(comm, veg, pop) USE mpi USE POP_mpi @@ -7102,7 +6873,6 @@ SUBROUTINE worker_pop_types(comm, veg, casamet, pop) IMPLICIT NONE INTEGER, INTENT(IN) :: comm - TYPE (casa_met), INTENT(IN) :: casamet TYPE (pop_type), INTENT(INOUT) :: pop TYPE (veg_parameter_type),INTENT(IN) :: veg @@ -7115,31 +6885,31 @@ SUBROUTINE worker_pop_types(comm, veg, casamet, pop) ! Get POP relevant info from Master CALL MPI_Recv ( mp_pop, 1, MPI_INTEGER, 0, 0, comm, stat, ierr ) - WRITE(*,*),'worker iwood to allocate', rank, mp_pop, mp - !write(*,*),'worker mppop', rank, mp_pop + WRITE(*,*)'worker iwood to allocate', rank, mp_pop, mp + !write(*,*)'worker mppop', rank, mp_pop !ALLOCATE( POP%Iwood( mp_pop ) ) ALLOCATE( Iwood( mp_pop ) ) - WRITE(*,*),'worker iwood allocated', rank, mp_pop + WRITE(*,*)'worker iwood allocated', rank, mp_pop !CALL MPI_Recv ( POP%Iwood, mp_pop, MPI_INTEGER, 0, 0, comm, stat, ierr ) CALL MPI_Recv ( Iwood, mp_pop, MPI_INTEGER, 0, 0, comm, stat, ierr ) - !write(*,*),'worker Iwood', rank, POP%Iwood + !write(*,*)'worker Iwood', rank, POP%Iwood ! Maciej IF (ANY (Iwood < 1) .OR. ANY (Iwood > mp)) THEN - WRITE(*,*),'worker iwood values outside valid ranges', rank + WRITE(*,*) 'worker iwood values outside valid ranges', rank inv = COUNT(Iwood < 1) IF (inv .GT. 0) THEN - WRITE(*,*),'no of values below 1: ', inv + WRITE(*,*) 'no of values below 1: ', inv ALLOCATE (ainv(inv)) ainv = PACK (Iwood, Iwood .LT. 1) - WRITE (*,*),'values below 1: ', ainv + WRITE (*,*) 'values below 1: ', ainv DEALLOCATE (ainv) END IF inv = COUNT(Iwood > mp) IF (inv .GT. 0) THEN - WRITE(*,*),'no of values above mp ', mp, inv + WRITE(*,*) 'no of values above mp ', mp, inv ALLOCATE (ainv(inv)) ainv = PACK (Iwood, Iwood .GT. mp) - WRITE (*,*),'values above mp: ', ainv + WRITE (*,*) 'values above mp: ', ainv DEALLOCATE (ainv) END IF @@ -7156,7 +6926,7 @@ SUBROUTINE worker_pop_types(comm, veg, casamet, pop) CALL create_pop_gridcell_type (pop_t, comm) IF (.NOT. CABLE_USER%POP_fromZero ) THEN - WRITE(*,*),'rank receiving pop_grid from master', rank + WRITE(*,*) 'rank receiving pop_grid from master', rank CALL MPI_Recv( POP%pop_grid(1), mp_pop, pop_t, 0, 0, comm, stat, ierr ) END IF @@ -7230,7 +7000,7 @@ SUBROUTINE worker_spincasacnp( dels,kstart,kend,mloop,veg,soil,casabiome,casapoo USE POPMODULE, ONLY: POPStep USE TypeDef, ONLY: i4b, dp USE mpi - USE biogeochem_mod, ONLY : biogeochem + USE biogeochem_mod, ONLY : biogeochem !mrd561 debug USE cable_IO_vars_module, ONLY: logn @@ -7257,7 +7027,6 @@ SUBROUTINE worker_spincasacnp( dels,kstart,kend,mloop,veg,soil,casabiome,casapoo ! communicator for error-messages INTEGER, INTENT(IN) :: icomm, ocomm - TYPE (casa_met) :: casaspin ! local variables REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_cleaf2met, avg_cleaf2str, avg_croot2met, avg_croot2str, avg_cwood2cwd @@ -7269,36 +7038,22 @@ SUBROUTINE worker_spincasacnp( dels,kstart,kend,mloop,veg,soil,casabiome,casapoo REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_ratioNCsoilmic, avg_ratioNCsoilslow, avg_ratioNCsoilpass REAL(r_2), DIMENSION(:), ALLOCATABLE, SAVE :: avg_xnplimit, avg_xkNlimiting,avg_xklitter, avg_xksoil - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_af - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_aw - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_ar - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_lf - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_lw - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_lr - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_annual_cnpp + REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_af + REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_aw + REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_ar + REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_lf + REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_lw + REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_lr + REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_annual_cnpp ! local variables INTEGER :: myearspin,nyear, nloop1, LOY - CHARACTER(LEN=99) :: ncfile - CHARACTER(LEN=4) :: cyear - INTEGER :: ktau,ktauday,nday,idoy,ktaux,ktauy,nloop - INTEGER, SAVE :: ndays + INTEGER :: ktau,ktauday,nday,idoy,ktauy,nloop REAL, DIMENSION(mp) :: cleaf2met, cleaf2str, croot2met, croot2str, cwood2cwd REAL, DIMENSION(mp) :: nleaf2met, nleaf2str, nroot2met, nroot2str, nwood2cwd REAL, DIMENSION(mp) :: pleaf2met, pleaf2str, proot2met, proot2str, pwood2cwd - REAL, DIMENSION(mp) :: xcgpp, xcnpp, xnuptake, xpuptake - REAL, DIMENSION(mp) :: xnsoilmin, xpsoillab, xpsoilsorb,xpsoilocc REAL(r_2), DIMENSION(mp) :: xnplimit, xkNlimiting, xklitter, xksoil,xkleaf, xkleafcold, xkleafdry - ! more variables to store the spinup pool size over the last 10 loops. Added by Yp Wang 30 Nov 2012 - REAL, DIMENSION(5,mvtype,mplant) :: bmcplant, bmnplant, bmpplant - REAL, DIMENSION(5,mvtype,mlitter) :: bmclitter, bmnlitter, bmplitter - REAL, DIMENSION(5,mvtype,msoil) :: bmcsoil, bmnsoil, bmpsoil - REAL, DIMENSION(5,mvtype) :: bmnsoilmin,bmpsoillab,bmpsoilsorb, bmpsoilocc - REAL, DIMENSION(mvtype) :: bmarea - INTEGER nptx,nvt,kloop - - REAL(dp) :: StemNPP(mp,2) INTEGER, ALLOCATABLE :: Iw(:) ! array of indices corresponding to woody (shrub or forest) tiles @@ -7453,57 +7208,57 @@ SUBROUTINE worker_spincasacnp( dels,kstart,kend,mloop,veg,soil,casabiome,casapoo ENDDO ENDDO - ! Average the plant allocation fraction - avg_af = avg_af / REAL(nday) - avg_aw = avg_aw / REAL(nday) - avg_ar = avg_ar / REAL(nday) + ! Average the plant allocation fraction + avg_af = avg_af / REAL(nday) + avg_aw = avg_aw / REAL(nday) + avg_ar = avg_ar / REAL(nday) - ! Average the plant turnover fraction - avg_lf = avg_lf / REAL(nday) - avg_lw = avg_lw / REAL(nday) - avg_lr = avg_lr / REAL(nday) + ! Average the plant turnover fraction + avg_lf = avg_lf / REAL(nday) + avg_lw = avg_lw / REAL(nday) + avg_lr = avg_lr / REAL(nday) - ! Need the annual NPP to solve plant pools g C m-2 y-1 - avg_annual_cnpp = avg_cnpp / REAL(myearspin) + ! Need the annual NPP to solve plant pools g C m-2 y-1 + avg_annual_cnpp = avg_cnpp / REAL(myearspin) - avg_cleaf2met = avg_cleaf2met/REAL(nday) - avg_cleaf2str = avg_cleaf2str/REAL(nday) - avg_croot2met = avg_croot2met/REAL(nday) - avg_croot2str = avg_croot2str/REAL(nday) - avg_cwood2cwd = avg_cwood2cwd/REAL(nday) + avg_cleaf2met = avg_cleaf2met/REAL(nday) + avg_cleaf2str = avg_cleaf2str/REAL(nday) + avg_croot2met = avg_croot2met/REAL(nday) + avg_croot2str = avg_croot2str/REAL(nday) + avg_cwood2cwd = avg_cwood2cwd/REAL(nday) - avg_nleaf2met = avg_nleaf2met/REAL(nday) - avg_nleaf2str = avg_nleaf2str/REAL(nday) - avg_nroot2met = avg_nroot2met/REAL(nday) - avg_nroot2str = avg_nroot2str/REAL(nday) - avg_nwood2cwd = avg_nwood2cwd/REAL(nday) + avg_nleaf2met = avg_nleaf2met/REAL(nday) + avg_nleaf2str = avg_nleaf2str/REAL(nday) + avg_nroot2met = avg_nroot2met/REAL(nday) + avg_nroot2str = avg_nroot2str/REAL(nday) + avg_nwood2cwd = avg_nwood2cwd/REAL(nday) - avg_pleaf2met = avg_pleaf2met/REAL(nday) - avg_pleaf2str = avg_pleaf2str/REAL(nday) - avg_proot2met = avg_proot2met/REAL(nday) - avg_proot2str = avg_proot2str/REAL(nday) - avg_pwood2cwd = avg_pwood2cwd/REAL(nday) + avg_pleaf2met = avg_pleaf2met/REAL(nday) + avg_pleaf2str = avg_pleaf2str/REAL(nday) + avg_proot2met = avg_proot2met/REAL(nday) + avg_proot2str = avg_proot2str/REAL(nday) + avg_pwood2cwd = avg_pwood2cwd/REAL(nday) - avg_cgpp = avg_cgpp/REAL(nday) - avg_cnpp = avg_cnpp/REAL(nday) + avg_cgpp = avg_cgpp/REAL(nday) + avg_cnpp = avg_cnpp/REAL(nday) - avg_nuptake = avg_nuptake/REAL(nday) - avg_puptake = avg_puptake/REAL(nday) + avg_nuptake = avg_nuptake/REAL(nday) + avg_puptake = avg_puptake/REAL(nday) - avg_xnplimit = avg_xnplimit/REAL(nday) - avg_xkNlimiting = avg_xkNlimiting/REAL(nday) - avg_xklitter = avg_xklitter/REAL(nday) + avg_xnplimit = avg_xnplimit/REAL(nday) + avg_xkNlimiting = avg_xkNlimiting/REAL(nday) + avg_xklitter = avg_xklitter/REAL(nday) - avg_xksoil = avg_xksoil/REAL(nday) + avg_xksoil = avg_xksoil/REAL(nday) - avg_nsoilmin = avg_nsoilmin/REAL(nday) - avg_psoillab = avg_psoillab/REAL(nday) - avg_psoilsorb = avg_psoilsorb/REAL(nday) - avg_psoilocc = avg_psoilocc/REAL(nday) + avg_nsoilmin = avg_nsoilmin/REAL(nday) + avg_psoillab = avg_psoillab/REAL(nday) + avg_psoilsorb = avg_psoilsorb/REAL(nday) + avg_psoilocc = avg_psoilocc/REAL(nday) - avg_rationcsoilmic = avg_rationcsoilmic /REAL(nday) - avg_rationcsoilslow = avg_rationcsoilslow /REAL(nday) - avg_rationcsoilpass = avg_rationcsoilpass /REAL(nday) + avg_rationcsoilmic = avg_rationcsoilmic /REAL(nday) + avg_rationcsoilslow = avg_rationcsoilslow /REAL(nday) + avg_rationcsoilpass = avg_rationcsoilpass /REAL(nday) CALL analyticpool(kend,veg,soil,casabiome,casapool, & casaflux,casamet,casabal,phen, & @@ -7600,7 +7355,7 @@ SUBROUTINE worker_CASAONLY_LUC( dels,kstart,kend,veg,soil,casabiome,casapool, & USE POPMODULE, ONLY: POPStep USE TypeDef, ONLY: i4b, dp USE mpi - USE biogeochem_mod, ONLY : biogeochem + USE biogeochem_mod, ONLY : biogeochem !mrd561 debug USE cable_IO_vars_module, ONLY: logn @@ -7626,39 +7381,15 @@ SUBROUTINE worker_CASAONLY_LUC( dels,kstart,kend,veg,soil,casabiome,casapool, & ! communicator for error-messages INTEGER, INTENT(IN) :: icomm, ocomm - TYPE (casa_met) :: casaspin ! local variables - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_cleaf2met, avg_cleaf2str, avg_croot2met, avg_croot2str, avg_cwood2cwd - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_nleaf2met, avg_nleaf2str, avg_nroot2met, avg_nroot2str, avg_nwood2cwd - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_pleaf2met, avg_pleaf2str, avg_proot2met, avg_proot2str, avg_pwood2cwd - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_cgpp, avg_cnpp, avg_nuptake, avg_puptake - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_nsoilmin, avg_psoillab, avg_psoilsorb, avg_psoilocc - !chris 12/oct/2012 for spin up casa - REAL, DIMENSION(:), ALLOCATABLE, SAVE :: avg_ratioNCsoilmic, avg_ratioNCsoilslow, avg_ratioNCsoilpass - REAL(r_2), DIMENSION(:), ALLOCATABLE, SAVE :: avg_xnplimit, avg_xkNlimiting,avg_xklitter, avg_xksoil - - ! local variables - INTEGER :: myearspin,nyear, nloop1 - CHARACTER(LEN=99) :: ncfile - CHARACTER(LEN=4) :: cyear - INTEGER :: ktau,ktauday,nday,idoy,ktaux,ktauy,nloop - INTEGER, SAVE :: ndays + INTEGER :: myearspin,nyear + INTEGER :: ktau,ktauday,nday,idoy REAL, DIMENSION(mp) :: cleaf2met, cleaf2str, croot2met, croot2str, cwood2cwd REAL, DIMENSION(mp) :: nleaf2met, nleaf2str, nroot2met, nroot2str, nwood2cwd REAL, DIMENSION(mp) :: pleaf2met, pleaf2str, proot2met, proot2str, pwood2cwd - REAL, DIMENSION(mp) :: xcgpp, xcnpp, xnuptake, xpuptake - REAL, DIMENSION(mp) :: xnsoilmin, xpsoillab, xpsoilsorb,xpsoilocc REAL(r_2), DIMENSION(mp) :: xnplimit, xkNlimiting, xklitter, xksoil,xkleaf, xkleafcold, xkleafdry - ! more variables to store the spinup pool size over the last 10 loops. Added by Yp Wang 30 Nov 2012 - REAL, DIMENSION(5,mvtype,mplant) :: bmcplant, bmnplant, bmpplant - REAL, DIMENSION(5,mvtype,mlitter) :: bmclitter, bmnlitter, bmplitter - REAL, DIMENSION(5,mvtype,msoil) :: bmcsoil, bmnsoil, bmpsoil - REAL, DIMENSION(5,mvtype) :: bmnsoilmin,bmpsoillab,bmpsoilsorb, bmpsoilocc - REAL, DIMENSION(mvtype) :: bmarea - INTEGER nptx,nvt,kloop - REAL(dp) :: StemNPP(mp,2) @@ -7712,7 +7443,7 @@ SUBROUTINE worker_CASAONLY_LUC( dels,kstart,kend,veg,soil,casabiome,casapool, & CALL MPI_Comm_rank (icomm, rank, ierr) WRITE(logn,*) - WRITE(logn,*),'rank receiving pop_grid from master', rank + WRITE(logn,*) 'rank receiving pop_grid from master', rank !$ write(logn,*) 'b4 MPI_Recv, pop_t cmass: ', POP%pop_grid%cmass_sum !$ write(logn,*) 'b4 MPI_Recv, pop_t LU: ', POP%pop_grid%LU CALL MPI_Recv( POP%pop_grid(1), POP%np, pop_t, 0, 0, icomm, stat, ierr ) @@ -7721,7 +7452,7 @@ SUBROUTINE worker_CASAONLY_LUC( dels,kstart,kend,veg,soil,casabiome,casapool, & WRITE(logn,*) 'after MPI_Recv, pop_t ' CALL flush(logn) IF (cable_user%CALL_POP .AND. POP%np.GT.0) THEN ! CALL_POP - WRITE(logn,*), 'b4 POPdriver', POP%pop_grid%cmass_sum + WRITE(logn,*) 'b4 POPdriver', POP%pop_grid%cmass_sum CALL POPdriver(casaflux,casabal,veg, POP) ENDIF From 183df1f22c3187b7c6098db26e85f46217511dd5 Mon Sep 17 00:00:00 2001 From: rml599gh Date: Mon, 14 Oct 2024 14:19:21 +1100 Subject: [PATCH 84/85] Removed ESM15 version with hard-wired parameter, #278 --- src/science/casa-cnp/casa_cnp.F90 | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/science/casa-cnp/casa_cnp.F90 b/src/science/casa-cnp/casa_cnp.F90 index 5f1a08511..f3295cca0 100644 --- a/src/science/casa-cnp/casa_cnp.F90 +++ b/src/science/casa-cnp/casa_cnp.F90 @@ -1341,13 +1341,11 @@ SUBROUTINE casa_delsoil(veg,casapool,casaflux,casamet,casabiome) +casaflux%Psimm(nland) ! net mineralization -# ifdef ESM15 - casaflux%Pleach(nland) = (1.0e-4) & - * max(0.0,casapool%Psoillab(nland)) -# else + !rml 14/10/24 #278 remove ESM15 specific version as can be + !accommodated by setting appropriate parameter in pftlookup casaflux%Pleach(nland) = casaflux%fPleach(nland) & * MAX(0.0,casapool%Psoillab(nland)) -# endif + DO k=1,msoil DO j=1,mlitter casaflux%FluxPtosoil(nland,k) = casaflux%FluxPtosoil(nland,k) & From d0688cb0332ed5f4e8bb381dd7e680aa21284069 Mon Sep 17 00:00:00 2001 From: rml599gh Date: Fri, 18 Oct 2024 09:27:24 +1100 Subject: [PATCH 85/85] User guide edit to pftlookup table to note xfPleach hard-wired in CABLE2.4/ACCESS-ESM1.5 --- documentation/docs/user_guide/inputs/pftlookup_csv.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/user_guide/inputs/pftlookup_csv.md b/documentation/docs/user_guide/inputs/pftlookup_csv.md index 7dba56181..14154b063 100644 --- a/documentation/docs/user_guide/inputs/pftlookup_csv.md +++ b/documentation/docs/user_guide/inputs/pftlookup_csv.md @@ -107,7 +107,7 @@ on soil, vegetation carbon and nutrients dynamics. | fpptoL(frt) | `casabiome%ftransPPtoL(nv,froot)` | Flux factor of root phosphorus to litter pools \( (-) \) | | xkmlabp | `xkmlabp(iso)` | Phosphorus absorption \( (gP \cdot m^{-2}) \) | | xpsorbmax | `xpsorbmax(iso)` | Maximum phosphorus absorption \( (gP \cdot m^{-2}) \) | -| xfpleach | `xfPleach(iso)` | Phosphorus leaching \( (-) \) | +| xfpleach | `xfPleach(iso)` | Phosphorus leaching \( (-) \) (hard-wired in the code for CABLE2.4/ACCESS-ESM1.5 at 1.e-4 independent of pft) | | N:Psoil (mic) | `ratioNPsoil(iso,mic)` | Nitrogen to phosphorus ratio in microbial soil pool \( (gN \cdot gP^{-2}) \) | | N:Psoil (slow) | `ratioNPsoil(iso,slow)` | Nitrogen to phosphorus ratio in slow soil pool \( (gN \cdot gP^{-2}) \) | | N:Psoil (pass) | `ratioNPsoil(iso,pass)` | Nitrogen to phosphorus ratio in passive soil pool \( (gN \cdot gP^{-2}) \) |

    e82^XM`WE?D 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%0AX$>?9>pgy>{;KP}_ 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
    gm0zNXxL?%qBrxr#=VS{|T!(m8fyHi98(10nr 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 literal 285927 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

-~(v1CM0r^P4nIW4~6f0)k+q)4%++8C?XfG}!Q~D8aBO^_qP{_6auhzA-(#Hw2 zvwesZ6kMHXUzLcC+Tezap93CG@WzhF6#Tabkd^gKdmnZATli4PrpSbKbL(mnLWk}x zLRNm+#&41;%sM{yr4;#%MMN^d@NXz`!_R+)GJv&2wxu-oqt)4qTKOtgxWa9ZT07Q?V1Mg=V<$s@QKJX9%vjhBO9&khFU_tjA2EjkGM*VAef<)k< zOSrZ0T{UppzQSy~FJtQu9r-(bLjrr~uOQ9e{oD7Sc{u^8Z5D{t`{U*cSO05${u!v(HSiD#pWYofis&MNMnnKa{_7Ly-9LT~5j=D=rT7Aq z_OAu}kC|Znt?+GsWwiT`h5N5K{a2ix^Znm1PW6GGAFr(u+4?zT~#uP5aqde?uaxPJUh zN8BqUI=`d?V?k0(=*Lh0^|F5yAW;KMjqO2=|ER`3gNJnGWikHrD!)Qtrrhc|;36Vn z`VXT5JoH)NHvEtn7~~u^FfQ6w!9MUbCd`w21xqEdVj;nG#=r!0L+ zT@YS+B_+iFM{WP#W%_?*ndHwv^NwUE_tX9nUZR%*0&@p9vg(lkf-9{46f-s%5`gj! zz>WO5*wnWtt4sSuUnHpN%H+Si4jg)QqYyiX1B{9E;fy77II`o#L7MVGT9>~8AO<8{ zTwEp~fJf7EFxxo=vZ-ZavSo*mFo7pUYfHvPAPF9 zDW0Nk?l1f2H<&_Bm0VeRLEe)&Ra#493^c;K10CcRl{fRXv)falNKTG6lk4Dahjd9w zp+SD>f%aWYiL#N7u3qh4map$0SSy93wT07TWe7dwrFfALgBe1gqu)&C2qn3pdf@#v z;5u98nw_|WL}`s~wFX@~!~BLpT#>-Y{hhL!YN;C6x?xI%$U72VE8dvwCY7aqQ|#^T zNnT6M-0-IKUgOr?htrE|jWe$Gj`33*=-nH`pcJ^)K+9Q75|DOK2-kTuYP&s3-i<9# zIz2sA@?%OAFo_9IOr+&7d{8nmq0tvgp-Ns$5#0F-q>}GT)8lPeW-h&vTneLsmcb#x z2R^j}!cpS+a%0~U5!aogGYI6LBQn8Ah;vc)YO3V^f(S(cLD1p+MB4@NE084&LSVFP6i&ib={Wr*#YLi zN@|VJV-;l9?lH?e|8QwXUxn!;PBVE^{>c*}0vRvG5t_$+y|znZrX*XnPW~= zO;#&C$J8wk-^}z19$8~Ln810~VX~DpH%F2i9b9S?W%x*4)oSlkc0L_uC2|S)&oKKw z9z5(d(B+>|(ZIYnj*kFLn-+TZWu?T@!hZ0Ecqo&U+y>Ub*q9*#R$*z@74}2u8OvAP z$C9oqyD`UK5U+4rR;mNp@4{?ZETc|h;vv_`0kJg=%$cr2nqn8SQGwQ$QhYo(O+{c< z#0hyhU;aokv^1w!$_-jvQ=+gf79JW4n- zkCJVY#{h?R=H7nnxr}BqT2+_3v&+jdc_k&P>gqoCuvY`iAlA6Dy!vK4?D0-d__Kp8 zj@_Vp>xU zmh+tJx>Ew-A8ui+!It zai(R;sH9bNb-;DWE{?A?X}5vH+uM8pX&2$f@qAvRaT1OeEd{i79=;;KM)vx7VWG?; z)do)TgLcrzc8=<*5Bo~yft2hUk=-PAFL|;L5;JFdOQiWSTd{zR^L|ribg=YSG~0EG z{!eQokTG|cPn;$2GNBhY!4r?hlcn&;;Z#-?Zr&W#KpxPB_Yaaac^*Rv-cjtLAW0*%~LkRj4}* zMv$qkrjO262~}|Vk2~B?r%4BbYHYVXCDNI{13GaGEbaqQ`utfRU&?hZBI33;nswQG z$rsU2vX};r@))x6n^t1wRaJ?rtId30pxSrE7L>kBc!v2QmLTL5jvWIkLzK)*#oj!2 z^I(gzk5r_VZ)l_t+kH^XbuJKJn)XZk!-1LmMRbWF!tR`1ar<3;?Ta>`K)EjFx-;t} zMc5F-8T`QUdpr>E^q==OH#NmB95KT$?hU86JXok#eS5PGF-fazb;rdWkZI^CZaCCt zynW04g+VqE^hl86gG_~}Amse(cViRYm6$01y>I00X{temkX;UJG ziyicWgyn3~V%Di$4qt8s=)41!AghsS2dCNjni#{Uo_Oh$hJamZx%}&qn|#^hW`oW1 z@bGXZgKB-MXCDkk#7|d+bKBLess*JvH{a=-KC*xpX}gFl`$Sg*oS2&WcpmBPcnpfx zR~)tv+g6waa?9fxM6&w(Z&5yYPy|i;+Ng4s!>aL^uzF9~(RXqX_y^|2qvR#ybX=kv zFXD<0B${7z#j8mHfH6fy-ZuW*sYmXJ zxT2!LAf6unLfs+cc)OF!^Ny@*2*;dy31FWSDzhS47Yq%*rtHP~A3>mh1*gNojYM)2 z^Q#g%OT)LPk>!p1b6;*RsP5RZw5_aeMowuJ+6SXzcU6AO_4|t8Ah|#!67T%wl6JWJ z!4z#uOFNT9XgK%C>!{zyYx!1Tm!jpdgWX+G35i@qS0EDl1_o-dx8vNs8v#UM4X?99 z{5~%)FICCc>o(HoXJREOnVj!7nxKz3H#YF)Dr@)&w2u;)nOTu6c(;pQ=A{n5P$K_; z0NQG4kj44^{@O+fn6NR^vYz_@C~A6EhM0jttZhU!?!q!MD{F24P*(0J?s@)P-_TIJJ4TE4`g>-hTeNL`P_r1@KCBT5P4}0!talP@ zeH41)kEZyVK;qWW<`sbxVs-nC@o#Z3s{r!M6|QQ6V!z!l$NX()$w|HJYXzWQmWD`Bs_Kk_+^fYtAs_#>qV1Fh7W2Ts<(PP zBhNi{vypp`5;b>|BmqNmzBrH69Bae`aNfwaRw@rQt;7Xjk>Y=ASYI2;Pxae<4 zR|_>{Le$JEcTPheiJlKW+!qv5{k7G?KRN;<6DYWtCj*qM3=Bkjd%5|VuU~VAakWRU zgby9-wDR=x&c)}6N><=2y15DN9UUEIq@{I^Ro1v9RntFF65K=FjCjWn8Q(e+u{<4` zl$LL_T_7&mxjxR>x!>ja=$oiz!zo=~5_`B*i;%YsbR{cpN?nLJAaVO;X#(f7`(Rb34n0Eh7o0HoCAptvgb&I^L>d(-q;i5>;Eb>67Z&T8J%#uWEfI=A8+ zExLy7D@J>4jSV5|jXg;aMkcr_?+pwk0A*d#(qd{>l$S46%*-qMjK&i6(B#mcm0UfP ziJhGcAgYH~6ci!?#y66d2R~{hgDLIM*OMGfG*(ay-e_>FGq3B5egRnvs+@`(_uTPK zu@9#;{$jIo$jd@3^`Yvi7ihV9&ytAH?VI(JSm1(CI3Z7@^zh*C=W{pn1dyYEJaz5a zv*fz%LbimQT>?HA`V{}ns{}3zNr2tjXh$(RfkMcez$g|6o>%YH28(yw#@iKcZd#gH zSd?}w_o~tTUj!N`UDs>EOSv7OfwpvEo0|k?dvikNHv2ePL9`zk;ay$-iJ?lBO8~F6 zT3OUrF)yctX3n*ROg%L1;EJiSc`>B+Gullh6%}@@p@?zJhi!dR3~Uo6`vi<*@{4g2 zp4fJYo;$~`i$fz*b`UGT2puUO%=<~T!l*{_+t<>7LKGA&2qSSDCpj8&!eb;3%*kjY z#YxlZ<=1PM9isRyVyA5`GF zjeerQmXlPpJFYG-GaS6esb4v+%h_&6l__BveSyalIfR}j(18`}+Hf1oyJ5PMEQ{Mx z{w*ShOGrFO<~wh;L@$osIl~!*=mmd^8lwKBm2Gf-AhN_RkT|5E-0sYK>a`NPSQ3E9 zGn{W3ib`J#QLQ{yc8DOo&eN+p99zr}X>i>lze@O}JcZEPZtjnzxH6`Z;s>x9HjOyE_2%?Wt%8jP+iR?EOB(KEKRN3bau>3VL( zUX;W_`h2j>zAoG*a5{!yXiPh()ocQ}{$y*tro{Bih}7jvf%~u9ArKU*uY;xZulMDO zvoNKKQU$`LSWmY{8Zq(Tb|r0A9a6atyP%=jP*Ha*&Ly9c8N0soj<-Axs=m?V3n54M zL~um{qgoD**0K-J1BPBv6M+e;)miG{E%tD!;!#}nrFgGFId=9bJ z1~RjtQH9&yw9Nq_VUgpT;-*}lZ(sCEc4P14ZLHcfMc$Dfm2b-qgg9b7#4+^GlzoL?D+oFJhja-zqaG5 z5q!CT!sLPtPZ`jiZPzw<*u~_%B?(!8>W5HcLSBP*>lgQdK7&Lx`#o;krsEmn){h)Z z#RhZu3xVid>-&KllZ>PFI-Aw!#Lj0K%Ilg2rBV&+T{6rAqocHEx{VRH@2K*qNwe>_ zA-gWDmz}cOtjqdJD@2x_Jsh~VbaQ~ZHHohAi#ed)thjR@v`Rod2XYt9Hto?fM*qyI z9I!D}f7xD3IHF^0s#lEtD+Dew=c1``U#XobE)LEcENUgS&cj1XP(5f{ap>a?yNp1# z^_eb{x-&jKi#HwXv7J#6%G>C%1}=R`iha!*%R!p!iqbIBKQ!=mxQi0yGusm&Z^m9&-8Rc z@HQ0Fyap5oEF90I0j|nD>oa{p{opIJScpv(Kg5^NooeKC?z$1Lt5Z2|yzWqv22)<# zbtcC?XI_U62DqUU4192NTV@Z=%_u0Ca$Dgw-phGFsl_E2W%ZfbbLC{9YMV*bTH)(g z-3@{bf=9SSkyXQ2Zd+_5_D}Qb_=I&v#KnERB%%_8C;ve91)jxlDgBB3ru&zhS>6HI zbfLB$C+q`<1@RsCY^nMi*J=G7s^)>)78gYIMdi4Yl6LQtoNY>X6SKu+-)>btUds6+LNQBL8 zsZBtC3BLlJ3bX19XdTgB&NjK3r&h8eY_lphZ69S%K0zeX`RGe;+BVRJt9byVJI!-c zl%hLS(727z9`KRpP2S}%@XJO4Uc5EcZ!-{fHCR?qlUqPDVNrgW;N`_{VzE{PQ5L{M zw|)EYzFcV9(hh*4wc$IS_HmTMw0_+;ygn^PuK}!)Ns?rG_1U~J$F0eQnad4OnyV0F z20Mtia@>?;TGNy_E~kY#;CD=Rgx*MZ@Q~6`9Io?uJa&)b+1)BkslpVCPrE2_(xC&r zgEULpZsoRl_!X1lTFx8jX28>B3nff)c~MIHOt@!b^p18E=>IbcXvq!g?e8F2IzZDj zA=xqTv>j19Pq@$XzJJISB3&~?eOW#GT)wft40dX zx^v=IX-D>zsxk%CFkb7`0t0*lUte~hUEX8v3WkPXN)XJ$*LG1~` znun+t1pzyr>Ws@qJ&1fPPS}z^8~4#xlku=y^;hb}ta`-I)~A!1?_PEg9tA8db|td? zl`fvxbq3mJ)5&Mco?!K{kqSznS@#wK>qSD9-Y$9UutW!<`rD1?)C}2x``lU{(*|JC z25q*cfwYs4Exw>Kf(LgNwE;@vuGV{)2drsZdN>E5*M0O`zV+MD5MH6ZcOqDXgi7u= z941IlNgIkfeB_NUE^1UTjHZdzR+$4O%Yg%kGF&q{DC!^s%$?|sM?T{V;XP3tODXjh z*SWskgOu>>v;kwPC-X>;Ui#=Ak6D9fhc&S)6R@{e-Sv1u6Tpb2u22JcDYfa$d!8Kn z#Vc1h^tMjZA~*k0|2}z*g@w~K%Axz*C0W2Fd*X235e)F%cQ%SF`( z8vRULn_r&Bq4#py{`&_Hbs-vPHe-?i`1CQMtc)2%Wf%(B+9my9L5rQUt2Uh*jrMU) zv(>y&0BsK07G$#DL$?9fNFiS-p6fUFH!&Y++0N51&dcyRRwSQ-``Vm0YQkbMlML@c7&q`T-s(a)1MYN$NOQ@S zl$LzL4mXaz=lGWryhw@|6$m=aqmB#@(`iDXJDh;U)}L4Jne<*;`+;kExrJQ}eMl>e z%3KyJ$UYQv=##W;tdAzGg+;&ai$Xi)n%nWj{Zt*|0@o#2D{??r3{7Fzj=`bAs1K>c zp!PAmV|&}WsczK3=;+;Sq>lf-zNDQK}3)sxlXQ9%yXVmCes!?}GC ziGj=4Q@7Mz)OAHO7arrngo%$`99RpY%03_{h_lpFh&)PaK;CRi*%s^H1g=1mtBH_? z+o#959k&CYe3OO=z5#TH8Nm49+=oTV!L)@_=T=p#kFA%ar#e4TcENYz1%XF& zvslWCqMp}pzoW0!PC1S{`s=%I-JX4MhNNxQ{t^!N##WkFeSG9$-=n!0dikL8jx$`WfZrQf{8Xn^X?${$Hb38Dc-3VD z<&a@Mu~>*iD=CP`s44Zn+=jMsdG+5;Fp1^4KG&^F=g78Lr*G}UDSqi7&o^!+#!R`+ zAm2nq)zM_JTGn}UAu#N|cxWl?qVa7DkB%Q^?pl+$VJIp&Vm@#k?CBG95cp)a{qe23|Ga&wnjb|u_jB=qG@j1AMheED+tv9;_Q z5bzp}<~0o2%e}Wad2mi`=@=Xl9ogY#n~#dJt>?f^1(y)wF6`@5WSM3la|^o4skYt? z<9Fs-!&(tvi|KnfkG0?={91p<3!h9t*mp1|FE4cB?({myKncsBJHUPEg=ST)dhT`5 zi6goe?Z|Y_lEy$m0Q#7*$D>`ZvrDvf@mPt@z6WiUW{pvVKF_=8wvB6)w_I6g2TnP_1L|(hX*v zPYZO+fRww9(Y`ham7mup)5aa^GLh#Nz~fmqqF(Ff@%AxD+cUjS+O$~q5}ut0SqNy& z``%FPN8ju+s+HYq^3>JwhXxWYMP8TPWRl84Di%-49PlxYK*uwbTFZ6J50zn@y3=?_ zKS2q2oFz0$&U(p#ur4!`YBgnZTxDjWUW-pJ^nB0FzXY(~6wfes{zIkzr0%**ytJ&6 zSH2Xf*_4!~SJaT?EP=Erx^!|61*i{gxtM zBdL|KWi*M5$6zBVMO!RXaRei)yj-eItFY9lLhSSQ&O}&bcyt#RiVHf!-2DF@7M|cw%U6HwtZq3Qb3D~Qt-(hcHfuw~65+@UY zW7k_Tzh7BfbM&z*y#f8|l>YAB6Xq_lSJ@f$5@Vb-=|t1C0ZYo{kHd{G!=KYbEYQhb z763BjD7mH5VCZ$ zv#G-S-;QqGXYM4!BY>y&bgrWUe7=OHKtT0|Sk21J6RhyyJBS>zZU`nsfOUto9%S3y z-Q8vLR3&dD-G*fJi*j-r+!8Poh@wo-1Y=V=_p=s(C?EF;0*C8ATc+qYK<5NJyBd}kAB_%_T4a{3J$+? ziZI$zc_nCy$7vonjh39*6gt{ewDQb^b0W@%1#s*8uF7ab%xH%&f!n ztkbc2wb-RB5~V48R1TVpQ?J>WBNOP6q#Ses6jE7D^vb1)>e0D}07YaO460h=2t?bN z^fe@(zq<`@H;IUm0O%f84^!XpXl3;)Km%Bn4=jpDm&|>PnZz`rxxx=oxfzv4m(tW$ zZoe;T*0oZ(PT(Qq zlx^N&##H_@KhdbA&Crtr1&iC(BtOqggA$m8hc~_Ca+8yR*DP4 zV|bShNf8~LXHTLEP0JkookQi-HR(7;M+Zy@;b*~tQt*lZJ*2myBlo(84_mq0R2AeY zVahEkDyn2A;eyH+-f6}Nem=Eq_{4Q#uq9h0m|RFIAAhdB2Q|w*0+K9oHiwB2LyWeP)!Z@(c(|mGZtzzB}CL+Nnrlt z_Db_@1(bp!GNB}HN=mAtidK7LmRg})Ts6U3B*nMDVh!O`m)@~?Y)o!m@apwD~e0FfbFJq_C{g|*DCQw5|J`A~s9Z-=JO5I|TaN!93wK78<`TMt z_-hnkf}UustoRSHtNkwM$B+#YMCsfl7KxMny@Q*G?6AJ<+H6ZueHi(1Radm0JRRKvvhd@m32N-pp1t9H}T?u$wpm@pgLZY#xL6x({ zB`-hHpapt{;EWle|Bta~C+;1cqzi?m+>`II9(bl1Ny}+H#{JbgQo?u_pfA>XnR1mXRY2)K zHAOSdeA9)k<=aLzj@fBhHCz*f_E66!akP7iaa{gIyT&vDak_M8#OjRmFs(Bul?%F#)b9K!>;6E`h!f9S9YF zzvB7(3Cwq9=5Ii#MK zQJh(C!>ZQk07;^t_)UQoSt*d6xZIJ^jYur}Aiz$4zkCR*-A&4b>u-z%>|VA7QBw2h;-*Sa-z5Wcl58IZ*z7wv?t9_`I|miE?V| z51U>`L2S&}e^+esUIo}!7Lw$GcXtX4weKoftjoVLfUUe&HI2@VLMWs=Y7bkfXHkA} z;#Z&5D;@YSs1Ll6Z{!7YnlKdgXNw1fI00bEOZz}yv1WoPQZr@aP2l1*&VtS9yt zmBBX$WIwN3m=%#Hs_{~{iMp{34LBO%w<`3O@{m*z{pdx=d zY^h&Rwq6l{KuguO-Qt?dLi$9{UlcGzeR>@b(+*ywzhI91zZTvL5gQEOWucdp!YetG z`GU+CbWuR$C?3qP{P&}<-@E|Vn4Oq|mv^lrw@h7(wjEHQg}aReV*fhT)oY&*k$7yD z--L7axIiwV97M38`@KZ^_2opVFd5Xieh*9*dG93s;l@ zL=|@3DlJHtN;i@U(p}OaNOuX+jnvSR(%p?pcMshqHA6QHIYF-yTj*)$P>drHKSq zR&unQJfiOm7psoO2sv=dQaCq%*3ud?3QpJ_0%Sd0@~ywjqNG$@OX}(AW#3L4axAzE zGXe$kZn@%RI-p6b+vsbF*Za|URUANV=ee^{;fc|FA@Q{ z!MftGIBt^gexIIbGU7taMIk{T;&uJ*_|p#CO+y$lqNxA(aGGeow8_SRHcogtspmER z)4j7=iZT_sy13xqG1!fY0GMD_>FEpj);z}FkHApTiSF~W<+BknBd3&fiD!X(7|Rz? z`a2WGYdfE><~k4www0~Rx?dRUfwy8!3YjnrEOTsD7JYAQf~L}Bcu(JRcK2Rfl}G#}{!`cu}#E8e3FF4NAkp>_H_$t_!zVu1Q6 z*u0^vq*Va~y4rXCx`m7@!lEj2SK!X}AhLPO%8@qZOy#rr)oZ(^ScQT#$LIT4*>5-C zDXEE3t_9>m%Y^wR-!GoLh$z1(tmBAVU7b3SL;MepNOgO6nis{4!vscpF(e;HDWEFc z@)_g}X_*LJa~WmdZt4X0>gL$&ZmEjKOW_Djzx`;kt~Pe?QevX~%=Ir3!My#XUr|K` z`(CuM&kn<*3zMA1J(9%4H$upmJz#IYsyHPkW=+Wogmi<3@TGJhQf#9 zmDex>`jr*ir)$SpL(ha>+?(B(dP9{M^tsQ((1$(8txtc7*RK&0EF@Di#aH3jXJY?z zxd*&`c8DRbqZ8Gk1=!=57l&QV4MEFYrBL?HuP>q>dOayT`lclMSN#sxBu3f#jDb4{ zD1JISU;y~{mirOgz7wiim7!#K0#)v5?~CB{T;p#w!WVyyvlDaSwm<94Bge;fs9}H* zVEpa(sZJ#5XojVCYmUd6^IMNlft4D-VVKJda1w4u^O-9D!v=00=X^U50EFeLdD)CU zv%V=&`XFevXwz~TL9 zQAG#c-q=a=&F?%*5_MI;Q5@K+#Bn#^GxPu?iPw(qj|@;bVDD#xX?8!>PWg-~g|YQ` zhPD6KCKt`@<;%M}3wNnRJMhAQ%e`kz+?dk$l&rr<)ihsG;7_A#+xsvhmqnokD^U;* zIpdcECF*}>=X(n<7ku5Vm+XMNzWh_uKet4t+S}r<6qMEC|3jd69z%(5s761ZFJSv) zc;moqEQ){z*(Wmx0K%-~C-TCjgttKY`rlDkeBlN@$IZn>`}OPBE818L`i?HQAo4ql z8-Z$uZ%QP9eOR=p*AoWrVf~LcCVa3WS6|9^}XIF)uyTHqh*_rF0&(5FtIW@?#CgOnBkmz%}Ned2ZCr+=n6iSo~Z z(*nCnYg<7LZXWIcb08EDB71Lm%uV;0KGhjrHFGN{NYBJ43o*2!m^!s#$`BN48+(WR z0}wsskO>XdB8!ZSqr3+i2H9L`*u|6N<$k#A;h0rP^vVSvWj9x4cYyt1U!K zyrcffh!SG_z$6*Bb$-JJ1%|!DJkb2#wF&@-5RfcV_Fm;);Q#Q!B7Oh;oN8F_Z)VO+ zC!O+NF>}BWS`ScKDs#u#8R%>;SK{LO!b=pg8ukx%W>W^yY%>8TB_%1%Wu-a9UQGt_ zYE9OGE^UA_=7EYBl0Z0;dL$=9VE7fe*#Kbc7hlzL_sdIQFQg3!$F>*zQ6V*Q_WOgK?Y_d3TG>IG z&DzTV45ce`oTi~wn!BQCWd~aNmmF!v>{z={ISJ5e$lW~I#Z6IF=v7hGdk4?T2L5;N zm;tiqQvKu6P~RwDe3M>bsAdiVDN5!@tv|-22^gIl{f6chHy8?z!-|2Z zaSr-KKc|_z`|$I_UpyMv<^5&rQX&`~wxfK1kLAm8DC%vGiFtOs!sPoomGL|S0$Kf9 znJ7y#`&lvKhTKAR>wsr6qGl5I3)oAa@U`XjL~Tdm%&ncK-NBkuuzSC~5@SY*x5~jg zKI|XkkV7Z1^MYF#cVEq=mVLz$TnNU$lx}zY@HXliyQ$E96ocu5>_LSFZSym5(>x9jjoC_R&b@wB zRM3^ftUmy&DNCx}-?lWo!^|C?9floZdD+w1JLY<^PpxHMA|OXcL!im%i~0Pk8JJ_( z`x(UDFVVG-MgJqg4m87E&vzoK6{?5XcIr_d&T|Lv?9GDc^5#4JZA14^@u;j4td-++b<;2z$K$$W*O8p%dX>%?qATo>S$Vy3^27`^@C>dy zj-K(SmZkCvG4SkFKD!fJ-YSQt3psXbHm-PN=DFWS4JN9JuzRjOpx<04ss=Ug2T>x@ z3S*NVIvdxDXyQ7y)HR^SPgiN}r@NUGUW-fhl@*Q4>MBCVJ`i*Vp9ksKC-396v#wx& z{0i>bdKhKfaDJFCAbV(frEnO^9-DR6^$2n41_&M8Gyl7cvr>5wGua}Omw`u@@*0nRxeL&qgEuI|NQWZG~ku=BJ zr(!7YgqsPRRUSW#0&{de%>);8>cnK@h?UYo4)Ej!Tbc(MSlb;6CSX&$aUaKnt=I;Tv$7E)qS!bXz3=Zm*Ua! z=I6sM0-@KP(cy5kB}q7x`)&EtZY;WF80!qS%SD>M&;47k!)(ML<%li>PpN82Wy$fl zoJ{B(V6QaxF!^*mZr+WORaKJ?imbXVIc`7TioVqIpP3_7z3vYLb>9P&fV4@s!VQ!4 znA@F^7lV{<4=dW_Dm(T)ZuSxth!H%HY$Z2Ic5EX zF2;+Qyj5)8dG)e))*`iZeayZ~eB$ zt_ST+q6QidEV&!F4|`2pA+3{vPRpDTbJJXUC-GqvAGXMPjKAHuGn!ENbx!48QZz0p z%-;Uv8-Yz4mkN!eeYb3VMkj>qY^!RKzRNy6Cbi!$l1V&wS9VW!uS5s=t-Z)4^I*8$ z*)o0t&-$)D8XS%pXF=3VCgK{_*2l}H(bgGE2?tXR@f>WO^Yf6t~1P-G$N`=ww&jBF$ z#*umF7k*aAn058zeBxvp;wK^qgmw(;eY}GU?DJr{$K3WmcI?&-W;#|qJSeUq9NP~H z@_KF8&#tFo+li`TO+9{hb&-$cHqXF74L!t%ShE_5Qxs#}yOcRsikN!%t(exVN7b|^T6)4oQ&{Mi*=4yrCWh^!L&eZXi*~Ri}ib$MLhF!5Wec;mN*gdKHk;T3^zJg=EHf+o^tS~ zkG*ZZIl_9Xe`J=CQuk3W4Q=3o*dFJ!9Sd(91{xYsUEVwaIL9>TIS8-i=4BsVd!6l* zmb+FMuj~mAURX(rx!N`Kf2jq?S}#W{Chnc*r>%^uSFw)7gzI8UPabXs6xPBnAFK-A z&iVuyUR8=MGf~}pUI_7EhfN5bqhFQ0pt?jPgpJ!~i0mH%*3>00Rr*g`_tMMq2&QCT z)~K5+Wd8JyxjLrnhL}}*m@byR;qfQ?Uzj}h71xQeUg{$`$|FYug3>r%3isCAglCK{ z&IPClY&lx6<1s~CF0df%O$#)8!;kmesw1aNIkdTcU^eTA`Os007CA8Z31qGfV2)cg z99k|ttR8+n`P5#H?m5C+mvpTrqp@A;VdJ=}PZ8~xS9``y3p1Xr!Yl(>R_pRpccUP9S` zaM}qzY;xIBZsMP_jScM-5xyNwu5%e1gMyv&%DMboY*b+xdB;m(6lR=y{uIvrnoy-z zCH$!4(csfn&=RLKa!R_&n`Q%#eoa%&f2)5+V<)dSLi|5fib#Uo2GR-9_|0*-AkzwPO1lgAL#QhGBs}cW4ctkS#_%Y0R$)v%%5rlp3AsQ z2*BuHzlcP^$L9`@497Ibs2? z3nx&yZUa|+mTvQ&3b)Ng^Izs6LA+7X7TD_D_K!*UKeSR&@l&1nFYQ9p-xE42 zXc>sdd}#R%Zds^&1eqQloHP^u%|{JwG9qr?U1<37*u$I;vfuLFZE4`lM3nb1sQjJ! z;A=8z;*MC4C+vxxYra>mvbW|C?hHXV@z(UA=IA^`2hx6^==S^Y)j&)w>F_=sPr$Yu z$ra47GM&t=BGg~szG1_8v*b9mhcO%^$VlhHsM5x8-Q`{-;ykvFvWbJq80V)pQIt?d z2B}e~(k5JdhN0Y!ODjrSs(j8ESi29P))Vbk*^^%XIDjhf@7gB*oGfJ3mT`(FG^9mm z<#DV#zG0C4#eB2bs79;V)^65gs{NW19sT0K&LNA7duQGi6j6tipf)iIP#Das{$~F+ zEL0Gm5Vjz$c0O~oO`fgXxr7vWWWV;>nhl@U$wfBH_k>>6U}`XLPc?PZ(xm4Zdf2%J z0}LO+j)e=6u3Ien>=dO4^72Yb(Jw9`Y|Z780vb(P4RTY}HkpF9F{vgo7WHCzC>`z7 z41xk@WET6g>8`yn0)ggB^mqGzT7T)DA7P=^4n2>6(+ynmm}c*@tkqBB921j>=)KrW zL3Vk45;v(J-5IqP<`i3*XRK=$(Q6qiyvyi=IGunt^?|rh8xhjU*8`c3nP2O68T?52 zQT;UUQk2KvGBFYOs?*EG)g*qA9--*$IDOaE?ZZ)$UdI()Vei8&o1Q| zUS%$R=;S?npn>iA98LZDk?wPs{oD3=IxVE&;AH#;-8HS={2v>v}Vi@+_o+27w zvKCmlP!41tzA2R<=u1W>@ZT^*=*rwHI_vhh;bk4`8NuvXheB%Kr34TuFz#u*8)(BK zNZ3J8%zP{6Ud_wmTl0o0r3)}w8Y4~TS*140SE$znpd8OIkomfcT%{Erk$1|M^Srs8 z^*JsG+iC15N%*`~O-aZY{f3AnLKN9A4CA)E*;Dn*(hJG&hgrQsaoY3iL#!@sQtcW_IcPNlSf?%I*>wCljN(|7~Ky zs#vDTgrL!G*zX1FUPA)8bl)JA|E6D+0WEq8CU#XTucX{JRTqK{`0;8R$%5v%kI*m1 zS2~$`Tn9U;#t}uOw>8%>sJlrTDlrzl)JtG<(z@GUJnt*(ojl=yF6y>J{5hz)^4eyugUd{UU>NVbP^yi$WC0t>L_TMKF{_~} zA7w2r!CpQm*T!4X!-bAbNutv%C;8(*bNp|9@Qzhaqihv;H-0Df`+haY;VMt8&hV~J zUIaOyD(2r*05?-K~<*teQ|ItwKRD|FHRjD5JCh0D0eY!{UcCAJo< z&232vO2?cCztwQ8F(aT_uDo8P*Qy?TTWCl-sL9oAS+eN3_WPILW2toQO?Z~u8a5FM z14a4i8C|71CTp|lak7HVT=R0duZyzY3H-g*r^P`Q`}%-(3ajMBbh*(IZS=C}O98lu z_}AA^RSU`OF6^Cf=R~?la~=A*pXzU2yvi{sdA-fV?PPH1Z$34g6{EenMTwNdE7`}m zbu4cuv2+Eox%h6EpDf-Av?>VABA1n~%w2%F;=Y4_TBY*7z|?)(*H%4EzNsL(67z(<6Gh3?Ih<$7JUhznE^)A)H`zQe96rxM^Jjt?G#uKb~ulv%akWj@GwRcWW9X^j_~j0x0k zs1DAOcu?VgY^GMhT(yIeCNB5upk6db0}eVy$tKl2W>A1k!M516Sbe3qk0jgvRj$mH6hkJ3mq$F8P( zbS_1I@2`HjJT@*mI7&~@vF6lQ&NY^2xEW4h}}O_IEsI-4Sg^XB3`vh+FfGKwTe=DAxw z9uv25%H!3(PG@$9?~5IasH47MG{92i19iuHy>=G8VZIx&z+ z<19+Abr-ITN?+yM4cKh*TeexKgbl^F&-btociQ=q^u3&Rr6CXNv7C+DGho-u?DJ9s zbp<`MC)7fx7BcdCPA%ZRV>F-1P9h>uKHeS{3zYSF=DIPthbC(YY+YY~F=? z1imnPc9Rs(AJe)cYfzk&g^T)4=1>xaV;ADrv8tz4@xBZq%oIkaUv9^t-&&;khl;XU z)OVv;n~v2n-m7O%;ziB-Jf~1wHhdkDWbmG^YgR*eC=b;ly4Gn>JCOtx4`{nft~1CS z>?6KfTg-v6X(e%bmS`v*#BU_|h0(PF&9)5RypUdHg%x-kjzt``p;&y)`GkQ;aF@e3 zSf@!iHCueQpl0#e>&ugcx8YKZFw-bdu}`OI{8f|(7O8h>uD80$`xqTMr(zVDnv{Dy zfj!m7dshv$*|<+zQk$3$&P_NKJ&FN;Jq_;w-#r}SiAo}?mLjo_IhNaGfx$+&3>q!P zm^~=~(k`z6kUGkPnA{s@=P)ZYgl`@D>1K?vc^G0;n~iLJ*>-(Mu0tXPQWx@W5g*0x zOlp)$wfZrGe^KwP!w-=#-)6+~-huD)wAl0*MCqjqFw8O<9e)w~in40{uKwQ&JBlya zb_}NI!^qqI1`!16mjFEyM!6uLUjj`luU{8B<5GiUs*xyIr)1WrIXEgw*&uG~cox>aHx1IFi@U9S#3SDOD)F?(!UYUn0ioY400n(M7654F4q?dPo%|=5N1(u zBZ5yycLS738;4@?q#TcbLHX=-k7RO!P*j#mp;bM@>vn&+mCZ&fJ=V)9h@K(J!)|gT z#j`Cb9MN}siR-*@kHf}U2ByE|^>@qY<;CdB*AaO?y7aU+T}{~}s9v&~;_GxoQ@(k~ zNi_e}DB7OzgO8fQ`xmNi^+%~Y;gzf8Z-^)J3io$0&F2MxWX*zGy_R`pKz+|Lpv|x+ zJCfSLoK|LH`ds)K8`$b=$g;hu;ayMU2(b>~WR_oMCJ~!QcN>PU6E>dxUZ)}A&o_8s z*oAVq@=nZ)u3iQgCw!<-;7PMSzOvTvvf^16?G!`R`+?r$*CfN#l$0dWCh+w}?daD! z>m^I9yL)N4%|Y*9nu{(Hphyd^dgk_%Mv#*Vz)3YxLOSzgRPdXIy0QKgyUMy|yLWG6 zCRIXt?C~S?ktNsR{a7n@FDmD@*P}B_`UYaWVA-C^!5^m%d46g`FAkR!RdAcaJCTvP zlF_M}`KYt#u}{BMj~ErX6i0qpPGf!@Y;Fq$n`AWD(JcfW*V$^JV)ESoZJFp<_k0rZ ze9in|7%q7in{p(JNI#)Q>@%SFu;i0(K34iuiIa7SDEpH_w+l)3)vlYY=SbS}snH18It@sN zhLihV;objh39@dK zN{fCjwu|;>CLJNdAY!0%%t|nkS+BzwVNALHNycRp^qF-&$l%a&#k4sHfgj1q7lRyQ z?oQ9fAw5mw;*it!=T2!o2>Cs;w0OcZG3FJ6zy$Y$>kWKusTOJ%61G+-NSuk~fwSuK z>gNgr8n>3Pys0Mr0xpgTRUq$5;;Fu#x2+NhUXr={;YwVv1@CK+Cknak(H4=DVt#rL zL6X8SqwQwMV-?-J7_EY&2lf_XB4rgO&pHFa$$5zc8VXN-S80k`!5H$1Gbx>FO5s=C zgfP2W(2ETkOUbtwl7qx}!D_oUQx2c&i4(N4!rOQaaX`HkbUBIPT6@%nYshjPMuv-_ z_L39sO~BvWUFjWEiNG6KWJpdzE+)Hm!xu)^L5@6=ovx8NBJV>YIK3oQ+m_I!N7`Z3 za=*L3vyFCE0fm#dkTmX<6|Mc9n;bu6Ii~Nh4NF;_=WuMlQCUY*IJ+S-zBQaZ2{(Fw ztT!m%GB4>ImZncD%E}^;Vkgwg!oQ-!_Nvrmj@d83hr>)@tj*6kt!M>CGl5A$5H6n2 z?<=nAc-Pk^GS_PCVwpw3X>h1VHJr~bx$S%L+Rz&tQy#TwGD}#H{)2?hTf&OZBlr)?YE2P2`*bmvVJIWKL zRiAz@DxS|qUkm1qX*yiw>%)qoM?)NDtcw!ud}YPTont!d<{D%$N*upY??5+R2<50A za7J~2;n}KS-IhK|4Td0swnWQ5uJ{)`1t}^qA2oDEPP>Pe!KeiNmmMh_IpKca@7UO0 zcAtlKb$o$&jMMeELTbL{%p3_1GGsHc zJxDmsA3gdh2z{loNgBr**GOocC&>p5)wMW#rgj3{f*R62V9`F(KJF{Hx64a5hytBx z;-7xW)6)@t47H;cN!wYQUHR?XPbK4DxJ1!YF9K4+YYkYox zxj1S|mtCPMUzwcU`gd5PBwgPjn~brypM>ZM9Pte8L*I3PxN54c-FJRmBsKaluD4xLFPRaOo`4gNjL@?j z(d^pKFZaEmaa|A8FBhlBf4+{7v6|d4DN5YR=(EW3Q(s@E0i*mKT(6!wpIjiuD!__H zeT1dXN~hR^5lOKOGiBb1K{w8ed6C6Pi(N8g+5f~0$du*-tT%BI37a!!bcQZ{j~#a+ z!{};~e7z_Q%!a$@Vw22z*covytJ+y4O?oh~A=b2srK=VW>Dh=4bj7+=k+#tdCn3A* zpBP`~YNYgCdoQ7(gLMy-*Wp?Gp04Tf=+fB6N zHcef&^g8A3YlBV(+p@#X2j1${ZZF#EcL#F-HRuvw0QFd7M{mhSk(LSfE3E4#ymPx>)8mFL8AwXEDEQf3IC+IzPs^UCfhF2BwR5G7FZ^{qfh;St8YNM(dDtcP z;L9S3^~PaCkrswIlo}TtVQK}BUfQ3fh2fG$YaLdEisdZdX?uu|ZzW>7QIUtJP`fO7?31x@Z%eN!d?BA1!5yyB?tujjb=!Q>#t*a&rbp5J$&jx98%U?? zbNLZ;qSK%6ED;Uzvo*t-*hjzD&fVO5*Q!zOdJ;a+R+EcDS*(1Kipv>|mXnwG2W7X# z1wQ;#g`)6rQ6J<5;P%oFJ!I($(io5w<(h$`d@d%a1m7f->}_St*K8hgCd+9cfgWSysm2u-O7Ww=Akj z$goEkrq9Y7uQ-}qLn6xqw4AgO^=~^Mh_v7Kz3w)ogTxwKJ1ist0Ty9-lQVs+s}l9k zG0GDy;>F|g9$Wly%V|wSN*OYxV;Jc+cb}=F+cTgl;`KpX`a95zR4Ik%O;s3g+zl9V zL!-Bq8~e#oCto7@Zk2aAk&n36ly^0UdrlFLJ@s)dHwDO_nHfdNprolv;53lziPkEd z4cZf)Mp8MxQ)${?W;#+-6N`H&fK5TKm-Q;JDc_4KK~UI9bWA_RhC7<3k_R*VL8OcY zcl}miOZuy?&wpF)AE%0f<#?+XJ z|8Hj3;(YY8t0SqZyH^&paP}!^BVsTmbJIhnBwQ<@cX}hg7%^&k(rEKTFMgii{3AAB zs965=UocQ0^Gf-Z35k+ z!vEunf?XSgY9x?vGXxuKA$q-1YdYW&YpW6FToDoW*l%T(XU30nH!&g4*bS^1k?XxO5xbcdNc6FCE)UO&B6NZMVrr|a=NddUz%)N#{ z)~NT3?&gw(r-;vXddNhxoFrH5+rw!wu{$$zCFS~=MAYP_4C~;s>!Qa#p{{!*n6r}v zlbMeg$fk}Ve4iq)L&=iBz!Fe>?KKb!E$rBHjgPQom0UoxNKz%9gX&TbRw_Gc=(<@K~;ViyC z10DSLf7+e@$Zqc;20K=Z_UnSXh8^@+iaRr*E1t>fi^mC>xOWb#7Fr*M4#A0*ipd|K zAAUz|N6WD4Rd(KvbTRzUkJGQ>M@Tq;j%;a5<+pAF-E$8yPtlgvk}obi)l>Ap#|o$T z*3NOC4=`GWWEYgqz)E+ukb`A3gC57ig{O|mnFdjPNkk#(p590YI&)-hF zd!zQ%&B^7fWGP_3P9|HK);1vFYK6Z0A{& zqHw(0i2Q_-a#3xB?|k{ved;{0x!}iS z@e@7UgsB&YB&}@RdLuKPIIY#;3@LTwZ<&eOVnnF3tuJR^=cIsGLOF4zo_tQE@ZYzh zOO0Q@t~au)82LYleYwhN*)VMu&_5lj{maMpJi{Q@I*_pMdrNu3k16Mr%P3!kAfKA* zfC?c&E#*40O1^4qImQ{QF|HY_-M7B=Wz}vGS(;@Pml}h@hfIA~LCFcMi|n&UnN}$8 z!|5ln$Mt0lBxpqAZRKfiEZV-#e3>cM$Gv%N$Fl&mL2d$l(9vjb9~ne|5wm%YcC8z| zEf=X@0{$eWy*LU)r+S27%AN?mwf>PqrT%OcT7qwdda5PukSoSy7Kl`Puz2VY*Bj`= zpXxi-4~!hL+~nqfjAG-*Z;JXSY%vFn%`>}t_#6Mn8>?V;Gvtn!Kn zuU|HTyc~E4u5z0=kTY35qd6A#ePV!=f{-PC3xz=7^qIK~jT}z-m-~g=ud+vscK$UA z;=cFIn|DJ{=@`z~qz#r;dS!Hl6gPl9(5fYED?@SC*TOcAchjh7nl7;uycvFQ?p}-mUJS{ww z?3<{@ay{xZ%xwOFf#7*RMBe?=Vj5GS-4UU-I=;%#AXmGh{UPZn<06vW1>ham28@w zxZ=W6U@Qt6JMP-@rHb3@*&&-`5TY);yJ~A!pUL7Yw6K@t62w8z_XuC|ttQHmF|ob^za z_m$MetE#%2mN$T|7kBNRxc*!Z1zkCIVnm|?U3}t8c1l(j3=DsXs4QAwmN&ga+ye0U zOc_-Z=mCK<0)az)wWwPkO^dnaCG05s_T;q*$^#Cd+z+=GN{9sr}FP$HvhR9tK@ z`W0V;?M{ox(7&5bUhf&_H%za85@Ue8BhtG0{`|;wGE=h*DqUViAM4o09-j62xKF$4 zv;8#CAgNcqoTE$qO7B826{`N`y#OAyRuX$eOTk;wgpY&*dJ@|yKpL>AwEzZu!B~B| z>&nawt;?o?4lu~$M;J6)GlobvR$rh-{&=>2A8?7}8)=Tkke2dUI;KoI(N&`#^jCLq z?^$R1`uD>U;I@Pq39>S}uj?7GQqan>(mUq>zxoE@M>7qg=|I8 zx*?f`p+U@^FnDbrPXMDY8n#22+wh4uoIDo^+5s->Qk3~nB(>eu|Hh!d{pQLikl+>Q zK|`K}mT68z?uH|t?kk)(-G^p7*oQKX85JK&QOIaCLzCcS4~^VCp>>(A`RKCsv>i6o z-C@(DE=MSlPW@XkS(vlBV9_0FxUDv@B;zS&vLzuxkpoMZGd0T)5)@Tyopf*gAp{%1 zbxm%`*#7%gYUN;`pC1gGagRN4o!f2IM1CJsvy}Y#Bry}(gxjPVj?R#3Y*gN5r1xlG9OK0k#)01e0s(dNaRk&e-7wqfvMp_Oebj{M9Y zOvNeO#F)l5^foP8DP2&cKsePLY+s6VtTc0&DUGx56N-wu+{{2|?-kh20S5-p{EioC zWaG!4Y&{OtTLaM_l36uhUQy{j{$z+gL*r5=r%tT&cQX6_=Z9CNIhTDQU{@L8QxMLK&-!&XmLb9y zD`f+8*=um0I4W9n=+Ho0unTCuy8Gf#Y^WS$gAMvZ-)h`FywEr_W#8bp1S#>VE0I5Z zVOM_$Zi5?GtB8J$LNx^j^F_oX-4X->UU_EjPh98!2kP7u8mVtbQ<+zP8VLI~#J-KWS+P`~ z!i{&?l3EFZc_(m8LfoCNtA*UPNzI5(M~Ka%Ui^~~tWl=>x-ypGF58w?79ntHtBs3P z!Bj>Vvu{-v(XJH!B8gP9FBOMGj#@;cn>M`dWb*t=!o&?==CHuAmX+2vZ;xX|d6;<` zayKRc$Hp0J`uffl!%fHPtG1u!VhumHvJs*f<@Fl)(N3cneBpv<@ps@Jy$aX1-M3|> zu%wJW#nd4Q0|A{L@e7}mfeFbqq00eN)6TH_Rxug9lFbR4Wmuv-kVD$g#3$|(nmiuk zKi}ZAj@OW5bE&sP7hEdU7K^`9KwG<+tQ_XHm!_Ktoqn&uaHGw;Zo0!VM|VOr6iML` zPS0?!bAG{%1|OiVrVg@Y%heCeEk6V>ci*Okn~yfSSg7--D+tD_WN=2jAAazS%|UnHrj%*5EJwe2PZUOAwzph&jpMo*!Gtonom(kZ?(uIx zOMc~GXb_+8UPi(@e^|5H4wkmxQLA#W=gu=;#bjI)aQ=D-@v~5KylQY8R@0RkoBD z-_1Q6`5W0IU3?v?9dne=6_u&s^T$0IDk=({7agUBB8_3#V>kX({%?k5X_;b& zhEY?Hu1+AROj=2mdgpdM+;PHil5VYy*yU`_A|P;_I^;!nMGo;#l`+MuR<(}-nW~}6 zddA|Q(6qr6Jbzoql+h)R*%wrn>-npyt>35R&Y>;6<7ye8ioq#+L7$jh!1o7-0qrv= z%(raK-4b~l9d^&`nvZ%FETDotnmrhm>CBMrEH^d`7HwuLJgR=CMQyROfO;i{Z?Z8B zDRg)`uY1&S3n~^C8`?!H&J1iD3&gjdv0l7(+PX|~7r04T8Hg8jGDYEA^KoZYx!oTQ>~VxQm5axMvsA!XXXtZlR^ z*urKShXQT)R*}!$@E*L~UK*Ge*w(5Jtw@v(j2(+n;qqB6m zOVY6v9d7={2yxE2juOWgRul<(+BsHs!WX+(URKUYmne}tjwG|PiUr#P*Dr`bzyX!p z&vSRe*knL8e8BBswZZkzqp!ouQSD~7O^<(Bcx%Oh=Uj*Xg7IBXREcgB1gMKjBI7mG zSOf>{g>{1(SJ3D!NVlkwdZtj=qn>}eBEw30Dq)*vV+7fhdc1Y_ZS>U%U}pQcXHXg zBz-knnE%t=Ox_wnx4~t`$IBpoPU^AxW|Cn5e26gEdk4OD$whZ9zs*d7=mKkuQ-x{=5B*R&$XB$rz*rq<$p8Hj8ec#lCO0-=4hu$f6w?m3&;nEGKQqEo?ZL83u5 z>NfRP;pDTjtj>e6WcDmt&9fCYDpyqcH_iLg><701vz^62Pqf(x=t+(vE1m^y{{t_j ze=s$eZgqn%u9W-U55H5rw9y<3Hf+82#5wL5#hUZ!ae>^dtdz*Rk!_*)DRDigv8J#A)o@%N=gdSEhy43v^0ox zccUVpbPo&+Al;#YbPe4MFf`wzKHhu%-uwIqAAaGr;hcTedhfN@*?X<`+UF#-2Po{9 zbWR9wl#MRRdjo5|5*KByCb;pJJu6A79t$NPb2T>goz+^=Wk>)eI#dKh@f}v)2VLb( zJ+3w9Mc=l-T!T3tirwx6LjF9(j(3j{(9{hNJN0v0A+z27Nh07_b(QtJ9?uxMRN6V&d9 zx4ZV-q!aXfHH)qZJqq+H6Lw0v0xZkk^Q5*JNzeVMJmN{+V_ya1%ye91o04VTY4@bd+{5+;rxs#Pqr%Nlo`%0m$u9n)wnUlZK3aHA%-rusqPIBg!V| z5MbrU(tfiU!;P>7R)^)yCp$bCcYOa&gL<;T;`MG%jri^~ZAK3-Djf7skd=J9&v1EN ztT9^26#&cCpfutL`7-H?nsL9uzxv|1V>fO|eQ~_li0@%zO9PI!9I>6=8!vyF`o-*| z_uZ0~JKln3qvTs}4!$3R^h-x8I_KNnH5#{u=CWO{4AirZvfa98Yx)YcML#w$1F)d| zA%d)s%F~^fOsDxD6CUb>?ueVu$rt7+A-L;z?VbDiM{YjSkT@eZjPkzs1{)3Po{mb1l1N}jFM5Mk4v!QHu2q-T-hue$5@dH zzd6;K$Y;r@yWmP2!&?+p?9vOveX*#d08?0~% z=S!}{X&1cED!cZ83bpp?@}zg~lPCy-_NA&vnw_N)nL3Nb4AE%4Auru;t8)=- z&xt!8)v|UaUpLsR*FIXOXMc&(9k>k{4gkrV{Uwwu2B&*NutuUM!nfL^Z6f(2wMT?V zuN;uE3US7}#SD5)ZHSOMt{7t8IsdE6s84!MI8>}h1~!197-AXMFH6%c7xo;4N^8SL z4D_85(b*7NVh65038U3{Te_K_(==E#b5$QO<*IiQRgboVd&!Fswps9( zy;*AUP_2RBGPM3uqZZGG<7NEI4`-iy0z7 z5$&=zYvP;!qYTI8<;>lStQ}Q0kIRF;vV6^<0JD*GLo%P4&L~OHDns@=8}TFLP;;te zu{&ibl%BxXR) z9`^A%X?@uq_BP=m`J<9=ytB7SNJRoM>tw0_wHY0zS{;N9MCJ&KjPh#6iRgQBvX}Wj zlO;}g=xd&V|G_-}G30C8Dv%IZh*GpfW&8A#sja9yv>q$8e?u@Kpw4_>J`HkH-IhbV z!IfXfONG z{dIE56l**40q4Q~lbK)D8e(6T z1FyS1eYf%RJ^Su2EJsV6aUd&PkC@SgyrA+qCmT6)C^TRiA}o+IR^MuaJOLV5+f?JH zCy%~V$&c^VZTVl=ekpx~pljy`#|06+sT$(pEWkEsuO@*ALRzkdecrM`Vw=-^v~9Kp zotKmKz6@Zk=B%<|fz9kD-NUEJ1m=w%TsJzmHP)|bwtcP}89Y`-K==Q`90a}(a!-BZ zk;pP$U;q!RHK*4Up(J{&#AeqW2R_%mmS|4val@5CEKP7g@ z*cXyH4A;xs)T)vg#X6l|x~7eY;^3S2^X`A0@tMdT5s)jcOfAGsx;iXB$Y27pIbDvA z@NmPoWiXrRR4-+N_|^iB1ig&MJ(e=?K*(-#i^oPOn&%q-Hn4SOeOs%3aIbnIqJL(yr^24wqN3IVk^L&f+p<>7aAonmUtD6t+X%2blA(qhiUW@>=^(x z7WvvyedcA$`Y)1rv_=~SKhmtYmW4fdzatTl@g7&xA-XyVh+pMq#n1}fd!`utifJ~y z(Xw#YuLQ;>W=_)1L^WEL5isYQ1FevAY*d0#tRw;v%&Lu5JS_S}tA(r)^l=fPDYvD^ zTpd+FELHN^bmA~wURkr_P!Hh7ka$25$UW^0)uy(-pugycVa~;s19Yn{hUMk4d`WobjB$9;=A40kvM(@Slee2d%s2=ZpfiG_h8n|$*(F^E3zy4 z>D``l5=9l!H3Eh{3-mtdw{ONSGlinD@@@l6LJ%zvDZB1rcTQvnxli>H}~;2 zwCJB2IzQKi!vuGaVZ~mZYeKM{UDoSW6W{0B5*2J~lI5lytOypOIvGfPP#vK6i(&@kC?obB|rB69q}V`hyprSW;eD z>nJOPJRj_Mu9Q(#B0KP+$iw40h^YTCO-TM(C&S#LC`GEKYLBzKpvRh{^H9@BQW2eK z^*vTTXp3)k7CEu5Lo>3J`rZpebmPee+1o)*;;|xHyhXOW(D}ys_oPmO^shWT(Zhni zU8~c>;(_=tD$whoXDzNxIjN5iNryK|G3^^dEokqJ5H2?2ZEma-*_|epo>w3yaHKv0 z@+K^ zYiJuTG$i~c-#yE0r&q&QIr_+IPe;9{>*3xKi!5L6r{l&2_2>onYLQK%Z$R2fLNcB! z?L=@e#qK=5KNke7?Y=S_><%J0zx4Ce4Z1oEJS~CL*B{11T4CW(wK9EDV8!UY$P9^9 zGdN=)@GQZ9eG3H{gFVpqP7x~6rZ++bwK6bp{818>sR-C zVBf>AQ|p=W2TFT1k8uFLhto|%1wJkr)!K@$;S8-*w=V~Uk1T9HxIew)7l@C&t&Q(l zp+BY72&8dLlU@v6F*Ah=)bnN^#nt*<&vJ1YcEr3d-gEe7kL_sIzX8{*3#2O7n;a7QtnI-Z4kWAmGXrKHCt?z4h|4o1X1 zItPu;{RArS@NWpRiU?G6k5CXph}P!VqUaXw@Z-CDIu+VP%KJsy;!Pnr3~#i>;Jw^F zClw0kbb`eucL){q(q@^v+1d|CT5CjWtX?#Ki;mzn_P@8i<%!RHiTb{9Su8s&(fZLI zCWpQ_>~H#DFnXQAiN6bbMDQ|s>fv*kpndt=B}{haV(^`h)yjK_&|JNVcwX1 zx2{FPblq15C!Acq_PO{-PIsu{`1S)O^N%%G_+<-<^89<)#XP!69Wfh&f`P*nz+&#YP(R;S5MXKGGn4-hi3y74`Hy zZSg~oP$E%>#O(I_Xfd&uI%`VCwfvd(Cf+6pV|_!vq=1gX(CC!VU2NifhB{ewidjBl zdM1g724uq?mZqH1ugt)KPJ34%Fs|WSMZNFV5NfL(Si;s6x+mkLfW6Wu{vQYNtWUiU zx={Y!c~qdqW%O)r+`KKAsKsaYGwidj7>9yE8?#D6uR`0yqKz>;Qi>G)Ue-KVM5u>MzhvcN-S4AvdoGjrj%}foknK#%GQC8X$h3tgF zl9Z3Tl#>t;umq(6gnOb^WivTnE8;~Q_i0D*qx0H)y)T_|xb6|ZJPVw$jTu~ARC z(x|r+$W=77Z#BP78%)NT&kHBcv4D%w3;+^0+Yy*Ea@2+oN|VeXR9w_CCu8TubXGuVQ!%nF<^V z?sr;k|FBsZtCo_oWp3kD*}XsGMQaatiDFFzVT8<4DZM-GjjjH{cnptuIhXjO=eIa; z&z*;yT-!W}Z*(uqu-dQ7`4gCSvR&v=Lf!|kUIkhtiHL$)NPj>jTB!=XQT?P;{nBGI zR*1TM4px+byE_;a>KS_*&^~MvGy>kPUQ#uirZ&x=nyzJnINIf)tKPnrDt{QTRV9V7 z4);W|?N$imbCq<=(vJ6L+ZqOy8Pr8jOE=AHyGf%B@)OW)4Xixj%QehRP?CV<-8o|ZF}RV>_)%5i|w zg?QBs(x`lLseeX}JcjLp#-5*{Z4jYknsq<#q2~NzXgkmS&msh#5WaW}0SaU1Z@oGa zAFV!@&a-NT;?zCT6@H5~M7vv=ZNr>1lx3NZ3WXTj+`4!(-=LnnTZtUR?ghRd+sBnm z)LqY0U#C0SlCF-QErdf>p&Gx$VKQk*8;4ACEdtd&)py*97Nv;bhAJM>=l-Q@cX&&f zX_Sb8?s9;h!W=p~iV9nDN;XI%CEF1bkOZm=6n6ud+kEj|$y(7VFO3)Ah?!v-!oe>T z5*ic~*e$_~3VQ3z%T(QWp~&7Ci*U-)h2xZ+dn4FV!t0(l4@_sr>g|x-i%Q;0u3P*J z3lr~s=p7X0i3xM2c1^_T&9brT>`UiGBB?}K%_>MXs!_&njhwYX?qv=h z)d^?$IOpUM#U9?Sd;QC_wh4N;4X02w%&V}UB=)bEp`T6TmDmCG1G|emt#B`8Dk}+NzB4G>_5HI>mTbV zPIkk`l6Ztoa3_iDtcSEX_SOUMJiW8|M>|#(=jCG54?J?SE_Rb+*#Ru^)<;VUq9%|Y zd1B)q3=#fk0cXr^eFySL?T|w5xSaC4{t+T3m(0|f7keGn;iAjo>EBeE;Z0-;v_01y zDJJQJbg*>Pte;7Iygkh2&AqQ$ak#0OvA`B9v0IwXOyu2iD=TV}D4p3A@_E;`2?V$i z^)!Gd=FoIm>zXmvW0QrLy}PKo?tU-2JK)G{VDiYkub(I`sNsZreELDddDqlUc};e; zyCGoT)C}6K)pu$tP=#o+T1zI-@aZ%JH}8bXx#XqyjwnkRESN^H_{`<Wec+31P-zbX7y#Y)%@=}O8!o4zGWr72 zcXW%_#v>jeXmur99x@Ha%O98pGm*QbJBBes9OqVYH?dXX~rz?moP{ufV&?&GdB4$zfCR z-O@hQM|2yQIzkL8GV^i{kp#IrTwaLO*+p+%yj;8XFk?=-6e8V5Gb6EZ12~YiS<}S+ zi^c{wj%OcpdegeYGXF6Q_-kRrQ2OVR_b?(zfl<-sLnVBaF5CI-978fpMYUC0-A#Y0 zP_jcOs_QT7u(z*w#wtG4U8Tj-rjd#O^)Izr@q=O0aw*4S1i3ZB%BdJmM;w3BWwDlURM zNJNBpYejeX)x^n;9xyHsqzlNoX_BVL^A84pqIIuJ#doX47cn(LBq)dBy3?ltOJG+t zYOIu(P87=;Y8;0oUVHmmY9K`*C%>CeD;0jbyN)1 z)rNc0tei3!-21q88{}LP?ba9|o2GUrro&qUhIhOydrQGO_M1eHi?S5;gB7yQE=BX= z@2(wEr!b=l@@szf~+;5g)uGmZ8&U&w~v zdNwmpSNUy27~(G(+T!N#zeic!&1pd)GFt0fBaOMr2NlQpi?B|n2jJO6(HK$F7#a?C zSPwf7!qk1Sr*w?H2SptffkPK~BRHPulzMzmw*@nV3~Y%w59IZDN)#=OZoSzo!;dML zZ1v&QYv||J^^j+&4fUeOiKH0F$bTAsefUM~#iWYhK)Pl2esb^$>$L>(uP^ypN@W^j zO>Ek{#m07$9Kg{+#hz!>D0L{&W&!rmhAv8Vxe*gx;Hum#s2=Lwu}8~sKrGLm#K1;u z7+Ei{l+T&}Rd!@`mEIlo#4pilbrD8pSg0t`e)jTt55Le#2yNdk#ZIB4N-U$khs~|=!0lNjdh-W?U$r|f)?4!-JFC~4g!adbdygrU;>r;N}y0p^+ zt=onIAC2my^P(Rdt5rHXantO!7L_&Gmp1LZ+0zK+x$AuPb9G$z@Fh5<@bi0PcojohYKDM96clu>mM$@Bl zN(i0M{gAx%b5x1r>)@7;W5G#kxrbS1yFE$3;Xb&Ar3(6Nb{d0mJhSHQ<*#NNv`1N} z?qJmGm-Yt-7?2ikxnucmcSKQ*)+pW1vqC8=kOla8jN9Rjdb!$B78S=Ky{Br8&R*Lo zG*>;4)J9hVKLuD!noW;q4K-GSlfpUD7mLY<9T;jum86tJ)WgThj0WNdyyO<&pIn?+ zLWnfrQzmEAI*JmuHKb#!`PjGLf=y~Vi_7z}9PWvov0(Z&PdE5U$8J15xC#NMdC_}t zEKZpWN-O)bMQwtlGiGYv_fYiY^ia4qPhm6r?I(>hBZ_#ZqE?qQOE+v95afwwlT7l> z5rXV7$G%-sHyY;$y$Hykk5bIow05ZXAO{J%ZwO__Ww3v_1af?0p-u95c+ue&ffaU4l1ur@ADE%^NckCDbi=$B4>rnfwIIoe*0REwR)6d@mtZp`(U0Z&|72;E!bMRbg;@G7kg*eeW?Ko%VoDg5prdq50qA$jD zr_yvpeC3Z{{atU{r^I(Z) zHQYK$h4bA0*|Z|tT3vRg(&|%MhXO^U=lEWUlz)|qj9cu8D4_kz8+COK_DfZhJpEd#emO{p?v=I_EzYJ* zy(v1U5~S6lvpJ^saP!>sS(Nat5L$1?wb7md11i+QC%c*P&3+<-8EIN;cAXGB?XqopbxkhXOZ_f=4@Ql=~3$SJ92?g+4F3 zC}XuibRJT+<>$@s?XO?kydwZUp-qX+uPSwD))=ArjPm%rH4}HYrEY9{%%S<3q90j- zM;YF8fpbR>b@b|7^@_9~i?9mWZ+OgUPv^9)a$kbuEX@ZsA$m;bHZ+lZ?y;L&eL2v; za-QP))}`DBC9qy3P;$G|+PlpMHAD1*eM){o&%eDlCU+o+y9Inkz+n(UIVbt?v$!Mx z_mFfX!8G$EsUZfvMHf0pn)7KUB72{AaZ>$w@fEP$_JFTkQkhry+XyL5(m}eVtvEYB z5W;yTd0f~f)_>D^$7Ptd5I$l9mhyUb0|;%Rr$W}f1Bn;>>{y4+|7C1mUlAW4D zOb+wP3Wq_8U;8Eu66~6zIj|%F@}!t)Vkx(9M7AyF0{Jt0QdAh)-#6Z1lEMuA*~lek z{87fzM$CX$B&*73Em(~A>l$0jAN!O+dJcyI1;%-2D{M64m#At@)w>K<<(1U%{S?Vs zF2-TrgIa4hyMURTT-v|yBmQ^a{x}HipK?En$egaell=JCGlS`Y*&cjFQV}S_Kyd?F zLnUDSaDI&CzGgf|*JN&EQ$zI(Td8~e)1Z)FA_9v3yH5sObQVZ$AhXmk6T70#0^=`5 zzVrS_oEu4K&psu2X!<@X0*%rJNc3k#?wq||issLns^K`i`YzbO`GO7o2XO!H&mYG& z~|r7Cl$_HLMIpz<~8| zWpYRUso%dl(31s1=GwwoIQj^S8lQ?gzpy(20jjQo_hNNr|78__K$P44E5rmaSS?J@ zXN5@^&}DK9f$FD%!aB5B$sf%>uK(FkPyNN`#vull(ftESuFOBL3NZYED`jD&^8bF8 zKaRz}bla-tNPhThG_HjKJTI2$sc$R)ZMXm56UiBW0{;C6;Nj|xkDQ|0hX9rS20m#4Y7=I6>Bo2W|wz zewj!43=@O>H!83t%%{DP|99tqnvSWcl)p?glDPS7#S3{%jtuQV4iO6|qw${5G2lBr#f8kdu8?%|jmewM45hY6ylumikYs%Ypz`%Rh7m zj32+`#fhe4qW#!2sb>Pe6uNj%Ozdu5c<6h+^&A-W7Qd&LdV0TM{&QgbamZx>U0FOg zo}~qGd+k&h%)fdwCZdS8#Q5t5jzpXmJW%N)zpLfCT;J+;&cv9oB&MHp{=bdSpArzu zSoeVR?aA53=I%gF#(k_X*mgt2giXv$39QDbpI3C(!mV2R9p`T`@W{|Jwo;F}uCMMk zUmb^>uBVs`0Lu-Mrw;6*FX$k{SCL_wsq_@USyjKG`V;B^a=<$(-XJD)sC2@FpSlH| z?u0}!zD?+~>i>O9t~vu6`l`wKwjCiiyli5m)9?MCef*~)7tVl5bOQiliECImFo2g))s`4M*@*lz>FacW;2}lb5<c1Pg^T053 z3cukF_@^oHhj9M~`F}$QtlIt$@;|KPR|Bx}0~N%@(YOh=Uq|>&e6Ctgn@S6-`;u99Qak_JgSRgCh{=h z;;Q?R|D4Ii)kB(C_eU!U3eLfEITu&lcyl=pa8$*FQ`fT<#8R|lhF^=<$ -## Ask a review +## Review + +### Ask for a review To ask for a review, on the pull request screen, click on the Reviewers menu or its cog icon and choose the `CABLE-LSM/reviewers` team: