PageRenderTime 51ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/dyn_nmm/module_initialize_tropical_cyclone.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 6633 lines | 4328 code | 1076 blank | 1229 comment | 142 complexity | 9d9f77a97607ac1b632315424e19711f MD5 | raw file
Possible License(s): AGPL-1.0
  1. !REAL:MODEL_LAYER:INITIALIZATION
  2. ! This MODULE holds the routines which are used to perform various initializations
  3. ! for individual domains utilizing the NMM dynamical core.
  4. !-----------------------------------------------------------------------
  5. MODULE module_initialize_ideal
  6. USE module_bc
  7. USE module_configure
  8. USE module_domain
  9. USE module_io_domain
  10. USE module_model_constants
  11. ! USE module_si_io_nmm
  12. USE module_state_description
  13. USE module_timing
  14. USE module_soil_pre
  15. #ifdef DM_PARALLEL
  16. USE module_dm, ONLY : LOCAL_COMMUNICATOR &
  17. ,MYTASK,NTASKS,NTASKS_X &
  18. ,NTASKS_Y
  19. USE module_comm_dm
  20. USE module_ext_internal
  21. #endif
  22. INTEGER :: internal_time_loop
  23. INTEGER:: MPI_COMM_COMP,MYPE
  24. INTEGER:: loopinc, iloopinc
  25. CONTAINS
  26. !-------------------------------------------------------------------
  27. SUBROUTINE init_domain ( grid )
  28. IMPLICIT NONE
  29. ! Input space and data. No gridded meteorological data has been stored, though.
  30. ! TYPE (domain), POINTER :: grid
  31. TYPE (domain) :: grid
  32. ! Local data.
  33. INTEGER :: idum1, idum2
  34. CALL set_scalar_indices_from_config ( head_grid%id , idum1, idum2 )
  35. CALL init_domain_nmm (grid &
  36. !
  37. #include <actual_new_args.inc>
  38. !
  39. )
  40. END SUBROUTINE init_domain
  41. !-------------------------------------------------------------------
  42. !---------------------------------------------------------------------
  43. SUBROUTINE init_domain_nmm ( grid &
  44. !
  45. # include <dummy_new_args.inc>
  46. !
  47. )
  48. USE module_optional_input
  49. IMPLICIT NONE
  50. ! Input space and data. No gridded meteorological data has been stored, though.
  51. ! TYPE (domain), POINTER :: grid
  52. TYPE (domain) :: grid
  53. # include <dummy_new_decl.inc>
  54. real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_metgrid_levels) :: ght_out
  55. real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_metgrid_levels) :: rh_out
  56. real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_metgrid_levels) :: t_out
  57. real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_metgrid_levels) :: u_out
  58. real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_metgrid_levels) :: v_out
  59. real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_land_cat) :: landusef_out
  60. real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_soil_cat) :: soilcbot_out
  61. real ,DIMENSION(grid%sm31:grid%em31,grid%sm32:grid%em32,1:grid%num_soil_cat) :: soilctop_out
  62. TYPE (grid_config_rec_type) :: config_flags
  63. ! Local domain indices and counters.
  64. INTEGER :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat
  65. INTEGER :: num_veg_gc , num_soil_top_gc , num_soil_bot_gc
  66. INTEGER :: &
  67. ids, ide, jds, jde, kds, kde, &
  68. ims, ime, jms, jme, kms, kme, &
  69. its, ite, jts, jte, kts, kte, &
  70. ips, ipe, jps, jpe, kps, kpe, &
  71. i, j, k, NNXP, NNYP
  72. ! Local data
  73. CHARACTER(LEN=19):: start_date
  74. #ifdef DM_PARALLEL
  75. LOGICAL,EXTERNAL :: WRF_DM_ON_MONITOR
  76. logical :: test
  77. ! INTEGER :: DOMDESC
  78. REAL,ALLOCATABLE :: SICE_G(:,:), SM_G(:,:)
  79. INTEGER, ALLOCATABLE:: IHE_G(:),IHW_G(:)
  80. INTEGER, ALLOCATABLE:: ITEMP(:,:)
  81. INTEGER :: my_e,my_n,my_s,my_w,my_ne,my_nw,my_se,my_sw,myi,myj,npe
  82. INTEGER :: istat,inpes,jnpes
  83. #else
  84. integer, allocatable:: ihw(:),ihe(:)
  85. #endif
  86. CHARACTER (LEN=255) :: message
  87. INTEGER :: error
  88. REAL :: p_surf, p_level
  89. REAL :: cof1, cof2
  90. REAL :: qvf , qvf1 , qvf2 , pd_surf
  91. REAL :: p00 , t00 , a
  92. REAL :: hold_znw, rmin,rmax
  93. REAL :: p_top_requested , ptsgm
  94. INTEGER :: num_metgrid_levels, ICOUNT
  95. REAL , DIMENSION(max_eta) :: eta_levels
  96. LOGICAL :: stretch_grid, dry_sounding, debug, log_flag_sst, hyb_coor
  97. REAL, ALLOCATABLE,DIMENSION(:,:):: ADUM2D,SNOWC,HT,TG_ALT, &
  98. PDVP,PSFC_OUTV
  99. REAL, ALLOCATABLE,DIMENSION(:,:,:):: P3D_OUT,P3DV_OUT,P3DV_IN, &
  100. QTMP,QTMP2
  101. INTEGER, ALLOCATABLE, DIMENSION(:):: KHL2,KVL2,KHH2,KVH2, &
  102. KHLA,KHHA,KVLA,KVHA
  103. ! INTEGER, ALLOCATABLE, DIMENSION(:,:):: grid%lu_index
  104. REAL, ALLOCATABLE, DIMENSION(:):: DXJ,WPDARJ,CPGFUJ,CURVJ, &
  105. FCPJ,FDIVJ,EMJ,EMTJ,FADJ, &
  106. HDACJ,DDMPUJ,DDMPVJ
  107. REAL, ALLOCATABLE,DIMENSION(:),SAVE:: SG1,SG2,DSG1,DSG2, &
  108. SGML1,SGML2
  109. !-- Carsel and Parrish [1988]
  110. REAL , DIMENSION(100) :: lqmi
  111. integer iicount
  112. REAL:: TPH0D,TLM0D
  113. REAL:: TPH0,WB,SB,TDLM,TDPH
  114. REAL:: WBI,SBI,EBI,ANBI,STPH0,CTPH0
  115. REAL:: TSPH,DTAD,DTCF
  116. REAL:: ACDT,CDDAMP,DXP,FP
  117. REAL:: WBD,SBD
  118. REAL:: RSNOW,SNOFAC
  119. REAL, PARAMETER:: SALP=2.60
  120. REAL, PARAMETER:: SNUP=0.040
  121. REAL:: SMCSUM,STCSUM,SEAICESUM,FISX
  122. REAL:: cur_smc, aposs_smc
  123. REAL:: COAC, CODAMP
  124. INTEGER,PARAMETER:: DOUBLE=SELECTED_REAL_KIND(15,300)
  125. REAL(KIND=DOUBLE):: TERM1,APH,TLM,TPH,DLM,DPH,STPH,CTPH
  126. INTEGER:: KHH,KVH,JAM,JA, IHL, IHH, L
  127. INTEGER:: II,JJ,ISRCH,ISUM,ITER,Ilook,Jlook
  128. REAL, PARAMETER:: DTR=0.01745329
  129. REAL, PARAMETER:: W_NMM=0.08
  130. #if defined(HWRF)
  131. REAL, PARAMETER:: DDFC=1.0
  132. #else
  133. REAL, PARAMETER:: DDFC=8.0
  134. #endif
  135. REAL, PARAMETER:: TWOM=.00014584
  136. REAL, PARAMETER:: CP=1004.6
  137. REAL, PARAMETER:: DFC=1.0
  138. REAL, PARAMETER:: ROI=916.6
  139. REAL, PARAMETER:: R=287.04
  140. REAL, PARAMETER:: CI=2060.0
  141. REAL, PARAMETER:: ROS=1500.
  142. REAL, PARAMETER:: CS=1339.2
  143. REAL, PARAMETER:: DS=0.050
  144. REAL, PARAMETER:: AKS=.0000005
  145. REAL, PARAMETER:: DZG=2.85
  146. REAL, PARAMETER:: DI=.1000
  147. REAL, PARAMETER:: AKI=0.000001075
  148. REAL, PARAMETER:: DZI=2.0
  149. REAL, PARAMETER:: THL=210.
  150. REAL, PARAMETER:: PLQ=70000.
  151. REAL, PARAMETER:: ERAD=6371200.
  152. REAL, PARAMETER:: TG0=258.16
  153. REAL, PARAMETER:: TGA=30.0
  154. integer :: numzero,numexamined
  155. #ifdef HWRF
  156. !============================================================================
  157. ! gopal's doing for ocean coupling
  158. !============================================================================
  159. REAL, DIMENSION(:,:), ALLOCATABLE :: NHLAT,NHLON,NVLAT,NVLON,HRES_SM
  160. REAL :: NDLMD,NDPHD,NWBD,NSBD
  161. INTEGER :: NIDE,NJDE,ILOC,JLOC
  162. INTEGER fid, ierr, nprocs
  163. CHARACTER*255 f65name, SysString
  164. !============================================================================
  165. ! end gopal's doing for ocean coupling
  166. !============================================================================
  167. #endif
  168. if (ALLOCATED(ADUM2D)) DEALLOCATE(ADUM2D)
  169. if (ALLOCATED(TG_ALT)) DEALLOCATE(TG_ALT)
  170. !#define COPY_IN
  171. !#include <scalar_derefs.inc>
  172. #ifdef DM_PARALLEL
  173. # include <data_calls.inc>
  174. #endif
  175. SELECT CASE ( model_data_order )
  176. CASE ( DATA_ORDER_ZXY )
  177. kds = grid%sd31 ; kde = grid%ed31 ;
  178. ids = grid%sd32 ; ide = grid%ed32 ;
  179. jds = grid%sd33 ; jde = grid%ed33 ;
  180. kms = grid%sm31 ; kme = grid%em31 ;
  181. ims = grid%sm32 ; ime = grid%em32 ;
  182. jms = grid%sm33 ; jme = grid%em33 ;
  183. kts = grid%sp31 ; kte = grid%ep31 ; ! tile is entire patch
  184. its = grid%sp32 ; ite = grid%ep32 ; ! tile is entire patch
  185. jts = grid%sp33 ; jte = grid%ep33 ; ! tile is entire patch
  186. CASE ( DATA_ORDER_XYZ )
  187. ids = grid%sd31 ; ide = grid%ed31 ;
  188. jds = grid%sd32 ; jde = grid%ed32 ;
  189. kds = grid%sd33 ; kde = grid%ed33 ;
  190. ims = grid%sm31 ; ime = grid%em31 ;
  191. jms = grid%sm32 ; jme = grid%em32 ;
  192. kms = grid%sm33 ; kme = grid%em33 ;
  193. its = grid%sp31 ; ite = grid%ep31 ; ! tile is entire patch
  194. jts = grid%sp32 ; jte = grid%ep32 ; ! tile is entire patch
  195. kts = grid%sp33 ; kte = grid%ep33 ; ! tile is entire patch
  196. CASE ( DATA_ORDER_XZY )
  197. ids = grid%sd31 ; ide = grid%ed31 ;
  198. kds = grid%sd32 ; kde = grid%ed32 ;
  199. jds = grid%sd33 ; jde = grid%ed33 ;
  200. ims = grid%sm31 ; ime = grid%em31 ;
  201. kms = grid%sm32 ; kme = grid%em32 ;
  202. jms = grid%sm33 ; jme = grid%em33 ;
  203. its = grid%sp31 ; ite = grid%ep31 ; ! tile is entire patch
  204. kts = grid%sp32 ; kte = grid%ep32 ; ! tile is entire patch
  205. jts = grid%sp33 ; jte = grid%ep33 ; ! tile is entire patch
  206. END SELECT
  207. #ifdef DM_PARALLEL
  208. CALL WRF_GET_MYPROC(MYPE)
  209. CALL WRF_GET_DM_COMMUNICATOR(MPI_COMM_COMP)
  210. call wrf_get_nprocx(inpes)
  211. call wrf_get_nprocy(jnpes)
  212. !
  213. allocate(itemp(inpes,jnpes),stat=istat)
  214. npe=0
  215. !
  216. do j=1,jnpes
  217. do i=1,inpes
  218. itemp(i,j)=npe
  219. if(npe==mype)then
  220. myi=i
  221. myj=j
  222. endif
  223. npe=npe+1
  224. enddo
  225. enddo
  226. !
  227. my_n=-1
  228. if(myj+1<=jnpes)my_n=itemp(myi,myj+1)
  229. !
  230. my_e=-1
  231. if(myi+1<=inpes)my_e=itemp(myi+1,myj)
  232. !
  233. my_s=-1
  234. if(myj-1>=1)my_s=itemp(myi,myj-1)
  235. !
  236. my_w=-1
  237. if(myi-1>=1)my_w=itemp(myi-1,myj)
  238. !
  239. my_ne=-1
  240. if((myi+1<=inpes).and.(myj+1<=jnpes)) &
  241. my_ne=itemp(myi+1,myj+1)
  242. !
  243. my_se=-1
  244. if((myi+1<=inpes).and.(myj-1>=1)) &
  245. my_se=itemp(myi+1,myj-1)
  246. !
  247. my_sw=-1
  248. if((myi-1>=1).and.(myj-1>=1)) &
  249. my_sw=itemp(myi-1,myj-1)
  250. !
  251. my_nw=-1
  252. if((myi-1>=1).and.(myj+1<=jnpes)) &
  253. my_nw=itemp(myi-1,myj+1)
  254. !
  255. ! my_neb(1)=my_n
  256. ! my_neb(2)=my_e
  257. ! my_neb(3)=my_s
  258. ! my_neb(4)=my_w
  259. ! my_neb(5)=my_ne
  260. ! my_neb(6)=my_se
  261. ! my_neb(7)=my_sw
  262. ! my_neb(8)=my_nw
  263. !
  264. deallocate(itemp)
  265. #endif
  266. grid%DT=float(grid%TIME_STEP)
  267. NNXP=min(ITE,IDE-1)
  268. NNYP=min(JTE,JDE-1)
  269. write(message,*) 'IDE, JDE: ', IDE,JDE
  270. write(message,*) 'NNXP, NNYP: ', NNXP,NNYP
  271. CALL wrf_message(message)
  272. JAM=6+2*(JDE-JDS-10)
  273. if (internal_time_loop .eq. 1) then
  274. ALLOCATE(ADUM2D(grid%sm31:grid%em31,jms:jme))
  275. ALLOCATE(KHL2(JTS:NNYP),KVL2(JTS:NNYP),KHH2(JTS:NNYP),KVH2(JTS:NNYP))
  276. ALLOCATE(DXJ(JTS:NNYP),WPDARJ(JTS:NNYP),CPGFUJ(JTS:NNYP),CURVJ(JTS:NNYP))
  277. ALLOCATE(FCPJ(JTS:NNYP),FDIVJ(JTS:NNYP),&
  278. FADJ(JTS:NNYP))
  279. ALLOCATE(HDACJ(JTS:NNYP),DDMPUJ(JTS:NNYP),DDMPVJ(JTS:NNYP))
  280. ALLOCATE(KHLA(JAM),KHHA(JAM))
  281. ALLOCATE(KVLA(JAM),KVHA(JAM))
  282. endif
  283. CALL model_to_grid_config_rec ( grid%id , model_config_rec , config_flags )
  284. IF ( CONFIG_FLAGS%FRACTIONAL_SEAICE == 1 ) THEN
  285. CALL WRF_ERROR_FATAL("NMM cannot use FRACTIONAL_SEAICE = 1")
  286. ENDIF
  287. if ( config_flags%bl_pbl_physics == BOULACSCHEME ) then
  288. call wrf_error_fatal("Cannot use BOULAC PBL with NMM")
  289. endif
  290. write(message,*) 'cen_lat: ', config_flags%cen_lat
  291. CALL wrf_debug(100,message)
  292. write(message,*) 'cen_lon: ', config_flags%cen_lon
  293. CALL wrf_debug(100,message)
  294. write(message,*) 'dx: ', config_flags%dx
  295. CALL wrf_debug(100,message)
  296. write(message,*) 'dy: ', config_flags%dy
  297. CALL wrf_debug(100,message)
  298. write(message,*) 'config_flags%start_year: ', config_flags%start_year
  299. CALL wrf_debug(100,message)
  300. write(message,*) 'config_flags%start_month: ', config_flags%start_month
  301. CALL wrf_debug(100,message)
  302. write(message,*) 'config_flags%start_day: ', config_flags%start_day
  303. CALL wrf_debug(100,message)
  304. write(message,*) 'config_flags%start_hour: ', config_flags%start_hour
  305. CALL wrf_debug(100,message)
  306. write(start_date,435) config_flags%start_year, config_flags%start_month, &
  307. config_flags%start_day, config_flags%start_hour
  308. 435 format(I4,'-',I2.2,'-',I2.2,'_',I2.2,':00:00')
  309. grid%dlmd=config_flags%dx
  310. grid%dphd=config_flags%dy
  311. tph0d=config_flags%cen_lat
  312. tlm0d=config_flags%cen_lon
  313. !==========================================================================
  314. !!
  315. ! Check to see if the boundary conditions are set
  316. ! properly in the namelist file.
  317. ! This checks for sufficiency and redundancy.
  318. CALL boundary_condition_check( config_flags, bdyzone, error, grid%id )
  319. ! Some sort of "this is the first time" initialization. Who knows.
  320. grid%itimestep=0
  321. ! Pull in the info in the namelist to compare it to the input data.
  322. grid%real_data_init_type = model_config_rec%real_data_init_type
  323. write(message,*) 'what is flag_metgrid: ', flag_metgrid
  324. CALL wrf_message(message)
  325. IF ( flag_metgrid .EQ. 1 ) THEN ! <----- START OF VERTICAL INTERPOLATION PART ---->
  326. num_metgrid_levels = grid%num_metgrid_levels
  327. !---------------------------------------------------------------------
  328. !
  329. ! gopal's doing for ideal cases
  330. !
  331. num_veg_gc = SIZE ( grid%landusef_gc , DIM=3 )
  332. num_soil_top_gc = SIZE ( grid%soilctop_gc , DIM=3 )
  333. num_soil_bot_gc = SIZE ( grid%soilcbot_gc , DIM=3 )
  334. #ifdef DM_PARALLEL
  335. ips=its ; ipe=ite ; jps=jts ; jpe=jte ; kps=kts ; kpe=kte
  336. !JWB # include "HALO_NMM_IDEAL_1.inc"
  337. #endif
  338. !
  339. CALL vortex ( grid%ght_gc,grid%rh_gc,grid%t_gc,grid%u_gc,grid%v_gc,grid%p_gc &
  340. &, ght_out,rh_out,t_out,u_out,v_out &
  341. &, grid%ht_gc,grid%tsk_gc,grid%xice_gc &
  342. &, grid%hlat_gc,grid%hlon_gc,grid%vlat_gc,grid%vlon_gc &
  343. &, grid%greenfrac_gc,grid%albedo12m_gc,grid%landusef_gc &
  344. &, grid%soilctop_gc,grid%soilcbot_gc &
  345. &, landusef_out,soilctop_out,soilcbot_out &
  346. &, num_veg_gc,num_soil_top_gc,num_soil_bot_gc &
  347. &, config_flags%dx,internal_time_loop &
  348. &, 1,grid%num_metgrid_levels &
  349. &, ids,ide,jds,jde,kds,kde &
  350. &, ims,ime,jms,jme,kms,kme &
  351. &, its,ite,jts,jte,kts,kte )
  352. !----------------------------------------------------------------------
  353. IF (grid%ght_gc(its,jts,num_metgrid_levels/2) .lt. grid%ght_gc(its,jts,num_metgrid_levels/2+1)) THEN
  354. write(message,*) 'normal ground up file order'
  355. hyb_coor=.false.
  356. CALL wrf_message(message)
  357. ELSE
  358. hyb_coor=.true.
  359. write(message,*) 'reverse the order of coordinate'
  360. CALL wrf_message(message)
  361. CALL reverse_vert_coord(grid%ght_gc, 2, num_metgrid_levels &
  362. &, IDS,IDE,JDS,JDE,KDS,KDE &
  363. &, IMS,IME,JMS,JME,KMS,KME &
  364. &, ITS,ITE,JTS,JTE,KTS,KTE )
  365. #if defined(HWRF)
  366. if(.not. grid%use_prep_hybrid) then
  367. #endif
  368. CALL reverse_vert_coord(grid%p_gc, 2, num_metgrid_levels &
  369. &, IDS,IDE,JDS,JDE,KDS,KDE &
  370. &, IMS,IME,JMS,JME,KMS,KME &
  371. &, ITS,ITE,JTS,JTE,KTS,KTE )
  372. CALL reverse_vert_coord(grid%t_gc, 2, num_metgrid_levels &
  373. &, IDS,IDE,JDS,JDE,KDS,KDE &
  374. &, IMS,IME,JMS,JME,KMS,KME &
  375. &, ITS,ITE,JTS,JTE,KTS,KTE )
  376. CALL reverse_vert_coord(grid%u_gc, 2, num_metgrid_levels &
  377. &, IDS,IDE,JDS,JDE,KDS,KDE &
  378. &, IMS,IME,JMS,JME,KMS,KME &
  379. &, ITS,ITE,JTS,JTE,KTS,KTE )
  380. CALL reverse_vert_coord(grid%v_gc, 2, num_metgrid_levels &
  381. &, IDS,IDE,JDS,JDE,KDS,KDE &
  382. &, IMS,IME,JMS,JME,KMS,KME &
  383. &, ITS,ITE,JTS,JTE,KTS,KTE )
  384. CALL reverse_vert_coord(grid%rh_gc, 2, num_metgrid_levels &
  385. &, IDS,IDE,JDS,JDE,KDS,KDE &
  386. &, IMS,IME,JMS,JME,KMS,KME &
  387. &, ITS,ITE,JTS,JTE,KTS,KTE )
  388. #if defined(HWRF)
  389. endif
  390. #endif
  391. endif
  392. IF (hyb_coor) THEN
  393. ! limit extreme deviations from source model topography
  394. ! due to potential for nasty extrapolation/interpolation issues
  395. !
  396. write(message,*) 'min, max of grid%ht_gc before adjust: ', minval(grid%ht_gc), maxval(grid%ht_gc)
  397. CALL wrf_debug(100,message)
  398. ICOUNT=0
  399. DO J=JTS,min(JTE,JDE-1)
  400. DO I=ITS,min(ITE,IDE-1)
  401. IF ((grid%ht_gc(I,J) - grid%ght_gc(I,J,2)) .LT. -150.) THEN
  402. grid%ht_gc(I,J)=grid%ght_gc(I,J,2)-150.
  403. IF (ICOUNT .LT. 20) THEN
  404. write(message,*) 'increasing NMM topo toward RUC ', I,J
  405. CALL wrf_debug(100,message)
  406. ICOUNT=ICOUNT+1
  407. ENDIF
  408. ELSEIF ((grid%ht_gc(I,J) - grid%ght_gc(I,J,2)) .GT. 150.) THEN
  409. grid%ht_gc(I,J)=grid%ght_gc(I,J,2)+150.
  410. IF (ICOUNT .LT. 20) THEN
  411. write(message,*) 'decreasing NMM topo toward RUC ', I,J
  412. CALL wrf_debug(100,message)
  413. ICOUNT=ICOUNT+1
  414. ENDIF
  415. ENDIF
  416. END DO
  417. END DO
  418. write(message,*) 'min, max of ht_gc after correct: ', minval(grid%ht_gc), maxval(grid%ht_gc)
  419. CALL wrf_debug(100,message)
  420. ENDIF
  421. CALL boundary_smooth(grid%ht_gc,grid%landmask, grid, 12 , 12 &
  422. &, IDS,IDE,JDS,JDE,KDS,KDE &
  423. &, IMS,IME,JMS,JME,KMS,KME &
  424. &, ITS,ITE,JTS,JTE,KTS,KTE )
  425. DO j = jts, MIN(jte,jde-1)
  426. DO i = its, MIN(ite,ide-1)
  427. if (grid%landmask(I,J) .gt. 0.5) grid%sm(I,J)=0.
  428. if (grid%landmask(I,J) .le. 0.5) grid%sm(I,J)=1.
  429. if (grid%tsk_gc(I,J) .gt. 0.) then
  430. grid%nmm_tsk(I,J)=grid%tsk_gc(I,J)
  431. else
  432. #if defined(HWRF)
  433. if(grid%use_prep_hybrid) then
  434. if(grid%t(I,J,1)<100) then
  435. write(*,*) 'NO VALID SURFACE TEMPERATURE: I,J,TSK_GC(I,J),T(I,J,1) = ', &
  436. I,J,grid%TSK_GC(I,J),grid%T(I,J,1)
  437. else
  438. grid%nmm_tsk(I,J)=grid%t(I,J,1) ! stopgap measure
  439. end if
  440. else
  441. #endif
  442. grid%nmm_tsk(I,J)=grid%t_gc(I,J,1) ! stopgap measure
  443. #if defined(HWRF)
  444. endif
  445. #endif
  446. endif
  447. !
  448. grid%glat(I,J)=grid%hlat_gc(I,J)*DEGRAD
  449. grid%glon(I,J)=grid%hlon_gc(I,J)*DEGRAD
  450. grid%weasd(I,J)=grid%snow(I,J)
  451. grid%xice(I,J)=grid%xice_gc(I,J)
  452. ENDDO
  453. ENDDO
  454. ! First item is to define the target vertical coordinate
  455. num_metgrid_levels = grid%num_metgrid_levels
  456. eta_levels(1:kde) = model_config_rec%eta_levels(1:kde)
  457. ptsgm = model_config_rec%ptsgm
  458. p_top_requested = grid%p_top_requested
  459. grid%pt=p_top_requested
  460. if (internal_time_loop .eq. 1) then
  461. if (eta_levels(1) .ne. 1.0) then
  462. #if defined(HWRF)
  463. if(grid%use_prep_hybrid) then
  464. call wrf_error_fatal('PREP_HYBRID ERROR: eta_levels is not specified, but use_prep_hybrid=.true.')
  465. end if
  466. #endif
  467. write(message,*) '********************************************************************* '
  468. CALL wrf_message(message)
  469. write(message,*) '** eta_levels appears not to be specified in the namelist'
  470. CALL wrf_message(message)
  471. write(message,*) '** We will call compute_nmm_levels to define layer thicknesses.'
  472. CALL wrf_message(message)
  473. write(message,*) '** These levels should be reasonable for running the model, '
  474. CALL wrf_message(message)
  475. write(message,*) '** but may not be ideal for the simulation being made. Consider '
  476. CALL wrf_message(message)
  477. write(message,*) '** defining your own levels by specifying eta_levels in the model '
  478. CALL wrf_message(message)
  479. write(message,*) '** namelist. '
  480. CALL wrf_message(message)
  481. write(message,*) '********************************************************************** '
  482. CALL wrf_message(message)
  483. CALL compute_nmm_levels(KDE,p_top_requested,eta_levels)
  484. DO L=1,KDE
  485. write(message,*) 'L, eta_levels(L) returned :: ', L,eta_levels(L)
  486. CALL wrf_message(message)
  487. ENDDO
  488. endif
  489. write(message,*) 'KDE-1: ', KDE-1
  490. CALL wrf_debug(1,message)
  491. allocate(SG1(1:KDE-1))
  492. allocate(SG2(1:KDE-1))
  493. allocate(DSG1(1:KDE-1))
  494. allocate(DSG2(1:KDE-1))
  495. allocate(SGML1(1:KDE))
  496. allocate(SGML2(1:KDE))
  497. CALL define_nmm_vertical_coord (kde-1, ptsgm, grid%pt,grid%pdtop, eta_levels, &
  498. grid%eta1,grid%deta1,grid%aeta1, &
  499. grid%eta2,grid%deta2,grid%aeta2, grid%dfl, grid%dfrlg )
  500. DO L=KDS,KDE-1
  501. grid%deta(L)=eta_levels(L)-eta_levels(L+1)
  502. ENDDO
  503. endif
  504. write(message,*) 'num_metgrid_levels: ', num_metgrid_levels
  505. CALL wrf_message(message)
  506. DO j = jts, MIN(jte,jde-1)
  507. DO i = its, MIN(ite,ide-1)
  508. grid%fis(I,J)=grid%ht_gc(I,J)*g
  509. !
  510. ! IF ( grid%p_gc(I,J,1) .ne. 200100. .AND. (grid%ht_gc(I,J) .eq. grid%ght_gc(I,J,1)) .AND. grid%ht_gc(I,J) .ne. 0) THEN
  511. IF ( grid%p_gc(I,J,1) .ne. 200100. .AND. (abs(grid%ht_gc(I,J)-grid%ght_gc(I,J,1)) .lt. 0.01) .AND. grid%ht_gc(I,J) .ne. 0) THEN
  512. IF (mod(I,10) .eq. 0 .and. mod(J,10) .eq. 0) THEN
  513. write(message,*) 'grid%ht_gc and grid%toposoil to swap, flag_soilhgt ::: ', &
  514. I,J, grid%ht_gc(I,J),grid%toposoil(I,J),flag_soilhgt
  515. CALL wrf_debug(10,message)
  516. ENDIF
  517. IF ( ( flag_soilhgt.EQ. 1 ) ) THEN
  518. grid%ght_gc(I,J,1)=grid%toposoil(I,J)
  519. ENDIF
  520. ENDIF
  521. ENDDO
  522. ENDDO
  523. numzero=0
  524. numexamined=0
  525. DO j = jts, MIN(jte,jde-1)
  526. DO i = its, MIN(ite,ide-1)
  527. numexamined=numexamined+1
  528. if(grid%fis(i,j)<1e-5 .and. grid%fis(i,j)>-1e5 ) then
  529. numzero=numzero+1
  530. end if
  531. enddo
  532. enddo
  533. write(message,*) 'TOTAL NEAR-ZERO FIS POINTS: ',numzero,' OF ',numexamined
  534. call wrf_debug(10,message)
  535. #if defined(HWRF)
  536. interp_notph: if(.not. grid%use_prep_hybrid) then
  537. #endif
  538. if (.NOT. allocated(PDVP)) allocate(PDVP(IMS:IME,JMS:JME))
  539. if (.NOT. allocated(P3D_OUT)) allocate(P3D_OUT(IMS:IME,JMS:JME,KDS:KDE-1))
  540. if (.NOT. allocated(PSFC_OUTV)) allocate(PSFC_OUTV(IMS:IME,JMS:JME))
  541. if (.NOT. allocated(P3DV_OUT)) allocate(P3DV_OUT(IMS:IME,JMS:JME,KDS:KDE-1))
  542. if (.NOT. allocated(P3DV_IN)) allocate(P3DV_IN(IMS:IME,JMS:JME,num_metgrid_levels))
  543. CALL compute_nmm_surfacep (grid%ht_gc, grid%ght_gc, grid%p_gc , grid%t_gc &
  544. &, grid%psfc_out, num_metgrid_levels &
  545. &, IDS,IDE,JDS,JDE,KDS,KDE &
  546. &, IMS,IME,JMS,JME,KMS,KME &
  547. &, ITS,ITE,JTS,JTE,KTS,KTE ) ! H points
  548. if (internal_time_loop .eq. 1) then
  549. write(message,*) 'psfc points (final combined)'
  550. loopinc=max( (JTE-JTS)/20,1)
  551. iloopinc=max( (ITE-ITS)/10,1)
  552. CALL wrf_message(message)
  553. DO J=min(JTE,JDE-1),JTS,-loopinc
  554. write(message,633) (grid%psfc_out(I,J)/100.,I=its,min(ite,IDE-1),iloopinc)
  555. CALL wrf_message(message)
  556. ENDDO
  557. endif
  558. 633 format(35(f5.0,1x))
  559. CALL compute_3d_pressure (grid%psfc_out,grid%aeta1,grid%aeta2 &
  560. &, grid%pdtop,grid%pt,grid%pd,p3d_out &
  561. &, IDS,IDE,JDS,JDE,KDS,KDE &
  562. &, IMS,IME,JMS,JME,KMS,KME &
  563. &, ITS,ITE,JTS,JTE,KTS,KTE )
  564. #ifdef DM_PARALLEL
  565. ips=its ; ipe=ite ; jps=jts ; jpe=jte ; kps=kts ; kpe=kte
  566. # include "HALO_NMM_MG2.inc"
  567. #endif
  568. #ifdef DM_PARALLEL
  569. # include "HALO_NMM_MG3.inc"
  570. #endif
  571. do K=1,num_metgrid_levels
  572. do J=JTS,min(JTE,JDE-1)
  573. do I=ITS,min(ITE,IDE-1)
  574. IF (K .eq. KTS) THEN
  575. IF (J .eq. JDS .and. I .lt. IDE-1) THEN ! S boundary
  576. PDVP(I,J)=0.5*(grid%pd(I,J)+grid%pd(I+1,J))
  577. PSFC_OUTV(I,J)=0.5*(grid%psfc_out(I,J)+grid%psfc_out(I+1,J))
  578. ELSEIF (J .eq. JDE-1 .and. I .lt. IDE-1) THEN ! N boundary
  579. PDVP(I,J)=0.5*(grid%pd(I,J)+grid%pd(I+1,J))
  580. PSFC_OUTV(I,J)=0.5*(grid%psfc_out(I,J)+grid%psfc_out(I+1,J))
  581. ELSEIF (I .eq. IDS .and. mod(J,2) .eq. 0) THEN ! W boundary
  582. PDVP(I,J)=0.5*(grid%pd(I,J-1)+grid%pd(I,J+1))
  583. PSFC_OUTV(I,J)=0.5*(grid%psfc_out(I,J-1)+grid%psfc_out(I,J+1))
  584. ELSEIF (I .eq. IDE-1 .and. mod(J,2) .eq. 0) THEN ! E boundary
  585. PDVP(I,J)=0.5*(grid%pd(I,J-1)+grid%pd(I,J+1))
  586. PSFC_OUTV(I,J)=0.5*(grid%psfc_out(I,J-1)+grid%psfc_out(I,J+1))
  587. ELSEIF (I .eq. IDE-1 .and. mod(J,2) .eq. 1) THEN ! phantom E boundary
  588. PDVP(I,J)=grid%pd(I,J)
  589. PSFC_OUTV(I,J)=grid%psfc_out(I,J)
  590. ELSEIF (mod(J,2) .eq. 0) THEN ! interior even row
  591. PDVP(I,J)=0.25*(grid%pd(I,J)+grid%pd(I-1,J)+grid%pd(I,J+1)+grid%pd(I,J-1))
  592. PSFC_OUTV(I,J)=0.25*(grid%psfc_out(I,J)+grid%psfc_out(I-1,J)+ &
  593. grid%psfc_out(I,J+1)+grid%psfc_out(I,J-1))
  594. ELSE ! interior odd row
  595. PDVP(I,J)=0.25*(grid%pd(I,J)+grid%pd(I+1,J)+grid%pd(I,J+1)+grid%pd(I,J-1))
  596. PSFC_OUTV(I,J)=0.25*(grid%psfc_out(I,J)+grid%psfc_out(I+1,J)+ &
  597. grid%psfc_out(I,J+1)+grid%psfc_out(I,J-1))
  598. ENDIF
  599. ENDIF
  600. IF (J .eq. JDS .and. I .lt. IDE-1) THEN ! S boundary
  601. P3DV_IN(I,J,K)=0.5*(grid%p_gc(I,J,K)+grid%p_gc(I+1,J,K))
  602. ELSEIF (J .eq. JDE-1 .and. I .lt. IDE-1) THEN ! N boundary
  603. P3DV_IN(I,J,K)=0.5*(grid%p_gc(I,J,K)+grid%p_gc(I+1,J,K))
  604. ELSEIF (I .eq. IDS .and. mod(J,2) .eq. 0) THEN ! W boundary
  605. P3DV_IN(I,J,K)=0.5*(grid%p_gc(I,J-1,K)+grid%p_gc(I,J+1,K))
  606. ELSEIF (I .eq. IDE-1 .and. mod(J,2) .eq. 0) THEN ! E boundary
  607. P3DV_IN(I,J,K)=0.5*(grid%p_gc(I,J-1,K)+grid%p_gc(I,J+1,K))
  608. ELSEIF (I .eq. IDE-1 .and. mod(J,2) .eq. 1) THEN ! phantom E boundary
  609. P3DV_IN(I,J,K)=grid%p_gc(I,J,K)
  610. ELSEIF (mod(J,2) .eq. 0) THEN ! interior even row
  611. P3DV_IN(I,J,K)=0.25*(grid%p_gc(I,J,K)+grid%p_gc(I-1,J,K) + &
  612. grid%p_gc(I,J+1,K)+grid%p_gc(I,J-1,K))
  613. ELSE ! interior odd row
  614. P3DV_IN(I,J,K)=0.25*(grid%p_gc(I,J,K)+grid%p_gc(I+1,J,K) + &
  615. grid%p_gc(I,J+1,K)+grid%p_gc(I,J-1,K))
  616. ENDIF
  617. enddo
  618. enddo
  619. enddo
  620. CALL compute_3d_pressure (psfc_outv,grid%aeta1,grid%aeta2 &
  621. &, grid%pdtop,grid%pt,pdvp,p3dv_out &
  622. &, IDS,IDE,JDS,JDE,KDS,KDE &
  623. &, IMS,IME,JMS,JME,KMS,KME &
  624. &, ITS,ITE,JTS,JTE,KTS,KTE )
  625. CALL interp_press2press_lin(grid%p_gc, p3d_out &
  626. &, grid%t_gc, grid%t,num_metgrid_levels &
  627. &, .TRUE.,.TRUE.,.TRUE. & ! extrap, ignore_lowest, t_field
  628. &, IDS,IDE,JDS,JDE,KDS,KDE &
  629. &, IMS,IME,JMS,JME,KMS,KME &
  630. &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time_loop )
  631. CALL interp_press2press_lin(p3dv_in, p3dv_out &
  632. &, grid%u_gc, grid%u,num_metgrid_levels &
  633. &, .FALSE.,.TRUE.,.FALSE. &
  634. &, IDS,IDE,JDS,JDE,KDS,KDE &
  635. &, IMS,IME,JMS,JME,KMS,KME &
  636. &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time_loop )
  637. CALL interp_press2press_lin(p3dv_in, p3dv_out &
  638. &, grid%v_gc, grid%v,num_metgrid_levels &
  639. &, .FALSE.,.TRUE.,.FALSE. &
  640. &, IDS,IDE,JDS,JDE,KDS,KDE &
  641. &, IMS,IME,JMS,JME,KMS,KME &
  642. &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time_loop )
  643. IF (hyb_coor) THEN
  644. CALL wind_adjust(p3dv_in,p3dv_out,grid%u_gc,grid%v_gc,grid%u,grid%v &
  645. &, num_metgrid_levels,5000. &
  646. &, IDS,IDE,JDS,JDE,KDS,KDE &
  647. &, IMS,IME,JMS,JME,KMS,KME &
  648. &, ITS,ITE,JTS,JTE,KTS,KTE )
  649. ENDIF
  650. ALLOCATE(qtmp(IMS:IME,JMS:JME,num_metgrid_levels))
  651. ALLOCATE(qtmp2(IMS:IME,JMS:JME,num_metgrid_levels))
  652. CALL rh_to_mxrat (grid%rh_gc, grid%t_gc, grid%p_gc, qtmp , .TRUE. , &
  653. ids , ide , jds , jde , 1 , num_metgrid_levels , &
  654. ims , ime , jms , jme , 1 , num_metgrid_levels , &
  655. its , ite , jts , jte , 1 , num_metgrid_levels )
  656. do K=1,num_metgrid_levels
  657. do J=JTS,min(JTE,JDE-1)
  658. do I=ITS,min(ITE,IDE-1)
  659. QTMP2(I,J,K)=QTMP(I,J,K)/(1.0+QTMP(I,J,K))
  660. end do
  661. end do
  662. end do
  663. CALL interp_press2press_log(grid%p_gc, p3d_out &
  664. &, QTMP2, grid%q,num_metgrid_levels &
  665. &, .FALSE.,.TRUE. &
  666. &, IDS,IDE,JDS,JDE,KDS,KDE &
  667. &, IMS,IME,JMS,JME,KMS,KME &
  668. &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time_loop )
  669. IF (ALLOCATED(QTMP)) DEALLOCATE(QTMP)
  670. IF (ALLOCATED(QTMP)) DEALLOCATE(QTMP2)
  671. #if defined(HWRF)
  672. else ! we are using prep_hybrid
  673. ! Compute surface pressure:
  674. grid%psfc_out=grid%pdtop+grid%pd
  675. end if interp_notph
  676. #endif
  677. ! Get the monthly values interpolated to the current date
  678. ! for the traditional monthly
  679. ! fields of green-ness fraction and background grid%albedo.
  680. if (internal_time_loop .eq. 1 .or. config_flags%sst_update .eq. 1) then
  681. CALL monthly_interp_to_date ( grid%greenfrac_gc , current_date , grid%vegfra , &
  682. ids , ide , jds , jde , kds , kde , &
  683. ims , ime , jms , jme , kms , kme , &
  684. its , ite , jts , jte , kts , kte )
  685. CALL monthly_interp_to_date ( grid%albedo12m_gc , current_date , grid%albbck , &
  686. ids , ide , jds , jde , kds , kde , &
  687. ims , ime , jms , jme , kms , kme , &
  688. its , ite , jts , jte , kts , kte )
  689. ! Get the min/max of each i,j for the monthly green-ness fraction.
  690. CALL monthly_min_max ( grid%greenfrac_gc , grid%shdmin , grid%shdmax , &
  691. ids , ide , jds , jde , kds , kde , &
  692. ims , ime , jms , jme , kms , kme , &
  693. its , ite , jts , jte , kts , kte )
  694. ! The model expects the green-ness values in percent, not fraction.
  695. DO j = jts, MIN(jte,jde-1)
  696. DO i = its, MIN(ite,ide-1)
  697. !! grid%vegfra(i,j) = grid%vegfra(i,j) * 100.
  698. grid%shdmax(i,j) = grid%shdmax(i,j) * 100.
  699. grid%shdmin(i,j) = grid%shdmin(i,j) * 100.
  700. grid%vegfrc(I,J)=grid%vegfra(I,J)
  701. END DO
  702. END DO
  703. ! The model expects the albedo fields as
  704. ! a fraction, not a percent. Set the water values to 8%.
  705. DO j = jts, MIN(jte,jde-1)
  706. DO i = its, MIN(ite,ide-1)
  707. if (grid%albbck(i,j) .lt. 5.) then
  708. write(message,*) 'reset albedo to 8%... I,J,albbck:: ', I,J,grid%albbck(I,J)
  709. CALL wrf_debug(10,message)
  710. grid%albbck(I,J)=8.
  711. endif
  712. grid%albbck(i,j) = grid%albbck(i,j) / 100.
  713. grid%snoalb(i,j) = grid%snoalb(i,j) / 100.
  714. IF ( grid%landmask(i,j) .LT. 0.5 ) THEN
  715. grid%albbck(i,j) = 0.08
  716. grid%snoalb(i,j) = 0.08
  717. END IF
  718. grid%albase(i,j)=grid%albbck(i,j)
  719. grid%mxsnal(i,j)=grid%snoalb(i,j)
  720. END DO
  721. END DO
  722. endif
  723. #if defined(HWRF)
  724. if(.not.grid%use_prep_hybrid) then
  725. #endif
  726. ! new deallocs
  727. DEALLOCATE(p3d_out,p3dv_out,p3dv_in)
  728. #if defined(HWRF)
  729. end if
  730. #endif
  731. END IF ! <----- END OF VERTICAL INTERPOLATION PART ---->
  732. !! compute SST at each time if updating SST
  733. if (config_flags%sst_update == 1) then
  734. DO j = jts, MIN(jde-1,jte)
  735. DO i = its, MIN(ide-1,ite)
  736. if (grid%SM(I,J) .lt. 0.5) then
  737. grid%SST(I,J)=0.
  738. endif
  739. if (grid%SM(I,J) .gt. 0.5) then
  740. grid%SST(I,J)=grid%NMM_TSK(I,J)
  741. grid%NMM_TSK(I,J)=0.
  742. endif
  743. IF ( (grid%NMM_TSK(I,J)+grid%SST(I,J)) .lt. 200. .or. &
  744. (grid%NMM_TSK(I,J)+grid%SST(I,J)) .gt. 350. ) THEN
  745. write(message,*) 'TSK, SST trouble at : ', I,J
  746. CALL wrf_message(message)
  747. write(message,*) 'SM, NMM_TSK,SST ', grid%SM(I,J),grid%NMM_TSK(I,J),grid%SST(I,J)
  748. CALL wrf_message(message)
  749. ENDIF
  750. ENDDO
  751. ENDDO
  752. endif ! sst_update test
  753. if (internal_time_loop .eq. 1) then
  754. !!! weasd has "snow water equivalent" in mm
  755. DO j = jts, MIN(jte,jde-1)
  756. DO i = its, MIN(ite,ide-1)
  757. IF(grid%sm(I,J).GT.0.9) THEN
  758. IF (grid%xice(I,J) .gt. 0) then
  759. grid%si(I,J)=1.0
  760. ENDIF
  761. ! SEA
  762. grid%epsr(I,J)=.97
  763. grid%embck(I,J)=.97
  764. grid%gffc(I,J)=0.
  765. grid%albedo(I,J)=.06
  766. grid%albase(I,J)=.06
  767. IF(grid%si (I,J).GT.0. ) THEN
  768. ! SEA-ICE
  769. grid%sm(I,J)=0.
  770. grid%si(I,J)=0.
  771. grid%sice(I,J)=1.
  772. grid%gffc(I,J)=0. ! just leave zero as irrelevant
  773. grid%albedo(I,J)=.60
  774. grid%albase(I,J)=.60
  775. ENDIF
  776. ELSE
  777. grid%si(I,J)=5.0*grid%weasd(I,J)/1000.
  778. ! LAND
  779. grid%epsr(I,J)=1.0
  780. grid%embck(I,J)=1.0
  781. grid%gffc(I,J)=0.0 ! just leave zero as irrelevant
  782. grid%sice(I,J)=0.
  783. grid%sno(I,J)=grid%si(I,J)*.20
  784. ENDIF
  785. ENDDO
  786. ENDDO
  787. ! DETERMINE grid%albedo OVER LAND
  788. DO j = jts, MIN(jte,jde-1)
  789. DO i = its, MIN(ite,ide-1)
  790. IF(grid%sm(I,J).LT.0.9.AND.grid%sice(I,J).LT.0.9) THEN
  791. ! SNOWFREE albedo
  792. IF ( (grid%sno(I,J) .EQ. 0.0) .OR. &
  793. (grid%albase(I,J) .GE. grid%mxsnal(I,J) ) ) THEN
  794. grid%albedo(I,J) = grid%albase(I,J)
  795. ELSE
  796. ! MODIFY albedo IF SNOWCOVER:
  797. ! BELOW SNOWDEPTH THRESHOLD...
  798. IF (grid%sno(I,J) .LT. SNUP) THEN
  799. RSNOW = grid%sno(I,J)/SNUP
  800. SNOFAC = 1. - ( EXP(-SALP*RSNOW) - RSNOW*EXP(-SALP))
  801. ! ABOVE SNOWDEPTH THRESHOLD...
  802. ELSE
  803. SNOFAC = 1.0
  804. ENDIF
  805. ! CALCULATE grid%albedo ACCOUNTING FOR SNOWDEPTH AND VGFRCK
  806. grid%albedo(I,J) = grid%albase(I,J) &
  807. + (1.0-grid%vegfra(I,J))*SNOFAC*(grid%mxsnal(I,J)-grid%albase(I,J))
  808. ENDIF
  809. END IF
  810. grid%si(I,J)=5.0*grid%weasd(I,J)
  811. grid%sno(I,J)=grid%weasd(I,J)
  812. !! convert vegfra
  813. grid%vegfra(I,J)=grid%vegfra(I,J)*100.
  814. !
  815. ENDDO
  816. ENDDO
  817. #ifdef DM_PARALLEL
  818. ALLOCATE(SM_G(IDS:IDE,JDS:JDE),SICE_G(IDS:IDE,JDS:JDE))
  819. CALL WRF_PATCH_TO_GLOBAL_REAL( grid%sice(IMS,JMS) &
  820. &, SICE_G,grid%DOMDESC &
  821. &, 'z','xy' &
  822. &, IDS,IDE-1,JDS,JDE-1,1,1 &
  823. &, IMS,IME,JMS,JME,1,1 &
  824. &, ITS,ITE,JTS,JTE,1,1 )
  825. CALL WRF_PATCH_TO_GLOBAL_REAL( grid%sm(IMS,JMS) &
  826. &, SM_G,grid%DOMDESC &
  827. &, 'z','xy' &
  828. &, IDS,IDE-1,JDS,JDE-1,1,1 &
  829. &, IMS,IME,JMS,JME,1,1 &
  830. &, ITS,ITE,JTS,JTE,1,1 )
  831. IF (WRF_DM_ON_MONITOR()) THEN
  832. 637 format(40(f3.0,1x))
  833. allocate(IHE_G(JDS:JDE-1),IHW_G(JDS:JDE-1))
  834. DO j = JDS, JDE-1
  835. IHE_G(J)=MOD(J+1,2)
  836. IHW_G(J)=IHE_G(J)-1
  837. ENDDO
  838. DO ITER=1,10
  839. DO j = jds+1, (jde-1)-1
  840. DO i = ids+1, (ide-1)-1
  841. ! any sea ice around point in question?
  842. IF (SM_G(I,J) .ge. 0.9) THEN
  843. SEAICESUM=SICE_G(I+IHE_G(J),J+1)+SICE_G(I+IHW_G(J),J+1)+ &
  844. SICE_G(I+IHE_G(J),J-1)+SICE_G(I+IHW_G(J),J-1)
  845. IF (SEAICESUM .ge. 1. .and. SEAICESUM .lt. 3.) THEN
  846. IF ((SICE_G(I+IHE_G(J),J+1).lt.0.1 .and. SM_G(I+IHE_G(J),J+1).lt.0.1) .OR. &
  847. (SICE_G(I+IHW_G(J),J+1).lt.0.1 .and. SM_G(I+IHW_G(J),J+1).lt.0.1) .OR. &
  848. (SICE_G(I+IHE_G(J),J-1).lt.0.1 .and. SM_G(I+IHE_G(J),J-1).lt.0.1) .OR. &
  849. (SICE_G(I+IHW_G(J),J-1).lt.0.1 .and. SM_G(I+IHW_G(J),J-1).lt.0.1)) THEN
  850. ! HAVE SEA ICE AND A SURROUNDING LAND POINT - CONVERT TO SEA ICE
  851. write(message,*) 'making seaice (1): ', I,J
  852. CALL wrf_debug(100,message)
  853. SICE_G(I,J)=1.0
  854. SM_G(I,J)=0.
  855. ENDIF
  856. ELSEIF (SEAICESUM .ge. 3) THEN
  857. ! WATER POINT SURROUNDED BY ICE - CONVERT TO SEA ICE
  858. write(message,*) 'making seaice (2): ', I,J
  859. CALL wrf_debug(100,message)
  860. SICE_G(I,J)=1.0
  861. SM_G(I,J)=0.
  862. ENDIF
  863. ENDIF
  864. ENDDO
  865. ENDDO
  866. ENDDO
  867. ENDIF
  868. CALL WRF_GLOBAL_TO_PATCH_REAL( SICE_G, grid%sice &
  869. &, grid%DOMDESC &
  870. &, 'z','xy' &
  871. &, IDS,IDE-1,JDS,JDE-1,1,1 &
  872. &, IMS,IME,JMS,JME,1,1 &
  873. &, ITS,ITE,JTS,JTE,1,1 )
  874. CALL WRF_GLOBAL_TO_PATCH_REAL( SM_G,grid%sm &
  875. &, grid%DOMDESC &
  876. &, 'z','xy' &
  877. &, IDS,IDE-1,JDS,JDE-1,1,1 &
  878. &, IMS,IME,JMS,JME,1,1 &
  879. &, ITS,ITE,JTS,JTE,1,1 )
  880. IF (WRF_DM_ON_MONITOR()) THEN
  881. #if defined(HWRF)
  882. ! SM_G is still needed for the high-res grid
  883. #else
  884. DEALLOCATE(SM_G)
  885. #endif
  886. deallocate(SICE_G)
  887. DEALLOCATE(IHE_G,IHW_G)
  888. ENDIF
  889. ! write(message,*) 'revised sea ice on patch'
  890. ! CALL wrf_debug(100,message)
  891. ! DO J=JTE,JTS,-(((JTE-JTS)/25)+1)
  892. ! write(message,637) (grid%sice(I,J),I=ITS,ITE,ITE/20)
  893. ! CALL wrf_debug(100,message)
  894. ! END DO
  895. #else
  896. ! serial sea ice reprocessing
  897. allocate(IHE(JDS:JDE-1),IHW(JDS:JDE-1))
  898. DO j = jts, MIN(jte,jde-1)
  899. IHE(J)=MOD(J+1,2)
  900. IHW(J)=IHE(J)-1
  901. ENDDO
  902. DO ITER=1,10
  903. DO j = jts+1, MIN(jte,jde-1)-1
  904. DO i = its+1, MIN(ite,ide-1)-1
  905. ! any sea ice around point in question?
  906. IF (grid%sm(I,J) .gt. 0.9) THEN
  907. SEAICESUM=grid%sice(I+IHE(J),J+1)+grid%sice(I+IHW(J),J+1)+ &
  908. grid%sice(I+IHE(J),J-1)+grid%sice(I+IHW(J),J-1)
  909. IF (SEAICESUM .ge. 1. .and. SEAICESUM .lt. 3.) THEN
  910. IF ((grid%sice(I+IHE(J),J+1).lt.0.1 .and. grid%sm(I+IHE(J),J+1).lt.0.1) .OR. &
  911. (grid%sice(I+IHW(J),J+1).lt.0.1 .and. grid%sm(I+IHW(J),J+1).lt.0.1) .OR. &
  912. (grid%sice(I+IHE(J),J-1).lt.0.1 .and. grid%sm(I+IHE(J),J-1).lt.0.1) .OR. &
  913. (grid%sice(I+IHW(J),J-1).lt.0.1 .and. grid%sm(I+IHW(J),J-1).lt.0.1)) THEN
  914. ! HAVE SEA ICE AND A SURROUNDING LAND POINT - CONVERT TO SEA ICE
  915. grid%sice(I,J)=1.0
  916. grid%sm(I,J)=0.
  917. ENDIF
  918. ELSEIF (SEAICESUM .ge. 3) THEN
  919. ! WATER POINT SURROUNDED BY ICE - CONVERT TO SEA ICE
  920. grid%sice(I,J)=1.0
  921. grid%sm(I,J)=0.
  922. ENDIF
  923. ENDIF
  924. ENDDO
  925. ENDDO
  926. ENDDO
  927. DEALLOCATE(IHE,IHW)
  928. #endif
  929. ! this block meant to guarantee land/sea agreement between sm and landmask
  930. DO j = jts, MIN(jte,jde-1)
  931. DO i = its, MIN(ite,ide-1)
  932. IF (grid%sm(I,J) .gt. 0.5) THEN
  933. grid%landmask(I,J)=0.0
  934. ELSEIF (grid%sm(I,J) .lt. 0.5 .and. grid%sice(I,J) .gt. 0.9) then
  935. grid%landmask(I,J)=0.0
  936. ELSEIF (grid%sm(I,J) .lt. 0.5 .and. grid%sice(I,J) .lt. 0.1) then
  937. grid%landmask(I,J)=1.0
  938. ELSE
  939. write(message,*) 'missed point in grid%landmask definition ' , I,J
  940. CALL wrf_message(message)
  941. grid%landmask(I,J)=0.0
  942. ENDIF
  943. !
  944. IF (grid%sice(I,J) .gt. 0.5 .and. grid%nmm_tsk(I,J) .lt. 0.1 .and. grid%sst(I,J) .gt. 0.) THEN
  945. write(message,*) 'set grid%nmm_tsk to: ', grid%sst(I,J)
  946. CALL wrf_message(message)
  947. grid%nmm_tsk(I,J)=grid%sst(I,J)
  948. grid%sst(I,J)=0.
  949. endif
  950. ENDDO
  951. ENDDO
  952. ! For sf_surface_physics = 1, we want to use close to a 10 cm value
  953. ! for the bottom level of the soil temps.
  954. IF ( ( model_config_rec%sf_surface_physics(grid%id) .EQ. 1 ) .AND. &
  955. ( flag_st000010 .EQ. 1 ) ) THEN
  956. DO j = jts , MIN(jde-1,jte)
  957. DO i = its , MIN(ide-1,ite)
  958. grid%soiltb(i,j) = grid%st000010(i,j)
  959. END DO
  960. END DO
  961. END IF
  962. ! Adjust the various soil temperature values depending on the difference in
  963. ! in elevation between the current model's elevation and the incoming data's
  964. ! orography.
  965. IF ( ( flag_toposoil .EQ. 1 ) ) THEN
  966. ALLOCATE(HT(ims:ime,jms:jme))
  967. DO J=jms,jme
  968. DO I=ims,ime
  969. HT(I,J)=grid%fis(I,J)/9.81
  970. END DO
  971. END DO
  972. ! if (maxval(grid%toposoil) .gt. 100.) then
  973. !
  974. ! Being avoided. Something to revisit eventually.
  975. !
  976. !1219 might be simply a matter of including toposoil
  977. !
  978. ! CODE NOT TESTED AT NCEP USING THIS FUNCTIONALITY,
  979. ! SO TO BE SAFE WILL AVOID FOR RETRO RUNS.
  980. !
  981. ! CALL adjust_soil_temp_new ( grid%soiltb , 2 , &
  982. ! grid%nmm_tsk , ht , grid%toposoil , grid%landmask, flag_toposoil , &
  983. ! grid%st000010 , st010040 , st040100 , st100200 , st010200 , &
  984. ! flag_st000010 , flag_st010040 , flag_st040100 , &
  985. ! flag_st100200 , flag_st010200 , &
  986. ! soilt000 , soilt005 , soilt020 , soilt040 , &
  987. ! soilt160 , soilt300 , &
  988. ! flag_soilt000 , flag_soilt005 , flag_soilt020 , &
  989. ! flag_soilt040 , flag_soilt160 , flag_soilt300 , &
  990. ! ids , ide , jds , jde , kds , kde , &
  991. ! ims , ime , jms , jme , kms , kme , &
  992. ! its , ite , jts , jte , kts , kte )
  993. ! endif
  994. END IF
  995. ! Process the LSM data.
  996. ! surface_input_source=1 => use data from static file
  997. ! (fractional category as input)
  998. ! surface_input_source=2 => use data from grib file
  999. ! (dominant category as input)
  1000. IF ( config_flags%surface_input_source .EQ. 1 ) THEN
  1001. grid%vegcat (its,jts) = 0
  1002. grid%soilcat(its,jts) = 0
  1003. END IF
  1004. ! Generate the vegetation and soil category information
  1005. ! from the fractional input
  1006. ! data, or use the existing dominant category fields if they exist.
  1007. IF ((grid%soilcat(its,jts) .LT. 0.5) .AND. (grid%vegcat(its,jts) .LT. 0.5)) THEN
  1008. num_veg_cat = SIZE ( grid%landusef_gc , DIM=3 )
  1009. num_soil_top_cat = SIZE ( grid%soilctop_gc , DIM=3 )
  1010. num_soil_bot_cat = SIZE ( grid%soilcbot_gc , DIM=3 )
  1011. do J=JMS,JME
  1012. do K=1,num_veg_cat
  1013. do I=IMS,IME
  1014. grid%landusef(I,K,J)=grid%landusef_gc(I,J,K)
  1015. enddo
  1016. enddo
  1017. enddo
  1018. do J=JMS,JME
  1019. do K=1,num_soil_top_cat
  1020. do I=IMS,IME
  1021. grid%soilctop(I,K,J)=grid%soilctop_gc(I,J,K)
  1022. enddo
  1023. enddo
  1024. enddo
  1025. do J=JMS,JME
  1026. do K=1,num_soil_bot_cat
  1027. do I=IMS,IME
  1028. grid%soilcbot(I,K,J)=grid%soilcbot_gc(I,J,K)
  1029. enddo
  1030. enddo
  1031. enddo
  1032. ! grid%sm (1=water, 0=land)
  1033. ! grid%landmask(0=water, 1=land)
  1034. write(message,*) 'landmask into process_percent_cat_new'
  1035. CALL wrf_debug(1,message)
  1036. do J=JTE,JTS,-(((JTE-JTS)/20)+1)
  1037. write(message,641) (grid%landmask(I,J),I=ITS,min(ITE,IDE-1),((ITE-ITS)/15)+1)
  1038. CALL wrf_debug(1,message)
  1039. enddo
  1040. 641 format(25(f3.0,1x))
  1041. CALL process_percent_cat_new ( grid%landmask , &
  1042. grid%landusef , grid%soilctop , grid%soilcbot , &
  1043. grid%isltyp , grid%ivgtyp , &
  1044. num_veg_cat , num_soil_top_cat , num_soil_bot_cat , &
  1045. ids , ide , jds , jde , kds , kde , &
  1046. ims , ime , jms , jme , kms , kme , &
  1047. its , ite , jts , jte , kts , kte , &
  1048. model_config_rec%iswater(grid%id) )
  1049. DO j = jts , MIN(jde-1,jte)
  1050. DO i = its , MIN(ide-1,ite)
  1051. grid%vegcat(i,j) = grid%ivgtyp(i,j)
  1052. grid%soilcat(i,j) = grid%isltyp(i,j)
  1053. END DO
  1054. END DO
  1055. ELSE
  1056. ! Do we have dominant soil and veg data from the input already?
  1057. IF ( grid%soilcat(its,jts) .GT. 0.5 ) THEN
  1058. DO j = jts, MIN(jde-1,jte)
  1059. DO i = its, MIN(ide-1,ite)
  1060. grid%isltyp(i,j) = NINT( grid%soilcat(i,j) )
  1061. END DO
  1062. END DO
  1063. END IF
  1064. IF ( grid%vegcat(its,jts) .GT. 0.5 ) THEN
  1065. DO j = jts, MIN(jde-1,jte)
  1066. DO i = its, MIN(ide-1,ite)
  1067. grid%ivgtyp(i,j) = NINT( grid%vegcat(i,j) )
  1068. END DO
  1069. END DO
  1070. END IF
  1071. ENDIF
  1072. DO j = jts, MIN(jde-1,jte)
  1073. DO i = its, MIN(ide-1,ite)
  1074. IF (grid%sice(I,J) .lt. 0.1) THEN
  1075. IF (grid%landmask(I,J) .gt. 0.5 .and. grid%sm(I,J) .gt. 0.5) THEN
  1076. write(message,*) 'land mask and grid%sm both > 0.5: ', &
  1077. I,J,grid%landmask(I,J),grid%sm(I,J)
  1078. CALL wrf_message(message)
  1079. grid%sm(I,J)=0.
  1080. ELSEIF (grid%landmask(I,J) .lt. 0.5 .and. grid%sm(I,J) .lt. 0.5) THEN
  1081. write(message,*) 'land mask and grid%sm both < 0.5: ', &
  1082. I,J, grid%landmask(I,J),grid%sm(I,J)
  1083. CALL wrf_message(message)
  1084. grid%sm(I,J)=1.
  1085. ENDIF
  1086. ELSE
  1087. IF (grid%landmask(I,J) .gt. 0.5 .and. grid%sm(I,J)+grid%sice(I,J) .gt. 0.9) then
  1088. write(message,*) 'landmask says LAND, sm/sice say SEAICE: ', I,J
  1089. ENDIF
  1090. ENDIF
  1091. ENDDO
  1092. ENDDO
  1093. DO j = jts, MIN(jde-1,jte)
  1094. DO i = its, MIN(ide-1,ite)
  1095. if (grid%sice(I,J) .gt. 0.9) then
  1096. grid%isltyp(I,J)=16
  1097. grid%ivgtyp(I,J)=24
  1098. endif
  1099. ENDDO
  1100. ENDDO
  1101. DO j = jts, MIN(jde-1,jte)
  1102. DO i = its, MIN(ide-1,ite)
  1103. if (grid%sm(I,J) .lt. 0.5) then
  1104. grid%sst(I,J)=0.
  1105. endif
  1106. if (grid%sm(I,J) .gt. 0.5) then
  1107. if (grid%sst(I,J) .lt. 0.1) then
  1108. grid%sst(I,J)=grid%nmm_tsk(I,J)
  1109. endif
  1110. grid%nmm_tsk(I,J)=0.
  1111. endif
  1112. IF ( (grid%nmm_tsk(I,J)+grid%sst(I,J)) .lt. 200. .or. &
  1113. (grid%nmm_tsk(I,J)+grid%sst(I,J)) .gt. 350. ) THEN
  1114. write(message,*) 'TSK, sst trouble at : ', I,J
  1115. CALL wrf_message(message)
  1116. write(message,*) 'sm, nmm_tsk,sst ', grid%sm(I,J),grid%nmm_tsk(I,J),grid%sst(I,J)
  1117. CALL wrf_message(message)
  1118. ENDIF
  1119. ENDDO
  1120. ENDDO
  1121. write(message,*) 'grid%sm'
  1122. CALL wrf_message(message)
  1123. DO J=min(jde-1,jte),jts,-((jte-jts)/15+1)
  1124. write(message,635) (grid%sm(i,J),I=its,ite,((ite-its)/10)+1)
  1125. CALL wrf_message(message)
  1126. END DO
  1127. write(message,*) 'sst/nmm_tsk'
  1128. CALL wrf_debug(10,message)
  1129. DO J=min(jde-1,jte),jts,-((jte-jts)/15+1)
  1130. write(message,635) (grid%sst(I,J)+grid%nmm_tsk(I,J),I=ITS,min(ide-1,ite),((ite-its)/10)+1)
  1131. CALL wrf_debug(10,message)
  1132. END DO
  1133. 635 format(20(f5.1,1x))
  1134. DO j = jts, MIN(jde-1,jte)
  1135. DO i = its, MIN(ide-1,ite)
  1136. IF ( ( grid%landmask(i,j) .LT. 0.5 ) .AND. ( flag_sst .EQ. 1 ) ) THEN
  1137. grid%soiltb(i,j) = grid%sst(i,j)
  1138. ELSE IF ( grid%landmask(i,j) .GT. 0.5 ) THEN
  1139. grid%soiltb(i,j) = grid%nmm_tsk(i,j)
  1140. END IF
  1141. END DO
  1142. END DO
  1143. ! END IF
  1144. ! Land use categories, dominant soil and vegetation types (if available).
  1145. ! allocate(grid%lu_index(ims:ime,jms:jme))
  1146. DO j = jts, MIN(jde-1,jte)
  1147. DO i = its, MIN(ide-1,ite)
  1148. grid%lu_index(i,j) = grid%ivgtyp(i,j)
  1149. END DO
  1150. END DO
  1151. if (flag_sst .eq. 1) log_flag_sst=.true.
  1152. if (flag_sst .eq. 0) log_flag_sst=.false.
  1153. write(message,*) 'st_input dimensions: ', size(st_input,dim=1), &
  1154. size(st_input,dim=2),size(st_input,dim=3)
  1155. CALL wrf_debug(100,message)
  1156. ! write(message,*) 'maxval st_input(1): ', maxval(st_input(:,1,:))
  1157. ! CALL wrf_message(message)
  1158. ! write(message,*) 'maxval st_input(2): ', maxval(st_input(:,2,:))
  1159. ! CALL wrf_message(message)
  1160. ! write(message,*) 'maxval st_input(3): ', maxval(st_input(:,3,:))
  1161. ! CALL wrf_message(message)
  1162. ! write(message,*) 'maxval st_input(4): ', maxval(st_input(:,4,:))
  1163. ! CALL wrf_message(message)
  1164. ! =============================================================
  1165. IF (.NOT. ALLOCATED(TG_ALT))ALLOCATE(TG_ALT(grid%sm31:grid%em31,jms:jme))
  1166. TPH0=TPH0D*DTR
  1167. WBD=-(((ide-1)-1)*grid%dlmd)
  1168. WB= WBD*DTR
  1169. SBD=-(((jde-1)/2)*grid%dphd)
  1170. SB= SBD*DTR
  1171. DLM=grid%dlmd*DTR
  1172. DPH=grid%dphd*DTR
  1173. TDLM=DLM+DLM
  1174. TDPH=DPH+DPH
  1175. WBI=WB+TDLM
  1176. SBI=SB+TDPH
  1177. EBI=WB+(ide-2)*TDLM
  1178. ANBI=SB+(jde-2)*DPH
  1179. STPH0=SIN(TPH0)
  1180. CTPH0=COS(TPH0)
  1181. TSPH=3600./GRID%DT
  1182. DO J=JTS,min(JTE,JDE-1)
  1183. TLM=WB-TDLM+MOD(J,2)*DLM !For velocity points on the E grid
  1184. TPH=SB+float(J-1)*DPH
  1185. STPH=SIN(TPH)
  1186. CTPH=COS(TPH)
  1187. DO I=ITS,MIN(ITE,IDE-1)
  1188. if (I .eq. ITS) THEN
  1189. TLM=TLM+TDLM*ITS
  1190. else
  1191. TLM=TLM+TDLM
  1192. endif
  1193. TERM1=(STPH0*CTPH*COS(TLM)+CTPH0*STPH)
  1194. FP=TWOM*(TERM1)
  1195. ! jbao orig grid%f(I,J)=0.5*GRID%DT*FP
  1196. ! jbao Coriolis correction for idealized!
  1197. grid%f(I,J)=3.15656e-5*0.5*GRID%DT
  1198. ! jbao Coriolis correction for idealized!
  1199. ENDDO
  1200. ENDDO
  1201. DO J=JTS,min(JTE,JDE-1)
  1202. TLM=WB-TDLM+MOD(J+1,2)*DLM !For mass points on the E grid
  1203. TPH=SB+float(J-1)*DPH
  1204. STPH=SIN(TPH)
  1205. CTPH=COS(TPH)
  1206. DO I=ITS,MIN(ITE,IDE-1)
  1207. if (I .eq. ITS) THEN
  1208. TLM=TLM+TDLM*ITS
  1209. else
  1210. TLM=TLM+TDLM
  1211. endif
  1212. TERM1=(STPH0*CTPH*COS(TLM)+CTPH0*STPH)
  1213. TERM1=MIN(TERM1,1.0D0)
  1214. TERM1=MAX(TERM1,-1.0D0)
  1215. APH=ASIN(TERM1)
  1216. TG_ALT(I,J)=TG0+TGA*COS(APH)-grid%fis(I,J)/3333.
  1217. ENDDO
  1218. ENDDO
  1219. DO j = jts, MIN(jde-1,jte)
  1220. DO i = its, MIN(ide-1,ite)
  1221. ! IF ( ( grid%landmask(i,j) .LT. 0.5 ) .AND. ( flag_sst .EQ. 1 ) .AND. &
  1222. ! grid%sice(I,J) .eq. 0. ) THEN
  1223. ! grid%tg(i,j) = grid%sst(i,j)
  1224. ! ELSEIF (grid%sice(I,J) .eq. 1) THEN
  1225. ! grid%tg(i,j) = 271.16
  1226. ! END IF
  1227. if (grid%tg(I,J) .lt. 200.) then ! only use default TG_ALT definition if
  1228. ! not getting TGROUND from grid%si
  1229. grid%tg(I,J)=TG_ALT(I,J)
  1230. endif
  1231. if (grid%tg(I,J) .lt. 200. .or. grid%tg(I,J) .gt. 320.) then
  1232. write(message,*) 'problematic grid%tg point at : ', I,J
  1233. CALL wrf_message( message )
  1234. endif
  1235. adum2d(i,j)=grid%nmm_tsk(I,J)+grid%sst(I,J)
  1236. END DO
  1237. END DO
  1238. DEALLOCATE(TG_ALT)
  1239. write(message,*) 'call process_soil_real with num_st_levels_input: ', num_st_levels_input
  1240. CALL wrf_message( message )
  1241. ! =============================================================
  1242. CALL process_soil_real ( adum2d, grid%tg , &
  1243. grid%landmask, grid%sst, &
  1244. st_input, sm_input, sw_input, &
  1245. st_levels_input , sm_levels_input , &
  1246. sw_levels_input , &
  1247. grid%sldpth , grid%dzsoil , grid%stc , grid%smc , grid%sh2o, &
  1248. flag_sst , flag_soilt000, flag_soilm000, &
  1249. ids , ide , jds , jde , kds , kde , &
  1250. ims , ime , jms , jme , kms , kme , &
  1251. its , ite , jts , jte , kts , kte , &
  1252. model_config_rec%sf_surface_physics(grid%id) , &
  1253. model_config_rec%num_soil_layers , &
  1254. model_config_rec%real_data_init_type , &
  1255. num_st_levels_input , num_sm_levels_input , &
  1256. num_sw_levels_input , &
  1257. num_st_levels_alloc , num_sm_levels_alloc , &
  1258. num_sw_levels_alloc )
  1259. ! =============================================================
  1260. ! Minimum soil values, residual, from RUC LSM scheme.
  1261. ! For input from Noah and using
  1262. ! RUC LSM scheme, this must be subtracted from the input
  1263. ! total soil moisture. For input RUC data and using the Noah LSM scheme,
  1264. ! this value must be added to the soil moisture_input.
  1265. lqmi(1:num_soil_top_cat) = &
  1266. (/0.045, 0.057, 0.065, 0.067, 0.034, 0.078, 0.10, &
  1267. 0.089, 0.095, 0.10, 0.070, 0.068, 0.078, 0.0, &
  1268. 0.004, 0.065 /) !dusan , 0.020, 0.004, 0.008 /)
  1269. ! At the initial time we care about values of soil moisture and temperature,
  1270. ! other times are ignored by the model, so we ignore them, too.
  1271. account_for_zero_soil_moisture : SELECT CASE ( model_config_rec%sf_surface_physics(grid%id) )
  1272. CASE ( LSMSCHEME )
  1273. iicount = 0
  1274. IF ( FLAG_SM000010 .EQ. 1 ) THEN
  1275. DO j = jts, MIN(jde-1,jte)
  1276. DO i = its, MIN(ide-1,ite)
  1277. IF ((grid%landmask(i,j).gt.0.5) .and. (grid%stc(i,1,j) .gt. 200) .and. &
  1278. (grid%stc(i,1,j) .lt. 400) .and. (grid%smc(i,1,j) .lt. 0.005)) then
  1279. write(message,*) 'Noah > Noah: bad soil moisture at i,j = ',i,j,grid%smc(i,:,j)
  1280. CALL wrf_message(message)
  1281. iicount = iicount + 1
  1282. grid%smc(i,:,j) = 0.005
  1283. END IF
  1284. END DO
  1285. END DO
  1286. IF ( iicount .GT. 0 ) THEN
  1287. write(message,*) 'Noah -> Noah: total number of small soil moisture locations= ',&
  1288. iicount
  1289. CALL wrf_message(message)
  1290. END IF
  1291. ELSE IF ( FLAG_SOILM000 .EQ. 1 ) THEN
  1292. DO j = jts, MIN(jde-1,jte)
  1293. DO i = its, MIN(ide-1,ite)
  1294. grid%smc(i,:,j) = grid%smc(i,:,j) + lqmi(grid%isltyp(i,j))
  1295. END DO
  1296. END DO
  1297. DO j = jts, MIN(jde-1,jte)
  1298. DO i = its, MIN(ide-1,ite)
  1299. IF ((grid%landmask(i,j).gt.0.5) .and. (grid%stc(i,1,j) .gt. 200) .and. &
  1300. (grid%stc(i,1,j) .lt. 400) .and. (grid%smc(i,1,j) .lt. 0.004)) then
  1301. write(message,*) 'RUC -> Noah: bad soil moisture at i,j = ' &
  1302. ,i,j,grid%smc(i,:,j)
  1303. CALL wrf_message(message)
  1304. iicount = iicount + 1
  1305. grid%smc(i,:,j) = 0.004
  1306. END IF
  1307. END DO
  1308. END DO
  1309. IF ( iicount .GT. 0 ) THEN
  1310. write(message,*) 'RUC -> Noah: total number of small soil moisture locations = ',&
  1311. iicount
  1312. CALL wrf_message(message)
  1313. END IF
  1314. END IF
  1315. CASE ( RUCLSMSCHEME )
  1316. iicount = 0
  1317. IF ( FLAG_SM000010 .EQ. 1 ) THEN
  1318. DO j = jts, MIN(jde-1,jte)
  1319. DO i = its, MIN(ide-1,ite)
  1320. grid%smc(i,:,j) = MAX ( grid%smc(i,:,j) - lqmi(grid%isltyp(i,j)) , 0. )
  1321. END DO
  1322. END DO
  1323. ELSE IF ( FLAG_SOILM000 .EQ. 1 ) THEN
  1324. ! no op
  1325. END IF
  1326. END SELECT account_for_zero_soil_moisture
  1327. !!! zero out grid%nmm_tsk at water points again
  1328. DO j = jts, MIN(jde-1,jte)
  1329. DO i = its, MIN(ide-1,ite)
  1330. if (grid%sm(I,J) .gt. 0.5) then
  1331. grid%nmm_tsk(I,J)=0.
  1332. endif
  1333. END DO
  1334. END DO
  1335. !! check on grid%stc
  1336. DO j = jts, MIN(jde-1,jte)
  1337. DO i = its, MIN(ide-1,ite)
  1338. IF (grid%sice(I,J) .gt. 0.9) then
  1339. DO L = 1, grid%num_soil_layers
  1340. grid%stc(I,L,J)=271.16 ! grid%tg value used by Eta/NMM
  1341. END DO
  1342. END IF
  1343. IF (grid%sm(I,J) .gt. 0.9) then
  1344. DO L = 1, grid%num_soil_layers
  1345. grid%stc(I,L,J)=273.16 ! grid%tg value used by Eta/NMM
  1346. END DO
  1347. END IF
  1348. END DO
  1349. END DO
  1350. DO j = jts, MIN(jde-1,jte)
  1351. DO i = its, MIN(ide-1,ite)
  1352. if (grid%sm(I,J) .lt. 0.1 .and. grid%stc(I,1,J) .lt. 0.1) THEN
  1353. write(message,*) 'troublesome grid%sm,grid%stc,grid%smc value: ', I,J,grid%sm(I,J), grid%stc(I,1,J),grid%smc(I,1,J)
  1354. CALL wrf_message(message)
  1355. do JJ=J-1,J+1
  1356. do L=1, grid%num_soil_layers
  1357. do II=I-1,I+1
  1358. if (II .ge. its .and. II .le. MIN(ide-1,ite) .and. &
  1359. JJ .ge. jts .and. JJ .le. MIN(jde-1,jte)) then
  1360. grid%stc(I,L,J)=amax1(grid%stc(I,L,J),grid%stc(II,L,JJ))
  1361. cur_smc=grid%smc(I,L,J)
  1362. if ( grid%smc(II,L,JJ) .gt. 0.005 .and. grid%smc(II,L,JJ) .lt. 1.0) then
  1363. aposs_smc=grid%smc(II,L,JJ)
  1364. if ( cur_smc .eq. 0 ) then
  1365. cur_smc=aposs_smc
  1366. grid%smc(I,L,J)=cur_smc
  1367. else
  1368. cur_smc=amin1(cur_smc,aposs_smc)
  1369. cur_smc=amin1(cur_smc,aposs_smc)
  1370. grid%smc(I,L,J)=cur_smc
  1371. endif
  1372. endif
  1373. endif ! bounds check
  1374. enddo
  1375. enddo
  1376. enddo
  1377. write(message,*) 'grid%stc, grid%smc(1) now: ', grid%stc(I,1,J),grid%smc(I,1,J)
  1378. CALL wrf_message(message)
  1379. endif
  1380. if (grid%stc(I,1,J) .lt. 0.1) then
  1381. write(message,*) 'QUITTING DUE TO STILL troublesome grid%stc value: ', I,J, grid%stc(I,1,J),grid%smc(I,1,J)
  1382. call wrf_error_fatal(message)
  1383. endif
  1384. ENDDO
  1385. ENDDO
  1386. !hardwire soil stuff for time being
  1387. ! RTDPTH=0.
  1388. ! RTDPTH(1)=0.1
  1389. ! RTDPTH(2)=0.3
  1390. ! RTDPTH(3)=0.6
  1391. ! grid%sldpth=0.
  1392. ! grid%sldpth(1)=0.1
  1393. ! grid%sldpth(2)=0.3
  1394. ! grid%sldpth(3)=0.6
  1395. ! grid%sldpth(4)=1.0
  1396. !!! main body of nmm_specific starts here
  1397. !
  1398. do J=jts,min(jte,jde-1)
  1399. do I=its,min(ite,ide-1)
  1400. grid%res(I,J)=1.
  1401. enddo
  1402. enddo
  1403. !! grid%hbm2
  1404. grid%hbm2=0.
  1405. do J=jts,min(jte,jde-1)
  1406. do I=its,min(ite,ide-1)
  1407. IF ( (J .ge. 3 .and. J .le. (jde-1)-2) .AND. &
  1408. (I .ge. 2 .and. I .le. (ide-1)-2+mod(J,2)) ) THEN
  1409. grid%hbm2(I,J)=1.
  1410. ENDIF
  1411. enddo
  1412. enddo
  1413. !! grid%hbm3
  1414. grid%hbm3=0.
  1415. !! LOOP OVER LOCAL DIMENSIONS
  1416. do J=jts,min(jte,jde-1)
  1417. grid%ihwg(J)=mod(J+1,2)-1
  1418. IF (J .ge. 4 .and. J .le. (jde-1)-3) THEN
  1419. IHL=(ids+1)-grid%ihwg(J)
  1420. IHH=(ide-1)-2
  1421. do I=its,min(ite,ide-1)
  1422. IF (I .ge. IHL .and. I .le. IHH) grid%hbm3(I,J)=1.
  1423. enddo
  1424. ENDIF
  1425. enddo
  1426. !! grid%vbm2
  1427. grid%vbm2=0.
  1428. do J=jts,min(jte,jde-1)
  1429. do I=its,min(ite,ide-1)
  1430. IF ( (J .ge. 3 .and. J .le. (jde-1)-2) .AND. &
  1431. (I .ge. 2 .and. I .le. (ide-1)-1-mod(J,2)) ) THEN
  1432. grid%vbm2(I,J)=1.
  1433. ENDIF
  1434. enddo
  1435. enddo
  1436. !! grid%vbm3
  1437. grid%vbm3=0.
  1438. do J=jts,min(jte,jde-1)
  1439. do I=its,min(ite,ide-1)
  1440. IF ( (J .ge. 4 .and. J .le. (jde-1)-3) .AND. &
  1441. (I .ge. 3-mod(J,2) .and. I .le. (ide-1)-2) ) THEN
  1442. grid%vbm3(I,J)=1.
  1443. ENDIF
  1444. enddo
  1445. enddo
  1446. COAC=model_config_rec%coac(grid%id)
  1447. CODAMP=model_config_rec%codamp(grid%id)
  1448. DTAD=1.0
  1449. ! IDTCF=DTCF, IDTCF=4
  1450. DTCF=4.0 ! used?
  1451. grid%dy_nmm=ERAD*DPH
  1452. grid%cpgfv=-GRID%DT/(48.*grid%dy_nmm)
  1453. grid%en= GRID%DT/( 4.*grid%dy_nmm)*DTAD
  1454. grid%ent=GRID%DT/(16.*grid%dy_nmm)*DTAD
  1455. DO J=jts,nnyp
  1456. KHL2(J)=(IDE-1)*(J-1)-(J-1)/2+2
  1457. KVL2(J)=(IDE-1)*(J-1)-J/2+2
  1458. KHH2(J)=(IDE-1)*J-J/2-1
  1459. KVH2(J)=(IDE-1)*J-(J+1)/2-1
  1460. ENDDO
  1461. TPH=SB-DPH
  1462. DO J=jts,min(jte,jde-1)
  1463. TPH=SB+float(J-1)*DPH
  1464. DXP=ERAD*DLM*COS(TPH)
  1465. DXJ(J)=DXP
  1466. WPDARJ(J)=-W_NMM * &
  1467. ((ERAD*DLM*AMIN1(COS(ANBI),COS(SBI)))**2+grid%dy_nmm**2)/ &
  1468. (GRID%DT*32.*DXP*grid%dy_nmm)
  1469. CPGFUJ(J)=-GRID%DT/(48.*DXP)
  1470. CURVJ(J)=.5*GRID%DT*TAN(TPH)/ERAD
  1471. FCPJ(J)=GRID%DT/(CP*192.*DXP*grid%dy_nmm)
  1472. FDIVJ(J)=1./(12.*DXP*grid%dy_nmm)
  1473. ! EMJ(J)= GRID%DT/( 4.*DXP)*DTAD
  1474. ! EMTJ(J)=GRID%DT/(16.*DXP)*DTAD
  1475. FADJ(J)=-GRID%DT/(48.*DXP*grid%dy_nmm)*DTAD
  1476. ACDT=GRID%DT*SQRT((ERAD*DLM*AMIN1(COS(ANBI),COS(SBI)))**2+grid%dy_nmm**2)
  1477. CDDAMP=CODAMP*ACDT
  1478. HDACJ(J)=COAC*ACDT/(4.*DXP*grid%dy_nmm)
  1479. DDMPUJ(J)=CDDAMP/DXP
  1480. DDMPVJ(J)=CDDAMP/grid%dy_nmm
  1481. ENDDO
  1482. DO J=JTS,min(JTE,JDE-1)
  1483. TLM=WB-TDLM+MOD(J,2)*DLM
  1484. TPH=SB+float(J-1)*DPH
  1485. STPH=SIN(TPH)
  1486. CTPH=COS(TPH)
  1487. DO I=ITS,MIN(ITE,IDE-1)
  1488. if (I .eq. ITS) THEN
  1489. TLM=TLM+TDLM*ITS
  1490. else
  1491. TLM=TLM+TDLM
  1492. endif
  1493. FP=TWOM*(CTPH0*STPH+STPH0*CTPH*COS(TLM))
  1494. !jbao orig grid%f(I,J)=0.5*GRID%DT*FP
  1495. ! jbao Coriolis correction for idealized!
  1496. grid%f(I,J)=3.15656e-5*0.5*GRID%DT
  1497. print*,'real 2griddt is ',grid%dt
  1498. ! jbao Coriolis correction for idealized!
  1499. ENDDO
  1500. ENDDO
  1501. ! --------------DERIVED VERTICAL GRID CONSTANTS--------------------------
  1502. grid%ef4t=.5*GRID%DT/CP
  1503. grid%f4q = -GRID%DT*DTAD
  1504. grid%f4d =-.5*GRID%DT*DTAD
  1505. DO L=KDS,KDE-1
  1506. grid%rdeta(L)=1./grid%deta(L)
  1507. grid%f4q2(L)=-.25*GRID%DT*DTAD/grid%deta(L)
  1508. ENDDO
  1509. DO J=JTS,min(JTE,JDE-1)
  1510. DO I=ITS,min(ITE,IDE-1)
  1511. grid%dx_nmm(I,J)=DXJ(J)
  1512. grid%wpdar(I,J)=WPDARJ(J)*grid%hbm2(I,J)
  1513. grid%cpgfu(I,J)=CPGFUJ(J)*grid%vbm2(I,J)
  1514. grid%curv(I,J)=CURVJ(J)*grid%vbm2(I,J)
  1515. grid%fcp(I,J)=FCPJ(J)*grid%hbm2(I,J)
  1516. grid%fdiv(I,J)=FDIVJ(J)*grid%hbm2(I,J)
  1517. grid%fad(I,J)=FADJ(J)
  1518. grid%hdacv(I,J)=HDACJ(J)*grid%vbm2(I,J)
  1519. grid%hdac(I,J)=HDACJ(J)*1.25*grid%hbm2(I,J)
  1520. ENDDO
  1521. ENDDO
  1522. DO J=JTS, MIN(JDE-1,JTE)
  1523. IF (J.LE.5.OR.J.GE.(JDE-1)-4) THEN
  1524. KHH=(IDE-1)-2+MOD(J,2) ! KHH is global...loop over I that have
  1525. DO I=ITS,MIN(IDE-1,ITE)
  1526. IF (I .ge. 2 .and. I .le. KHH) THEN
  1527. grid%hdac(I,J)=grid%hdac(I,J)* DFC
  1528. ENDIF
  1529. ENDDO
  1530. ELSE
  1531. KHH=2+MOD(J,2)
  1532. DO I=ITS,MIN(IDE-1,ITE)
  1533. IF (I .ge. 2 .and. I .le. KHH) THEN
  1534. grid%hdac(I,J)=grid%hdac(I,J)* DFC
  1535. ENDIF
  1536. ENDDO
  1537. KHH=(IDE-1)-2+MOD(J,2)
  1538. DO I=ITS,MIN(IDE-1,ITE)
  1539. IF (I .ge. (IDE-1)-2 .and. I .le. KHH) THEN
  1540. grid%hdac(I,J)=grid%hdac(I,J)* DFC
  1541. ENDIF
  1542. ENDDO
  1543. ENDIF
  1544. ENDDO
  1545. DO J=JTS,min(JTE,JDE-1)
  1546. DO I=ITS,min(ITE,IDE-1)
  1547. grid%ddmpu(I,J)=DDMPUJ(J)*grid%vbm2(I,J)
  1548. grid%ddmpv(I,J)=DDMPVJ(J)*grid%vbm2(I,J)
  1549. grid%hdacv(I,J)=grid%hdacv(I,J)*grid%vbm2(I,J)
  1550. ENDDO
  1551. ENDDO
  1552. ! --------------INCREASING DIFFUSION ALONG THE BOUNDARIES----------------
  1553. DO J=JTS,MIN(JDE-1,JTE)
  1554. IF (J.LE.5.OR.J.GE.JDE-1-4) THEN
  1555. KVH=(IDE-1)-1-MOD(J,2)
  1556. DO I=ITS,min(IDE-1,ITE)
  1557. IF (I .ge. 2 .and. I .le. KVH) THEN
  1558. grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC
  1559. grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC
  1560. grid%hdacv(I,J)=grid%hdacv(I,J)* DFC
  1561. ENDIF
  1562. ENDDO
  1563. ELSE
  1564. KVH=3-MOD(J,2)
  1565. DO I=ITS,min(IDE-1,ITE)
  1566. IF (I .ge. 2 .and. I .le. KVH) THEN
  1567. grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC
  1568. grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC
  1569. grid%hdacv(I,J)=grid%hdacv(I,J)* DFC
  1570. ENDIF
  1571. ENDDO
  1572. KVH=(IDE-1)-1-MOD(J,2)
  1573. DO I=ITS,min(IDE-1,ITE)
  1574. IF (I .ge. IDE-1-2 .and. I .le. KVH) THEN
  1575. grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC
  1576. grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC
  1577. grid%hdacv(I,J)=grid%hdacv(I,J)* DFC
  1578. ENDIF
  1579. ENDDO
  1580. ENDIF
  1581. ENDDO
  1582. write(message,*) 'grid%stc(1)'
  1583. CALL wrf_message(message)
  1584. DO J=min(jde-1,jte),jts,-((jte-jts)/15+1)
  1585. write(message,635) (grid%stc(I,1,J),I=its,min(ite,ide-1),(ite-its)/12+1)
  1586. CALL wrf_message(message)
  1587. ENDDO
  1588. write(message,*) 'grid%smc(1)'
  1589. CALL wrf_message(message)
  1590. DO J=min(jde-1,jte),jts,-((jte-jts)/15+1)
  1591. write(message,635) (grid%smc(I,1,J),I=its,min(ite,ide-1),(ite-its)/12+1)
  1592. CALL wrf_message(message)
  1593. ENDDO
  1594. DO j = jts, MIN(jde-1,jte)
  1595. DO i= ITS, MIN(IDE-1,ITE)
  1596. if (grid%sm(I,J) .lt. 0.1 .and. grid%smc(I,1,J) .gt. 0.5 .and. grid%sice(I,J) .lt. 0.1) then
  1597. write(message,*) 'very moist on land point: ', I,J,grid%smc(I,1,J)
  1598. CALL wrf_debug(10,message)
  1599. endif
  1600. enddo
  1601. enddo
  1602. !!! compute grid%emt, grid%em on global domain, and only on task 0.
  1603. #ifdef DM_PARALLEL
  1604. IF (wrf_dm_on_monitor()) THEN !!!! NECESSARY TO LIMIT THIS TO TASK ZERO?
  1605. #else
  1606. IF (JDS .eq. JTS) THEN !! set unfailable condition for serial job
  1607. #endif
  1608. ALLOCATE(EMJ(JDS:JDE-1),EMTJ(JDS:JDE-1))
  1609. DO J=JDS,JDE-1
  1610. TPH=SB+float(J-1)*DPH
  1611. DXP=ERAD*DLM*COS(TPH)
  1612. EMJ(J)= GRID%DT/( 4.*DXP)*DTAD
  1613. EMTJ(J)=GRID%DT/(16.*DXP)*DTAD
  1614. ENDDO
  1615. JA=0
  1616. DO 161 J=3,5
  1617. JA=JA+1
  1618. KHLA(JA)=2
  1619. KHHA(JA)=(IDE-1)-1-MOD(J+1,2)
  1620. 161 grid%emt(JA)=EMTJ(J)
  1621. DO 162 J=(JDE-1)-4,(JDE-1)-2
  1622. JA=JA+1
  1623. KHLA(JA)=2
  1624. KHHA(JA)=(IDE-1)-1-MOD(J+1,2)
  1625. 162 grid%emt(JA)=EMTJ(J)
  1626. DO 163 J=6,(JDE-1)-5
  1627. JA=JA+1
  1628. KHLA(JA)=2
  1629. KHHA(JA)=2+MOD(J,2)
  1630. 163 grid%emt(JA)=EMTJ(J)
  1631. DO 164 J=6,(JDE-1)-5
  1632. JA=JA+1
  1633. KHLA(JA)=(IDE-1)-2
  1634. KHHA(JA)=(IDE-1)-1-MOD(J+1,2)
  1635. 164 grid%emt(JA)=EMTJ(J)
  1636. ! --------------SPREADING OF UPSTREAM VELOCITY-POINT ADVECTION FACTOR----
  1637. JA=0
  1638. DO 171 J=3,5
  1639. JA=JA+1
  1640. KVLA(JA)=2
  1641. KVHA(JA)=(IDE-1)-1-MOD(J,2)
  1642. 171 grid%em(JA)=EMJ(J)
  1643. DO 172 J=(JDE-1)-4,(JDE-1)-2
  1644. JA=JA+1
  1645. KVLA(JA)=2
  1646. KVHA(JA)=(IDE-1)-1-MOD(J,2)
  1647. 172 grid%em(JA)=EMJ(J)
  1648. DO 173 J=6,(JDE-1)-5
  1649. JA=JA+1
  1650. KVLA(JA)=2
  1651. KVHA(JA)=2+MOD(J+1,2)
  1652. 173 grid%em(JA)=EMJ(J)
  1653. DO 174 J=6,(JDE-1)-5
  1654. JA=JA+1
  1655. KVLA(JA)=(IDE-1)-2
  1656. KVHA(JA)=(IDE-1)-1-MOD(J,2)
  1657. 174 grid%em(JA)=EMJ(J)
  1658. 696 continue
  1659. ENDIF ! wrf_dm_on_monitor/serial job
  1660. call NMM_SH2O(IMS,IME,JMS,JME,ITS,NNXP,JTS,NNYP,grid%num_soil_layers,grid%isltyp, &
  1661. grid%sm,grid%sice,grid%stc,grid%smc,grid%sh2o)
  1662. !! must be a better place to put this, but will eliminate "phantom"
  1663. !! wind points here (no wind point on eastern boundary of odd numbered rows)
  1664. IF ( abs(IDE-1-ITE) .eq. 1 ) THEN ! along eastern boundary
  1665. write(message,*) 'zero phantom winds'
  1666. CALL wrf_message(message)
  1667. DO K=1,KDE-1
  1668. DO J=JDS,JDE-1,2
  1669. IF (J .ge. JTS .and. J .le. JTE) THEN
  1670. grid%u(IDE-1,J,K)=0.
  1671. grid%v(IDE-1,J,K)=0.
  1672. ENDIF
  1673. ENDDO
  1674. ENDDO
  1675. ENDIF
  1676. 969 continue
  1677. DO j = jms, jme
  1678. DO i = ims, ime
  1679. fisx=max(grid%fis(i,j),0.)
  1680. grid%z0(I,J) =grid%sm(I,J)*Z0SEA+(1.-grid%sm(I,J))* &
  1681. & (0.*Z0MAX+FISx *FCM+Z0LAND)
  1682. ENDDO
  1683. ENDDO
  1684. write(message,*) 'grid%z0 over memory, leaving module_initialize_real'
  1685. CALL wrf_message(message)
  1686. DO J=JME,JMS,-((JME-JMS)/20+1)
  1687. write(message,635) (grid%z0(I,J),I=IMS,IME,(IME-IMS)/14+1)
  1688. CALL wrf_message(message)
  1689. ENDDO
  1690. endif ! on first_time check
  1691. write(message,*) 'leaving init_domain_nmm'
  1692. CALL wrf_message( TRIM(message) )
  1693. !
  1694. write(message,*)'STUFF MOVED TO REGISTRY:',grid%IDTAD, &
  1695. & grid%NSOIL,grid%NRADL,grid%NRADS,grid%NPHS,grid%NCNVC,grid%sigma
  1696. CALL wrf_message( TRIM(message) )
  1697. #ifdef HWRF
  1698. !=========================================================================================
  1699. ! gopal's doing for ocean coupling. Produce a high resolution grid for the entire domain
  1700. !=========================================================================================
  1701. if(internal_time_loop.eq.1) then !Kwon's doing
  1702. NDLMD=grid%dlmd/3.
  1703. NDPHD=grid%dphd/3.
  1704. NIDE=3*(IDE-1)-2
  1705. NJDE=3*(JDE-1)-2
  1706. ILOC=1
  1707. JLOC=1
  1708. NWBD= WBD ! + (ILOC -1)*2.*grid%dlmd + MOD(JLOC+1,2)*grid%dlmd
  1709. NSBD= SBD ! + (JLOC -1)*grid%dphd
  1710. ALLOCATE (NHLAT(NIDE,NJDE))
  1711. ALLOCATE (NHLON(NIDE,NJDE))
  1712. ALLOCATE (NVLAT(NIDE,NJDE))
  1713. ALLOCATE (NVLON(NIDE,NJDE))
  1714. ALLOCATE (HRES_SM(NIDE,NJDE))
  1715. #if defined(DM_PARALLEL)
  1716. if(wrf_dm_on_monitor()) then
  1717. ! Only the monitor process does the actual work (kinda
  1718. ! stupid; should be parallelized, but it's better than
  1719. ! writing garbage like it did before with >1 process)
  1720. ! Get high-res lat & lon:
  1721. CALL EARTH_LATLON_hwrf ( NHLAT,NHLON,NVLAT,NVLON, & ! rotated lat,lon at H and V points
  1722. NDLMD,NDPHD,NWBD,NSBD, &
  1723. tph0d,tlm0d, &
  1724. 1,NIDE,1,NJDE,1,1, &
  1725. 1,NIDE,1,NJDE,1,1, &
  1726. 1,NIDE,1,NJDE,1,1 )
  1727. ! Interpolate landmask to high-res grid:
  1728. CALL G2T2H_hwrf ( SM_G,HRES_SM, & ! output grid index and weights
  1729. NHLAT,NHLON, & ! target (hres) input lat lon in degrees
  1730. grid%DLMD,grid%DPHD,WBD,SBD, & ! parent res, west and south boundaries
  1731. tph0d,tlm0d, & ! parent central lat,lon, all in degrees
  1732. IDE,JDE,IDS,IDE,JDS,JDE, & ! parent imax and jmax, ime,jme
  1733. 1,NIDE,1,NJDE,1,1, &
  1734. 1,NIDE,1,NJDE,1,1, &
  1735. 1,NIDE,1,NJDE,1,1 )
  1736. ! We're done with the low-res sm grid now:
  1737. deallocate(SM_G)
  1738. ! Write out high-res grid for coupler:
  1739. WRITE(65)NHLAT(1:NIDE,1:NJDE)
  1740. WRITE(65)NHLON(1:NIDE,1:NJDE)
  1741. WRITE(65)NVLAT(1:NIDE,1:NJDE)
  1742. WRITE(65)NVLON(1:NIDE,1:NJDE)
  1743. WRITE(65)HRES_SM(1:NIDE,1:NJDE)
  1744. endif
  1745. #else
  1746. ! This code is the same as above, but for the non-mpi version:
  1747. CALL EARTH_LATLON_hwrf ( NHLAT,NHLON,NVLAT,NVLON, & ! rotated lat,lon at H and V points
  1748. NDLMD,NDPHD,NWBD,NSBD, &
  1749. tph0d,tlm0d, &
  1750. 1,NIDE,1,NJDE,1,1, &
  1751. 1,NIDE,1,NJDE,1,1, &
  1752. 1,NIDE,1,NJDE,1,1 )
  1753. CALL G2T2H_hwrf ( grid%SM,HRES_SM, & ! output grid index and weights
  1754. NHLAT,NHLON, & ! target (hres) input lat lon in degrees
  1755. grid%DLMD,grid%DPHD,WBD,SBD, & ! parent res, west and south boundaries
  1756. tph0d,tlm0d, & ! parent central lat,lon, all in degrees
  1757. IDE,JDE,IMS,IME,JMS,JME, & ! parent imax and jmax, ime,jme
  1758. 1,NIDE,1,NJDE,1,1, &
  1759. 1,NIDE,1,NJDE,1,1, &
  1760. 1,NIDE,1,NJDE,1,1 )
  1761. WRITE(65)NHLAT(1:NIDE,1:NJDE)
  1762. WRITE(65)NHLON(1:NIDE,1:NJDE)
  1763. WRITE(65)NVLAT(1:NIDE,1:NJDE)
  1764. WRITE(65)NVLON(1:NIDE,1:NJDE)
  1765. WRITE(65)HRES_SM(1:NIDE,1:NJDE)
  1766. #endif
  1767. DEALLOCATE (NHLAT)
  1768. DEALLOCATE (NHLON)
  1769. DEALLOCATE (NVLAT)
  1770. DEALLOCATE (NVLON)
  1771. DEALLOCATE (HRES_SM)
  1772. endif !Kwon's doing
  1773. !==================================================================================
  1774. ! end gopal's doing for ocean coupling.
  1775. !==================================================================================
  1776. #endif
  1777. !#define COPY_OUT
  1778. !#include <scalar_derefs.inc>
  1779. RETURN
  1780. END SUBROUTINE init_domain_nmm
  1781. !------------------------------------------------------
  1782. SUBROUTINE define_nmm_vertical_coord ( LM, PTSGM, pt, pdtop,HYBLEVS, &
  1783. SG1,DSG1,SGML1, &
  1784. SG2,DSG2,SGML2,dfl, dfrlg )
  1785. IMPLICIT NONE
  1786. ! USE module_model_constants
  1787. !!! certain physical parameters here probably don't need to be defined, as defined
  1788. !!! elsewhere within WRF. Done for initial testing purposes.
  1789. INTEGER :: LM, LPT2, L
  1790. REAL :: PTSGM, pt, PL, PT2, pdtop
  1791. REAL :: RGOG, PSIG,PHYB,PHYBM
  1792. REAL, PARAMETER :: Rd = 287.04 ! J deg{-1} kg{-1}
  1793. REAL, PARAMETER :: CP=1004.6,GAMMA=.0065,PRF0=101325.,T0=288.
  1794. REAL, PARAMETER :: g=9.81
  1795. REAL, DIMENSION(LM) :: DSG,DSG1,DSG2
  1796. REAL, DIMENSION(LM) :: SGML1,SGML2
  1797. REAL, DIMENSION(LM+1) :: SG1,SG2,HYBLEVS,dfl,dfrlg
  1798. CHARACTER(LEN=255) :: message
  1799. LPT2=LM+1
  1800. write(message,*) 'pt= ', pt
  1801. CALL wrf_message(message)
  1802. DO L=LM+1,1,-1
  1803. pl=HYBLEVS(L)*(101325.-pt)+pt
  1804. if(pl.lt.ptSGm) LPT2=l
  1805. ENDDO
  1806. IF(LPT2.lt.LM+1) THEN
  1807. pt2=HYBLEVS(LPT2)*(101325.-pt)+pt
  1808. ELSE
  1809. pt2=pt
  1810. ENDIF
  1811. write(message,*) '*** Sigma system starts at ',pt2,' Pa, from level ',LPT2
  1812. CALL wrf_message(message)
  1813. pdtop=pt2-pt
  1814. write(message,*) 'allocating DSG,DSG1,DSG2 as ', LM
  1815. CALL wrf_debug(10,message)
  1816. DSG=-99.
  1817. DO L=1,LM
  1818. DSG(L)=HYBLEVS(L)- HYBLEVS(L+1)
  1819. ENDDO
  1820. DSG1=0.
  1821. DSG2=0.
  1822. DO L=LM,1,-1
  1823. IF(L.ge.LPT2) then
  1824. DSG1(L)=DSG(L)
  1825. ELSE
  1826. DSG2(L)=DSG(L)
  1827. ENDIF
  1828. ENDDO
  1829. SGML1=-99.
  1830. SGML2=-99.
  1831. IF(LPT2.le.LM+1) THEN
  1832. DO L=LM+1,LPT2,-1
  1833. SG2(L)=0.
  1834. ENDDO
  1835. DO L=LPT2,2,-1
  1836. SG2(L-1)=SG2(L)+DSG2(L-1)
  1837. ENDDO
  1838. DO L=LPT2-1,1,-1
  1839. SG2(L)=SG2(L)/SG2(1)
  1840. ENDDO
  1841. SG2(1)=1.
  1842. DO L=LPT2-1,1,-1
  1843. DSG2(L)=SG2(L)-SG2(L+1)
  1844. SGML2(l)=(SG2(l)+SG2(l+1))*0.5
  1845. ENDDO
  1846. ENDIF
  1847. DO L=LM,LPT2,-1
  1848. DSG2(L)=0.
  1849. SGML2(L)=0.
  1850. ENDDO
  1851. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1852. SG1(LM+1)=0.
  1853. DO L=LM+1,LPT2,-1
  1854. SG1(L-1)=SG1(L)+DSG1(L-1)
  1855. ENDDO
  1856. DO L=LM,LPT2,-1
  1857. SG1(L)=SG1(L)/SG1(LPT2-1)
  1858. ENDDO
  1859. SG1(LPT2-1)=1.
  1860. do l=LPT2-2,1,-1
  1861. SG1(l)=1.
  1862. enddo
  1863. DO L=LM,LPT2,-1
  1864. DSG1(L)=SG1(L)-SG1(L+1)
  1865. SGML1(L)=(SG1(L)+SG1(L+1))*0.5
  1866. ENDDO
  1867. DO L=LPT2-1,1,-1
  1868. DSG1(L)=0.
  1869. SGML1(L)=1.
  1870. ENDDO
  1871. 1000 format('l,hyblevs,psig,SG1,SG2,phyb,phybm')
  1872. 1100 format(' ',i4,f7.4,f10.2,2f7.4,2f10.2)
  1873. write(message,1000)
  1874. CALL wrf_debug(100,message)
  1875. do l=1,LM+1
  1876. psig=HYBLEVS(L)*(101325.-pt)+pt
  1877. phyb=SG1(l)*pdtop+SG2(l)*(101325.-pdtop-pt)+pt
  1878. if(l.lt.LM+1) then
  1879. phybm=SGML1(l)*pdtop+SGML2(l)*(101325.-pdtop-pt)+pt
  1880. else
  1881. phybm=-99.
  1882. endif
  1883. write(message,1100) l,HYBLEVS(L),psig &
  1884. ,SG1(l),SG2(l),phyb,phybm
  1885. CALL wrf_debug(100,message)
  1886. enddo
  1887. 632 format(f9.6)
  1888. write(message,*) 'SG1'
  1889. CALL wrf_debug(100,message)
  1890. do L=LM+1,1,-1
  1891. write(message,632) SG1(L)
  1892. CALL wrf_debug(100,message)
  1893. enddo
  1894. write(message,*) 'SG2'
  1895. CALL wrf_debug(100,message)
  1896. do L=LM+1,1,-1
  1897. write(message,632) SG2(L)
  1898. CALL wrf_debug(100,message)
  1899. enddo
  1900. write(message,*) 'DSG1'
  1901. CALL wrf_debug(100,message)
  1902. do L=LM,1,-1
  1903. write(message,632) DSG1(L)
  1904. CALL wrf_debug(100,message)
  1905. enddo
  1906. write(message,*) 'DSG2'
  1907. CALL wrf_debug(100,message)
  1908. do L=LM,1,-1
  1909. write(message,632) DSG2(L)
  1910. CALL wrf_debug(100,message)
  1911. enddo
  1912. write(message,*) 'SGML1'
  1913. CALL wrf_debug(100,message)
  1914. do L=LM,1,-1
  1915. write(message,632) SGML1(L)
  1916. CALL wrf_debug(100,message)
  1917. enddo
  1918. write(message,*) 'SGML2'
  1919. CALL wrf_debug(100,message)
  1920. do L=LM,1,-1
  1921. write(message,632) SGML2(L)
  1922. CALL wrf_debug(100,message)
  1923. enddo
  1924. rgog=(rd*gamma)/g
  1925. DO L=1,LM+1
  1926. dfl(L)=g*T0*(1.-((pt+SG1(L)*pdtop+SG2(L)*(101325.-pt2)) &
  1927. /101325.)**rgog)/gamma
  1928. dfrlg(L)=dfl(L)/g
  1929. write(message,*) 'L, dfl(L): ', L, dfl(L)
  1930. CALL wrf_debug(100,message)
  1931. ENDDO
  1932. END SUBROUTINE define_nmm_vertical_coord
  1933. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1934. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1935. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1936. SUBROUTINE compute_nmm_surfacep ( TERRAIN_HGT_T, Z3D_IN, PRESS3D_IN, T3D_IN &
  1937. &, psfc_out,generic &
  1938. &, IDS,IDE,JDS,JDE,KDS,KDE &
  1939. &, IMS,IME,JMS,JME,KMS,KME &
  1940. &, ITS,ITE,JTS,JTE,KTS,KTE )
  1941. IMPLICIT NONE
  1942. real, allocatable:: dum2d(:,:),DUM2DB(:,:)
  1943. integer :: IDS,IDE,JDS,JDE,KDS,KDE
  1944. integer :: IMS,IME,JMS,JME,KMS,KME
  1945. integer :: ITS,ITE,JTS,JTE,KTS,KTE,Ilook,Jlook
  1946. integer :: I,J,II,generic,L,KINSERT,K,bot_lev,LL
  1947. integer :: IHE(JMS:JME),IHW(JMS:JME)
  1948. real :: TERRAIN_HGT_T(IMS:IME,JMS:JME)
  1949. real :: Z3D_IN(IMS:IME,JMS:JME,generic)
  1950. real :: T3D_IN(IMS:IME,JMS:JME,generic)
  1951. real :: PRESS3D_IN(IMS:IME,JMS:JME,generic)
  1952. real :: PSFC_IN(IMS:IME,JMS:JME),TOPO_IN(IMS:IME,JMS:JME)
  1953. real :: psfc_out(IMS:IME,JMS:JME),rincr(IMS:IME,JMS:JME)
  1954. real :: dif1,dif2,dif3,dif4,dlnpdz,BOT_INPUT_HGT,BOT_INPUT_PRESS,dpdz,rhs
  1955. real :: zin(generic),pin(generic)
  1956. character (len=255) :: message
  1957. logical :: DEFINED_PSFC(IMS:IME,JMS:JME), DEFINED_PSFCB(IMS:IME,JMS:JME)
  1958. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  1959. Ilook=25
  1960. Jlook=25
  1961. DO j = JMS, JME
  1962. IHE(J)=MOD(J+1,2)
  1963. IHW(J)=IHE(J)-1
  1964. ENDDO
  1965. DO J=JMS,JME
  1966. DO I=IMS,IME
  1967. DEFINED_PSFC(I,J)=.FALSE.
  1968. DEFINED_PSFCB(I,J)=.FALSE.
  1969. IF (PRESS3D_IN(I,J,1) .ne. 200100.) THEN
  1970. PSFC_IN(I,J)=PRESS3D_IN(I,J,1)
  1971. TOPO_IN(I,J)=Z3D_IN(I,J,1)
  1972. ELSE
  1973. PSFC_IN(I,J)=PRESS3D_IN(I,J,2)
  1974. TOPO_IN(I,J)=Z3D_IN(I,J,2)
  1975. ENDIF
  1976. ENDDO
  1977. ENDDO
  1978. ! input surface pressure smoothing over the ocean - still needed for NAM?
  1979. II_loop: do II=1,8
  1980. CYCLE II_loop
  1981. do J=JTS+1,min(JTE,JDE-1)-1
  1982. do I=ITS+1,min(ITE,IDE-1)-1
  1983. rincr(I,J)=0.
  1984. if (PSFC_IN(I,J) .gt. 100000. .and. &
  1985. PSFC_IN(I+IHE(J),J+1) .gt. 100000. .and. &
  1986. PSFC_IN(I+IHE(J),J-1) .gt. 100000. .and. &
  1987. PSFC_IN(I+IHW(J),J+1) .gt. 100000. .and. &
  1988. PSFC_IN(I+IHW(J),J-1) .gt. 100000. ) then
  1989. dif1=abs(PSFC_IN(I,J)-PSFC_IN(I+IHE(J),J+1))
  1990. dif2=abs(PSFC_IN(I,J)-PSFC_IN(I+IHE(J),J-1))
  1991. dif3=abs(PSFC_IN(I,J)-PSFC_IN(I+IHW(J),J+1))
  1992. dif4=abs(PSFC_IN(I,J)-PSFC_IN(I+IHW(J),J-1))
  1993. if (max(dif1,dif2,dif3,dif4) .lt. 200. .and. TOPO_IN(I,J).le. 0.5 .and. &
  1994. TOPO_IN(I+IHE(J),J+1) .le. 0.5 .and. &
  1995. TOPO_IN(I+IHW(J),J+1) .le. 0.5 .and. &
  1996. TOPO_IN(I+IHE(J),J-1) .le. 0.5 .and. &
  1997. TOPO_IN(I+IHW(J),J-1) .lt. 0.5) then
  1998. rincr(I,J)=0.125*( 4.*PSFC_IN(I,J)+ &
  1999. PSFC_IN(I+IHE(J),J+1)+PSFC_IN(I+IHE(J),J-1)+ &
  2000. PSFC_IN(I+IHW(J),J+1)+PSFC_IN(I+IHW(J),J-1) ) &
  2001. - PSFC_IN(I,J)
  2002. ! if (rincr(I,J) .ne. 0 .and. abs(rincr(I,J)) .gt. 20.) then
  2003. ! write(message,*) 'II, I,J,rincr: ', II, I,J,rincr(I,J)
  2004. ! CALL wrf_message(message)
  2005. ! endif
  2006. endif
  2007. endif
  2008. ENDDO
  2009. ENDDO
  2010. DO J=JTS+1,min(JTE,JDE-1)-1
  2011. DO I=ITS+1,min(ITE,IDE-1)-1
  2012. PSFC_IN(I,J)=PSFC_IN(I,J) + rincr(I,J)
  2013. ENDDO
  2014. ENDDO
  2015. ! write(message,*) ' -------------------------------------------------- '
  2016. ! CALL wrf_message(message)
  2017. end do II_loop
  2018. ALLOCATE(DUM2D(IMS:IME,JMS:JME))
  2019. DO J=JMS,JME
  2020. DO I=IMS,IME
  2021. DUM2D(I,J)=-9.
  2022. END DO
  2023. END DO
  2024. DO J=JTS,min(JTE,JDE-1)
  2025. I_loop: DO I=ITS,min(ITE,IDE-1)
  2026. IF (PSFC_IN(I,J) .lt. 0.1) THEN
  2027. write(message,*) 'QUITTING BECAUSE I,J, PSFC_IN: ', I,J,PSFC_IN(I,J)
  2028. call wrf_error_fatal(message)
  2029. ENDIF
  2030. BOT_INPUT_PRESS=PSFC_IN(I,J)
  2031. BOT_INPUT_HGT=TOPO_IN(I,J)
  2032. IF (I .eq. Ilook .AND. J .eq. Jlook) THEN
  2033. write(message,*) ' TERRAIN_HGT_T: ', I,J, TERRAIN_HGT_T(I,J)
  2034. CALL wrf_message(message)
  2035. write(message,*) ' PSFC_IN, TOPO_IN: ', &
  2036. I, J, PSFC_IN(I,J),TOPO_IN(I,J)
  2037. CALL wrf_message(message)
  2038. DO L=1,generic
  2039. write(message,*) ' L,PRESS3D_IN, Z3D_IN: ', &
  2040. I,J,L, PRESS3D_IN(I,J,L),Z3D_IN(I,J,L)
  2041. CALL wrf_debug(10,message)
  2042. END DO
  2043. ENDIF
  2044. DO L=2,generic-1
  2045. IF ( PRESS3D_IN(i,j,L) .gt. PSFC_IN(I,J) .AND. &
  2046. Z3D_IN(I,J,L) .lt. TERRAIN_HGT_T(I,J) .AND. &
  2047. Z3D_IN(I,J,L+1) .gt. TERRAIN_HGT_T(I,J) ) THEN
  2048. BOT_INPUT_PRESS=PRESS3D_IN(i,j,L)
  2049. BOT_INPUT_HGT=Z3D_IN(I,J,L)
  2050. ! IF (I .eq. Ilook .and. J .eq. Jlook) THEN
  2051. ! write(message,*) 'BOT_INPUT_PRESS, BOT_INPUT_HGT NOW : ', &
  2052. ! Ilook,Jlook, BOT_INPUT_PRESS, BOT_INPUT_HGT
  2053. ! CALL wrf_message(message)
  2054. ! ENDIF
  2055. ENDIF
  2056. END DO
  2057. !!!!!!!!!!!!!!!!!!!!!! START HYDRO CHECK
  2058. IF ( PRESS3D_IN(i,j,1) .ne. 200100. .AND. &
  2059. (PSFC_IN(I,J) .gt. PRESS3D_IN(i,j,2) .OR. &
  2060. TOPO_IN(I,J) .lt. Z3D_IN(I,J,2)) ) THEN ! extrapolate downward
  2061. IF (J .eq. JTS .AND. I .eq. ITS) THEN
  2062. write(message,*) 'hydro check - should only be for isobaric input'
  2063. CALL wrf_message(message)
  2064. ENDIF
  2065. IF (Z3D_IN(I,J,2) .ne. TOPO_IN(I,J)) THEN
  2066. dpdz=(PRESS3D_IN(i,j,2)-PSFC_IN(I,J))/(Z3D_IN(I,J,2)-TOPO_IN(I,J))
  2067. rhs=-9.81*((PRESS3D_IN(i,j,2)+ PSFC_IN(I,J))/2.)/(287.04* T3D_IN(I,J,2))
  2068. IF ( abs(PRESS3D_IN(i,j,2)-PSFC_IN(I,J)) .gt. 290.) THEN
  2069. IF (dpdz .lt. 1.05*rhs .OR. dpdz .gt. 0.95*rhs) THEN
  2070. write(message,*) 'I,J,P(2),Psfc,Z(2),Zsfc: ', &
  2071. I,J,PRESS3D_IN(i,j,2),PSFC_IN(I,J),Z3D_IN(I,J,2),TOPO_IN(I,J)
  2072. IF (mod(I,5).eq.0 .AND. mod(J,5).eq.0) CALL wrf_debug(50,message)
  2073. CYCLE I_loop
  2074. ENDIF
  2075. ENDIF
  2076. ELSE ! z(2) equals TOPO_IN
  2077. IF (PRESS3D_IN(i,j,2) .eq. PSFC_IN(I,J)) THEN
  2078. ! write(message,*) 'all equal at I,J: ', I,J
  2079. ! CALL wrf_message(message)
  2080. ELSE
  2081. ! write(message,*) 'heights equal, pressures not: ', &
  2082. ! PRESS3D_IN(i,j,2), PSFC_IN(I,J)
  2083. ! CALL wrf_message(message)
  2084. CYCLE I_loop
  2085. ENDIF
  2086. ENDIF
  2087. IF ( abs(PRESS3D_IN(i,j,2)-PSFC_IN(I,J)) .gt. 290.) THEN
  2088. IF (PRESS3D_IN(i,j,2) .lt. PSFC_IN(I,J) .and. &
  2089. Z3D_IN(I,J,2) .lt. TOPO_IN(I,J)) THEN
  2090. ! write(message,*) 'surface data mismatch(a) at I,J: ', I,J
  2091. ! CALL wrf_message(message)
  2092. CYCLE I_loop
  2093. ELSEIF (PRESS3D_IN(i,j,2) .gt. PSFC_IN(I,J) .AND. &
  2094. Z3D_IN(I,J,2) .gt. TOPO_IN(I,J)) THEN
  2095. ! write(message,*) 'surface data mismatch(b) at I,J: ', I,J
  2096. ! CALL wrf_message(message)
  2097. CYCLE I_loop
  2098. ENDIF
  2099. ENDIF
  2100. ENDIF
  2101. !!!!!!! loop over a few more levels
  2102. DO L=3,6
  2103. IF ( PRESS3D_IN(i,j,1) .ne. 200100. .AND. &
  2104. (((PSFC_IN(I,J)-PRESS3D_IN(i,j,L)) .lt. 400.) .OR. &
  2105. TOPO_IN(I,J) .lt. Z3D_IN(I,J,L))) then
  2106. IF (Z3D_IN(I,J,L) .ne. TOPO_IN(I,J)) THEN
  2107. dpdz=(PRESS3D_IN(i,j,L)-PSFC_IN(I,J))/ &
  2108. (Z3D_IN(I,J,L)-TOPO_IN(I,J))
  2109. rhs=-9.81*((PRESS3D_IN(i,j,L)+ PSFC_IN(I,J))/2.)/ &
  2110. (287.04*T3D_IN(I,J,L))
  2111. IF ( abs(PRESS3D_IN(i,j,L)-PSFC_IN(I,J)) .gt. 290.) THEN
  2112. IF (dpdz .lt. 1.05*rhs .or. dpdz .gt. 0.95*rhs) THEN
  2113. write(message,*) 'I,J,L,Piso,Psfc,Ziso,Zsfc: ', &
  2114. I,J,L,PRESS3D_IN(i,j,L),PSFC_IN(I,J),&
  2115. Z3D_IN(I,J,L),TOPO_IN(I,J)
  2116. IF (mod(I,5).eq.0 .AND. mod(J,5).eq.0) &
  2117. CALL wrf_debug(50,message)
  2118. CYCLE I_loop
  2119. ENDIF
  2120. ENDIF
  2121. ELSE
  2122. IF (PRESS3D_IN(i,j,2) .eq. PSFC_IN(I,J)) THEN
  2123. ! write(message,*) 'all equal at I,J: ', I,J
  2124. ! CALL wrf_message(message)
  2125. ELSE
  2126. CYCLE I_loop
  2127. ENDIF
  2128. ENDIF
  2129. ENDIF
  2130. IF ( abs(PRESS3D_IN(i,j,L)-PSFC_IN(I,J)) .gt. 290.) THEN
  2131. IF (PRESS3D_IN(i,j,L) .lt. PSFC_IN(I,J) .AND. &
  2132. Z3D_IN(I,J,L) .lt. TOPO_IN(I,J)) THEN
  2133. CYCLE I_loop
  2134. ELSEIF (PRESS3D_IN(i,j,L) .gt. PSFC_IN(I,J) .AND. &
  2135. Z3D_IN(I,J,L) .gt. TOPO_IN(I,J)) THEN
  2136. CYCLE I_loop
  2137. ENDIF
  2138. ENDIF
  2139. END DO
  2140. !!!!!!!!!!!!!!!!!!!!!! END HYDRO CHECK
  2141. IF (TERRAIN_HGT_T(I,J) .eq. BOT_INPUT_HGT ) THEN
  2142. dum2d(I,J)=BOT_INPUT_PRESS
  2143. IF (BOT_INPUT_HGT .ne. 0. .and. (BOT_INPUT_HGT-INT(BOT_INPUT_HGT) .ne. 0.) ) THEN
  2144. write(message,*) 'with BOT_INPUT_HGT: ', BOT_INPUT_HGT, &
  2145. 'set dum2d to bot_input_pres: ', I,J,dum2d(I,J)
  2146. CALL wrf_message(message)
  2147. ENDIF
  2148. IF (dum2d(I,J) .lt. 50000. .OR. dum2d(I,J) .gt. 109000.) THEN
  2149. write(message,*) 'bad dum2d(a): ', I,J,DUM2D(I,J)
  2150. CALL wrf_message(message)
  2151. ENDIF
  2152. ELSEIF (TERRAIN_HGT_T(I,J) .lt. BOT_INPUT_HGT ) THEN
  2153. ! target is below lowest possible input...extrapolate
  2154. IF ( BOT_INPUT_PRESS-PRESS3D_IN(I,J,2) .gt. 500. ) THEN
  2155. dlnpdz= (log(BOT_INPUT_PRESS)-log(PRESS3D_IN(i,j,2)) ) / &
  2156. (BOT_INPUT_HGT-Z3D_IN(i,j,2))
  2157. IF (I .eq. Ilook .and. J .eq. Jlook) THEN
  2158. write(message,*) 'I,J,dlnpdz(a): ', I,J,dlnpdz
  2159. CALL wrf_message(message)
  2160. ENDIF
  2161. ELSE
  2162. !! thin layer and/or just have lowest level - difference with 3rd level data
  2163. IF ( abs(BOT_INPUT_PRESS - PRESS3D_IN(i,j,3)) .gt. 290. ) THEN
  2164. dlnpdz= (log(BOT_INPUT_PRESS)-log(PRESS3D_IN(i,j,3)) ) / &
  2165. (BOT_INPUT_HGT-Z3D_IN(i,j,3))
  2166. IF (I .eq. Ilook .and. J .eq. Jlook) then
  2167. write(message,*) 'p diff: ', BOT_INPUT_PRESS, PRESS3D_IN(i,j,3)
  2168. CALL wrf_message(message)
  2169. write(message,*) 'z diff: ', BOT_INPUT_HGT, Z3D_IN(i,j,3)
  2170. CALL wrf_message(message)
  2171. ENDIF
  2172. ELSE
  2173. !! Loop up to level 7 looking for a sufficiently thick layer
  2174. FIND_THICK: DO LL=4,7
  2175. IF( abs(BOT_INPUT_PRESS - PRESS3D_IN(i,j,LL)) .gt. 290.) THEN
  2176. dlnpdz= (log(BOT_INPUT_PRESS)-log(PRESS3D_IN(i,j,LL)) ) / &
  2177. (BOT_INPUT_HGT-Z3D_IN(i,j,LL))
  2178. EXIT FIND_THICK
  2179. ENDIF
  2180. END DO FIND_THICK
  2181. ENDIF
  2182. ENDIF
  2183. dum2d(I,J)= exp(log(BOT_INPUT_PRESS) + dlnpdz * &
  2184. (TERRAIN_HGT_T(I,J) - BOT_INPUT_HGT) )
  2185. IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN
  2186. write(message,*) 'bad dum2d(b): ', I,J,DUM2D(I,J)
  2187. CALL wrf_message(message)
  2188. write(message,*) 'BOT_INPUT_PRESS, dlnpdz, TERRAIN_HGT_T, BOT_INPUT_HGT: ', &
  2189. BOT_INPUT_PRESS, dlnpdz, TERRAIN_HGT_T(I,J), BOT_INPUT_HGT
  2190. CALL wrf_message(message)
  2191. write(message,*) 'Z3D_IN: ', Z3D_IN(I,J,1:10)
  2192. CALL wrf_message(message)
  2193. write(message,*) 'PRESS3D_IN: ', PRESS3D_IN(I,J,1:10)
  2194. CALL wrf_message(message)
  2195. ENDIF
  2196. ELSE ! target level bounded by input levels
  2197. DO L=2,generic-1
  2198. IF (TERRAIN_HGT_T(I,J) .gt. Z3D_IN(i,j,L) .AND. &
  2199. TERRAIN_HGT_T(I,J) .lt. Z3D_IN(i,j,L+1) ) THEN
  2200. dlnpdz= (log(PRESS3D_IN(i,j,l))-log(PRESS3D_IN(i,j,L+1)) ) / &
  2201. (Z3D_IN(i,j,l)-Z3D_IN(i,j,L+1))
  2202. dum2d(I,J)= log(PRESS3D_IN(i,j,l)) + &
  2203. dlnpdz * (TERRAIN_HGT_T(I,J) - Z3D_IN(i,j,L) )
  2204. dum2d(i,j)=exp(dum2d(i,j))
  2205. IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN
  2206. write(message,*) 'bad dum2d(c): ', I,J,DUM2D(I,J)
  2207. CALL wrf_message(message)
  2208. ENDIF
  2209. ENDIF
  2210. ENDDO
  2211. !!! account for situation where BOT_INPUT_HGT < TERRAIN_HGT_T < Z3D_IN(:,2,:)
  2212. IF (dum2d(I,J) .eq. -9 .AND. BOT_INPUT_HGT .lt. TERRAIN_HGT_T(I,J) &
  2213. .AND. TERRAIN_HGT_T(I,J) .lt. Z3D_IN(I,J,2)) then
  2214. IF (mod(I,50) .eq. 0 .AND. mod(J,50) .eq. 0) THEN
  2215. write(message,*) 'I,J,BOT_INPUT_HGT, bot_pres, TERRAIN_HGT_T: ', &
  2216. I,J,BOT_INPUT_HGT, BOT_INPUT_PRESS, TERRAIN_HGT_T(I,J)
  2217. CALL wrf_message(message)
  2218. ENDIF
  2219. dlnpdz= (log(PSFC_IN(i,j))-log(PRESS3D_IN(i,j,2)) ) / &
  2220. (TOPO_IN(i,j)-Z3D_IN(i,j,2))
  2221. dum2d(I,J)= log(PSFC_IN(i,j)) + &
  2222. dlnpdz * (TERRAIN_HGT_T(I,J) - TOPO_IN(i,j) )
  2223. dum2d(i,j)= exp(dum2d(i,j))
  2224. IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN
  2225. write(message,*) 'bad dum2d(d): ', I,J,DUM2D(I,J)
  2226. CALL wrf_message(message)
  2227. ENDIF
  2228. ENDIF
  2229. IF (dum2d(I,J) .eq. -9.) THEN
  2230. write(message,*) 'must have flukey situation in new ', I,J
  2231. CALL wrf_message(message)
  2232. write(message,*) 'I,J,BOT_INPUT_HGT, bot_pres, TERRAIN_HGT_T: ', &
  2233. I,J,BOT_INPUT_HGT, BOT_INPUT_PRESS, TERRAIN_HGT_T(I,J)
  2234. CALL wrf_message(message)
  2235. DO L=1,generic-1
  2236. IF ( TERRAIN_HGT_T(I,J) .eq. Z3D_IN(i,j,L) ) THEN
  2237. ! problematic with HGT_M substitution for "input" surface height?
  2238. dum2d(i,j)=PRESS3D_IN(I,J,L)
  2239. IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN
  2240. write(message,*) 'bad dum2d(e): ', I,J,DUM2D(I,J)
  2241. CALL wrf_message(message)
  2242. ENDIF
  2243. ENDIF
  2244. ENDDO
  2245. IF ( TERRAIN_HGT_T(I,J) .eq. TOPO_IN(I,J)) THEN
  2246. dum2d(I,J)=PSFC_IN(I,J)
  2247. IF (dum2d(I,J) .lt. 50000. .or. dum2d(I,J) .gt. 108000.) THEN
  2248. write(message,*) 'bad dum2d(grid%f): ', I,J,DUM2D(I,J)
  2249. CALL wrf_message(message)
  2250. ENDIF
  2251. write(message,*) 'matched input topo, psfc: ', I,J,TOPO_IN(I,J),PSFC_IN(I,J)
  2252. CALL wrf_message(message)
  2253. ENDIF
  2254. IF (dum2d(I,J) .eq. -9.) THEN
  2255. CALL wrf_error_fatal("quitting due to undefined surface pressure")
  2256. ENDIF
  2257. ENDIF
  2258. DEFINED_PSFC(I,J)=.TRUE.
  2259. IF (I .eq. Ilook .AND. J .eq. Jlook) THEN
  2260. write(message,*) 'newstyle psfc: ', I,J,dum2d(I,J)
  2261. CALL wrf_message(message)
  2262. ENDIF
  2263. ENDIF
  2264. ENDDO I_loop
  2265. ENDDO
  2266. ! write(message,*) 'psfc points (new style)'
  2267. ! CALL wrf_message(message)
  2268. ! DO J=min(JTE,JDE-1),JTS,-loopinc
  2269. ! write(message,633) (dum2d(I,J)/100.,I=ITS,min(ITE,IDE-1),iloopinc)
  2270. ! CALL wrf_message(message)
  2271. ! END DO
  2272. 633 format(35(f5.0,1x))
  2273. write(message,*) 'PSFC extremes (new style)'
  2274. CALL wrf_message(message)
  2275. write(message,*) minval(dum2d,MASK=DEFINED_PSFC),maxval(dum2d,MASK=DEFINED_PSFC)
  2276. CALL wrf_message(message)
  2277. ! IF (minval(dum2d,MASK=DEFINED_PSFC) .lt. 50000. .or. maxval(dum2d,MASK=DEFINED_PSFC) .gt. 108000.) THEN
  2278. DO J=JTS,min(JTE,JDE-1)
  2279. DO I=ITS,min(ITE,IDE-1)
  2280. IF (DEFINED_PSFC(I,J) .AND. dum2d(I,J) .lt. 50000. ) THEN
  2281. IF (TERRAIN_HGT_T(I,J) .gt. 4500.) THEN
  2282. WRITE(message,*) 'low surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J)
  2283. CALL wrf_debug(2,message)
  2284. ELSE
  2285. CALL wrf_error_fatal("quit due to unrealistic surface pressure")
  2286. ENDIF
  2287. ENDIF
  2288. IF (DEFINED_PSFC(I,J) .AND. dum2d(I,J) .gt. 108000. ) THEN
  2289. IF (TERRAIN_HGT_T(I,J) .lt. -10.) THEN
  2290. WRITE(message,*) 'high surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J)
  2291. CALL wrf_debug(2,message)
  2292. ELSE
  2293. CALL wrf_error_fatal("quit due to unrealistic surface pressure")
  2294. ENDIF
  2295. ENDIF
  2296. END DO
  2297. END DO
  2298. !! "traditional" isobaric only approach ------------------------------------------------
  2299. ALLOCATE (DUM2DB(IMS:IME,JMS:JME))
  2300. DO J=JMS,JME
  2301. DO I=IMS,IME
  2302. DUM2DB(I,J)=-9.
  2303. END DO
  2304. END DO
  2305. DO J=JTS,min(JTE,JDE-1)
  2306. DO I=ITS,min(ITE,IDE-1)
  2307. IF (TERRAIN_HGT_T(I,J) .lt. Z3D_IN(i,j,2)) THEN ! targ below lowest
  2308. IF ( abs(PRESS3D_IN(i,j,2)-PRESS3D_IN(i,j,3)) .gt. 290.) THEN
  2309. dlnpdz= (log(PRESS3D_IN(i,j,2))-log(PRESS3D_IN(i,j,3)) ) / &
  2310. (Z3D_IN(i,j,2)-Z3D_IN(i,j,3))
  2311. ELSE
  2312. dlnpdz= (log(PRESS3D_IN(i,j,2))-log(PRESS3D_IN(i,j,4)) ) / &
  2313. (Z3D_IN(i,j,2)-Z3D_IN(i,j,4))
  2314. ENDIF
  2315. DUM2DB(I,J)= exp( log(PRESS3D_IN(i,j,2)) + dlnpdz * &
  2316. (TERRAIN_HGT_T(I,J) - Z3D_IN(i,j,2)) )
  2317. IF (I .eq. Ilook .and. J .eq. Jlook) THEN
  2318. write(message,*) 'I,K, trad: dlnpdz, press_in(2), terrain_t, Z3D_IN(2): ', I,J,dlnpdz, &
  2319. PRESS3D_IN(i,j,2), TERRAIN_HGT_T(I,J), Z3D_IN(i,j,2)
  2320. CALL wrf_message(message)
  2321. ENDIF
  2322. DEFINED_PSFCB(i,j)=.true.
  2323. ELSEIF (TERRAIN_HGT_T(I,J) .gt. Z3D_IN(i,j,2)) THEN ! target level bounded by input levels
  2324. DO L=2,generic-1
  2325. IF (TERRAIN_HGT_T(I,J) .gt. Z3D_IN(i,j,L) .AND. &
  2326. TERRAIN_HGT_T(I,J) .lt. Z3D_IN(i,j,L+1) ) THEN
  2327. dlnpdz= (log(PRESS3D_IN(i,j,l))-log(PRESS3D_IN(i,j,L+1)) ) / &
  2328. (Z3D_IN(i,j,l)-Z3D_IN(i,j,L+1))
  2329. DUM2DB(I,J)= log(PRESS3D_IN(i,j,l)) + &
  2330. dlnpdz * (TERRAIN_HGT_T(I,J) - Z3D_IN(i,j,L) )
  2331. DUM2DB(i,j)=exp(DUM2DB(i,j))
  2332. DEFINED_PSFCB(i,j)=.true.
  2333. IF (DUM2DB(I,J) .lt. 13000.) THEN
  2334. write(message,*) 'I,J,L,terrain,Z3d(L),z3d(L+1),p3d(L),p3d(l+1): ', I,J,L, &
  2335. TERRAIN_HGT_T(I,J),Z3D_IN(I,J,L),Z3D_IN(I,J,L+1),PRESS3D_IN(I,J,L), &
  2336. PRESS3D_IN(I,J,L+1)
  2337. CALL wrf_error_fatal(message)
  2338. ENDIF
  2339. ENDIF
  2340. ENDDO
  2341. ELSEIF (TERRAIN_HGT_T(I,J) .eq. Z3D_IN(i,j,2)) THEN
  2342. DUM2DB(i,j)=PRESS3D_IN(I,J,2)
  2343. DEFINED_PSFCB(i,j)=.true.
  2344. ENDIF
  2345. IF (DUM2DB(I,J) .eq. -9.) THEN
  2346. write(message,*) 'must have flukey situation in trad ', I,J
  2347. CALL wrf_message(message)
  2348. DO L=1,generic-1
  2349. IF ( TERRAIN_HGT_T(I,J) .eq. Z3D_IN(i,j,L) ) THEN
  2350. DUM2DB(i,j)=PRESS3D_IN(I,J,L)
  2351. DEFINED_PSFCB(i,j)=.true.
  2352. ENDIF
  2353. ENDDO
  2354. ENDIF
  2355. IF (DUM2DB(I,J) .eq. -9.) THEN
  2356. write(message,*) 'HOPELESS PSFC, I QUIT'
  2357. CALL wrf_error_fatal(message)
  2358. ENDIF
  2359. if (I .eq. Ilook .and. J .eq. Jlook) THEN
  2360. write(message,*) ' traditional psfc: ', I,J,DUM2DB(I,J)
  2361. CALL wrf_message(message)
  2362. ENDIF
  2363. ENDDO
  2364. ENDDO
  2365. ! write(message,*) 'psfc points (traditional)'
  2366. ! CALL wrf_message(message)
  2367. ! DO J=min(JTE,JDE-1),JTS,-loopinc
  2368. ! write(message,633) (DUM2DB(I,J)/100.,I=its,min(ite,IDE-1),iloopinc)
  2369. ! CALL wrf_message(message)
  2370. ! ENDDO
  2371. write(message,*) 'PSFC extremes (traditional)'
  2372. CALL wrf_message(message)
  2373. write(message,*) minval(DUM2DB,MASK=DEFINED_PSFCB),maxval(DUM2DB,MASK=DEFINED_PSFCB)
  2374. CALL wrf_message(message)
  2375. DO J=JTS,min(JTE,JDE-1)
  2376. DO I=ITS,min(ITE,IDE-1)
  2377. IF (DEFINED_PSFCB(I,J) .AND. dum2db(I,J) .lt. 50000. ) THEN
  2378. IF (TERRAIN_HGT_T(I,J) .gt. 4500.) THEN
  2379. WRITE(message,*) 'low surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J)
  2380. CALL wrf_debug(2,message)
  2381. ELSE
  2382. CALL wrf_error_fatal("quit due to unrealistic surface pressure")
  2383. ENDIF
  2384. ENDIF
  2385. IF (DEFINED_PSFCB(I,J) .AND. dum2db(I,J) .gt. 108000. ) THEN
  2386. IF (TERRAIN_HGT_T(I,J) .lt. -10.) THEN
  2387. WRITE(message,*) 'high surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J)
  2388. CALL wrf_debug(2,message)
  2389. ELSE
  2390. CALL wrf_error_fatal("quit due to unrealistic surface pressure")
  2391. ENDIF
  2392. ENDIF
  2393. ! IF (DEFINED_PSFCB(I,J) .AND. ( dum2db(I,J) .lt. 50000. .OR. dum2db(I,J) .gt. 108000. )) THEN
  2394. ! IF (TERRAIN_HGT_T(I,J) .gt. -10. .and. TERRAIN_HGT_T(I,J) .lt. 5000.) THEN
  2395. ! write(0,*) 'I,J, terrain_hgt_t, dum2db: ', I,J, terrain_hgt_t(I,J),dum2db(I,J)
  2396. ! CALL wrf_error_fatal("quit due to unrealistic surface pressure")
  2397. ! ELSE
  2398. ! WRITE(message,*) 'surface pressure allowed because surface height is extreme value of: ', TERRAIN_HGT_T(I,J)
  2399. ! CALL wrf_debug(2,message)
  2400. ! ENDIF
  2401. ! ENDIF
  2402. ENDDO
  2403. ENDDO
  2404. !!!!! end traditional
  2405. DO J=JTS,min(JTE,JDE-1)
  2406. DO I=ITS,min(ITE,IDE-1)
  2407. IF (DEFINED_PSFCB(I,J) .and. DEFINED_PSFC(I,J)) THEN
  2408. IF ( abs(dum2d(I,J)-DUM2DB(I,J)) .gt. 400.) THEN
  2409. write(message,*) 'BIG DIFF I,J, dum2d, DUM2DB: ', I,J,dum2d(I,J),DUM2DB(I,J)
  2410. CALL wrf_message(message)
  2411. ENDIF
  2412. !! do we have enough confidence in new style to give it more than 50% weight?
  2413. psfc_out(I,J)=0.5*(dum2d(I,J)+DUM2DB(I,J))
  2414. ELSEIF (DEFINED_PSFC(I,J)) THEN
  2415. psfc_out(I,J)=dum2d(I,J)
  2416. ELSEIF (DEFINED_PSFCB(I,J)) THEN
  2417. psfc_out(I,J)=DUM2DB(I,J)
  2418. ELSE
  2419. write(message,*) 'I,J,dum2d,DUM2DB: ', I,J,dum2d(I,J),DUM2DB(I,J)
  2420. CALL wrf_message(message)
  2421. write(message,*) 'I,J,DEFINED_PSFC(I,J),DEFINED_PSFCB(I,J): ', I,J,DEFINED_PSFC(I,J),DEFINED_PSFCB(I,J)
  2422. CALL wrf_message(message)
  2423. call wrf_error_fatal("psfc_out completely undefined")
  2424. ENDIF
  2425. IF (I .eq. Ilook .AND. J .eq. Jlook) THEN
  2426. write(message,*) ' combined psfc: ', I,J,psfc_out(I,J)
  2427. CALL wrf_message(message)
  2428. ENDIF
  2429. IF (psfc_out(I,J) .lt. 50000. ) THEN
  2430. IF (TERRAIN_HGT_T(I,J) .gt. 4500.) THEN
  2431. WRITE(message,*) 'low surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J)
  2432. CALL wrf_debug(2,message)
  2433. ELSE
  2434. write(message,*) 'possibly bad combo on psfc_out: ', I,J, psfc_out(I,J)
  2435. CALL wrf_debug(2,message)
  2436. write(message,*) 'DEFINED_PSFC, dum2d: ', DEFINED_PSFC(I,J),dum2d(I,J)
  2437. CALL wrf_debug(2,message)
  2438. write(message,*) 'DEFINED_PSFCB, DUM2DB: ', DEFINED_PSFCB(I,J),DUM2DB(I,J)
  2439. CALL wrf_debug(2,message)
  2440. CALL wrf_error_fatal("quit due to unrealistic surface pressure")
  2441. ENDIF
  2442. ENDIF
  2443. IF (psfc_out(I,J) .gt. 108000. ) THEN
  2444. IF (TERRAIN_HGT_T(I,J) .lt. -10.) THEN
  2445. WRITE(message,*) 'high surface pressure allowed because surface height is: ', TERRAIN_HGT_T(I,J)
  2446. CALL wrf_debug(2,message)
  2447. ELSE
  2448. write(message,*) 'possibly bad combo on psfc_out: ', I,J, psfc_out(I,J)
  2449. CALL wrf_debug(2,message)
  2450. write(message,*) 'DEFINED_PSFC, dum2d: ', DEFINED_PSFC(I,J),dum2d(I,J)
  2451. CALL wrf_debug(2,message)
  2452. write(message,*) 'DEFINED_PSFCB, DUM2DB: ', DEFINED_PSFCB(I,J),DUM2DB(I,J)
  2453. CALL wrf_debug(2,message)
  2454. CALL wrf_error_fatal("quit due to unrealistic surface pressure")
  2455. ENDIF
  2456. ENDIF
  2457. ENDDO
  2458. ENDDO
  2459. deallocate(dum2d,dum2db)
  2460. END SUBROUTINE compute_nmm_surfacep
  2461. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2462. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2463. SUBROUTINE compute_3d_pressure(psfc_out,SGML1,SGML2,pdtop,pt &
  2464. &, pd,p3d_out &
  2465. &, IDS,IDE,JDS,JDE,KDS,KDE &
  2466. &, IMS,IME,JMS,JME,KMS,KME &
  2467. &, ITS,ITE,JTS,JTE,KTS,KTE )
  2468. INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE
  2469. INTEGER :: IMS,IME,JMS,JME,KMS,KME
  2470. INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE
  2471. REAL, INTENT(IN) :: psfc_out(IMS:IME,JMS:JME)
  2472. REAL, INTENT(IN) :: SGML1(KDE),SGML2(KDE),pdtop,pt
  2473. REAL, INTENT(OUT):: p3d_out(IMS:IME,JMS:JME,KDS:KDE-1)
  2474. REAL, INTENT(OUT):: pd(IMS:IME,JMS:JME)
  2475. CHARACTER (len=255) :: message
  2476. ! write(message,*) 'pdtop, pt, psfc_out(1,1): ', pdtop, pt, psfc_out(1,1)
  2477. ! CALL wrf_message(message)
  2478. DO J=JTS,min(JTE,JDE-1)
  2479. DO I=ITS,min(ITE,IDE-1)
  2480. pd(I,J)=psfc_out(I,J)-pdtop-pt
  2481. ENDDO
  2482. ENDDO
  2483. DO J=JTS,min(JTE,JDE-1)
  2484. DO K=KDS,KDE-1
  2485. DO I=ITS,min(ITE,IDE-1)
  2486. p3d_out(I,J,K)=pd(I,J)*SGML2(K)+pdtop*SGML1(K)+pt
  2487. IF (p3d_out(I,J,K) .ge. psfc_out(I,J) .or. p3d_out(I,J,K) .le. pt) THEN
  2488. write(message,*) 'I,K,J,p3d_out: ', I,K,J,p3d_out(I,J,K)
  2489. CALL wrf_error_fatal(message)
  2490. ENDIF
  2491. ENDDO
  2492. ENDDO
  2493. ENDDO
  2494. END SUBROUTINE compute_3d_pressure
  2495. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2496. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2497. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2498. SUBROUTINE interp_press2press_lin(press_in,press_out, &
  2499. data_in, data_out,generic &
  2500. &, extrapolate,ignore_lowest,TFIELD &
  2501. &, IDS,IDE,JDS,JDE,KDS,KDE &
  2502. &, IMS,IME,JMS,JME,KMS,KME &
  2503. &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time )
  2504. ! Interpolates data from one set of pressure surfaces to
  2505. ! another set of pressures
  2506. INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE
  2507. INTEGER :: IMS,IME,JMS,JME,KMS,KME
  2508. INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE,generic
  2509. INTEGER :: internal_time
  2510. ! REAL, INTENT(IN) :: press_in(IMS:IME,generic,JMS:JME)
  2511. REAL, INTENT(IN) :: press_in(IMS:IME,JMS:JME,generic)
  2512. REAL, INTENT(IN) :: press_out(IMS:IME,JMS:JME,KDS:KDE-1)
  2513. ! REAL, INTENT(IN) :: data_in(IMS:IME,generic,JMS:JME)
  2514. REAL, INTENT(IN) :: data_in(IMS:IME,JMS:JME,generic)
  2515. REAL, INTENT(OUT) :: data_out(IMS:IME,JMS:JME,KMS:KME)
  2516. LOGICAL, INTENT(IN) :: extrapolate, ignore_lowest, TFIELD
  2517. LOGICAL :: col_smooth
  2518. INTEGER :: i,j
  2519. INTEGER :: k,kk
  2520. REAL :: desired_press
  2521. REAL :: dvaldlnp,dlnp,tadiabat,tiso
  2522. REAL, PARAMETER :: ADIAFAC=9.81/1004.
  2523. REAL, PARAMETER :: TSTEXTRAPFAC=.0065
  2524. DO K=KMS,KME
  2525. DO J=JMS,JME
  2526. DO I=IMS,IME
  2527. DATA_OUT(I,J,K)=-99999.9
  2528. ENDDO
  2529. ENDDO
  2530. ENDDO
  2531. IF (ignore_lowest) then
  2532. LMIN=2
  2533. ELSE
  2534. LMIN=1
  2535. ENDIF
  2536. DO j = JTS, min(JTE,JDE-1)
  2537. test_i: DO i = ITS, min(ITE,IDE-1)
  2538. IF (internal_time_loop .gt. 1) THEN
  2539. IF (J .ne. JDS .and. J .ne. JDE-1 .and. &
  2540. I .ne. IDS .and. I .ne. IDE-1 ) THEN
  2541. !! not on boundary
  2542. CYCLE test_i
  2543. ENDIF
  2544. ENDIF
  2545. col_smooth=.false.
  2546. output_loop: DO k = KDS,KDE-1
  2547. desired_press = press_out(i,j,k)
  2548. if (K .gt. KDS) then
  2549. if (TFIELD .and. col_smooth .and. desired_press .le. press_in(i,j,LMIN) &
  2550. .and. press_out(i,j,k-1) .ge. press_in(i,j,LMIN)) then
  2551. MAX_SMOOTH=K
  2552. ! write(message,*) 'I,J, MAX_SMOOTH: ', I,J, MAX_SMOOTH
  2553. ! CALL wrf_debug(100,message)
  2554. endif
  2555. endif
  2556. ! keep track of where the extrapolation begins
  2557. IF (desired_press .GT. press_in(i,j,LMIN)) THEN
  2558. IF (TFIELD .and. K .eq. 1 .and. (desired_press - press_in(i,j,LMIN)) .gt. 3000.) then
  2559. col_smooth=.TRUE. ! due to large extrapolation distance
  2560. ENDIF
  2561. IF ((desired_press - press_in(i,j,LMIN)).LT. 50.) THEN ! 0.5 mb
  2562. data_out(i,j,k) = data_in(i,j,LMIN)
  2563. ELSE
  2564. IF (extrapolate) THEN
  2565. ! Extrapolate downward because desired P level is below
  2566. ! the lowest level in our input data. Extrapolate using simple
  2567. ! 1st derivative of value with respect to ln P for the bottom 2
  2568. ! input layers.
  2569. ! Add a check to make sure we are not using the gradient of
  2570. ! a very thin layer
  2571. if (TFIELD) then
  2572. tiso=0.5*(data_in(i,j,1)+data_in(i,j,2))
  2573. endif
  2574. IF ( (press_in(i,j,LMIN)-press_in(i,j,LMIN+1)) .GT. 500.) THEN ! likely isobaric data
  2575. dlnp = log(press_in(i,j,LMIN))-log(press_in(i,j,LMIN+1))
  2576. dvaldlnp = (data_in(i,j,LMIN) - data_in(i,j,LMIN+1)) / dlnp
  2577. ELSE ! assume terrain following
  2578. dlnp = log(press_in(i,j,LMIN))-log(press_in(i,j,LMIN+5))
  2579. dvaldlnp = (data_in(i,j,LMIN) - data_in(i,j,LMIN+5)) / dlnp
  2580. ENDIF
  2581. data_out(i,j,k) = data_in(i,j,LMIN) + dvaldlnp * &
  2582. ( log(desired_press)-log(press_in(i,j,LMIN)) )
  2583. if (TFIELD .and. data_out(i,j,k) .lt. tiso-0.2) then
  2584. ! restrict slope to -1K/10 hPa
  2585. dvaldlnp=max(dvaldlnp, -1.0/ &
  2586. log( press_in(i,j,LMIN) / &
  2587. ( press_in(i,j,LMIN)-1000.) ))
  2588. data_out(I,J,K)= data_in(i,j,LMIN) + dvaldlnp * &
  2589. ( log(desired_press)-log(press_in(i,j,LMIN)) )
  2590. elseif (TFIELD .and. data_out(i,j,k) .gt. tiso+0.2) then
  2591. ! restrict slope to +0.8K/10 hPa
  2592. dvaldlnp=min(dvaldlnp, 0.8/ &
  2593. log( press_in(i,j,LMIN) / &
  2594. ( press_in(i,j,LMIN)-1000.) ))
  2595. data_out(I,J,K)= data_in(i,j,LMIN) + dvaldlnp * &
  2596. ( log(desired_press)-log(press_in(i,j,LMIN)) )
  2597. endif
  2598. ELSE
  2599. data_out(i,j,k) = data_in(i,j,LMIN)
  2600. ENDIF
  2601. ENDIF
  2602. ELSE IF (desired_press .LT. press_in(i,j,generic)) THEN
  2603. IF ( (press_in(i,j,generic) - desired_press) .LT. 10.) THEN
  2604. data_out(i,j,k) = data_in(i,j,generic)
  2605. ELSE
  2606. IF (extrapolate) THEN
  2607. ! Extrapolate upward
  2608. IF ((press_in(i,j,generic-1)-press_in(i,j,generic)).GT.50.) THEN
  2609. dlnp =log(press_in(i,j,generic))-log(press_in(i,j,generic-1))
  2610. dvaldlnp=(data_in(i,j,generic)-data_in(i,j,generic-1))/dlnp
  2611. ELSE
  2612. dlnp =log(press_in(i,j,generic))-log(press_in(i,j,generic-2))
  2613. dvaldlnp=(data_in(i,j,generic)-data_in(i,j,generic-2))/dlnp
  2614. ENDIF
  2615. data_out(i,j,k) = data_in(i,j,generic) + &
  2616. dvaldlnp * (log(desired_press)-log(press_in(i,j,generic)))
  2617. ELSE
  2618. data_out(i,j,k) = data_in(i,j,generic)
  2619. ENDIF
  2620. ENDIF
  2621. ELSE
  2622. ! We can trap between two levels and linearly interpolate
  2623. input_loop: DO kk = LMIN, generic-1
  2624. IF (desired_press .EQ. press_in(i,j,kk) )THEN
  2625. data_out(i,j,k) = data_in(i,j,kk)
  2626. EXIT input_loop
  2627. ELSE IF ( (desired_press .LT. press_in(i,j,kk)) .AND. &
  2628. (desired_press .GT. press_in(i,j,kk+1)) ) THEN
  2629. ! do trapped in lnp
  2630. dlnp = log(press_in(i,j,kk)) - log(press_in(i,j,kk+1))
  2631. dvaldlnp = (data_in(i,j,kk)-data_in(i,j,kk+1))/dlnp
  2632. data_out(i,j,k) = data_in(i,j,kk+1)+ &
  2633. dvaldlnp*(log(desired_press)-log(press_in(i,j,kk+1)))
  2634. EXIT input_loop
  2635. ENDIF
  2636. ENDDO input_loop
  2637. ENDIF
  2638. ENDDO output_loop
  2639. if (col_smooth) then
  2640. do K=max(KDS,MAX_SMOOTH-4),MAX_SMOOTH+4
  2641. data_out(I,J,K)=0.5*(data_out(I,J,K)+data_out(I,J,K+1))
  2642. enddo
  2643. endif
  2644. ENDDO test_i
  2645. ENDDO
  2646. END SUBROUTINE interp_press2press_lin
  2647. SUBROUTINE wind_adjust(press_in,press_out, &
  2648. U_in, V_in,U_out,V_out &
  2649. &, generic,depth_replace &
  2650. &, IDS,IDE,JDS,JDE,KDS,KDE &
  2651. &, IMS,IME,JMS,JME,KMS,KME &
  2652. &, ITS,ITE,JTS,JTE,KTS,KTE )
  2653. INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE
  2654. INTEGER :: IMS,IME,JMS,JME,KMS,KME
  2655. INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE,generic
  2656. INTEGER :: MAXLIN,MAXLOUT
  2657. REAL, INTENT(IN) :: press_in(IMS:IME,JMS:JME,generic)
  2658. REAL, INTENT(IN) :: press_out(IMS:IME,JMS:JME,KDS:KDE-1)
  2659. REAL, INTENT(IN) :: U_in(IMS:IME,JMS:JME,generic)
  2660. REAL, INTENT(IN) :: V_in(IMS:IME,JMS:JME,generic)
  2661. REAL, INTENT(INOUT) :: U_out(IMS:IME,KMS:KME,JMS:JME)
  2662. REAL, INTENT(INOUT) :: V_out(IMS:IME,KMS:KME,JMS:JME)
  2663. REAL :: p1d_in(generic)
  2664. REAL :: p1d_out(KDS:KDE-1)
  2665. DO j = JTS, min(JTE,JDE-1)
  2666. DO i = ITS, min(ITE,IDE-1)
  2667. ! IF (press_out(I,J,1) .lt. press_in(I,J,2)) then
  2668. IF( (press_in(I,J,2)-press_out(I,J,1)) .gt. 200.) then
  2669. U_out(I,1,J)=U_in(I,J,2)
  2670. V_out(I,1,J)=V_in(I,J,2)
  2671. INLOOP: DO L=2,generic
  2672. p1d_in(L)=-9999.
  2673. IF ( (press_in(I,J,2)-press_in(I,J,L)) .lt. depth_replace) THEN
  2674. p1d_in(L)=(press_in(I,J,2)-press_in(I,J,L))
  2675. MAXLIN=L
  2676. ELSE
  2677. p1d_in(L)=(press_in(I,J,2)-press_in(I,J,L))
  2678. EXIT INLOOP
  2679. ENDIF
  2680. END DO INLOOP
  2681. OUTLOOP: DO L=KDS,KDE-1
  2682. p1d_out(L)=-9999.
  2683. IF ( (press_out(I,J,1)-press_out(I,J,L)) .lt. depth_replace) THEN
  2684. p1d_out(L)=(press_out(I,J,1)-press_out(I,J,L))
  2685. MAXLOUT=L
  2686. ELSE
  2687. EXIT OUTLOOP
  2688. ENDIF
  2689. END DO OUTLOOP
  2690. DO L=1,MAXLOUT
  2691. ptarg=p1d_out(L)
  2692. FINDLOOP: DO LL=2,MAXLIN
  2693. if (p1d_in(LL) .lt. ptarg .and. p1d_in(LL+1) .gt. ptarg) then
  2694. dlnp=log(p1d_in(LL))-log(p1d_in(LL+1))
  2695. dudlnp=(U_in(I,J,LL)-U_in(I,J,LL+1))/dlnp
  2696. dvdlnp=(V_in(I,J,LL)-V_in(I,J,LL+1))/dlnp
  2697. U_out(I,L,J)=U_in(I,J,LL)+dudlnp*(log(ptarg)-log(p1d_in(LL)))
  2698. V_out(I,L,J)=V_in(I,J,LL)+dvdlnp*(log(ptarg)-log(p1d_in(LL)))
  2699. EXIT FINDLOOP
  2700. endif
  2701. END DO FINDLOOP
  2702. END DO ! MAXLOUT loop
  2703. ENDIF
  2704. ENDDO
  2705. ENDDO
  2706. END SUBROUTINE wind_adjust
  2707. !--------------------------------------------------------------------
  2708. SUBROUTINE interp_press2press_log(press_in,press_out, &
  2709. data_in, data_out, generic &
  2710. &, extrapolate,ignore_lowest &
  2711. &, IDS,IDE,JDS,JDE,KDS,KDE &
  2712. &, IMS,IME,JMS,JME,KMS,KME &
  2713. &, ITS,ITE,JTS,JTE,KTS,KTE, internal_time )
  2714. ! Interpolates ln(data) from one set of pressure surfaces to
  2715. ! another set of pressures
  2716. INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE
  2717. INTEGER :: IMS,IME,JMS,JME,KMS,KME
  2718. INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE,generic
  2719. INTEGER :: internal_time
  2720. ! REAL, INTENT(IN) :: press_in(IMS:IME,generic,JMS:JME)
  2721. REAL, INTENT(IN) :: press_in(IMS:IME,JMS:JME,generic)
  2722. REAL, INTENT(IN) :: press_out(IMS:IME,JMS:JME,KDS:KDE-1)
  2723. ! REAL, INTENT(IN) :: data_in(IMS:IME,generic,JMS:JME)
  2724. ! REAL, INTENT(IN) :: data_in(IMS:IME,JMS:JME,generic)
  2725. REAL :: data_in(IMS:IME,JMS:JME,generic)
  2726. REAL, INTENT(OUT) :: data_out(IMS:IME,JMS:JME,KMS:KME)
  2727. LOGICAL, INTENT(IN) :: extrapolate, ignore_lowest
  2728. INTEGER :: i,j
  2729. INTEGER :: k,kk
  2730. REAL :: desired_press
  2731. REAL :: dlnvaldlnp,dlnp
  2732. DO K=1,generic
  2733. DO j = JTS, min(JTE,JDE-1)
  2734. DO i = ITS, min(ITE,IDE-1)
  2735. DATA_IN(I,J,K)=max(DATA_in(I,J,K),1.e-13)
  2736. ENDDO
  2737. ENDDO
  2738. ENDDO
  2739. DO K=KMS,KME
  2740. DO J=JMS,JME
  2741. DO I=IMS,IME
  2742. DATA_OUT(I,J,K)=-99999.9
  2743. ENDDO
  2744. ENDDO
  2745. ENDDO
  2746. IF (ignore_lowest) then
  2747. LMIN=2
  2748. ELSE
  2749. LMIN=1
  2750. ENDIF
  2751. DO j = JTS, min(JTE,JDE-1)
  2752. test_i: DO i = ITS, min(ITE,IDE-1)
  2753. IF (internal_time .gt. 1) THEN
  2754. IF (J .ne. JDS .and. J .ne. JDE-1 .and. &
  2755. I .ne. IDS .and. I .ne. IDE-1 ) THEN
  2756. !! not on boundary
  2757. CYCLE test_i
  2758. ENDIF
  2759. ENDIF
  2760. output_loop: DO k = KDS,KDE-1
  2761. desired_press = press_out(i,j,k)
  2762. IF (desired_press .GT. press_in(i,j,LMIN)) THEN
  2763. IF ((desired_press - press_in(i,j,LMIN)).LT. 10.) THEN ! 0.1 mb
  2764. data_out(i,j,k) = data_in(i,j,LMIN)
  2765. ELSE
  2766. IF (extrapolate) THEN
  2767. ! Extrapolate downward because desired P level is below
  2768. ! the lowest level in our input data. Extrapolate using simple
  2769. ! 1st derivative of value with respect to ln P for the bottom 2
  2770. ! input layers.
  2771. ! Add a check to make sure we are not using the gradient of
  2772. ! a very thin layer
  2773. IF ( (press_in(i,j,LMIN)-press_in(i,j,LMIN+1)) .GT. 100.) THEN
  2774. dlnp = log(press_in(i,j,LMIN))-log(press_in(i,j,LMIN+1))
  2775. dlnvaldlnp = ( log(data_in(i,j,LMIN)) - log(data_in(i,j,LMIN+1)) ) / dlnp
  2776. ELSE
  2777. dlnp = log(press_in(i,j,LMIN))-log(press_in(i,j,LMIN+2))
  2778. dlnvaldlnp = (log(data_in(i,j,LMIN)) - log(data_in(i,j,LMIN+2))) / dlnp
  2779. ENDIF
  2780. data_out(i,j,k) = exp(log(data_in(i,j,LMIN)) + dlnvaldlnp * &
  2781. ( log(desired_press)-log(press_in(i,j,LMIN))))
  2782. ELSE
  2783. data_out(i,j,k) = data_in(i,j,LMIN)
  2784. ENDIF
  2785. ENDIF
  2786. ELSE IF (desired_press .LT. press_in(i,j,generic)) THEN
  2787. IF ( (press_in(i,j,generic) - desired_press) .LT. 10.) THEN
  2788. data_out(i,j,k) = data_in(i,j,generic)
  2789. ELSE
  2790. IF (extrapolate) THEN
  2791. ! Extrapolate upward
  2792. IF ((press_in(i,j,generic-1)-press_in(i,j,generic)).GT.50.) THEN
  2793. dlnp =log(press_in(i,j,generic))-log(press_in(i,j,generic-1))
  2794. dlnvaldlnp=(log(data_in(i,j,generic))-log(data_in(i,j,generic-1)))/dlnp
  2795. ELSE
  2796. dlnp =log(press_in(i,j,generic))-log(press_in(i,j,generic-2))
  2797. dlnvaldlnp=(log(data_in(i,j,generic))-log(data_in(i,j,generic-2)))/dlnp
  2798. ENDIF
  2799. data_out(i,j,k) = exp(log(data_in(i,j,generic)) + &
  2800. dlnvaldlnp * (log(desired_press)-log(press_in(i,j,generic))))
  2801. ELSE
  2802. data_out(i,j,k) = data_in(i,j,generic)
  2803. ENDIF
  2804. ENDIF
  2805. ELSE
  2806. ! We can trap between two levels and linearly interpolate
  2807. input_loop: DO kk = LMIN, generic-1
  2808. IF (desired_press .EQ. press_in(i,j,kk) )THEN
  2809. data_out(i,j,k) = data_in(i,j,kk)
  2810. EXIT input_loop
  2811. ELSE IF ( (desired_press .LT. press_in(i,j,kk)) .AND. &
  2812. (desired_press .GT. press_in(i,j,kk+1)) ) THEN
  2813. ! do trapped in lnp
  2814. dlnp = log(press_in(i,j,kk)) - log(press_in(i,j,kk+1))
  2815. dlnvaldlnp = (log(data_in(i,j,kk))-log(data_in(i,j,kk+1)))/dlnp
  2816. data_out(i,j,k) = exp(log(data_in(i,j,kk+1))+ &
  2817. dlnvaldlnp*(log(desired_press)-log(press_in(i,j,kk+1))))
  2818. EXIT input_loop
  2819. ENDIF
  2820. ENDDO input_loop
  2821. ENDIF
  2822. ENDDO output_loop
  2823. ENDDO test_i
  2824. ENDDO
  2825. END SUBROUTINE interp_press2press_log
  2826. !-------------------------------------------------------------------
  2827. SUBROUTINE rh_to_mxrat (rh, t, p, q , wrt_liquid , &
  2828. ids , ide , jds , jde , kds , kde , &
  2829. ims , ime , jms , jme , kms , kme , &
  2830. its , ite , jts , jte , kts , kte )
  2831. IMPLICIT NONE
  2832. INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
  2833. ims , ime , jms , jme , kms , kme , &
  2834. its , ite , jts , jte , kts , kte
  2835. LOGICAL , INTENT(IN) :: wrt_liquid
  2836. ! REAL , DIMENSION(ims:ime,kms:kme,jms:jme) , INTENT(IN) :: p , t
  2837. ! REAL , DIMENSION(ims:ime,kms:kme,jms:jme) , INTENT(INOUT) :: rh
  2838. REAL , DIMENSION(ims:ime,jms:jme,kms:kme) , INTENT(IN) :: p , t
  2839. REAL , DIMENSION(ims:ime,jms:jme,kms:kme) , INTENT(INOUT) :: rh
  2840. REAL , DIMENSION(ims:ime,jms:jme,kms:kme) , INTENT(OUT) :: q
  2841. ! Local vars
  2842. INTEGER :: i , j , k
  2843. REAL :: ew , q1 , t1
  2844. REAL, PARAMETER :: T_REF = 0.0
  2845. REAL, PARAMETER :: MW_AIR = 28.966
  2846. REAL, PARAMETER :: MW_VAP = 18.0152
  2847. REAL, PARAMETER :: A0 = 6.107799961
  2848. REAL, PARAMETER :: A1 = 4.436518521e-01
  2849. REAL, PARAMETER :: A2 = 1.428945805e-02
  2850. REAL, PARAMETER :: A3 = 2.650648471e-04
  2851. REAL, PARAMETER :: A4 = 3.031240396e-06
  2852. REAL, PARAMETER :: A5 = 2.034080948e-08
  2853. REAL, PARAMETER :: A6 = 6.136820929e-11
  2854. REAL, PARAMETER :: ES0 = 6.1121
  2855. REAL, PARAMETER :: C1 = 9.09718
  2856. REAL, PARAMETER :: C2 = 3.56654
  2857. REAL, PARAMETER :: C3 = 0.876793
  2858. REAL, PARAMETER :: EIS = 6.1071
  2859. REAL :: RHS
  2860. REAL, PARAMETER :: TF = 273.16
  2861. REAL :: TK
  2862. REAL :: ES
  2863. REAL :: QS
  2864. REAL, PARAMETER :: EPS = 0.622
  2865. REAL, PARAMETER :: SVP1 = 0.6112
  2866. REAL, PARAMETER :: SVP2 = 17.67
  2867. REAL, PARAMETER :: SVP3 = 29.65
  2868. REAL, PARAMETER :: SVPT0 = 273.15
  2869. ! This subroutine computes mixing ratio (q, kg/kg) from basic variables
  2870. ! pressure (p, Pa), temperature (t, K) and relative humidity (rh, 1-100%).
  2871. ! The reference temperature (t_ref, C) is used to describe the temperature
  2872. ! at which the liquid and ice phase change occurs.
  2873. DO k = kts , kte
  2874. DO j = jts , MIN ( jde-1 , jte )
  2875. DO i = its , MIN (ide-1 , ite )
  2876. rh(i,j,k) = MIN ( MAX ( rh(i,j,k) , 1. ) , 100. )
  2877. END DO
  2878. END DO
  2879. END DO
  2880. IF ( wrt_liquid ) THEN
  2881. DO k = kts , kte
  2882. DO j = jts , MIN ( jde-1 , jte )
  2883. DO i = its , MIN (ide-1 , ite )
  2884. es=svp1*10.*EXP(svp2*(t(i,j,k)-svpt0)/(t(i,j,k)-svp3))
  2885. qs=eps*es/(p(i,j,k)/100.-es)
  2886. q(i,j,k)=MAX(.01*rh(i,j,k)*qs,0.0)
  2887. END DO
  2888. END DO
  2889. END DO
  2890. ELSE
  2891. DO k = kts , kte
  2892. DO j = jts , MIN ( jde-1 , jte )
  2893. DO i = its , MIN (ide-1 , ite )
  2894. t1 = t(i,j,k) - 273.16
  2895. ! Obviously dry.
  2896. IF ( t1 .lt. -200. ) THEN
  2897. q(i,j,k) = 0
  2898. ELSE
  2899. ! First compute the ambient vapor pressure of water
  2900. IF ( ( t1 .GE. t_ref ) .AND. ( t1 .GE. -47.) ) THEN ! liq phase ESLO
  2901. ew = a0 + t1 * (a1 + t1 * (a2 + t1 * (a3 + t1 * (a4 + t1 * (a5 + t1 * a6)))))
  2902. ELSE IF ( ( t1 .GE. t_ref ) .AND. ( t1 .LT. -47. ) ) then !liq phas poor ES
  2903. ew = es0 * exp(17.67 * t1 / ( t1 + 243.5))
  2904. ELSE
  2905. tk = t(i,j,k)
  2906. rhs = -c1 * (tf / tk - 1.) - c2 * alog10(tf / tk) + &
  2907. c3 * (1. - tk / tf) + alog10(eis)
  2908. ew = 10. ** rhs
  2909. END IF
  2910. ! Now sat vap pres obtained compute local vapor pressure
  2911. ew = MAX ( ew , 0. ) * rh(i,j,k) * 0.01
  2912. ! Now compute the specific humidity using the partial vapor
  2913. ! pressures of water vapor (ew) and dry air (p-ew). The
  2914. ! constants assume that the pressure is in hPa, so we divide
  2915. ! the pressures by 100.
  2916. q1 = mw_vap * ew
  2917. q1 = q1 / (q1 + mw_air * (p(i,j,k)/100. - ew))
  2918. q(i,j,k) = q1 / (1. - q1 )
  2919. END IF
  2920. END DO
  2921. END DO
  2922. END DO
  2923. END IF
  2924. END SUBROUTINE rh_to_mxrat
  2925. !--=------------------------------------------------------------------
  2926. SUBROUTINE boundary_smooth(h, landmask, grid, nsmth , nrow &
  2927. &, IDS,IDE,JDS,JDE,KDS,KDE &
  2928. &, IMS,IME,JMS,JME,KMS,KME &
  2929. &, ITS,ITE,JTS,JTE,KTS,KTE )
  2930. implicit none
  2931. TYPE (domain) :: grid
  2932. integer :: IDS,IDE,JDS,JDE,KDS,KDE
  2933. integer :: IMS,IME,JMS,JME,KMS,KME
  2934. integer :: ITS,ITE,JTS,JTE,KTS,KTE
  2935. integer:: ihw(JDS:JDE-1),ihe(JDS:JDE-1),nsmth,nrow
  2936. real:: h(IMS:IME,JMS:JME),landmask(IMS:IME,JMS:JME)
  2937. real :: h_old(IMS:IME,JMS:JME)
  2938. real :: hbms(IDS:IDE-1,JDS:JDE-1)
  2939. real :: hse(IDS:IDE-1,JDS:JDE-1)
  2940. real :: hne(IDS:IDE-1,JDS:JDE-1)
  2941. integer :: IPS,IPE,JPS,JPE,KPS,KPE
  2942. integer :: ihl, ihh, m2l, ibas,jmelin
  2943. integer :: I,J,KS,IOFFSET,JSTART,JEND
  2944. character (len=255) :: message
  2945. ips=its
  2946. ipe=ite
  2947. jps=jts
  2948. jpe=jte
  2949. kps=kts
  2950. kpe=kte
  2951. do j= JTS,min(JTE,JDE-1)
  2952. ihw(J)=-mod(J,2)
  2953. ihe(j)=ihw(J)+1
  2954. end do
  2955. do J=JTS,min(JTE,JDE-1)
  2956. do I=ITS,min(ITE,IDE-1)
  2957. hbms(I,J)=landmask(I,J)
  2958. enddo
  2959. enddo
  2960. jmelin=(JDE-1)-nrow+1
  2961. ibas=nrow/2
  2962. m2l=mod(nrow,2)
  2963. do j=jts,min(jte,jde-1)
  2964. ihl=ibas+mod(j,2)+m2l*mod(J+1,2)
  2965. ihh=(IDE-1)-ibas-m2l*mod(J+1,2)
  2966. do i=its,min(ite,ide-1)
  2967. if (I .ge. ihl .and. I .le. ihh .and. J .ge. nrow .and. J .le. jmelin) then
  2968. hbms(I,J)=0.
  2969. endif
  2970. end do
  2971. end do
  2972. 634 format(30(f2.0,1x))
  2973. do KS=1,nsmth
  2974. grid%ht_gc=h
  2975. #ifdef DM_PARALLEL
  2976. # include "HALO_NMM_MG.inc"
  2977. #endif
  2978. h=grid%ht_gc
  2979. h_old=grid%ht_gc
  2980. do J=JTS,min(JTE,JDE-1)
  2981. do I=ITS, min(ITE,IDE-1)
  2982. if (I .ge. (IDS+mod(J,2)) .and. J .gt. JDS .and. J .lt. JDE-1 .and. I .lt. IDE-1) then
  2983. h(i,j)= ( h_old(i+ihe(j),j+1) + h_old(i+ihw(j),j-1) + h_old(i+ihe(j),j-1) + h_old(i+ihw(j),j+1) - &
  2984. 4. *h_old(i,j) )*hbms(i,j)*0.125+h_old(i,j)
  2985. endif
  2986. enddo
  2987. enddo
  2988. ! special treatment for four corners
  2989. if (hbms(1,1) .eq. 1 .and. ITS .le. 1 .and. JTS .le. 1) then
  2990. h(1,1)=0.75*h(1,1)+0.125*h(1+ihe(1),2)+ &
  2991. 0.0625*(h(2,1)+h(1,3))
  2992. endif
  2993. if (hbms(IDE-1,1) .eq. 1 .and. ITE .ge. IDE-2 .and. JTS .le. 1) then
  2994. h(IDE-1,1)=0.75*h(IDE-1,1)+0.125*h(IDE-1+ihw(1),2)+ &
  2995. 0.0625*(h(IDE-1-1,1)+h(IDE-1,3))
  2996. endif
  2997. if (hbms(1,JDE-1) .eq. 1 .and. ITS .le. 1 .and. JTE .ge. JDE-2) then
  2998. h(1,JDE-1)=0.75*h(1,JDE-1)+0.125*h(1+ihe(JDE-1),JDE-1-1)+ &
  2999. 0.0625*(h(2,JDE-1)+h(1,JDE-1-2))
  3000. endif
  3001. if (hbms(IDE-1,JDE-1) .eq. 1 .and. ITE .ge. IDE-2 .and. JTE .ge. JDE-2) then
  3002. h(IDE-1,JDE-1)=0.75*h(IDE-1,JDE-1)+0.125*h(IDE-1+ihw(JDE-1),JDE-1-1)+ &
  3003. 0.0625*(h(IDE-1-1,JDE-1)+h(IDE-1,JDE-1-2))
  3004. endif
  3005. do J=JMS,JME
  3006. do I=IMS,IME
  3007. grid%ht_gc(I,J)=h(I,J)
  3008. enddo
  3009. enddo
  3010. #ifdef DM_PARALLEL
  3011. # include "HALO_NMM_MG.inc"
  3012. #endif
  3013. do J=JMS,JME
  3014. do I=IMS,IME
  3015. h(I,J)=grid%ht_gc(I,J)
  3016. enddo
  3017. enddo
  3018. ! S bound
  3019. if (JTS .eq. JDS) then
  3020. J=JTS
  3021. do I=ITS,ITE
  3022. if (I .ge. IDS+1 .and. I .le. IDE-2) then
  3023. if (hbms(I,J) .eq. 1) then
  3024. h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J+1)+h(I+ihe(J),J+1))
  3025. endif
  3026. endif
  3027. enddo
  3028. endif
  3029. ! N bound
  3030. if (JTE .eq. JDE) then
  3031. J=JDE-1
  3032. write(message,*) 'DOING N BOUND SMOOTHING for J= ', J
  3033. CALL wrf_debug(100,message)
  3034. do I=ITS,min(ITE,IDE-1)
  3035. if (hbms(I,J) .eq. 1 .and. I .ge. IDS+1 .and. I .le. IDE-2) then
  3036. h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J-1)+h(I+ihe(J),J-1))
  3037. endif
  3038. enddo
  3039. endif
  3040. ! W bound
  3041. if (ITS .eq. IDS) then
  3042. I=ITS
  3043. do J=JTS,min(JTE,JDE-1)
  3044. if (hbms(I,J) .eq. 1 .and. J .ge. JDS+2 .and. J .le. JDE-3 .and. mod(J,2) .eq. 1) then
  3045. h(I,J)=0.75*h(I,J)+0.125*(h(I+ihe(J),J+1)+h(I+ihe(J),J-1))
  3046. endif
  3047. enddo
  3048. endif
  3049. ! E bound
  3050. if (ITE .eq. IDE) then
  3051. write(message,*) 'DOING E BOUND SMOOTHING for I= ', min(ITE,IDE-1)
  3052. CALL wrf_debug(100,message)
  3053. I=min(ITE,IDE-1)
  3054. do J=JTS,min(JTE,JDE-1)
  3055. if (hbms(I,J) .eq. 1 .and. J .ge. JDS+2 .and. J .le. JDE-3 .and. mod(J,2) .eq. 1) then
  3056. h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J+1)+h(I+ihw(J),J-1))
  3057. endif
  3058. enddo
  3059. endif
  3060. enddo ! end ks loop
  3061. do J=JMS,JME
  3062. do I=IMS,IME
  3063. grid%ht_gc(I,J)=h(I,J)
  3064. enddo
  3065. enddo
  3066. #ifdef DM_PARALLEL
  3067. #include "HALO_NMM_MG.inc"
  3068. #endif
  3069. do J=JMS,JME
  3070. do I=IMS,IME
  3071. h(I,J)=grid%ht_gc(I,J)
  3072. enddo
  3073. enddo
  3074. ! extra smoothing along inner boundary
  3075. if (JTS .eq. JDS) then
  3076. if (ITE .eq. IDE) then
  3077. IOFFSET=1
  3078. else
  3079. IOFFSET=0
  3080. endif
  3081. ! Southern Boundary
  3082. do i=its,min(ITE,IDE-1)-IOFFSET
  3083. h(i,2)=0.25*(h(i,1)+h(i+1,1)+ &
  3084. h(i,3)+h(i+1,3))
  3085. enddo
  3086. endif
  3087. if (JTE .eq. JDE) then
  3088. if (ITE .eq. IDE) then
  3089. IOFFSET=1
  3090. else
  3091. IOFFSET=0
  3092. endif
  3093. do i=its,min(ITE,IDE-1)-IOFFSET
  3094. h(i,(JDE-1)-1)=0.25*(h(i,(JDE-1)-2)+h(i+1,(JDE-1)-2)+ &
  3095. h(i,JDE-1)+h(i+1,JDE-1))
  3096. enddo
  3097. endif
  3098. if (JTS .eq. 1) then
  3099. JSTART=4
  3100. else
  3101. JSTART=JTS+mod(JTS,2) ! needs to be even
  3102. endif
  3103. if (JTE .eq. JDE) then
  3104. JEND=(JDE-1)-3
  3105. else
  3106. JEND=JTE
  3107. endif
  3108. if (ITS .eq. IDS) then
  3109. ! Western Boundary
  3110. do j=JSTART,JEND,2
  3111. h(1,j)=0.25*(h(1,j-1)+h(2,j-1)+ &
  3112. h(1,j+1)+h(2,j+1))
  3113. enddo
  3114. endif
  3115. if (ITE .eq. IDE) then
  3116. ! Eastern Boundary
  3117. do j=JSTART,JEND,2
  3118. h((IDE-1)-1,j)=0.25*(h((IDE-1)-1,j-1)+h((IDE-1),j-1)+ &
  3119. h((IDE-1)-1,j+1)+h((IDE-1),j+1))
  3120. enddo
  3121. endif
  3122. END SUBROUTINE boundary_smooth
  3123. !--------------------------------------------------------------------
  3124. SUBROUTINE monthly_interp_to_date ( field_in , date_str , field_out , &
  3125. ids , ide , jds , jde , kds , kde , &
  3126. ims , ime , jms , jme , kms , kme , &
  3127. its , ite , jts , jte , kts , kte )
  3128. ! Linrarly in time interpolate data to a current valid time. The data is
  3129. ! assumed to come in "monthly", valid at the 15th of every month.
  3130. IMPLICIT NONE
  3131. INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
  3132. ims , ime , jms , jme , kms , kme , &
  3133. its , ite , jts , jte , kts , kte
  3134. CHARACTER (LEN=24) , INTENT(IN) :: date_str
  3135. REAL , DIMENSION(ims:ime,jms:jme,12) , INTENT(IN) :: field_in
  3136. REAL , DIMENSION(ims:ime, jms:jme) , INTENT(OUT) :: field_out
  3137. ! Local vars
  3138. INTEGER :: i , j , l
  3139. INTEGER , DIMENSION(0:13) :: middle
  3140. INTEGER :: target_julyr , target_julday , target_date
  3141. INTEGER :: julyr , julday , int_month, next_month
  3142. REAL :: gmt
  3143. CHARACTER (LEN=4) :: yr
  3144. CHARACTER (LEN=2) :: mon , day15
  3145. WRITE(day15,FMT='(I2.2)') 15
  3146. DO l = 1 , 12
  3147. WRITE(mon,FMT='(I2.2)') l
  3148. CALL get_julgmt ( date_str(1:4)//'-'//mon//'-'//day15//'_'//'00:00:00.0000' , julyr , julday , gmt )
  3149. middle(l) = julyr*1000 + julday
  3150. END DO
  3151. l = 0
  3152. middle(l) = middle( 1) - 31
  3153. l = 13
  3154. middle(l) = middle(12) + 31
  3155. CALL get_julgmt ( date_str , target_julyr , target_julday , gmt )
  3156. target_date = target_julyr * 1000 + target_julday
  3157. find_month : DO l = 0 , 12
  3158. IF ( ( middle(l) .LT. target_date ) .AND. ( middle(l+1) .GE. target_date ) ) THEN
  3159. DO j = jts , MIN ( jde-1 , jte )
  3160. DO i = its , MIN (ide-1 , ite )
  3161. int_month = MOD ( l , 12 )
  3162. IF ( int_month .EQ. 0 ) int_month = 12
  3163. IF (int_month == 12) THEN
  3164. next_month=1
  3165. ELSE
  3166. next_month=int_month+1
  3167. ENDIF
  3168. field_out(i,j) = ( field_in(i,j,next_month) * ( target_date - middle(l) ) + &
  3169. field_in(i,j,int_month ) * ( middle(l+1) - target_date ) ) / &
  3170. ( middle(l+1) - middle(l) )
  3171. END DO
  3172. END DO
  3173. EXIT find_month
  3174. END IF
  3175. END DO find_month
  3176. END SUBROUTINE monthly_interp_to_date
  3177. !---------------------------------------------------------------------
  3178. SUBROUTINE monthly_min_max ( field_in , field_min , field_max , &
  3179. ids , ide , jds , jde , kds , kde , &
  3180. ims , ime , jms , jme , kms , kme , &
  3181. its , ite , jts , jte , kts , kte )
  3182. ! Plow through each month, find the max, min values for each i,j.
  3183. IMPLICIT NONE
  3184. INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
  3185. ims , ime , jms , jme , kms , kme , &
  3186. its , ite , jts , jte , kts , kte
  3187. REAL , DIMENSION(ims:ime,jms:jme,12) , INTENT(IN) :: field_in
  3188. REAL , DIMENSION(ims:ime, jms:jme) , INTENT(OUT) :: field_min , field_max
  3189. ! Local vars
  3190. INTEGER :: i , j , l
  3191. REAL :: minner , maxxer
  3192. DO j = jts , MIN(jde-1,jte)
  3193. DO i = its , MIN(ide-1,ite)
  3194. minner = field_in(i,j,1)
  3195. maxxer = field_in(i,j,1)
  3196. DO l = 2 , 12
  3197. IF ( field_in(i,j,l) .LT. minner ) THEN
  3198. minner = field_in(i,j,l)
  3199. END IF
  3200. IF ( field_in(i,j,l) .GT. maxxer ) THEN
  3201. maxxer = field_in(i,j,l)
  3202. END IF
  3203. END DO
  3204. field_min(i,j) = minner
  3205. field_max(i,j) = maxxer
  3206. END DO
  3207. END DO
  3208. END SUBROUTINE monthly_min_max
  3209. !-----------------------------------------------------------------------
  3210. SUBROUTINE reverse_vert_coord ( field, start_z, end_z &
  3211. &, IDS,IDE,JDS,JDE,KDS,KDE &
  3212. &, IMS,IME,JMS,JME,KMS,KME &
  3213. &, ITS,ITE,JTS,JTE,KTS,KTE )
  3214. IMPLICIT NONE
  3215. INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
  3216. ims , ime , jms , jme , kms , kme , &
  3217. its , ite , jts , jte , kts , kte, &
  3218. start_z, end_z
  3219. REAL, INTENT(INOUT) :: field(IMS:IME,JMS:JME,end_z)
  3220. ! local
  3221. INTEGER :: I,J,L
  3222. REAL, ALLOCATABLE :: dum3d(:,:,:)
  3223. allocate(dum3d(IMS:IME,JMS:JME,end_z))
  3224. DO L=start_z,end_z
  3225. DO J=jts,min(jte,jde-1)
  3226. DO I=its,min(ite,ide-1)
  3227. dum3d(I,J,L)=field(I,J,end_z-L+start_z)
  3228. END DO
  3229. END DO
  3230. END DO
  3231. DO L=start_z,end_z
  3232. DO J=jts,min(jte,jde-1)
  3233. DO I=its,min(ite,ide-1)
  3234. field(I,J,L)=dum3d(I,J,L)
  3235. END DO
  3236. END DO
  3237. END DO
  3238. DEALLOCATE(dum3d)
  3239. END SUBROUTINE reverse_vert_coord
  3240. !--------------------------------------------------------------------
  3241. SUBROUTINE compute_nmm_levels(ninterface, ptop, eta_levels)
  3242. USE module_model_constants
  3243. IMPLICIT NONE
  3244. character(len=132):: message
  3245. integer :: ninterface,Lthick,L
  3246. real, parameter:: gamma=.0065
  3247. real, parameter:: t_stand=288.
  3248. real, parameter:: p_stand=101325.
  3249. real :: maxdz_compute, ptop
  3250. real :: plower,pupper,tlay, sum
  3251. real :: eta_levels(ninterface)
  3252. real, allocatable:: Z(:)
  3253. real, allocatable:: deta_levels_spline(:)
  3254. logical:: print_pbl_warn
  3255. !----------------------------------------------------
  3256. allocate(Z(ninterface))
  3257. allocate(deta_levels_spline(ninterface-1))
  3258. CALL compute_eta_spline(ninterface-1,deta_levels_spline,ptop)
  3259. sum=0.
  3260. DO L=1,ninterface-1
  3261. sum=sum+deta_levels_spline(L)
  3262. ENDDO
  3263. eta_levels(1)=1.00
  3264. DO L=2,ninterface
  3265. eta_levels(L)=eta_levels(L-1)-deta_levels_spline(L-1)
  3266. ENDDO
  3267. eta_levels(ninterface)=0.00
  3268. DO L=2,ninterface-1
  3269. eta_levels(L)=0.5*(eta_levels(L))+0.25*(eta_levels(L-1)+eta_levels(L+1))
  3270. ENDDO
  3271. Z(1)=0.
  3272. maxdz_compute=0.
  3273. print_pbl_warn=.false.
  3274. DO L=2,ninterface
  3275. tlay=max( t_stand-gamma*Z(L-1), 216.5)
  3276. plower=ptop+(p_stand-ptop)*eta_levels(L-1)
  3277. pupper=ptop+(p_stand-ptop)*eta_levels(L)
  3278. Z(L)=Z(L-1)+(tlay*r_d/g)*(log(plower)-log(pupper))
  3279. if (plower .gt. 85000. .and. pupper .lt. 85000. .and. L .lt. 10) then
  3280. print_pbl_warn=.true.
  3281. endif
  3282. write(message,*) 'L, eta(l), pupper, Z(L): ', L, eta_levels(L),pupper,Z(L)
  3283. CALL wrf_debug(100,message)
  3284. if (Z(L)-Z(L-1) .gt. maxdz_compute) then
  3285. Lthick=L
  3286. endif
  3287. maxdz_compute=max(maxdz_compute,Z(L)-Z(L-1))
  3288. ENDDO
  3289. if (print_pbl_warn) then
  3290. write(message,*) 'WARNING - PBL MAY BE POORLY RESOLVED WITH NUMBER OF VERTICAL LEVELS'
  3291. CALL wrf_message(message)
  3292. write(message,*) ' - CONSIDER INCREASING THE VERTICAL RESOLUTION'
  3293. CALL wrf_message(message)
  3294. endif
  3295. write(message,*) 'thickest layer was: ', maxdz_compute , 'meters thick at level: ', Lthick
  3296. CALL wrf_message(message)
  3297. END SUBROUTINE compute_nmm_levels
  3298. !---------------------------
  3299. SUBROUTINE compute_eta_spline(LM, dsg, ptop)
  3300. IMPLICIT NONE
  3301. real:: dsg(LM), ptop, sum, rsum
  3302. real, allocatable:: xold(:),dold(:)
  3303. real, allocatable:: xnew(:),sgm(:)
  3304. real, allocatable:: pps(:),qqs(:),y2s(:)
  3305. integer nlev,LM,L,KOLD
  3306. IF (LM .ge. 46) THEN
  3307. KOLD=9
  3308. allocate(xold(KOLD))
  3309. allocate(dold(KOLD))
  3310. xold(1)=.00
  3311. dold(1)=.006
  3312. xold(2)=.13
  3313. dold(2)=.009
  3314. xold(3)=.19
  3315. dold(3)=.012
  3316. xold(4)=.30
  3317. dold(4)=.036
  3318. xold(5)=.42
  3319. dold(5)=.041
  3320. xold(6)=.56
  3321. dold(6)=.040
  3322. xold(7)=.69
  3323. dold(7)=.018
  3324. if (ptop .ge. 2000.) then
  3325. xold(8)=.90
  3326. dold(8)=.012
  3327. xold(9)=1.0
  3328. dold(9)=.006
  3329. else
  3330. xold(8)=.90
  3331. dold(8)=.008
  3332. xold(9)=1.0
  3333. dold(9)=.003
  3334. endif
  3335. ELSE
  3336. KOLD=8
  3337. allocate(xold(KOLD))
  3338. allocate(dold(KOLD))
  3339. xold(1)=.00
  3340. dold(1)=.006
  3341. xold(2)=.18
  3342. dold(2)=.015
  3343. xold(3)=.32
  3344. dold(3)=.035
  3345. xold(4)=.50
  3346. dold(4)=.040
  3347. xold(5)=.68
  3348. dold(5)=.030
  3349. xold(6)=.75
  3350. dold(6)=.017
  3351. xold(7)=.85
  3352. dold(7)=.012
  3353. if (ptop .ge. 2000.) then
  3354. xold(8)=1.0
  3355. dold(8)=.013
  3356. else
  3357. xold(8)=1.0
  3358. dold(8)=.008
  3359. endif
  3360. ENDIF
  3361. allocate(xnew(lm))
  3362. allocate(sgm(lm+1))
  3363. allocate(pps(lm))
  3364. allocate(qqs(lm))
  3365. allocate(y2s(lm))
  3366. DO L=1,LM
  3367. xnew(l)=float(l-1)/float(lm-1)
  3368. ENDDO
  3369. y2s=0.
  3370. CALL spline(kold,xold,dold,y2s,lm,xnew,dsg,pps,qqs)
  3371. sum=0.
  3372. DO l=1,lm
  3373. sum=sum+dsg(l)
  3374. ENDDO
  3375. rsum=1./sum
  3376. sgm(1)=0.
  3377. DO L=1,lm-1
  3378. dsg(l)=dsg(l)*rsum
  3379. sgm(l+1)=sgm(l)+dsg(l)
  3380. ENDDO
  3381. sgm(lm+1)=1.
  3382. dsg(lm)=sgm(lm+1)-sgm(lm)
  3383. END SUBROUTINE compute_eta_spline
  3384. ! -------------------------------------------------------------------
  3385. subroutine spline(NOLD,XOLD,YOLD,Y2,NNEW,XNEW,YNEW,P,q)
  3386. ! ********************************************************************
  3387. ! * *
  3388. ! * THIS IS A ONE-DIMENSIONAL CUBIC SPLINE FITTING ROUTINE *
  3389. ! * PROGRAMED FOR A SMALL SCALAR MACHINE. *
  3390. ! * *
  3391. ! * PROGRAMER Z. JANJIC *
  3392. ! * *
  3393. ! * NOLD - NUMBER OF GIVEN VALUES OF THE FUNCTION. MUST BE GE 3. *
  3394. ! * XOLD - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE *
  3395. ! * FUNCTION ARE GIVEN. MUST BE IN ASCENDING ORDER. *
  3396. ! * YOLD - THE GIVEN VALUES OF THE FUNCTION AT THE POINTS XOLD. *
  3397. ! * Y2 - THE SECOND DERIVATIVES AT THE POINTS XOLD. IF NATURAL *
  3398. ! * SPLINE IS FITTED Y2(1)=0. AND Y2(NOLD)=0. MUST BE *
  3399. ! * SPECIFIED. *
  3400. ! * NNEW - NUMBER OF VALUES OF THE FUNCTION TO BE CALCULATED. *
  3401. ! * XNEW - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE *
  3402. ! * FUNCTION ARE CALCULATED. XNEW(K) MUST BE GE XOLD(1) *
  3403. ! * AND LE XOLD(NOLD). *
  3404. ! * YNEW - THE VALUES OF THE FUNCTION TO BE CALCULATED. *
  3405. ! * P, q - AUXILIARY VECTORS OF THE LENGTH NOLD-2. *
  3406. ! * *
  3407. ! ********************************************************************
  3408. !
  3409. ! LOG:
  3410. !
  3411. ! JOVIC - July 2008 - fixed incorrectly dimensioned arrays,
  3412. ! PYLE and do loop leading to out of bound array
  3413. ! reference
  3414. !------
  3415. !
  3416. ! PYLE - June 2007 - eliminated use of GO TO statements.
  3417. !
  3418. !-----------------------------------------------------------------------
  3419. IMPLICIT NONE
  3420. !-----------------------------------------------------------------------
  3421. INTEGER,INTENT(IN) :: NNEW,NOLD
  3422. REAL,DIMENSION(NOLD),INTENT(IN) :: XOLD,YOLD
  3423. REAL,DIMENSION(NNEW),INTENT(IN) :: XNEW
  3424. REAL,DIMENSION(NNEW),INTENT(OUT) :: YNEW
  3425. REAL,DIMENSION(NOLD+2),INTENT(INOUT) :: P,q,Y2
  3426. !
  3427. INTEGER :: K,K1,K2,KOLD,NOLDM1, K2_hold, K_hold
  3428. REAL :: AK,BK,CK,DEN,DX,DXC,DXL,DXR,DYDXL,DYDXR &
  3429. & ,RDX,RTDXC,X,XK,XSQ,Y2K,Y2KP1
  3430. !-----------------------------------------------------------------------
  3431. NOLDM1=NOLD-1
  3432. DXL=XOLD(2)-XOLD(1)
  3433. DXR=XOLD(3)-XOLD(2)
  3434. DYDXL=(YOLD(2)-YOLD(1))/DXL
  3435. DYDXR=(YOLD(3)-YOLD(2))/DXR
  3436. RTDXC=0.5/(DXL+DXR)
  3437. P(1)= RTDXC*(6.*(DYDXR-DYDXL)-DXL*Y2(1))
  3438. q(1)=-RTDXC*DXR
  3439. K=3
  3440. first_loop: DO K=3,NOLD-1
  3441. DXL=DXR
  3442. DYDXL=DYDXR
  3443. DXR=XOLD(K+1)-XOLD(K)
  3444. DYDXR=(YOLD(K+1)-YOLD(K))/DXR
  3445. DXC=DXL+DXR
  3446. DEN=1./(DXL*q(K-2)+DXC+DXC)
  3447. P(K-1)= DEN*(6.*(DYDXR-DYDXL)-DXL*P(K-2))
  3448. q(K-1)=-DEN*DXR
  3449. END DO first_loop
  3450. DO K=NOLDM1,2,-1
  3451. Y2(K)=P(K-1)+q(K-1)*Y2(K+1)
  3452. K_hold=K
  3453. END DO
  3454. K=K_hold
  3455. !-----------------------------------------------------------------------
  3456. second_loop: DO K1=1,NNEW
  3457. XK=XNEW(K1)
  3458. third_loop: DO K2=2,NOLD
  3459. IF(XOLD(K2)>XK)THEN
  3460. KOLD=K2-1
  3461. K2_hold=K2
  3462. exit third_loop
  3463. ENDIF
  3464. K2_hold=K2
  3465. END DO third_loop
  3466. IF (XOLD(K2_hold) .le. XK) THEN
  3467. YNEW(K1)=YOLD(NOLD)
  3468. CYCLE second_loop
  3469. ENDIF
  3470. IF (K1 .eq. 1 .or. K .ne. KOLD) THEN
  3471. K=KOLD
  3472. Y2K=Y2(K)
  3473. Y2KP1=Y2(K+1)
  3474. DX=XOLD(K+1)-XOLD(K)
  3475. RDX=1./DX
  3476. AK=.1666667*RDX*(Y2KP1-Y2K)
  3477. BK=0.5*Y2K
  3478. CK=RDX*(YOLD(K+1)-YOLD(K))-.1666667*DX*(Y2KP1+Y2K+Y2K)
  3479. ENDIF
  3480. X=XK-XOLD(K)
  3481. XSQ=X*X
  3482. YNEW(K1)=AK*XSQ*X+BK*XSQ+CK*X+YOLD(K)
  3483. END DO second_loop
  3484. END SUBROUTINE SPLINE
  3485. !--------------------------------------------------------------------
  3486. SUBROUTINE NMM_SH2O(IMS,IME,JMS,JME,ISTART,IM,JSTART,JM,&
  3487. NSOIL,ISLTPK, &
  3488. sm,sice,stc,smc,sh2o)
  3489. !! INTEGER, PARAMETER:: NSOTYP=9
  3490. ! INTEGER, PARAMETER:: NSOTYP=16
  3491. INTEGER, PARAMETER:: NSOTYP=19 !!!!!!!!MAYBE???
  3492. REAL :: PSIS(NSOTYP),BETA(NSOTYP),SMCMAX(NSOTYP)
  3493. REAL :: stc(IMS:IME,NSOIL,JMS:JME), &
  3494. smc(IMS:IME,NSOIL,JMS:JME)
  3495. REAL :: sh2o(IMS:IME,NSOIL,JMS:JME),sice(IMS:IME,JMS:JME),&
  3496. sm(IMS:IME,JMS:JME)
  3497. REAL :: HLICE,GRAV,T0,BLIM
  3498. INTEGER :: ISLTPK(IMS:IME,JMS:JME)
  3499. CHARACTER(LEN=255) :: message
  3500. ! Constants used in cold start sh2o initialization
  3501. DATA HLICE/3.335E5/,GRAV/9.81/,T0/273.15/
  3502. DATA BLIM/5.5/
  3503. ! DATA PSIS /0.04,0.62,0.47,0.14,0.10,0.26,0.14,0.36,0.04/
  3504. ! DATA BETA /4.26,8.72,11.55,4.74,10.73,8.17,6.77,5.25,4.26/
  3505. ! DATA SMCMAX /0.421,0.464,0.468,0.434,0.406, &
  3506. ! 0.465,0.404,0.439,0.421/
  3507. !!! NOT SURE...PSIS=SATPSI, BETA=BB??
  3508. DATA PSIS /0.069, 0.036, 0.141, 0.759, 0.759, 0.355, &
  3509. 0.135, 0.617, 0.263, 0.098, 0.324, 0.468, &
  3510. 0.355, 0.000, 0.069, 0.036, 0.468, 0.069, 0.069 /
  3511. DATA BETA/2.79, 4.26, 4.74, 5.33, 5.33, 5.25, &
  3512. 6.66, 8.72, 8.17, 10.73, 10.39, 11.55, &
  3513. 5.25, 0.00, 2.79, 4.26, 11.55, 2.79, 2.79 /
  3514. DATA SMCMAX/0.339, 0.421, 0.434, 0.476, 0.476, 0.439, &
  3515. 0.404, 0.464, 0.465, 0.406, 0.468, 0.468, &
  3516. 0.439, 1.000, 0.200, 0.421, 0.468, 0.200, 0.339/
  3517. DO K=1,NSOIL
  3518. DO J=JSTART,JM
  3519. DO I=ISTART,IM
  3520. !tst
  3521. IF (smc(I,K,J) .gt. SMCMAX(ISLTPK(I,J))) then
  3522. if (K .eq. 1) then
  3523. write(message,*) 'I,J,reducing smc from ' ,I,J,smc(I,K,J), 'to ', SMCMAX(ISLTPK(I,J))
  3524. CALL wrf_debug(100,message)
  3525. endif
  3526. smc(I,K,J)=SMCMAX(ISLTPK(I,J))
  3527. ENDIF
  3528. !tst
  3529. IF ( (sm(I,J) .lt. 0.5) .and. (sice(I,J) .lt. 0.5) ) THEN
  3530. IF (ISLTPK(I,J) .gt. 19) THEN
  3531. WRITE(message,*) 'FORCING ISLTPK at : ', I,J
  3532. CALL wrf_message(message)
  3533. ISLTPK(I,J)=9
  3534. ELSEIF (ISLTPK(I,J) .le. 0) then
  3535. WRITE(message,*) 'FORCING ISLTPK at : ', I,J
  3536. CALL wrf_message(message)
  3537. ISLTPK(I,J)=1
  3538. ENDIF
  3539. ! cold start: determine liquid soil water content (sh2o)
  3540. ! sh2o <= smc for t < 273.149K (-0.001C)
  3541. IF (stc(I,K,J) .LT. 273.149) THEN
  3542. ! first guess following explicit solution for Flerchinger Eqn from Koren
  3543. ! et al, JGR, 1999, Eqn 17 (KCOUNT=0 in FUNCTION FRH2O).
  3544. BX = BETA(ISLTPK(I,J))
  3545. IF ( BETA(ISLTPK(I,J)) .GT. BLIM ) BX = BLIM
  3546. if ( GRAV*(-PSIS(ISLTPK(I,J))) .eq. 0 ) then
  3547. write(message,*) 'TROUBLE'
  3548. CALL wrf_message(message)
  3549. write(message,*) 'I,J: ', i,J
  3550. CALL wrf_message(message)
  3551. write(message,*) 'grav, isltpk, psis(isltpk): ', grav,isltpk(I,J),&
  3552. psis(isltpk(I,J))
  3553. CALL wrf_message(message)
  3554. endif
  3555. if (BX .eq. 0 .or. stc(I,K,J) .eq. 0) then
  3556. write(message,*) 'TROUBLE -- I,J,BX, stc: ', I,J,BX,stc(I,K,J)
  3557. CALL wrf_message(message)
  3558. endif
  3559. FK = (((HLICE/(GRAV*(-PSIS(ISLTPK(I,J)))))* &
  3560. ((stc(I,K,J)-T0)/stc(I,K,J)))** &
  3561. (-1/BX))*SMCMAX(ISLTPK(I,J))
  3562. IF (FK .LT. 0.02) FK = 0.02
  3563. sh2o(I,K,J) = MIN ( FK, smc(I,K,J) )
  3564. ! ----------------------------------------------------------------------
  3565. ! now use iterative solution for liquid soil water content using
  3566. ! FUNCTION FRH2O (from the Eta "NOAH" land-surface model) with the
  3567. ! initial guess for sh2o from above explicit first guess.
  3568. sh2o(I,K,J)=FRH2O_init(stc(I,K,J),smc(I,K,J),sh2o(I,K,J), &
  3569. SMCMAX(ISLTPK(I,J)),BETA(ISLTPK(I,J)), &
  3570. PSIS(ISLTPK(I,J)))
  3571. ELSE ! above freezing
  3572. sh2o(I,K,J)=smc(I,K,J)
  3573. ENDIF
  3574. ELSE ! water point
  3575. sh2o(I,K,J)=smc(I,K,J)
  3576. ENDIF ! test on land/ice/sea
  3577. if (sh2o(I,K,J) .gt. SMCMAX(ISLTPK(I,J))) then
  3578. write(message,*) 'sh2o > THAN SMCMAX ', I,J,sh2o(I,K,J),SMCMAX(ISLTPK(I,J)),smc(I,K,J)
  3579. CALL wrf_message(message)
  3580. endif
  3581. ENDDO
  3582. ENDDO
  3583. ENDDO
  3584. END SUBROUTINE NMM_SH2O
  3585. !-------------------------------------------------------------------
  3586. FUNCTION FRH2O_init(TKELV,smc,sh2o,SMCMAX,B,PSIS)
  3587. IMPLICIT NONE
  3588. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3589. ! PURPOSE: CALCULATE AMOUNT OF SUPERCOOLED LIQUID SOIL WATER CONTENT
  3590. ! IF TEMPERATURE IS BELOW 273.15K (T0). REQUIRES NEWTON-TYPE ITERATION
  3591. ! TO SOLVE THE NONLINEAR IMPLICIT EQUATION GIVEN IN EQN 17 OF
  3592. ! KOREN ET AL. (1999, JGR, VOL 104(D16), 19569-19585).
  3593. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3594. !
  3595. ! New version (JUNE 2001): much faster and more accurate newton iteration
  3596. ! achieved by first taking log of eqn cited above -- less than 4
  3597. ! (typically 1 or 2) iterations achieves convergence. Also, explicit
  3598. ! 1-step solution option for special case of parameter Ck=0, which reduces
  3599. ! the original implicit equation to a simpler explicit form, known as the
  3600. ! ""Flerchinger Eqn". Improved handling of solution in the limit of
  3601. ! freezing point temperature T0.
  3602. !
  3603. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3604. !
  3605. ! INPUT:
  3606. !
  3607. ! TKELV.........Temperature (Kelvin)
  3608. ! smc...........Total soil moisture content (volumetric)
  3609. ! sh2o..........Liquid soil moisture content (volumetric)
  3610. ! SMCMAX........Saturation soil moisture content (from REDPRM)
  3611. ! B.............Soil type "B" parameter (from REDPRM)
  3612. ! PSIS..........Saturated soil matric potential (from REDPRM)
  3613. !
  3614. ! OUTPUT:
  3615. ! FRH2O.........supercooled liquid water content.
  3616. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3617. REAL B
  3618. REAL BLIM
  3619. REAL BX
  3620. REAL CK
  3621. REAL DENOM
  3622. REAL DF
  3623. REAL DH2O
  3624. REAL DICE
  3625. REAL DSWL
  3626. REAL ERROR
  3627. REAL FK
  3628. REAL FRH2O_init
  3629. REAL GS
  3630. REAL HLICE
  3631. REAL PSIS
  3632. REAL sh2o
  3633. REAL smc
  3634. REAL SMCMAX
  3635. REAL SWL
  3636. REAL SWLK
  3637. REAL TKELV
  3638. REAL T0
  3639. INTEGER NLOG
  3640. INTEGER KCOUNT
  3641. PARAMETER (CK=8.0)
  3642. ! PARAMETER (CK=0.0)
  3643. PARAMETER (BLIM=5.5)
  3644. ! PARAMETER (BLIM=7.0)
  3645. PARAMETER (ERROR=0.005)
  3646. PARAMETER (HLICE=3.335E5)
  3647. PARAMETER (GS = 9.81)
  3648. PARAMETER (DICE=920.0)
  3649. PARAMETER (DH2O=1000.0)
  3650. PARAMETER (T0=273.15)
  3651. ! ### LIMITS ON PARAMETER B: B < 5.5 (use parameter BLIM) ####
  3652. ! ### SIMULATIONS SHOWED IF B > 5.5 UNFROZEN WATER CONTENT ####
  3653. ! ### IS NON-REALISTICALLY HIGH AT VERY LOW TEMPERATURES ####
  3654. ! ################################################################
  3655. !
  3656. BX = B
  3657. IF ( B .GT. BLIM ) BX = BLIM
  3658. ! ------------------------------------------------------------------
  3659. ! INITIALIZING ITERATIONS COUNTER AND ITERATIVE SOLUTION FLAG.
  3660. NLOG=0
  3661. KCOUNT=0
  3662. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3663. ! C IF TEMPERATURE NOT SIGNIFICANTLY BELOW FREEZING (T0), sh2o = smc
  3664. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3665. IF (TKELV .GT. (T0 - 1.E-3)) THEN
  3666. FRH2O_init=smc
  3667. ELSE
  3668. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3669. IF (CK .NE. 0.0) THEN
  3670. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3671. ! CCCCCCCCC OPTION 1: ITERATED SOLUTION FOR NONZERO CK CCCCCCCCCCC
  3672. ! CCCCCCCCCCCC IN KOREN ET AL, JGR, 1999, EQN 17 CCCCCCCCCCCCCCCCC
  3673. ! INITIAL GUESS FOR SWL (frozen content)
  3674. SWL = smc-sh2o
  3675. ! KEEP WITHIN BOUNDS.
  3676. IF (SWL .GT. (smc-0.02)) SWL=smc-0.02
  3677. IF(SWL .LT. 0.) SWL=0.
  3678. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3679. ! C START OF ITERATIONS
  3680. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3681. DO WHILE (NLOG .LT. 10 .AND. KCOUNT .EQ. 0)
  3682. NLOG = NLOG+1
  3683. DF = ALOG(( PSIS*GS/HLICE ) * ( ( 1.+CK*SWL )**2. ) * &
  3684. ( SMCMAX/(smc-SWL) )**BX) - ALOG(-(TKELV-T0)/TKELV)
  3685. DENOM = 2. * CK / ( 1.+CK*SWL ) + BX / ( smc - SWL )
  3686. SWLK = SWL - DF/DENOM
  3687. ! BOUNDS USEFUL FOR MATHEMATICAL SOLUTION.
  3688. IF (SWLK .GT. (smc-0.02)) SWLK = smc - 0.02
  3689. IF(SWLK .LT. 0.) SWLK = 0.
  3690. ! MATHEMATICAL SOLUTION BOUNDS APPLIED.
  3691. DSWL=ABS(SWLK-SWL)
  3692. SWL=SWLK
  3693. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3694. ! CC IF MORE THAN 10 ITERATIONS, USE EXPLICIT METHOD (CK=0 APPROX.)
  3695. ! CC WHEN DSWL LESS OR EQ. ERROR, NO MORE ITERATIONS REQUIRED.
  3696. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3697. IF ( DSWL .LE. ERROR ) THEN
  3698. KCOUNT=KCOUNT+1
  3699. END IF
  3700. END DO
  3701. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3702. ! C END OF ITERATIONS
  3703. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3704. ! BOUNDS APPLIED WITHIN DO-BLOCK ARE VALID FOR PHYSICAL SOLUTION.
  3705. FRH2O_init = smc - SWL
  3706. ! CCCCCCCCCCCCCCCCCCCCCCCC END OPTION 1 CCCCCCCCCCCCCCCCCCCCCCCCCCC
  3707. ENDIF
  3708. IF (KCOUNT .EQ. 0) THEN
  3709. ! Print*,'Flerchinger used in NEW version. Iterations=',NLOG
  3710. ! CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  3711. ! CCCCC OPTION 2: EXPLICIT SOLUTION FOR FLERCHINGER EQ. i.e. CK=0 CCCCCCCC
  3712. ! CCCCCCCCCCCCC IN KOREN ET AL., JGR, 1999, EQN 17 CCCCCCCCCCCCCCC
  3713. FK=(((HLICE/(GS*(-PSIS)))*((TKELV-T0)/TKELV))**(-1/BX))*SMCMAX
  3714. ! APPLY PHYSICAL BOUNDS TO FLERCHINGER SOLUTION
  3715. IF (FK .LT. 0.02) FK = 0.02
  3716. FRH2O_init = MIN ( FK, smc )
  3717. ! CCCCCCCCCCCCCCCCCCCCCCCCC END OPTION 2 CCCCCCCCCCCCCCCCCCCCCCCCCC
  3718. ENDIF
  3719. ENDIF
  3720. RETURN
  3721. END FUNCTION FRH2O_init
  3722. !--------------------------------------------------------------------
  3723. SUBROUTINE init_module_initialize
  3724. END SUBROUTINE init_module_initialize
  3725. !---------------------------------------------------------------------
  3726. !-------------------------------------------------------------------------------
  3727. SUBROUTINE vortex ( ght_gc,rh_gc,t_gc,u_gc,v_gc,p_gc &
  3728. &, ght_out,rh_out,t_out,u_out,v_out &
  3729. &, ht_gc,tsk_gc,xice_gc &
  3730. &, hlat_gc,hlon_gc,vlat_gc,vlon_gc &
  3731. &, greenfrac_gc,albedo12m_gc,landusef_gc &
  3732. &, soilctop_gc,soilcbot_gc &
  3733. &, landusef_out,soilctop_out,soilcbot_out &
  3734. &, num_veg_cat,num_soil_top_cat,num_soil_bot_cat &
  3735. &, dx,internal_time_loop &
  3736. &, start_z,end_z &
  3737. &, ids,ide,jds,jde,kds,kde &
  3738. &, ims,ime,jms,jme,kms,kme &
  3739. &, its,ite,jts,jte,kts,kte )
  3740. USE module_dm
  3741. IMPLICIT NONE
  3742. LOGICAL,EXTERNAL :: WRF_DM_ON_MONITOR
  3743. INTEGER, INTENT(IN):: ids,ide,jds,jde,kds,kde, &
  3744. ims,ime,jms,jme,kms,kme, &
  3745. its,ite,jts,jte,kts,kte, &
  3746. internal_time_loop
  3747. INTEGER, INTENT(IN):: num_veg_cat,num_soil_top_cat,num_soil_bot_cat,start_z, end_z
  3748. REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z),INTENT(INOUT) :: ght_gc,rh_gc,t_gc,u_gc,v_gc,p_gc
  3749. REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z),INTENT(INOUT) :: ght_out,rh_out,t_out,u_out,v_out
  3750. REAL, DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: ht_gc,tsk_gc,xice_gc
  3751. REAL, DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: hlat_gc,hlon_gc,vlat_gc,vlon_gc
  3752. REAL, DIMENSION(ims:ime,jms:jme,12) , INTENT(INOUT) :: greenfrac_gc,albedo12m_gc
  3753. REAL, DIMENSION(ims:ime,jms:jme,num_veg_cat), INTENT(INOUT) :: landusef_gc,landusef_out
  3754. REAL, DIMENSION(ims:ime,jms:jme,num_soil_top_cat),INTENT(INOUT):: soilctop_gc,soilctop_out
  3755. REAL, DIMENSION(ims:ime,jms:jme,num_soil_bot_cat),INTENT(INOUT):: soilcbot_gc,soilcbot_out
  3756. REAL, INTENT(INOUT):: dx
  3757. REAL, PARAMETER :: eradius=6371221.3
  3758. INTEGER :: i,j,l,iter,nmax,nres,nfilter
  3759. INTEGER :: id0,jd0,id1,jd1
  3760. REAL :: factor,glon0,glat0,dist,cavlat,minval_gh
  3761. REAL :: beta1,vmax,rmax,dx_km
  3762. REAL, DIMENSION(start_z:end_z) :: vmax1,rmax1
  3763. REAL, DIMENSION(IMS:IME,JMS:JME) :: dist1,dir1,diffx,diffy
  3764. REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z) :: pert_ght,pert_rh,pert_t,pert_u,pert_v,pert_p,temp0
  3765. !New Vortex Related
  3766. DATA beta1 /0.0/ ! 0.0 sets non-linear balance equation vortex. GFDL vortex for beta1 between 0.1 and 1.5
  3767. REAL, ALLOCATABLE,DIMENSION(:,:) :: psc
  3768. REAL, ALLOCATABLE,DIMENSION(:,:,:) :: u_temp,v_temp,t_temp,ght_temp,rh_temp
  3769. !----------------------------------------------------------------------------
  3770. ! PURPOSE:
  3771. ! - HURRICANE VORTEX FILTERING
  3772. ! - HURRICANE VORTEX INITIALIZATION
  3773. !
  3774. ! This is gopal's doing
  3775. !----------------------------------------------------------------------------
  3776. WRITE(0,*)'---------------- IDEAL CASE -------------------------'
  3777. WRITE(0,*)'number of pressure levels',end_z
  3778. WRITE(0,*)'number of vegcat levels',num_veg_cat
  3779. WRITE(0,*)'number of soiltop levels',num_soil_top_cat
  3780. WRITE(0,*)'number of soilbot levels',num_soil_bot_cat
  3781. WRITE(0,*)'--------------- ght_gc --------------------------'
  3782. WRITE(0,*)ght_gc(100,100,:)
  3783. WRITE(0,*)'--------------- p_gc --------------------------'
  3784. WRITE(0,*)p_gc(100,100,:)
  3785. WRITE(0,*)'--------------- rh_gc ---------------------------'
  3786. WRITE(0,*)rh_gc(100,100,:)
  3787. WRITE(0,*)'--------------- t_gc --------------------------'
  3788. WRITE(0,*)t_gc(100,100,:)
  3789. WRITE(0,*)'------------------------------------------------'
  3790. WRITE(0,*)'------------------------------------------------'
  3791. !
  3792. ! SET UP IDEAL CONDITIONS
  3793. !
  3794. do l = 1,num_veg_cat
  3795. do j = jts, MIN(jte,jde-1)
  3796. do i = its, MIN(ite,ide-1)
  3797. if(l==16)THEN
  3798. landusef_out(i,j,l)=1 ! create ocean everywhere
  3799. else
  3800. landusef_out(i,j,l)=0
  3801. endif
  3802. enddo
  3803. enddo
  3804. enddo
  3805. do l = 1,num_soil_top_cat
  3806. do j = jts, MIN(jte,jde-1)
  3807. do i = its, MIN(ite,ide-1)
  3808. if(l==14)THEN
  3809. soilctop_out(i,j,l)=1 ! create ocean everywhere
  3810. else
  3811. soilctop_out(i,j,l)=0
  3812. endif
  3813. enddo
  3814. enddo
  3815. enddo
  3816. do l = 1,num_soil_bot_cat
  3817. do j = jts, MIN(jte,jde-1)
  3818. do i = its, MIN(ite,ide-1)
  3819. if(l==14)THEN
  3820. soilcbot_out(i,j,l)=1 ! create ocean everywhere
  3821. else
  3822. soilcbot_out(i,j,l)=0
  3823. endif
  3824. enddo
  3825. enddo
  3826. enddo
  3827. landusef_gc=landusef_out !=landusef_gc
  3828. soilcbot_gc=soilcbot_out !=soilcbot_gc
  3829. soilctop_gc=soilctop_out !=soilctop_gc
  3830. do j = jts, MIN(jte,jde-1)
  3831. do i = its, MIN(ite,ide-1)
  3832. xice_gc(i,j)=0.
  3833. ht_gc(i,j)=0. ! uniform terrain
  3834. ght_gc(i,j,1)=0. ! uniform gpm at level 1
  3835. tsk_gc(i,j)=302.0 ! uniform SSTs
  3836. enddo
  3837. enddo
  3838. !
  3839. ! Make sure the GFDL analysis does not have temperature problems especially
  3840. ! near the surface. I noticed some problems with the wps outputs (met_nmm file.)
  3841. !
  3842. do j=jts,min(jte,jde-1)
  3843. do i=its,min(ite,ide-1)
  3844. if(t_gc(i,j,1) .le. 250.0)t_gc(i,j,1)=302.5
  3845. enddo
  3846. enddo
  3847. !
  3848. ! READ IN LAT-LONS FROM STORM MESSAGE FILE
  3849. !
  3850. IF (WRF_DM_ON_MONITOR()) THEN
  3851. !orig OPEN(21,file='../MESSAGES/storm.center',status='old')
  3852. !repository messages
  3853. OPEN(21,file='../messages/storm.center',status='old')
  3854. read(21,*)glat0
  3855. read(21,*)glon0
  3856. close(21)
  3857. ENDIF
  3858. CALL wrf_dm_bcast_bytes (glat0,IWORDSIZE)
  3859. CALL wrf_dm_bcast_bytes (glon0,IWORDSIZE)
  3860. WRITE(0,*)'glat0 and glon0',glat0,glon0
  3861. !
  3862. !
  3863. ! FIND THE CENTER OF THE HURRICANE BASED ON THE STORM MESSAGE FILE
  3864. !
  3865. id0 = -999
  3866. jd0 = -999
  3867. factor = 4.0*ATAN(1.)/180.
  3868. dist = -1
  3869. do j=jts,min(jte,jde-1)
  3870. do i=its,min(ite,ide-1)
  3871. diffx(i,j) = (hlon_gc(i,j) - glon0)*factor
  3872. diffy(i,j) = (hlat_gc(i,j) - glat0)*factor
  3873. cavlat= cos((hlat_gc(i,j) + glat0)*0.5*factor)
  3874. dist1(i,j) = eradius*sqrt(cavlat*cavlat*diffx(i,j)*diffx(i,j) + diffy(i,j)*diffy(i,j))
  3875. if(dist1(i,j).LE.dist .OR. dist.LT.0.)then
  3876. dist = dist1(i,j)
  3877. id0 = i
  3878. jd0 = j
  3879. endif
  3880. enddo
  3881. enddo
  3882. !
  3883. ! SECONDARY SEARCH FOR THE CENTER
  3884. !
  3885. id1=-999
  3886. jd1=-999
  3887. minval_gh=MINVAL(ght_gc(ids:ide-1,jds:jde-1,10))
  3888. write(0,*)'MIN VAL OF GH NEW=',minval_gh
  3889. do j=jts,min(jte,jde-1)
  3890. do i=its,min(ite,ide-1)
  3891. if(minval_gh .EQ. ght_gc(i,j,10))then
  3892. id1=i
  3893. jd1=j
  3894. endif
  3895. enddo
  3896. enddo
  3897. IF(abs(ID0-ID1) .GE. 5 .OR. abs(JD0-JD1) .GE. 5)THEN
  3898. ! call wrf_error_fatal("LAT LON INFO IN STROM MESSAGE FILE IN INCORRECT")
  3899. write(0,*) 'WARNING - ACTUAL STORM LOCATION DIFFERENT FROM MODEL LOCATION'
  3900. WRITE(0,*)'OLD CENTER',ID0,JD0
  3901. WRITE(0,*)'NEW CENTER',ID1,JD1
  3902. ELSE
  3903. WRITE(0,*)'OLD CENTER',ID0,JD0
  3904. WRITE(0,*)'NEW CENTER',ID1,JD1
  3905. ENDIF
  3906. !
  3907. ! RECOMPUTE RADIUS FROM THE CENTER BASED ON MODEL/ANALYSED STORM CENTER
  3908. !
  3909. do j=jts,min(jte,jde-1)
  3910. do i=its,min(ite,ide-1)
  3911. diffx(i,j) = (hlon_gc(i,j) - hlon_gc(id1,jd1))*factor
  3912. diffy(i,j) = (hlat_gc(i,j) - hlat_gc(id1,jd1))*factor
  3913. cavlat= cos((hlat_gc(i,j) + hlat_gc(id1,jd1))*0.5*factor)
  3914. dist1(i,j) = eradius*sqrt(cavlat*cavlat*diffx(i,j)*diffx(i,j) + diffy(i,j)*diffy(i,j))
  3915. enddo
  3916. enddo
  3917. ght_out=ght_gc
  3918. t_out=t_gc
  3919. rh_out=rh_gc
  3920. u_out=u_gc
  3921. v_out=v_gc
  3922. !
  3923. ! Beta is the intensity parameter
  3924. !
  3925. IF(BETA1 .NE. 0.)THEN ! Adjustment of the GFDL vortex
  3926. !
  3927. ! DEFINE THE NUMBER OF RECRUSSIVE OPERATIONS (NMAX) REQUIRED TO
  3928. ! REMOVE OR MODIFY THE INITIAL GRIB ANALYSIS. IF beta1 IS SET TO
  3929. ! < 0.01, THE VORTEX IS COMPLETELY FILTERED OUT. ALSO, FILTERING
  3930. ! RELATED TO COMPLETE VORTEX REMOVAL IS ONLY CALLED AT THE INITIAL
  3931. ! TIME ASSUMING THAT THE VORTEX IS FAR AWAY FROM THE BOUNDARIES.
  3932. !
  3933. nres=0.18/dx
  3934. nfilter=1
  3935. !
  3936. if(nres==3.and. internal_time_loop .eq. 1)then
  3937. nmax=9*nfilter
  3938. else
  3939. nmax=1*nfilter
  3940. endif
  3941. WRITE(0,*)'CALLING HBFILTER'
  3942. CALL hbfilter ( ght_gc,ght_out &
  3943. &, nmax,start_z,end_z &
  3944. &, ids,ide,jds,jde &
  3945. &, ims,ime,jms,jme &
  3946. &, its,ite,jts,jte )
  3947. WRITE(0,*)'COMPLETED FILTERING ght_gc'
  3948. CALL hbfilter ( t_gc,t_out &
  3949. &, nmax,start_z,end_z &
  3950. &, ids,ide,jds,jde &
  3951. &, ims,ime,jms,jme &
  3952. &, its,ite,jts,jte )
  3953. WRITE(0,*)'COMPLETED FILTERING t_gc'
  3954. CALL hbfilter ( rh_gc,rh_out &
  3955. &, nmax,start_z,end_z &
  3956. &, ids,ide,jds,jde &
  3957. &, ims,ime,jms,jme &
  3958. &, its,ite,jts,jte )
  3959. WRITE(0,*)'COMPLETED FILTERING rh_gc'
  3960. CALL hbfilter ( u_gc,u_out &
  3961. &, nmax,start_z,end_z &
  3962. &, ids,ide,jds,jde &
  3963. &, ims,ime,jms,jme &
  3964. &, its,ite,jts,jte )
  3965. WRITE(0,*)'COMPLETED FILTERING u_gc'
  3966. CALL hbfilter ( v_gc,v_out &
  3967. &, nmax,start_z,end_z &
  3968. &, ids,ide,jds,jde &
  3969. &, ims,ime,jms,jme &
  3970. &, its,ite,jts,jte )
  3971. WRITE(0,*)'COMPLETED FILTERING v_gc'
  3972. WRITE(0,*)'END OF HBFILTER'
  3973. !
  3974. do l=start_z,end_z
  3975. do j=jts,min(jte,jde-1)
  3976. do i=its,min(ite,ide-1)
  3977. pert_ght(i,j,l) = (ght_gc(i,j,l) - ght_out(i,j,l)) ! vortex only
  3978. pert_t(i,j,l) = (t_gc(i,j,l) - t_out(i,j,l))
  3979. pert_rh(i,j,l) = (rh_gc(i,j,l) - rh_out(i,j,l))
  3980. pert_u(i,j,l) = (u_gc(i,j,l) - u_out(i,j,l))
  3981. pert_v(i,j,l) = (v_gc(i,j,l) - v_out(i,j,l))
  3982. enddo
  3983. enddo
  3984. enddo
  3985. !
  3986. do l=start_z,end_z
  3987. do j=jts,min(jte,jde-1)
  3988. do i=its,min(ite,ide-1)
  3989. ght_gc(i,j,l) = ght_out(i,j,l) + beta1*pert_ght(i,j,l) ! vortex only
  3990. t_gc(i,j,l) = t_out(i,j,l) + beta1*pert_t(i,j,l)
  3991. rh_gc(i,j,l) = rh_out(i,j,l) + beta1*pert_rh(i,j,l)
  3992. u_gc(i,j,l) = u_out(i,j,l) + beta1*pert_u(i,j,l)
  3993. v_gc(i,j,l) = v_out(i,j,l) + beta1*pert_v(i,j,l)
  3994. enddo
  3995. enddo
  3996. enddo
  3997. !
  3998. ! DIAGNOSTICS
  3999. ght_out=0.;t_out=0.;rh_out=0.;u_out=0.;v_out=0.
  4000. do l=start_z,end_z
  4001. do j=jts,min(jte,jde-1)
  4002. do i=its,min(ite,ide-1)
  4003. ght_out(i,j,l)= beta1*pert_ght(i,j,l)
  4004. t_out(i,j,l) = beta1*pert_t(i,j,l)
  4005. rh_out(i,j,l) = beta1*pert_rh(i,j,l)
  4006. u_out(i,j,l) = beta1*pert_u(i,j,l)
  4007. v_out(i,j,l) = beta1*pert_v(i,j,l)
  4008. enddo
  4009. enddo
  4010. enddo
  4011. ELSE ! Balanced vortex option
  4012. !jwb IF(internal_time_loop .eq. 1)THEN ! use balancing only at the initial time
  4013. IF(internal_time_loop .le. 2)THEN ! use balancing only at the initial time
  4014. !
  4015. ! INSERT NEW VORTEX USING THE BALANCING ALGORITHM DEVELOPED BY ZHIHUA ZENG &
  4016. ! JIAN-WEN BAO. THIS ALGORITHM IS BASED ON INVERSE BALANCE EQUATION
  4017. !
  4018. WRITE(0,*)'CALLING TCBOGUS'
  4019. allocate(u_temp(ide,jde,end_z));allocate(v_temp(ide,jde,end_z))
  4020. allocate(t_temp(ide,jde,end_z));allocate(ght_temp(ide,jde,end_z))
  4021. allocate(rh_temp(ide,jde,end_z));allocate(psc(ide,jde))
  4022. dx_km=110000.0*dx ! dx in kilometers
  4023. CALL tcbogus( u_temp,v_temp,t_temp,ght_temp,rh_temp,psc, &
  4024. dx_km,id1,jd1, &
  4025. start_z,end_z+1, &
  4026. ids,ide,jds,jde, &
  4027. ids,ide,jds,jde, &
  4028. ids,ide,jds,jde )
  4029. ! DIAGNOSTICS AND REVERSAL OF LOOP
  4030. ght_out=0.;t_out=0.;rh_out=0.;u_out=0.;v_out=0.
  4031. do l=start_z,end_z
  4032. do j=jts,min(jte,jde-1)
  4033. do i=its,min(ite,ide-1)
  4034. if(l .lt.end_z)ght_out(i,j,l+1)= ght_temp(i,j,end_z-l+1)
  4035. t_out(i,j,l) = t_temp(i,j,end_z-l+1)
  4036. rh_out(i,j,l) = rh_temp(i,j,end_z-l+1)
  4037. u_out(i,j,l) = u_temp(i,j,end_z-l+1)
  4038. v_out(i,j,l) = v_temp(i,j,end_z-l+1)
  4039. enddo
  4040. enddo
  4041. enddo
  4042. do l=start_z,end_z
  4043. do j=jts,min(jte,jde-1)
  4044. do i=its,min(ite,ide-1)
  4045. ght_gc(i,j,l) = ght_out(i,j,l)
  4046. t_gc(i,j,l) = t_out(i,j,l)
  4047. rh_gc(i,j,l) = rh_out(i,j,l)
  4048. u_gc(i,j,l) = u_out(i,j,l)
  4049. v_gc(i,j,l) = v_out(i,j,l)
  4050. if(l .eq. 1)p_gc(i,j,1)=psc(i,j)
  4051. enddo
  4052. enddo
  4053. enddo
  4054. WRITE(0,*)'--------------- new ght_gc --------------------------'
  4055. WRITE(0,*)ght_gc(100,100,:)
  4056. WRITE(0,*)'--------------- new p_gc --------------------------'
  4057. WRITE(0,*)p_gc(100,100,:)
  4058. WRITE(0,*)'--------------- new rh_gc ---------------------------'
  4059. WRITE(0,*)rh_gc(100,100,:)
  4060. WRITE(0,*)'--------------- new t_gc --------------------------'
  4061. WRITE(0,*)t_gc(100,100,:)
  4062. WRITE(0,*)'---------------------------------------------------'
  4063. WRITE(0,*)'tcbogus completed'
  4064. ENDIF ! for internal_time_loop .eq. 1
  4065. ENDIF ! endif for beta=0.- 1.5
  4066. END SUBROUTINE vortex
  4067. !-------------------------------------------------------------------------
  4068. ! SUBROUTINE hbfilter
  4069. ! -------------------
  4070. ! input - field to be filtered
  4071. ! output - filtered output
  4072. ! nmax - recrussive application of filter ( suggested 3 for 9 km and 27 for 3 km)
  4073. ! start_z,end_zstart - usually 1 to ktop
  4074. ! ids,ide,jds,jde - domain index, namely,imin,imax,jmin,jmax
  4075. ! ims,ime,jms,jme - memory index, for 1 processor set this to above values
  4076. ! its,ite,jts,jte - tile index, for 1 processor set this to above values
  4077. SUBROUTINE hbfilter ( input, output &
  4078. &, nmax,start_z,end_z &
  4079. &, ids,ide,jds,jde &
  4080. &, ims,ime,jms,jme &
  4081. &, its,ite,jts,jte )
  4082. IMPLICIT NONE
  4083. INTEGER, INTENT(IN) :: ids,ide,jds,jde,ims,ime,jms,jme,its,ite,jts,jte
  4084. INTEGER, INTENT(IN) :: start_z,end_z,nmax
  4085. REAL :: dx
  4086. REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z),INTENT(IN) :: INPUT
  4087. REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z),INTENT(INOUT) :: OUTPUT
  4088. ! local
  4089. INTEGER :: I,J,K,N,JMIN,JMAX,IMIN,IMAX,NRES,REPEAT
  4090. REAL :: PI
  4091. REAL, DIMENSION(11) :: M
  4092. DATA M /2,3,4,2,5,6,7,2,8,9,2/
  4093. INTEGER, PARAMETER :: NF=11
  4094. REAL, DIMENSION(NF) :: FK
  4095. REAL, DIMENSION(IMS:IME,NF) :: XTU
  4096. REAL, DIMENSION(JMS:JME,NF) :: YTU
  4097. !------------------------------------------------------------------
  4098. !
  4099. ! Purpose: This routine filters and removes
  4100. ! hurricane signals (Kurihara et al., 1993, MWR)
  4101. !
  4102. ! Called from: vortex
  4103. !
  4104. ! Original Code: Qingfu Liu (EMC)
  4105. ! Modification history: This is gopal's doing
  4106. !-----------------------------------------------------------------
  4107. !
  4108. ! DOMAIN
  4109. IMIN=1 !(1,ID0-40)
  4110. IMAX=IDE-1 !min(IDE-1,ID0+40)
  4111. JMIN=1 !max(1,JD0-67)
  4112. JMAX=JDE-1 !min(JDE-1,JD0+67)
  4113. ! INPUT: Local variable defined for testing
  4114. PI=4.0* ATAN(1.0)
  4115. DO K=start_z,end_z
  4116. DO J=JMIN,JMAX
  4117. DO I=IMIN,IMAX
  4118. OUTPUT(I,J,K)= INPUT(I,J,K) !SIN(2.0*PI/(21-1)*(I-1)) ! INPUT(I,J,K)
  4119. ENDDO
  4120. ENDDO
  4121. ENDDO
  4122. ! DEFINE FILTER FUNCTION
  4123. DO N=1,NF
  4124. FK(N)=0.5/(1-COS(2.*PI/M(N)))
  4125. ENDDO
  4126. DO K=start_z,end_z
  4127. !.. DO ZONAL FILTER
  4128. DO REPEAT=1,nmax
  4129. DO J=JMIN,JMAX-1
  4130. DO N=1,NF
  4131. XTU(IMIN,N) = OUTPUT(IMIN,J,K)
  4132. XTU(IMAX,N) = OUTPUT(IMAX,J,K)
  4133. ENDDO
  4134. DO I=IMIN+1,IMAX-1
  4135. XTU(I,1) = OUTPUT(I,J,K)+FK(1)*(OUTPUT(I-1,J,K)+OUTPUT(I+1,J,K)-2.*OUTPUT(I,J,K))
  4136. ENDDO
  4137. DO N=2,NF
  4138. DO I=IMIN+1,IMAX-1
  4139. XTU(I,N)=XTU(I,N-1)+FK(N)*(XTU(I-1,N-1)+XTU(I+1,N-1)-2.*XTU(I,N-1))
  4140. ENDDO
  4141. ENDDO
  4142. DO I=IMIN,IMAX-1
  4143. OUTPUT(I,J,K) = XTU(I,NF)
  4144. ENDDO
  4145. ENDDO ! J loop
  4146. ENDDO ! End recrussive repeat
  4147. !.. DO MERIDIONAL FILTER
  4148. DO REPEAT=1,nmax
  4149. DO I=IMIN,IMAX
  4150. DO N=1,NF
  4151. YTU(JMIN,N) = OUTPUT(I,JMIN,K)
  4152. YTU(JMAX,N) = OUTPUT(I,JMAX,K)
  4153. ENDDO
  4154. DO J=JMIN+1,JMAX-1
  4155. YTU(J,1) = OUTPUT(I,J,K) + FK(1)*(OUTPUT(I,J-1,K) + OUTPUT(I,J+1,K) -2.*OUTPUT(I,J,K))
  4156. ENDDO
  4157. DO N = 2,NF
  4158. DO J = JMIN+1,JMAX-1
  4159. YTU(J,N) = YTU(J,N-1) + FK(N)*(YTU(J-1,N-1) + YTU(J+1,N-1) - 2.*YTU(J,N-1))
  4160. ENDDO
  4161. ENDDO
  4162. DO J = JMIN,JMAX-1
  4163. OUTPUT(I,J,K) = YTU(J,NF)
  4164. ENDDO
  4165. ENDDO ! I loop
  4166. ENDDO ! End recrussive repeat
  4167. ENDDO ! K loop
  4168. RETURN
  4169. END SUBROUTINE hbfilter
  4170. !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++c
  4171. ! This program performs the idealized vortex initialization for ARW_WRF c
  4172. ! was written by Zhihua Zeng (Shanghai Typhoon Institute/CMA) and Jian-Wen c
  4173. ! Bao (NOAA/PSD) in 2009. c
  4174. ! c
  4175. ! Contact Eamil: c
  4176. ! zengzh@mail.typhoon.gov.cn or Jian-Wen.Bao@noaa.gov c
  4177. ! c
  4178. ! References: c
  4179. ! Wang Y.,1995:On inverse balance equation in sigma-coordinates c
  4180. ! for model initialization, MWR, 123, 482-488. c
  4181. ! Zeng Z. et al,2009: Simulation of spiral rainbands and vertical c
  4182. ! resolution, 10th annual WRF user's workshop,23-26 June, c
  4183. ! Boulder,CO. c
  4184. !
  4185. !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4186. ! This program performs the vortex initialisation using a nonlinear
  4187. ! balance equation in sigma coordinate following Wang (1995, MWR)
  4188. ! but with some modifications.
  4189. !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4190. subroutine tcbogus( uw,vw,tw,ghw,rhw,psc &
  4191. &, dsc,id1,jd1 &
  4192. &, start_z,end_z1 &
  4193. &, ids,ide,jds,jde &
  4194. &, ims,ime,jms,jme &
  4195. &, its,ite,jts,jte )
  4196. implicit none
  4197. include 'BALANCE_PARS.F'
  4198. include 'BALANCE_COMS.F'
  4199. INTEGER, INTENT(IN):: start_z,end_z1,id1,jd1
  4200. INTEGER, INTENT(IN):: ids,ide,jds,jde,ims,ime,jms,jme,its,ite,jts,jte
  4201. !
  4202. REAL, INTENT(IN) :: dsc
  4203. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: psc
  4204. REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z1),INTENT(INOUT) :: uw,vw,tw,ghw,rhw
  4205. ! local variables
  4206. INTEGER, PARAMETER :: nv=30
  4207. INTEGER :: i,j,k,km,kd,indx,jtc,itc
  4208. INTEGER :: ji,ii,itime,jjt,nwest
  4209. REAL :: f0,beta0,beta,pia,betk,txc,tyc,sigma
  4210. REAL :: tk,t6,rh,rm,vm0,rm0,ts
  4211. REAL, DIMENSION(JMS:JME) :: fc,fe
  4212. REAL, DIMENSION(start_z:end_z1) :: up1,pp1,pp1o
  4213. REAL, DIMENSION(start_z:end_z1-1) :: up,tvb
  4214. REAL, DIMENSION(IMS:IME,JMS:JME) :: betkc
  4215. REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z1-1) :: uc,vc,tc,rqc,ppc
  4216. REAL, DIMENSION(IMS:IME,JMS:JME,start_z:end_z1-1) :: tvbc,ghc,rhc
  4217. !
  4218. common /comp1/tk(kmx),t6(kmx1),rh(kmx),rm,vm0,ts
  4219. km=end_z1-1
  4220. !
  4221. !*******************************************************************
  4222. open(22,file='sigma.d',form='formatted')
  4223. do k=1,end_z1
  4224. read(22,*) kd, sig(k)
  4225. enddo
  4226. 5 format(2x,i2,4x,f10.6)
  4227. close(22)
  4228. do k=1,km
  4229. sig1(k)=0.5*(sig(k)+sig(k+1))
  4230. enddo
  4231. !
  4232. open(20,file='input.d',form='formatted',status='unknown')
  4233. read(20,1) indx
  4234. read(20,2) nenv
  4235. read(20,3) vm0
  4236. read(20,3) rm0
  4237. ! read(20,4) tsf0
  4238. close(20)
  4239. 1 format(i1)
  4240. 2 format(i2)
  4241. 3 format(f5.1)
  4242. 4 format(f8.2)
  4243. !
  4244. rm=rm0*1000.0
  4245. !
  4246. ! write(6,*) vm0,rm0
  4247. ! write(6,*) nenv
  4248. !
  4249. do k=1,km
  4250. up(k)=0.0
  4251. enddo
  4252. do k=1,end_z1
  4253. up1(k)=0.0
  4254. enddo
  4255. jjt=0.0
  4256. !
  4257. nwest=-(ide-1)/2+25
  4258. jjt=max(jjt,nwest)
  4259. write(6,*) jjt
  4260. !
  4261. txc=id1 !(float(ide)+1.0)/3.0 !2.0
  4262. tyc=jd1 !(float(jde)+1.0)/3.0 !2.0
  4263. write(6,*)'txc= ', txc,'tyc= ',tyc
  4264. !
  4265. call tem(tk,t6,rh,km,end_z1,pp1)
  4266. !
  4267. ts=t6(end_z1)
  4268. write(6,*) ts
  4269. !-------------------------------------
  4270. !--to calculate the Coriolis parameter
  4271. !-------------------------------------
  4272. pia=4.0*atan(1.0)/180.0
  4273. f0=14.584e-5*sin(pia*fi0)
  4274. beta=14.584e-5*cos(pia*fi0)/6.3712e6
  4275. if(indx.eq.0) beta=0.0
  4276. do i=1,jde
  4277. fc(i)=f0+beta*(float(i)-tyc)*dsc
  4278. enddo
  4279. !---------------------------------------------------
  4280. call env(tc,psc,fc,ide,jde,dsc,tyc,up1,km,end_z1)
  4281. !---------------------------------------------------
  4282. do k=1,km
  4283. do i=1,jde
  4284. do j=1,ide
  4285. tc(j,i,k)=tk(k)+tc(j,i,k)
  4286. enddo
  4287. enddo
  4288. enddo
  4289. !
  4290. call result(uc,vc,tc,rqc,psc,fc,ide,jde,dsc,tyc,txc, &
  4291. up1,up,km,end_z1,beta)
  4292. write(0,*)'out of result'
  4293. !
  4294. itime=0.0
  4295. !
  4296. do k=1,km
  4297. qb(k)=rqc(1,1,k)
  4298. enddo
  4299. !
  4300. do i=1,jde
  4301. do k=1,km
  4302. do j=1,ide
  4303. ppc(j,i,k)=sig1(k)*psc(j,i)
  4304. enddo
  4305. enddo
  4306. enddo
  4307. !
  4308. !--------------------------------------
  4309. !--to calculate the height of the u,v,t
  4310. !--------------------------------------
  4311. do k=1,km
  4312. tvb(k)=tk(k)*(1.0+0.608*qb(k))
  4313. enddo
  4314. betk=(rgas/grv)*log(1.0/sig1(km))
  4315. poz(km)=betk*tvb(km)
  4316. ! write(10,*) poz(km)
  4317. do k=km-1,1,-1
  4318. betk=0.5*(rgas/grv)*log(sig1(k+1)/sig1(k))
  4319. poz(k)=poz(k+1)+betk*(tvb(k)+tvb(k+1))
  4320. ! write(10,*) poz(k)
  4321. enddo
  4322. !
  4323. write(0,*)'before interpolation'
  4324. call interpz(uc,vc,tc,ppc,rqc,ide,jde,km)
  4325. !
  4326. if(vm0.gt.1.0) then
  4327. !
  4328. !--------------------------------------
  4329. do k=1,km
  4330. do i=1,jde
  4331. do j=1,ide
  4332. rhc(j,i,k)=rh(k)
  4333. fe(i)=0.0
  4334. enddo
  4335. enddo
  4336. enddo
  4337. !--------------------------------------
  4338. do k=1,km
  4339. do i=1,jde
  4340. do j=1,ide
  4341. tvbc(j,i,k)=tc(j,i,k)*(1.0+0.608*rqc(j,i,k))
  4342. enddo
  4343. enddo
  4344. enddo
  4345. do i=1,jde
  4346. do j=1,ide
  4347. betkc(j,i)=(rgas/grv)*log(0.01*psc(j,i)/pp1(km)) !! psc is hPa
  4348. ghc(j,i,km)=betkc(j,i)*tvbc(j,i,km)
  4349. enddo
  4350. enddo
  4351. do k=km-1,1,-1
  4352. do i=1,jde
  4353. do j=1,ide
  4354. ! write(63,*)k,i,j,pp1(k+1),pp1(k)
  4355. if(pp1(k) .gt. 0.)then
  4356. betkc(j,i)=0.5*(rgas/grv)*log(pp1(k+1)/pp1(k))
  4357. else
  4358. betkc(j,i)=0.0
  4359. endif
  4360. ghc(j,i,k)=ghc(j,i,k+1)+betkc(j,i)*(tvbc(j,i,k)+tvbc(j,i,k+1))
  4361. enddo
  4362. enddo
  4363. enddo
  4364. !
  4365. write(0,*)'---------- test write out -----------'
  4366. do k=1,km
  4367. do i=1,jde
  4368. do j=1,ide
  4369. uw(j,i,k)=uc(j,i,k)
  4370. vw(j,i,k)=vc(j,i,k)
  4371. tw(j,i,k)=tc(j,i,k)
  4372. ghw(j,i,k)=ghc(j,i,k)
  4373. rhw(j,i,k)=rhc(j,i,k)
  4374. if(i .eq. 10 .and. j .eq. 10)write(0,*)k,uw(j,i,k),vw(j,i,k),ghw(j,i,k),tw(j,i,k)
  4375. if(i .eq. 100 .and. j .eq. 98)write(0,*)k,uw(j,i,k),vw(j,i,k),ghw(j,i,k),tw(j,i,k)
  4376. enddo
  4377. enddo
  4378. enddo
  4379. endif
  4380. !
  4381. return
  4382. end subroutine tcbogus
  4383. !
  4384. !-----------------------------------------------------------------
  4385. !
  4386. subroutine result(u,v,t,rq,ps,f,lq,lp,ds,ty0,tx0,up1, &
  4387. up,km,end_z1,beta)
  4388. !
  4389. !-----------------------------------------------------------------
  4390. implicit none
  4391. include 'BALANCE_PARS.F'
  4392. include 'BALANCE_COMS.F'
  4393. integer i,j,k,lq,lp,km,end_z1,nnt,jti,iti
  4394. real ds,ds2,err,uee,tx0,ty0,beta,ajac,vor,forc1,forc2,forc3
  4395. real ees,rqs,sgg,reh,ta,pp,alpi
  4396. real u(lq,lp,km),v(lq,lp,km),t(lq,lp,km),rq(lq,lp,km),ps(lq,lp)
  4397. real alp(lq,lp),tt(lq,lp,end_z1),tt2(2:km),xx(lq,lp),forc(lq,lp)
  4398. real ux(lq,lp),vy(lq,lp),tt1(lq,lp,km),gg1(lq,lp,end_z1),f(lp)
  4399. real up1(end_z1),up(km)
  4400. real tk,t6,rh,rm,vm0,ts
  4401. common /comp1/tk(kmx),t6(kmx1),rh(kmx),rm,vm0,ts
  4402. !
  4403. ds2=ds*ds
  4404. err=3.0e-6
  4405. do i=1,lp
  4406. do j=1,lq
  4407. forc(j,i)=0.0
  4408. alp(j,i)=log(ps(j,i))
  4409. enddo
  4410. enddo
  4411. !
  4412. uee=up1(end_z1)
  4413. WRITE(0,*)'CALLING VORTEX 1'
  4414. call vortex1(ux,vy,1.0,ds,lq,lp,ty0,tx0,uee)
  4415. do 1 i=2,lp-1
  4416. do 1 j=2,lq-1
  4417. ajac=((ux(j+1,i)-ux(j-1,i))*(vy(j,i+1)-vy(j,i-1))-(ux(j,i+1) &
  4418. -ux(j,i-1))*(vy(j+1,i)-vy(j-1,i)))/(2.0*ds2)
  4419. vor=f(i)*(vy(j+1,i)-vy(j-1,i)-ux(j,i+1)+ux(j,i-1))/(2.0*ds)
  4420. forc(j,i)=ds2*(ajac+vor-beta*ux(j,i))/(rgas*ts)
  4421. 1 continue
  4422. call posn(alp,forc,5.0e-10,1,lq,lp)
  4423. do i=1,lp
  4424. do j=1,lq
  4425. ps(j,i)=exp(alp(j,i))
  4426. enddo
  4427. enddo
  4428. do 2 i=1,lp
  4429. do 2 j=1,lq
  4430. do 2 k=1,km
  4431. t(j,i,k)=t(j,i,k)-tk(k)
  4432. 2 continue
  4433. !
  4434. do 5 k=1,end_z1
  4435. !
  4436. sgg=sig(k)
  4437. uee=up1(k)
  4438. WRITE(0,*)'CALLING VORTEX 2',k
  4439. call vortex1(ux,vy,sgg,ds,lq,lp,ty0,tx0,uee)
  4440. do 3 i=2,lp-1
  4441. do 3 j=2,lq-1
  4442. ajac=((ux(j+1,i)-ux(j-1,i))*(vy(j,i+1)-vy(j,i-1))-(ux(j,i+1) &
  4443. -ux(j,i-1))*(vy(j+1,i)-vy(j-1,i)))/(2.0*ds2)
  4444. vor=f(i)*(vy(j+1,i)-vy(j-1,i)-ux(j,i+1)+ux(j,i-1))/(2.0*ds)
  4445. gg1(j,i,k)=ajac+vor-beta*ux(j,i)
  4446. 3 continue
  4447. !
  4448. 5 continue
  4449. !
  4450. nnt=0
  4451. 6 nnt=nnt+1
  4452. !
  4453. do 8 j=1,lq
  4454. do 8 i=1,lp
  4455. do k=2,km
  4456. tt2(k)=t(j,i,k-1)+(t(j,i,k)-t(j,i,k-1))*(sig(k)-sig1(k-1)) &
  4457. /(sig1(k)-sig1(k-1))
  4458. enddo
  4459. do k=1,km
  4460. if(k.eq.1) then
  4461. tt(j,i,k)=(tt2(k+1)-t(j,i,k))/log(sig(k+1)/sig1(k))
  4462. else if(k.eq.km) then
  4463. tt(j,i,k)=(t(j,i,k)-tt2(k))/log(sig1(k)/sig(k))
  4464. else
  4465. tt(j,i,k)=(tt2(k+1)-tt2(k))/log(sig(k+1)/sig(k))
  4466. endif
  4467. enddo
  4468. 8 continue
  4469. !
  4470. do 15 k=1,km
  4471. !
  4472. do 9 j=2,lq-1
  4473. do 9 i=2,lp-1
  4474. alpi=alp(j-1,i)+alp(j,i-1)-4.0*alp(j,i)+alp(j+1,i)+alp(j,i+1)
  4475. if(k.eq.1) then
  4476. forc1=(t6(k+1)-tk(k))*alpi/log(sig(k+1)/sig1(k))
  4477. forc3=(gg1(j,i,k+1)-gg1(j,i,k+2))*ds2/ &
  4478. (rgas*log(sig(k+2)/sig(k+1)))
  4479. else
  4480. forc1=(t6(k+1)-t6(k))*alpi/log(sig(k+1)/sig(k))
  4481. forc3=(gg1(j,i,k)-gg1(j,i,k+1))*ds2/(rgas*log(sig(k+1)/sig(k)))
  4482. endif
  4483. forc2=(tt(j+1,i,k)+tt(j,i,k))*(alp(j+1,i)-alp(j,i))-(tt(j,i,k)+ &
  4484. tt(j-1,i,k))*(alp(j,i)-alp(j-1,i))+(tt(j,i+1,k)+tt(j,i,k))*(alp &
  4485. (j,i+1)-alp(j,i))-(tt(j,i,k)+tt(j,i-1,k))*(alp(j,i)-alp(j,i-1))
  4486. forc(j,i)=forc1+0.5*forc2+forc3
  4487. 9 continue
  4488. do 10 j=1,lq
  4489. do 10 i=1,lp
  4490. xx(j,i)=t(j,i,k)
  4491. 10 continue
  4492. !
  4493. call posn(xx,forc,err,nnt,lq,lp)
  4494. !
  4495. do 12 j=1,lq
  4496. do 12 i=1,lp
  4497. 12 t(j,i,k)=xx(j,i)
  4498. !
  4499. 15 continue
  4500. !
  4501. if(nnt.ne.4) goto 6
  4502. !
  4503. jti=int(tx0+0.5)
  4504. iti=int(ty0+0.5)
  4505. !
  4506. do k=1,km
  4507. write(6,*) t(jti,iti,k)
  4508. enddo
  4509. !
  4510. do 18 k=1,km
  4511. do 18 i=1,lp
  4512. do 18 j=1,lq
  4513. t(j,i,k)=t(j,i,k)+tk(k)
  4514. reh=amin1(1.0,rh(k)*0.01)
  4515. if(nphy.eq.0) reh=0.0
  4516. pp=sig1(k)*ps(j,i)
  4517. ta=t(j,i,k)
  4518. ees=611.2*exp(cs2*(ta-cs3)/(ta-cs4))
  4519. ees=amin1(0.5*pp,ees)
  4520. rqs=0.622*ees/(pp-ees)
  4521. rq(j,i,k)=reh*rqs
  4522. 18 continue
  4523. !
  4524. do 20 k=1,km
  4525. sgg=sig1(k)
  4526. uee=up(k)
  4527. WRITE(0,*)'CALLING VORTEX 3',k
  4528. call vortex1(ux,vy,sgg,ds,lq,lp,ty0,tx0,uee)
  4529. do 20 i=1,lp
  4530. do 20 j=1,lq
  4531. u(j,i,k)=ux(j,i)
  4532. v(j,i,k)=vy(j,i)
  4533. 20 continue
  4534. !
  4535. return
  4536. end subroutine result
  4537. !
  4538. !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4539. !
  4540. subroutine vortex1(ux,vy,sgg,ds,lq,lp,ty0,tx0,uee)
  4541. !
  4542. !----------------------------------------------------------------
  4543. implicit none
  4544. include 'BALANCE_PARS.F'
  4545. integer i,j,lq,lp
  4546. real ahem,pi,sgt,sgb,sgg,ds,ty0,tx0,uee,vm,b,r0,rr,rd,ty,tx
  4547. real ux(lq,lp),vy(lq,lp)
  4548. real tk,t6,rh,rm,vm0,ts,vt
  4549. common /comp1/tk(kmx),t6(kmx1),rh(kmx),rm,vm0,ts
  4550. !
  4551. WRITE(0,*)'INSIDE VORTEX'
  4552. ahem=1.0
  4553. if(fi0.lt.0.0) ahem=-1.0
  4554. pi=2.0*atan(1.0)
  4555. sgt=0.15
  4556. sgb=0.95
  4557. if(sgg.ge.sgb) then
  4558. vm=vm0
  4559. else if(sgg.le.sgt) then
  4560. vm=0.0
  4561. else
  4562. vm=vm0*sin(pi*(sgg-sgt)/(sgb-sgt))
  4563. endif
  4564. !
  4565. b=1.0
  4566. r0=10.0*rm
  4567. do i=1,lp
  4568. ty=(float(i)-ty0)*ds
  4569. do j=1,lq
  4570. tx=(float(j)-tx0)*2.0*ds ! factor 2.0: gopal's doing for E grid
  4571. rr=sqrt(ty*ty+tx*tx)
  4572. rd=rr/rm
  4573. vt=vm/rm*(exp((1.0-rd**b)/b)-abs(rr-rm)/(r0-rm) &
  4574. *exp((1.0-(r0/rm)**b)/b))
  4575. if(rr.ge.r0) vt=0.0
  4576. ux(j,i)=-vt*ty*ahem+uee
  4577. vy(j,i)=vt*tx*ahem
  4578. enddo
  4579. enddo
  4580. !
  4581. return
  4582. end subroutine vortex1
  4583. !
  4584. !++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4585. !
  4586. subroutine posn(xx,forc,err,nnt,lq,lp)
  4587. !
  4588. !--------------------------------------------------------
  4589. implicit none
  4590. include 'BALANCE_PARS.F'
  4591. include 'BALANCE_COMS.F'
  4592. !
  4593. integer i,j,nnt,lq,lp
  4594. real xx(lq,lp),forc(lq,lp),err
  4595. real*8 rji,ane,arm,anorm
  4596. real*8 tem(lq,lp),wk(lq,lp),fc(lq,lp)
  4597. !
  4598. do i=1,lp
  4599. do j=1,lq
  4600. tem(j,i)=xx(j,i)
  4601. fc(j,i)=forc(j,i)
  4602. enddo
  4603. enddo
  4604. !
  4605. if(nnt.eq.1.and.nenv.ne.0) then
  4606. do 1 i=2,lp-1
  4607. do 1 j=2,lq-1
  4608. tem(j,i)=tem(j,i)-0.25*fc(j,i)
  4609. 1 continue
  4610. endif
  4611. !
  4612. nt=0
  4613. 2 nt=nt+1
  4614. !
  4615. anorm=0.0d0
  4616. !
  4617. do 10 i=2,lp-1
  4618. do 10 j=2,lq-1
  4619. rji=fc(j,i)-(tem(j-1,i)+tem(j,i-1)+ &
  4620. tem(j+1,i)+tem(j,i+1)-4.0d0*tem(j,i))
  4621. ane=-0.25d0*rji
  4622. wk(j,i)=tem(j,i)+ane
  4623. arm=abs(ane)
  4624. if(arm.gt.anorm) anorm=arm
  4625. 10 continue
  4626. !
  4627. do 20 i=2,lp-1
  4628. do 20 j=2,lq-1
  4629. 20 tem(j,i)=wk(j,i)
  4630. !
  4631. do i=1,lp
  4632. do j=1,lq
  4633. xx(j,i)=tem(j,i)
  4634. enddo
  4635. enddo
  4636. !
  4637. return
  4638. end subroutine posn
  4639. !
  4640. !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4641. !
  4642. subroutine tem(ttk,ttk1,rh,km,end_z1,pp1)
  4643. !
  4644. !----------------------------------------------------------------
  4645. implicit none
  4646. include 'BALANCE_PARS.F'
  4647. include 'BALANCE_COMS.F'
  4648. integer km,end_z1,nv,k,n1
  4649. parameter(nv=30)
  4650. real ppk(km),ttk(km),ttk1(end_z1),tt(nv),pp(nv),rh(km)
  4651. real pp1(end_z1)
  4652. real rho(nv),t1,t2,p1,p2,pk,r1,r2,b,rk
  4653. !
  4654. ! Wilis Island sounding (January)
  4655. !
  4656. open(30,file='sound.d',form='formatted',status='old')
  4657. do k=1,nv
  4658. read(30,*) pp(k),tt(k),rho(k)
  4659. enddo
  4660. ! 2 format(1x,f7.1,7x,f7.2,8x,f4.1)
  4661. close(30)
  4662. !
  4663. do k=1,nv
  4664. tt(k)=tt(k)+273.15
  4665. enddo
  4666. !
  4667. do k=1,km
  4668. ppk(k)=sig1(k)*pse/100.0
  4669. pp1(k)=sig(k)*pse/100.0
  4670. enddo
  4671. pp1(end_z1)=pse/100.0
  4672. !
  4673. do k=1,km
  4674. pk=ppk(k)
  4675. !
  4676. do n1=1,nv-1
  4677. if(pp(n1).le.pk.and.pp(n1+1).gt.pk) then
  4678. t1=tt(n1)
  4679. t2=tt(n1+1)
  4680. p1=pp(n1)
  4681. p2=pp(n1+1)
  4682. endif
  4683. enddo
  4684. write(6,*) ' p1, p2=',p1,p2
  4685. !
  4686. b=(t2-t1)/(p2-p1)
  4687. ttk(k)=t1+b*(pk-p1)
  4688. enddo
  4689. !
  4690. do k=2,end_z1
  4691. pk=pp1(k)
  4692. !
  4693. do n1=1,nv-1
  4694. if(pp(n1).le.pk.and.pp(n1+1).gt.pk) then
  4695. t1=tt(n1)
  4696. t2=tt(n1+1)
  4697. p1=pp(n1)
  4698. p2=pp(n1+1)
  4699. endif
  4700. enddo
  4701. !
  4702. b=(t2-t1)/(p2-p1)
  4703. ttk1(k)=t1+b*(pk-p1)
  4704. enddo
  4705. ttk1(1)=ttk(1)
  4706. !
  4707. do k=1,km
  4708. pk=ppk(k)
  4709. !
  4710. do n1=1,nv-1
  4711. if(pp(n1).le.pk.and.pp(n1+1).gt.pk) then
  4712. r1=rho(n1)
  4713. r2=rho(n1+1)
  4714. p1=pp(n1)
  4715. p2=pp(n1+1)
  4716. endif
  4717. enddo
  4718. !
  4719. b=(r2-r1)/(p2-p1)
  4720. rk=r1+b*(pk-p1)
  4721. rh(k)=rk
  4722. enddo
  4723. !
  4724. open(23,file='pp.d',form='formatted')
  4725. do k=1,end_z1
  4726. write(23,3) k,sig(k),pp1(k),ttk1(k)-273.15
  4727. enddo
  4728. !
  4729. do k=1,km
  4730. write(23,4) k,sig1(k),ppk(k),ttk(k)-273.15,rh(k)
  4731. enddo
  4732. 3 format(2x,'k=',i2,', sig=',f8.4,', p=',f8.3,', t=',f7.2)
  4733. 4 format(2x,'k=',i2,', sig=',f8.4,', p=',f8.3,', t=',f7.2,', rh=', &
  4734. f6.3)
  4735. close(23)
  4736. !
  4737. return
  4738. end subroutine tem
  4739. subroutine env(t,ps,f,lq,lp,ds,ty0,up1,km,end_z1)
  4740. !
  4741. !------------------------------------------------------------
  4742. ! This subroutine performs initialization for a zonal flow
  4743. ! using a nonlinear balance equation in sigma coordinate.
  4744. !------------------------------------------------------------
  4745. implicit none
  4746. include 'BALANCE_PARS.F'
  4747. include 'BALANCE_COMS.F'
  4748. integer i,j,k,lq,lp,km,end_z1,nnt
  4749. real ds,ty0,forc1,forc2,forc3
  4750. real alp(lp),tt(lp,end_z1),xx(lp),forc(lp)
  4751. real alpy(lp),f(lp),t(lq,lp,km),ps(lq,lp)
  4752. real tt2(2:km),up1(end_z1)
  4753. real tk,t6,rh,rm,vm0,ts
  4754. common /comp1/tk(kmx),t6(kmx1),rh(kmx),rm,vm0,ts
  4755. !
  4756. it0=int(ty0+0.5)
  4757. !
  4758. do 1 k=1,km
  4759. do 1 i=1,lp
  4760. do 1 j=1,lq
  4761. 1 t(j,i,k)=0.0
  4762. !
  4763. do i=1,lp
  4764. alpy(i)=-f(i)*up1(end_z1)/(rgas*ts)
  4765. enddo
  4766. alp(it0)=log(pse)
  4767. do i=it0-1,1,-1
  4768. alp(i)=alp(i+1)-0.5*(alpy(i)+alpy(i+1))*ds
  4769. enddo
  4770. do i=it0+1,lp
  4771. alp(i)=alp(i-1)+0.5*(alpy(i)+alpy(i-1))*ds
  4772. enddo
  4773. !
  4774. do 2 j=1,lq
  4775. do 2 i=1,lp
  4776. ps(j,i)=exp(alp(i))
  4777. 2 continue
  4778. !
  4779. nnt=0
  4780. 6 nnt=nnt+1
  4781. !
  4782. do 8 i=1,lp
  4783. do k=2,km
  4784. tt2(k)=t(1,i,k-1)+(t(1,i,k)-t(1,i,k-1))*(sig(k)-sig1(k-1)) &
  4785. /(sig1(k)-sig1(k-1))
  4786. enddo
  4787. do k=1,km
  4788. if(k.eq.1) then
  4789. tt(i,k)=(tt2(k+1)-t(1,i,k))/log(sig(k+1)/sig1(k))
  4790. else if(k.eq.km) then
  4791. tt(i,k)=(t(1,i,k)-tt2(k))/log(sig1(k)/sig(k))
  4792. else
  4793. tt(i,k)=(tt2(k+1)-tt2(k))/log(sig(k+1)/sig(k))
  4794. endif
  4795. enddo
  4796. 8 continue
  4797. !
  4798. do 15 k=1,km
  4799. !
  4800. do 9 i=1,lp
  4801. forc1=tt(i,k)*alpy(i)
  4802. if(k.eq.1) then
  4803. forc2=f(i)*(up1(3)-up1(2))/(rgas*log(sig(3)/sig(2)))
  4804. forc3=(t6(2)-tk(1))*alpy(i)/log(sig(2)/sig1(1))
  4805. else
  4806. forc2=f(i)*(up1(k+1)-up1(k))/(rgas*log(sig(k+1)/sig(k)))
  4807. forc3=(t6(k+1)-t6(k))*alpy(i)/log(sig(k+1)/sig(k))
  4808. endif
  4809. forc(i)=forc1+forc2+forc3
  4810. 9 continue
  4811. !
  4812. xx(it0)=0.0
  4813. do i=it0-1,1,-1
  4814. xx(i)=xx(i+1)-0.5*(forc(i)+forc(i+1))*ds
  4815. enddo
  4816. do i=it0+1,lp
  4817. xx(i)=xx(i-1)+0.5*(forc(i)+forc(i-1))*ds
  4818. enddo
  4819. !
  4820. do i=1,lp
  4821. do j=1,lq
  4822. t(j,i,k)=xx(i)
  4823. enddo
  4824. enddo
  4825. !
  4826. !
  4827. 15 continue
  4828. !
  4829. if(nnt.ne.6) goto 6
  4830. !
  4831. return
  4832. end subroutine env
  4833. !
  4834. !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4835. !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4836. real function splin(x,a,b,c,d)
  4837. implicit none
  4838. real a,b,c,d
  4839. real x(4)
  4840. splin=(-a*x(1)+b*x(2)+c*x(3)-d*x(4))/81.0
  4841. return
  4842. end function splin
  4843. !
  4844. !------------------------------------------------------
  4845. !
  4846. subroutine interpz(u,v,t,pp,qv,lq,lp,km)
  4847. !
  4848. !******************************************************
  4849. implicit none
  4850. include 'BALANCE_PARS.F'
  4851. include 'BALANCE_COMS.F'
  4852. integer i,j,k,lq,lp,km
  4853. real ees,pa,ta,rqs,betk
  4854. real u(lq,lp,km),v(lq,lp,km),qv(lq,lp,km),t(lq,lp,km)
  4855. real tv(lq,lp,km),pp(lq,lp,km),pzz(lq,lp,km)
  4856. !***************************************************
  4857. !
  4858. do i=1,lp
  4859. do k=1,km
  4860. do j=1,lq
  4861. tv(j,i,k)=t(j,i,k)*(1.0+0.608*qv(j,i,k))
  4862. enddo
  4863. enddo
  4864. enddo
  4865. !
  4866. do i=1,lp
  4867. do j=1,lq
  4868. betk=(rgas/grv)*log(1.0/sig1(km))
  4869. pzz(j,i,km)=betk*tv(j,i,km)
  4870. enddo
  4871. enddo
  4872. do i=1,lp
  4873. do k=km-1,1,-1
  4874. do j=1,lq
  4875. betk=0.5*(rgas/grv)*log(sig1(k+1)/sig1(k))
  4876. pzz(j,i,k)=pzz(j,i,k+1)+betk*(tv(j,i,k)+tv(j,i,k+1))
  4877. enddo
  4878. enddo
  4879. enddo
  4880. !
  4881. do i=1,lp
  4882. do k=1,km
  4883. do j=1,lq
  4884. pa=pp(j,i,k)
  4885. ta=t(j,i,k)
  4886. ees=611.2*exp(cs2*(ta-cs3)/(ta-cs4))
  4887. rqs=0.622*ees/(pa-ees)
  4888. qv(j,i,k)=qv(j,i,k)/rqs
  4889. enddo
  4890. enddo
  4891. enddo
  4892. !
  4893. call interps(u,pzz,poz,lq,lp,km)
  4894. call interps(v,pzz,poz,lq,lp,km)
  4895. call interps(t,pzz,poz,lq,lp,km)
  4896. call interps(pp,pzz,poz,lq,lp,km)
  4897. call interps(qv,pzz,poz,lq,lp,km)
  4898. !
  4899. do i=1,lp
  4900. do k=1,km
  4901. do j=1,lq
  4902. pa=pp(j,i,k)
  4903. ta=t(j,i,k)
  4904. ees=611.2*exp(cs2*(ta-cs3)/(ta-cs4))
  4905. rqs=0.622*ees/(pa-ees)
  4906. qv(j,i,k)=qv(j,i,k)*rqs
  4907. enddo
  4908. enddo
  4909. enddo
  4910. !
  4911. return
  4912. end subroutine interpz
  4913. !
  4914. !-------------------------------------------------
  4915. ! this subroutine performs vertical interpotation
  4916. !-------------------------------------------------
  4917. !
  4918. subroutine interps(as,zz,poz,lq,lp,km)
  4919. !
  4920. !-------------------------------------------------
  4921. implicit none
  4922. integer i,j,k,lq,lp,km,n1,nn
  4923. real a1,a2,sg,sg1,sg2,b
  4924. real as(lq,lp,km),poz(km),zz(lq,lp,km),wk(lq,lp,km)
  4925. !
  4926. do 100 i=1,lp
  4927. do 100 j=1,lq
  4928. !
  4929. do 100 k=1,km
  4930. sg=poz(k)
  4931. if(sg.le.zz(j,i,km)) then
  4932. n1=km-1
  4933. else if(sg.gt.zz(j,i,1)) then
  4934. n1=1
  4935. else
  4936. do nn=1,km-1
  4937. if(sg.gt.zz(j,i,nn+1).and.sg.le.zz(j,i,nn)) then
  4938. n1=nn
  4939. goto 20
  4940. endif
  4941. enddo
  4942. 20 continue
  4943. endif
  4944. a1=as(j,i,n1+1)
  4945. a2=as(j,i,n1)
  4946. sg1=zz(j,i,n1+1)
  4947. sg2=zz(j,i,n1)
  4948. sg2=zz(j,i,n1)
  4949. b=(a2-a1)/(sg2-sg1)
  4950. wk(j,i,k)=a1+b*(sg-sg1)
  4951. !
  4952. 100 continue
  4953. !
  4954. do 200 i=1,lp
  4955. do 200 k=1,km
  4956. do 200 j=1,lq
  4957. as(j,i,k)=wk(j,i,k)
  4958. 200 continue
  4959. !
  4960. return
  4961. end subroutine interps
  4962. #ifdef HWRF
  4963. ! compute earth lat-lons for before interpolations. This is gopal's doing for ocean coupling
  4964. !============================================================================================
  4965. SUBROUTINE EARTH_LATLON_hwrf ( HLAT,HLON,VLAT,VLON, & !Earth lat,lon at H and V points
  4966. DLMD1,DPHD1,WBD1,SBD1, & !input res,west & south boundaries,
  4967. CENTRAL_LAT,CENTRAL_LON, & ! central lat,lon, all in degrees
  4968. IDS,IDE,JDS,JDE,KDS,KDE, &
  4969. IMS,IME,JMS,JME,KMS,KME, &
  4970. ITS,ITE,JTS,JTE,KTS,KTE )
  4971. !============================================================================
  4972. !
  4973. IMPLICIT NONE
  4974. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  4975. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  4976. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  4977. REAL, INTENT(IN ) :: DLMD1,DPHD1,WBD1,SBD1
  4978. REAL, INTENT(IN ) :: CENTRAL_LAT,CENTRAL_LON
  4979. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HLAT,HLON,VLAT,VLON
  4980. ! local
  4981. INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13)
  4982. INTEGER :: I,J
  4983. REAL(KIND=KNUM) :: WB,SB,DLM,DPH,TPH0,STPH0,CTPH0
  4984. REAL(KIND=KNUM) :: TDLM,TDPH,TLMH,TLMV,TLMH0,TLMV0,TPHH,TPHV,DTR
  4985. REAL(KIND=KNUM) :: STPH,CTPH,STPV,CTPV,PI_2
  4986. REAL(KIND=KNUM) :: SPHH,CLMH,FACTH,SPHV,CLMV,FACTV
  4987. REAL(KIND=KNUM), DIMENSION(IMS:IME,JMS:JME) :: GLATH,GLONH,GLATV,GLONV
  4988. !-------------------------------------------------------------------------
  4989. !
  4990. PI_2 = ACOS(0.)
  4991. DTR = PI_2/90.
  4992. WB = WBD1 * DTR ! WB: western boundary in radians
  4993. SB = SBD1 * DTR ! SB: southern boundary in radians
  4994. DLM = DLMD1 * DTR ! DLM: dlamda in radians
  4995. DPH = DPHD1 * DTR ! DPH: dphi in radians
  4996. TDLM = DLM + DLM ! TDLM: 2.0*dlamda
  4997. TDPH = DPH + DPH ! TDPH: 2.0*DPH
  4998. ! For earth lat lon only
  4999. TPH0 = CENTRAL_LAT*DTR ! TPH0: central lat in radians
  5000. STPH0 = SIN(TPH0)
  5001. CTPH0 = COS(TPH0)
  5002. DO J = JTS,MIN(JTE,JDE) !-1) ! H./ This loop takes care of zig-zag
  5003. ! ! \.H starting points along j
  5004. TLMH0 = WB - TDLM + MOD(J+1,2) * DLM ! ./ TLMH (rotated lats at H points)
  5005. TLMV0 = WB - TDLM + MOD(J,2) * DLM ! H (//ly for V points)
  5006. TPHH = SB + (J-1)*DPH ! TPHH (rotated lons at H points) are simple trans.
  5007. TPHV = TPHH ! TPHV (rotated lons at V points) are simple trans.
  5008. STPH = SIN(TPHH)
  5009. CTPH = COS(TPHH)
  5010. STPV = SIN(TPHV)
  5011. CTPV = COS(TPHV)
  5012. ! .H
  5013. DO I = ITS,MIN(ITE,IDE) !-1) ! /
  5014. TLMH = TLMH0 + I*TDLM ! \.H .U .H
  5015. ! !H./ ----><----
  5016. SPHH = CTPH0 * STPH + STPH0 * CTPH * COS(TLMH) ! DLM + DLM
  5017. GLATH(I,J)=ASIN(SPHH) ! GLATH: Earth Lat in radians
  5018. CLMH = CTPH*COS(TLMH)/(COS(GLATH(I,J))*CTPH0) &
  5019. - TAN(GLATH(I,J))*TAN(TPH0)
  5020. IF(CLMH .GT. 1.) CLMH = 1.0
  5021. IF(CLMH .LT. -1.) CLMH = -1.0
  5022. FACTH = 1.
  5023. IF(TLMH .GT. 0.) FACTH = -1.
  5024. GLONH(I,J) = -CENTRAL_LON*DTR + FACTH*ACOS(CLMH)
  5025. ENDDO
  5026. DO I = ITS,MIN(ITE,IDE) !-1)
  5027. TLMV = TLMV0 + I*TDLM
  5028. SPHV = CTPH0 * STPV + STPH0 * CTPV * COS(TLMV)
  5029. GLATV(I,J) = ASIN(SPHV)
  5030. CLMV = CTPV*COS(TLMV)/(COS(GLATV(I,J))*CTPH0) &
  5031. - TAN(GLATV(I,J))*TAN(TPH0)
  5032. IF(CLMV .GT. 1.) CLMV = 1.
  5033. IF(CLMV .LT. -1.) CLMV = -1.
  5034. FACTV = 1.
  5035. IF(TLMV .GT. 0.) FACTV = -1.
  5036. GLONV(I,J) = -CENTRAL_LON*DTR + FACTV*ACOS(CLMV)
  5037. ENDDO
  5038. ENDDO
  5039. ! Conversion to degrees (may not be required, eventually)
  5040. DO J = JTS, MIN(JTE,JDE) !-1)
  5041. DO I = ITS, MIN(ITE,IDE) !-1)
  5042. HLAT(I,J) = GLATH(I,J) / DTR
  5043. HLON(I,J)= -GLONH(I,J)/DTR
  5044. IF(HLON(I,J) .GT. 180.) HLON(I,J) = HLON(I,J) - 360.
  5045. IF(HLON(I,J) .LT. -180.) HLON(I,J) = HLON(I,J) + 360.
  5046. !
  5047. VLAT(I,J) = GLATV(I,J) / DTR
  5048. VLON(I,J) = -GLONV(I,J) / DTR
  5049. IF(VLON(I,J) .GT. 180.) VLON(I,J) = VLON(I,J) - 360.
  5050. IF(VLON(I,J) .LT. -180.) VLON(I,J) = VLON(I,J) + 360.
  5051. ENDDO
  5052. ENDDO
  5053. END SUBROUTINE EARTH_LATLON_hwrf
  5054. SUBROUTINE G2T2H_hwrf( SM,HRES_SM, & ! output grid index and weights
  5055. HLAT,HLON, & ! target (nest) input lat lon in degrees
  5056. DLMD1,DPHD1,WBD1,SBD1, & ! parent res, west and south boundaries
  5057. CENTRAL_LAT,CENTRAL_LON, & ! parent central lat,lon, all in degrees
  5058. P_IDE,P_JDE,P_IMS,P_IME,P_JMS,P_JME, & ! parent imax and jmax
  5059. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dIMEnsions
  5060. IMS,IME,JMS,JME,KMS,KME, &
  5061. ITS,ITE,JTS,JTE,KTS,KTE )
  5062. !
  5063. !*** Tom Black - Initial Version
  5064. !*** Gopal - Revised Version for WRF (includes coincident grid points)
  5065. !***
  5066. !*** GIVEN PARENT CENTRAL LAT-LONS, RESOLUTION AND WESTERN AND SOUTHERN BOUNDARY,
  5067. !*** AND THE NESTED GRID LAT-LONS AT H POINTS, THIS ROUTINE FIRST LOCATES THE
  5068. !*** INDICES,IIH,JJH, OF THE PARENT DOMAIN'S H POINTS THAT LIES CLOSEST TO THE
  5069. !*** h POINTS OF THE NESTED DOMAIN
  5070. !
  5071. !============================================================================
  5072. !
  5073. IMPLICIT NONE
  5074. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  5075. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  5076. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  5077. INTEGER, INTENT(IN ) :: P_IDE,P_JDE,P_IMS,P_IME,P_JMS,P_JME
  5078. REAL, INTENT(IN ) :: DLMD1,DPHD1,WBD1,SBD1
  5079. REAL, INTENT(IN ) :: CENTRAL_LAT,CENTRAL_LON
  5080. REAL, DIMENSION(P_IMS:P_IME,P_JMS:P_JME), INTENT(IN) :: SM
  5081. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: HLAT,HLON
  5082. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HRES_SM
  5083. ! local
  5084. INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13)
  5085. INTEGER :: IMT,JMT,N2R,MK,K,I,J,DSLP0,DSLOPE,N
  5086. INTEGER :: NROW,NCOL,KROWS
  5087. REAL(KIND=KNUM) :: X,Y,Z,TLAT,TLON
  5088. REAL(KIND=KNUM) :: PI_2,D2R,R2D,GLAT,GLON,DPH,DLM,TPH0,TLM0,WB,SB
  5089. REAL(KIND=KNUM) :: ROW,COL,SLP0,TLATHC,TLONHC,DENOM,SLOPE
  5090. REAL(KIND=KNUM) :: TLAT1,TLAT2,TLON1,TLON2,DLM1,DLM2,DLM3,DLM4,D1,D2
  5091. REAL(KIND=KNUM) :: DLA1,DLA2,DLA3,DLA4,S1,R1,DS1,AN1,AN2,AN3 ! Q
  5092. REAL(KIND=KNUM) :: DL1,DL2,DL3,DL4,DL1I,DL2I,DL3I,DL4I,SUMDL,TLONO,TLATO
  5093. REAL(KIND=KNUM) :: DTEMP
  5094. REAL , DIMENSION(IMS:IME,JMS:JME) :: TLATHX,TLONHX
  5095. INTEGER, DIMENSION(IMS:IME,JMS:JME) :: KOUTB
  5096. REAL SUM,AMAXVAL
  5097. REAL, DIMENSION (4, ims:ime, jms:jme ) :: NBWGT
  5098. LOGICAL FLIP
  5099. REAL, DIMENSION(IMS:IME,JMS:JME) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
  5100. INTEGER, DIMENSION(IMS:IME,JMS:JME) :: IIH,JJH
  5101. !-------------------------------------------------------------------------------
  5102. IMT=2*P_IDE-2 ! parent i dIMEnsions
  5103. JMT=P_JDE/2 ! parent j dIMEnsions
  5104. PI_2=ACOS(0.)
  5105. D2R=PI_2/90.
  5106. R2D=1./D2R
  5107. DPH=DPHD1*D2R
  5108. DLM=DLMD1*D2R
  5109. TPH0= CENTRAL_LAT*D2R
  5110. TLM0=-CENTRAL_LON*D2R ! NOTE THE MINUS HERE
  5111. WB=WBD1*D2R ! CONVERT NESTED GRID H POINTS FROM GEODETIC
  5112. SB=SBD1*D2R
  5113. SLP0=DPHD1/DLMD1
  5114. DSLP0=NINT(R2D*ATAN(SLP0))
  5115. DS1=SQRT(DPH*DPH+DLM*DLM) ! Q
  5116. AN1=ASIN(DLM/DS1)
  5117. AN2=ASIN(DPH/DS1)
  5118. DO J = JTS,MIN(JTE,JDE) !-1)
  5119. DO I = ITS,MIN(ITE,IDE) !-1)
  5120. !***
  5121. !*** LOCATE TARGET h POINTS (HLAT AND HLON) ON THE PARENT DOMAIN AND
  5122. !*** DETERMINE THE INDICES IN TERMS OF THE PARENT DOMAIN. FIRST
  5123. !*** CONVERT NESTED GRID h POINTS FROM GEODETIC TO TRANSFORMED
  5124. !*** COORDINATE ON THE PARENT GRID
  5125. !
  5126. GLAT=HLAT(I,J)*D2R
  5127. GLON= (360. - HLON(I,J))*D2R
  5128. X=COS(TPH0)*COS(GLAT)*COS(GLON-TLM0)+SIN(TPH0)*SIN(GLAT)
  5129. Y=-COS(GLAT)*SIN(GLON-TLM0)
  5130. Z=COS(TPH0)*SIN(GLAT)-SIN(TPH0)*COS(GLAT)*COS(GLON-TLM0)
  5131. TLAT=R2D*ATAN(Z/SQRT(X*X+Y*Y))
  5132. TLON=R2D*ATAN(Y/X)
  5133. !
  5134. ROW=TLAT/DPHD1+JMT ! JMT IS THE CENTRAL ROW OF THE PARENT DOMAIN
  5135. COL=TLON/DLMD1+P_IDE-1 ! (P_IDE-1) IS THE CENTRAL COLUMN OF THE PARENT DOMAIN
  5136. NROW=INT(ROW + 0.001) ! ROUND-OFF IS AVOIDED WITHOUT USING NINT ON PURPOSE
  5137. NCOL=INT(COL + 0.001)
  5138. TLAT=TLAT*D2R
  5139. TLON=TLON*D2R
  5140. ! WRITE(60,*)'============================================================'
  5141. ! WRITE(60,*)' ','i=',i,'j=',j
  5142. !***
  5143. !***
  5144. !*** FIRST CONSIDER THE SITUATION WHERE THE POINT h IS AT
  5145. !***
  5146. !*** V H
  5147. !***
  5148. !***
  5149. !*** h
  5150. !*** H V
  5151. !***
  5152. !*** THEN LOCATE THE NEAREST H POINT ON THE PARENT GRID
  5153. !***
  5154. IF(MOD(NROW,2).EQ.1.AND.MOD(NCOL,2).EQ.1.OR. &
  5155. MOD(NROW,2).EQ.0.AND.MOD(NCOL,2).EQ.0)THEN
  5156. TLAT1=(NROW-JMT)*DPH
  5157. TLAT2=TLAT1+DPH
  5158. TLON1=(NCOL-(P_IDE-1))*DLM
  5159. TLON2=TLON1+DLM
  5160. DLM1=TLON-TLON1
  5161. DLM2=TLON-TLON2
  5162. ! D1=ACOS(COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1))
  5163. ! D2=ACOS(COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2))
  5164. DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1))
  5165. D1=ACOS(DTEMP)
  5166. DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2))
  5167. D2=ACOS(DTEMP)
  5168. IF(D1.GT.D2)THEN
  5169. NROW=NROW+1 ! FIND THE NEAREST H ROW
  5170. NCOL=NCOL+1 ! FIND THE NEAREST H COLUMN
  5171. ENDIF
  5172. ! WRITE(60,*)'NEAREST PARENT IS:','col=',COL,'row=',ROW,'ncol=',NCOL,'nrow=',NROW
  5173. ELSE
  5174. !***
  5175. !*** NOW CONSIDER THE SITUATION WHERE THE POINT h IS AT
  5176. !***
  5177. !*** H V
  5178. !***
  5179. !***
  5180. !*** h
  5181. !*** V H
  5182. !***
  5183. !*** THEN LOCATE THE NEAREST H POINT ON THE PARENT GRID
  5184. !***
  5185. !***
  5186. TLAT1=(NROW+1-JMT)*DPH
  5187. TLAT2=TLAT1-DPH
  5188. TLON1=(NCOL-(P_IDE-1))*DLM
  5189. TLON2=TLON1+DLM
  5190. DLM1=TLON-TLON1
  5191. DLM2=TLON-TLON2
  5192. ! D1=ACOS(COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1))
  5193. ! D2=ACOS(COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2))
  5194. DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1))
  5195. D1=ACOS(DTEMP)
  5196. DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2))
  5197. D2=ACOS(DTEMP)
  5198. IF(D1.LT.D2)THEN
  5199. NROW=NROW+1 ! FIND THE NEAREST H ROW
  5200. ELSE
  5201. NCOL=NCOL+1 ! FIND THE NEAREST H COLUMN
  5202. ENDIF
  5203. ! WRITE(60,*)'NEAREST PARENT IS:','col=',COL,'row=',ROW,'ncol=',NCOL,'nrow=',NROW
  5204. ENDIF
  5205. KROWS=((NROW-1)/2)*IMT
  5206. IF(MOD(NROW,2).EQ.1)THEN
  5207. K=KROWS+(NCOL+1)/2
  5208. ELSE
  5209. K=KROWS+P_IDE-1+NCOL/2
  5210. ENDIF
  5211. !***
  5212. !*** WE NOW KNOW THAT THE INNER GRID POINT IN QUESTION IS
  5213. !*** NEAREST TO THE CENTER K AS SEEN BELOW. WE MUST FIND
  5214. !*** WHICH OF THE FOUR H-BOXES (OF WHICH THIS H POINT IS
  5215. !*** A VERTEX) SURROUNDS THE INNER GRID h POINT IN QUESTION.
  5216. !***
  5217. !**
  5218. !*** H
  5219. !***
  5220. !***
  5221. !***
  5222. !*** H V H
  5223. !***
  5224. !***
  5225. !*** h
  5226. !*** H V H V H
  5227. !***
  5228. !***
  5229. !***
  5230. !*** H V H
  5231. !***
  5232. !***
  5233. !***
  5234. !*** H
  5235. !***
  5236. !***
  5237. !*** FIND THE SLOPE OF THE LINE CONNECTING h AND THE CENTER H.
  5238. !***
  5239. N2R=K/IMT
  5240. MK=MOD(K,IMT)
  5241. !
  5242. IF(MK.EQ.0)THEN
  5243. TLATHC=SB+(2*N2R-1)*DPH
  5244. ELSE
  5245. TLATHC=SB+(2*N2R+(MK-1)/(P_IDE-1))*DPH
  5246. ENDIF
  5247. !
  5248. IF(MK.LE.(P_IDE-1))THEN
  5249. TLONHC=WB+2*(MK-1)*DLM
  5250. ELSE
  5251. TLONHC=WB+(2*(MK-(P_IDE-1))-1)*DLM
  5252. ENDIF
  5253. !
  5254. !*** EXECUTE CAUTION IF YOU NEED TO CHANGE THESE CONDITIONS. SINCE WE ARE
  5255. !*** DEALING WITH SLOPES TO GENERATE DIAMOND SHAPE H BOXES, WE NEED TO BE
  5256. !*** CAREFUL HERE
  5257. !
  5258. IF(ABS(TLON-TLONHC) .LE. 1.E-4)TLONHC=TLON
  5259. IF(ABS(TLAT-TLATHC) .LE. 1.E-4)TLATHC=TLAT
  5260. DENOM=(TLON-TLONHC)
  5261. !
  5262. !***
  5263. !***STORE THE LOCATION OF THE WESTERNMOST VERTEX OF THE H-BOX ON
  5264. !***THE OUTER GRID THAT SURROUNDS THE h POINT ON THE INNER GRID.
  5265. !***
  5266. !*** COINCIDENT CONDITIONS
  5267. IF(DENOM.EQ.0.0)THEN
  5268. IF(TLATHC.EQ.TLAT)THEN
  5269. KOUTB(I,J)=K
  5270. IIH(I,J) = NCOL
  5271. JJH(I,J) = NROW
  5272. TLATHX(I,J)=TLATHC
  5273. TLONHX(I,J)=TLONHC
  5274. HBWGT1(I,J)=1.0
  5275. HBWGT2(I,J)=0.0
  5276. HBWGT3(I,J)=0.0
  5277. HBWGT4(I,J)=0.0
  5278. ! WRITE(60,*)'TRIVIAL SOLUTION'
  5279. ELSE ! SAME LONGITUDE BUT DIFFERENT LATS
  5280. !
  5281. IF(TLATHC .GT. TLAT)THEN ! NESTED POINT SOUTH OF PARENT
  5282. KOUTB(I,J)=K-(P_IDE-1)
  5283. IIH(I,J) = NCOL-1
  5284. JJH(I,J) = NROW-1
  5285. TLATHX(I,J)=TLATHC-DPH
  5286. TLONHX(I,J)=TLONHC-DLM
  5287. ! WRITE(60,*)'VANISHING SLOPE, -ve: TLATHC-DPH, TLONHC-DLM'
  5288. ELSE ! NESTED POINT NORTH OF PARENT
  5289. KOUTB(I,J)=K+(P_IDE-1)-1
  5290. IIH(I,J) = NCOL-1
  5291. JJH(I,J) = NROW+1
  5292. TLATHX(I,J)=TLATHC+DPH
  5293. TLONHX(I,J)=TLONHC-DLM
  5294. ! WRITE(60,*)'VANISHING SLOPE, +ve: TLATHC+DPH, TLONHC-DLM'
  5295. ENDIF
  5296. !***
  5297. !***
  5298. !*** 4
  5299. !***
  5300. !*** h
  5301. !*** 1 2
  5302. !***
  5303. !*** 3
  5304. !*** DL 1-4 ARE THE ANGULAR DISTANCES FROM h TO EACH VERTEX
  5305. TLATO=TLATHX(I,J)
  5306. TLONO=TLONHX(I,J)
  5307. DLM1=TLON-TLONO
  5308. DLA1=TLAT-TLATO ! Q
  5309. ! DL1=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM1)+SIN(TLAT)*SIN(TLATO)) ! Q
  5310. DL1=SQRT(DLM1*DLM1+DLA1*DLA1) ! Q
  5311. !
  5312. TLATO=TLATHX(I,J)
  5313. TLONO=TLONHX(I,J)+2.*DLM
  5314. DLM2=TLON-TLONO
  5315. DLA2=TLAT-TLATO ! Q
  5316. ! DL2=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM2)+SIN(TLAT)*SIN(TLATO)) ! Q
  5317. DL2=SQRT(DLM2*DLM2+DLA2*DLA2) ! Q
  5318. !
  5319. TLATO=TLATHX(I,J)-DPH
  5320. TLONO=TLONHX(I,J)+DLM
  5321. DLM3=TLON-TLONO
  5322. DLA3=TLAT-TLATO ! Q
  5323. ! DL3=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM3)+SIN(TLAT)*SIN(TLATO)) ! Q
  5324. DL3=SQRT(DLM3*DLM3+DLA3*DLA3) ! Q
  5325. TLATO=TLATHX(I,J)+DPH
  5326. TLONO=TLONHX(I,J)+DLM
  5327. DLM4=TLON-TLONO
  5328. DLA4=TLAT-TLATO ! Q
  5329. ! DL4=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM4)+SIN(TLAT)*SIN(TLATO)) ! Q
  5330. DL4=SQRT(DLM4*DLM4+DLA4*DLA4) ! Q
  5331. ! THE BILINEAR WEIGHTS
  5332. !***
  5333. !***
  5334. AN3=ATAN2(DLA1,DLM1) ! Q
  5335. R1=DL1*SIN(AN2-AN3)/SIN(2.*AN1)
  5336. S1=DL1*SIN(2.*PI_2-2*AN1-AN2+AN3)/SIN(2.*AN1)
  5337. R1=R1/DS1
  5338. S1=S1/DS1
  5339. DL1I=(1.-R1)*(1.-S1)
  5340. DL2I=R1*S1
  5341. DL3I=R1*(1.-S1)
  5342. DL4I=(1.-R1)*S1
  5343. !
  5344. HBWGT1(I,J)=DL1I
  5345. HBWGT2(I,J)=DL2I
  5346. HBWGT3(I,J)=DL3I
  5347. HBWGT4(I,J)=DL4I
  5348. !
  5349. ENDIF
  5350. ELSE
  5351. !
  5352. !*** NON-COINCIDENT POINTS
  5353. !
  5354. SLOPE=(TLAT-TLATHC)/DENOM
  5355. DSLOPE=NINT(R2D*ATAN(SLOPE))
  5356. IF(DSLOPE.LE.DSLP0.AND.DSLOPE.GE.-DSLP0)THEN
  5357. IF(TLON.GT.TLONHC)THEN
  5358. ! IF(TLONHC.GE.-WB-DLM)CALL wrf_error_fatal("1H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  5359. KOUTB(I,J)=K
  5360. IIH(I,J) = NCOL
  5361. JJH(I,J) = NROW
  5362. TLATHX(I,J)=TLATHC
  5363. TLONHX(I,J)=TLONHC
  5364. ! WRITE(60,*)'HERE WE GO1: TLATHC, TLONHC'
  5365. ELSE
  5366. ! IF(TLONHC.LE.WB+DLM)CALL wrf_error_fatal("2H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  5367. KOUTB(I,J)=K-1
  5368. IIH(I,J) = NCOL-2
  5369. JJH(I,J) = NROW
  5370. TLATHX(I,J)=TLATHC
  5371. TLONHX(I,J)=TLONHC -2.*DLM
  5372. ! WRITE(60,*)'HERE WE GO2: TLATHC, TLONHC -2.*DLM'
  5373. ENDIF
  5374. !
  5375. ELSEIF(DSLOPE.GT.DSLP0)THEN
  5376. IF(TLON.GT.TLONHC)THEN
  5377. ! IF(TLATHC.GE.-SB-DPH)CALL wrf_error_fatal("3H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  5378. KOUTB(I,J)=K+(P_IDE-1)-1
  5379. IIH(I,J) = NCOL-1
  5380. JJH(I,J) = NROW+1
  5381. TLATHX(I,J)=TLATHC+DPH
  5382. TLONHX(I,J)=TLONHC-DLM
  5383. ! WRITE(60,*)'HERE WE GO3: TLATHC+DPH, TLONHC-DLM'
  5384. ELSE
  5385. ! IF(TLATHC.LE.SB+DPH)CALL wrf_error_fatal("4H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  5386. KOUTB(I,J)=K-(P_IDE-1)
  5387. IIH(I,J) = NCOL-1
  5388. JJH(I,J) = NROW-1
  5389. TLATHX(I,J)=TLATHC-DPH
  5390. TLONHX(I,J)=TLONHC-DLM
  5391. ! WRITE(60,*)'HERE WE GO4: TLATHC-DPH, TLONHC-DLM'
  5392. ENDIF
  5393. !
  5394. ELSEIF(DSLOPE.LT.-DSLP0)THEN
  5395. IF(TLON.GT.TLONHC)THEN
  5396. ! IF(TLATHC.LE.SB+DPH)CALL wrf_error_fatal("5H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  5397. KOUTB(I,J)=K-(P_IDE-1)
  5398. IIH(I,J) = NCOL-1
  5399. JJH(I,J) = NROW-1
  5400. TLATHX(I,J)=TLATHC-DPH
  5401. TLONHX(I,J)=TLONHC-DLM
  5402. ! WRITE(60,*)'HERE WE GO5: TLATHC-DPH, TLONHC-DLM'
  5403. ELSE
  5404. ! IF(TLATHC.GE.-SB-DPH)CALL wrf_error_fatal("6H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  5405. KOUTB(I,J)=K+(P_IDE-1)-1
  5406. IIH(I,J) = NCOL-1
  5407. JJH(I,J) = NROW+1
  5408. TLATHX(I,J)=TLATHC+DPH
  5409. TLONHX(I,J)=TLONHC-DLM
  5410. ! WRITE(60,*)'HERE WE GO6: TLATHC+DPH, TLONHC-DLM'
  5411. ENDIF
  5412. ENDIF
  5413. !
  5414. !*** NOW WE WILL MOVE AS FOLLOWS:
  5415. !***
  5416. !***
  5417. !*** 4
  5418. !***
  5419. !***
  5420. !***
  5421. !*** h
  5422. !*** 1 2
  5423. !***
  5424. !***
  5425. !***
  5426. !***
  5427. !*** 3
  5428. !***
  5429. !***
  5430. !***
  5431. !*** DL 1-4 ARE THE ANGULAR DISTANCES FROM h TO EACH VERTEX
  5432. TLATO=TLATHX(I,J)
  5433. TLONO=TLONHX(I,J)
  5434. DLM1=TLON-TLONO
  5435. DLA1=TLAT-TLATO ! Q
  5436. ! DL1=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM1)+SIN(TLAT)*SIN(TLATO)) ! Q
  5437. DL1=SQRT(DLM1*DLM1+DLA1*DLA1) ! Q
  5438. !
  5439. TLATO=TLATHX(I,J) ! redundant computations
  5440. TLONO=TLONHX(I,J)+2.*DLM
  5441. DLM2=TLON-TLONO
  5442. DLA2=TLAT-TLATO ! Q
  5443. ! DL2=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM2)+SIN(TLAT)*SIN(TLATO)) ! Q
  5444. DL2=SQRT(DLM2*DLM2+DLA2*DLA2) ! Q
  5445. !
  5446. TLATO=TLATHX(I,J)-DPH
  5447. TLONO=TLONHX(I,J)+DLM
  5448. DLM3=TLON-TLONO
  5449. DLA3=TLAT-TLATO ! Q
  5450. ! DL3=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM3)+SIN(TLAT)*SIN(TLATO)) ! Q
  5451. DL3=SQRT(DLM3*DLM3+DLA3*DLA3) ! Q
  5452. !
  5453. TLATO=TLATHX(I,J)+DPH
  5454. TLONO=TLONHX(I,J)+DLM
  5455. DLM4=TLON-TLONO
  5456. DLA4=TLAT-TLATO ! Q
  5457. ! DL4=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM4)+SIN(TLAT)*SIN(TLATO)) ! Q
  5458. DL4=SQRT(DLM4*DLM4+DLA4*DLA4) ! Q
  5459. ! THE BILINEAR WEIGHTS
  5460. !***
  5461. AN3=ATAN2(DLA1,DLM1) ! Q
  5462. R1=DL1*SIN(AN2-AN3)/SIN(2.*AN1)
  5463. S1=DL1*SIN(2.*PI_2-2*AN1-AN2+AN3)/SIN(2.*AN1)
  5464. R1=R1/DS1
  5465. S1=S1/DS1
  5466. DL1I=(1.-R1)*(1.-S1)
  5467. DL2I=R1*S1
  5468. DL3I=R1*(1.-S1)
  5469. DL4I=(1.-R1)*S1
  5470. !
  5471. HBWGT1(I,J)=DL1I
  5472. HBWGT2(I,J)=DL2I
  5473. HBWGT3(I,J)=DL3I
  5474. HBWGT4(I,J)=DL4I
  5475. !
  5476. ENDIF
  5477. !
  5478. !*** FINALLY STORE IIH IN TERMS OF E-GRID INDEX
  5479. !
  5480. IIH(I,J)=NINT(0.5*IIH(I,J))
  5481. ENDDO
  5482. ENDDO
  5483. !
  5484. !*** EXTENSION TO NEAREST NEIGHBOR
  5485. !
  5486. DO J = JTS,MIN(JTE,JDE) !-1)
  5487. DO I = ITS,MIN(ITE,IDE) !-1)
  5488. NBWGT(1,I,J)=HBWGT1(I,J)
  5489. NBWGT(2,I,J)=HBWGT2(I,J)
  5490. NBWGT(3,I,J)=HBWGT3(I,J)
  5491. NBWGT(4,I,J)=HBWGT4(I,J)
  5492. ENDDO
  5493. ENDDO
  5494. DO J = JTS,MIN(JTE,JDE) !-1)
  5495. DO I = ITS,MIN(ITE,IDE) !-1)
  5496. AMAXVAL=0.
  5497. DO N=1,4
  5498. AMAXVAL=amax1(NBWGT(N,I,J),AMAXVAL)
  5499. ENDDO
  5500. !
  5501. FLIP=.TRUE.
  5502. SUM=0.0
  5503. DO N=1,4
  5504. IF(AMAXVAL .EQ. NBWGT(N,I,J) .AND. FLIP)THEN
  5505. NBWGT(N,I,J)=1.0
  5506. FLIP=.FALSE.
  5507. ELSE
  5508. NBWGT(N,I,J)=0.0
  5509. ENDIF
  5510. SUM=SUM+NBWGT(N,I,J)
  5511. IF(SUM .GT. 1.0)CALL wrf_error_fatal ( "horizontal interp error - interp_hnear_nmm" )
  5512. ENDDO
  5513. IF((NBWGT(1,I,J)+NBWGT(2,I,J)+NBWGT(3,I,J)+NBWGT(4,I,J)) .NE. 1)THEN
  5514. WRITE(0,*)'------------------------------------------------------------------------'
  5515. WRITE(0,*)'FATAL: SOMETHING IS WRONG WITH THE WEIGHTS IN module_initialize_real.F'
  5516. WRITE(0,*)'------------------------------------------------------------------------'
  5517. STOP
  5518. ENDIF
  5519. ! WRITE(66,*)I,J,NBWGT(1,I,J),NBWGT(2,I,J),NBWGT(3,I,J),NBWGT(4,I,J)
  5520. ENDDO
  5521. ENDDO
  5522. DO J=MAX(3,JTS),MIN(JTE,JDE) !-1)
  5523. DO I=MAX(3,ITS),MIN(ITE,IDE) !-1)
  5524. IF(MOD(JJH(I,J),2) .NE. 0)THEN ! 1,3,5,7
  5525. HRES_SM(I,J) = NBWGT(1,I,J)*SM(IIH(I,J),JJH(I,J) ) &
  5526. + NBWGT(2,I,J)*SM(IIH(I,J)+1, JJH(I,J) ) &
  5527. + NBWGT(3,I,J)*SM(IIH(I,J), JJH(I,J)-1) &
  5528. + NBWGT(4,I,J)*SM(IIH(I,J), JJH(I,J)+1)
  5529. ! WRITE(68,*)I,J,SM(IIH(I,J),JJH(I,J)),SM(IIH(I,J)+1, JJH(I,J)), &
  5530. ! SM(IIH(I,J), JJH(I,J)-1),SM(IIH(I,J), JJH(I,J)+1),HRES_SM(I,J)
  5531. ELSE
  5532. HRES_SM(I,J) = NBWGT(1,I,J)*SM(IIH(I,J), JJH(I,J) ) &
  5533. + NBWGT(2,I,J)*SM(IIH(I,J)+1, JJH(I,J) ) &
  5534. + NBWGT(3,I,J)*SM(IIH(I,J)+1, JJH(I,J)-1) &
  5535. + NBWGT(4,I,J)*SM(IIH(I,J)+1, JJH(I,J)+1)
  5536. ! WRITE(68,*)I,J,SM(IIH(I,J),JJH(I,J)),SM(IIH(I,J)+1, JJH(I,J)), &
  5537. ! SM(IIH(I,J)+1, JJH(I,J)-1),SM(IIH(I,J)+1, JJH(I,J)+1),HRES_SM(I,J)
  5538. ENDIF
  5539. ENDDO
  5540. ENDDO
  5541. ! Boundary treatment in J direction
  5542. DO J=MAX(3,JTS),MIN(JTE,JDE)
  5543. HRES_SM(2,J)=HRES_SM(3,J)
  5544. HRES_SM(1,J)=HRES_SM(2,J)
  5545. END DO
  5546. ! Boundary treatment in J direction and 4 corners
  5547. DO I=ITS,MIN(ITE,IDE)
  5548. HRES_SM(I,2)=HRES_SM(I,3)
  5549. HRES_SM(I,1)=HRES_SM(I,2)
  5550. END DO
  5551. RETURN
  5552. END SUBROUTINE G2T2H_hwrf
  5553. !========================================================================================
  5554. ! end gopal's doing for ocean coupling
  5555. !============================================================================================
  5556. #endif
  5557. END MODULE module_initialize_ideal