1 | !WRF:MEDIATION_LAYER:PHYSICS |
---|
2 | ! |
---|
3 | MODULE module_surface_driver |
---|
4 | CONTAINS |
---|
5 | |
---|
6 | SUBROUTINE surface_driver( & |
---|
7 | & acgrdflx,achfx,aclhf & |
---|
8 | & ,acsnom,acsnow,akhs,akms,albedo,br,canwat & |
---|
9 | & ,chklowq,dt,dx,dz8w,dzs,glw & |
---|
10 | & ,grdflx,gsw,swdown,gz1oz0,hfx,ht,ifsnow,isfflx & |
---|
11 | & ,fractional_seaice,tice2tsk_if2cold & |
---|
12 | & ,isltyp,itimestep,julian_in,ivgtyp,lowlyr,mavail,rmol & |
---|
13 | & ,num_soil_layers,p8w,pblh,pi_phy,pshltr,psih & |
---|
14 | #if (NMM_CORE==1) |
---|
15 | & ,psim,p_phy,q10,q2,qfx,taux,tauy,qsfc,qshltr,qz0 & |
---|
16 | #else |
---|
17 | & ,psim,p_phy,q10,q2,qfx,qsfc,qshltr,qz0 & |
---|
18 | #endif |
---|
19 | & ,raincv,rho,sfcevp,sfcexc,sfcrunoff & |
---|
20 | & ,smois,smstav,smstot,snoalb,snow,snowc,snowh,stepbl & |
---|
21 | & ,smcrel & |
---|
22 | & ,th10,th2,thz0,th_phy,tmn,tshltr,tsk,tslb & |
---|
23 | & ,tyr,tyra,tdly,tlag,lagday,nyear,nday,tmn_update,yr & |
---|
24 | & ,t_phy,u10,udrunoff,ust,uz0,u_frame,u_phy,v10,vegfra & |
---|
25 | & ,vz0,v_frame,v_phy,warm_rain,wspd,xice,xland,z,znt,zs & |
---|
26 | #if (NMM_CORE==1) |
---|
27 | & ,xicem,isice,iswater,ct,tke_pbl,sfenth & |
---|
28 | #else |
---|
29 | & ,xicem,isice,iswater,ct,tke_pbl & |
---|
30 | #endif |
---|
31 | & ,albbck,embck,lh,sh2o,shdmax,shdmin,z0 & |
---|
32 | & ,flqc,flhc,psfc,sst,sstsk,dtw,sst_update,sst_skin,t2,emiss & |
---|
33 | & ,sf_sfclay_physics,sf_surface_physics,ra_lw_physics & |
---|
34 | & ,landusef,soilctop,soilcbot,ra,rs,nlcat,nscat,vegf_px & ! PX-LSM |
---|
35 | & ,snowncv, anal_interval, lai, pxlsm_smois_init & ! PX-LSM |
---|
36 | & ,pxlsm_soil_nudge & ! PX-LSM |
---|
37 | #if ( EM_CORE==1) |
---|
38 | & ,ch,tsq,qsq,cov & ! MYNN |
---|
39 | #endif |
---|
40 | ! Optional urban |
---|
41 | & ,slope_rad,topo_shading,shadowmask & !I solar |
---|
42 | & ,swnorm,slope,slp_azi & !I solar |
---|
43 | & ,declin,solcon,coszen,hrang,xlat_urb2d & !I solar/urban |
---|
44 | & ,num_roof_layers, num_wall_layers & !I urban |
---|
45 | & ,num_road_layers, dzr, dzb, dzg & !I urban |
---|
46 | & ,tr_urb2d,tb_urb2d,tg_urb2d,tc_urb2d,qc_urb2d & !H urban |
---|
47 | & ,uc_urb2d & !H urban |
---|
48 | & ,xxxr_urb2d,xxxb_urb2d,xxxg_urb2d,xxxc_urb2d & !H urban |
---|
49 | & ,trl_urb3d,tbl_urb3d,tgl_urb3d & !H urban |
---|
50 | & ,sh_urb2d,lh_urb2d,g_urb2d,rn_urb2d,ts_urb2d & !H urban |
---|
51 | & ,frc_urb2d, utype_urb2d & !H urban |
---|
52 | & ,cmr_sfcdif,chr_sfcdif,cmc_sfcdif,chc_sfcdif & |
---|
53 | & , ids,ide,jds,jde,kds,kde & |
---|
54 | & , ims,ime,jms,jme,kms,kme & |
---|
55 | & , i_start,i_end,j_start,j_end,kts,kte,num_tiles & |
---|
56 | ! Optional moisture tracers |
---|
57 | & ,qv_curr, qc_curr, qr_curr & |
---|
58 | & ,qi_curr, qs_curr, qg_curr & |
---|
59 | ! Optional moisture tracer flags |
---|
60 | & ,f_qv,f_qc,f_qr & |
---|
61 | & ,f_qi,f_qs,f_qg & |
---|
62 | ! Other optionals (more or less em specific) |
---|
63 | & ,capg,hol,mol & |
---|
64 | & ,rainncv,rainshv,rainbl,regime,thc & |
---|
65 | & ,qsg,qvg,qcg,soilt1,tsnav & |
---|
66 | & ,smfr3d,keepfr3dflag,dew & |
---|
67 | ! Other optionals (more or less nmm specific) |
---|
68 | & ,potevp,snopcx,soiltb,sr & |
---|
69 | ! Optional observation PX LSM surface nudging |
---|
70 | & ,t2_ndg_old, q2_ndg_old, t2_ndg_new, q2_ndg_new & |
---|
71 | & ,sn_ndg_old, sn_ndg_new & |
---|
72 | & ,t2obs, q2obs & |
---|
73 | ! OPTIONAL, Required by TEMF surface layer 1/7/09 WA |
---|
74 | & ,hd_temf,te_temf,fCor,exch_temf,wm_temf & |
---|
75 | ! Required by ideal SCM surface layer 1/6/10 WA |
---|
76 | & ,hfx_force,lh_force,tsk_force & |
---|
77 | & ,hfx_force_tend,lh_force_tend,tsk_force_tend & |
---|
78 | ! Optional observation nudging |
---|
79 | & ,uratx,vratx,tratx & |
---|
80 | ! Optional simple oml model |
---|
81 | & ,omlcall,oml_hml0,oml_gamma & |
---|
82 | & ,tml,t0ml,hml,h0ml,huml,hvml,f,tmoml & |
---|
83 | & ,ustm,ck,cka,cd,cda,isftcflx,iz0tlnd & |
---|
84 | & ,isurban, mminlu & |
---|
85 | & ,snotime & |
---|
86 | & ,rdlai2d & |
---|
87 | & ,usemonalb & |
---|
88 | & ,noahres & |
---|
89 | ! Optional adaptive time step |
---|
90 | & ,bldt,curr_secs,adapt_step_flag & |
---|
91 | ! Optional urban with BEP |
---|
92 | & ,sf_urban_physics,gmt,xlat,xlong,julday & |
---|
93 | & ,num_urban_layers & !multi-layer urban |
---|
94 | & ,trb_urb4d,tw1_urb4d,tw2_urb4d,tgb_urb4d & !multi-layer urban |
---|
95 | & ,tlev_urb3d,qlev_urb3d & !multi-layer urban |
---|
96 | & ,tw1lev_urb3d,tw2lev_urb3d & !multi-layer urban |
---|
97 | & ,tglev_urb3d,tflev_urb3d & !multi-layer urban |
---|
98 | & ,sf_ac_urb3d,lf_ac_urb3d,cm_ac_urb3d & !multi-layer urban |
---|
99 | & ,sfvent_urb3d,lfvent_urb3d & !multi-layer urban |
---|
100 | & ,sfwin1_urb3d,sfwin2_urb3d & !multi-layer urban |
---|
101 | & ,sfw1_urb3d,sfw2_urb3d,sfr_urb3d,sfg_urb3d & !multi-layer urban |
---|
102 | & ,a_u_bep,a_v_bep,a_t_bep,a_q_bep & |
---|
103 | & ,b_u_bep,b_v_bep,b_t_bep,b_q_bep & |
---|
104 | & ,sf_bep,vl_bep & |
---|
105 | & ,a_e_bep,b_e_bep,dlg_bep & |
---|
106 | & ,dl_u_bep & |
---|
107 | ! Optional urban Bep end |
---|
108 | & ) |
---|
109 | |
---|
110 | #if ( ! NMM_CORE == 1 ) |
---|
111 | USE module_state_description, ONLY : SFCLAYSCHEME & |
---|
112 | ,MYJSFCSCHEME & |
---|
113 | ,QNSESFCSCHEME & |
---|
114 | ,GFSSFCSCHEME & |
---|
115 | ,PXSFCSCHEME & |
---|
116 | ,TEMFSFCSCHEME & |
---|
117 | ,IDEALSCMSFCSCHEME & |
---|
118 | ,SLABSCHEME & |
---|
119 | ,LSMSCHEME & |
---|
120 | ,RUCLSMSCHEME & |
---|
121 | ,PXLSMSCHEME & |
---|
122 | ,MYNNSFCSCHEME |
---|
123 | #else |
---|
124 | USE module_state_description, ONLY : SFCLAYSCHEME & |
---|
125 | ,MYJSFCSCHEME & |
---|
126 | ,QNSESFCSCHEME & |
---|
127 | ,GFSSFCSCHEME & |
---|
128 | ,PXSFCSCHEME & |
---|
129 | ,SLABSCHEME & |
---|
130 | ,LSMSCHEME & |
---|
131 | ,RUCLSMSCHEME & |
---|
132 | ,PXLSMSCHEME & |
---|
133 | ,TEMFSFCSCHEME & |
---|
134 | ,GFDLSFCSCHEME & |
---|
135 | ,GFDLSLAB |
---|
136 | |
---|
137 | |
---|
138 | #endif |
---|
139 | USE module_model_constants |
---|
140 | ! *** add new modules of schemes here |
---|
141 | |
---|
142 | USE module_sf_sfclay |
---|
143 | USE module_sf_myjsfc |
---|
144 | USE module_sf_qnsesfc |
---|
145 | USE module_sf_gfs |
---|
146 | USE module_sf_noahdrv |
---|
147 | USE module_sf_ruclsm |
---|
148 | USE module_sf_pxsfclay |
---|
149 | USE module_sf_pxlsm |
---|
150 | USE module_sf_temfsfclay |
---|
151 | USE module_sf_idealscmsfclay |
---|
152 | #if ( EM_CORE==1) |
---|
153 | USE module_sf_mynn |
---|
154 | USE module_sf_oml |
---|
155 | #endif |
---|
156 | |
---|
157 | #if ( NMM_CORE == 1 ) |
---|
158 | USE module_sf_gfdl |
---|
159 | #endif |
---|
160 | |
---|
161 | USE module_sf_slab |
---|
162 | ! |
---|
163 | USE module_sf_sfcdiags |
---|
164 | USE module_sf_sfcdiags_ruclsm |
---|
165 | USE module_sf_sstskin |
---|
166 | USE module_sf_tmnupdate |
---|
167 | ! |
---|
168 | ! This driver calls subroutines for the surface parameterizations. |
---|
169 | ! |
---|
170 | ! surface layer: (between surface and pbl) |
---|
171 | ! 1. sfclay |
---|
172 | ! 2. myjsfc |
---|
173 | ! 7. Pleim surface layer |
---|
174 | ! 5. MYNN surface layer |
---|
175 | ! surface: ground temp/lsm scheme: |
---|
176 | ! 1. slab |
---|
177 | ! 2. Noah LSM |
---|
178 | ! 7. Pleim-Xiu LSM |
---|
179 | ! |
---|
180 | ! surface: ground temp/lsm scheme for urban: |
---|
181 | ! 2. BEP |
---|
182 | ! |
---|
183 | ! ocean mixed layer model |
---|
184 | ! omlcall = 1 |
---|
185 | !------------------------------------------------------------------ |
---|
186 | IMPLICIT NONE |
---|
187 | !====================================================================== |
---|
188 | ! Grid structure in physics part of WRF |
---|
189 | !---------------------------------------------------------------------- |
---|
190 | ! The horizontal velocities used in the physics are unstaggered |
---|
191 | ! relative to temperature/moisture variables. All predicted |
---|
192 | ! variables are carried at half levels except w, which is at full |
---|
193 | ! levels. Some arrays with names (*8w) are at w (full) levels. |
---|
194 | ! |
---|
195 | !---------------------------------------------------------------------- |
---|
196 | ! In WRF, kms (smallest number) is the bottom level and kme (largest |
---|
197 | ! number) is the top level. In your scheme, if 1 is at the top level, |
---|
198 | ! then you have to reverse the order in the k direction. |
---|
199 | ! |
---|
200 | ! kme - half level (no data at this level) |
---|
201 | ! kme ----- full level |
---|
202 | ! kme-1 - half level |
---|
203 | ! kme-1 ----- full level |
---|
204 | ! . |
---|
205 | ! kms+2 - half level |
---|
206 | ! kms+2 ----- full level |
---|
207 | ! kms+1 - half level |
---|
208 | ! kms+1 ----- full level |
---|
209 | ! kms - half level |
---|
210 | ! kms ----- full level |
---|
211 | ! |
---|
212 | !====================================================================== |
---|
213 | ! Definitions |
---|
214 | !----------- |
---|
215 | ! Theta potential temperature (K) |
---|
216 | ! Qv water vapor mixing ratio (kg/kg) |
---|
217 | ! Qc cloud water mixing ratio (kg/kg) |
---|
218 | ! Qr rain water mixing ratio (kg/kg) |
---|
219 | ! Qi cloud ice mixing ratio (kg/kg) |
---|
220 | ! Qs snow mixing ratio (kg/kg) |
---|
221 | !----------------------------------------------------------------- |
---|
222 | !-- itimestep number of time steps |
---|
223 | !-- GLW downward long wave flux at ground surface (W/m^2) |
---|
224 | !-- GSW net short wave flux at ground surface (W/m^2) |
---|
225 | !-- SWDOWN downward short wave flux at ground surface (W/m^2) |
---|
226 | !-- EMISS surface emissivity (between 0 and 1) |
---|
227 | !-- TSK surface temperature (K) |
---|
228 | !-- TMN soil temperature at lower boundary (K) |
---|
229 | !-- TYR annual mean surface temperature of previous year (K) |
---|
230 | !-- TYRA accumulated surface temperature in the current year (K) |
---|
231 | !-- TLAG mean surface temperature of previous 140 days (K) |
---|
232 | !-- TDLY accumulated daily mean surface temperature of the current day (K) |
---|
233 | !-- XLAND land mask (1 for land, 2 for water) |
---|
234 | !-- ZNT time-varying roughness length (m) |
---|
235 | !-- Z0 background roughness length (m) |
---|
236 | !-- MAVAIL surface moisture availability (between 0 and 1) |
---|
237 | !-- UST u* in similarity theory (m/s) |
---|
238 | !-- MOL T* (similarity theory) (K) |
---|
239 | !-- HOL PBL height over Monin-Obukhov length |
---|
240 | !-- PBLH PBL height (m) |
---|
241 | !-- CAPG heat capacity for soil (J/K/m^3) |
---|
242 | !-- THC thermal inertia (Cal/cm/K/s^0.5) |
---|
243 | !-- SNOWC flag indicating snow coverage (1 for snow cover) |
---|
244 | !-- HFX net upward heat flux at the surface (W/m^2) |
---|
245 | !-- QFX net upward moisture flux at the surface (kg/m^2/s) |
---|
246 | !-- TAUX RHO*U**2 for ocean coupling |
---|
247 | !-- TAUY RHO*U**2 for ocean coupling |
---|
248 | !-- LH net upward latent heat flux at surface (W/m^2) |
---|
249 | !-- REGIME flag indicating PBL regime (stable, unstable, etc.) |
---|
250 | !-- tke_pbl turbulence kinetic energy from PBL schemes (m^2/s^2) |
---|
251 | !-- akhs sfc exchange coefficient of heat/moisture from MYJ |
---|
252 | !-- akms sfc exchange coefficient of momentum from MYJ |
---|
253 | !-- thz0 potential temperature at roughness length (K) |
---|
254 | !-- uz0 u wind component at roughness length (m/s) |
---|
255 | !-- vz0 v wind component at roughness length (m/s) |
---|
256 | !-- qsfc specific humidity at lower boundary (kg/kg) |
---|
257 | !-- uratx ratio of u over u10 (Added for obs-nudging) |
---|
258 | !-- vratx ratio of v over v10 (Added for obs-nudging) |
---|
259 | !-- tratx ratio of t over th2 (Added for obs-nudging) |
---|
260 | !-- u10 diagnostic 10-m u component from surface layer |
---|
261 | !-- v10 diagnostic 10-m v component from surface layer |
---|
262 | !-- th2 diagnostic 2-m theta from surface layer and lsm |
---|
263 | !-- t2 diagnostic 2-m temperature from surface layer and lsm |
---|
264 | !-- q2 diagnostic 2-m mixing ratio from surface layer and lsm |
---|
265 | !-- tshltr diagnostic 2-m theta from MYJ |
---|
266 | !-- th10 diagnostic 10-m theta from MYJ |
---|
267 | !-- qshltr diagnostic 2-m specific humidity from MYJ |
---|
268 | !-- q10 diagnostic 10-m specific humidity from MYJ |
---|
269 | !-- lowlyr index of lowest model layer above ground |
---|
270 | !-- rr dry air density (kg/m^3) |
---|
271 | !-- u_phy u-velocity interpolated to theta points (m/s) |
---|
272 | !-- v_phy v-velocity interpolated to theta points (m/s) |
---|
273 | !-- th_phy potential temperature (K) |
---|
274 | !-- moist moisture array (4D - last index is species) (kg/kg) |
---|
275 | !-- p_phy pressure (Pa) |
---|
276 | !-- pi_phy exner function (dimensionless) |
---|
277 | !-- pshltr diagnostic shelter (2m) pressure from MYJ (Pa) |
---|
278 | !-- p8w pressure at full levels (Pa) |
---|
279 | !-- t_phy temperature (K) |
---|
280 | !-- dz8w dz between full levels (m) |
---|
281 | !-- z height above sea level (m) |
---|
282 | !-- DX horizontal space interval (m) |
---|
283 | !-- DT time step (second) |
---|
284 | !-- PSFC pressure at the surface (Pa) |
---|
285 | !-- SST sea-surface temperature (K) |
---|
286 | !-- SSTSK skin sea-surface temperature (K) |
---|
287 | !-- DTW warm layer temp diff (K) |
---|
288 | !-- TSLB |
---|
289 | !-- ZS |
---|
290 | !-- DZS |
---|
291 | !-- num_soil_layers number of soil layer |
---|
292 | !-- IFSNOW ifsnow=1 for snow-cover effects |
---|
293 | !-- omlcall whether to call simple ocean mixed layer model from slab (1 = use oml) |
---|
294 | !-- oml_hml0 initial mixed layer depth (if real-data not available, default 50 m) |
---|
295 | !-- oml_gamma lapse rate below mixed layer in ocean (default 0.14 K m-1) |
---|
296 | !-- ck enthalpy exchange coeff at 10 meters |
---|
297 | !-- cd momentum exchange coeff at 10 meters |
---|
298 | !-- cka enthalpy exchange coeff at the lowest model level |
---|
299 | !-- cda momentum exchange coeff at the lowest model level |
---|
300 | !!!!!!!!!!!!!! |
---|
301 | ! |
---|
302 | ! |
---|
303 | !-- LANDUSEF Landuse fraction ! P-X LSM |
---|
304 | !-- SOILCTOP Top soil fraction ! P-X LSM |
---|
305 | !-- SOILCBOT Bottom soil fraction ! P-X LSM |
---|
306 | !-- RA Aerodynamic resistence ! P-X LSM |
---|
307 | !-- RS Stomatal resistence ! P-X LSM |
---|
308 | !-- NLCAT Number of landuse categories ! P-X LSM |
---|
309 | !-- NSCAT Number of soil categories ! P-X LSM |
---|
310 | !-- ch - drag coefficient for heat/moisture ! MYNN LSM |
---|
311 | |
---|
312 | ! |
---|
313 | !-- ids start index for i in domain |
---|
314 | !-- ide end index for i in domain |
---|
315 | !-- jds start index for j in domain |
---|
316 | !-- jde end index for j in domain |
---|
317 | !-- kds start index for k in domain |
---|
318 | !-- kde end index for k in domain |
---|
319 | !-- ims start index for i in memory |
---|
320 | !-- ime end index for i in memory |
---|
321 | !-- jms start index for j in memory |
---|
322 | !-- jme end index for j in memory |
---|
323 | !-- kms start index for k in memory |
---|
324 | !-- kme end index for k in memory |
---|
325 | !-- its start index for i in tile |
---|
326 | !-- ite end index for i in tile |
---|
327 | !-- jts start index for j in tile |
---|
328 | !-- jte end index for j in tile |
---|
329 | !-- kts start index for k in tile |
---|
330 | !-- kte end index for k in tile |
---|
331 | ! |
---|
332 | !****************************************************************** |
---|
333 | !------------------------------------------------------------------ |
---|
334 | |
---|
335 | INTEGER, INTENT(IN) :: & |
---|
336 | & ids,ide,jds,jde,kds,kde & |
---|
337 | & ,ims,ime,jms,jme,kms,kme & |
---|
338 | & ,kts,kte,num_tiles |
---|
339 | |
---|
340 | INTEGER, INTENT(IN):: FRACTIONAL_SEAICE |
---|
341 | |
---|
342 | INTEGER, INTENT(IN):: NLCAT |
---|
343 | INTEGER, INTENT(IN):: NSCAT |
---|
344 | |
---|
345 | INTEGER, INTENT(IN) :: sf_sfclay_physics, sf_surface_physics, & |
---|
346 | sf_urban_physics,ra_lw_physics, sst_update |
---|
347 | INTEGER, INTENT(IN),OPTIONAL :: sst_skin, tmn_update |
---|
348 | |
---|
349 | INTEGER, DIMENSION(num_tiles), INTENT(IN) :: & |
---|
350 | & i_start,i_end,j_start,j_end |
---|
351 | |
---|
352 | INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ):: ISLTYP |
---|
353 | INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: IVGTYP |
---|
354 | INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: LOWLYR |
---|
355 | INTEGER, INTENT(IN ):: IFSNOW |
---|
356 | INTEGER, INTENT(IN ):: ISFFLX |
---|
357 | INTEGER, INTENT(IN ):: ITIMESTEP |
---|
358 | INTEGER, INTENT(IN ):: NUM_SOIL_LAYERS |
---|
359 | REAL, INTENT(IN ),OPTIONAL :: JULIAN_in |
---|
360 | INTEGER, INTENT(IN ):: LAGDAY |
---|
361 | INTEGER, INTENT(IN ):: STEPBL |
---|
362 | INTEGER, INTENT(IN ):: ISICE |
---|
363 | INTEGER, INTENT(IN ):: ISWATER |
---|
364 | INTEGER, INTENT(IN ), OPTIONAL :: ISURBAN |
---|
365 | CHARACTER(LEN=*), INTENT(IN ), OPTIONAL :: MMINLU |
---|
366 | LOGICAL, INTENT(IN ):: WARM_RAIN |
---|
367 | LOGICAL, INTENT(IN):: tice2tsk_if2cold |
---|
368 | INTEGER, INTENT(INOUT ),OPTIONAL :: NYEAR |
---|
369 | REAL , INTENT(INOUT ),OPTIONAL :: NDAY |
---|
370 | INTEGER, INTENT(IN ),OPTIONAL :: YR |
---|
371 | REAL , INTENT(IN ):: U_FRAME |
---|
372 | REAL , INTENT(IN ):: V_FRAME |
---|
373 | #if (NMM_CORE==1) |
---|
374 | real , intent(IN ):: SFENTH |
---|
375 | #endif |
---|
376 | REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), INTENT(INOUT):: SMOIS |
---|
377 | REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), INTENT(INOUT):: TSLB |
---|
378 | REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), INTENT(OUT) :: SMCREL |
---|
379 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: GLW |
---|
380 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: GSW,SWDOWN |
---|
381 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: HT |
---|
382 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: RAINCV |
---|
383 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: SST |
---|
384 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ),OPTIONAL :: SSTSK |
---|
385 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ),OPTIONAL :: DTW |
---|
386 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: TMN |
---|
387 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ),OPTIONAL :: TYR |
---|
388 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ),OPTIONAL :: TYRA |
---|
389 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ),OPTIONAL :: TDLY |
---|
390 | REAL, DIMENSION( ims:ime , 1:lagday , jms:jme ), INTENT(INOUT ),OPTIONAL :: TLAG |
---|
391 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: VEGFRA |
---|
392 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ):: XICE |
---|
393 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: XLAND |
---|
394 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: XICEM |
---|
395 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: MAVAIL |
---|
396 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: SNOALB |
---|
397 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: ACSNOW |
---|
398 | REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: SNOTIME |
---|
399 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: AKHS |
---|
400 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: AKMS |
---|
401 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: ALBEDO |
---|
402 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: CANWAT |
---|
403 | |
---|
404 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: GRDFLX |
---|
405 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: HFX |
---|
406 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: RMOL |
---|
407 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: PBLH |
---|
408 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: Q2 |
---|
409 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: QFX |
---|
410 | #if (NMM_CORE==1) |
---|
411 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT):: TAUX |
---|
412 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT):: TAUY |
---|
413 | #endif |
---|
414 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: QSFC |
---|
415 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: QZ0 |
---|
416 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: SFCRUNOFF |
---|
417 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: SMSTAV |
---|
418 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: SMSTOT |
---|
419 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: SNOW |
---|
420 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: SNOWC |
---|
421 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: SNOWH |
---|
422 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: TH2 |
---|
423 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: THZ0 |
---|
424 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: TSK |
---|
425 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: UDRUNOFF |
---|
426 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: UST |
---|
427 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: UZ0 |
---|
428 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: VZ0 |
---|
429 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: WSPD |
---|
430 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: ZNT |
---|
431 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: BR |
---|
432 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: CHKLOWQ |
---|
433 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: GZ1OZ0 |
---|
434 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: PSHLTR |
---|
435 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: PSIH |
---|
436 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: PSIM |
---|
437 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: Q10 |
---|
438 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: QSHLTR |
---|
439 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: TH10 |
---|
440 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: TSHLTR |
---|
441 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: U10 |
---|
442 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: V10 |
---|
443 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: PSFC |
---|
444 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: ACSNOM |
---|
445 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: SFCEVP |
---|
446 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT),OPTIONAL :: ACHFX |
---|
447 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT),OPTIONAL :: ACLHF |
---|
448 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT),OPTIONAL :: ACGRDFLX |
---|
449 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: SFCEXC |
---|
450 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: FLHC |
---|
451 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: FLQC |
---|
452 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CT |
---|
453 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: DZ8W |
---|
454 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: P8W |
---|
455 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: PI_PHY |
---|
456 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: P_PHY |
---|
457 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: RHO |
---|
458 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: TH_PHY |
---|
459 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: T_PHY |
---|
460 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: U_PHY |
---|
461 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: V_PHY |
---|
462 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: Z |
---|
463 | |
---|
464 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: TKE_PBL |
---|
465 | REAL, DIMENSION(1:num_soil_layers), INTENT(IN):: DZS |
---|
466 | REAL, DIMENSION(1:num_soil_layers), INTENT(IN):: ZS |
---|
467 | REAL, INTENT(IN ):: DT |
---|
468 | REAL, INTENT(IN ):: DX |
---|
469 | REAL, INTENT(IN ),OPTIONAL :: bldt |
---|
470 | REAL, INTENT(IN ),OPTIONAL :: curr_secs |
---|
471 | LOGICAL, INTENT(IN ),OPTIONAL :: adapt_step_flag |
---|
472 | |
---|
473 | ! arguments for NCAR surface physics |
---|
474 | |
---|
475 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ):: ALBBCK ! INOUT needed for NMM |
---|
476 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ):: EMBCK |
---|
477 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ):: LH |
---|
478 | REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), INTENT(INOUT):: SH2O |
---|
479 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: SHDMAX |
---|
480 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: SHDMIN |
---|
481 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ):: Z0 |
---|
482 | |
---|
483 | ! Variables for multi-layer UCM |
---|
484 | REAL, OPTIONAL, INTENT(IN ) :: GMT |
---|
485 | INTEGER, OPTIONAL, INTENT(IN ) :: JULDAY |
---|
486 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) ::XLAT, XLONG |
---|
487 | INTEGER, INTENT(IN ):: NUM_URBAN_LAYERS |
---|
488 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: trb_urb4d |
---|
489 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw1_urb4d |
---|
490 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw2_urb4d |
---|
491 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tgb_urb4d |
---|
492 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tlev_urb3d |
---|
493 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: qlev_urb3d |
---|
494 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw1lev_urb3d |
---|
495 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw2lev_urb3d |
---|
496 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tglev_urb3d |
---|
497 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tflev_urb3d |
---|
498 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lf_ac_urb3d |
---|
499 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sf_ac_urb3d |
---|
500 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: cm_ac_urb3d |
---|
501 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sfvent_urb3d |
---|
502 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lfvent_urb3d |
---|
503 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfwin1_urb3d |
---|
504 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfwin2_urb3d |
---|
505 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfw1_urb3d |
---|
506 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfw2_urb3d |
---|
507 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfr_urb3d |
---|
508 | REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfg_urb3d |
---|
509 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_u_bep !Implicit momemtum component X-direction |
---|
510 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_v_bep !Implicit momemtum component Y-direction |
---|
511 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_t_bep !Implicit component pot. temperature |
---|
512 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_e_bep !Implicit component TKE |
---|
513 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_q_bep !Implicit component TKE |
---|
514 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_u_bep !Explicit momentum component X-direction |
---|
515 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_v_bep !Explicit momentum component Y-direction |
---|
516 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_t_bep !Explicit component pot. temperature |
---|
517 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_e_bep !Explicit component TKE |
---|
518 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_q_bep !Explicit component TKE |
---|
519 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::vl_bep !Fraction air volume in grid cell |
---|
520 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::dlg_bep !Height above ground |
---|
521 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::sf_bep !Fraction air at the face of grid cell |
---|
522 | REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::dl_u_bep !Length scale |
---|
523 | |
---|
524 | ! Optional |
---|
525 | ! |
---|
526 | ! arguments for Ocean Mixed Layer Model |
---|
527 | REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, INTENT(INOUT ):: TML, T0ML, HML, H0ML, HUML, HVML |
---|
528 | REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, INTENT(IN ):: F, TMOML |
---|
529 | REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, INTENT(OUT ):: CK, CKA, CD, CDA, USTM |
---|
530 | |
---|
531 | #if ( EM_CORE==1) |
---|
532 | REAL, DIMENSION( ims:ime , jms:jme ), & |
---|
533 | &OPTIONAL, INTENT(INOUT ):: ch |
---|
534 | |
---|
535 | REAL, DIMENSION( ims:ime , kms:kme, jms:jme ), & |
---|
536 | &OPTIONAL, INTENT(IN ):: tsq,qsq,cov |
---|
537 | #endif |
---|
538 | |
---|
539 | |
---|
540 | INTEGER, OPTIONAL, INTENT(IN ):: slope_rad, topo_shading |
---|
541 | INTEGER, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN):: shadowmask |
---|
542 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: swnorm |
---|
543 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN):: slope,slp_azi |
---|
544 | |
---|
545 | INTEGER, OPTIONAL, INTENT(IN ):: ISFTCFLX,IZ0TLND |
---|
546 | INTEGER, OPTIONAL, INTENT(IN ):: OMLCALL |
---|
547 | REAL , OPTIONAL, INTENT(IN ):: OML_HML0 |
---|
548 | REAL , OPTIONAL, INTENT(IN ):: OML_GAMMA |
---|
549 | ! |
---|
550 | ! Observation nudging |
---|
551 | ! |
---|
552 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(OUT):: uratx !Added for obs-nudging |
---|
553 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(OUT):: vratx !Added for obs-nudging |
---|
554 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(OUT):: tratx !Added for obs-nudging |
---|
555 | ! |
---|
556 | ! PX LSM Surface Grid Analysis nudging |
---|
557 | ! |
---|
558 | INTEGER, OPTIONAL, INTENT(IN) :: pxlsm_smois_init, pxlsm_soil_nudge, ANAL_INTERVAL |
---|
559 | REAL, DIMENSION( ims:ime, NLCAT, jms:jme ) , OPTIONAL, INTENT(INOUT):: LANDUSEF |
---|
560 | REAL, DIMENSION( ims:ime, NSCAT, jms:jme ) , OPTIONAL, INTENT(INOUT):: SOILCTOP, SOILCBOT |
---|
561 | REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, INTENT(INOUT):: VEGF_PX |
---|
562 | REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: RA |
---|
563 | REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: RS |
---|
564 | REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: LAI |
---|
565 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(OUT):: T2OBS |
---|
566 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(OUT):: Q2OBS |
---|
567 | |
---|
568 | REAL, DIMENSION( ims:ime, jms:jme ), & |
---|
569 | OPTIONAL, INTENT(INOUT) :: t2_ndg_old, & |
---|
570 | q2_ndg_old, & |
---|
571 | t2_ndg_new, & |
---|
572 | q2_ndg_new, & |
---|
573 | sn_ndg_old, & |
---|
574 | sn_ndg_new |
---|
575 | ! |
---|
576 | ! |
---|
577 | ! Flags relating to the optional tendency arrays declared above |
---|
578 | ! Models that carry the optional tendencies will provdide the |
---|
579 | ! optional arguments at compile time; these flags all the model |
---|
580 | ! to determine at run-time whether a particular tracer is in |
---|
581 | ! use or not. |
---|
582 | ! |
---|
583 | LOGICAL, INTENT(IN), OPTIONAL :: & |
---|
584 | f_qv & |
---|
585 | ,f_qc & |
---|
586 | ,f_qr & |
---|
587 | ,f_qi & |
---|
588 | ,f_qs & |
---|
589 | ,f_qg |
---|
590 | |
---|
591 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), & |
---|
592 | OPTIONAL, INTENT(INOUT) :: & |
---|
593 | ! optional moisture tracers |
---|
594 | ! 2 time levels; if only one then use CURR |
---|
595 | qv_curr, qc_curr, qr_curr & |
---|
596 | ,qi_curr, qs_curr, qg_curr |
---|
597 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN) :: snowncv |
---|
598 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: capg |
---|
599 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: emiss |
---|
600 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: hol |
---|
601 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: mol |
---|
602 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: regime |
---|
603 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN ):: rainncv |
---|
604 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN ):: rainshv |
---|
605 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: RAINBL |
---|
606 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: t2 |
---|
607 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN ):: thc |
---|
608 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: qsg |
---|
609 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: qvg |
---|
610 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: qcg |
---|
611 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: dew |
---|
612 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: soilt1 |
---|
613 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: tsnav |
---|
614 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: potevp ! NMM LSM |
---|
615 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: snopcx ! NMM LSM |
---|
616 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: soiltb ! NMM LSM |
---|
617 | REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: sr ! NMM and RUC LSM |
---|
618 | REAL, DIMENSION( ims:ime, 1:num_soil_layers, jms:jme ), OPTIONAL, INTENT(INOUT):: smfr3d |
---|
619 | REAL, DIMENSION( ims:ime, 1:num_soil_layers, jms:jme ), OPTIONAL, INTENT(INOUT):: keepfr3dflag |
---|
620 | |
---|
621 | REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT), OPTIONAL :: NOAHRES |
---|
622 | |
---|
623 | ! Variables for TEMF surface layer |
---|
624 | REAL,OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: te_temf |
---|
625 | REAL,OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: hd_temf, exch_temf, wm_temf |
---|
626 | REAL,OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: fCor |
---|
627 | |
---|
628 | ! Variables for ideal SCM surface layer |
---|
629 | REAL,OPTIONAL, INTENT(INOUT) :: hfx_force,lh_force,tsk_force |
---|
630 | REAL,OPTIONAL, INTENT(IN ) :: hfx_force_tend,lh_force_tend,tsk_force_tend |
---|
631 | |
---|
632 | ! LOCAL VAR |
---|
633 | |
---|
634 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) ::v_phytmp |
---|
635 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) ::u_phytmp |
---|
636 | |
---|
637 | REAL, DIMENSION( ims:ime, jms:jme ) :: ZOL |
---|
638 | |
---|
639 | REAL, DIMENSION( ims:ime, jms:jme ) :: & |
---|
640 | QGH, & |
---|
641 | CHS, & |
---|
642 | CPM, & |
---|
643 | CHS2, & |
---|
644 | CQS2 |
---|
645 | |
---|
646 | REAL :: DTMIN,DTBL |
---|
647 | ! |
---|
648 | INTEGER :: i,J,K,NK,jj,ij |
---|
649 | INTEGER :: gfdl_ntsflg |
---|
650 | LOGICAL :: radiation, myj, frpcpn, isisfc |
---|
651 | LOGICAL, INTENT(in), OPTIONAL :: rdlai2d |
---|
652 | LOGICAL, INTENT(in), OPTIONAL :: usemonalb |
---|
653 | REAL :: julian |
---|
654 | REAL :: total_depth,mid_point_depth |
---|
655 | REAL :: tconst,tprior,tnew,yrday,deltat |
---|
656 | REAL :: SWSAVE |
---|
657 | REAL, DIMENSION( ims:ime, jms:jme ) :: GSWSAVE |
---|
658 | !------------------------------------------------- |
---|
659 | ! urban related variables are added to declaration |
---|
660 | !------------------------------------------------- |
---|
661 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMR_SFCDIF |
---|
662 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHR_SFCDIF |
---|
663 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMC_SFCDIF |
---|
664 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHC_SFCDIF |
---|
665 | REAL, OPTIONAL, INTENT(IN) :: DECLIN, SOLCON |
---|
666 | REAL, OPTIONAL , DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: COSZEN |
---|
667 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: HRANG |
---|
668 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: XLAT_URB2D !urban |
---|
669 | INTEGER, INTENT(IN) :: num_roof_layers !urban |
---|
670 | INTEGER, INTENT(IN) :: num_wall_layers !urban |
---|
671 | INTEGER, INTENT(IN) :: num_road_layers !urban |
---|
672 | REAL, OPTIONAL, DIMENSION(1:num_soil_layers), INTENT(IN) :: DZR !urban |
---|
673 | REAL, OPTIONAL, DIMENSION(1:num_soil_layers), INTENT(IN) :: DZB !urban |
---|
674 | REAL, OPTIONAL, DIMENSION(1:num_soil_layers), INTENT(IN) :: DZG !urban |
---|
675 | |
---|
676 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TR_URB2D !urban |
---|
677 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TB_URB2D !urban |
---|
678 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TG_URB2D !urban |
---|
679 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: TC_URB2D !urban |
---|
680 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: QC_URB2D !urban |
---|
681 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: UC_URB2D !urban |
---|
682 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: XXXR_URB2D !urban |
---|
683 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: XXXB_URB2D !urban |
---|
684 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: XXXG_URB2D !urban |
---|
685 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: XXXC_URB2D !urban |
---|
686 | REAL, OPTIONAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), & !urban |
---|
687 | INTENT(INOUT) :: TRL_URB3D !urban |
---|
688 | REAL, OPTIONAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), & !urban |
---|
689 | INTENT(INOUT) :: TBL_URB3D !urban |
---|
690 | REAL, OPTIONAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), & !urban |
---|
691 | INTENT(INOUT) :: TGL_URB3D !urban |
---|
692 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SH_URB2D !urban |
---|
693 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: LH_URB2D !urban |
---|
694 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: G_URB2D !urban |
---|
695 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: RN_URB2D !urban |
---|
696 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: TS_URB2D !urban |
---|
697 | ! |
---|
698 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: FRC_URB2D !urban |
---|
699 | INTEGER, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: UTYPE_URB2D !urban |
---|
700 | |
---|
701 | REAL, DIMENSION( ims:ime, jms:jme ) :: PSIM_URB2D !urban local var |
---|
702 | REAL, DIMENSION( ims:ime, jms:jme ) :: PSIH_URB2D !urban local var |
---|
703 | REAL, DIMENSION( ims:ime, jms:jme ) :: GZ1OZ0_URB2D !urban local var |
---|
704 | !m REAL, DIMENSION( ims:ime, jms:jme ) :: AKHS_URB2D !urban local var |
---|
705 | REAL, DIMENSION( ims:ime, jms:jme ) :: AKMS_URB2D !urban local var |
---|
706 | REAL, DIMENSION( ims:ime, jms:jme ) :: U10_URB2D !urban local var |
---|
707 | REAL, DIMENSION( ims:ime, jms:jme ) :: V10_URB2D !urban local var |
---|
708 | REAL, DIMENSION( ims:ime, jms:jme ) :: TH2_URB2D !urban local var |
---|
709 | REAL, DIMENSION( ims:ime, jms:jme ) :: Q2_URB2D !urban local var |
---|
710 | REAL, DIMENSION( ims:ime, jms:jme ) :: UST_URB2D !urban local var |
---|
711 | |
---|
712 | ! |
---|
713 | REAL, DIMENSION( ims:ime, jms:jme ) :: HFX_SEA |
---|
714 | REAL, DIMENSION( ims:ime, jms:jme ) :: QFX_SEA |
---|
715 | REAL, DIMENSION( ims:ime, jms:jme ) :: LH_SEA |
---|
716 | REAL, DIMENSION( ims:ime, jms:jme ) :: QSFC_SEA |
---|
717 | REAL, DIMENSION( ims:ime, jms:jme ) :: TSK_SEA |
---|
718 | REAL, DIMENSION( ims:ime, jms:jme ) :: ZNT_SEA |
---|
719 | |
---|
720 | REAL, DIMENSION( ims:ime, jms:jme ) :: CHS_SEA |
---|
721 | REAL, DIMENSION( ims:ime, jms:jme ) :: CHS2_SEA |
---|
722 | REAL, DIMENSION( ims:ime, jms:jme ) :: CQS2_SEA |
---|
723 | REAL, DIMENSION( ims:ime, jms:jme ) :: CPM_SEA |
---|
724 | REAL, DIMENSION( ims:ime, jms:jme ) :: FLHC_SEA |
---|
725 | REAL, DIMENSION( ims:ime, jms:jme ) :: FLQC_SEA |
---|
726 | REAL, DIMENSION( ims:ime, jms:jme ) :: QGH_SEA |
---|
727 | ! |
---|
728 | REAL, DIMENSION( ims:ime, jms:jme ) :: PSIH_SEA |
---|
729 | REAL, DIMENSION( ims:ime, jms:jme ) :: PBLH_SEA |
---|
730 | REAL, DIMENSION( ims:ime, jms:jme ) :: RMOL_SEA |
---|
731 | REAL, DIMENSION( ims:ime, jms:jme ) :: UST_SEA |
---|
732 | REAL, DIMENSION( ims:ime, jms:jme ) :: QZ0_SEA |
---|
733 | REAL, DIMENSION( ims:ime, jms:jme ) :: TSK_LOCAL |
---|
734 | ! |
---|
735 | REAL :: xice_threshold |
---|
736 | ! |
---|
737 | |
---|
738 | |
---|
739 | !------------------------------------------------------------------ |
---|
740 | CHARACTER*256 :: message |
---|
741 | REAL :: next_bl_time |
---|
742 | LOGICAL :: run_param |
---|
743 | LOGICAL :: do_adapt |
---|
744 | ! |
---|
745 | ! |
---|
746 | !------------------------------------------------------------------ |
---|
747 | ! |
---|
748 | |
---|
749 | |
---|
750 | if (sf_sfclay_physics .eq. 0) return |
---|
751 | ! if (sf_sfclay_physics .eq. 0 .or. sf_surface_physics.eq.0) return |
---|
752 | |
---|
753 | if ( fractional_seaice == 0 ) then |
---|
754 | xice_threshold = 0.5 |
---|
755 | else if ( fractional_seaice == 1 ) then |
---|
756 | xice_threshold = 0.02 |
---|
757 | endif |
---|
758 | |
---|
759 | |
---|
760 | v_phytmp = 0. |
---|
761 | u_phytmp = 0. |
---|
762 | ZOL = 0. |
---|
763 | QGH = 0. |
---|
764 | CHS = 0. |
---|
765 | CPM = 0. |
---|
766 | CHS2 = 0. |
---|
767 | DTMIN = 0. |
---|
768 | DTBL = 0. |
---|
769 | |
---|
770 | ! RAINBL in mm (Accumulation between PBL calls) |
---|
771 | |
---|
772 | IF ( PRESENT( rainncv ) .AND. PRESENT( rainbl ) ) THEN |
---|
773 | !$OMP PARALLEL DO & |
---|
774 | !$OMP PRIVATE ( ij, i, j, k ) |
---|
775 | DO ij = 1 , num_tiles |
---|
776 | DO j=j_start(ij),j_end(ij) |
---|
777 | DO i=i_start(ij),i_end(ij) |
---|
778 | RAINBL(i,j) = RAINBL(i,j) + RAINCV(i,j) + RAINNCV(i,j) |
---|
779 | IF ( PRESENT( rainshv ))RAINBL(i,j) = RAINBL(i,j) + RAINSHV(i,j) |
---|
780 | RAINBL(i,j) = MAX (RAINBL(i,j), 0.0) |
---|
781 | ENDDO |
---|
782 | ENDDO |
---|
783 | ENDDO |
---|
784 | !$OMP END PARALLEL DO |
---|
785 | ELSE IF ( PRESENT( rainbl ) ) THEN |
---|
786 | !$OMP PARALLEL DO & |
---|
787 | !$OMP PRIVATE ( ij, i, j, k ) |
---|
788 | DO ij = 1 , num_tiles |
---|
789 | DO j=j_start(ij),j_end(ij) |
---|
790 | DO i=i_start(ij),i_end(ij) |
---|
791 | RAINBL(i,j) = RAINBL(i,j) + RAINCV(i,j) |
---|
792 | IF ( PRESENT( rainshv ))RAINBL(i,j) = RAINBL(i,j) + RAINSHV(i,j) |
---|
793 | RAINBL(i,j) = MAX (RAINBL(i,j), 0.0) |
---|
794 | ENDDO |
---|
795 | ENDDO |
---|
796 | ENDDO |
---|
797 | !$OMP END PARALLEL DO |
---|
798 | ENDIF |
---|
799 | ! Update SST |
---|
800 | IF (sst_update .EQ. 1) THEN |
---|
801 | !$OMP PARALLEL DO & |
---|
802 | !$OMP PRIVATE ( ij, i, j, k ) |
---|
803 | DO ij = 1 , num_tiles |
---|
804 | DO j=j_start(ij),j_end(ij) |
---|
805 | DO i=i_start(ij),i_end(ij) |
---|
806 | |
---|
807 | IF ( FRACTIONAL_SEAICE == 1 ) then |
---|
808 | IF ( ( XICE(I,J) .NE. XICEM(I,J) ) .AND. ( XICEM(I,J) .GT. XICE_THRESHOLD ) ) THEN |
---|
809 | ! Fractional values of ALBEDO and EMISSIVITY are valid according to the |
---|
810 | ! earlier fractional seaice value, XICEM. Recompute them for the new |
---|
811 | ! seaice value XICE. |
---|
812 | ALBEDO(I,J) = 0.08 + XICE(I,J)/XICEM(I,J) * ( ALBEDO(I,J) - 0.08 ) |
---|
813 | EMISS (I,J) = 0.98 + XICE(I,J)/XICEM(I,J) * ( EMISS (I,J) - 0.98 ) |
---|
814 | ENDIF |
---|
815 | ENDIF |
---|
816 | |
---|
817 | IF ( XLAND(i,j) .GT. 1.5 .AND. XICE(I,J) .GE. XICE_THRESHOLD .AND. XICEM(I,J) .LT. XICE_THRESHOLD ) THEN |
---|
818 | ! water point turns to sea-ice point |
---|
819 | XICEM(I,J) = XICE(I,J) |
---|
820 | XLAND(I,J) = 1. |
---|
821 | IVGTYP(I,J) = ISICE |
---|
822 | ISLTYP(I,J) = 16 |
---|
823 | VEGFRA(I,J) = 0. |
---|
824 | TMN(I,J) = 271.4 |
---|
825 | ! Over new ice, initial guesses of ALBEDO and EMISS are |
---|
826 | ! based on default water and ice values for albedo and |
---|
827 | ! emissivity. The land-surface schemes can update these |
---|
828 | ! values |
---|
829 | ALBEDO(I,J) = 0.80 * XICE(I,J) + 0.08 * ( 1.0-XICE(I,J) ) |
---|
830 | ALBBCK(I,J) = 0.80 |
---|
831 | EMISS(I,J) = 0.98 * XICE(I,J) + 0.98 * ( 1.0-XICE(I,J) ) |
---|
832 | EMBCK(I,J) = 0.98 |
---|
833 | DO nk = 1, num_soil_layers |
---|
834 | TSLB(I,NK,J) = TSK(I,J) |
---|
835 | SMOIS(I,NK,J) = 1.0 |
---|
836 | SH2O(I,NK,J) = 0.0 |
---|
837 | ENDDO |
---|
838 | ENDIF |
---|
839 | IF(XLAND(i,j) .GT. 1.5) THEN |
---|
840 | TSK(i,j) =SST(i,j) |
---|
841 | TSLB(i,1,j)=SST(i,j) |
---|
842 | ENDIF |
---|
843 | IF ( XLAND(i,j) .LT. 1.5 .AND. XICEM(I,J) .GE. XICE_THRESHOLD .AND. XICE(I,J) .LT. XICE_THRESHOLD ) THEN |
---|
844 | ! sea-ice point turns to water point |
---|
845 | XICEM(I,J) = XICE(I,J) |
---|
846 | XLAND(I,J) = 2. |
---|
847 | IVGTYP(I,J) = ISWATER |
---|
848 | ISLTYP(I,J) = 14 |
---|
849 | VEGFRA(I,J) = 0. |
---|
850 | SNOW(I,J) = 0. |
---|
851 | SNOWC(I,J) = 0. |
---|
852 | SNOWH(I,J) = 0. |
---|
853 | TMN(I,J) = SST(I,J) |
---|
854 | ALBEDO(I,J) = 0.08 |
---|
855 | ALBBCK(I,J) = 0.08 |
---|
856 | EMISS(I,J) = 0.98 |
---|
857 | EMBCK(I,J) = 0.98 |
---|
858 | DO nk = 1, num_soil_layers |
---|
859 | TSLB(I,NK,J) = SST(I,J) |
---|
860 | SMOIS(I,NK,J) = 1.0 |
---|
861 | SH2O(I,NK,J) = 1.0 |
---|
862 | ENDDO |
---|
863 | ENDIF |
---|
864 | |
---|
865 | XICEM(i,j) = XICE(i,j) |
---|
866 | |
---|
867 | ENDDO |
---|
868 | ENDDO |
---|
869 | ENDDO |
---|
870 | !$OMP END PARALLEL DO |
---|
871 | ENDIF |
---|
872 | |
---|
873 | IF(PRESENT(SST_SKIN))THEN |
---|
874 | IF (sst_skin .EQ. 1) THEN |
---|
875 | ! Calculate skin sst based on Zeng and Beljaars (2005) |
---|
876 | CALL wrf_debug( 100, 'in SST_SKIN_UPDATE' ) |
---|
877 | !$OMP PARALLEL DO & |
---|
878 | !$OMP PRIVATE ( ij, i, j, k ) |
---|
879 | DO ij = 1 , num_tiles |
---|
880 | CALL sst_skin_update(xland,glw,gsw,hfx,qfx,tsk,ust, & |
---|
881 | emiss,dtw,sstsk,dt,stbolt, & |
---|
882 | ids, ide, jds, jde, kds, kde, & |
---|
883 | ims, ime, jms, jme, kms, kme, & |
---|
884 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
885 | DO j=j_start(ij),j_end(ij) |
---|
886 | DO i=i_start(ij),i_end(ij) |
---|
887 | IF(XLAND(i,j) .GT. 1.5)TSK(i,j)=SSTSK(i,j) |
---|
888 | ENDDO |
---|
889 | ENDDO |
---|
890 | ENDDO |
---|
891 | !$OMP END PARALLEL DO |
---|
892 | ENDIF |
---|
893 | ENDIF |
---|
894 | |
---|
895 | IF(PRESENT(TMN_UPDATE))THEN |
---|
896 | IF (tmn_update .EQ. 1) THEN |
---|
897 | CALL wrf_debug( 100, 'in TMN_UPDATE' ) |
---|
898 | CALL tmnupdate(tsk,tmn,tlag,tyr,tyra,tdly,nday,nyear,lagday, & |
---|
899 | julian_in, dt, yr, & |
---|
900 | ids, ide, jds, jde, kds, kde, & |
---|
901 | ims, ime, jms, jme, kms, kme, & |
---|
902 | i_start,i_end, j_start,j_end, kts,kte, num_tiles ) |
---|
903 | |
---|
904 | ENDIF |
---|
905 | ENDIF |
---|
906 | ! |
---|
907 | ! Modified for adaptive time step |
---|
908 | ! |
---|
909 | |
---|
910 | IF ( (itimestep .EQ. 1) .OR. (MOD(itimestep,STEPBL) .EQ. 0) ) THEN |
---|
911 | run_param = .TRUE. |
---|
912 | ELSE |
---|
913 | run_param = .FALSE. |
---|
914 | ENDIF |
---|
915 | IF (PRESENT(adapt_step_flag)) THEN |
---|
916 | IF ((adapt_step_flag)) THEN |
---|
917 | IF ( (itimestep .EQ. 1) .OR. (bldt .EQ. 0) .OR. & |
---|
918 | ( CURR_SECS + dt >= ( INT( CURR_SECS / ( bldt * 60 ) + 1 ) * bldt * 60) ) ) THEN |
---|
919 | run_param = .TRUE. |
---|
920 | ELSE |
---|
921 | run_param = .FALSE. |
---|
922 | ENDIF |
---|
923 | ENDIF |
---|
924 | ENDIF |
---|
925 | |
---|
926 | IF ( run_param ) then |
---|
927 | |
---|
928 | ! IF (itimestep .eq. 1 .or. mod(itimestep,STEPBL) .eq. 0) THEN |
---|
929 | |
---|
930 | radiation = .false. |
---|
931 | frpcpn = .false. |
---|
932 | myj = ((sf_sfclay_physics .EQ. MYJSFCSCHEME) .OR. & |
---|
933 | (sf_sfclay_physics .EQ. QNSESFCSCHEME) ) |
---|
934 | isisfc = ( FRACTIONAL_SEAICE .EQ. 1 .AND. ( & |
---|
935 | (sf_sfclay_physics .EQ. SFCLAYSCHEME ) .OR. & |
---|
936 | (sf_sfclay_physics .EQ. PXSFCSCHEME ) .OR. & |
---|
937 | (sf_sfclay_physics .EQ. MYJSFCSCHEME ) .OR. & |
---|
938 | (sf_sfclay_physics .EQ. GFSSFCSCHEME ) ) & |
---|
939 | ) |
---|
940 | |
---|
941 | IF (ra_lw_physics .gt. 0) radiation = .true. |
---|
942 | |
---|
943 | IF( PRESENT(slope_rad).AND. radiation )THEN |
---|
944 | ! topographic slope effects modify SWDOWN and GSW here |
---|
945 | IF (slope_rad .EQ. 1) THEN |
---|
946 | !$OMP PARALLEL DO & |
---|
947 | !$OMP PRIVATE ( ij, i, j, k ) |
---|
948 | DO ij = 1 , num_tiles |
---|
949 | CALL TOPO_RAD_ADJ_DRVR (XLAT,XLONG,COSZEN, & |
---|
950 | shadowmask, & |
---|
951 | declin, & |
---|
952 | SWDOWN,GSW,SWNORM,GSWSAVE,solcon,hrang, & |
---|
953 | slope,slp_azi, & |
---|
954 | ids, ide, jds, jde, kds, kde, & |
---|
955 | ims, ime, jms, jme, kms, kme, & |
---|
956 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
957 | ENDDO |
---|
958 | !$OMP END PARALLEL DO |
---|
959 | |
---|
960 | ENDIF |
---|
961 | ENDIF |
---|
962 | !---- |
---|
963 | ! CALCULATE CONSTANT |
---|
964 | |
---|
965 | DTMIN=DT/60. |
---|
966 | ! Surface schemes need PBL time step for updates and accumulations |
---|
967 | ! Assume these schemes provide no tendencies |
---|
968 | |
---|
969 | if (PRESENT(adapt_step_flag)) then |
---|
970 | if (adapt_step_flag) then |
---|
971 | do_adapt = .TRUE. |
---|
972 | else |
---|
973 | do_adapt = .FALSE. |
---|
974 | endif |
---|
975 | else |
---|
976 | do_adapt = .FALSE. |
---|
977 | endif |
---|
978 | |
---|
979 | if (PRESENT(BLDT)) then |
---|
980 | if (bldt .eq. 0) then |
---|
981 | DTBL = dt |
---|
982 | ELSE |
---|
983 | if (do_adapt) then |
---|
984 | call wrf_message("WARNING: When using an adaptive time-step the boundary layer"// & |
---|
985 | " time-step should be 0 (i.e., equivalent to model time-step). "// & |
---|
986 | "In order to proceed, for boundary layer calculations, the "// & |
---|
987 | "boundary layer time-step"// & |
---|
988 | " will be rounded to the nearest minute, possibly resulting in"// & |
---|
989 | " innacurate results.") |
---|
990 | DTBL=bldt*60 |
---|
991 | else |
---|
992 | DTBL=DT*STEPBL |
---|
993 | endif |
---|
994 | endif |
---|
995 | else |
---|
996 | DTBL=DT*STEPBL |
---|
997 | endif |
---|
998 | |
---|
999 | ! SAVE OLD VALUES |
---|
1000 | |
---|
1001 | |
---|
1002 | !$OMP PARALLEL DO & |
---|
1003 | !$OMP PRIVATE ( ij, i, j, k ) |
---|
1004 | DO ij = 1 , num_tiles |
---|
1005 | DO j=j_start(ij),j_end(ij) |
---|
1006 | DO i=i_start(ij),i_end(ij) |
---|
1007 | ! PSFC : in Pa |
---|
1008 | PSFC(I,J)=p8w(I,kts,J) |
---|
1009 | ! REVERSE ORDER IN THE VERTICAL DIRECTION |
---|
1010 | DO k=kts,kte |
---|
1011 | v_phytmp(i,k,j)=v_phy(i,k,j)+v_frame |
---|
1012 | u_phytmp(i,k,j)=u_phy(i,k,j)+u_frame |
---|
1013 | ENDDO |
---|
1014 | ENDDO |
---|
1015 | ENDDO |
---|
1016 | ENDDO |
---|
1017 | !$OMP END PARALLEL DO |
---|
1018 | |
---|
1019 | !$OMP PARALLEL DO & |
---|
1020 | !$OMP PRIVATE ( ij, i, j, k ) |
---|
1021 | DO ij = 1 , num_tiles |
---|
1022 | sfclay_select: SELECT CASE(sf_sfclay_physics) |
---|
1023 | |
---|
1024 | CASE (SFCLAYSCHEME) |
---|
1025 | ! DX varies spatially in NMM, therefore, SFCLAY cannot be called |
---|
1026 | ! because it takes a scalar DX. NMM passes in a dummy value for this |
---|
1027 | ! scalar. NEEDS FURTHER ATTENTION. JM 20050215 |
---|
1028 | IF (PRESENT(qv_curr) .AND. & |
---|
1029 | PRESENT(mol) .AND. PRESENT(regime) .AND. & |
---|
1030 | .TRUE. ) THEN |
---|
1031 | CALL wrf_debug( 100, 'in SFCLAY' ) |
---|
1032 | IF ( FRACTIONAL_SEAICE == 1 ) THEN |
---|
1033 | CALL SFCLAY_SEAICE_WRAPPER(u_phytmp,v_phytmp,t_phy,qv_curr,& |
---|
1034 | p_phy,dz8w,cp,g,rcp,r_d,xlv,psfc,chs,chs2,cqs2,cpm, & |
---|
1035 | znt,ust,pblh,mavail,zol,mol,regime,psim,psih, & |
---|
1036 | xland,hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc,rmol, & |
---|
1037 | u10,v10,th2,t2,q2, & |
---|
1038 | gz1oz0,wspd,br,isfflx,dx, & |
---|
1039 | svp1,svp2,svp3,svpt0,ep_1,ep_2,karman,eomeg,stbolt, & |
---|
1040 | P1000mb, & |
---|
1041 | XICE,SST,TSK_SEA, & |
---|
1042 | CHS2_SEA,CHS_SEA,CPM_SEA,CQS2_SEA,FLHC_SEA,FLQC_SEA, & |
---|
1043 | HFX_SEA,LH_SEA,QFX_SEA,QGH_SEA,QSFC_SEA,ZNT_SEA, & |
---|
1044 | ITIMESTEP,TICE2TSK_IF2COLD,XICE_THRESHOLD, & |
---|
1045 | ids,ide, jds,jde, kds,kde, & |
---|
1046 | ims,ime, jms,jme, kms,kme, & |
---|
1047 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte, & |
---|
1048 | ustm,ck,cka,cd,cda,isftcflx,iz0tlnd ) |
---|
1049 | ELSE |
---|
1050 | CALL SFCLAY(u_phytmp,v_phytmp,t_phy,qv_curr,& |
---|
1051 | p_phy,dz8w,cp,g,rcp,r_d,xlv,psfc,chs,chs2,cqs2,cpm, & |
---|
1052 | znt,ust,pblh,mavail,zol,mol,regime,psim,psih, & |
---|
1053 | xland,hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc,rmol, & |
---|
1054 | u10,v10,th2,t2,q2, & |
---|
1055 | gz1oz0,wspd,br,isfflx,dx, & |
---|
1056 | svp1,svp2,svp3,svpt0,ep_1,ep_2,karman,eomeg,stbolt, & |
---|
1057 | P1000mb, & |
---|
1058 | ids,ide, jds,jde, kds,kde, & |
---|
1059 | ims,ime, jms,jme, kms,kme, & |
---|
1060 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte, & |
---|
1061 | ustm,ck,cka,cd,cda,isftcflx,iz0tlnd ) |
---|
1062 | #if ( EM_CORE==1) |
---|
1063 | DO j = j_start(ij),j_end(ij) |
---|
1064 | DO i = i_start(ij),i_end(ij) |
---|
1065 | ch(i,j) = chs (i,j) |
---|
1066 | !! ch(i,j) = flhc(i,j)/( cpm(i,j)*rho(i,kts,j) ) |
---|
1067 | end do |
---|
1068 | end do |
---|
1069 | #endif |
---|
1070 | ENDIF |
---|
1071 | ELSE |
---|
1072 | CALL wrf_error_fatal('Lacking arguments for SFCLAY in surface driver') |
---|
1073 | ENDIF |
---|
1074 | |
---|
1075 | CASE (PXSFCSCHEME) |
---|
1076 | #if (NMM_CORE != 1) |
---|
1077 | IF (PRESENT(qv_curr) .AND. & |
---|
1078 | PRESENT(mol) .AND. PRESENT(regime) .AND. & |
---|
1079 | .TRUE. ) THEN |
---|
1080 | CALL wrf_debug( 100, 'in PX Surface Layer scheme' ) |
---|
1081 | IF ( FRACTIONAL_SEAICE == 1 ) THEN |
---|
1082 | CALL WRF_ERROR_FATAL("PXSFCLAY not adapted for FRACTIONAL_SEAICE=1 option") |
---|
1083 | CALL PXSFCLAY_SEAICE_WRAPPER(u_phytmp,v_phytmp,t_phy,th_phy,qv_curr,& |
---|
1084 | p_phy,dz8w,cp,g,rcp,r_d,xlv,psfc,chs,chs2,cqs2,cpm, & |
---|
1085 | znt,ust,pblh,mavail,zol,mol,regime,psim,psih, & |
---|
1086 | xland,hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc,rmol, & |
---|
1087 | u10,v10, & |
---|
1088 | gz1oz0,wspd,br,isfflx,dx, & |
---|
1089 | svp1,svp2,svp3,svpt0,ep_1,ep_2,karman, & |
---|
1090 | XICE, SST, ITIMESTEP, TICE2TSK_IF2COLD,XICE_THRESHOLD, & |
---|
1091 | CHS_SEA, CHS2_SEA, CPM_SEA, CQS2_SEA,FLHC_SEA,FLQC_SEA,& |
---|
1092 | HFX_SEA, LH_SEA, QFX_SEA, QGH_SEA, QSFC_SEA, TSK_SEA, & |
---|
1093 | ids,ide, jds,jde, kds,kde, & |
---|
1094 | ims,ime, jms,jme, kms,kme, & |
---|
1095 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
1096 | ELSE |
---|
1097 | CALL PXSFCLAY(u_phytmp,v_phytmp,t_phy,th_phy,qv_curr,& |
---|
1098 | p_phy,dz8w,cp,g,rcp,r_d,xlv,psfc,chs,chs2,cqs2,cpm, & |
---|
1099 | znt,ust,pblh,mavail,zol,mol,regime,psim,psih, & |
---|
1100 | xland,hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc,rmol, & |
---|
1101 | u10,v10, & |
---|
1102 | gz1oz0,wspd,br,isfflx,dx, & |
---|
1103 | svp1,svp2,svp3,svpt0,ep_1,ep_2,karman, & |
---|
1104 | ids,ide, jds,jde, kds,kde, & |
---|
1105 | ims,ime, jms,jme, kms,kme, & |
---|
1106 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
1107 | ENDIF |
---|
1108 | ELSE |
---|
1109 | CALL wrf_error_fatal('Lacking arguments for PX Surface Layer in surface driver') |
---|
1110 | ENDIF |
---|
1111 | #else |
---|
1112 | CALL wrf_error_fatal('PX Surface Layer scheme cannot be used with NMM') |
---|
1113 | #endif |
---|
1114 | |
---|
1115 | CASE (MYJSFCSCHEME) |
---|
1116 | IF (PRESENT(qv_curr) .AND. PRESENT(qc_curr) .AND. & |
---|
1117 | .TRUE. ) THEN |
---|
1118 | |
---|
1119 | CALL wrf_debug(100,'in MYJSFC') |
---|
1120 | IF ( FRACTIONAL_SEAICE == 1 ) THEN |
---|
1121 | CALL MYJSFC_SEAICE_WRAPPER(itimestep,ht,dz8w, & |
---|
1122 | p_phy,p8w,th_phy,t_phy, & |
---|
1123 | qv_curr,qc_curr, & |
---|
1124 | u_phy,v_phy,tke_pbl, & |
---|
1125 | tsk,qsfc,thz0,qz0,uz0,vz0, & |
---|
1126 | lowlyr, & |
---|
1127 | xland,ivgtyp,isurban,iz0tlnd, & |
---|
1128 | TICE2TSK_IF2COLD, & ! Extra for wrapper. |
---|
1129 | XICE_THRESHOLD, & ! Extra for wrapper. |
---|
1130 | XICE, SST, & ! Extra for wrapper. |
---|
1131 | CHS_SEA, CHS2_SEA, CQS2_SEA, CPM_SEA, & |
---|
1132 | FLHC_SEA, FLQC_SEA, QSFC_SEA, & |
---|
1133 | QGH_SEA, QZ0_SEA, HFX_SEA, QFX_SEA, LH_SEA, & |
---|
1134 | TSK_SEA, & |
---|
1135 | ust,znt,z0,pblh,mavail,rmol, & |
---|
1136 | akhs,akms, & |
---|
1137 | br, & |
---|
1138 | chs,chs2,cqs2,hfx,qfx,lh,flhc,flqc,qgh,cpm,ct, & |
---|
1139 | u10,v10,t2,th2,tshltr,th10,q2,qshltr,q10,pshltr, & |
---|
1140 | p1000mb, & |
---|
1141 | ids,ide, jds,jde, kds,kde, & |
---|
1142 | ims,ime, jms,jme, kms,kme, & |
---|
1143 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
1144 | ELSE |
---|
1145 | CALL MYJSFC(itimestep,ht,dz8w, & |
---|
1146 | p_phy,p8w,th_phy,t_phy, & |
---|
1147 | qv_curr,qc_curr, & |
---|
1148 | u_phy,v_phy,tke_pbl, & |
---|
1149 | tsk,qsfc,thz0,qz0,uz0,vz0, & |
---|
1150 | lowlyr, & |
---|
1151 | xland,ivgtyp,isurban,iz0tlnd, & |
---|
1152 | ust,znt,z0,pblh,mavail,rmol, & |
---|
1153 | akhs,akms, & |
---|
1154 | br, & |
---|
1155 | chs,chs2,cqs2,hfx,qfx,lh,flhc,flqc,qgh,cpm,ct, & |
---|
1156 | u10,v10,t2,th2,tshltr,th10,q2,qshltr,q10,pshltr, & |
---|
1157 | p1000mb, & |
---|
1158 | ids,ide, jds,jde, kds,kde, & |
---|
1159 | ims,ime, jms,jme, kms,kme, & |
---|
1160 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
1161 | #if ( EM_CORE==1) |
---|
1162 | DO j = j_start(ij),j_end(ij) |
---|
1163 | DO i = i_start(ij),i_end(ij) |
---|
1164 | wspd(i,j) = MAX(SQRT(u_phy(i,kts,j)**2+v_phy(i,kts,j)**2),0.001) |
---|
1165 | ch(i,j) = chs (i,j) |
---|
1166 | !! ch(i,j) = flhc(i,j)/( cpm(i,j)*rho(i,kts,j) ) |
---|
1167 | END DO |
---|
1168 | END DO |
---|
1169 | #endif |
---|
1170 | |
---|
1171 | ENDIF |
---|
1172 | ELSE |
---|
1173 | CALL wrf_error_fatal('Lacking arguments for MYJSFC in surface driver') |
---|
1174 | ENDIF |
---|
1175 | |
---|
1176 | CASE (QNSESFCSCHEME) |
---|
1177 | IF (PRESENT(qv_curr) .AND. PRESENT(qc_curr) .AND. & |
---|
1178 | .TRUE. ) THEN |
---|
1179 | CALL wrf_debug(100,'in QNSESFC') |
---|
1180 | CALL QNSESFC(itimestep,ht,dz8w, & |
---|
1181 | p_phy,p8w,th_phy,t_phy, & |
---|
1182 | qv_curr,qc_curr, & |
---|
1183 | u_phy,v_phy,tke_pbl, & |
---|
1184 | tsk,qsfc,thz0,qz0,uz0,vz0, & |
---|
1185 | lowlyr, & |
---|
1186 | xland, & |
---|
1187 | ust,znt,z0,pblh,mavail,rmol, & |
---|
1188 | akhs,akms, & |
---|
1189 | br, & |
---|
1190 | chs,chs2,cqs2,hfx,qfx,lh,flhc,flqc,qgh,cpm,ct, & |
---|
1191 | u10,v10,tshltr,th10,qshltr,q10,pshltr, & |
---|
1192 | ids,ide, jds,jde, kds,kde, & |
---|
1193 | ims,ime, jms,jme, kms,kme, & |
---|
1194 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
1195 | ELSE |
---|
1196 | CALL wrf_error_fatal('Lacking arguments for QNSESFC in surface driver') |
---|
1197 | ENDIF |
---|
1198 | |
---|
1199 | CASE (GFSSFCSCHEME) |
---|
1200 | IF (PRESENT(qv_curr) .AND. .TRUE. ) THEN |
---|
1201 | CALL wrf_debug( 100, 'in GFSSFC' ) |
---|
1202 | IF (FRACTIONAL_SEAICE == 1) THEN |
---|
1203 | CALL SF_GFS_SEAICE_WRAPPER(u_phytmp,v_phytmp,t_phy,qv_curr, & |
---|
1204 | p_phy,CP,RCP,R_d,XLV,PSFC,CHS,CHS2,CQS2,CPM, & |
---|
1205 | ZNT,UST,PSIM,PSIH, & |
---|
1206 | XLAND,HFX,QFX,LH,TSK,FLHC,FLQC, & |
---|
1207 | QGH,QSFC,U10,V10, & |
---|
1208 | GZ1OZ0,WSPD,BR,ISFFLX, & |
---|
1209 | EP_1,EP_2,KARMAN,itimestep, & |
---|
1210 | TICE2TSK_IF2COLD, & |
---|
1211 | XICE_THRESHOLD, & |
---|
1212 | CHS_SEA, CHS2_SEA, CPM_SEA, CQS2_SEA, & |
---|
1213 | FLHC_SEA, FLQC_SEA, & |
---|
1214 | HFX_SEA, LH_SEA, QFX_SEA, QGH_SEA, QSFC_SEA, & |
---|
1215 | UST_SEA, ZNT_SEA, SST, XICE, & |
---|
1216 | ids,ide, jds,jde, kds,kde, & |
---|
1217 | ims,ime, jms,jme, kms,kme, & |
---|
1218 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
1219 | ELSE |
---|
1220 | CALL SF_GFS(u_phytmp,v_phytmp,t_phy,qv_curr, & |
---|
1221 | p_phy,CP,RCP,R_d,XLV,PSFC,CHS,CHS2,CQS2,CPM, & |
---|
1222 | ZNT,UST,PSIM,PSIH, & |
---|
1223 | XLAND,HFX,QFX,LH,TSK,FLHC,FLQC, & |
---|
1224 | QGH,QSFC,U10,V10, & |
---|
1225 | GZ1OZ0,WSPD,BR,ISFFLX, & |
---|
1226 | EP_1,EP_2,KARMAN,itimestep, & |
---|
1227 | ids,ide, jds,jde, kds,kde, & |
---|
1228 | ims,ime, jms,jme, kms,kme, & |
---|
1229 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
1230 | ENDIF |
---|
1231 | CALL wrf_debug(100,'in SFCDIAGS') |
---|
1232 | ELSE |
---|
1233 | CALL wrf_error_fatal('Lacking arguments for SF_GFS in surface driver') |
---|
1234 | ENDIF |
---|
1235 | |
---|
1236 | #if ( EM_CORE==1) |
---|
1237 | CASE(MYNNSFCSCHEME) |
---|
1238 | |
---|
1239 | IF (PRESENT(qv_curr) .AND. PRESENT(qc_curr) & |
---|
1240 | & .AND. PRESENT(qcg) ) THEN |
---|
1241 | |
---|
1242 | CALL wrf_debug(100,'in MYNNSFC') |
---|
1243 | |
---|
1244 | CALL SFCLAY_mynn(u_phytmp,v_phytmp,t_phy,qv_curr,& |
---|
1245 | p_phy,dz8w,cp,g,rcp,r_d,xlv,psfc,chs,chs2,cqs2,cpm, & |
---|
1246 | znt,ust,pblh,mavail,zol,mol,regime,psim,psih, & |
---|
1247 | xland,hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc,rmol, & |
---|
1248 | u10,v10,th2,t2,q2, & |
---|
1249 | gz1oz0,wspd,br,isfflx,dx, & |
---|
1250 | svp1,svp2,svp3,svpt0,ep_1,ep_2,karman,eomeg,stbolt, & |
---|
1251 | &itimestep,ch,th_phy,pi_phy,qc_curr,& |
---|
1252 | &tsq,qsq,cov,qcg,& |
---|
1253 | ids,ide, jds,jde, kds,kde, & |
---|
1254 | ims,ime, jms,jme, kms,kme, & |
---|
1255 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
1256 | |
---|
1257 | ELSE |
---|
1258 | CALL wrf_error_fatal('Lacking arguments for SFCLAY_mynn in surface driver') |
---|
1259 | |
---|
1260 | ENDIF |
---|
1261 | #endif |
---|
1262 | |
---|
1263 | #if ( EM_CORE==1) |
---|
1264 | CASE (TEMFSFCSCHEME) |
---|
1265 | IF (PRESENT(qv_curr).and.PRESENT(hd_temf)) THEN |
---|
1266 | CALL wrf_debug( 100, 'in TEMFSFCLAY' ) |
---|
1267 | ! WA 9/7/09 must initialize Z0 and ZNT for TEMF in ideal cases |
---|
1268 | ! DO J=j_start(ij),j_end(ij) |
---|
1269 | ! DO I=i_start(ij),i_end(ij) |
---|
1270 | ! CHKLOWQ(i,j) = 1.0 |
---|
1271 | ! Z0(i,j) = 0.03 ! For GABLS2 |
---|
1272 | ! ZNT(i,j) = 0.03 ! For GABLS2 |
---|
1273 | ! ENDDO |
---|
1274 | ! ENDDO |
---|
1275 | CALL TEMFSFCLAY(u3d=u_phytmp,v3d=v_phytmp,th3d=th_phy, & |
---|
1276 | qv3d=qv_curr,p3d=p_phy,pi3d=pi_phy,rho=rho,z=z,ht=ht, & |
---|
1277 | CP=cp,G=g,ROVCP=rovcp,R=r_d,XLV=xlv,psfc=psfc,chs=chs,& |
---|
1278 | chs2=chs2,cqs2=cqs2,CPM=cpm,znt=znt,ust=ust, & |
---|
1279 | MAVAIL=mavail,XLAND=xland,HFX=hfx,QFX=qfx,LH=lh, & |
---|
1280 | TSK=tsk,FLHC=flhc,FLQC=flqc,QGH=qgh,qsfc=qsfc, & |
---|
1281 | U10=u10,V10=v10,TH2=th2,T2=t2,Q2=q2, & |
---|
1282 | SVP1=svp1,SVP2=svp2,SVP3=svp3,SVPT0=svpt0,EP1=ep_1, & |
---|
1283 | EP2=ep_2,KARMAN=karman,fCor=fCor,te_temf=te_temf, & |
---|
1284 | hd_temf=hd_temf,exch_temf=exch_temf,wm_temf=wm_temf,& |
---|
1285 | ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, & |
---|
1286 | ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, & |
---|
1287 | its=i_start(ij),ite=i_end(ij), & |
---|
1288 | jts=j_start(ij),jte=j_end(ij), kts=kts,kte=kte ) |
---|
1289 | ELSE |
---|
1290 | CALL wrf_error_fatal('Lacking arguments for TEMFSFCLAY in surface driver') |
---|
1291 | ENDIF |
---|
1292 | |
---|
1293 | CASE (IDEALSCMSFCSCHEME) |
---|
1294 | IF (PRESENT(qv_curr)) THEN |
---|
1295 | CALL wrf_debug( 100, 'in IDEALSCMSFCLAY' ) |
---|
1296 | CALL IDEALSCMSFCLAY(u3d=u_phytmp,v3d=v_phytmp,th3d=th_phy, & |
---|
1297 | qv3d=qv_curr,p3d=p_phy,pi3d=pi_phy,rho=rho,z=z,ht=ht, & |
---|
1298 | CP=cp,G=g,ROVCP=rovcp,R=r_d,XLV=xlv,psfc=psfc,chs=chs,& |
---|
1299 | chs2=chs2,cqs2=cqs2,CPM=cpm,znt=znt,ust=ust, & |
---|
1300 | MAVAIL=mavail,XLAND=xland,HFX=hfx,QFX=qfx,LH=lh, & |
---|
1301 | TSK=tsk,FLHC=flhc,FLQC=flqc,QGH=qgh,qsfc=qsfc, & |
---|
1302 | U10=u10,V10=v10,TH2=th2,T2=t2,Q2=q2, & |
---|
1303 | SVP1=svp1,SVP2=svp2,SVP3=svp3,SVPT0=svpt0,EP1=ep_1, & |
---|
1304 | EP2=ep_2,KARMAN=karman,fCor=fCor, & |
---|
1305 | exch_temf=exch_temf, & |
---|
1306 | hfx_force=hfx_force,lh_force=lh_force,tsk_force=tsk_force, & |
---|
1307 | hfx_force_tend=hfx_force_tend, & |
---|
1308 | lh_force_tend=lh_force_tend, & |
---|
1309 | tsk_force_tend=tsk_force_tend, & |
---|
1310 | dt=dt,itimestep=itimestep, & |
---|
1311 | ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, & |
---|
1312 | ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, & |
---|
1313 | its=i_start(ij),ite=i_end(ij), & |
---|
1314 | jts=j_start(ij),jte=j_end(ij), kts=kts,kte=kte ) |
---|
1315 | ELSE |
---|
1316 | CALL wrf_error_fatal('Lacking arguments for IDEALSCMSFCLAY in surface driver') |
---|
1317 | ENDIF |
---|
1318 | #endif |
---|
1319 | |
---|
1320 | #if (NMM_CORE==1) |
---|
1321 | |
---|
1322 | CASE (GFDLSFCSCHEME) |
---|
1323 | CALL wrf_debug( 100, 'in GFDLSFC' ) |
---|
1324 | |
---|
1325 | IF(sf_surface_physics .eq. 88)THEN |
---|
1326 | GFDL_NTSFLG=1 |
---|
1327 | ELSE |
---|
1328 | GFDL_NTSFLG=0 |
---|
1329 | ENDIF |
---|
1330 | |
---|
1331 | CALL SF_GFDL(u_phytmp,v_phytmp,t_phy,qv_curr,p_phy, & |
---|
1332 | CP,RCP,R_d,XLV,PSFC,CHS,CHS2,CQS2,CPM, & |
---|
1333 | DTBL, SMOIS,num_soil_layers,ISLTYP,ZNT,UST,PSIM,PSIH, & !DT & MAVAIL |
---|
1334 | XLAND,HFX,QFX,TAUX,TAUY,LH,GSW,GLW,TSK,FLHC,FLQC, & ! gopal's doing for Ocean coupling |
---|
1335 | QGH,QSFC,U10,V10, & |
---|
1336 | GZ1OZ0,WSPD,BR,ISFFLX, & |
---|
1337 | EP_1,EP_2,KARMAN,GFDL_NTSFLG,SFENTH, & |
---|
1338 | ids,ide, jds,jde, kds,kde, & |
---|
1339 | ims,ime, jms,jme, kms,kme, & |
---|
1340 | i_start(ij),i_end(ij),j_start(ij),j_end(ij),kts,kte ) |
---|
1341 | DO j=j_start(ij),j_end(ij) |
---|
1342 | DO i=i_start(ij),i_end(ij) |
---|
1343 | CHKLOWQ(I,J)= 1.0 |
---|
1344 | ENDDO |
---|
1345 | ENDDO |
---|
1346 | |
---|
1347 | #endif |
---|
1348 | CASE DEFAULT |
---|
1349 | |
---|
1350 | WRITE( message , * ) & |
---|
1351 | 'The sfclay option does not exist: sf_sfclay_physics = ', sf_sfclay_physics |
---|
1352 | CALL wrf_error_fatal ( message ) |
---|
1353 | |
---|
1354 | END SELECT sfclay_select |
---|
1355 | |
---|
1356 | ! Compute uratx, vratx, tratx for obs nudging |
---|
1357 | IF(PRESENT(uratx) .and. PRESENT(vratx) .and. PRESENT(tratx))THEN |
---|
1358 | DO J=j_start(ij),j_end(ij) |
---|
1359 | DO I=i_start(ij),i_end(ij) |
---|
1360 | IF(ABS(U10(I,J)) .GT. 1.E-10) THEN |
---|
1361 | uratx(I,J) = U_PHYTMP(I,1,J)/U10(I,J) |
---|
1362 | ELSE |
---|
1363 | uratx(I,J) = 1.2 |
---|
1364 | END IF |
---|
1365 | IF(ABS(V10(I,J)) .GT. 1.E-10) THEN |
---|
1366 | vratx(I,J) = V_PHYTMP(I,1,J)/V10(I,J) |
---|
1367 | ELSE |
---|
1368 | vratx(I,J) = 1.2 |
---|
1369 | END IF |
---|
1370 | ! (Quotient P1000mb/P_PHY must be conditioned due to large value of P1000mb) |
---|
1371 | tratx(I,J) = (T_PHY(I,1,J)*(P1000mb*0.001/(P_PHY(I,1,J)/1000.))**RCP) & |
---|
1372 | /TH2(I,J) |
---|
1373 | ENDDO |
---|
1374 | ENDDO |
---|
1375 | ENDIF |
---|
1376 | |
---|
1377 | ENDDO |
---|
1378 | !$OMP END PARALLEL DO |
---|
1379 | |
---|
1380 | IF (ISFFLX.EQ.0 ) GOTO 430 |
---|
1381 | !$OMP PARALLEL DO & |
---|
1382 | !$OMP PRIVATE ( ij, i, j, k ) |
---|
1383 | DO ij = 1 , num_tiles |
---|
1384 | |
---|
1385 | sfc_select: SELECT CASE(sf_surface_physics) |
---|
1386 | |
---|
1387 | CASE (SLABSCHEME) |
---|
1388 | |
---|
1389 | IF (PRESENT(qv_curr) .AND. & |
---|
1390 | PRESENT(capg) .AND. & |
---|
1391 | .TRUE. ) THEN |
---|
1392 | DO j=j_start(ij),j_end(ij) |
---|
1393 | DO i=i_start(ij),i_end(ij) |
---|
1394 | ! CQS2 ACCOUNTS FOR MAVAIL FOR SFCDIAGS 2M Q |
---|
1395 | CQS2(I,J)= CQS2(I,J)*MAVAIL(I,J) |
---|
1396 | ENDDO |
---|
1397 | ENDDO |
---|
1398 | |
---|
1399 | IF ( FRACTIONAL_SEAICE == 1 ) THEN |
---|
1400 | CALL wrf_error_fatal('SLAB scheme cannot be used with fractional seaice') |
---|
1401 | ENDIF |
---|
1402 | CALL wrf_debug(100,'in SLAB') |
---|
1403 | CALL SLAB(t_phy,qv_curr,p_phy,flhc,flqc, & |
---|
1404 | psfc,xland,tmn,hfx,qfx,lh,tsk,qsfc,chklowq, & |
---|
1405 | gsw,glw,capg,thc,snowc,emiss,mavail, & |
---|
1406 | dtbl,rcp,xlv,dtmin,ifsnow, & |
---|
1407 | svp1,svp2,svp3,svpt0,ep_2,karman,eomeg,stbolt, & |
---|
1408 | tslb,zs,dzs,num_soil_layers,radiation, & |
---|
1409 | p1000mb, & |
---|
1410 | ids,ide, jds,jde, kds,kde, & |
---|
1411 | ims,ime, jms,jme, kms,kme, & |
---|
1412 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte) |
---|
1413 | |
---|
1414 | DO j=j_start(ij),j_end(ij) |
---|
1415 | DO i=i_start(ij),i_end(ij) |
---|
1416 | SFCEVP(I,J)= SFCEVP(I,J) + QFX(I,J)*DTBL |
---|
1417 | IF(PRESENT(ACHFX))ACHFX(I,J)=ACHFX(I,J) + HFX(I,J)*DT |
---|
1418 | IF(PRESENT(ACLHF))ACLHF(I,J)=ACLHF(I,J) + LH(I,J)*DT |
---|
1419 | ENDDO |
---|
1420 | ENDDO |
---|
1421 | |
---|
1422 | CALL wrf_debug(100,'in SFCDIAGS') |
---|
1423 | CALL SFCDIAGS(hfx,qfx,tsk,qsfc,chs2,cqs2,t2,th2,q2, & |
---|
1424 | psfc,cp,r_d,rcp, & |
---|
1425 | ids,ide, jds,jde, kds,kde, & |
---|
1426 | ims,ime, jms,jme, kms,kme, & |
---|
1427 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
1428 | |
---|
1429 | ENDIF |
---|
1430 | |
---|
1431 | CASE (LSMSCHEME) |
---|
1432 | |
---|
1433 | IF (PRESENT(qv_curr) .AND. PRESENT(rainbl) .AND. & |
---|
1434 | ! PRESENT(emiss) .AND. PRESENT(t2) .AND. & |
---|
1435 | ! PRESENT(declin) .AND. PRESENT(coszen) .AND. & |
---|
1436 | ! PRESENT(hrang) .AND. PRESENT( xlat_urb2d) .AND. & |
---|
1437 | ! PRESENT(dzr) .AND. & |
---|
1438 | ! PRESENT( dzb) .AND. PRESENT(dzg) .AND. & |
---|
1439 | ! PRESENT(tr_urb2d) .AND. PRESENT(tb_urb2d) .AND. & |
---|
1440 | ! PRESENT(tg_urb2d) .AND. PRESENT(tc_urb2d) .AND. & |
---|
1441 | ! PRESENT(qc_urb2d) .AND. PRESENT(uc_urb2d) .AND. & |
---|
1442 | ! PRESENT(xxxr_urb2d) .AND. PRESENT(xxxb_urb2d) .AND. & |
---|
1443 | ! PRESENT(xxxg_urb2d) .AND. & |
---|
1444 | ! PRESENT(xxxc_urb2d) .AND. PRESENT(trl_urb3d) .AND. & |
---|
1445 | ! PRESENT(tbl_urb3d) .AND. PRESENT(tgl_urb3d) .AND. & |
---|
1446 | ! PRESENT(sh_urb2d) .AND. PRESENT(lh_urb2d) .AND. & |
---|
1447 | ! PRESENT(g_urb2d) .AND. PRESENT(rn_urb2d) .AND. & |
---|
1448 | ! PRESENT(ts_urb2d) .AND. & |
---|
1449 | ! PRESENT(frc_urb2d) .AND. PRESENT(utype_urb2d) .AND. & |
---|
1450 | .TRUE. ) THEN |
---|
1451 | !------------------------------------------------------------------ |
---|
1452 | IF( PRESENT(sr) ) THEN |
---|
1453 | frpcpn=.true. |
---|
1454 | ENDIF |
---|
1455 | IF ( FRACTIONAL_SEAICE == 1) THEN |
---|
1456 | ! The fields passed to LSM need to represent the full ice values, not |
---|
1457 | ! the fractional values. Convert ALBEDO and EMISS from the blended value |
---|
1458 | ! to a value representing only the sea-ice portion. Albedo over open |
---|
1459 | ! water is taken to be 0.08. Emissivity over open water is taken to be 0.98 |
---|
1460 | DO j = j_start(ij) , j_end(ij) |
---|
1461 | DO i = i_start(ij) , i_end(ij) |
---|
1462 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1 ) ) THEN |
---|
1463 | ALBEDO(I,J) = (ALBEDO(I,J)-(1.-XICE(I,J))*0.08)/XICE(I,J) |
---|
1464 | EMISS(I,J) = (EMISS(I,J)-(1.-XICE(I,J))*0.98)/XICE(I,J) |
---|
1465 | ENDIF |
---|
1466 | ENDDO |
---|
1467 | ENDDO |
---|
1468 | |
---|
1469 | IF ( isisfc ) THEN |
---|
1470 | ! Use surface layer routine values from the ice portion of grid point |
---|
1471 | ELSE |
---|
1472 | ! |
---|
1473 | ! We don't have surface layer routine values at this time, so |
---|
1474 | ! just use what we have. Use ice component of TSK |
---|
1475 | ! |
---|
1476 | CALL get_local_ice_tsk( ims, ime, jms, jme, & |
---|
1477 | i_start(ij), i_end(ij), & |
---|
1478 | j_start(ij), j_end(ij), & |
---|
1479 | itimestep, .false., tice2tsk_if2cold, & |
---|
1480 | XICE, XICE_THRESHOLD, & |
---|
1481 | SST, TSK, TSK_SEA, TSK_LOCAL ) |
---|
1482 | |
---|
1483 | DO j = j_start(ij) , j_end(ij) |
---|
1484 | DO i = i_start(ij) , i_end(ij) |
---|
1485 | TSK(i,j) = TSK_LOCAL(i,j) |
---|
1486 | ENDDO |
---|
1487 | ENDDO |
---|
1488 | ENDIF |
---|
1489 | ENDIF |
---|
1490 | |
---|
1491 | CALL wrf_debug(100,'in NOAH DRV') |
---|
1492 | CALL lsm(dz8w,qv_curr,p8w,t_phy,tsk, & |
---|
1493 | hfx,qfx,lh,grdflx,qgh,gsw,swdown,glw,smstav,smstot, & |
---|
1494 | sfcrunoff,udrunoff,ivgtyp,isltyp,isurban,isice,vegfra, & |
---|
1495 | albedo,albbck,znt,z0, tmn,xland,xice, emiss, embck, & |
---|
1496 | snowc,qsfc,rainbl, & |
---|
1497 | mminlu, & |
---|
1498 | num_soil_layers,dtbl,dzs,itimestep, & |
---|
1499 | smois,tslb,snow,canwat, & |
---|
1500 | chs, chs2, cqs2, cpm,rcp,SR,chklowq,lai,qz0, & |
---|
1501 | myj,frpcpn, & |
---|
1502 | sh2o,snowh, & !h |
---|
1503 | u_phy,v_phy, & !I |
---|
1504 | snoalb,shdmin,shdmax, & !i |
---|
1505 | snotime, & !o |
---|
1506 | acsnom,acsnow, & !o |
---|
1507 | snopcx, & !o |
---|
1508 | potevp, & !o |
---|
1509 | smcrel, & !o |
---|
1510 | xice_threshold, & |
---|
1511 | rdlai2d,usemonalb, & |
---|
1512 | br, & !? |
---|
1513 | NOAHRES, & |
---|
1514 | ids,ide, jds,jde, kds,kde, & |
---|
1515 | ims,ime, jms,jme, kms,kme, & |
---|
1516 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte, & |
---|
1517 | sf_urban_physics & |
---|
1518 | !Optional urban |
---|
1519 | ,cmr_sfcdif,chr_sfcdif,cmc_sfcdif,chc_sfcdif & |
---|
1520 | ,tr_urb2d,tb_urb2d,tg_urb2d,tc_urb2d,qc_urb2d, & !H urban |
---|
1521 | uc_urb2d, & !H urban |
---|
1522 | xxxr_urb2d,xxxb_urb2d,xxxg_urb2d,xxxc_urb2d, & !H urban |
---|
1523 | trl_urb3d,tbl_urb3d,tgl_urb3d, & !H urban |
---|
1524 | sh_urb2d,lh_urb2d,g_urb2d,rn_urb2d,ts_urb2d, & !H urban |
---|
1525 | psim_urb2d,psih_urb2d,u10_urb2d,v10_urb2d, & !O urban |
---|
1526 | GZ1OZ0_urb2d, AKMS_URB2D, & !O urban |
---|
1527 | th2_urb2d,q2_urb2d,ust_urb2d, & !O urban |
---|
1528 | declin,coszen,hrang, & !I solar |
---|
1529 | xlat_urb2d, & !I urban |
---|
1530 | num_roof_layers, num_wall_layers, & !I urban |
---|
1531 | num_road_layers, DZR, DZB, DZG, & !I urban |
---|
1532 | FRC_URB2D, UTYPE_URB2D, & !I urban |
---|
1533 | num_urban_layers, & !I multi-layer urban |
---|
1534 | trb_urb4d,tw1_urb4d,tw2_urb4d,tgb_urb4d, & !H multi-layer urban |
---|
1535 | tlev_urb3d,qlev_urb3d, & !H multi-layer urban |
---|
1536 | tw1lev_urb3d,tw2lev_urb3d, & !H multi-layer urban |
---|
1537 | tglev_urb3d,tflev_urb3d, & !H multi-layer urban |
---|
1538 | sf_ac_urb3d,lf_ac_urb3d,cm_ac_urb3d, & !H multi-layer urban |
---|
1539 | sfvent_urb3d,lfvent_urb3d, & !H multi-layer urban |
---|
1540 | sfwin1_urb3d,sfwin2_urb3d, & !H multi-layer urban |
---|
1541 | sfw1_urb3d,sfw2_urb3d,sfr_urb3d,sfg_urb3d, & !H multi-layer urban |
---|
1542 | th_phy,rho,p_phy,ust, & !I multi-layer urban |
---|
1543 | gmt,julday,xlong,xlat, & !I multi-layer urban |
---|
1544 | a_u_bep,a_v_bep,a_t_bep,a_q_bep, & !O multi-layer urban |
---|
1545 | a_e_bep,b_u_bep,b_v_bep, & !O multi-layer urban |
---|
1546 | b_t_bep,b_q_bep,b_e_bep,dlg_bep, & !O multi-layer urban |
---|
1547 | dl_u_bep,sf_bep,vl_bep & !O multi-layer urban |
---|
1548 | ) |
---|
1549 | |
---|
1550 | IF ( FRACTIONAL_SEAICE == 1 ) THEN |
---|
1551 | ! LSM Returns full land/ice values, no fractional values. |
---|
1552 | ! We return to a fractional component here. SFLX currently hard-wires |
---|
1553 | ! emissivity over sea ice to 0.98, the same value as over open water, so |
---|
1554 | ! the fractional consideration doesn't have any effect for emissivity. |
---|
1555 | DO j=j_start(ij),j_end(ij) |
---|
1556 | DO i=i_start(ij),i_end(ij) |
---|
1557 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
1558 | albedo(i,j) = ( albedo(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * 0.08 ) |
---|
1559 | emiss(i,j) = ( emiss(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * 0.98 ) |
---|
1560 | ENDIF |
---|
1561 | ENDDO |
---|
1562 | ENDDO |
---|
1563 | |
---|
1564 | IF ( isisfc ) THEN |
---|
1565 | DO j=j_start(ij),j_end(ij) |
---|
1566 | DO i=i_start(ij),i_end(ij) |
---|
1567 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
1568 | ! Weighted average of fields between ice-cover values and open-water values. |
---|
1569 | flhc(i,j) = ( flhc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * flhc_sea(i,j) ) |
---|
1570 | flqc(i,j) = ( flqc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * flqc_sea(i,j) ) |
---|
1571 | cpm(i,j) = ( cpm(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * cpm_sea(i,j) ) |
---|
1572 | cqs2(i,j) = ( cqs2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * cqs2_sea(i,j) ) |
---|
1573 | chs2(i,j) = ( chs2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * chs2_sea(i,j) ) |
---|
1574 | chs(i,j) = ( chs(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * chs_sea(i,j) ) |
---|
1575 | qsfc(i,j) = ( qsfc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * qsfc_sea(i,j) ) |
---|
1576 | qgh(i,j) = ( qgh(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * qgh_sea(i,j) ) |
---|
1577 | qz0(i,j) = ( qz0(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * qz0_sea(i,j) ) |
---|
1578 | hfx(i,j) = ( hfx(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * hfx_sea(i,j) ) |
---|
1579 | qfx(i,j) = ( qfx(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * qfx_sea(i,j) ) |
---|
1580 | lh(i,j) = ( lh(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * lh_sea(i,j) ) |
---|
1581 | tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * tsk_sea(i,j) ) |
---|
1582 | ENDIF |
---|
1583 | ENDDO |
---|
1584 | ENDDO |
---|
1585 | ELSE |
---|
1586 | DO j = j_start(ij) , j_end(ij) |
---|
1587 | DO i = i_start(ij) , i_end(ij) |
---|
1588 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
1589 | ! Compute TSK as the open-water and ice-cover average |
---|
1590 | tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * tsk_sea(i,j) ) |
---|
1591 | ENDIF |
---|
1592 | ENDDO |
---|
1593 | ENDDO |
---|
1594 | ENDIF |
---|
1595 | ENDIF |
---|
1596 | DO j=j_start(ij),j_end(ij) |
---|
1597 | DO i=i_start(ij),i_end(ij) |
---|
1598 | ! CHKLOWQ(I,J)= 1.0 |
---|
1599 | SFCEVP(I,J)= SFCEVP(I,J) + QFX(I,J)*DTBL |
---|
1600 | SFCEXC(I,J)= CHS(I,J) |
---|
1601 | IF(PRESENT(ACHFX))ACHFX(I,J)=ACHFX(I,J) + HFX(I,J)*DT |
---|
1602 | IF(PRESENT(ACLHF))ACLHF(I,J)=ACLHF(I,J) + LH(I,J)*DT |
---|
1603 | IF(PRESENT(ACGRDFLX))ACGRDFLX(I,J)=ACGRDFLX(I,J) + GRDFLX(I,J)*DT |
---|
1604 | ENDDO |
---|
1605 | ENDDO |
---|
1606 | |
---|
1607 | CALL SFCDIAGS(HFX,QFX,TSK,QSFC,CHS2,CQS2,T2,TH2,Q2, & |
---|
1608 | PSFC,CP,R_d,RCP, & |
---|
1609 | ids,ide, jds,jde, kds,kde, & |
---|
1610 | ims,ime, jms,jme, kms,kme, & |
---|
1611 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
1612 | !urban |
---|
1613 | IF(SF_URBAN_PHYSICS.eq.1) THEN |
---|
1614 | DO j=j_start(ij),j_end(ij) !urban |
---|
1615 | DO i=i_start(ij),i_end(ij) !urban |
---|
1616 | IF( IVGTYP(I,J) == ISURBAN .or. IVGTYP(I,J) == 31 .or. & !urban |
---|
1617 | IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33 ) THEN !urban |
---|
1618 | U10(I,J) = U10_URB2D(I,J) !urban |
---|
1619 | V10(I,J) = V10_URB2D(I,J) !urban |
---|
1620 | PSIM(I,J) = PSIM_URB2D(I,J) !urban |
---|
1621 | PSIH(I,J) = PSIH_URB2D(I,J) !urban |
---|
1622 | GZ1OZ0(I,J) = GZ1OZ0_URB2D(I,J) !urban |
---|
1623 | !m AKHS(I,J) = AKHS_URB2D(I,J) !urban |
---|
1624 | AKHS(I,J) = CHS(I,J) !urban |
---|
1625 | AKMS(I,J) = AKMS_URB2D(I,J) !urban |
---|
1626 | END IF !urban |
---|
1627 | ENDDO !urban |
---|
1628 | ENDDO !urban |
---|
1629 | ENDIF |
---|
1630 | ! urban BEP |
---|
1631 | IF((SF_URBAN_PHYSICS.eq.2).OR.(SF_URBAN_PHYSICS.eq.3)) THEN |
---|
1632 | DO j=j_start(ij),j_end(ij) !urban |
---|
1633 | DO i=i_start(ij),i_end(ij) !urban |
---|
1634 | IF( IVGTYP(I,J) == ISURBAN .or. IVGTYP(I,J) == 31 .or. & !urban |
---|
1635 | IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33 ) THEN !urban |
---|
1636 | T2(I,J) = TH_PHY(i,1,j)/((1.E5/PSFC(I,J))**RCP) !urban |
---|
1637 | TH2(I,J) = TH_PHY(i,1,j) !urban |
---|
1638 | Q2(I,J) = qv_curr(i,1,j) !urban |
---|
1639 | U10(I,J) = U_phy(I,1,J) !urban |
---|
1640 | V10(I,J) = V_phy(I,1,J) !urban |
---|
1641 | END IF !urban |
---|
1642 | ENDDO !urban |
---|
1643 | ENDDO !urban |
---|
1644 | ENDIF |
---|
1645 | |
---|
1646 | !------------------------------------------------------------------ |
---|
1647 | |
---|
1648 | ELSE |
---|
1649 | CALL wrf_error_fatal('Lacking arguments for LSM in surface driver') |
---|
1650 | ENDIF |
---|
1651 | |
---|
1652 | CASE (RUCLSMSCHEME) |
---|
1653 | IF (PRESENT(qv_curr) .AND. PRESENT(qc_curr) .AND. & |
---|
1654 | ! PRESENT(emiss) .AND. PRESENT(t2) .AND. & |
---|
1655 | PRESENT(qsg) .AND. PRESENT(qvg) .AND. & |
---|
1656 | PRESENT(qcg) .AND. PRESENT(soilt1) .AND. & |
---|
1657 | PRESENT(tsnav) .AND. PRESENT(smfr3d) .AND. & |
---|
1658 | PRESENT(keepfr3dflag) .AND. PRESENT(rainbl) .AND. & |
---|
1659 | PRESENT(dew) .AND. & |
---|
1660 | .TRUE. ) THEN |
---|
1661 | |
---|
1662 | IF( PRESENT(sr) ) THEN |
---|
1663 | frpcpn=.true. |
---|
1664 | ELSE |
---|
1665 | SR = 1. |
---|
1666 | ENDIF |
---|
1667 | CALL wrf_debug(100,'in RUC LSM') |
---|
1668 | IF ( FRACTIONAL_SEAICE == 1 ) THEN |
---|
1669 | ! The fields passed to LSMRUC need to represent the full ice values, not |
---|
1670 | ! the fractional values. Convert ALBEDO and EMISS from the blended value |
---|
1671 | ! to a value representing only the sea-ice portion. Albedo over open |
---|
1672 | ! water is taken to be 0.08. Emissivity over open water is taken to be 0.98 |
---|
1673 | DO j = j_start(ij) , j_end(ij) |
---|
1674 | DO i = i_start(ij) , i_end(ij) |
---|
1675 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1 ) ) THEN |
---|
1676 | ALBEDO(I,J) = (ALBEDO(I,J) - (1.-XICE(I,J))*0.08) / XICE(I,J) |
---|
1677 | EMISS(I,J) = (EMISS(I,J) - (1.-XICE(I,J))*0.98) / XICE(I,J) |
---|
1678 | ENDIF |
---|
1679 | ENDDO |
---|
1680 | ENDDO |
---|
1681 | |
---|
1682 | IF ( isisfc ) THEN |
---|
1683 | ! |
---|
1684 | ! use surface layer routine values from the ice portion of grid point |
---|
1685 | ! |
---|
1686 | ELSE |
---|
1687 | ! |
---|
1688 | ! don't have srfc layer routine values at this time, so just use what you have |
---|
1689 | ! use ice component of TSK |
---|
1690 | ! |
---|
1691 | CALL get_local_ice_tsk( ims, ime, jms, jme, & |
---|
1692 | i_start(ij), i_end(ij), & |
---|
1693 | j_start(ij), j_end(ij), & |
---|
1694 | itimestep, .false., tice2tsk_if2cold, & |
---|
1695 | XICE, XICE_THRESHOLD, & |
---|
1696 | SST, TSK, TSK_SEA, TSK_LOCAL ) |
---|
1697 | DO j = j_start(ij) , j_end(ij) |
---|
1698 | DO i = i_start(ij) , i_end(ij) |
---|
1699 | TSK(i,j) = TSK_LOCAL(i,j) |
---|
1700 | ENDDO |
---|
1701 | ENDDO |
---|
1702 | ENDIF |
---|
1703 | ENDIF |
---|
1704 | |
---|
1705 | CALL LSMRUC(dtbl,itimestep,num_soil_layers, & |
---|
1706 | zs,rainbl,snow,snowh,snowc,sr,frpcpn, & |
---|
1707 | dz8w,p8w,t_phy,qv_curr,qc_curr,rho, & !p8w in [pa] |
---|
1708 | glw,gsw,emiss,chklowq, & |
---|
1709 | chs,flqc,flhc,mavail,canwat,vegfra,albedo,znt, & |
---|
1710 | z0,snoalb, albbck, & !new |
---|
1711 | qsfc,qsg,qvg,qcg,dew,soilt1,tsnav, & |
---|
1712 | tmn,ivgtyp,isltyp,xland, & |
---|
1713 | isice,xice,xice_threshold, & |
---|
1714 | cp,rovcp,g,xlv,stbolt, & |
---|
1715 | smois,sh2o,smstav,smstot,tslb,tsk,hfx,qfx,lh, & |
---|
1716 | sfcrunoff,udrunoff,sfcexc, & |
---|
1717 | sfcevp,grdflx,acsnow,acsnom, & |
---|
1718 | smfr3d,keepfr3dflag, & |
---|
1719 | myj, & |
---|
1720 | ids,ide, jds,jde, kds,kde, & |
---|
1721 | ims,ime, jms,jme, kms,kme, & |
---|
1722 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
1723 | |
---|
1724 | IF ( FRACTIONAL_SEAICE == 1 ) THEN |
---|
1725 | ! LSMRUC Returns full land/ice values, no fractional values. |
---|
1726 | ! We return to a fractional component here. |
---|
1727 | DO j=j_start(ij),j_end(ij) |
---|
1728 | DO i=i_start(ij),i_end(ij) |
---|
1729 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
1730 | albedo(i,j) = ( albedo(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * 0.08 ) |
---|
1731 | emiss(i,j) = ( emiss(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * 0.98 ) |
---|
1732 | ENDIF |
---|
1733 | ENDDO |
---|
1734 | ENDDO |
---|
1735 | if ( isisfc ) then |
---|
1736 | ! |
---|
1737 | ! back to ice and ocean average |
---|
1738 | ! |
---|
1739 | DO j=j_start(ij),j_end(ij) |
---|
1740 | DO i=i_start(ij),i_end(ij) |
---|
1741 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
1742 | flhc(i,j) = ( flhc(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * flhc_sea(i,j) ) |
---|
1743 | flqc(i,j) = ( flqc(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * flqc_sea(i,j) ) |
---|
1744 | cpm(i,j) = ( cpm(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * cpm_sea(i,j) ) |
---|
1745 | cqs2(i,j) = ( cqs2(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * cqs2_sea(i,j) ) |
---|
1746 | chs2(i,j) = ( chs2(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * chs2_sea(i,j) ) |
---|
1747 | chs(i,j) = ( chs(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * chs_sea(i,j) ) |
---|
1748 | qsfc(i,j) = ( qsfc(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * QSFC_SEA(i,j) ) |
---|
1749 | qgh(i,j) = ( qgh(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * qgh_sea(i,j) ) |
---|
1750 | hfx(i,j) = ( hfx(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * HFX_SEA(i,j) ) |
---|
1751 | qfx(i,j) = ( qfx(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * QFX_SEA(i,j) ) |
---|
1752 | lh(i,j) = ( lh(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * LH_SEA(i,j) ) |
---|
1753 | tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * TSK_SEA(i,j) ) |
---|
1754 | ENDIF |
---|
1755 | ENDDO |
---|
1756 | ENDDO |
---|
1757 | else |
---|
1758 | ! |
---|
1759 | ! tsk back to liquid and ice average |
---|
1760 | ! |
---|
1761 | DO j = j_start(ij) , j_end(ij) |
---|
1762 | DO i = i_start(ij) , i_end(ij) |
---|
1763 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
1764 | tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * TSK_SEA(i,j) ) |
---|
1765 | ENDIF |
---|
1766 | ENDDO |
---|
1767 | ENDDO |
---|
1768 | endif |
---|
1769 | ENDIF |
---|
1770 | |
---|
1771 | CALL SFCDIAGS_RUCLSM(HFX,QFX,TSK,QSFC,CHS2,CQS2,T2,TH2,Q2, & |
---|
1772 | T_PHY,QV_CURR,RHO,P8W, & |
---|
1773 | PSFC,CP,R_d,RCP, & |
---|
1774 | ids,ide, jds,jde, kds,kde, & |
---|
1775 | ims,ime, jms,jme, kms,kme, & |
---|
1776 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte ) |
---|
1777 | |
---|
1778 | |
---|
1779 | ELSE |
---|
1780 | CALL wrf_error_fatal('Lacking arguments for RUCLSM in surface driver') |
---|
1781 | ENDIF |
---|
1782 | |
---|
1783 | CASE (PXLSMSCHEME) |
---|
1784 | IF (PRESENT(qv_curr) .AND. PRESENT(qc_curr) .AND. & |
---|
1785 | PRESENT(emiss) .AND. PRESENT(t2) .AND. & |
---|
1786 | PRESENT(rainbl) .AND. & |
---|
1787 | .TRUE. ) THEN |
---|
1788 | IF ( FRACTIONAL_SEAICE == 1 ) THEN |
---|
1789 | |
---|
1790 | CALL WRF_ERROR_FATAL("PXLSM not adapted for FRACTIONAL_SEAICE=1 option") |
---|
1791 | |
---|
1792 | IF ( isisfc ) THEN |
---|
1793 | ! |
---|
1794 | ! use surface layer routine values from the ice portion of grid point |
---|
1795 | ! |
---|
1796 | ELSE |
---|
1797 | ! |
---|
1798 | ! don't have srfc layer routine values at this time, so just use what you have |
---|
1799 | ! use ice component of TSK |
---|
1800 | ! |
---|
1801 | CALL get_local_ice_tsk( ims, ime, jms, jme, & |
---|
1802 | i_start(ij), i_end(ij), & |
---|
1803 | j_start(ij), j_end(ij), & |
---|
1804 | itimestep, .false., tice2tsk_if2cold, & |
---|
1805 | XICE, XICE_THRESHOLD, & |
---|
1806 | SST, TSK, TSK_SEA, TSK_LOCAL ) |
---|
1807 | DO j = j_start(ij) , j_end(ij) |
---|
1808 | DO i=i_start(ij) , i_end(ij) |
---|
1809 | TSK(i,j) = TSK_LOCAL(i,j) |
---|
1810 | ENDDO |
---|
1811 | ENDDO |
---|
1812 | ENDIF |
---|
1813 | ENDIF |
---|
1814 | CALL wrf_debug(100,'in P-X LSM') |
---|
1815 | CALL PXLSM(u_phy, v_phy, dz8w, qv_curr, t_phy, th_phy, rho,& |
---|
1816 | psfc, gsw, glw, rainbl, emiss, & |
---|
1817 | ITIMESTEP, num_soil_layers, DT, anal_interval, & |
---|
1818 | xland, xice, albbck, albedo, snoalb, smois, tslb, & |
---|
1819 | mavail,T2, Q2, & |
---|
1820 | zs, dzs, psih, & |
---|
1821 | landusef,soilctop,soilcbot,vegfra, vegf_px, & |
---|
1822 | isltyp,ra,rs,lai,nlcat,nscat, & |
---|
1823 | hfx,qfx,lh,tsk,sst,znt,canwat, & |
---|
1824 | grdflx,shdmin,shdmax, & |
---|
1825 | snowc,pblh,rmol,ust,capg,dtbl, & |
---|
1826 | t2_ndg_old,t2_ndg_new,q2_ndg_old,q2_ndg_new, & |
---|
1827 | sn_ndg_old, sn_ndg_new, snow, snowh,snowncv, & |
---|
1828 | t2obs, q2obs, pxlsm_smois_init, pxlsm_soil_nudge, & |
---|
1829 | ids,ide, jds,jde, kds,kde, & |
---|
1830 | ims,ime, jms,jme, kms,kme, & |
---|
1831 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte) |
---|
1832 | IF ( FRACTIONAL_SEAICE == 1 ) THEN |
---|
1833 | IF ( isisfc ) THEN |
---|
1834 | ! |
---|
1835 | ! back to ice and ocean average |
---|
1836 | ! |
---|
1837 | DO j = j_start(ij) , j_end(ij) |
---|
1838 | DO i = i_start(ij) , i_end(ij) |
---|
1839 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
1840 | flhc(i,j) = ( flhc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * flhc_sea(i,j) ) |
---|
1841 | flqc(i,j) = ( flqc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * flqc_sea(i,j) ) |
---|
1842 | cpm(i,j) = ( cpm(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * cpm_sea(i,j) ) |
---|
1843 | cqs2(i,j) = ( cqs2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * cqs2_sea(i,j) ) |
---|
1844 | chs2(i,j) = ( chs2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * chs2_sea(i,j) ) |
---|
1845 | chs(i,j) = ( chs(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * chs_sea(i,j) ) |
---|
1846 | qsfc(i,j) = ( qsfc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * QSFC_SEA(i,j) ) |
---|
1847 | qgh(i,j) = ( qgh(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * QGH_SEA(i,j) ) |
---|
1848 | hfx(i,j) = ( hfx(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * HFX_SEA(i,j) ) |
---|
1849 | qfx(i,j) = ( qfx(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * QFX_SEA(i,j) ) |
---|
1850 | lh(i,j) = ( lh(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * LH_SEA(i,j) ) |
---|
1851 | tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * TSK_SEA(i,j) ) |
---|
1852 | psih(i,j) = ( psih(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * PSIH_SEA(i,j) ) |
---|
1853 | pblh(i,j) = ( pblh(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * PBLH_SEA(i,j) ) |
---|
1854 | rmol(i,j) = ( rmol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * RMOL_SEA(i,j) ) |
---|
1855 | ust(i,j) = ( ust(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * UST_SEA(i,j) ) |
---|
1856 | ENDIF |
---|
1857 | ENDDO |
---|
1858 | ENDDO |
---|
1859 | ELSE |
---|
1860 | ! |
---|
1861 | ! tsk back to liquid and ice average |
---|
1862 | ! |
---|
1863 | DO j=j_start(ij),j_end(ij) |
---|
1864 | DO i=i_start(ij),i_end(ij) |
---|
1865 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
1866 | tsk(i,j)=tsk(i,j)*XICE(i,j)+(1.0-XICE(i,j))*TSK_SEA(i,j) |
---|
1867 | ENDIF |
---|
1868 | ENDDO |
---|
1869 | ENDDO |
---|
1870 | ENDIF |
---|
1871 | ENDIF |
---|
1872 | DO j=j_start(ij),j_end(ij) |
---|
1873 | DO i=i_start(ij),i_end(ij) |
---|
1874 | CHKLOWQ(I,J)= 1.0 |
---|
1875 | TH2(I,J) = T2(I,J)*(1.E5/PSFC(I,J))**RCP |
---|
1876 | SFCEVP(I,J)= SFCEVP(I,J) + QFX(I,J)*DTBL |
---|
1877 | ENDDO |
---|
1878 | ENDDO |
---|
1879 | |
---|
1880 | ELSE |
---|
1881 | CALL wrf_error_fatal('Lacking arguments for P-X LSM in surface driver') |
---|
1882 | ENDIF |
---|
1883 | |
---|
1884 | CASE DEFAULT |
---|
1885 | |
---|
1886 | IF ( itimestep .eq. 1 ) THEN |
---|
1887 | WRITE( message , * ) & |
---|
1888 | 'No land surface physics option is used: sf_surface_physics = ', sf_surface_physics |
---|
1889 | CALL wrf_message ( message ) |
---|
1890 | ENDIF |
---|
1891 | |
---|
1892 | END SELECT sfc_select |
---|
1893 | |
---|
1894 | ENDDO |
---|
1895 | !$OMP END PARALLEL DO |
---|
1896 | |
---|
1897 | 430 CONTINUE |
---|
1898 | |
---|
1899 | #if ( EM_CORE==1) |
---|
1900 | IF (omlcall .EQ. 1) THEN |
---|
1901 | ! simple ocean mixed layer model based Pollard, Rhines and Thompson (1973) |
---|
1902 | CALL wrf_debug( 100, 'Call OCEANML' ) |
---|
1903 | !$OMP PARALLEL DO & |
---|
1904 | !$OMP PRIVATE ( ij ) |
---|
1905 | DO ij = 1 , num_tiles |
---|
1906 | CALL oceanml(tml,t0ml,hml,h0ml,huml,hvml,ust,u_phy,v_phy, & |
---|
1907 | tmoml,f,g,oml_gamma, & |
---|
1908 | xland,hfx,lh,tsk,gsw,glw,emiss, & |
---|
1909 | dtbl,STBOLT, & |
---|
1910 | ids,ide, jds,jde, kds,kde, & |
---|
1911 | ims,ime, jms,jme, kms,kme, & |
---|
1912 | i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte) |
---|
1913 | ENDDO |
---|
1914 | !$OMP END PARALLEL DO |
---|
1915 | ENDIF |
---|
1916 | #endif |
---|
1917 | |
---|
1918 | ! Reset RAINBL in mm (Accumulation between PBL calls) |
---|
1919 | |
---|
1920 | IF ( PRESENT( rainbl ) ) THEN |
---|
1921 | !$OMP PARALLEL DO & |
---|
1922 | !$OMP PRIVATE ( ij, i, j, k ) |
---|
1923 | DO ij = 1 , num_tiles |
---|
1924 | DO j=j_start(ij),j_end(ij) |
---|
1925 | DO i=i_start(ij),i_end(ij) |
---|
1926 | RAINBL(i,j) = 0. |
---|
1927 | ENDDO |
---|
1928 | ENDDO |
---|
1929 | ENDDO |
---|
1930 | !$OMP END PARALLEL DO |
---|
1931 | ENDIF |
---|
1932 | |
---|
1933 | IF( PRESENT(slope_rad).AND. radiation )THEN |
---|
1934 | ! topographic slope effects removed from SWDOWN and GSW here for output |
---|
1935 | IF (slope_rad .EQ. 1) THEN |
---|
1936 | |
---|
1937 | !$OMP PARALLEL DO & |
---|
1938 | !$OMP PRIVATE ( ij, i, j, k ) |
---|
1939 | DO ij = 1 , num_tiles |
---|
1940 | DO j=j_start(ij),j_end(ij) |
---|
1941 | DO i=i_start(ij),i_end(ij) |
---|
1942 | IF(SWNORM(I,J) .GT. 1.E-3)THEN ! daytime |
---|
1943 | SWSAVE = SWDOWN(i,j) |
---|
1944 | ! SWDOWN contains unaffected SWDOWN in output |
---|
1945 | SWDOWN(i,j) = SWNORM(i,j) |
---|
1946 | ! SWNORM contains slope-affected SWDOWN in output |
---|
1947 | SWNORM(i,j) = SWSAVE |
---|
1948 | GSW(i,j) = GSWSAVE(i,j) |
---|
1949 | ENDIF |
---|
1950 | ENDDO |
---|
1951 | ENDDO |
---|
1952 | ENDDO |
---|
1953 | !$OMP END PARALLEL DO |
---|
1954 | |
---|
1955 | ENDIF |
---|
1956 | ENDIF |
---|
1957 | |
---|
1958 | ENDIF |
---|
1959 | |
---|
1960 | END SUBROUTINE surface_driver |
---|
1961 | |
---|
1962 | !------------------------------------------------------------------------- |
---|
1963 | !------------------------------------------------------------------------- |
---|
1964 | |
---|
1965 | subroutine myjsfc_seaice_wrapper(ITIMESTEP,HT,DZ, & |
---|
1966 | & PMID,PINT,TH,T,QV,QC,U,V,Q2, & |
---|
1967 | & TSK,QSFC,THZ0,QZ0,UZ0,VZ0, & |
---|
1968 | & LOWLYR,XLAND,IVGTYP,ISURBAN,IZ0TLND, & |
---|
1969 | & TICE2TSK_IF2COLD, & ! Extra for wrapper |
---|
1970 | & XICE_THRESHOLD, & ! Extra for wrapper |
---|
1971 | & XICE,SST, & ! Extra for wrapper |
---|
1972 | & CHS_SEA, CHS2_SEA, CQS2_SEA, CPM_SEA, & ! Extra for wrapper |
---|
1973 | & FLHC_SEA, FLQC_SEA, QSFC_SEA, & ! Extra for wrapper |
---|
1974 | & QGH_SEA, QZ0_SEA, HFX_SEA, QFX_SEA, & ! Extra for wrapper |
---|
1975 | & FLX_LH_SEA, TSK_SEA, & ! Extra for wrapper |
---|
1976 | & USTAR,ZNT,Z0BASE,PBLH,MAVAIL,RMOL, & |
---|
1977 | & AKHS,AKMS, & |
---|
1978 | & BR, & |
---|
1979 | & CHS,CHS2,CQS2,HFX,QFX,FLX_LH,FLHC,FLQC, & |
---|
1980 | & QGH,CPM,CT, & |
---|
1981 | & U10,V10,T02,TH02,TSHLTR,TH10,Q02,QSHLTR,Q10,PSHLTR, & |
---|
1982 | & P1000, & |
---|
1983 | & IDS,IDE,JDS,JDE,KDS,KDE, & |
---|
1984 | & IMS,IME,JMS,JME,KMS,KME, & |
---|
1985 | & ITS,ITE,JTS,JTE,KTS,KTE ) |
---|
1986 | ! USE module_model_constants |
---|
1987 | USE module_sf_myjsfc |
---|
1988 | |
---|
1989 | IMPLICIT NONE |
---|
1990 | |
---|
1991 | INTEGER, INTENT(IN) :: ITIMESTEP |
---|
1992 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: HT |
---|
1993 | REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: DZ |
---|
1994 | REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: PMID |
---|
1995 | REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: PINT |
---|
1996 | REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: TH |
---|
1997 | REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: T |
---|
1998 | REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: QV |
---|
1999 | REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: QC |
---|
2000 | REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: U |
---|
2001 | REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: V |
---|
2002 | REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: Q2 ! Q2 is TKE? |
---|
2003 | |
---|
2004 | ! REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: TSK |
---|
2005 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: TSK |
---|
2006 | |
---|
2007 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: QSFC |
---|
2008 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: THZ0 |
---|
2009 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: QZ0 |
---|
2010 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: UZ0 |
---|
2011 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: VZ0 |
---|
2012 | INTEGER,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: LOWLYR |
---|
2013 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: XLAND |
---|
2014 | INTEGER,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: IVGTYP |
---|
2015 | INTEGER :: ISURBAN |
---|
2016 | INTEGER :: IZ0TLND |
---|
2017 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: XICE ! Extra for wrapper |
---|
2018 | ! REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: SST ! Extra for wrapper |
---|
2019 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: SST ! Extra for wrapper |
---|
2020 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: BR |
---|
2021 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CHS_SEA ! Extra for wrapper |
---|
2022 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CHS2_SEA ! Extra for wrapper |
---|
2023 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CQS2_SEA ! Extra for wrapper |
---|
2024 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CPM_SEA ! Extra for wrapper |
---|
2025 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QZ0_SEA ! Extra for wrapper |
---|
2026 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QSFC_SEA ! Extra for wrapper |
---|
2027 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QGH_SEA ! Extra for wrapper |
---|
2028 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: FLHC_SEA ! Extra for wrapper |
---|
2029 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: FLQC_SEA ! Extra for wrapper |
---|
2030 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HFX_SEA ! Extra for wrapper |
---|
2031 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QFX_SEA ! Extra for wrapper |
---|
2032 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: FLX_LH_SEA ! Extra for wrapper |
---|
2033 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: TSK_SEA ! Extra for wrapper |
---|
2034 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: USTAR |
---|
2035 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: ZNT |
---|
2036 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: Z0BASE |
---|
2037 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: PBLH |
---|
2038 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: MAVAIL |
---|
2039 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: RMOL |
---|
2040 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: AKHS |
---|
2041 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: AKMS |
---|
2042 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CHS |
---|
2043 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CHS2 |
---|
2044 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CQS2 |
---|
2045 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HFX |
---|
2046 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QFX |
---|
2047 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: FLX_LH |
---|
2048 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: FLHC |
---|
2049 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: FLQC |
---|
2050 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QGH |
---|
2051 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CPM |
---|
2052 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CT |
---|
2053 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: U10 |
---|
2054 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: V10 |
---|
2055 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: T02 |
---|
2056 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: TH02 |
---|
2057 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: TSHLTR |
---|
2058 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: TH10 |
---|
2059 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: Q02 |
---|
2060 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QSHLTR |
---|
2061 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: Q10 |
---|
2062 | REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: PSHLTR |
---|
2063 | REAL, INTENT(IN) :: P1000 |
---|
2064 | REAL, INTENT(IN) :: XICE_THRESHOLD |
---|
2065 | LOGICAL, INTENT(IN) :: TICE2TSK_IF2COLD |
---|
2066 | INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE, & |
---|
2067 | & IMS,IME,JMS,JME,KMS,KME, & |
---|
2068 | & ITS,ITE,JTS,JTE,KTS,KTE |
---|
2069 | |
---|
2070 | |
---|
2071 | ! Local |
---|
2072 | INTEGER :: i |
---|
2073 | INTEGER :: j |
---|
2074 | REAL, DIMENSION( ims:ime, jms:jme ) :: ct_sea |
---|
2075 | REAL, DIMENSION( ims:ime, jms:jme ) :: u10_sea |
---|
2076 | REAL, DIMENSION( ims:ime, jms:jme ) :: v10_sea |
---|
2077 | REAL, DIMENSION( ims:ime, jms:jme ) :: t02_sea |
---|
2078 | REAL, DIMENSION( ims:ime, jms:jme ) :: th02_sea |
---|
2079 | REAL, DIMENSION( ims:ime, jms:jme ) :: tshltr_sea |
---|
2080 | REAL, DIMENSION( ims:ime, jms:jme ) :: pshltr_sea |
---|
2081 | REAL, DIMENSION( ims:ime, jms:jme ) :: qshltr_sea |
---|
2082 | REAL, DIMENSION( ims:ime, jms:jme ) :: th10_sea |
---|
2083 | REAL, DIMENSION( ims:ime, jms:jme ) :: q02_sea |
---|
2084 | REAL, DIMENSION( ims:ime, jms:jme ) :: q10_sea |
---|
2085 | REAL, DIMENSION( ims:ime, jms:jme ) :: thz0_sea |
---|
2086 | REAL, DIMENSION( ims:ime, jms:jme ) :: uz0_sea |
---|
2087 | REAL, DIMENSION( ims:ime, jms:jme ) :: vz0_sea |
---|
2088 | REAL, DIMENSION( ims:ime, jms:jme ) :: ustar_sea |
---|
2089 | REAL, DIMENSION( ims:ime, jms:jme ) :: pblh_sea |
---|
2090 | REAL, DIMENSION( ims:ime, jms:jme ) :: rmol_sea |
---|
2091 | REAL, DIMENSION( ims:ime, jms:jme ) :: akhs_sea |
---|
2092 | REAL, DIMENSION( ims:ime, jms:jme ) :: akms_sea |
---|
2093 | REAL, DIMENSION( ims:ime, jms:jme ) :: xland_sea |
---|
2094 | REAL, DIMENSION( ims:ime, jms:jme ) :: mavail_sea |
---|
2095 | REAL, DIMENSION( ims:ime, jms:jme ) :: znt_sea |
---|
2096 | REAL, DIMENSION( ims:ime, jms:jme ) :: z0base_sea |
---|
2097 | REAL, DIMENSION( ims:ime, jms:jme ) :: br_sea |
---|
2098 | |
---|
2099 | REAL, DIMENSION( ims:ime, jms:jme ) :: QSFC_HOLD |
---|
2100 | REAL, DIMENSION( ims:ime, jms:jme ) :: QZ0_HOLD |
---|
2101 | REAL, DIMENSION( ims:ime, jms:jme ) :: THZ0_HOLD |
---|
2102 | REAL, DIMENSION( ims:ime, jms:jme ) :: UZ0_HOLD |
---|
2103 | REAL, DIMENSION( ims:ime, jms:jme ) :: VZ0_HOLD |
---|
2104 | REAL, DIMENSION( ims:ime, jms:jme ) :: USTAR_HOLD |
---|
2105 | REAL, DIMENSION( ims:ime, jms:jme ) :: ZNT_HOLD |
---|
2106 | REAL, DIMENSION( ims:ime, jms:jme ) :: PBLH_HOLD |
---|
2107 | REAL, DIMENSION( ims:ime, jms:jme ) :: RMOL_HOLD |
---|
2108 | REAL, DIMENSION( ims:ime, jms:jme ) :: AKHS_HOLD |
---|
2109 | REAL, DIMENSION( ims:ime, jms:jme ) :: AKMS_HOLD |
---|
2110 | REAL, DIMENSION( ims:ime, jms:jme ) :: TSK_LOCAL |
---|
2111 | REAL :: PSFC |
---|
2112 | |
---|
2113 | ! Set things up for the frozen-surface call to myjsfc |
---|
2114 | ! Is SST local here, or are the changes to be fed back to the calling routines? |
---|
2115 | |
---|
2116 | ! We want a TSK valid for the ice-covered regions of the grid cell. |
---|
2117 | |
---|
2118 | CALL get_local_ice_tsk( ims, ime, jms, jme, its, ite, jts, jte, & |
---|
2119 | itimestep, .true., tice2tsk_if2cold, & |
---|
2120 | XICE, XICE_THRESHOLD, & |
---|
2121 | SST, TSK, TSK_SEA, TSK_LOCAL ) |
---|
2122 | DO j = JTS , JTE |
---|
2123 | DO i = ITS , ITE |
---|
2124 | TSK(i,j) = TSK_LOCAL(i,j) |
---|
2125 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
2126 | |
---|
2127 | ! Over fractional sea-ice points, back out an ice portion of QSFC as well. |
---|
2128 | ! QSFC_SEA calculation as done in myjsfc for open water points |
---|
2129 | PSFC = PINT(I,LOWLYR(I,J),J) |
---|
2130 | QSFC_SEA(i,j) = PQ0SEA/PSFC*EXP(A2S*(TSK(i,j)-A3S)/(TSK(i,j)-A4S)) |
---|
2131 | QSFC(i,j) = QSFC(i,j) - (1.0-XICE(i,j)) * QSFC_SEA(i,j) / XICE(i,j) |
---|
2132 | ! |
---|
2133 | HFX_SEA(i,j) = HFX(i,j) |
---|
2134 | QFX_SEA(i,j) = QFX(i,j) |
---|
2135 | FLX_LH_SEA(i,j) = FLX_LH(i,j) |
---|
2136 | ENDIF |
---|
2137 | ENDDO |
---|
2138 | ENDDO |
---|
2139 | |
---|
2140 | ! |
---|
2141 | ! frozen ocean call for sea ice points |
---|
2142 | ! |
---|
2143 | |
---|
2144 | ! Strictly INTENT(IN) to MYJSFC, should be unchanged by call. |
---|
2145 | |
---|
2146 | ! DZ |
---|
2147 | ! HT |
---|
2148 | ! LOWLYR |
---|
2149 | ! MAVAIL |
---|
2150 | ! PINT |
---|
2151 | ! PMID |
---|
2152 | ! QC |
---|
2153 | ! QV |
---|
2154 | ! Q2 |
---|
2155 | ! T |
---|
2156 | ! TH |
---|
2157 | ! TSK |
---|
2158 | ! U |
---|
2159 | ! V |
---|
2160 | ! XLAND |
---|
2161 | ! Z0BASE |
---|
2162 | |
---|
2163 | ! INTENT (INOUT), updated by MYJSFC. Values will need to be saved before the first call to MYJSFC, so that |
---|
2164 | ! the second call to MYJSFC does not double-count the effect. |
---|
2165 | |
---|
2166 | ! Save INTENT(INOUT) variables before the frozen-water/true-land call to MYJSFC: |
---|
2167 | QSFC_HOLD = QSFC |
---|
2168 | QZ0_HOLD = QZ0 |
---|
2169 | THZ0_HOLD = THZ0 |
---|
2170 | UZ0_HOLD = UZ0 |
---|
2171 | VZ0_HOLD = VZ0 |
---|
2172 | USTAR_HOLD = USTAR |
---|
2173 | ZNT_HOLD = ZNT |
---|
2174 | PBLH_HOLD = PBLH |
---|
2175 | RMOL_HOLD = RMOL |
---|
2176 | AKHS_HOLD = AKHS |
---|
2177 | AKMS_HOLD = AKMS |
---|
2178 | |
---|
2179 | ! Strictly INTENT(OUT): Set by MYJSFC |
---|
2180 | |
---|
2181 | ! CHS |
---|
2182 | ! CHS2 |
---|
2183 | ! CPM |
---|
2184 | ! CQS2 |
---|
2185 | ! CT |
---|
2186 | ! FLHC |
---|
2187 | ! FLQC |
---|
2188 | ! FLX_LH |
---|
2189 | ! HFX |
---|
2190 | ! PSHLTR |
---|
2191 | ! QFX |
---|
2192 | ! QGH |
---|
2193 | ! QSHLTR |
---|
2194 | ! Q02 |
---|
2195 | ! Q10 |
---|
2196 | ! TH02 |
---|
2197 | ! TH10 |
---|
2198 | ! TSHLTR |
---|
2199 | ! T02 |
---|
2200 | ! U10 |
---|
2201 | ! V10 |
---|
2202 | |
---|
2203 | ! Frozen-water/true-land call. |
---|
2204 | CALL MYJSFC ( ITIMESTEP, HT, DZ, & ! I,I,I, |
---|
2205 | & PMID, PINT, TH, T, QV, QC, U, V, Q2, & ! I,I,I,I,I,I,I,I,I, |
---|
2206 | & TSK, QSFC, THZ0, QZ0, UZ0, VZ0, & ! I,IO,IO,IO,IO,IO, |
---|
2207 | & LOWLYR, XLAND, IVGTYP, ISURBAN, IZ0TLND, & ! I,I,I,I,I |
---|
2208 | & USTAR, ZNT, Z0BASE, PBLH, MAVAIL, RMOL, & ! IO,IO,I,IO,I,IO, |
---|
2209 | & AKHS, AKMS, & ! IO,IO, |
---|
2210 | & BR, & ! O |
---|
2211 | & CHS, CHS2, CQS2, HFX, QFX, FLX_LH, FLHC, FLQC, & ! O,O,O,0,0,0,0,0, |
---|
2212 | & QGH, CPM, CT, U10, V10, T02, & ! 0,0,0,0,0,0, |
---|
2213 | & TH02, TSHLTR, TH10, Q02, & ! 0,0,0,0, |
---|
2214 | & QSHLTR, Q10, PSHLTR, & ! 0,0,0, |
---|
2215 | & P1000, & ! I |
---|
2216 | & ids,ide, jds,jde, kds,kde, & |
---|
2217 | & ims,ime, jms,jme, kms,kme, & |
---|
2218 | & its,ite, jts,jte, kts,kte ) |
---|
2219 | |
---|
2220 | ! Set up things for the open ocean call. |
---|
2221 | DO j = JTS, JTE |
---|
2222 | DO i = ITS, ITE |
---|
2223 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
2224 | XLAND_SEA(i,j)=2. |
---|
2225 | MAVAIL_SEA(I,J) = 1. |
---|
2226 | ZNT_SEA(I,J) = 0.0001 |
---|
2227 | Z0BASE_SEA(I,J) = ZNT_SEA(I,J) |
---|
2228 | IF ( SST(i,j) .LT. 271.4 ) THEN |
---|
2229 | SST(i,j) = 271.4 |
---|
2230 | ENDIF |
---|
2231 | TSK_SEA(i,j) = SST(i,j) |
---|
2232 | PSFC = PINT(I,LOWLYR(I,J),J) |
---|
2233 | QSFC_SEA(I,J) = PQ0SEA/PSFC*EXP(A2S*(TSK_SEA(i,j)-A3S)/(TSK_SEA(i,j)-A4S)) |
---|
2234 | ELSE |
---|
2235 | ! This should be a land point or a true open water point |
---|
2236 | XLAND_SEA(i,j)=xland(i,j) |
---|
2237 | MAVAIL_SEA(i,j) = mavail(i,j) |
---|
2238 | ZNT_SEA(I,J) = ZNT_HOLD(I,J) |
---|
2239 | Z0BASE_SEA(I,J) = Z0BASE(I,J) |
---|
2240 | TSK_SEA(i,j) = TSK(i,j) |
---|
2241 | QSFC_SEA(i,j) = QSFC_HOLD(i,j) |
---|
2242 | ENDIF |
---|
2243 | ENDDO |
---|
2244 | ENDDO |
---|
2245 | |
---|
2246 | QZ0_SEA = QZ0_HOLD |
---|
2247 | THZ0_SEA = THZ0_HOLD |
---|
2248 | UZ0_SEA = UZ0_HOLD |
---|
2249 | VZ0_SEA = VZ0_HOLD |
---|
2250 | USTAR_SEA = USTAR_HOLD |
---|
2251 | PBLH_SEA = PBLH_HOLD |
---|
2252 | RMOL_SEA = RMOL_HOLD |
---|
2253 | AKHS_SEA = AKHS_HOLD |
---|
2254 | AKMS_SEA = AKMS_HOLD |
---|
2255 | |
---|
2256 | ! |
---|
2257 | ! open water call |
---|
2258 | ! |
---|
2259 | CALL MYJSFC ( ITIMESTEP, HT, DZ, & ! I,I,I, |
---|
2260 | & PMID, PINT, TH, T, QV, QC, U, V, Q2, & ! I,I,I,I,I,I,I,I,I, |
---|
2261 | & TSK_SEA, QSFC_SEA, THZ0_SEA, QZ0_SEA, UZ0_SEA, VZ0_SEA, & ! I,IO,IO,IO,IO,IO, |
---|
2262 | & LOWLYR, XLAND_SEA, IVGTYP, ISURBAN, IZ0TLND, & ! I,I,I,I,I, |
---|
2263 | & USTAR_SEA, ZNT_SEA, Z0BASE_SEA, PBLH_SEA, MAVAIL_SEA, RMOL_SEA, & ! IO,IO,I,IO,I,IO, |
---|
2264 | & AKHS_SEA, AKMS_SEA, & ! IO,IO, |
---|
2265 | & BR_SEA, & ! dummy space holder |
---|
2266 | & CHS_SEA, CHS2_SEA, CQS2_SEA, HFX_SEA, QFX_SEA, FLX_LH_SEA, FLHC_SEA, & ! 0,0,0,0,0,0,0, |
---|
2267 | & FLQC_SEA, QGH_SEA, CPM_SEA, CT_SEA, U10_SEA, V10_SEA, T02_SEA, TH02_SEA, & ! 0,0,0,0,0,0,0,0, |
---|
2268 | & TSHLTR_SEA, TH10_SEA, Q02_SEA, QSHLTR_SEA, Q10_SEA, PSHLTR_SEA, & ! 0,0,0,0,0,0, |
---|
2269 | & p1000, & ! I |
---|
2270 | & ids,ide, jds,jde, kds,kde, & |
---|
2271 | & ims,ime, jms,jme, kms,kme, & |
---|
2272 | & its,ite, jts,jte, kts,kte ) |
---|
2273 | |
---|
2274 | ! |
---|
2275 | ! Scale the appropriate terms between open-water values and ice-covered values |
---|
2276 | ! |
---|
2277 | |
---|
2278 | DO j = JTS, JTE |
---|
2279 | DO i = ITS, ITE |
---|
2280 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
2281 | ! Over sea-ice points, blend the results. |
---|
2282 | |
---|
2283 | ! INTENT(OUT) from MYJSFC |
---|
2284 | ! CHS wait |
---|
2285 | ! CHS2 wait |
---|
2286 | ! CPM wait |
---|
2287 | ! CQS2 wait |
---|
2288 | CT(i,j) = CT(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * CT_SEA (i,j) |
---|
2289 | ! FLHC(i,j) = FLHC(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * FLHC_SEA (i,j) |
---|
2290 | ! FLQC(i,j) = FLQC(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * FLQC_SEA (i,j) |
---|
2291 | ! FLX_LH wait |
---|
2292 | ! HFX wait |
---|
2293 | PSHLTR(i,j) = PSHLTR(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * PSHLTR_SEA(i,j) |
---|
2294 | ! QFX wait |
---|
2295 | ! QGH wait |
---|
2296 | QSHLTR(i,j) = QSHLTR(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * QSHLTR_SEA(i,j) |
---|
2297 | Q02(i,j) = Q02(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * Q02_SEA(i,j) |
---|
2298 | Q10(i,j) = Q10(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * Q10_SEA(i,j) |
---|
2299 | TH02(i,j) = TH02(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * TH02_SEA(i,j) |
---|
2300 | TH10(i,j) = TH10(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * TH10_SEA(i,j) |
---|
2301 | TSHLTR(i,j) = TSHLTR(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * TSHLTR_SEA(i,j) |
---|
2302 | T02(i,j) = T02(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * T02_SEA(i,j) |
---|
2303 | U10(i,j) = U10(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * U10_SEA(i,j) |
---|
2304 | V10(i,j) = V10(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * V10_SEA(i,j) |
---|
2305 | |
---|
2306 | ! INTENT(INOUT): updated by MYJSFC |
---|
2307 | ! QSFC: wait |
---|
2308 | THZ0(i,j) = THZ0(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * THZ0_SEA(i,j) |
---|
2309 | ! qz0 wait |
---|
2310 | UZ0(i,j) = UZ0(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * UZ0_SEA(i,j) |
---|
2311 | VZ0(i,j) = VZ0(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * VZ0_SEA(i,j) |
---|
2312 | USTAR(i,j) = USTAR(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * USTAR_SEA(i,j) |
---|
2313 | ! ZNT wait |
---|
2314 | PBLH(i,j) = PBLH(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * PBLH_SEA(i,j) |
---|
2315 | RMOL(i,j) = RMOL(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * RMOL_SEA(i,j) |
---|
2316 | AKHS(i,j) = AKHS(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * AKHS_SEA(i,j) |
---|
2317 | AKMS(i,j) = AKMS(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * AKMS_SEA(i,j) |
---|
2318 | |
---|
2319 | ! tsk(i,j) = tsk(i,j)*XICE(i,j) + (1.0-XICE(i,j))*TSK_SEA(i,j) |
---|
2320 | ELSE |
---|
2321 | ! We're not over sea ice. Take the results from the first call. |
---|
2322 | ENDIF |
---|
2323 | ENDDO |
---|
2324 | ENDDO |
---|
2325 | |
---|
2326 | END SUBROUTINE myjsfc_seaice_wrapper |
---|
2327 | |
---|
2328 | !------------------------------------------------------------------------- |
---|
2329 | !------------------------------------------------------------------------- |
---|
2330 | |
---|
2331 | SUBROUTINE sf_gfs_seaice_wrapper(U3D,V3D,T3D,QV3D,P3D, & |
---|
2332 | CP,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, & |
---|
2333 | ZNT,UST,PSIM,PSIH, & |
---|
2334 | XLAND,HFX,QFX,LH,TSK,FLHC,FLQC, & |
---|
2335 | QGH,QSFC,U10,V10, & |
---|
2336 | GZ1OZ0,WSPD,BR,ISFFLX, & |
---|
2337 | EP1,EP2,KARMAN,itimestep, & |
---|
2338 | TICE2TSK_IF2COLD, & |
---|
2339 | XICE_THRESHOLD, & |
---|
2340 | CHS_SEA, CHS2_SEA, CPM_SEA, CQS2_SEA, & |
---|
2341 | FLHC_SEA, FLQC_SEA, & |
---|
2342 | HFX_SEA, LH_SEA, QFX_SEA, QGH_SEA, QSFC_SEA,& |
---|
2343 | UST_SEA, ZNT_SEA, SST, XICE, & |
---|
2344 | ids,ide, jds,jde, kds,kde, & |
---|
2345 | ims,ime, jms,jme, kms,kme, & |
---|
2346 | its,ite, jts,jte, kts,kte ) |
---|
2347 | USE module_sf_gfs |
---|
2348 | implicit none |
---|
2349 | |
---|
2350 | INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, & |
---|
2351 | ims,ime, jms,jme, kms,kme, & |
---|
2352 | its,ite, jts,jte, kts,kte, & |
---|
2353 | ISFFLX,itimestep |
---|
2354 | |
---|
2355 | REAL, INTENT(IN) :: & |
---|
2356 | CP, & |
---|
2357 | EP1, & |
---|
2358 | EP2, & |
---|
2359 | KARMAN, & |
---|
2360 | R, & |
---|
2361 | ROVCP, & |
---|
2362 | XLV |
---|
2363 | |
---|
2364 | REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: & |
---|
2365 | P3D, & |
---|
2366 | QV3D, & |
---|
2367 | T3D, & |
---|
2368 | U3D, & |
---|
2369 | V3D |
---|
2370 | |
---|
2371 | REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: & |
---|
2372 | TSK, & |
---|
2373 | PSFC, & |
---|
2374 | XLAND |
---|
2375 | |
---|
2376 | REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: & |
---|
2377 | UST, & |
---|
2378 | ZNT |
---|
2379 | |
---|
2380 | REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: & |
---|
2381 | BR, & |
---|
2382 | CHS, & |
---|
2383 | CHS2, & |
---|
2384 | CPM, & |
---|
2385 | CQS2, & |
---|
2386 | FLHC, & |
---|
2387 | FLQC, & |
---|
2388 | GZ1OZ0, & |
---|
2389 | HFX, & |
---|
2390 | LH, & |
---|
2391 | PSIM, & |
---|
2392 | PSIH, & |
---|
2393 | QFX, & |
---|
2394 | QGH, & |
---|
2395 | QSFC, & |
---|
2396 | U10, & |
---|
2397 | V10, & |
---|
2398 | WSPD |
---|
2399 | |
---|
2400 | REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: & |
---|
2401 | XICE |
---|
2402 | REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: & |
---|
2403 | CHS_SEA, & |
---|
2404 | CHS2_SEA, & |
---|
2405 | CPM_SEA, & |
---|
2406 | CQS2_SEA, & |
---|
2407 | FLHC_SEA, & |
---|
2408 | FLQC_SEA, & |
---|
2409 | HFX_SEA, & |
---|
2410 | LH_SEA, & |
---|
2411 | QFX_SEA, & |
---|
2412 | QGH_SEA, & |
---|
2413 | QSFC_SEA, & |
---|
2414 | UST_SEA, & |
---|
2415 | ZNT_SEA |
---|
2416 | REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: & |
---|
2417 | SST |
---|
2418 | |
---|
2419 | REAL, INTENT(IN) :: & |
---|
2420 | XICE_THRESHOLD |
---|
2421 | LOGICAL, INTENT(IN) :: TICE2TSK_IF2COLD |
---|
2422 | |
---|
2423 | !------------------------------------------------------------------------- |
---|
2424 | ! Local |
---|
2425 | !------------------------------------------------------------------------- |
---|
2426 | INTEGER :: I |
---|
2427 | INTEGER :: J |
---|
2428 | REAL, DIMENSION(ims:ime, jms:jme) :: & |
---|
2429 | BR_SEA, & |
---|
2430 | GZ1OZ0_SEA, & |
---|
2431 | PSIM_SEA, & |
---|
2432 | PSIH_SEA, & |
---|
2433 | U10_SEA, & |
---|
2434 | V10_SEA, & |
---|
2435 | WSPD_SEA, & |
---|
2436 | XLAND_SEA, & |
---|
2437 | TSK_SEA, & |
---|
2438 | UST_HOLD, & |
---|
2439 | ZNT_HOLD, & |
---|
2440 | TSK_LOCAL |
---|
2441 | |
---|
2442 | CALL get_local_ice_tsk( ims, ime, jms, jme, its, ite, jts, jte, & |
---|
2443 | itimestep, .true., tice2tsk_if2cold, & |
---|
2444 | XICE, XICE_THRESHOLD, & |
---|
2445 | SST, TSK, TSK_SEA, TSK_LOCAL ) |
---|
2446 | |
---|
2447 | ! |
---|
2448 | ! Set up for frozen ocean call for sea ice points |
---|
2449 | ! |
---|
2450 | |
---|
2451 | ! Strictly INTENT(IN), Should be unchanged by SF_GFS: |
---|
2452 | ! CP |
---|
2453 | ! EP1 |
---|
2454 | ! EP2 |
---|
2455 | ! KARMAN |
---|
2456 | ! R |
---|
2457 | ! ROVCP |
---|
2458 | ! XLV |
---|
2459 | ! P3D |
---|
2460 | ! QV3D |
---|
2461 | ! T3D |
---|
2462 | ! U3D |
---|
2463 | ! V3D |
---|
2464 | ! TSK |
---|
2465 | ! PSFC |
---|
2466 | ! XLAND |
---|
2467 | ! ISFFLX |
---|
2468 | ! ITIMESTEP |
---|
2469 | |
---|
2470 | |
---|
2471 | ! Intent (INOUT), original value is used and changed by SF_GFS. |
---|
2472 | ! UST |
---|
2473 | ! ZNT |
---|
2474 | |
---|
2475 | ZNT_HOLD = ZNT |
---|
2476 | UST_HOLD = UST |
---|
2477 | |
---|
2478 | ! Strictly INTENT (OUT), set by SF_GFS: |
---|
2479 | ! BR |
---|
2480 | ! CHS -- used by LSM routines |
---|
2481 | ! CHS2 -- used by LSM routines |
---|
2482 | ! CPM -- used by LSM routines |
---|
2483 | ! CQS2 -- used by LSM routines |
---|
2484 | ! FLHC |
---|
2485 | ! FLQC |
---|
2486 | ! GZ1OZ0 |
---|
2487 | ! HFX -- used by LSM routines |
---|
2488 | ! LH -- used by LSM routines |
---|
2489 | ! PSIM |
---|
2490 | ! PSIH |
---|
2491 | ! QFX -- used by LSM routines |
---|
2492 | ! QGH -- used by LSM routines |
---|
2493 | ! QSFC -- used by LSM routines |
---|
2494 | ! U10 |
---|
2495 | ! V10 |
---|
2496 | ! WSPD |
---|
2497 | |
---|
2498 | ! |
---|
2499 | ! Frozen ocean / true land call. |
---|
2500 | ! |
---|
2501 | CALL SF_GFS(U3D,V3D,T3D,QV3D,P3D, & |
---|
2502 | CP,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM_SEA, & |
---|
2503 | ZNT,UST,PSIM,PSIH, & |
---|
2504 | XLAND,HFX,QFX,LH,TSK_LOCAL,FLHC,FLQC, & |
---|
2505 | QGH,QSFC,U10,V10, & |
---|
2506 | GZ1OZ0,WSPD,BR,ISFFLX, & |
---|
2507 | EP1,EP2,KARMAN,ITIMESTEP, & |
---|
2508 | ids,ide, jds,jde, kds,kde, & |
---|
2509 | ims,ime, jms,jme, kms,kme, & |
---|
2510 | its,ite, jts,jte, kts,kte ) |
---|
2511 | |
---|
2512 | ! Set up for open-water call |
---|
2513 | |
---|
2514 | DO j = JTS , JTE |
---|
2515 | DO i = ITS , ITE |
---|
2516 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
2517 | ! Sets up things for open ocean fraction of sea-ice points |
---|
2518 | XLAND_SEA(i,j)=2. |
---|
2519 | ZNT_SEA(I,J) = 0.0001 |
---|
2520 | IF ( SST(i,j) .LT. 271.4 ) THEN |
---|
2521 | SST(i,j) = 271.4 |
---|
2522 | ENDIF |
---|
2523 | TSK_SEA(i,j) = SST(i,j) |
---|
2524 | ELSE |
---|
2525 | ! Fully open ocean or true land points |
---|
2526 | XLAND_SEA(i,j)=xland(i,j) |
---|
2527 | ZNT_SEA(I,J) = ZNT_HOLD(I,J) |
---|
2528 | UST_SEA(i,j) = UST_HOLD(i,j) |
---|
2529 | TSK_SEA(i,j) = TSK(i,j) |
---|
2530 | ENDIF |
---|
2531 | ENDDO |
---|
2532 | ENDDO |
---|
2533 | |
---|
2534 | ! Open-water call |
---|
2535 | ! _SEA variables are held for later use as the result of the open-water call. |
---|
2536 | CALL SF_GFS(U3D,V3D,T3D,QV3D,P3D, & |
---|
2537 | CP,ROVCP,R,XLV,PSFC,CHS_SEA,CHS2_SEA,CQS2_SEA,CPM, & |
---|
2538 | ZNT_SEA,UST_SEA,PSIM_SEA,PSIH_SEA, & |
---|
2539 | XLAND,HFX_SEA,QFX_SEA,LH_SEA,TSK_SEA,FLHC_SEA,FLQC_SEA, & |
---|
2540 | QGH_SEA,QSFC_SEA,U10_SEA,V10_SEA, & |
---|
2541 | GZ1OZ0_SEA,WSPD_SEA,BR_SEA,ISFFLX, & |
---|
2542 | EP1,EP2,KARMAN,ITIMESTEP, & |
---|
2543 | ids,ide, jds,jde, kds,kde, & |
---|
2544 | ims,ime, jms,jme, kms,kme, & |
---|
2545 | its,ite, jts,jte, kts,kte ) |
---|
2546 | |
---|
2547 | ! Weighting, after our two calls to SF_GFS |
---|
2548 | |
---|
2549 | DO j = JTS , JTE |
---|
2550 | DO i = ITS , ITE |
---|
2551 | ! Over sea-ice points, weight the results. Otherwise, just take the results from the |
---|
2552 | ! first call to SF_GFS_ |
---|
2553 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
2554 | ! Weight a number of fields (between open-water results |
---|
2555 | ! and full ice results) by sea-ice fraction. |
---|
2556 | |
---|
2557 | BR(i,j) = ( BR(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * BR_SEA(i,j) ) |
---|
2558 | ! CHS, used by the LSM routines, is not updated yet. Return results from both calls in separate variables |
---|
2559 | ! CHS2, used by the LSM routines, is not updated yet. Return results from both calls in separate variables |
---|
2560 | ! CPM, used by the LSM routines, is not updated yet. Return results from both calls in separate variables |
---|
2561 | ! CQS2, used by the LSM routines, is not updated yet. Return results from both calls in separate variables |
---|
2562 | ! FLHC(i,j) = ( FLHC(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * FLHC_SEA(i,j) ) |
---|
2563 | ! FLQC(i,j) = ( FLQC(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * FLQC_SEA(i,j) ) |
---|
2564 | GZ1OZ0(i,j) = ( GZ1OZ0(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * GZ1OZ0_SEA(i,j) ) |
---|
2565 | ! HFX, used by the LSM routines, is not updated yet. Return results from both calls in separate variables |
---|
2566 | ! LH, used by the LSM routines, is not updated yet. Return results from both calls in separate variables |
---|
2567 | PSIM(i,j) = ( PSIM(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * PSIM_SEA(i,j) ) |
---|
2568 | PSIH(i,j) = ( PSIH(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * PSIH_SEA(i,j) ) |
---|
2569 | ! QFX, used by the LSM routines, is not updated yet. Return results from both calls in separate variables |
---|
2570 | ! QGH, used by the LSM routines, is not updated yet. Return results from both calls in separate variables |
---|
2571 | ! QSFC, used by the LSM routines, is not updated yet. Return results from both calls in separate variables |
---|
2572 | U10(i,j) = ( U10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * U10_SEA(i,j) ) |
---|
2573 | V10(i,j) = ( V10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * V10_SEA(i,j) ) |
---|
2574 | WSPD(i,j) = ( WSPD(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * WSPD_SEA(i,j) ) |
---|
2575 | ! UST, used by the LSM routines, is not updated yet. Return results from both calls in separate variables |
---|
2576 | ! ZNT, used by the LSM routines, is not updated yet. Return results from both calls in separate variables |
---|
2577 | |
---|
2578 | ENDIF |
---|
2579 | ENDDO |
---|
2580 | ENDDO |
---|
2581 | |
---|
2582 | END SUBROUTINE sf_gfs_seaice_wrapper |
---|
2583 | |
---|
2584 | !------------------------------------------------------------------------- |
---|
2585 | !------------------------------------------------------------------------- |
---|
2586 | |
---|
2587 | SUBROUTINE sfclay_seaice_wrapper(U3D,V3D,T3D,QV3D,P3D,dz8w, & |
---|
2588 | CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, & |
---|
2589 | ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, & |
---|
2590 | XLAND,HFX,QFX,LH,TSK,FLHC,FLQC,QGH,QSFC,RMOL, & |
---|
2591 | U10,V10,TH2,T2,Q2, & |
---|
2592 | GZ1OZ0,WSPD,BR,ISFFLX,DX, & |
---|
2593 | SVP1,SVP2,SVP3,SVPT0,EP1,EP2, & |
---|
2594 | KARMAN,EOMEG,STBOLT, & |
---|
2595 | P1000, & |
---|
2596 | XICE,SST,TSK_SEA, & |
---|
2597 | CHS2_SEA,CHS_SEA,CPM_SEA,CQS2_SEA,FLHC_SEA,FLQC_SEA, & |
---|
2598 | HFX_SEA,LH_SEA,QFX_SEA,QGH_SEA,QSFC_SEA,ZNT_SEA, & |
---|
2599 | ITIMESTEP,TICE2TSK_IF2COLD,XICE_THRESHOLD, & |
---|
2600 | ids,ide, jds,jde, kds,kde, & |
---|
2601 | ims,ime, jms,jme, kms,kme, & |
---|
2602 | its,ite, jts,jte, kts,kte, & |
---|
2603 | ustm,ck,cka,cd,cda,isftcflx,iz0tlnd ) |
---|
2604 | USE module_sf_sfclay |
---|
2605 | implicit none |
---|
2606 | |
---|
2607 | INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, & |
---|
2608 | ims,ime, jms,jme, kms,kme, & |
---|
2609 | its,ite, jts,jte, kts,kte |
---|
2610 | |
---|
2611 | INTEGER, INTENT(IN ) :: ISFFLX |
---|
2612 | REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0 |
---|
2613 | REAL, INTENT(IN ) :: EP1,EP2,KARMAN,EOMEG,STBOLT |
---|
2614 | REAL, INTENT(IN ) :: P1000 |
---|
2615 | |
---|
2616 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , & |
---|
2617 | INTENT(IN ) :: dz8w |
---|
2618 | |
---|
2619 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , & |
---|
2620 | INTENT(IN ) :: QV3D, & |
---|
2621 | P3D, & |
---|
2622 | T3D |
---|
2623 | |
---|
2624 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
2625 | INTENT(IN ) :: MAVAIL, & |
---|
2626 | PBLH, & |
---|
2627 | XLAND, & |
---|
2628 | TSK |
---|
2629 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
2630 | INTENT(OUT ) :: U10, & |
---|
2631 | V10, & |
---|
2632 | TH2, & |
---|
2633 | T2, & |
---|
2634 | Q2, & |
---|
2635 | QSFC |
---|
2636 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
2637 | INTENT(INOUT) :: REGIME, & |
---|
2638 | HFX, & |
---|
2639 | QFX, & |
---|
2640 | LH, & |
---|
2641 | MOL,RMOL |
---|
2642 | |
---|
2643 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
2644 | INTENT(INOUT) :: GZ1OZ0,WSPD,BR, & |
---|
2645 | PSIM,PSIH |
---|
2646 | |
---|
2647 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , & |
---|
2648 | INTENT(IN ) :: U3D, & |
---|
2649 | V3D |
---|
2650 | |
---|
2651 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
2652 | INTENT(IN ) :: PSFC |
---|
2653 | |
---|
2654 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
2655 | INTENT(INOUT) :: ZNT, & |
---|
2656 | ZOL, & |
---|
2657 | UST, & |
---|
2658 | CPM, & |
---|
2659 | CHS2, & |
---|
2660 | CQS2, & |
---|
2661 | CHS |
---|
2662 | |
---|
2663 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
2664 | INTENT(INOUT) :: FLHC,FLQC |
---|
2665 | |
---|
2666 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
2667 | INTENT(INOUT) :: & |
---|
2668 | QGH |
---|
2669 | |
---|
2670 | REAL, INTENT(IN ) :: CP,G,ROVCP,R,XLV,DX |
---|
2671 | |
---|
2672 | REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
2673 | INTENT(OUT) :: ck,cka,cd,cda,ustm |
---|
2674 | |
---|
2675 | INTEGER, OPTIONAL, INTENT(IN ) :: ISFTCFLX,IZ0TLND |
---|
2676 | |
---|
2677 | !-------------------------------------------------------------------- |
---|
2678 | ! New for wrapper |
---|
2679 | !-------------------------------------------------------------------- |
---|
2680 | INTEGER, INTENT(IN) :: ITIMESTEP |
---|
2681 | LOGICAL, INTENT(IN) :: TICE2TSK_IF2COLD |
---|
2682 | REAL, INTENT(IN) :: XICE_THRESHOLD |
---|
2683 | REAL, DIMENSION( ims:ime, jms:jme ), & |
---|
2684 | INTENT(IN) :: XICE |
---|
2685 | REAL, DIMENSION( ims:ime, jms:jme ), & |
---|
2686 | INTENT(INOUT) :: SST |
---|
2687 | REAL, DIMENSION( ims:ime, jms:jme ), & |
---|
2688 | INTENT(OUT) :: TSK_SEA, & |
---|
2689 | CHS2_SEA, & |
---|
2690 | CHS_SEA, & |
---|
2691 | CPM_SEA, & |
---|
2692 | CQS2_SEA, & |
---|
2693 | FLHC_SEA, & |
---|
2694 | FLQC_SEA, & |
---|
2695 | HFX_SEA, & |
---|
2696 | LH_SEA, & |
---|
2697 | QFX_SEA, & |
---|
2698 | QGH_SEA, & |
---|
2699 | QSFC_SEA, & |
---|
2700 | ZNT_SEA |
---|
2701 | |
---|
2702 | !-------------------------------------------------------------------- |
---|
2703 | ! Local |
---|
2704 | !-------------------------------------------------------------------- |
---|
2705 | INTEGER :: I, J |
---|
2706 | REAL, DIMENSION( ims:ime, jms:jme ) :: XLAND_SEA, & |
---|
2707 | MAVAIL_sea, & |
---|
2708 | TSK_LOCAL, & |
---|
2709 | BR_HOLD, & |
---|
2710 | CHS2_HOLD, & |
---|
2711 | CHS_HOLD, & |
---|
2712 | CPM_HOLD, & |
---|
2713 | CQS2_HOLD, & |
---|
2714 | FLHC_HOLD, & |
---|
2715 | FLQC_HOLD, & |
---|
2716 | GZ1OZ0_HOLD, & |
---|
2717 | HFX_HOLD, & |
---|
2718 | LH_HOLD, & |
---|
2719 | MOL_HOLD, & |
---|
2720 | PSIH_HOLD, & |
---|
2721 | PSIM_HOLD, & |
---|
2722 | QFX_HOLD, & |
---|
2723 | QGH_HOLD, & |
---|
2724 | REGIME_HOLD, & |
---|
2725 | RMOL_HOLD, & |
---|
2726 | UST_HOLD, & |
---|
2727 | WSPD_HOLD, & |
---|
2728 | ZNT_HOLD, & |
---|
2729 | ZOL_HOLD, & |
---|
2730 | CD_SEA, & |
---|
2731 | CDA_SEA, & |
---|
2732 | CK_SEA, & |
---|
2733 | CKA_SEA, & |
---|
2734 | Q2_SEA, & |
---|
2735 | T2_SEA, & |
---|
2736 | TH2_SEA, & |
---|
2737 | U10_SEA, & |
---|
2738 | USTM_SEA, & |
---|
2739 | V10_SEA |
---|
2740 | |
---|
2741 | REAL, DIMENSION( ims:ime, jms:jme ) :: & |
---|
2742 | BR_SEA, & |
---|
2743 | GZ1OZ0_SEA, & |
---|
2744 | MOL_SEA, & |
---|
2745 | PSIH_SEA, & |
---|
2746 | PSIM_SEA, & |
---|
2747 | REGIME_SEA, & |
---|
2748 | RMOL_SEA, & |
---|
2749 | UST_SEA, & |
---|
2750 | WSPD_SEA, & |
---|
2751 | ZOL_SEA |
---|
2752 | ! INTENT(IN) to SFCLAY; unchanged by the call |
---|
2753 | ! ISFFLX |
---|
2754 | ! SVP1,SVP2,SVP3,SVPT0 |
---|
2755 | ! EP1,EP2,KARMAN,EOMEG,STBOLT |
---|
2756 | ! CP,G,ROVCP,R,XLV,DX |
---|
2757 | ! ISFTCFLX,IZ0TLND |
---|
2758 | ! P1000 |
---|
2759 | ! dz8w |
---|
2760 | ! QV3D |
---|
2761 | ! P3D |
---|
2762 | ! T3D |
---|
2763 | ! MAVAIL |
---|
2764 | ! PBLH |
---|
2765 | ! XLAND |
---|
2766 | ! TSK |
---|
2767 | ! U3D |
---|
2768 | ! V3D |
---|
2769 | ! PSFC |
---|
2770 | |
---|
2771 | CALL get_local_ice_tsk( ims, ime, jms, jme, its, ite, jts, jte, & |
---|
2772 | itimestep, .true., tice2tsk_if2cold, & |
---|
2773 | XICE, XICE_THRESHOLD, & |
---|
2774 | SST, TSK, TSK_SEA, TSK_LOCAL ) |
---|
2775 | |
---|
2776 | |
---|
2777 | ! INTENT (INOUT) to SFCLAY: Save the variables before the first call |
---|
2778 | ! (for land/frozen water) to SFCLAY, to keep from double-counting the |
---|
2779 | ! effects of that routine |
---|
2780 | BR_HOLD = BR |
---|
2781 | CHS2_HOLD = CHS2 |
---|
2782 | CHS_HOLD = CHS |
---|
2783 | CPM_HOLD = CPM |
---|
2784 | CQS2_HOLD = CQS2 |
---|
2785 | FLHC_HOLD = FLHC |
---|
2786 | FLQC_HOLD = FLQC |
---|
2787 | GZ1OZ0_HOLD = GZ1OZ0 |
---|
2788 | HFX_HOLD = HFX |
---|
2789 | LH_HOLD = LH |
---|
2790 | MOL_HOLD = MOL |
---|
2791 | PSIH_HOLD = PSIH |
---|
2792 | PSIM_HOLD = PSIM |
---|
2793 | QFX_HOLD = QFX |
---|
2794 | QGH_HOLD = QGH |
---|
2795 | REGIME_HOLD = REGIME |
---|
2796 | RMOL_HOLD = RMOL |
---|
2797 | UST_HOLD = UST |
---|
2798 | WSPD_HOLD = WSPD |
---|
2799 | ZNT_HOLD = ZNT |
---|
2800 | ZOL_HOLD = ZOL |
---|
2801 | |
---|
2802 | ! INTENT(OUT) from SFCLAY. Input shouldn't matter, but we'll want to |
---|
2803 | ! keep things around for weighting after the second call to SFCLAY. |
---|
2804 | ! CD |
---|
2805 | ! CDA |
---|
2806 | ! CK |
---|
2807 | ! CKA |
---|
2808 | ! Q2 |
---|
2809 | ! QSFC |
---|
2810 | ! T2 |
---|
2811 | ! TH2 |
---|
2812 | ! U10 |
---|
2813 | ! USTM |
---|
2814 | ! V10 |
---|
2815 | |
---|
2816 | |
---|
2817 | ! land/frozen-water call |
---|
2818 | call sfclay(U3D,V3D,T3D,QV3D,P3D,dz8w, & ! I |
---|
2819 | CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, & ! I,I,I,I,I,I,IO,IO,IO,IO, |
---|
2820 | ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, & |
---|
2821 | XLAND,HFX,QFX,LH,TSK_LOCAL,FLHC,FLQC,QGH,QSFC,RMOL, & |
---|
2822 | U10,V10,TH2,T2,Q2, & |
---|
2823 | GZ1OZ0,WSPD,BR,ISFFLX,DX, & |
---|
2824 | SVP1,SVP2,SVP3,SVPT0,EP1,EP2, & |
---|
2825 | KARMAN,EOMEG,STBOLT, & |
---|
2826 | P1000, & |
---|
2827 | ids,ide, jds,jde, kds,kde, & |
---|
2828 | ims,ime, jms,jme, kms,kme, & |
---|
2829 | its,ite, jts,jte, kts,kte, & |
---|
2830 | ustm,ck,cka,cd,cda,isftcflx,iz0tlnd ) |
---|
2831 | |
---|
2832 | ! Set up for open-water call |
---|
2833 | DO j = JTS , JTE |
---|
2834 | DO i = ITS , ITE |
---|
2835 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
2836 | XLAND_SEA(i,j)=2. |
---|
2837 | MAVAIL_SEA(I,J) =1. |
---|
2838 | ZNT_SEA(I,J) = 0.0001 |
---|
2839 | TSK_SEA(i,j) = SST(i,j) |
---|
2840 | IF ( SST(i,j) .LT. 271.4 ) THEN |
---|
2841 | SST(i,j) = 271.4 |
---|
2842 | TSK_SEA(i,j) = SST(i,j) |
---|
2843 | ENDIF |
---|
2844 | ELSE |
---|
2845 | XLAND_SEA(i,j) = XLAND(i,j) |
---|
2846 | MAVAIL_SEA(i,j) = MAVAIL(i,j) |
---|
2847 | ZNT_SEA(i,j) = ZNT_HOLD(i,j) |
---|
2848 | TSK_SEA(i,j) = TSK_LOCAL(i,j) |
---|
2849 | ENDIF |
---|
2850 | ENDDO |
---|
2851 | ENDDO |
---|
2852 | |
---|
2853 | ! Restore the values from before the land/frozen-water call |
---|
2854 | BR_SEA = BR_HOLD |
---|
2855 | CHS2_SEA = CHS2_HOLD |
---|
2856 | CHS_SEA = CHS_HOLD |
---|
2857 | CPM_SEA = CPM_HOLD |
---|
2858 | CQS2_SEA = CQS2_HOLD |
---|
2859 | FLHC_SEA = FLHC_HOLD |
---|
2860 | FLQC_SEA = FLQC_HOLD |
---|
2861 | GZ1OZ0_SEA = GZ1OZ0_HOLD |
---|
2862 | HFX_SEA = HFX_HOLD |
---|
2863 | LH_SEA = LH_HOLD |
---|
2864 | MOL_SEA = MOL_HOLD |
---|
2865 | PSIH_SEA = PSIH_HOLD |
---|
2866 | PSIM_SEA = PSIM_HOLD |
---|
2867 | QFX_SEA = QFX_HOLD |
---|
2868 | QGH_SEA = QGH_HOLD |
---|
2869 | REGIME_SEA = REGIME_HOLD |
---|
2870 | RMOL_SEA = RMOL_HOLD |
---|
2871 | UST_SEA = UST_HOLD |
---|
2872 | WSPD_SEA = WSPD_HOLD |
---|
2873 | ZOL_SEA = ZOL_HOLD |
---|
2874 | |
---|
2875 | ! open-water call |
---|
2876 | call sfclay(U3D,V3D,T3D,QV3D,P3D,dz8w, & ! I |
---|
2877 | CP,G,ROVCP,R,XLV,PSFC, & ! I |
---|
2878 | CHS_SEA,CHS2_SEA,CQS2_SEA,CPM_SEA, & ! I/O |
---|
2879 | ZNT_SEA,UST_SEA, & ! I/O |
---|
2880 | PBLH,MAVAIL_SEA, & ! I |
---|
2881 | ZOL_SEA,MOL_SEA,REGIME_SEA,PSIM_SEA,PSIH_SEA, & ! I/O |
---|
2882 | XLAND_SEA, & ! I |
---|
2883 | HFX_SEA,QFX_SEA,LH_SEA, & ! I/O |
---|
2884 | TSK_SEA, & ! I |
---|
2885 | FLHC_SEA,FLQC_SEA,QGH_SEA,QSFC_sea,RMOL_SEA, & ! I/O |
---|
2886 | U10_sea,V10_sea,TH2_sea,T2_sea,Q2_sea, & ! O |
---|
2887 | GZ1OZ0_SEA,WSPD_SEA,BR_SEA, & ! I/O |
---|
2888 | ISFFLX,DX, & |
---|
2889 | SVP1,SVP2,SVP3,SVPT0,EP1,EP2, & |
---|
2890 | KARMAN,EOMEG,STBOLT, & |
---|
2891 | P1000, & |
---|
2892 | ids,ide, jds,jde, kds,kde, & |
---|
2893 | ims,ime, jms,jme, kms,kme, & |
---|
2894 | its,ite, jts,jte, kts,kte, & ! 0 |
---|
2895 | ustm_sea,ck_sea,cka_sea,cd_sea,cda_sea,isftcflx,iz0tlnd ) |
---|
2896 | |
---|
2897 | DO j = JTS , JTE |
---|
2898 | DO i = ITS, ITE |
---|
2899 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and.( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
2900 | ! weighted average for sea ice points |
---|
2901 | br(i,j) = ( br(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * br_sea(i,j) ) |
---|
2902 | ! CHS2 -- wait |
---|
2903 | ! CHS -- wait |
---|
2904 | ! CPM -- wait |
---|
2905 | ! CQS2 -- wait |
---|
2906 | ! FLHC -- wait |
---|
2907 | ! FLQC -- wait |
---|
2908 | gz1oz0(i,j) = ( gz1oz0(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * gz1oz0_sea(i,j) ) |
---|
2909 | ! HFX -- wait |
---|
2910 | ! LH -- wait |
---|
2911 | mol(i,j) = ( mol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * mol_sea(i,j) ) |
---|
2912 | psih(i,j) = ( psih(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * psih_sea(i,j) ) |
---|
2913 | psim(i,j) = ( psim(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * psim_sea(i,j) ) |
---|
2914 | ! QFX -- wait |
---|
2915 | ! QGH -- wait |
---|
2916 | if ( XICE(i,j).GE. 0.5 ) regime(i,j) = regime_hold(i,j) |
---|
2917 | rmol(i,j) = ( rmol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * rmol_sea(i,j) ) |
---|
2918 | ust(i,j) = ( ust(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * ust_sea(i,j) ) |
---|
2919 | wspd(i,j) = ( wspd(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * wspd_sea(i,j) ) |
---|
2920 | zol(i,j) = ( zol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * zol_sea(i,j) ) |
---|
2921 | ! INTENT(OUT) -------------------------------------------------------------------- |
---|
2922 | IF ( PRESENT ( CD ) ) THEN |
---|
2923 | CD(i,j) = ( CD(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * CD_sea(i,j) ) |
---|
2924 | ENDIF |
---|
2925 | IF ( PRESENT ( CDA ) ) THEN |
---|
2926 | CDA(i,j) = ( CDA(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * CDA_sea(i,j) ) |
---|
2927 | ENDIF |
---|
2928 | IF ( PRESENT ( CK ) ) THEN |
---|
2929 | CK(i,j) = ( CK(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * CK_sea(i,j) ) |
---|
2930 | ENDIF |
---|
2931 | IF ( PRESENT ( CKA ) ) THEN |
---|
2932 | CKA(i,j) = ( CKA(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * CKA_sea(i,j) ) |
---|
2933 | ENDIF |
---|
2934 | q2(i,j) = ( q2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * q2_sea(i,j) ) |
---|
2935 | ! QSFC -- wait |
---|
2936 | t2(i,j) = ( t2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * t2_sea(i,j) ) |
---|
2937 | th2(i,j) = ( th2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * th2_sea(i,j) ) |
---|
2938 | u10(i,j) = ( u10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * u10_sea(i,j) ) |
---|
2939 | IF ( PRESENT ( USTM ) ) THEN |
---|
2940 | USTM(i,j) = ( USTM(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * USTM_sea(i,j) ) |
---|
2941 | ENDIF |
---|
2942 | v10(i,j) = ( v10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * v10_sea(i,j) ) |
---|
2943 | ENDIF |
---|
2944 | END DO |
---|
2945 | END DO |
---|
2946 | ! |
---|
2947 | ! tsk(i,j) = tsk(i,j)*XICE(i,j) + (1.0-XICE(i,j))*TSK_SEA(i,j) |
---|
2948 | ! |
---|
2949 | END SUBROUTINE sfclay_seaice_wrapper |
---|
2950 | |
---|
2951 | !------------------------------------------------------------------------- |
---|
2952 | !------------------------------------------------------------------------- |
---|
2953 | |
---|
2954 | SUBROUTINE pxsfclay_seaice_wrapper(U3D,V3D,T3D,TH3D,QV3D,P3D,dz8w, & |
---|
2955 | CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, & |
---|
2956 | ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, & |
---|
2957 | XLAND,HFX,QFX,LH,TSK,FLHC,FLQC,QGH,QSFC,RMOL, & |
---|
2958 | U10,V10, & |
---|
2959 | GZ1OZ0,WSPD,BR,ISFFLX,DX, & |
---|
2960 | SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN, & |
---|
2961 | XICE, SST, ITIMESTEP, TICE2TSK_IF2COLD,XICE_THRESHOLD, & |
---|
2962 | CHS_SEA, CHS2_SEA, CPM_SEA, CQS2_SEA, FLHC_SEA, FLQC_SEA, & |
---|
2963 | HFX_SEA, LH_SEA, QFX_SEA, QGH_SEA, QSFC_SEA, TSK_SEA, & |
---|
2964 | ids,ide, jds,jde, kds,kde, & |
---|
2965 | ims,ime, jms,jme, kms,kme, & |
---|
2966 | its,ite, jts,jte, kts,kte ) |
---|
2967 | USE module_sf_pxsfclay |
---|
2968 | implicit none |
---|
2969 | INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, & |
---|
2970 | ims,ime, jms,jme, kms,kme, & |
---|
2971 | its,ite, jts,jte, kts,kte |
---|
2972 | |
---|
2973 | INTEGER, INTENT(IN ) :: ISFFLX |
---|
2974 | LOGICAL, INTENT(IN ) :: TICE2TSK_IF2COLD |
---|
2975 | REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0 |
---|
2976 | REAL, INTENT(IN ) :: EP1,EP2,KARMAN |
---|
2977 | |
---|
2978 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , & |
---|
2979 | INTENT(IN ) :: dz8w |
---|
2980 | |
---|
2981 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , & |
---|
2982 | INTENT(IN ) :: QV3D, & |
---|
2983 | P3D, & |
---|
2984 | T3D, & |
---|
2985 | TH3D |
---|
2986 | |
---|
2987 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
2988 | INTENT(IN ) :: MAVAIL, & |
---|
2989 | PBLH, & |
---|
2990 | XLAND, & |
---|
2991 | TSK |
---|
2992 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , & |
---|
2993 | INTENT(IN ) :: U3D, & |
---|
2994 | V3D |
---|
2995 | |
---|
2996 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
2997 | INTENT(IN ) :: PSFC |
---|
2998 | |
---|
2999 | REAL, INTENT(IN ) :: CP,G,ROVCP,R,XLV,DX |
---|
3000 | |
---|
3001 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
3002 | INTENT(OUT ) :: U10, & |
---|
3003 | V10, & |
---|
3004 | QSFC |
---|
3005 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
3006 | INTENT(INOUT) :: REGIME, & |
---|
3007 | HFX, & |
---|
3008 | QFX, & |
---|
3009 | LH, & |
---|
3010 | MOL,RMOL |
---|
3011 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
3012 | INTENT(INOUT) :: GZ1OZ0,WSPD,BR, & |
---|
3013 | PSIM,PSIH |
---|
3014 | |
---|
3015 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
3016 | INTENT(INOUT) :: ZNT, & |
---|
3017 | ZOL, & |
---|
3018 | UST, & |
---|
3019 | CPM, & |
---|
3020 | CHS2, & |
---|
3021 | CQS2, & |
---|
3022 | CHS |
---|
3023 | |
---|
3024 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
3025 | INTENT(INOUT) :: FLHC,FLQC |
---|
3026 | |
---|
3027 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
3028 | INTENT(INOUT) :: QGH |
---|
3029 | |
---|
3030 | !-------------------------------------------------------------------- |
---|
3031 | ! For wrapper |
---|
3032 | !-------------------------------------------------------------------- |
---|
3033 | |
---|
3034 | INTEGER, INTENT(IN) :: ITIMESTEP |
---|
3035 | REAL, INTENT(IN) :: XICE_THRESHOLD |
---|
3036 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
3037 | INTENT(IN) :: XICE |
---|
3038 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
3039 | INTENT(OUT) :: TSK_SEA |
---|
3040 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
3041 | INTENT(INOUT) :: SST |
---|
3042 | |
---|
3043 | !-------------------------------------------------------------------- |
---|
3044 | ! Local |
---|
3045 | !-------------------------------------------------------------------- |
---|
3046 | INTEGER :: I, J |
---|
3047 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
---|
3048 | INTENT(OUT) :: CHS_SEA, & |
---|
3049 | CHS2_SEA, & |
---|
3050 | CPM_SEA, & |
---|
3051 | CQS2_SEA, & |
---|
3052 | FLHC_SEA, & |
---|
3053 | FLQC_SEA, & |
---|
3054 | HFX_SEA, & |
---|
3055 | LH_SEA, & |
---|
3056 | QFX_SEA, & |
---|
3057 | QGH_SEA, & |
---|
3058 | QSFC_SEA |
---|
3059 | |
---|
3060 | REAL, DIMENSION( ims:ime, jms:jme ) :: BR_HOLD, & |
---|
3061 | CHS_HOLD, & |
---|
3062 | CHS2_HOLD, & |
---|
3063 | CPM_HOLD, & |
---|
3064 | CQS2_HOLD, & |
---|
3065 | FLHC_HOLD, & |
---|
3066 | FLQC_HOLD, & |
---|
3067 | GZ1OZ0_HOLD, & |
---|
3068 | HFX_HOLD, & |
---|
3069 | LH_HOLD, & |
---|
3070 | MOL_HOLD, & |
---|
3071 | PSIH_HOLD, & |
---|
3072 | PSIM_HOLD, & |
---|
3073 | QFX_HOLD, & |
---|
3074 | QGH_HOLD, & |
---|
3075 | REGIME_HOLD, & |
---|
3076 | RMOL_HOLD, & |
---|
3077 | UST_HOLD, & |
---|
3078 | WSPD_HOLD, & |
---|
3079 | ZNT_HOLD, & |
---|
3080 | ZOL_HOLD, & |
---|
3081 | TSK_LOCAL |
---|
3082 | |
---|
3083 | REAL, DIMENSION( ims:ime, jms:jme ) :: XLAND_SEA, & |
---|
3084 | MAVAIL_SEA, & |
---|
3085 | BR_SEA, & |
---|
3086 | GZ1OZ0_SEA, & |
---|
3087 | MOL_SEA, & |
---|
3088 | PSIH_SEA, & |
---|
3089 | PSIM_SEA, & |
---|
3090 | REGIME_SEA, & |
---|
3091 | RMOL_SEA, & |
---|
3092 | UST_SEA, & |
---|
3093 | WSPD_SEA, & |
---|
3094 | ZNT_SEA, & |
---|
3095 | ZOL_SEA, & |
---|
3096 | U10_SEA, & |
---|
3097 | V10_SEA |
---|
3098 | |
---|
3099 | CALL get_local_ice_tsk( ims, ime, jms, jme, its, ite, jts, jte, & |
---|
3100 | itimestep, .true., tice2tsk_if2cold, & |
---|
3101 | XICE, XICE_THRESHOLD, & |
---|
3102 | SST, TSK, TSK_SEA, TSK_LOCAL ) |
---|
3103 | ! |
---|
3104 | ! INTENT (INOUT) to PXSFCLAY: Save the variables before the first call |
---|
3105 | ! (for land/frozen water) to SFCLAY, to keep from double-counting the |
---|
3106 | ! effects of that routine |
---|
3107 | ! |
---|
3108 | BR_HOLD = BR |
---|
3109 | CHS_HOLD = CHS |
---|
3110 | CHS2_HOLD = CHS2 |
---|
3111 | CPM_HOLD = CPM |
---|
3112 | CQS2_HOLD = CQS2 |
---|
3113 | FLHC_HOLD = FLHC |
---|
3114 | FLQC_HOLD = FLQC |
---|
3115 | GZ1OZ0_HOLD = GZ1OZ0 |
---|
3116 | HFX_HOLD = HFX |
---|
3117 | LH_HOLD = LH |
---|
3118 | MOL_HOLD = MOL |
---|
3119 | PSIH_HOLD = PSIH |
---|
3120 | PSIM_HOLD = PSIM |
---|
3121 | QFX_HOLD = QFX |
---|
3122 | QGH_HOLD = QGH |
---|
3123 | REGIME_HOLD = REGIME |
---|
3124 | RMOL_HOLD = RMOL |
---|
3125 | UST_HOLD = UST |
---|
3126 | WSPD_HOLD = WSPD |
---|
3127 | ZNT_HOLD = ZNT |
---|
3128 | ZOL_HOLD = ZOL |
---|
3129 | |
---|
3130 | ! INTENT(OUT) from PXSFCLAY. Input shouldn't matter, but we'll want to |
---|
3131 | ! keep things around for weighting after the second call to PXSFCLAY. |
---|
3132 | ! U10 |
---|
3133 | ! V10 |
---|
3134 | ! QSFC |
---|
3135 | |
---|
3136 | ! Land/frozen-water call. |
---|
3137 | CALL pxsfclay(U3D,V3D,T3D,TH3D,QV3D,P3D,dz8w, & |
---|
3138 | CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, & |
---|
3139 | ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, & |
---|
3140 | XLAND,HFX,QFX,LH,TSK_LOCAL,FLHC,FLQC,QGH,QSFC,RMOL, & |
---|
3141 | U10,V10, & |
---|
3142 | GZ1OZ0,WSPD,BR,ISFFLX,DX, & |
---|
3143 | SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN, & |
---|
3144 | ids,ide, jds,jde, kds,kde, & |
---|
3145 | ims,ime, jms,jme, kms,kme, & |
---|
3146 | its,ite, jts,jte, kts,kte ) |
---|
3147 | |
---|
3148 | DO j = JTS , JTE |
---|
3149 | DO i= ITS , ITE |
---|
3150 | IF( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
3151 | ! Sets up things for open ocean. |
---|
3152 | XLAND_SEA(i,j)=2. |
---|
3153 | MAVAIL_SEA(I,J) =1. |
---|
3154 | ZNT_SEA(I,J) = 0.0001 |
---|
3155 | TSK_SEA(i,j) = SST(i,j) |
---|
3156 | if ( SST(i,j) .LT. 271.4 ) then |
---|
3157 | SST(i,j) = 271.4 |
---|
3158 | TSK_SEA(i,j) = SST(i,j) |
---|
3159 | endif |
---|
3160 | ELSE |
---|
3161 | XLAND_SEA(i,j)=xland(i,j) |
---|
3162 | MAVAIL_SEA(i,j) = mavail(i,j) |
---|
3163 | ZNT_SEA(I,J) = ZNT_HOLD(I,J) |
---|
3164 | TSK_SEA(i,j) = TSK(i,j) |
---|
3165 | ENDIF |
---|
3166 | ENDDO |
---|
3167 | ENDDO |
---|
3168 | |
---|
3169 | ! INTENT(INOUT) variables held over from before the first call to PXSFCLAY: |
---|
3170 | BR_SEA = BR_HOLD |
---|
3171 | CHS_SEA = CHS_HOLD |
---|
3172 | CHS2_SEA = CHS2_HOLD |
---|
3173 | CPM_SEA = CPM_HOLD |
---|
3174 | CQS2_SEA = CQS2_HOLD |
---|
3175 | FLHC_SEA = FLHC_HOLD |
---|
3176 | FLQC_SEA = FLQC_HOLD |
---|
3177 | GZ1OZ0_SEA = GZ1OZ0_HOLD |
---|
3178 | HFX_SEA = HFX_HOLD |
---|
3179 | LH_SEA = LH_HOLD |
---|
3180 | MOL_SEA = MOL_HOLD |
---|
3181 | PSIH_SEA = PSIH_HOLD |
---|
3182 | PSIM_SEA = PSIM_HOLD |
---|
3183 | QFX_SEA = QFX_HOLD |
---|
3184 | QGH_SEA = QGH_HOLD |
---|
3185 | REGIME_SEA = REGIME_HOLD |
---|
3186 | RMOL_SEA = RMOL_HOLD |
---|
3187 | UST_SEA = UST_HOLD |
---|
3188 | WSPD_SEA = WSPD_HOLD |
---|
3189 | ZOL_SEA = ZOL_HOLD |
---|
3190 | |
---|
3191 | ! Open-water call. |
---|
3192 | ! Variables newly set (INTENT(OUT)) or changed (INTENT(INOUT)) by |
---|
3193 | ! PXSFCLAY are here appended with the "_SEA" label. |
---|
3194 | ! Special intent(IN) variables here: XLAND_SEA, MAVAIL_SEA, TSK_SEA |
---|
3195 | CALL pxsfclay(U3D,V3D,T3D,TH3D,QV3D,P3D,dz8w, & |
---|
3196 | CP,G,ROVCP,R,XLV,PSFC,CHS_SEA,CHS2_SEA,CQS2_SEA,CPM_SEA, & |
---|
3197 | ZNT_SEA,UST_SEA,PBLH,MAVAIL_SEA,ZOL_SEA,MOL_SEA,REGIME_SEA,PSIM_SEA,PSIH_SEA, & |
---|
3198 | XLAND_SEA,HFX_SEA,QFX_SEA,LH_SEA,TSK_SEA,FLHC_SEA,FLQC_SEA,QGH_SEA,QSFC_SEA,RMOL_SEA, & |
---|
3199 | U10_SEA,V10_SEA, & |
---|
3200 | GZ1OZ0_SEA,WSPD_SEA,BR_SEA,ISFFLX,DX, & |
---|
3201 | SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN, & |
---|
3202 | ids,ide, jds,jde, kds,kde, & |
---|
3203 | ims,ime, jms,jme, kms,kme, & |
---|
3204 | its,ite, jts,jte, kts,kte ) |
---|
3205 | |
---|
3206 | DO j = JTS , JTE |
---|
3207 | DO i = ITS , ITE |
---|
3208 | IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN |
---|
3209 | ! INTENT (INOUT) for PXSFCLAY: |
---|
3210 | br(i,j) = ( br(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * br_sea(i,j) ) |
---|
3211 | gz1oz0(i,j) = ( gz1oz0(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * gz1oz0_sea(i,j) ) |
---|
3212 | mol(i,j) = ( mol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * mol_sea(i,j) ) |
---|
3213 | psih(i,j) = ( psih(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * psih_sea(i,j) ) |
---|
3214 | psim(i,j) = ( psim(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * psim_sea(i,j) ) |
---|
3215 | rmol(i,j) = ( rmol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * rmol_sea(i,j) ) |
---|
3216 | ust(i,j) = ( ust(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * ust_sea(i,j) ) |
---|
3217 | wspd(i,j) = ( wspd(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * wspd_sea(i,j) ) |
---|
3218 | zol(i,j) = ( zol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * zol_sea(i,j) ) |
---|
3219 | ! REGIME: Special case for this variable. Just take the land values. |
---|
3220 | ! CHS -- wait |
---|
3221 | ! CHS2 -- wait |
---|
3222 | ! CPM -- wait |
---|
3223 | ! CQS2 -- wait |
---|
3224 | ! FLHC -- wait |
---|
3225 | ! FLQC -- wait |
---|
3226 | ! HFX -- wait |
---|
3227 | ! LH -- wait |
---|
3228 | ! QFX -- wait |
---|
3229 | ! QGH -- wait |
---|
3230 | |
---|
3231 | ! INTENT (OUT) from PXSFCLAY: |
---|
3232 | u10(i,j) = ( u10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * u10_sea(i,j) ) |
---|
3233 | v10(i,j) = ( v10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * v10_sea(i,j) ) |
---|
3234 | ! QSFC -- wait |
---|
3235 | ENDIF |
---|
3236 | ENDDO |
---|
3237 | ENDDO |
---|
3238 | |
---|
3239 | END SUBROUTINE pxsfclay_seaice_wrapper |
---|
3240 | |
---|
3241 | !------------------------------------------------------------------------- |
---|
3242 | |
---|
3243 | SUBROUTINE TOPO_RAD_ADJ_DRVR (XLAT,XLONG,COSZEN, & |
---|
3244 | shadowmask, & |
---|
3245 | declin, & |
---|
3246 | SWDOWN,GSW,SWNORM,GSWSAVE,solcon,hrang2d, & |
---|
3247 | slope_in,slp_azi_in, & |
---|
3248 | ids, ide, jds, jde, kds, kde, & |
---|
3249 | ims, ime, jms, jme, kms, kme, & |
---|
3250 | its, ite, jts, jte, kts, kte ) |
---|
3251 | !------------------------------------------------------------------ |
---|
3252 | IMPLICIT NONE |
---|
3253 | !------------------------------------------------------------------ |
---|
3254 | INTEGER, INTENT(IN) :: its,ite,jts,jte,kts,kte, & |
---|
3255 | ims,ime,jms,jme,kms,kme, & |
---|
3256 | ids,ide,jds,jde,kds,kde |
---|
3257 | INTEGER, DIMENSION( ims:ime, jms:jme ), & |
---|
3258 | INTENT(IN) :: shadowmask |
---|
3259 | REAL, DIMENSION( ims:ime, jms:jme ), & |
---|
3260 | INTENT(IN ) :: XLAT,XLONG |
---|
3261 | REAL, DIMENSION( ims:ime, jms:jme ), & |
---|
3262 | INTENT(INOUT) :: SWDOWN,GSW,SWNORM,GSWSAVE |
---|
3263 | real,intent(in) :: solcon |
---|
3264 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: hrang2d,coszen |
---|
3265 | |
---|
3266 | |
---|
3267 | REAL, INTENT(IN ) :: declin |
---|
3268 | REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: slope_in,slp_azi_in |
---|
3269 | |
---|
3270 | |
---|
3271 | ! LOCAL VARS |
---|
3272 | integer :: i,j |
---|
3273 | real :: pi,degrad |
---|
3274 | integer :: shadow |
---|
3275 | real :: swdown_teradj,swdown_in,xlat1,xlong1 |
---|
3276 | |
---|
3277 | !------------------------------------------------------------------ |
---|
3278 | |
---|
3279 | pi = 4.*atan(1.) |
---|
3280 | degrad=pi/180. |
---|
3281 | |
---|
3282 | DO J=jts,jte |
---|
3283 | DO I=its,ite |
---|
3284 | SWNORM(i,j) = SWDOWN(i,j) ! save |
---|
3285 | IF(SWDOWN(I,J) .GT. 1.E-3)THEN ! daytime |
---|
3286 | shadow = shadowmask(i,j) |
---|
3287 | |
---|
3288 | SWDOWN_IN = SWDOWN(i,j) |
---|
3289 | XLAT1 = XLAT(i,j) |
---|
3290 | XLONG1 = XLONG(i,j) |
---|
3291 | CALL TOPO_RAD_ADJ (XLAT1,XLONG1,COSZEN(i,j), & |
---|
3292 | DECLIN,DEGRAD, & |
---|
3293 | SWDOWN_IN,solcon,hrang2d(i,j),SWDOWN_teradj, & |
---|
3294 | kts,kte, & |
---|
3295 | slope_in(i,j),slp_azi_in(i,j), & |
---|
3296 | shadow , i,j & |
---|
3297 | ) |
---|
3298 | |
---|
3299 | GSWSAVE(I,J) = GSW(I,J) ! save |
---|
3300 | GSW(I,J) = GSW(I,J)*SWDOWN_teradj/SWDOWN(i,j) |
---|
3301 | SWDOWN(i,j) = SWDOWN_teradj |
---|
3302 | |
---|
3303 | ENDIF ! daytime |
---|
3304 | ENDDO ! i_loop |
---|
3305 | ENDDO ! j_loop |
---|
3306 | |
---|
3307 | |
---|
3308 | END SUBROUTINE TOPO_RAD_ADJ_DRVR |
---|
3309 | !------------------------------------------------------------------ |
---|
3310 | !------------------------------------------------------------------ |
---|
3311 | SUBROUTINE TOPO_RAD_ADJ (XLAT1,XLONG1,COSZEN, & |
---|
3312 | DECLIN,DEGRAD, & |
---|
3313 | SWDOWN_IN,solcon,hrang,SWDOWN_teradj, & |
---|
3314 | kts,kte, & |
---|
3315 | slope,slp_azi, & |
---|
3316 | shadow & |
---|
3317 | ,i,j) |
---|
3318 | |
---|
3319 | !------------------------------------------------------------------ |
---|
3320 | IMPLICIT NONE |
---|
3321 | !------------------------------------------------------------------ |
---|
3322 | INTEGER, INTENT(IN) :: kts,kte |
---|
3323 | REAL, INTENT(IN) :: COSZEN,DECLIN, & |
---|
3324 | XLAT1,XLONG1,DEGRAD |
---|
3325 | REAL, INTENT(IN) :: SWDOWN_IN,solcon,hrang |
---|
3326 | INTEGER, INTENT(IN) :: shadow |
---|
3327 | REAL, INTENT(IN) :: slp_azi,slope |
---|
3328 | |
---|
3329 | REAL, INTENT(OUT) :: SWDOWN_teradj |
---|
3330 | |
---|
3331 | ! LOCAL VARS |
---|
3332 | REAL :: XT24,TLOCTM,CSZA,XXLAT |
---|
3333 | REAL :: diffuse_frac,corr_fac,csza_slp |
---|
3334 | integer :: i,j |
---|
3335 | |
---|
3336 | |
---|
3337 | !------------------------------------------------------------------ |
---|
3338 | |
---|
3339 | SWDOWN_teradj=SWDOWN_IN |
---|
3340 | |
---|
3341 | CSZA=COSZEN |
---|
3342 | XXLAT=XLAT1*DEGRAD |
---|
3343 | |
---|
3344 | ! RETURN IF NIGHT |
---|
3345 | IF(CSZA.LE.1.E-9) return |
---|
3346 | |
---|
3347 | ! Parameterize diffuse fraction of global solar radiation as a function of the ratio between TOA radiation and surface global radiation |
---|
3348 | diffuse_frac = min(1.,1./(max(0.1,2.1-2.8*log(log(csza*solcon/max(SWDOWN_IN,1.e-3)))))) |
---|
3349 | if ((slope.eq.0).or.(diffuse_frac.eq.1).or.(csza.lt.1.e-2)) then ! no topographic effects when all radiation diffuse or sun too close to horizon |
---|
3350 | corr_fac = 1 |
---|
3351 | goto 140 |
---|
3352 | endif |
---|
3353 | |
---|
3354 | ! cosine of zenith angle over sloping topography |
---|
3355 | csza_slp = ((SIN(XXLAT)*COS(HRANG))* & |
---|
3356 | (-cos(slp_azi)*sin(slope))-SIN(HRANG)*(sin(slp_azi)*sin(slope))+ & |
---|
3357 | (COS(XXLAT)*COS(HRANG))*cos(slope))* & |
---|
3358 | COS(DECLIN)+(COS(XXLAT)*(cos(slp_azi)*sin(slope))+ & |
---|
3359 | SIN(XXLAT)*cos(slope))*SIN(DECLIN) |
---|
3360 | IF(csza_slp.LE.1.E-4) csza_slp = 0 |
---|
3361 | |
---|
3362 | ! Topographic shading |
---|
3363 | if (shadow.eq.1) csza_slp = 0 |
---|
3364 | |
---|
3365 | ! Correction factor for sloping topography; the diffuse fraction of solar radiation is assumed to be unaffected by the slope |
---|
3366 | corr_fac = diffuse_frac + (1-diffuse_frac)*csza_slp/csza |
---|
3367 | |
---|
3368 | 140 continue |
---|
3369 | |
---|
3370 | SWDOWN_teradj=(1.)*SWDOWN_IN*corr_fac |
---|
3371 | |
---|
3372 | END SUBROUTINE TOPO_RAD_ADJ |
---|
3373 | |
---|
3374 | !======================================================================= |
---|
3375 | |
---|
3376 | SUBROUTINE get_local_ice_tsk ( ims, ime, jms, jme, & |
---|
3377 | its, ite, jts, jte, & |
---|
3378 | itimestep, & |
---|
3379 | sfc_layer_values, & |
---|
3380 | tice2tsk_if2cold, & |
---|
3381 | XICE, XICE_THRESHOLD, & |
---|
3382 | SST, TSK, TSK_SEA, TSK_ICE ) |
---|
3383 | !<DESCRIPTION> |
---|
3384 | ! |
---|
3385 | ! For grid cells with a fractional ice area, derive the ice surface |
---|
3386 | ! temperature from the area-averaged surface temperature (the blended |
---|
3387 | ! result of the open-water values (SST) and the ice-covered value). |
---|
3388 | ! |
---|
3389 | !</DESCRIPTION> |
---|
3390 | |
---|
3391 | IMPLICIT NONE |
---|
3392 | |
---|
3393 | INTEGER, INTENT(IN) :: ims, ime, jms, jme !-- start/end index for i/j in memory |
---|
3394 | INTEGER, INTENT(IN) :: its, ite, jts, jte !-- start/end index for i/j in tile |
---|
3395 | INTEGER, INTENT(IN) :: itimestep !-- timestep |
---|
3396 | LOGICAL, INTENT(IN) :: sfc_layer_values !-- True if there are surface layer routine values |
---|
3397 | !-- available from the ice portion of the grid point |
---|
3398 | !-- (i.e. called from a seaice_wrapper subroutine) |
---|
3399 | LOGICAL, INTENT(IN) :: tice2tsk_if2cold !-- True to set TSK_ICE to TSK. This may be |
---|
3400 | !-- necessary to avoid unphysically low ice |
---|
3401 | !-- temperatures is there is a mis-match between |
---|
3402 | !-- ice fraction and surface temperature. |
---|
3403 | |
---|
3404 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN) :: XICE ! Ice fraction |
---|
3405 | REAL , INTENT(IN) :: XICE_THRESHOLD |
---|
3406 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN) :: TSK ! Surface temperature (K) |
---|
3407 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT) :: SST ! Sea surface temperature (K) |
---|
3408 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(OUT) :: TSK_SEA ! Sfc temp of open water portion of grid cell |
---|
3409 | REAL, DIMENSION( ims:ime , jms:jme ), INTENT(OUT) :: TSK_ICE ! Sfc temp of ice oprtion of grid cell |
---|
3410 | |
---|
3411 | ! Local |
---|
3412 | INTEGER :: i,j |
---|
3413 | |
---|
3414 | DO j = JTS , JTE |
---|
3415 | DO i = ITS , ITE |
---|
3416 | IF ( ( XICE(i,j) >= XICE_THRESHOLD ) .AND. ( XICE(I,J) <= 1.0 ) ) THEN |
---|
3417 | |
---|
3418 | IF ( SST(i,j) < 271.4 ) THEN |
---|
3419 | SST(i,j) = 271.4 |
---|
3420 | ENDIF |
---|
3421 | |
---|
3422 | IF (sfc_layer_values) THEN |
---|
3423 | IF ( SST(i,j) > 273. .AND. itimestep <= 3) then |
---|
3424 | ! Why the dependence on the time step count, here? |
---|
3425 | IF ( XICE(i,j) >= 0.6 ) THEN |
---|
3426 | SST(i,j) = 271.4 |
---|
3427 | ELSEIF ( XICE(i,j) >= 0.4 ) THEN |
---|
3428 | SST(i,j) = 273. |
---|
3429 | ELSEIF (XICE(i,j) >= 0.2 .AND. SST(i,j) > 275.) THEN |
---|
3430 | SST(i,j) = 275. |
---|
3431 | ELSEIF (SST(i,j) > 278.) THEN |
---|
3432 | SST(i,j) = 278. |
---|
3433 | ENDIF |
---|
3434 | ENDIF |
---|
3435 | ENDIF |
---|
3436 | TSK_SEA(i,j) = SST(i,j) |
---|
3437 | |
---|
3438 | IF ( tice2tsk_if2cold ) THEN |
---|
3439 | !------------------------------------------------------------------------------------ |
---|
3440 | ! This avoids unphysically low ice temperatures for grid cells with low ice fractions |
---|
3441 | ! and low area-averaged temperatures. This can happen when the initial ice fraction |
---|
3442 | ! and surface temperature come from different data sets. |
---|
3443 | !------------------------------------------------------------------------------------ |
---|
3444 | TSK_ICE(i,j) = MIN( TSK(i,j), 273.15 ) |
---|
3445 | ELSE |
---|
3446 | TSK_ICE(i,j) = ( TSK(i,j) - (1.0-XICE(i,j)) * SST(i,j) ) / XICE(i,j) |
---|
3447 | ENDIF |
---|
3448 | |
---|
3449 | IF ( ( XICE(i,j) < 0.2 ) .AND. ( TSK(i,j) < 253.15 ) ) THEN |
---|
3450 | TSK_ICE(i,j) = 253.15 |
---|
3451 | ENDIF |
---|
3452 | IF ( ( XICE(i,j) < 0.1 ) .AND. ( TSK(i,j) < 263.15 ) ) THEN |
---|
3453 | TSK_ICE(i,j) = 263.15 |
---|
3454 | ENDIF |
---|
3455 | ELSE |
---|
3456 | ! land/open-water point |
---|
3457 | TSK_SEA(i,j) = TSK(i,j) |
---|
3458 | TSK_ICE(i,j) = TSK(i,j) |
---|
3459 | ENDIF |
---|
3460 | ENDDO |
---|
3461 | ENDDO |
---|
3462 | |
---|
3463 | END SUBROUTINE get_local_ice_tsk |
---|
3464 | |
---|
3465 | !======================================================================= |
---|
3466 | !======================================================================= |
---|
3467 | |
---|
3468 | END MODULE module_surface_driver |
---|