PageRenderTime 38ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/dyn_nmm/NMM_NEST_UTILS1.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 3802 lines | 2481 code | 422 blank | 899 comment | 16 complexity | 9b1eb832c545956ed2b6043efc59e2ba MD5 | raw file
Possible License(s): AGPL-1.0
  1. #if (NMM_NEST == 1)
  2. !===========================================================================
  3. !
  4. ! E-GRID NESTING UTILITIES: This is gopal's doing
  5. !
  6. !===========================================================================
  7. SUBROUTINE med_nest_egrid_configure ( parent , nest )
  8. USE module_domain
  9. USE module_configure
  10. USE module_timing
  11. IMPLICIT NONE
  12. TYPE(domain) , POINTER :: parent , nest
  13. REAL, PARAMETER :: ERAD=6371200.
  14. REAL, PARAMETER :: DTR=0.01745329
  15. REAL, PARAMETER :: DTAD=1.0
  16. REAL, PARAMETER :: CP=1004.6
  17. INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE
  18. INTEGER :: IMS,IME,JMS,JME,KMS,KME
  19. INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE
  20. CHARACTER(LEN=255) :: message
  21. !----------------------------------------------------------------------------
  22. ! PURPOSE:
  23. ! - Initialize nested domain configurations including setting up
  24. ! wbd,sbd and some other variables and 1D arrays.
  25. ! - Note that in order to obtain coincident grid points, which
  26. ! is a basic requirement for RSL, WRF infrastructure, we use
  27. ! western and southern boundaries of nested domain (nest%wbd0
  28. ! and nest%sbd0 derived from the parent domain. In this case
  29. ! the nested domain may be considered as a part of the parent
  30. ! domain with a higher resolution (telescoping ?).
  31. ! - Also note that in this case, the central lat/lons for nested
  32. ! domain should coincide with the central lat/lons of the parent,
  33. ! although the nested domain NEED NOT be located at the center of
  34. ! the domain.
  35. !----------------------------------------------------------------------------
  36. !
  37. ! BASIC TEST FOR PARENT DOMAIN: CHECK IF JMAX IS ODD. SINCE JDE IN THE NAMELIST
  38. ! IS JMAX + 1, WE NEED TO CHECK IF JDE IS EVEN IN WRF CONTEXT
  39. IF(MOD(parent%ed32,2) .NE. 0)THEN
  40. CALL wrf_error_fatal("PARENT DOMAIN: JMAX IS EVEN, INCREASE e_sn IN THE namelist.input BY 1")
  41. ENDIF
  42. ! BASIC TEST FOR NESTED DOMAIN: CHECK IF JMAX IS ODD. SINCE JDE IN THE NAMELIST
  43. ! IS JMAX + 1, WE NEED TO CHECK IF JDE IS EVEN IN WRF CONTEXT
  44. IF(MOD(nest%ed32,2) .NE. 0)THEN
  45. CALL wrf_error_fatal("NESTED DOMAIN: JMAX IS EVEN, INCREASE e_sn IN THE namelist.input BY 1")
  46. ENDIF
  47. ! Parent grid configuration, including, western and southern boundary
  48. IDS = parent%sd31
  49. IDE = parent%ed31
  50. JDS = parent%sd32
  51. JDE = parent%ed32
  52. KDS = parent%sd33
  53. KDE = parent%ed33
  54. IMS = parent%sm31
  55. IME = parent%em31
  56. JMS = parent%sm32
  57. JME = parent%em32
  58. KMS = parent%sm33
  59. KME = parent%em33
  60. ITS = parent%sp31
  61. ITE = parent%ep31
  62. JTS = parent%sp32
  63. JTE = parent%ep32
  64. KTS = parent%sp33
  65. KTE = parent%ep33
  66. ! grid configuration
  67. ! calculate wbd0 and sbd0 only for MOAD i.e. grid with parent_id == 0
  68. if (parent%parent_id == 0 ) then ! Dusan's doing
  69. parent%wbd0 = -(IDE-2)*parent%dx ! WBD0: in degrees;factor 2 takes care of dummy last column
  70. parent%sbd0 = -((JDE-1)/2)*parent%dy ! SBD0: in degrees; note that JDE-1 should be odd
  71. end if
  72. nest%wbd0 = parent%wbd0 + (nest%i_parent_start-1)*2.*parent%dx + mod(nest%j_parent_start+1,2)*parent%dx
  73. nest%sbd0 = parent%sbd0 + (nest%j_parent_start-1)*parent%dy
  74. nest%dx = parent%dx/nest%parent_grid_ratio
  75. nest%dy = parent%dy/nest%parent_grid_ratio
  76. write(message,*)" - i_parent_start = ",nest%i_parent_start
  77. CALL wrf_message(trim(message))
  78. write(message,*)" - j_parent_start = ",nest%j_parent_start
  79. CALL wrf_message(trim(message))
  80. write(message,*)" - parent%wbd0 = ",parent%wbd0
  81. CALL wrf_message(trim(message))
  82. write(message,*)" - parent%sbd0 = ",parent%sbd0
  83. CALL wrf_message(trim(message))
  84. write(message,*)" - nest%wbd0 = ",nest%wbd0
  85. CALL wrf_message(trim(message))
  86. write(message,*)" - nest%sbd0 = ",nest%sbd0
  87. CALL wrf_message(trim(message))
  88. write(message,*)" - nest%dx = ",nest%dx
  89. CALL wrf_message(trim(message))
  90. write(message,*)" - nest%dy = ",nest%dy
  91. CALL wrf_message(trim(message))
  92. !
  93. CALL nl_set_dx (nest%id , nest%dx) ! for output purpose
  94. CALL nl_set_dy (nest%id , nest%dy) ! for output purpose
  95. ! set lat-lons; parent set to nested domain
  96. CALL nl_get_cen_lat (parent%id, parent%cen_lat) ! cen_lat of parent set to nested domain
  97. CALL nl_get_cen_lon (parent%id, parent%cen_lon) ! cen_lon of parent set to nested domain
  98. nest%cen_lat=parent%cen_lat
  99. nest%cen_lon=parent%cen_lon
  100. !
  101. CALL nl_set_cen_lat ( nest%id , nest%cen_lat) ! for output purpose
  102. CALL nl_set_cen_lon ( nest%id , nest%cen_lon) ! for output purpose
  103. write(message,*)" - nest%cen_lat = ",nest%cen_lat
  104. CALL wrf_message(trim(message))
  105. write(message,*)" - nest%cen_lon = ",nest%cen_lon
  106. CALL wrf_message(trim(message))
  107. ! soil configuration
  108. #ifdef HWRF
  109. !zhang
  110. if ( .not.nest%analysis ) then
  111. #endif
  112. nest%sldpth = parent%sldpth
  113. nest%dzsoil = parent%dzsoil
  114. nest%rtdpth = parent%rtdpth
  115. #ifdef HWRF
  116. endif
  117. #endif
  118. ! numerical set up
  119. nest%deta = parent%deta
  120. nest%aeta = parent%aeta
  121. nest%etax = parent%etax
  122. nest%dfl = parent%dfl
  123. nest%deta1 = parent%deta1
  124. nest%aeta1 = parent%aeta1
  125. nest%eta1 = parent%eta1
  126. nest%deta2 = parent%deta2
  127. nest%aeta2 = parent%aeta2
  128. nest%eta2 = parent%eta2
  129. nest%pdtop = parent%pdtop
  130. nest%pt = parent%pt
  131. nest%dfrlg = parent%dfrlg
  132. nest%num_soil_layers = parent%num_soil_layers
  133. nest%num_moves = parent%num_moves
  134. ! Unfortunately, some of the single value constants in used in module_initialize have
  135. ! to be defiend here instead of the usual spot in med_initialize_nest_nmm. There
  136. ! appears to be a problem in Registry and related code in this area.
  137. !
  138. ! state logical upstrm - dyn_nmm - - -
  139. nest%dlmd = nest%dx
  140. nest%dphd = nest%dy
  141. nest%dy_nmm = erad*(nest%dphd*dtr)
  142. nest%cpgfv = -nest%dt/(48.*nest%dy_nmm)
  143. nest%en = nest%dt/( 4.*nest%dy_nmm)*dtad
  144. nest%ent = nest%dt/(16.*nest%dy_nmm)*dtad
  145. nest%f4d = -.5*nest%dt*dtad
  146. nest%f4q = -nest%dt*dtad
  147. nest%ef4t = .5*nest%dt/cp
  148. ! Other output configurations that will make grads happy
  149. CALL nl_get_truelat1 (parent%id, parent%truelat1 )
  150. CALL nl_get_truelat2 (parent%id, parent%truelat2 )
  151. #ifdef HWRF
  152. ! bao : to make the restart output identical at the restart initial time for stand_lon
  153. CALL nl_get_stand_lon (parent%id, parent%stand_lon )
  154. #endif
  155. CALL nl_get_map_proj (parent%id, parent%map_proj )
  156. CALL nl_get_iswater (parent%id, parent%iswater )
  157. nest%truelat1=parent%truelat1
  158. nest%truelat2=parent%truelat2
  159. !bao
  160. nest%stand_lon=parent%stand_lon
  161. !bao
  162. nest%map_proj=parent%map_proj
  163. nest%iswater=parent%iswater
  164. CALL nl_set_truelat1(nest%id, nest%truelat1)
  165. CALL nl_set_truelat2(nest%id, nest%truelat2)
  166. !bao
  167. CALL nl_set_stand_lon(nest%id, nest%stand_lon)
  168. !bao
  169. CALL nl_set_map_proj(nest%id, nest%map_proj)
  170. CALL nl_set_iswater(nest%id, nest%iswater)
  171. ! physics and other configurations
  172. ! CALL nl_get_iswater (parent%id, nest%iswater) ! iswater is just based on parents
  173. ! CALL nl_get_bl_surface_physics (nest%id, nest%bl_surface_physics )
  174. ! CALL nl_get_num_soil_layers( parent%num_soil_layers )
  175. ! CALL nl_get_real_data_init_type (parent%real_data_init_type)
  176. END SUBROUTINE med_nest_egrid_configure
  177. SUBROUTINE med_construct_egrid_weights ( parent , nest )
  178. USE module_domain
  179. USE module_configure
  180. USE module_timing
  181. IMPLICIT NONE
  182. TYPE(domain) , POINTER :: parent , nest
  183. LOGICAL, EXTERNAL :: wrf_dm_on_monitor
  184. INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE
  185. INTEGER :: IMS,IME,JMS,JME,KMS,KME
  186. INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE
  187. INTEGER :: I,J,II,JJ,NII,NJJ
  188. REAL :: parent_CLAT,parent_CLON,parent_WBD,parent_SBD,parent_DLMD,parent_DPHD
  189. REAL :: nest_WBD,nest_SBD,nest_DLMD,nest_DPHD
  190. REAL :: SW_LATD,SW_LOND
  191. REAL :: ADDSUM1,ADDSUM2
  192. REAL :: xr,zr,xc
  193. !-----------------------------------------------------------------------------------------------------------
  194. ! PURPOSE:
  195. ! - Initialize lat-lons and determine weights
  196. !
  197. !----------------------------------------------------------------------------------------------------------
  198. ! First obtain central latitude and longitude for the parent domain
  199. CALL nl_get_cen_lat (parent%ID, parent_CLAT)
  200. CALL nl_get_cen_lon (parent%ID, parent_CLON)
  201. ! Parent grid configuration, including, western and southern boundary
  202. IDS = parent%sd31
  203. IDE = parent%ed31
  204. JDS = parent%sd32
  205. JDE = parent%ed32
  206. KDS = parent%sd33
  207. KDE = parent%ed33
  208. IMS = parent%sm31
  209. IME = parent%em31
  210. JMS = parent%sm32
  211. JME = parent%em32
  212. KMS = parent%sm33
  213. KME = parent%em33
  214. ITS = parent%sp31
  215. ITE = parent%ep31
  216. JTS = parent%sp32
  217. JTE = parent%ep32
  218. KTS = parent%sp33
  219. KTE = parent%ep33
  220. !
  221. parent_DLMD = parent%dx ! DLMD: dlamda in degrees
  222. parent_DPHD = parent%dy ! DPHD: dphi in degrees
  223. parent_WBD = parent%wbd0
  224. parent_SBD = parent%sbd0
  225. ! Now compute Geodetic lat/lon (Positive East) of parent grid in degrees
  226. CALL EARTH_LATLON ( parent%HLAT,parent%HLON,parent%VLAT,parent%VLON, & !output
  227. parent_DLMD,parent_DPHD,parent_WBD,parent_SBD, & !inputs
  228. parent_CLAT,parent_CLON, &
  229. IDS,IDE,JDS,JDE,KDS,KDE, &
  230. IMS,IME,JMS,JME,KMS,KME, &
  231. ITS,ITE,JTS,JTE,KTS,KTE )
  232. ! Nested grid configuration, including, western and southern boundary
  233. IDS = nest%sd31
  234. IDE = nest%ed31
  235. JDS = nest%sd32
  236. JDE = nest%ed32
  237. KDS = nest%sd33
  238. KDE = nest%ed33
  239. IMS = nest%sm31
  240. IME = nest%em31
  241. JMS = nest%sm32
  242. JME = nest%em32
  243. KMS = nest%sm33
  244. KME = nest%em33
  245. ITS = nest%sp31
  246. ITE = nest%ep31
  247. JTS = nest%sp32
  248. JTE = nest%ep32
  249. KTS = nest%sp33
  250. KTE = nest%ep33
  251. !
  252. nest_DLMD = nest%dx
  253. nest_DPHD = nest%dy
  254. nest_WBD = nest%wbd0
  255. nest_SBD = nest%sbd0
  256. !
  257. ! Now compute Geodetic lat/lon (Positive East) of nest in degrees, with the same central lat-lon
  258. ! as the parent grid
  259. !
  260. CALL EARTH_LATLON ( nest%HLAT,nest%HLON,nest%VLAT,nest%VLON, & ! output
  261. nest_DLMD,nest_DPHD,nest_WBD,nest_SBD, & ! nest inputs
  262. parent_CLAT,parent_CLON, & ! parent central lat/lon
  263. IDS,IDE,JDS,JDE,KDS,KDE, & ! nested domain dimension
  264. IMS,IME,JMS,JME,KMS,KME, &
  265. ITS,ITE,JTS,JTE,KTS,KTE )
  266. ! Determine the weights of nested grid h points nearest to H points of parent domain
  267. if(nest%vortex_tracker /= 1) then
  268. CALL G2T2H_new( nest%IIH,nest%JJH, & ! output grid index in parent grid
  269. nest%HBWGT1,nest%HBWGT2, & ! output weights in terms of parent grid
  270. nest%HBWGT3,nest%HBWGT4, &
  271. nest%I_PARENT_START,nest%J_PARENT_START, & ! nest start I, J in parent domain
  272. 3, & ! Ratio of parent and child grid ( always = 3 for NMM)
  273. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  274. IMS,IME,JMS,JME,KMS,KME, &
  275. ITS,ITE,JTS,JTE,KTS,KTE )
  276. else
  277. CALL G2T2H( nest%IIH,nest%JJH, & ! output grid index on nested grid
  278. nest%HBWGT1,nest%HBWGT2, & ! output weights on the nested grid
  279. nest%HBWGT3,nest%HBWGT4, &
  280. nest%HLAT,nest%HLON, & ! target (nest) input lat lon in degrees
  281. parent_DLMD,parent_DPHD,parent_WBD,parent_SBD, & ! parent res, western and south boundaries
  282. parent_CLAT,parent_CLON, & ! parent central lat,lon, all in degrees
  283. parent%ed31,parent%ed32, & ! parent imax and jmax
  284. IDS,IDE,JDS,JDE,KDS,KDE, & !
  285. IMS,IME,JMS,JME,KMS,KME, & ! nested grid configuration
  286. ITS,ITE,JTS,JTE,KTS,KTE ) !
  287. endif
  288. ! Determine the weights of nested grid v points nearest to V points of parent domain
  289. if(nest%vortex_tracker /= 1) then
  290. CALL G2T2V_new( nest%IIV,nest%JJV, & ! output grid index in parent grid
  291. nest%VBWGT1,nest%VBWGT2, & ! output weights in terms of parent grid
  292. nest%VBWGT3,nest%VBWGT4, &
  293. nest%I_PARENT_START,nest%J_PARENT_START, & ! nest start I, J in parent domain
  294. 3, & ! Ratio of parent and child grid ( always = 3 for NMM)
  295. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  296. IMS,IME,JMS,JME,KMS,KME, &
  297. ITS,ITE,JTS,JTE,KTS,KTE )
  298. else
  299. CALL G2T2V( nest%IIV,nest%JJV, & ! output grid index on nested grid
  300. nest%VBWGT1,nest%VBWGT2, & ! output weights on the nested grid
  301. nest%VBWGT3,nest%VBWGT4, &
  302. nest%VLAT,nest%VLON, & ! target (nest) input lat lon in degrees
  303. parent_DLMD,parent_DPHD,parent_WBD,parent_SBD, & ! parent res, western and south boundaries
  304. parent_CLAT,parent_CLON, & ! parent central lat,lon, all in degrees
  305. parent%ed31,parent%ed32, & ! parent imax and jmax
  306. IDS,IDE,JDS,JDE,KDS,KDE, & !
  307. IMS,IME,JMS,JME,KMS,KME, & ! nested grid configuration
  308. ITS,ITE,JTS,JTE,KTS,KTE ) !
  309. endif
  310. !*** CHECK WEIGHTS AT MASS AND VELOCITY POINTS
  311. CALL WEIGTS_CHECK(nest%HBWGT1,nest%HBWGT2, & ! output weights on the nested grid
  312. nest%HBWGT3,nest%HBWGT4, &
  313. nest%VBWGT1,nest%VBWGT2, & ! output weights on the nested grid
  314. nest%VBWGT3,nest%VBWGT4, &
  315. IDS,IDE,JDS,JDE,KDS,KDE, & !
  316. IMS,IME,JMS,JME,KMS,KME, & ! nested grid configuration
  317. ITS,ITE,JTS,JTE,KTS,KTE )
  318. !*** CHECK DOMAIN BOUNDS BEFORE PROCEEDING TO INTERPOLATION
  319. !
  320. CALL BOUNDS_CHECK( nest%IIH,nest%JJH,nest%IIV,nest%JJV, &
  321. nest%i_parent_start,nest%j_parent_start,nest%shw, &
  322. IDS,IDE,JDS,JDE,KDS,KDE, & !
  323. IMS,IME,JMS,JME,KMS,KME, & ! nested grid configuration
  324. ITS,ITE,JTS,JTE,KTS,KTE )
  325. !------------------------------------------------------------------------------------------
  326. END SUBROUTINE med_construct_egrid_weights
  327. !======================================================================================
  328. !
  329. ! compute earth lat-lons for parent and the nest before interpolations
  330. !------------------------------------------------------------------------------
  331. SUBROUTINE EARTH_LATLON ( HLAT,HLON,VLAT,VLON, & !Earth lat,lon at H and V points
  332. DLMD1,DPHD1,WBD1,SBD1, & !input res,west & south boundaries,
  333. CENTRAL_LAT,CENTRAL_LON, & ! central lat,lon, all in degrees
  334. IDS,IDE,JDS,JDE,KDS,KDE, &
  335. IMS,IME,JMS,JME,KMS,KME, &
  336. ITS,ITE,JTS,JTE,KTS,KTE )
  337. !============================================================================
  338. !
  339. IMPLICIT NONE
  340. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  341. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  342. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  343. REAL, INTENT(IN ) :: DLMD1,DPHD1,WBD1,SBD1
  344. REAL, INTENT(IN ) :: CENTRAL_LAT,CENTRAL_LON
  345. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HLAT,HLON,VLAT,VLON
  346. ! local
  347. INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13)
  348. INTEGER :: I,J
  349. REAL(KIND=KNUM) :: WB,SB,DLM,DPH,TPH0,STPH0,CTPH0
  350. REAL(KIND=KNUM) :: TDLM,TDPH,TLMH,TLMV,TLMH0,TLMV0,TPHH,TPHV,DTR
  351. REAL(KIND=KNUM) :: STPH,CTPH,STPV,CTPV,PI_2
  352. REAL(KIND=KNUM) :: SPHH,CLMH,FACTH,SPHV,CLMV,FACTV
  353. REAL(KIND=KNUM), DIMENSION(IMS:IME,JMS:JME) :: GLATH,GLONH,GLATV,GLONV
  354. !-------------------------------------------------------------------------
  355. !
  356. PI_2 = ACOS(0.)
  357. DTR = PI_2/90.
  358. WB = WBD1 * DTR ! WB: western boundary in radians
  359. SB = SBD1 * DTR ! SB: southern boundary in radians
  360. DLM = DLMD1 * DTR ! DLM: dlamda in radians
  361. DPH = DPHD1 * DTR ! DPH: dphi in radians
  362. TDLM = DLM + DLM ! TDLM: 2.0*dlamda
  363. TDPH = DPH + DPH ! TDPH: 2.0*DPH
  364. ! For earth lat lon only
  365. TPH0 = CENTRAL_LAT*DTR ! TPH0: central lat in radians
  366. STPH0 = SIN(TPH0)
  367. CTPH0 = COS(TPH0)
  368. ! .H
  369. DO J = JTS,MIN(JTE,JDE-1) ! H./ This loop takes care of zig-zag
  370. ! ! \.H starting points along j
  371. TLMH0 = WB - TDLM + MOD(J+1,2) * DLM ! ./ TLMH (rotated lats at H points)
  372. TLMV0 = WB - TDLM + MOD(J,2) * DLM ! H (//ly for V points)
  373. TPHH = SB + (J-1)*DPH ! TPHH (rotated lons at H points) are simple trans.
  374. TPHV = TPHH ! TPHV (rotated lons at V points) are simple trans.
  375. STPH = SIN(TPHH)
  376. CTPH = COS(TPHH)
  377. STPV = SIN(TPHV)
  378. CTPV = COS(TPHV)
  379. ! .H
  380. DO I = ITS,MIN(ITE,IDE-1) ! /
  381. TLMH = TLMH0 + I*TDLM ! \.H .U .H
  382. ! !H./ ----><----
  383. SPHH = CTPH0 * STPH + STPH0 * CTPH * COS(TLMH) ! DLM + DLM
  384. GLATH(I,J)=ASIN(SPHH) ! GLATH: Earth Lat in radians
  385. CLMH = CTPH*COS(TLMH)/(COS(GLATH(I,J))*CTPH0) &
  386. - TAN(GLATH(I,J))*TAN(TPH0)
  387. IF(CLMH .GT. 1.) CLMH = 1.0
  388. IF(CLMH .LT. -1.) CLMH = -1.0
  389. FACTH = 1.
  390. IF(TLMH .GT. 0.) FACTH = -1.
  391. GLONH(I,J) = -CENTRAL_LON*DTR + FACTH*ACOS(CLMH)
  392. ENDDO
  393. DO I = ITS,MIN(ITE,IDE-1)
  394. TLMV = TLMV0 + I*TDLM
  395. SPHV = CTPH0 * STPV + STPH0 * CTPV * COS(TLMV)
  396. GLATV(I,J) = ASIN(SPHV)
  397. CLMV = CTPV*COS(TLMV)/(COS(GLATV(I,J))*CTPH0) &
  398. - TAN(GLATV(I,J))*TAN(TPH0)
  399. IF(CLMV .GT. 1.) CLMV = 1.
  400. IF(CLMV .LT. -1.) CLMV = -1.
  401. FACTV = 1.
  402. IF(TLMV .GT. 0.) FACTV = -1.
  403. GLONV(I,J) = -CENTRAL_LON*DTR + FACTV*ACOS(CLMV)
  404. ENDDO
  405. ENDDO
  406. ! Conversion to degrees (may not be required, eventually)
  407. DO J = JTS, MIN(JTE,JDE-1)
  408. DO I = ITS, MIN(ITE,IDE-1)
  409. HLAT(I,J) = GLATH(I,J) / DTR
  410. HLON(I,J)= -GLONH(I,J)/DTR
  411. IF(HLON(I,J) .GT. 180.) HLON(I,J) = HLON(I,J) - 360.
  412. IF(HLON(I,J) .LT. -180.) HLON(I,J) = HLON(I,J) + 360.
  413. !
  414. VLAT(I,J) = GLATV(I,J) / DTR
  415. VLON(I,J) = -GLONV(I,J) / DTR
  416. IF(VLON(I,J) .GT. 180.) VLON(I,J) = VLON(I,J) - 360.
  417. IF(VLON(I,J) .LT. -180.) VLON(I,J) = VLON(I,J) + 360.
  418. ENDDO
  419. ENDDO
  420. END SUBROUTINE EARTH_LATLON
  421. !-----------------------------------------------------------------------------
  422. SUBROUTINE G2T2H( IIH,JJH, & ! output grid index and weights
  423. HBWGT1,HBWGT2, & ! output weights in terms of parent grid
  424. HBWGT3,HBWGT4, &
  425. HLAT,HLON, & ! target (nest) input lat lon in degrees
  426. DLMD1,DPHD1,WBD1,SBD1, & ! parent res, west and south boundaries
  427. CENTRAL_LAT,CENTRAL_LON, & ! parent central lat,lon, all in degrees
  428. P_IDE,P_JDE, & ! parent imax and jmax
  429. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dIMEnsions
  430. IMS,IME,JMS,JME,KMS,KME, &
  431. ITS,ITE,JTS,JTE,KTS,KTE )
  432. !
  433. !*** Tom Black - Initial Version
  434. !*** Gopal - Revised Version for WRF (includes coincident grid points)
  435. !***
  436. !*** GIVEN PARENT CENTRAL LAT-LONS, RESOLUTION AND WESTERN AND SOUTHERN BOUNDARY,
  437. !*** AND THE NESTED GRID LAT-LONS AT H POINTS, THIS ROUTINE FIRST LOCATES THE
  438. !*** INDICES,IIH,JJH, OF THE PARENT DOMAIN'S H POINTS THAT LIES CLOSEST TO THE
  439. !*** h POINTS OF THE NESTED DOMAIN
  440. !
  441. !============================================================================
  442. !
  443. IMPLICIT NONE
  444. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  445. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  446. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  447. INTEGER, INTENT(IN ) :: P_IDE,P_JDE
  448. REAL, INTENT(IN ) :: DLMD1,DPHD1,WBD1,SBD1
  449. REAL, INTENT(IN ) :: CENTRAL_LAT,CENTRAL_LON
  450. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: HLAT,HLON
  451. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
  452. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH
  453. ! local
  454. INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13)
  455. INTEGER :: IMT,JMT,N2R,MK,K,I,J,DSLP0,DSLOPE
  456. INTEGER :: NROW,NCOL,KROWS
  457. REAL(KIND=KNUM) :: X,Y,Z,TLAT,TLON
  458. REAL(KIND=KNUM) :: PI_2,D2R,R2D,GLAT,GLON,DPH,DLM,TPH0,TLM0,WB,SB
  459. REAL(KIND=KNUM) :: ROW,COL,SLP0,TLATHC,TLONHC,DENOM,SLOPE
  460. REAL(KIND=KNUM) :: TLAT1,TLAT2,TLON1,TLON2,DLM1,DLM2,DLM3,DLM4,D1,D2
  461. REAL(KIND=KNUM) :: DLA1,DLA2,DLA3,DLA4,S1,R1,DS1,AN1,AN2,AN3 ! Q
  462. REAL(KIND=KNUM) :: DL1,DL2,DL3,DL4,DL1I,DL2I,DL3I,DL4I,SUMDL,TLONO,TLATO
  463. REAL(KIND=KNUM) :: DTEMP
  464. REAL , DIMENSION(IMS:IME,JMS:JME) :: TLATHX,TLONHX
  465. INTEGER, DIMENSION(IMS:IME,JMS:JME) :: KOUTB
  466. !-------------------------------------------------------------------------------
  467. IMT=2*P_IDE-2 ! parent i dIMEnsions
  468. JMT=P_JDE/2 ! parent j dIMEnsions
  469. PI_2=ACOS(0.)
  470. D2R=PI_2/90.
  471. R2D=1./D2R
  472. DPH=DPHD1*D2R
  473. DLM=DLMD1*D2R
  474. TPH0= CENTRAL_LAT*D2R
  475. TLM0=-CENTRAL_LON*D2R ! NOTE THE MINUS HERE
  476. WB=WBD1*D2R ! CONVERT NESTED GRID H POINTS FROM GEODETIC
  477. SB=SBD1*D2R
  478. SLP0=DPHD1/DLMD1
  479. DSLP0=NINT(R2D*ATAN(SLP0))
  480. DS1=SQRT(DPH*DPH+DLM*DLM) ! Q
  481. AN1=ASIN(DLM/DS1)
  482. AN2=ASIN(DPH/DS1)
  483. DO J = JTS,MIN(JTE,JDE-1)
  484. DO I = ITS,MIN(ITE,IDE-1)
  485. !***
  486. !*** LOCATE TARGET h POINTS (HLAT AND HLON) ON THE PARENT DOMAIN AND
  487. !*** DETERMINE THE INDICES IN TERMS OF THE PARENT DOMAIN. FIRST
  488. !*** CONVERT NESTED GRID h POINTS FROM GEODETIC TO TRANSFORMED
  489. !*** COORDINATE ON THE PARENT GRID
  490. !
  491. GLAT=HLAT(I,J)*D2R
  492. GLON= (360. - HLON(I,J))*D2R
  493. X=COS(TPH0)*COS(GLAT)*COS(GLON-TLM0)+SIN(TPH0)*SIN(GLAT)
  494. Y=-COS(GLAT)*SIN(GLON-TLM0)
  495. Z=COS(TPH0)*SIN(GLAT)-SIN(TPH0)*COS(GLAT)*COS(GLON-TLM0)
  496. TLAT=R2D*ATAN(Z/SQRT(X*X+Y*Y))
  497. TLON=R2D*ATAN(Y/X)
  498. ! ROW=TLAT/DPHD1+JMT ! JMT IS THE CENTRAL ROW OF THE PARENT DOMAIN
  499. ! COL=TLON/DLMD1+P_IDE-1 ! (P_IDE-1) IS THE CENTRAL COLUMN OF THE PARENT DOMAIN
  500. ROW=(TLAT-SBD1)/DPHD1+1 ! Dusan's doing
  501. COL=(TLON-WBD1)/DLMD1+1 ! Dusan's doing
  502. NROW=INT(ROW + 0.001) ! ROUND-OFF IS AVOIDED WITHOUT USING NINT ON PURPOSE
  503. NCOL=INT(COL + 0.001)
  504. TLAT=TLAT*D2R
  505. TLON=TLON*D2R
  506. !***
  507. !***
  508. !*** FIRST CONSIDER THE SITUATION WHERE THE POINT h IS AT
  509. !***
  510. !*** V H
  511. !***
  512. !***
  513. !*** H
  514. !*** H V
  515. !***
  516. !*** THEN LOCATE THE NEAREST H POINT ON THE PARENT GRID
  517. !***
  518. IF(MOD(NROW,2).EQ.1.AND.MOD(NCOL,2).EQ.1.OR. &
  519. MOD(NROW,2).EQ.0.AND.MOD(NCOL,2).EQ.0)THEN
  520. TLAT1=(NROW-JMT)*DPH
  521. TLAT2=TLAT1+DPH
  522. TLON1=(NCOL-(P_IDE-1))*DLM
  523. TLON2=TLON1+DLM
  524. DLM1=TLON-TLON1
  525. DLM2=TLON-TLON2
  526. ! D1=ACOS(COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1))
  527. ! D2=ACOS(COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2))
  528. DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1))
  529. D1=ACOS(DTEMP)
  530. DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2))
  531. D2=ACOS(DTEMP)
  532. IF(D1.GT.D2)THEN
  533. NROW=NROW+1 ! FIND THE NEAREST H ROW
  534. NCOL=NCOL+1 ! FIND THE NEAREST H COLUMN
  535. ENDIF
  536. ELSE
  537. !***
  538. !*** NOW CONSIDER THE SITUATION WHERE THE POINT h IS AT
  539. !***
  540. !*** H V
  541. !***
  542. !***
  543. !*** H
  544. !*** V H
  545. !***
  546. !*** THEN LOCATE THE NEAREST H POINT ON THE PARENT GRID
  547. !***
  548. !***
  549. TLAT1=(NROW+1-JMT)*DPH
  550. TLAT2=TLAT1-DPH
  551. TLON1=(NCOL-(P_IDE-1))*DLM
  552. TLON2=TLON1+DLM
  553. DLM1=TLON-TLON1
  554. DLM2=TLON-TLON2
  555. ! D1=ACOS(COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1))
  556. ! D2=ACOS(COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2))
  557. DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1))
  558. D1=ACOS(DTEMP)
  559. DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2))
  560. D2=ACOS(DTEMP)
  561. IF(D1.LT.D2)THEN
  562. NROW=NROW+1 ! FIND THE NEAREST H ROW
  563. ELSE
  564. NCOL=NCOL+1 ! FIND THE NEAREST H COLUMN
  565. ENDIF
  566. ENDIF
  567. KROWS=((NROW-1)/2)*IMT
  568. IF(MOD(NROW,2).EQ.1)THEN
  569. K=KROWS+(NCOL+1)/2
  570. ELSE
  571. K=KROWS+P_IDE-1+NCOL/2
  572. ENDIF
  573. !***
  574. !*** WE NOW KNOW THAT THE INNER GRID POINT IN QUESTION IS
  575. !*** NEAREST TO THE CENTER K AS SEEN BELOW. WE MUST FIND
  576. !*** WHICH OF THE FOUR H-BOXES (OF WHICH THIS H POINT IS
  577. !*** A VERTEX) SURROUNDS THE INNER GRID h POINT IN QUESTION.
  578. !***
  579. !**
  580. !*** H
  581. !***
  582. !***
  583. !***
  584. !*** H V H
  585. !***
  586. !***
  587. !*** H
  588. !*** H V H V H
  589. !***
  590. !***
  591. !***
  592. !*** H V H
  593. !***
  594. !***
  595. !***
  596. !*** H
  597. !***
  598. !***
  599. !*** FIND THE SLOPE OF THE LINE CONNECTING h AND THE CENTER H.
  600. !***
  601. N2R=K/IMT
  602. MK=MOD(K,IMT)
  603. !
  604. IF(MK.EQ.0)THEN
  605. TLATHC=SB+(2*N2R-1)*DPH
  606. ELSE
  607. TLATHC=SB+(2*N2R+(MK-1)/(P_IDE-1))*DPH
  608. ENDIF
  609. !
  610. IF(MK.LE.(P_IDE-1))THEN
  611. TLONHC=WB+2*(MK-1)*DLM
  612. ELSE
  613. TLONHC=WB+(2*(MK-(P_IDE-1))-1)*DLM
  614. ENDIF
  615. !
  616. !*** EXECUTE CAUTION IF YOU NEED TO CHANGE THESE CONDITIONS. SINCE WE ARE
  617. !*** DEALING WITH SLOPES TO GENERATE DIAMOND SHAPE H BOXES, WE NEED TO BE
  618. !*** CAREFUL HERE
  619. !
  620. IF(ABS(TLON-TLONHC) .LE. 1.E-4)TLONHC=TLON
  621. IF(ABS(TLAT-TLATHC) .LE. 1.E-4)TLATHC=TLAT
  622. DENOM=(TLON-TLONHC)
  623. !
  624. !***
  625. !***STORE THE LOCATION OF THE WESTERNMOST VERTEX OF THE H-BOX ON
  626. !***THE OUTER GRID THAT SURROUNDS THE h POINT ON THE INNER GRID.
  627. !***
  628. !*** COINCIDENT CONDITIONS
  629. IF(DENOM.EQ.0.0)THEN
  630. IF(TLATHC.EQ.TLAT)THEN
  631. KOUTB(I,J)=K
  632. IIH(I,J) = NCOL
  633. JJH(I,J) = NROW
  634. TLATHX(I,J)=TLATHC
  635. TLONHX(I,J)=TLONHC
  636. HBWGT1(I,J)=1.0
  637. HBWGT2(I,J)=0.0
  638. HBWGT3(I,J)=0.0
  639. HBWGT4(I,J)=0.0
  640. ELSE ! SAME LONGITUDE BUT DIFFERENT LATS
  641. !
  642. IF(TLATHC .GT. TLAT)THEN ! NESTED POINT SOUTH OF PARENT
  643. KOUTB(I,J)=K-(P_IDE-1)
  644. IIH(I,J) = NCOL-1
  645. JJH(I,J) = NROW-1
  646. TLATHX(I,J)=TLATHC-DPH
  647. TLONHX(I,J)=TLONHC-DLM
  648. ELSE ! NESTED POINT NORTH OF PARENT
  649. KOUTB(I,J)=K+(P_IDE-1)-1
  650. IIH(I,J) = NCOL-1
  651. JJH(I,J) = NROW+1
  652. TLATHX(I,J)=TLATHC+DPH
  653. TLONHX(I,J)=TLONHC-DLM
  654. ENDIF
  655. !***
  656. !***
  657. !*** 4
  658. !***
  659. !*** H
  660. !*** 1 2
  661. !***
  662. !*** 3
  663. !*** DL 1-4 ARE THE ANGULAR DISTANCES FROM h TO EACH VERTEX
  664. TLATO=TLATHX(I,J)
  665. TLONO=TLONHX(I,J)
  666. DLM1=TLON-TLONO
  667. DLA1=TLAT-TLATO ! Q
  668. ! DL1=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM1)+SIN(TLAT)*SIN(TLATO)) ! Q
  669. DL1=SQRT(DLM1*DLM1+DLA1*DLA1) ! Q
  670. !
  671. TLATO=TLATHX(I,J)
  672. TLONO=TLONHX(I,J)+2.*DLM
  673. DLM2=TLON-TLONO
  674. DLA2=TLAT-TLATO ! Q
  675. ! DL2=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM2)+SIN(TLAT)*SIN(TLATO)) ! Q
  676. DL2=SQRT(DLM2*DLM2+DLA2*DLA2) ! Q
  677. !
  678. TLATO=TLATHX(I,J)-DPH
  679. TLONO=TLONHX(I,J)+DLM
  680. DLM3=TLON-TLONO
  681. DLA3=TLAT-TLATO ! Q
  682. ! DL3=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM3)+SIN(TLAT)*SIN(TLATO)) ! Q
  683. DL3=SQRT(DLM3*DLM3+DLA3*DLA3) ! Q
  684. TLATO=TLATHX(I,J)+DPH
  685. TLONO=TLONHX(I,J)+DLM
  686. DLM4=TLON-TLONO
  687. DLA4=TLAT-TLATO ! Q
  688. ! DL4=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM4)+SIN(TLAT)*SIN(TLATO)) ! Q
  689. DL4=SQRT(DLM4*DLM4+DLA4*DLA4) ! Q
  690. ! THE BILINEAR WEIGHTS
  691. !***
  692. !***
  693. AN3=ATAN2(DLA1,DLM1) ! Q
  694. R1=DL1*SIN(AN2-AN3)/SIN(2.*AN1)
  695. S1=DL1*SIN(2.*PI_2-2*AN1-AN2+AN3)/SIN(2.*AN1)
  696. R1=R1/DS1
  697. S1=S1/DS1
  698. DL1I=(1.-R1)*(1.-S1)
  699. DL2I=R1*S1
  700. DL3I=R1*(1.-S1)
  701. DL4I=(1.-R1)*S1
  702. !
  703. HBWGT1(I,J)=DL1I
  704. HBWGT2(I,J)=DL2I
  705. HBWGT3(I,J)=DL3I
  706. HBWGT4(I,J)=DL4I
  707. !
  708. ENDIF
  709. ELSE
  710. !
  711. !*** NON-COINCIDENT POINTS
  712. !
  713. SLOPE=(TLAT-TLATHC)/DENOM
  714. DSLOPE=NINT(R2D*ATAN(SLOPE))
  715. IF(DSLOPE.LE.DSLP0.AND.DSLOPE.GE.-DSLP0)THEN
  716. IF(TLON.GT.TLONHC)THEN
  717. IF(TLONHC.GE.-WB-DLM)CALL wrf_error_fatal("1H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  718. KOUTB(I,J)=K
  719. IIH(I,J) = NCOL
  720. JJH(I,J) = NROW
  721. TLATHX(I,J)=TLATHC
  722. TLONHX(I,J)=TLONHC
  723. ELSE
  724. IF(TLONHC.LE.WB+DLM)CALL wrf_error_fatal("2H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  725. KOUTB(I,J)=K-1
  726. IIH(I,J) = NCOL-2
  727. JJH(I,J) = NROW
  728. TLATHX(I,J)=TLATHC
  729. TLONHX(I,J)=TLONHC -2.*DLM
  730. ENDIF
  731. !
  732. ELSEIF(DSLOPE.GT.DSLP0)THEN
  733. IF(TLON.GT.TLONHC)THEN
  734. IF(TLATHC.GE.-SB-DPH)CALL wrf_error_fatal("3H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  735. KOUTB(I,J)=K+(P_IDE-1)-1
  736. IIH(I,J) = NCOL-1
  737. JJH(I,J) = NROW+1
  738. TLATHX(I,J)=TLATHC+DPH
  739. TLONHX(I,J)=TLONHC-DLM
  740. ELSE
  741. IF(TLATHC.LE.SB+DPH)CALL wrf_error_fatal("4H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  742. KOUTB(I,J)=K-(P_IDE-1)
  743. IIH(I,J) = NCOL-1
  744. JJH(I,J) = NROW-1
  745. TLATHX(I,J)=TLATHC-DPH
  746. TLONHX(I,J)=TLONHC-DLM
  747. ENDIF
  748. !
  749. ELSEIF(DSLOPE.LT.-DSLP0)THEN
  750. IF(TLON.GT.TLONHC)THEN
  751. IF(TLATHC.LE.SB+DPH)CALL wrf_error_fatal("5H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  752. KOUTB(I,J)=K-(P_IDE-1)
  753. IIH(I,J) = NCOL-1
  754. JJH(I,J) = NROW-1
  755. TLATHX(I,J)=TLATHC-DPH
  756. TLONHX(I,J)=TLONHC-DLM
  757. ELSE
  758. IF(TLATHC.GE.-SB-DPH)CALL wrf_error_fatal("6H:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  759. KOUTB(I,J)=K+(P_IDE-1)-1
  760. IIH(I,J) = NCOL-1
  761. JJH(I,J) = NROW+1
  762. TLATHX(I,J)=TLATHC+DPH
  763. TLONHX(I,J)=TLONHC-DLM
  764. ENDIF
  765. ENDIF
  766. !
  767. !*** NOW WE WILL MOVE AS FOLLOWS:
  768. !***
  769. !***
  770. !*** 4
  771. !***
  772. !***
  773. !***
  774. !*** H
  775. !*** 1 2
  776. !***
  777. !***
  778. !***
  779. !***
  780. !*** 3
  781. !***
  782. !***
  783. !***
  784. !*** DL 1-4 ARE THE ANGULAR DISTANCES FROM h TO EACH VERTEX
  785. TLATO=TLATHX(I,J)
  786. TLONO=TLONHX(I,J)
  787. DLM1=TLON-TLONO
  788. DLA1=TLAT-TLATO ! Q
  789. ! DL1=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM1)+SIN(TLAT)*SIN(TLATO)) ! Q
  790. DL1=SQRT(DLM1*DLM1+DLA1*DLA1) ! Q
  791. !
  792. TLATO=TLATHX(I,J) ! redundant computations
  793. TLONO=TLONHX(I,J)+2.*DLM
  794. DLM2=TLON-TLONO
  795. DLA2=TLAT-TLATO ! Q
  796. ! DL2=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM2)+SIN(TLAT)*SIN(TLATO)) ! Q
  797. DL2=SQRT(DLM2*DLM2+DLA2*DLA2) ! Q
  798. !
  799. TLATO=TLATHX(I,J)-DPH
  800. TLONO=TLONHX(I,J)+DLM
  801. DLM3=TLON-TLONO
  802. DLA3=TLAT-TLATO ! Q
  803. ! DL3=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM3)+SIN(TLAT)*SIN(TLATO)) ! Q
  804. DL3=SQRT(DLM3*DLM3+DLA3*DLA3) ! Q
  805. !
  806. TLATO=TLATHX(I,J)+DPH
  807. TLONO=TLONHX(I,J)+DLM
  808. DLM4=TLON-TLONO
  809. DLA4=TLAT-TLATO ! Q
  810. ! DL4=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM4)+SIN(TLAT)*SIN(TLATO)) ! Q
  811. DL4=SQRT(DLM4*DLM4+DLA4*DLA4) ! Q
  812. ! THE BILINEAR WEIGHTS
  813. !***
  814. AN3=ATAN2(DLA1,DLM1) ! Q
  815. R1=DL1*SIN(AN2-AN3)/SIN(2.*AN1)
  816. S1=DL1*SIN(2.*PI_2-2*AN1-AN2+AN3)/SIN(2.*AN1)
  817. R1=R1/DS1
  818. S1=S1/DS1
  819. DL1I=(1.-R1)*(1.-S1)
  820. DL2I=R1*S1
  821. DL3I=R1*(1.-S1)
  822. DL4I=(1.-R1)*S1
  823. !
  824. HBWGT1(I,J)=DL1I
  825. HBWGT2(I,J)=DL2I
  826. HBWGT3(I,J)=DL3I
  827. HBWGT4(I,J)=DL4I
  828. !
  829. ENDIF
  830. !
  831. !*** FINALLY STORE IIH IN TERMS OF E-GRID INDEX
  832. !
  833. IIH(I,J)=NINT(0.5*IIH(I,J))
  834. HBWGT1(I,J)=MAX(HBWGT1(I,J),0.0) ! all weights must be GE zero (postive def)
  835. HBWGT2(I,J)=MAX(HBWGT2(I,J),0.0) ! all weights must be GE zero (postive def)
  836. HBWGT3(I,J)=MAX(HBWGT3(I,J),0.0) ! all weights must be GE zero (postive def)
  837. HBWGT4(I,J)=MAX(HBWGT4(I,J),0.0) ! all weights must be GE zero (postive def)
  838. ! write(message,105)"H WEIGHTS:",I,J,HBWGT1(I,J),HBWGT2(I,J),HBWGT3(I,J),HBWGT4(I,J), &
  839. ! HBWGT1(I,J)+HBWGT2(I,J)+HBWGT3(I,J)+HBWGT4(I,J),IIH(i,j),JJH(i,j)
  840. ! CALL wrf_message(trim(message))
  841. ! 105 format(a,2i4,5f7.3,2i4)
  842. ENDDO
  843. ENDDO
  844. RETURN
  845. END SUBROUTINE G2T2H
  846. !========================================================================================
  847. SUBROUTINE G2T2V( IIV,JJV, & ! output grid index and weights
  848. VBWGT1,VBWGT2, & ! output weights in terms of parent grid
  849. VBWGT3,VBWGT4, &
  850. VLAT,VLON, & ! target (nest) input lat lon in degrees
  851. DLMD1,DPHD1,WBD1,SBD1, & ! parent res, west and south boundaries
  852. CENTRAL_LAT,CENTRAL_LON, & ! parent central lat,lon, all in degrees
  853. P_IDE,P_JDE, & ! parent imax and jmax
  854. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dIMEnsions
  855. IMS,IME,JMS,JME,KMS,KME, &
  856. ITS,ITE,JTS,JTE,KTS,KTE )
  857. !
  858. !*** Tom Black - Initial Version
  859. !*** Gopal - Revised Version for WRF (includes coincIDEnt grid points)
  860. !***
  861. !*** GIVEN PARENT CENTRAL LAT-LONS, RESOLUTION AND WESTERN AND SOUTHERN BOUNDARY,
  862. !*** AND THE NESTED GRID LAT-LONS AT V POINTS, THIS ROUTINE FIRST LOCATES THE
  863. !*** INDICES,IIV,JJV, OF THE PARENT DOMAIN'S V POINTS THAT LIES CLOSEST TO THE
  864. !*** V POINTS OF THE NESTED DOMAIN
  865. !
  866. !============================================================================
  867. IMPLICIT NONE
  868. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  869. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  870. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  871. INTEGER, INTENT(IN ) :: P_IDE,P_JDE
  872. REAL, INTENT(IN ) :: DLMD1,DPHD1,WBD1,SBD1
  873. REAL, INTENT(IN ) :: CENTRAL_LAT,CENTRAL_LON
  874. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: VLAT,VLON
  875. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4
  876. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV
  877. ! local
  878. INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13) ! (6) single precision
  879. INTEGER :: IMT,JMT,N2R,MK,K,I,J,DSLP0,DSLOPE
  880. INTEGER :: NROW,NCOL,KROWS
  881. REAL(KIND=KNUM) :: X,Y,Z,TLAT,TLON
  882. REAL(KIND=KNUM) :: PI_2,D2R,R2D,GLAT,GLON,DPH,DLM,TPH0,TLM0,WB,SB
  883. REAL(KIND=KNUM) :: ROW,COL,SLP0,TLATVC,TLONVC,DENOM,SLOPE
  884. REAL(KIND=KNUM) :: TLAT1,TLAT2,TLON1,TLON2,DLM1,DLM2,DLM3,DLM4,D1,D2
  885. REAL(KIND=KNUM) :: DLA1,DLA2,DLA3,DLA4,S1,R1,DS1,AN1,AN2,AN3 ! Q
  886. REAL(KIND=KNUM) :: DL1,DL2,DL3,DL4,DL1I,DL2I,DL3I,DL4I,SUMDL,TLONO,TLATO
  887. REAL(KIND=KNUM) :: DTEMP
  888. REAL , DIMENSION(IMS:IME,JMS:JME) :: TLATVX,TLONVX
  889. INTEGER, DIMENSION(IMS:IME,JMS:JME) :: KOUTB
  890. !-------------------------------------------------------------------------------------
  891. IMT=2*P_IDE-2 ! parent i dIMEnsions
  892. JMT=P_JDE/2 ! parent j dIMEnsions
  893. PI_2=ACOS(0.)
  894. D2R=PI_2/90.
  895. R2D=1./D2R
  896. DPH=DPHD1*D2R
  897. DLM=DLMD1*D2R
  898. TPH0= CENTRAL_LAT*D2R
  899. TLM0=-CENTRAL_LON*D2R ! NOTE THE MINUS HERE
  900. WB=WBD1*D2R ! DEGREES TO RADIANS
  901. SB=SBD1*D2R
  902. SLP0=DPHD1/DLMD1
  903. DSLP0=NINT(R2D*ATAN(SLP0))
  904. DS1=SQRT(DPH*DPH+DLM*DLM) ! Q
  905. AN1=ASIN(DLM/DS1)
  906. AN2=ASIN(DPH/DS1)
  907. DO J = JTS,MIN(JTE,JDE-1)
  908. DO I = ITS,MIN(ITE,IDE-1)
  909. !***
  910. !*** LOCATE TARGET V POINTS (VLAT AND VLON) ON THE PARENT DOMAIN AND
  911. !*** DETERMINE THE INDICES IN TERMS OF THE PARENT DOMAIN. FIRST
  912. !*** CONVERT NESTED GRID V POINTS FROM GEODETIC TO TRANSFORMED
  913. !*** COORDINATE ON THE PARENT GRID
  914. !
  915. GLAT=VLAT(I,J)*D2R
  916. GLON=(360. - VLON(I,J))*D2R
  917. X=COS(TPH0)*COS(GLAT)*COS(GLON-TLM0)+SIN(TPH0)*SIN(GLAT)
  918. Y=-COS(GLAT)*SIN(GLON-TLM0)
  919. Z=COS(TPH0)*SIN(GLAT)-SIN(TPH0)*COS(GLAT)*COS(GLON-TLM0)
  920. TLAT=R2D*ATAN(Z/SQRT(X*X+Y*Y))
  921. TLON=R2D*ATAN(Y/X)
  922. ! ROW=TLAT/DPHD1+JMT ! JMT IS THE CENTRAL ROW OF THE PARENT DOMAIN
  923. ! COL=TLON/DLMD1+P_IDE-1 ! (P_IDE-1) IS THE CENTRAL COLUMN OF THE PARENT DOMAIN
  924. ROW=(TLAT-SBD1)/DPHD1+1 ! Dusan's doing
  925. COL=(TLON-WBD1)/DLMD1+1 ! Dusan's doing
  926. NROW=INT(ROW + 0.001) ! ROUND-OFF IS AVOIDED WITHOUT USING NINT ON PURPOSE
  927. NCOL=INT(COL + 0.001)
  928. TLAT=TLAT*D2R
  929. TLON=TLON*D2R
  930. !***
  931. !***
  932. !*** FIRST CONSIDER THE SITUATION WHERE THE POINT V IS AT
  933. !***
  934. !*** H V
  935. !***
  936. !***
  937. !*** V
  938. !*** V H
  939. !***
  940. !*** THEN LOCATE THE NEAREST V POINT ON THE PARENT GRID
  941. !***
  942. IF(MOD(NROW,2).EQ.0.AND.MOD(NCOL,2).EQ.1.OR. &
  943. MOD(NROW,2).EQ.1.AND.MOD(NCOL,2).EQ.0)THEN
  944. TLAT1=(NROW-JMT)*DPH
  945. TLAT2=TLAT1+DPH
  946. TLON1=(NCOL-(P_IDE-1))*DLM
  947. TLON2=TLON1+DLM
  948. DLM1=TLON-TLON1
  949. DLM2=TLON-TLON2
  950. ! D1=ACOS(COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1))
  951. ! D2=ACOS(COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2))
  952. DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1))
  953. D1=ACOS(DTEMP)
  954. DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2))
  955. D2=ACOS(DTEMP)
  956. IF(D1.GT.D2)THEN
  957. NROW=NROW+1 ! FIND THE NEAREST V ROW
  958. NCOL=NCOL+1 ! FIND THE NEAREST V COLUMN
  959. ENDIF
  960. ELSE
  961. !***
  962. !*** NOW CONSIDER THE SITUATION WHERE THE POINT V IS AT
  963. !***
  964. !*** V H
  965. !***
  966. !***
  967. !*** V
  968. !*** H V
  969. !***
  970. !*** THEN LOCATE THE NEAREST V POINT ON THE PARENT GRID
  971. !***
  972. TLAT1=(NROW+1-JMT)*DPH
  973. TLAT2=TLAT1-DPH
  974. TLON1=(NCOL-(P_IDE-1))*DLM
  975. TLON2=TLON1+DLM
  976. DLM1=TLON-TLON1
  977. DLM2=TLON-TLON2
  978. ! D1=ACOS(COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1))
  979. ! D2=ACOS(COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2))
  980. DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT1)*COS(DLM1)+SIN(TLAT)*SIN(TLAT1))
  981. D1=ACOS(DTEMP)
  982. DTEMP=MIN(1.0_KNUM,COS(TLAT)*COS(TLAT2)*COS(DLM2)+SIN(TLAT)*SIN(TLAT2))
  983. D2=ACOS(DTEMP)
  984. IF(D1.LT.D2)THEN
  985. NROW=NROW+1 ! FIND THE NEAREST H ROW
  986. ELSE
  987. NCOL=NCOL+1 ! FIND THE NEAREST H COLUMN
  988. ENDIF
  989. ENDIF
  990. KROWS=((NROW-1)/2)*IMT
  991. IF(MOD(NROW,2).EQ.1)THEN
  992. K=KROWS+NCOL/2
  993. ELSE
  994. K=KROWS+P_IDE-2+(NCOL+1)/2 ! check this one should this not be P_IDE-2 ????
  995. ENDIF
  996. !***
  997. !*** WE NOW KNOW THAT THE INNER GRID POINT IN QUESTION IS
  998. !*** NEAREST TO THE CENTER K AS SEEN BELOW. WE MUST FIND
  999. !*** WHICH OF THE FOUR v-BOXES (OF WHICH THIS V POINT IS
  1000. !*** A VERTEX) SURROUNDS THE INNER GRID V POINT IN QUESTION.
  1001. !***
  1002. !***
  1003. !*** V
  1004. !***
  1005. !***
  1006. !***
  1007. !*** V H V
  1008. !***
  1009. !***
  1010. !*** V
  1011. !*** V H V H V
  1012. !***
  1013. !***
  1014. !***
  1015. !*** V H V
  1016. !***
  1017. !***
  1018. !***
  1019. !*** V
  1020. !***
  1021. !***
  1022. !*** FIND THE SLOPE OF THE LINE CONNECTING V AND THE CENTER v.
  1023. !***
  1024. N2R=K/IMT
  1025. MK=MOD(K,IMT)
  1026. !
  1027. IF(MK.EQ.0)THEN
  1028. TLATVC=SB+(2*N2R-1)*DPH
  1029. ELSE
  1030. TLATVC=SB+(2*N2R+MK/(P_IDE-1))*DPH
  1031. ENDIF
  1032. !
  1033. IF(MK.LE.(P_IDE-1)-1)THEN
  1034. TLONVC=WB+(2*MK-1)*DLM
  1035. ELSE
  1036. TLONVC=WB+2*(MK-(P_IDE-1))*DLM
  1037. ENDIF
  1038. !
  1039. !*** EXECUTE CAUTION IF YOU NEED TO CHANGE THESE CONDITIONS. SINCE WE ARE
  1040. !*** DEALING WITH SLOPES TO GENERATE DIAMOND SHAPE V BOXES, WE NEED TO BE
  1041. !*** CAREFUL HERE
  1042. !
  1043. IF(ABS(TLON-TLONVC) .LE. 1.E-4)TLONVC=TLON
  1044. IF(ABS(TLAT-TLATVC) .LE. 1.E-4)TLATVC=TLAT
  1045. DENOM=(TLON-TLONVC)
  1046. !
  1047. !***
  1048. !***STORE THE LOCATION OF THE WESTERNMOST VERTEX OF THE H-BOX ON
  1049. !***THE OUTER GRID THAT SURROUNDS THE h POINT ON THE INNER GRID.
  1050. !***
  1051. !*** COINCIDENT CONDITIONS
  1052. IF(DENOM.EQ.0.0)THEN
  1053. IF(TLATVC.EQ.TLAT)THEN
  1054. KOUTB(I,J)=K
  1055. IIV(I,J) = NCOL
  1056. JJV(I,J) = NROW
  1057. TLATVX(I,J)=TLATVC
  1058. TLONVX(I,J)=TLONVC
  1059. VBWGT1(I,J)=1.0
  1060. VBWGT2(I,J)=0.0
  1061. VBWGT3(I,J)=0.0
  1062. VBWGT4(I,J)=0.0
  1063. ELSE ! SAME LONGITUDE BUT DIFFERENT LATS
  1064. IF(TLATVC .GT. TLAT)THEN ! NESTED POINT SOUTH OF PARENT
  1065. KOUTB(I,J)=K-(P_IDE-1)
  1066. IIV(I,J) = NCOL-1
  1067. JJV(I,J) = NROW-1
  1068. TLATVX(I,J)=TLATVC-DPH
  1069. TLONVX(I,J)=TLONVC-DLM
  1070. ELSE ! NESTED POINT NORTH OF PARENT
  1071. KOUTB(I,J)=K+(P_IDE-1)-1
  1072. IIV(I,J) = NCOL-1
  1073. JJV(I,J) = NROW+1
  1074. TLATVX(I,J)=TLATVC+DPH
  1075. TLONVX(I,J)=TLONVC-DLM
  1076. ENDIF
  1077. !***
  1078. !***
  1079. !*** 4
  1080. !***
  1081. !*** V
  1082. !*** 1 2
  1083. !***
  1084. !*** 3
  1085. !*** DL 1-4 ARE THE ANGULAR DISTANCES FROM h TO EACH VERTEX
  1086. TLATO=TLATVX(I,J)
  1087. TLONO=TLONVX(I,J)
  1088. DLM1=TLON-TLONO
  1089. DLA1=TLAT-TLATO ! Q
  1090. ! DL1=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM1)+SIN(TLAT)*SIN(TLATO)) ! Q
  1091. DL1=SQRT(DLM1*DLM1+DLA1*DLA1) ! Q
  1092. !
  1093. TLATO=TLATVX(I,J)
  1094. TLONO=TLONVX(I,J)+2.*DLM
  1095. DLM2=TLON-TLONO
  1096. DLA2=TLAT-TLATO ! Q
  1097. ! DL2=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM2)+SIN(TLAT)*SIN(TLATO)) ! Q
  1098. DL2=SQRT(DLM2*DLM2+DLA2*DLA2) ! Q
  1099. TLATO=TLATVX(I,J)-DPH
  1100. TLONO=TLONVX(I,J)+DLM
  1101. DLM3=TLON-TLONO
  1102. DLA3=TLAT-TLATO ! Q
  1103. ! DL3=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM3)+SIN(TLAT)*SIN(TLATO)) ! Q
  1104. DL3=SQRT(DLM3*DLM3+DLA3*DLA3) ! Q
  1105. TLATO=TLATVX(I,J)+DPH
  1106. TLONO=TLONVX(I,J)+DLM
  1107. DLM4=TLON-TLONO
  1108. DLA4=TLAT-TLATO ! Q
  1109. ! DL4=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM4)+SIN(TLAT)*SIN(TLATO)) ! Q
  1110. DL4=SQRT(DLM4*DLM4+DLA4*DLA4) ! Q
  1111. ! THE BILINEAR WEIGHTS
  1112. !***
  1113. AN3=ATAN2(DLA1,DLM1) ! Q
  1114. R1=DL1*SIN(AN2-AN3)/SIN(2.*AN1)
  1115. S1=DL1*SIN(2.*PI_2-2*AN1-AN2+AN3)/SIN(2.*AN1)
  1116. R1=R1/DS1
  1117. S1=S1/DS1
  1118. DL1I=(1.-R1)*(1.-S1)
  1119. DL2I=R1*S1
  1120. DL3I=R1*(1.-S1)
  1121. DL4I=(1.-R1)*S1
  1122. !
  1123. VBWGT1(I,J)=DL1I
  1124. VBWGT2(I,J)=DL2I
  1125. VBWGT3(I,J)=DL3I
  1126. VBWGT4(I,J)=DL4I
  1127. ENDIF
  1128. ELSE
  1129. !
  1130. !*** NON-COINCIDENT POINTS
  1131. !
  1132. SLOPE=(TLAT-TLATVC)/DENOM
  1133. DSLOPE=NINT(R2D*ATAN(SLOPE))
  1134. IF(DSLOPE.LE.DSLP0.AND.DSLOPE.GE.-DSLP0)THEN
  1135. IF(TLON.GT.TLONVC)THEN
  1136. IF(TLONVC.GE.-WB-DLM)CALL wrf_error_fatal("1V:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  1137. KOUTB(I,J)=K
  1138. IIV(I,J)=NCOL
  1139. JJV(I,J)=NROW
  1140. TLATVX(I,J)=TLATVC
  1141. TLONVX(I,J)=TLONVC
  1142. ELSE
  1143. IF(TLONVC.LE.WB+DLM)CALL wrf_error_fatal("2V:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  1144. KOUTB(I,J)=K-1
  1145. IIV(I,J) = NCOL-2
  1146. JJV(I,J) = NROW
  1147. TLATVX(I,J)=TLATVC
  1148. TLONVX(I,J)=TLONVC-2.*DLM
  1149. ENDIF
  1150. ELSEIF(DSLOPE.GT.DSLP0)THEN
  1151. IF(TLON.GT.TLONVC)THEN
  1152. IF(TLATVC.GE.-SB-DPH)CALL wrf_error_fatal("3V:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  1153. KOUTB(I,J)=K+(P_IDE-1)-1
  1154. IIV(I,J) = NCOL-1
  1155. JJV(I,J) = NROW+1
  1156. TLATVX(I,J)=TLATVC+DPH
  1157. TLONVX(I,J)=TLONVC-DLM
  1158. ELSE
  1159. IF(TLATVC.LE.SB+DPH)CALL wrf_error_fatal("4V:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  1160. KOUTB(I,J)=K-(P_IDE-1)
  1161. IIV(I,J) = NCOL-1
  1162. JJV(I,J) = NROW-1
  1163. TLATVX(I,J)=TLATVC-DPH
  1164. TLONVX(I,J)=TLONVC-DLM
  1165. ENDIF
  1166. ELSEIF(DSLOPE.LT.-DSLP0)THEN
  1167. IF(TLON.GT.TLONVC)THEN
  1168. IF(TLATVC.LE.SB+DPH)CALL wrf_error_fatal("5V:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  1169. KOUTB(I,J)=K-(P_IDE-1)
  1170. IIV(I,J) = NCOL-1
  1171. JJV(I,J) = NROW-1
  1172. TLATVX(I,J)=TLATVC-DPH
  1173. TLONVX(I,J)=TLONVC-DLM
  1174. ELSE
  1175. IF(TLATVC.GE.-SB-DPH)CALL wrf_error_fatal("6V:NESTED DOMAIN TOO CLOSE TO THE BOUNDARY OF PARENT")
  1176. KOUTB(I,J)=K+(P_IDE-1)-1
  1177. IIV(I,J) = NCOL-1
  1178. JJV(I,J) = NROW+1
  1179. TLATVX(I,J)=TLATVC+DPH
  1180. TLONVX(I,J)=TLONVC-DLM
  1181. ENDIF
  1182. ENDIF
  1183. !
  1184. !*** NOW WE WILL MOVE AS FOLLOWS:
  1185. !***
  1186. !***
  1187. !*** 4
  1188. !***
  1189. !***
  1190. !***
  1191. !*** V
  1192. !*** 1 2
  1193. !***
  1194. !***
  1195. !***
  1196. !***
  1197. !*** 3
  1198. !***
  1199. !***
  1200. !***
  1201. !*** DL 1-4 ARE THE ANGULAR DISTANCES FROM V TO EACH VERTEX
  1202. TLATO=TLATVX(I,J)
  1203. TLONO=TLONVX(I,J)
  1204. DLM1=TLON-TLONO
  1205. DLA1=TLAT-TLATO ! Q
  1206. ! DL1=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM1)+SIN(TLAT)*SIN(TLATO)) ! Q
  1207. DL1=SQRT(DLM1*DLM1+DLA1*DLA1) ! Q
  1208. !
  1209. TLATO=TLATVX(I,J)
  1210. TLONO=TLONVX(I,J)+2.*DLM
  1211. DLM2=TLON-TLONO
  1212. DLA2=TLAT-TLATO ! Q
  1213. ! DL2=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM2)+SIN(TLAT)*SIN(TLATO)) ! Q
  1214. DL2=SQRT(DLM2*DLM2+DLA2*DLA2) ! Q
  1215. !
  1216. TLATO=TLATVX(I,J)-DPH
  1217. TLONO=TLONVX(I,J)+DLM
  1218. DLM3=TLON-TLONO
  1219. DLA3=TLAT-TLATO ! Q
  1220. ! DL3=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM3)+SIN(TLAT)*SIN(TLATO)) ! Q
  1221. DL3=SQRT(DLM3*DLM3+DLA3*DLA3) ! Q
  1222. !
  1223. TLATO=TLATVX(I,J)+DPH
  1224. TLONO=TLONVX(I,J)+DLM
  1225. DLM4=TLON-TLONO
  1226. DLA4=TLAT-TLATO ! Q
  1227. ! DL4=ACOS(COS(TLAT)*COS(TLATO)*COS(DLM4)+SIN(TLAT)*SIN(TLATO)) ! Q
  1228. DL4=SQRT(DLM4*DLM4+DLA4*DLA4) ! Q
  1229. ! THE BILINEAR WEIGHTS
  1230. !***
  1231. AN3=ATAN2(DLA1,DLM1) ! Q
  1232. R1=DL1*SIN(AN2-AN3)/SIN(2.*AN1)
  1233. S1=DL1*SIN(2.*PI_2-2*AN1-AN2+AN3)/SIN(2.*AN1)
  1234. R1=R1/DS1
  1235. S1=S1/DS1
  1236. DL1I=(1.-R1)*(1.-S1)
  1237. DL2I=R1*S1
  1238. DL3I=R1*(1.-S1)
  1239. DL4I=(1.-R1)*S1
  1240. !
  1241. VBWGT1(I,J)=DL1I
  1242. VBWGT2(I,J)=DL2I
  1243. VBWGT3(I,J)=DL3I
  1244. VBWGT4(I,J)=DL4I
  1245. ENDIF
  1246. !
  1247. !*** FINALLY STORE IIH IN TERMS OF E-GRID INDEX
  1248. !
  1249. IIV(I,J)=NINT(0.5*IIV(I,J))
  1250. VBWGT1(I,J)=MAX(VBWGT1(I,J),0.0) ! all weights must be GE zero (postive def)
  1251. VBWGT2(I,J)=MAX(VBWGT2(I,J),0.0) ! all weights must be GE zero (postive def)
  1252. VBWGT3(I,J)=MAX(VBWGT3(I,J),0.0) ! all weights must be GE zero (postive def)
  1253. VBWGT4(I,J)=MAX(VBWGT4(I,J),0.0) ! all weights must be GE zero (postive def)
  1254. ENDDO
  1255. ENDDO
  1256. RETURN
  1257. END SUBROUTINE G2T2V
  1258. !-----------------------------------------------------------------------------
  1259. SUBROUTINE G2T2H_new( IIH,JJH, & ! output grid index and weights
  1260. HBWGT1,HBWGT2, & ! output weights in terms of parent grid
  1261. HBWGT3,HBWGT4, &
  1262. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1263. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1264. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1265. IMS,IME,JMS,JME,KMS,KME, &
  1266. ITS,ITE,JTS,JTE,KTS,KTE )
  1267. !
  1268. !*** XUEJIN ZHANG --- Initial version (09/08/2008)
  1269. !*** XUEJIN ZHANG --- Modified for parallel purpose (09/10/2009)
  1270. !*** XUEJIN ZHANG --- Modified for parallel purpose (09/29/2009)
  1271. !Function: Bilnear interpolation weight and indexing for E-grid
  1272. !
  1273. IMPLICIT NONE
  1274. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1275. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1276. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1277. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1278. INTEGER, INTENT(IN ) :: RATIO
  1279. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
  1280. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH
  1281. !LOCAL VARIABLES
  1282. INTEGER :: I,J
  1283. INTEGER :: JP
  1284. !*** ARRANGEMENT OF 4 VERTEXES FROM PARENT DOMAIN
  1285. !***
  1286. !*** 4
  1287. !***
  1288. !*** h
  1289. !*** 1 2
  1290. !***
  1291. !***
  1292. !*** 3
  1293. !
  1294. !*************************************************************
  1295. !*** POINT (i,j) SPANS 9 NESTED POINTS
  1296. !*** A VERTEX IN THE NEST DOMAIN AND INDEXING FOR PARENT DOMAIN
  1297. !***
  1298. !***
  1299. !*** H
  1300. !***
  1301. !*** h h
  1302. !*** / \
  1303. !*** h h h
  1304. !*** / \ / \
  1305. !*** H h h H
  1306. !*** \ / \ /
  1307. !*** h h h
  1308. !*** \ /
  1309. !*** h h
  1310. !***
  1311. !*** H
  1312. !***
  1313. !***
  1314. !***
  1315. !*************************************************************
  1316. !*** MOVING NEST ALWAYS STARTING FROM MASS GRID H
  1317. !*** PLEASE REFER TO E-GRID ARRANGEMENT FIGURE FOR MASS POINTS
  1318. DO J=JTS,MIN(JTE,JDE-1)
  1319. DO I=ITS,MIN(ITE,IDE-1)
  1320. JP = MOD(J,RATIO*2)
  1321. SELECT CASE(JP)
  1322. CASE ( 1 )
  1323. CALL SUB1H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, &
  1324. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1325. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1326. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1327. IMS,IME,JMS,JME,KMS,KME, &
  1328. ITS,ITE,JTS,JTE,KTS,KTE )
  1329. CASE ( 2 )
  1330. CALL SUB2H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, &
  1331. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1332. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1333. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1334. IMS,IME,JMS,JME,KMS,KME, &
  1335. ITS,ITE,JTS,JTE,KTS,KTE )
  1336. CASE ( 3 )
  1337. CALL SUB3H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, &
  1338. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1339. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1340. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1341. IMS,IME,JMS,JME,KMS,KME, &
  1342. ITS,ITE,JTS,JTE,KTS,KTE )
  1343. CASE ( 4 )
  1344. CALL SUB4H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, &
  1345. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1346. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1347. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1348. IMS,IME,JMS,JME,KMS,KME, &
  1349. ITS,ITE,JTS,JTE,KTS,KTE )
  1350. CASE ( 5 )
  1351. CALL SUB5H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, &
  1352. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1353. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1354. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1355. IMS,IME,JMS,JME,KMS,KME, &
  1356. ITS,ITE,JTS,JTE,KTS,KTE )
  1357. CASE ( 0 )
  1358. CALL SUB6H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, &
  1359. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1360. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1361. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1362. IMS,IME,JMS,JME,KMS,KME, &
  1363. ITS,ITE,JTS,JTE,KTS,KTE )
  1364. END SELECT
  1365. #if defined(EXPENSIVE_HWRF_DEBUG_STUFF)
  1366. write(0,105)"NEW H WEIGHTS:",I,J,IIH(i,j),JJH(i,j),HBWGT1(I,J),HBWGT2(I,J),HBWGT3(I,J),HBWGT4(I,J), &
  1367. HBWGT1(I,J)+HBWGT2(I,J)+HBWGT3(I,J)+HBWGT4(I,J)
  1368. #endif
  1369. 105 format(a,4i4,5f7.3)
  1370. END DO
  1371. END DO
  1372. RETURN
  1373. END SUBROUTINE G2T2H_new
  1374. SUBROUTINE SUB1H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, &
  1375. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1376. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1377. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1378. IMS,IME,JMS,JME,KMS,KME, &
  1379. ITS,ITE,JTS,JTE,KTS,KTE )
  1380. IMPLICIT NONE
  1381. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1382. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1383. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1384. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1385. INTEGER, INTENT(IN ) :: RATIO
  1386. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
  1387. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH
  1388. !LOCAL VARIABLES
  1389. INTEGER :: I,J
  1390. INTEGER :: IP
  1391. IP = MOD(I,RATIO)
  1392. SELECT CASE(IP)
  1393. CASE ( 1 )
  1394. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1395. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1396. HBWGT1(I,J) = 1.0
  1397. HBWGT2(I,J) = 0.0
  1398. HBWGT3(I,J) = 0.0
  1399. HBWGT4(I,J) = 0.0
  1400. CASE ( 2 )
  1401. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1402. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1403. HBWGT1(I,J) = 4.0/9.0
  1404. HBWGT2(I,J) = 1.0/9.0
  1405. HBWGT3(I,J) = 2.0/9.0
  1406. HBWGT4(I,J) = 2.0/9.0
  1407. CASE ( 0 )
  1408. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1409. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1410. HBWGT1(I,J) = 1.0/9.0
  1411. HBWGT2(I,J) = 4.0/9.0
  1412. HBWGT3(I,J) = 2.0/9.0
  1413. HBWGT4(I,J) = 2.0/9.0
  1414. END SELECT
  1415. RETURN
  1416. END SUBROUTINE SUB1H
  1417. SUBROUTINE SUB2H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, &
  1418. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1419. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1420. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1421. IMS,IME,JMS,JME,KMS,KME, &
  1422. ITS,ITE,JTS,JTE,KTS,KTE )
  1423. IMPLICIT NONE
  1424. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1425. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1426. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1427. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1428. INTEGER, INTENT(IN ) :: RATIO
  1429. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
  1430. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH
  1431. !LOCAL VARIABLES
  1432. INTEGER :: I,J
  1433. INTEGER :: IP
  1434. IP = MOD(I,RATIO)
  1435. SELECT CASE(IP)
  1436. CASE ( 1 )
  1437. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1438. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1439. HBWGT1(I,J) = 2.0/3.0
  1440. HBWGT2(I,J) = 0.0
  1441. HBWGT3(I,J) = 0.0
  1442. HBWGT4(I,J) = 1.0/3.0
  1443. CASE ( 2 )
  1444. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1445. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1446. HBWGT1(I,J) = 2.0/9.0
  1447. HBWGT2(I,J) = 2.0/9.0
  1448. HBWGT3(I,J) = 1.0/9.0
  1449. HBWGT4(I,J) = 4.0/9.0
  1450. CASE ( 0 )
  1451. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1452. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)+1
  1453. HBWGT1(I,J) = 1.0/3.0
  1454. HBWGT2(I,J) = 0.0
  1455. HBWGT3(I,J) = 2.0/3.0
  1456. HBWGT4(I,J) = 0.0
  1457. END SELECT
  1458. RETURN
  1459. END SUBROUTINE SUB2H
  1460. SUBROUTINE SUB3H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, &
  1461. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1462. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1463. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1464. IMS,IME,JMS,JME,KMS,KME, &
  1465. ITS,ITE,JTS,JTE,KTS,KTE )
  1466. IMPLICIT NONE
  1467. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1468. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1469. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1470. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1471. INTEGER, INTENT(IN ) :: RATIO
  1472. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
  1473. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH
  1474. !LOCAL VARIABLES
  1475. INTEGER :: I,J
  1476. INTEGER :: IP
  1477. IP = MOD(I,RATIO)
  1478. SELECT CASE(IP)
  1479. CASE ( 1 )
  1480. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)-1
  1481. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)+1
  1482. HBWGT1(I,J) = 2.0/9.0
  1483. HBWGT2(I,J) = 2.0/9.0
  1484. HBWGT3(I,J) = 4.0/9.0
  1485. HBWGT4(I,J) = 1.0/9.0
  1486. CASE ( 2 )
  1487. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1488. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1489. HBWGT1(I,J) = 1.0/3.0
  1490. HBWGT2(I,J) = 0.0
  1491. HBWGT3(I,J) = 0.0
  1492. HBWGT4(I,J) = 2.0/3.0
  1493. CASE ( 0 )
  1494. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1495. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)+1
  1496. HBWGT1(I,J) = 2.0/3.0
  1497. HBWGT2(I,J) = 0.0
  1498. HBWGT3(I,J) = 1.0/3.0
  1499. HBWGT4(I,J) = 0.0
  1500. END SELECT
  1501. RETURN
  1502. END SUBROUTINE SUB3H
  1503. SUBROUTINE SUB4H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, &
  1504. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1505. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1506. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1507. IMS,IME,JMS,JME,KMS,KME, &
  1508. ITS,ITE,JTS,JTE,KTS,KTE )
  1509. IMPLICIT NONE
  1510. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1511. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1512. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1513. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1514. INTEGER, INTENT(IN ) :: RATIO
  1515. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
  1516. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH
  1517. !LOCAL VARIABLES
  1518. INTEGER :: I,J
  1519. INTEGER :: IP
  1520. IP = MOD(I,RATIO)
  1521. SELECT CASE(IP)
  1522. CASE ( 1 )
  1523. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)-1
  1524. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1525. HBWGT1(I,J) = 1.0/9.0
  1526. HBWGT2(I,J) = 4.0/9.0
  1527. HBWGT3(I,J) = 2.0/9.0
  1528. HBWGT4(I,J) = 2.0/9.0
  1529. CASE ( 2 )
  1530. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1531. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1532. HBWGT1(I,J) = 1.0
  1533. HBWGT2(I,J) = 0.0
  1534. HBWGT3(I,J) = 0.0
  1535. HBWGT4(I,J) = 0.0
  1536. CASE ( 0 )
  1537. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1538. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1539. HBWGT1(I,J) = 4.0/9.0
  1540. HBWGT2(I,J) = 1.0/9.0
  1541. HBWGT3(I,J) = 2.0/9.0
  1542. HBWGT4(I,J) = 2.0/9.0
  1543. END SELECT
  1544. RETURN
  1545. END SUBROUTINE SUB4H
  1546. SUBROUTINE SUB5H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, &
  1547. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1548. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1549. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1550. IMS,IME,JMS,JME,KMS,KME, &
  1551. ITS,ITE,JTS,JTE,KTS,KTE )
  1552. IMPLICIT NONE
  1553. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1554. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1555. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1556. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1557. INTEGER, INTENT(IN ) :: RATIO
  1558. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
  1559. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH
  1560. !LOCAL VARIABLES
  1561. INTEGER :: I,J
  1562. INTEGER :: IP
  1563. IP = MOD(I,RATIO)
  1564. SELECT CASE(IP)
  1565. CASE ( 1 )
  1566. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)-1
  1567. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1568. HBWGT1(I,J) = 2.0/9.0
  1569. HBWGT2(I,J) = 2.0/9.0
  1570. HBWGT3(I,J) = 1.0/9.0
  1571. HBWGT4(I,J) = 4.0/9.0
  1572. CASE ( 2 )
  1573. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1574. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)+1
  1575. HBWGT1(I,J) = 1.0/3.0
  1576. HBWGT2(I,J) = 0.0
  1577. HBWGT3(I,J) = 2.0/3.0
  1578. HBWGT4(I,J) = 0.0
  1579. CASE ( 0 )
  1580. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1581. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1582. HBWGT1(I,J) = 2.0/3.0
  1583. HBWGT2(I,J) = 0.0
  1584. HBWGT3(I,J) = 0.0
  1585. HBWGT4(I,J) = 1.0/3.0
  1586. END SELECT
  1587. RETURN
  1588. END SUBROUTINE SUB5H
  1589. SUBROUTINE SUB6H(I,J,IIH,JJH,HBWGT1,HBWGT2,HBWGT3,HBWGT4, &
  1590. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1591. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1592. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1593. IMS,IME,JMS,JME,KMS,KME, &
  1594. ITS,ITE,JTS,JTE,KTS,KTE )
  1595. IMPLICIT NONE
  1596. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1597. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1598. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1599. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1600. INTEGER, INTENT(IN ) :: RATIO
  1601. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
  1602. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIH,JJH
  1603. !LOCAL VARIABLES
  1604. INTEGER :: I,J
  1605. INTEGER :: IP
  1606. IP = MOD(I,RATIO)
  1607. SELECT CASE(IP)
  1608. CASE ( 1 )
  1609. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1610. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1
  1611. HBWGT1(I,J) = 2.0/3.0
  1612. HBWGT2(I,J) = 0.0
  1613. HBWGT3(I,J) = 1.0/3.0
  1614. HBWGT4(I,J) = 0.0
  1615. CASE ( 2 )
  1616. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1617. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1
  1618. HBWGT1(I,J) = 2.0/9.0
  1619. HBWGT2(I,J) = 2.0/9.0
  1620. HBWGT3(I,J) = 4.0/9.0
  1621. HBWGT4(I,J) = 1.0/9.0
  1622. CASE ( 0 )
  1623. IIH(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1624. JJH(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1625. HBWGT1(I,J) = 1.0/3.0
  1626. HBWGT2(I,J) = 0.0
  1627. HBWGT3(I,J) = 0.0
  1628. HBWGT4(I,J) = 2.0/3.0
  1629. END SELECT
  1630. RETURN
  1631. END SUBROUTINE SUB6H
  1632. !-----------------------------------------------------------------------------
  1633. SUBROUTINE G2T2V_new( IIV,JJV, & ! output grid index and weights
  1634. VBWGT1,VBWGT2, & ! output weights in terms of parent grid
  1635. VBWGT3,VBWGT4, &
  1636. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1637. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1638. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1639. IMS,IME,JMS,JME,KMS,KME, &
  1640. ITS,ITE,JTS,JTE,KTS,KTE )
  1641. !
  1642. !*** XUEJIN ZHANG --- Initial version (09/08/2008)
  1643. !*** XUEJIN ZHANG --- Modified for parallel purpose (09/10/2009)
  1644. !*** XUEJIN ZHANG --- Modified for parallel purpose (09/29/2009)
  1645. !Function: Bilnear interpolation weight and indexing for E-grid
  1646. !
  1647. IMPLICIT NONE
  1648. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1649. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1650. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1651. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1652. INTEGER, INTENT(IN ) :: RATIO
  1653. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4
  1654. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV
  1655. !LOCAL VARIABLES
  1656. INTEGER :: I,J
  1657. INTEGER :: JP
  1658. !*** ARRANGEMENT OF 4 VERTEXES FROM PARENT DOMAIN
  1659. !***
  1660. !*** 4
  1661. !***
  1662. !*** v
  1663. !*** 1 2
  1664. !***
  1665. !***
  1666. !*** 3
  1667. !
  1668. !*************************************************************
  1669. !*** POINT (i,j) SPANS 9 NESTED POINTS
  1670. !*** A VERTEX IN THE NEST DOMAIN AND INDEXING FOR PARENT DOMAIN
  1671. !***
  1672. !***
  1673. !*** V
  1674. !***
  1675. !*** v h v
  1676. !*** / \
  1677. !*** v h v h v
  1678. !*** / \ / \
  1679. !*** V H v h v h V H
  1680. !*** \ / \ /
  1681. !*** v h v h v
  1682. !*** \ /
  1683. !*** v h v
  1684. !***
  1685. !*** V
  1686. !***
  1687. !***
  1688. !***
  1689. !*************************************************************
  1690. !*** MOVING NEST ALWAYS STARTING FROM MASS GRID H
  1691. !*** PLEASE REFER TO E-GRID ARRANGEMENT FIGURE FOR WIND POINTS
  1692. DO J=JTS,MIN(JTE,JDE-1)
  1693. DO I=ITS,MIN(ITE,IDE-1)
  1694. JP = MOD(J,RATIO*2)
  1695. SELECT CASE(JP)
  1696. CASE ( 1 )
  1697. CALL SUB1V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, &
  1698. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1699. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1700. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1701. IMS,IME,JMS,JME,KMS,KME, &
  1702. ITS,ITE,JTS,JTE,KTS,KTE )
  1703. CASE ( 2 )
  1704. CALL SUB2V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, &
  1705. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1706. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1707. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1708. IMS,IME,JMS,JME,KMS,KME, &
  1709. ITS,ITE,JTS,JTE,KTS,KTE )
  1710. CASE ( 3 )
  1711. CALL SUB3V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, &
  1712. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1713. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1714. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1715. IMS,IME,JMS,JME,KMS,KME, &
  1716. ITS,ITE,JTS,JTE,KTS,KTE )
  1717. CASE ( 4 )
  1718. CALL SUB4V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, &
  1719. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1720. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1721. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1722. IMS,IME,JMS,JME,KMS,KME, &
  1723. ITS,ITE,JTS,JTE,KTS,KTE )
  1724. CASE ( 5 )
  1725. CALL SUB5V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, &
  1726. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1727. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1728. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1729. IMS,IME,JMS,JME,KMS,KME, &
  1730. ITS,ITE,JTS,JTE,KTS,KTE )
  1731. CASE ( 0 )
  1732. CALL SUB6V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, &
  1733. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1734. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1735. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1736. IMS,IME,JMS,JME,KMS,KME, &
  1737. ITS,ITE,JTS,JTE,KTS,KTE )
  1738. END SELECT
  1739. ! WRITE(0,105)'NEW V WEIGHTS:',I,J,VBWGT1(I,J),VBWGT2(I,J),VBWGT3(I,J),VBWGT4(I,J), &
  1740. ! VBWGT1(I,J)+VBWGT2(I,J)+VBWGT3(I,J)+VBWGT4(I,J),IIV(i,j),JJV(i,j)
  1741. ! 105 format(a,2i4,5f7.3,2i4)
  1742. END DO
  1743. END DO
  1744. RETURN
  1745. END SUBROUTINE G2T2V_new
  1746. SUBROUTINE SUB1V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, &
  1747. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1748. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1749. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1750. IMS,IME,JMS,JME,KMS,KME, &
  1751. ITS,ITE,JTS,JTE,KTS,KTE )
  1752. IMPLICIT NONE
  1753. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1754. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1755. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1756. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1757. INTEGER, INTENT(IN ) :: RATIO
  1758. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4
  1759. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV
  1760. !LOCAL VARIABLES
  1761. INTEGER :: I,J
  1762. INTEGER :: IP
  1763. IP = MOD(I,RATIO)
  1764. SELECT CASE(IP)
  1765. CASE ( 1 )
  1766. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - 1
  1767. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1768. VBWGT1(I,J) = 1.0/9.0
  1769. VBWGT2(I,J) = 4.0/9.0
  1770. VBWGT3(I,J) = 2.0/9.0
  1771. VBWGT4(I,J) = 2.0/9.0
  1772. CASE ( 2 )
  1773. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1774. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1775. VBWGT1(I,J) = 1.0
  1776. VBWGT2(I,J) = 0.0
  1777. VBWGT3(I,J) = 0.0
  1778. VBWGT4(I,J) = 0.0
  1779. CASE ( 0 )
  1780. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1781. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1782. VBWGT1(I,J) = 4.0/9.0
  1783. VBWGT2(I,J) = 1.0/9.0
  1784. VBWGT3(I,J) = 2.0/9.0
  1785. VBWGT4(I,J) = 2.0/9.0
  1786. END SELECT
  1787. RETURN
  1788. END SUBROUTINE SUB1V
  1789. SUBROUTINE SUB2V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, &
  1790. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1791. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1792. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1793. IMS,IME,JMS,JME,KMS,KME, &
  1794. ITS,ITE,JTS,JTE,KTS,KTE )
  1795. IMPLICIT NONE
  1796. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1797. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1798. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1799. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1800. INTEGER, INTENT(IN ) :: RATIO
  1801. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4
  1802. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV
  1803. !LOCAL VARIABLES
  1804. INTEGER :: I,J
  1805. INTEGER :: IP
  1806. IP = MOD(I,RATIO)
  1807. SELECT CASE(IP)
  1808. CASE ( 1 )
  1809. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - 1
  1810. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1811. VBWGT1(I,J) = 2.0/9.0
  1812. VBWGT2(I,J) = 2.0/9.0
  1813. VBWGT3(I,J) = 1.0/9.0
  1814. VBWGT4(I,J) = 4.0/9.0
  1815. CASE ( 2 )
  1816. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1817. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1
  1818. VBWGT1(I,J) = 1.0/3.0
  1819. VBWGT2(I,J) = 0.0
  1820. VBWGT3(I,J) = 2.0/3.0
  1821. VBWGT4(I,J) = 0.0
  1822. CASE ( 0 )
  1823. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1824. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1825. VBWGT1(I,J) = 2.0/3.0
  1826. VBWGT2(I,J) = 0.0
  1827. VBWGT3(I,J) = 0.0
  1828. VBWGT4(I,J) = 1.0/3.0
  1829. END SELECT
  1830. RETURN
  1831. END SUBROUTINE SUB2V
  1832. SUBROUTINE SUB3V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, &
  1833. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1834. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1835. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1836. IMS,IME,JMS,JME,KMS,KME, &
  1837. ITS,ITE,JTS,JTE,KTS,KTE )
  1838. IMPLICIT NONE
  1839. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1840. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1841. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1842. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1843. INTEGER, INTENT(IN ) :: RATIO
  1844. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4
  1845. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV
  1846. !LOCAL VARIABLES
  1847. INTEGER :: I,J
  1848. INTEGER :: IP
  1849. IP = MOD(I,RATIO)
  1850. SELECT CASE(IP)
  1851. CASE ( 1 )
  1852. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1853. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1
  1854. VBWGT1(I,J) = 2.0/3.0
  1855. VBWGT2(I,J) = 0.0
  1856. VBWGT3(I,J) = 1.0/3.0
  1857. VBWGT4(I,J) = 0.0
  1858. CASE ( 2 )
  1859. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1860. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1
  1861. VBWGT1(I,J) = 2.0/9.0
  1862. VBWGT2(I,J) = 2.0/9.0
  1863. VBWGT3(I,J) = 4.0/9.0
  1864. VBWGT4(I,J) = 1.0/9.0
  1865. CASE ( 0 )
  1866. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1867. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1868. VBWGT1(I,J) = 1.0/3.0
  1869. VBWGT2(I,J) = 0.0
  1870. VBWGT3(I,J) = 0.0
  1871. VBWGT4(I,J) = 2.0/3.0
  1872. END SELECT
  1873. RETURN
  1874. END SUBROUTINE SUB3V
  1875. SUBROUTINE SUB4V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, &
  1876. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1877. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1878. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1879. IMS,IME,JMS,JME,KMS,KME, &
  1880. ITS,ITE,JTS,JTE,KTS,KTE )
  1881. IMPLICIT NONE
  1882. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1883. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1884. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1885. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1886. INTEGER, INTENT(IN ) :: RATIO
  1887. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4
  1888. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV
  1889. !LOCAL VARIABLES
  1890. INTEGER :: I,J
  1891. INTEGER :: IP
  1892. IP = MOD(I,RATIO)
  1893. SELECT CASE(IP)
  1894. CASE ( 1 )
  1895. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1896. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1897. VBWGT1(I,J) = 1.0
  1898. VBWGT2(I,J) = 0.0
  1899. VBWGT3(I,J) = 0.0
  1900. VBWGT4(I,J) = 0.0
  1901. CASE ( 2 )
  1902. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1903. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1904. VBWGT1(I,J) = 4.0/9.0
  1905. VBWGT2(I,J) = 1.0/9.0
  1906. VBWGT3(I,J) = 2.0/9.0
  1907. VBWGT4(I,J) = 2.0/9.0
  1908. CASE ( 0 )
  1909. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1910. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1911. VBWGT1(I,J) = 1.0/9.0
  1912. VBWGT2(I,J) = 4.0/9.0
  1913. VBWGT3(I,J) = 2.0/9.0
  1914. VBWGT4(I,J) = 2.0/9.0
  1915. END SELECT
  1916. RETURN
  1917. END SUBROUTINE SUB4V
  1918. SUBROUTINE SUB5V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, &
  1919. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1920. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1921. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1922. IMS,IME,JMS,JME,KMS,KME, &
  1923. ITS,ITE,JTS,JTE,KTS,KTE )
  1924. IMPLICIT NONE
  1925. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1926. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1927. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1928. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1929. INTEGER, INTENT(IN ) :: RATIO
  1930. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4
  1931. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV
  1932. !LOCAL VARIABLES
  1933. INTEGER :: I,J
  1934. INTEGER :: IP
  1935. IP = MOD(I,RATIO)
  1936. SELECT CASE(IP)
  1937. CASE ( 1 )
  1938. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1939. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1940. VBWGT1(I,J) = 2.0/3.0
  1941. VBWGT2(I,J) = 0.0
  1942. VBWGT3(I,J) = 0.0
  1943. VBWGT4(I,J) = 1.0/3.0
  1944. CASE ( 2 )
  1945. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1946. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1947. VBWGT1(I,J) = 2.0/9.0
  1948. VBWGT2(I,J) = 2.0/9.0
  1949. VBWGT3(I,J) = 1.0/9.0
  1950. VBWGT4(I,J) = 4.0/9.0
  1951. CASE ( 0 )
  1952. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1953. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1
  1954. VBWGT1(I,J) = 1.0/3.0
  1955. VBWGT2(I,J) = 0.0
  1956. VBWGT3(I,J) = 2.0/3.0
  1957. VBWGT4(I,J) = 0.0
  1958. END SELECT
  1959. RETURN
  1960. END SUBROUTINE SUB5V
  1961. SUBROUTINE SUB6V(I,J,IIV,JJV,VBWGT1,VBWGT2,VBWGT3,VBWGT4, &
  1962. I_PARENT_START,J_PARENT_START, & ! nest start I and J in parent domain
  1963. RATIO, & ! Ratio of parent and child grid ( always = 3 for NMM)
  1964. IDS,IDE,JDS,JDE,KDS,KDE, & ! target (nest) dimensions
  1965. IMS,IME,JMS,JME,KMS,KME, &
  1966. ITS,ITE,JTS,JTE,KTS,KTE )
  1967. IMPLICIT NONE
  1968. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  1969. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  1970. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  1971. INTEGER, INTENT(IN ) :: I_PARENT_START,J_PARENT_START
  1972. INTEGER, INTENT(IN ) :: RATIO
  1973. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4
  1974. INTEGER, DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: IIV,JJV
  1975. !LOCAL VARIABLES
  1976. INTEGER :: I,J
  1977. INTEGER :: IP
  1978. IP = MOD(I,RATIO)
  1979. SELECT CASE(IP)
  1980. CASE ( 1 )
  1981. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO) - 1
  1982. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1
  1983. VBWGT1(I,J) = 2.0/9.0
  1984. VBWGT2(I,J) = 2.0/9.0
  1985. VBWGT3(I,J) = 4.0/9.0
  1986. VBWGT4(I,J) = 1.0/9.0
  1987. CASE ( 2 )
  1988. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1989. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO)
  1990. VBWGT1(I,J) = 1.0/3.0
  1991. VBWGT2(I,J) = 0.0
  1992. VBWGT3(I,J) = 0.0
  1993. VBWGT4(I,J) = 2.0/3.0
  1994. CASE ( 0 )
  1995. IIV(I,J) = I_PARENT_START + INT((I-1)/RATIO)
  1996. JJV(I,J) = J_PARENT_START + INT((J-1)/RATIO) + 1
  1997. VBWGT1(I,J) = 2.0/3.0
  1998. VBWGT2(I,J) = 0.0
  1999. VBWGT3(I,J) = 1.0/3.0
  2000. VBWGT4(I,J) = 0.0
  2001. END SELECT
  2002. RETURN
  2003. END SUBROUTINE SUB6V
  2004. !------------------------------------------------------------------------------
  2005. !
  2006. SUBROUTINE WEIGTS_CHECK(HBWGT1,HBWGT2,HBWGT3,HBWGT4, &
  2007. VBWGT1,VBWGT2,VBWGT3,VBWGT4, &
  2008. IDS,IDE,JDS,JDE,KDS,KDE, &
  2009. IMS,IME,JMS,JME,KMS,KME, &
  2010. ITS,ITE,JTS,JTE,KTS,KTE )
  2011. IMPLICIT NONE
  2012. INTEGER, INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE, &
  2013. IMS,IME,JMS,JME,KMS,KME, &
  2014. ITS,ITE,JTS,JTE,KTS,KTE
  2015. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: HBWGT1,HBWGT2,HBWGT3,HBWGT4
  2016. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: VBWGT1,VBWGT2,VBWGT3,VBWGT4
  2017. ! local
  2018. REAL , PARAMETER :: EPSI=1.0E-3
  2019. INTEGER :: I,J
  2020. REAL :: ADDSUM
  2021. CHARACTER(LEN=255):: message
  2022. !-------------------------------------------------------------------------------------
  2023. ! DUE TO THE NEED FOR HALO EXCHANGES IN PARALLEL RUNS ONE HAS TO ENSURE CONSISTENT
  2024. ! USAGE OF NUMBER OF PROCESSORS BEFORE ANY FURTHER COMPUTATIONS. WE INTRODUCE THIS
  2025. ! CHECK FIRST
  2026. IF((ITE-ITS) .LE. 5 .OR. (JTE-JTS) .LE. 5)THEN
  2027. WRITE(message,*)'ITE-ITS=',ITE-ITS,'JTE-JTS=',JTE-JTS
  2028. CALL wrf_message(trim(message))
  2029. CALL wrf_error_fatal ('NESTED DOMAIN:PLEASE OPTIMIZE THE NUMBER OF PROCESSES; TRY SQUARES OF NUMBERS')
  2030. ENDIF
  2031. !
  2032. ! NOW CHECK WEIGHTS
  2033. !
  2034. ADDSUM=0.
  2035. DO J = JTS, MIN(JTE,JDE-1)
  2036. DO I = ITS, MIN(ITE,IDE-1)
  2037. ADDSUM=HBWGT1(I,J)+HBWGT2(I,J)+HBWGT3(I,J)+HBWGT4(I,J)
  2038. IF(ABS(1.0-ADDSUM) .GE. EPSI)THEN
  2039. WRITE(message,*)'I=',I,'J=',J,'WEIGHTS=',HBWGT1(I,J),HBWGT2(I,J),HBWGT3(I,J),HBWGT4(I,J),1-ADDSUM
  2040. CALL wrf_message(trim(message))
  2041. CALL wrf_error_fatal ('NESTED DOMAIN:SOMETHING IS WRONG WITH WEIGHTS COMPUTATION AT MASS POINTS')
  2042. ENDIF
  2043. ENDDO
  2044. ENDDO
  2045. ADDSUM=0.
  2046. DO J = JTS, MIN(JTE,JDE-1)
  2047. DO I = ITS, MIN(ITE,IDE-1)
  2048. ADDSUM=VBWGT1(I,J)+VBWGT2(I,J)+VBWGT3(I,J)+VBWGT4(I,J)
  2049. IF(ABS(1.0-ADDSUM) .GE. EPSI)THEN
  2050. WRITE(message,*)'I=',I,'J=',J,'WEIGHTS=',VBWGT1(I,J),VBWGT2(I,J),VBWGT3(I,J),VBWGT4(I,J),1-ADDSUM
  2051. CALL wrf_message(trim(message))
  2052. CALL wrf_error_fatal ('NESTED DOMAIN:SOMETHING IS WRONG WITH WEIGHTS COMPUTATION AT VELOCITY POINTS')
  2053. ENDIF
  2054. ENDDO
  2055. ENDDO
  2056. END SUBROUTINE WEIGTS_CHECK
  2057. !-----------------------------------------------------------------------------------
  2058. SUBROUTINE BOUNDS_CHECK( IIH,JJH,IIV,JJV, &
  2059. IPOS,JPOS,SHW, &
  2060. IDS,IDE,JDS,JDE,KDS,KDE, & !
  2061. IMS,IME,JMS,JME,KMS,KME, & ! nested grid configuration
  2062. ITS,ITE,JTS,JTE,KTS,KTE )
  2063. IMPLICIT NONE
  2064. INTEGER, INTENT(IN) :: IPOS,JPOS,SHW, &
  2065. IDS,IDE,JDS,JDE,KDS,KDE, &
  2066. IMS,IME,JMS,JME,KMS,KME, &
  2067. ITS,ITE,JTS,JTE,KTS,KTE
  2068. INTEGER, DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: IIH,JJH,IIV,JJV
  2069. ! local variables
  2070. INTEGER :: I,J
  2071. CHARACTER(LEN=255) :: message
  2072. !*** Gopal - Initial version
  2073. !***
  2074. !*** CHECK DOMAIN BOUNDS BEFORE PROCEEDING TO INTERPOLATION
  2075. !
  2076. !============================================================================
  2077. IF(IPOS .LE. SHW)CALL wrf_error_fatal('NESTED DOMAIN TOO CLOSE TO PARENTs X-BOUNDARY')
  2078. IF(JPOS .LE. SHW)CALL wrf_error_fatal('NESTED DOMAIN TOO CLOSE TO PARENTs Y-BOUNDARY')
  2079. DO J = JTS, MIN(JTE,JDE-1)
  2080. DO I = ITS, MIN(ITE,IDE-1)
  2081. IF(IIH(I,J) .EQ. 0)CALL wrf_error_fatal ('IIH=0: SOMETHING IS WRONG')
  2082. IF(JJH(I,J) .EQ. 0)CALL wrf_error_fatal ('JJH=0: SOMETHING IS WRONG')
  2083. ENDDO
  2084. ENDDO
  2085. DO J = JTS, MIN(JTE,JDE-1)
  2086. DO I = ITS, MIN(ITE,IDE-1)
  2087. IF(IIH(I,J) .LT. (IPOS-SHW) .OR. JJH(I,J) .LT. (JPOS-SHW) .OR. &
  2088. IIV(I,J) .LT. (IPOS-SHW) .OR. JJV(I,J) .LT. (JPOS-SHW))THEN
  2089. WRITE(message,*)I,J,IIH(I,J),IPOS,JJH(I,J),JPOS,SHW
  2090. CALL wrf_message(trim(message))
  2091. WRITE(message,*)I,J,IIV(I,J),IPOS,JJV(I,J),JPOS,SHW
  2092. CALL wrf_message(trim(message))
  2093. CALL wrf_error_fatal ('CHECK NESTED DOMAIN BOUNDS: TRY INCREASING STENCIL WIDTH')
  2094. ENDIF
  2095. ENDDO
  2096. ENDDO
  2097. END SUBROUTINE BOUNDS_CHECK
  2098. !==========================================================================================
  2099. SUBROUTINE BASE_STATE_PARENT ( Z3d,Q3d,T3d,PSTD, &
  2100. PINT,T,Q,CWM, &
  2101. FIS,QS,PD,PDTOP,PTOP, &
  2102. ETA1,ETA2, &
  2103. DETA1,DETA2, &
  2104. IDS,IDE,JDS,JDE,KDS,KDE, &
  2105. IMS,IME,JMS,JME,KMS,KME, &
  2106. ITS,ITE,JTS,JTE,KTS,KTE )
  2107. !
  2108. USE MODULE_MODEL_CONSTANTS
  2109. IMPLICIT NONE
  2110. INTEGER, INTENT(IN ) :: IDS,IDE,JDS,JDE,KDS,KDE
  2111. INTEGER, INTENT(IN ) :: IMS,IME,JMS,JME,KMS,KME
  2112. INTEGER, INTENT(IN ) :: ITS,ITE,JTS,JTE,KTS,KTE
  2113. REAL, INTENT(IN ) :: PDTOP,PTOP
  2114. REAL, DIMENSION(KMS:KME), INTENT(IN) :: ETA1,ETA2,DETA1,DETA2
  2115. REAL, DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: FIS,PD,QS
  2116. REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(IN) :: PINT,T,Q,CWM
  2117. REAL, DIMENSION(KMS:KME), INTENT(OUT):: PSTD
  2118. REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME), INTENT(OUT):: Z3d,Q3d,T3d
  2119. ! local
  2120. INTEGER,PARAMETER :: JTB=134
  2121. INTEGER :: I,J,K,ILOC,JLOC
  2122. REAL, PARAMETER :: LAPSR=6.5E-3, GI=1./G,D608=0.608
  2123. REAL, PARAMETER :: COEF3=287.05*GI*LAPSR, COEF2=-1./COEF3
  2124. REAL, PARAMETER :: TRG=2.0*R_D*GI,LAPSI=1.0/LAPSR
  2125. REAL, PARAMETER :: P_REF=103000.
  2126. REAL :: A,B,APELP,RTOPP,DZ,ZMID
  2127. REAL, DIMENSION(IMS:IME,JMS:JME) :: SLP,TSFC,ZMSLP
  2128. REAL, DIMENSION(IMS:IME,JMS:JME,KMS:KME) :: Z3d_IN
  2129. REAL,DIMENSION(JTB) :: PIN,ZIN,Y2,PIO,ZOUT,DUM1,DUM2
  2130. REAL,DIMENSION(JTB) :: QIN,QOUT,TIN,TOUT
  2131. !--------------------------------------------------------------------------------------
  2132. ! CLEAN Z3D ARRAY FIRST
  2133. DO K=KDS,KDE
  2134. DO J = JTS, MIN(JTE,JDE-1)
  2135. DO I = ITS, MIN(ITE,IDE-1)
  2136. Z3d(I,J,K)=0.0
  2137. T3d(I,J,K)=0.0
  2138. Q3d(I,J,K)=0.0
  2139. ENDDO
  2140. ENDDO
  2141. ENDDO
  2142. ! DETERMINE THE HEIGHTS ON THE PARENT DOMAIN
  2143. DO J = JTS, MIN(JTE,JDE-1)
  2144. DO I = ITS, MIN(ITE,IDE-1)
  2145. Z3d_IN(I,J,1)=FIS(I,J)*GI
  2146. ENDDO
  2147. ENDDO
  2148. DO K = KDS,KDE-1
  2149. DO J = JTS, MIN(JTE,JDE-1)
  2150. DO I = ITS, MIN(ITE,IDE-1)
  2151. APELP = (PINT(I,J,K+1)+PINT(I,J,K))
  2152. ! RTOPP = TRG*T(I,J,K)*(1.0+Q(I,J,K)*P608-CWM(I,J,K))/APELP
  2153. RTOPP = TRG*T(I,J,K)*(1.0+Q(I,J,K)*P608)/APELP
  2154. DZ = RTOPP*(DETA1(K)*PDTOP+DETA2(K)*PD(I,J)) ! (RTv/P_TOT)*D(P_HYDRO)
  2155. Z3d_IN(I,J,K+1) = Z3d_IN(I,J,K) + DZ
  2156. ENDDO
  2157. ENDDO
  2158. ENDDO
  2159. ! CONSTRUCT STANDARD ISOBARIC SURFACES
  2160. DO K=KDS,KDE ! target points in model interface levels (pint)
  2161. PSTD(K) = ETA1(K)*PDTOP + ETA2(K)*(P_REF -PDTOP - PTOP) + PTOP
  2162. ENDDO
  2163. ! DETERMINE THE MSLP USE THAT TO CREATE HEIGHTS AT 1000. mb LEVEL. THESE HEIGHTS
  2164. ! MAY ONLY BE USED IN VERTICAL INTERPOLATION TO ISOBARIC SURFACES WHICH ARE LOCATED
  2165. ! BELOW GROUND LEVEL.
  2166. DO J = JTS, MIN(JTE,JDE-1)
  2167. DO I = ITS, MIN(ITE,IDE-1)
  2168. TSFC(I,J) = T(I,J,1)*(1.+D608*Q(I,J,1)) + LAPSR*(Z3d_IN(I,J,1)+Z3d_IN(I,J,2))*0.5
  2169. A = LAPSR*Z3d_IN(I,J,1)/TSFC(I,J)
  2170. SLP(I,J) = PINT(I,J,1)*(1-A)**COEF2 ! sea level pressure
  2171. B = (PSTD(1)/SLP(I,J))**COEF3
  2172. ZMSLP(I,J)= TSFC(I,J)*LAPSI*(1.0 - B) ! Height at 1000. mb level
  2173. ENDDO
  2174. ENDDO
  2175. ! INTERPOLATE Z3d_IN TO STANDARD PRESSURE INTERFACES. FOR LEVELS BELOW
  2176. ! GROUND USE ZMSLP(I,J)
  2177. DO J = JTS, MIN(JTE,JDE-1)
  2178. DO I = ITS, MIN(ITE,IDE-1)
  2179. !
  2180. ! clean local array before use of spline
  2181. PIN=0.;ZIN=0.;Y2=0;PIO=0.;ZOUT=0.;DUM1=0.;DUM2=0.
  2182. DO K=KDS,KDE ! inputs at model interfaces
  2183. PIN(K) = PINT(I,J,KDE-K+1)
  2184. ZIN(K) = Z3d_IN(I,J,KDE-K+1)
  2185. ENDDO
  2186. IF(PINT(I,J,1) .LE. PSTD(1))THEN
  2187. PIN(KDE) = PSTD(1)
  2188. ZIN(KDE) = ZMSLP(I,J)
  2189. ENDIF
  2190. !
  2191. Y2(1 )=0.
  2192. Y2(KDE)=0.
  2193. !
  2194. DO K=KDS,KDE
  2195. PIO(K)=PSTD(K)
  2196. ENDDO
  2197. !
  2198. CALL SPLINE1(I,J,JTB,KDE,PIN,ZIN,Y2,KDE,PIO,ZOUT,DUM1,DUM2) ! interpolate
  2199. !
  2200. DO K=KDS,KDE ! inputs at model interfaces
  2201. Z3d(I,J,K)=ZOUT(K)
  2202. ENDDO
  2203. ENDDO
  2204. ENDDO
  2205. !
  2206. ! INTERPOLATE TEMPERATURE ONTO THE STANDARD PRESSURE LEVELS. FOR LEVELS BELOW
  2207. ! GROUND USE A LAPSE RATE ATMOSPHERE
  2208. !
  2209. DO J = JTS, MIN(JTE,JDE-1)
  2210. DO I = ITS, MIN(ITE,IDE-1)
  2211. !
  2212. ! clean local array before use of spline or linear interpolation
  2213. !
  2214. PIN=0.;TIN=0.;Y2=0;PIO=0.;TOUT=0.;DUM1=0.;DUM2=0.
  2215. DO K=KDS+1,KDE ! inputs at model levels
  2216. PIN(K-1) = EXP((ALOG(PINT(I,J,KDE-K+1))+ALOG(PINT(I,J,KDE-K+2)))*0.5)
  2217. TIN(K-1) = T(I,J,KDE-K+1)
  2218. ENDDO
  2219. IF(PINT(I,J,1) .LE. PSTD(1))THEN
  2220. PIN(KDE-1) = EXP((ALOG(PSTD(1))+ALOG(PSTD(2)))*0.5)
  2221. ZMID = 0.5*(Z3d_IN(I,J,1)+Z3d_IN(I,J,2))
  2222. TIN(KDE-1) = T(I,J,1) + LAPSR*(ZMID-ZMSLP(I,J))
  2223. ENDIF
  2224. !
  2225. Y2(1 )=0.
  2226. Y2(KDE-1)=0.
  2227. !
  2228. DO K=KDS,KDE-1
  2229. PIO(K)=EXP((ALOG(PSTD(K))+ALOG(PSTD(K+1)))*0.5)
  2230. ENDDO
  2231. CALL SPLINE1(I,J,JTB,KDE-1,PIN,TIN,Y2,KDE-1,PIO,TOUT,DUM1,DUM2) ! interpolate
  2232. DO K=KDS,KDE-1 ! inputs at model levels
  2233. T3d(I,J,K)=TOUT(K)
  2234. ENDDO
  2235. ENDDO
  2236. ENDDO
  2237. !
  2238. ! INTERPOLATE MOISTURE ONTO THE STANDARD PRESSURE LEVELS. FOR LEVELS BELOW
  2239. ! GROUND USE THE SURFACE MOISTURE
  2240. !
  2241. DO J = JTS, MIN(JTE,JDE-1)
  2242. DO I = ITS, MIN(ITE,IDE-1)
  2243. !
  2244. ! clean local array before use of spline or linear interpolation
  2245. PIN=0.;QIN=0.;Y2=0;PIO=0.;QOUT=0.;DUM1=0.;DUM2=0.
  2246. DO K=KDS+1,KDE ! inputs at model levels
  2247. PIN(K-1) = EXP((ALOG(PINT(I,J,KDE-K+1))+ALOG(PINT(I,J,KDE-K+2)))*0.5)
  2248. QIN(K-1) = Q(I,J,KDE-K+1)
  2249. ENDDO
  2250. IF(PINT(I,J,1) .LE. PSTD(1))THEN
  2251. PIN(KDE-1) = EXP((ALOG(PSTD(1))+ALOG(PSTD(2)))*0.5)
  2252. ! QIN(KDE-1) = QS(I,J)
  2253. ENDIF
  2254. Y2(1 )=0.
  2255. Y2(KDE-1)=0.
  2256. !
  2257. DO K=KDS,KDE-1
  2258. PIO(K)=EXP((ALOG(PSTD(K))+ALOG(PSTD(K+1)))*0.5)
  2259. ENDDO
  2260. CALL SPLINE1(I,J,JTB,KDE-1,PIN,QIN,Y2,KDE-1,PIO,QOUT,DUM1,DUM2) ! interpolate
  2261. DO K=KDS,KDE-1 ! inputs at model levels
  2262. Q3d(I,J,K)=QOUT(K)
  2263. ENDDO
  2264. ENDDO
  2265. ENDDO
  2266. END SUBROUTINE BASE_STATE_PARENT
  2267. !=============================================================================
  2268. SUBROUTINE SPLINE1(I,J,JTBX,NOLD,XOLD,YOLD,Y2,NNEW,XNEW,YNEW,P,Q)
  2269. !
  2270. ! ******************************************************************
  2271. ! * *
  2272. ! * THIS IS A ONE-DIMENSIONAL CUBIC SPLINE FITTING ROUTINE *
  2273. ! * PROGRAMED FOR A SMALL SCALAR MACHINE. *
  2274. ! * *
  2275. ! * PROGRAMER Z. JANJIC *
  2276. ! * *
  2277. ! * NOLD - NUMBER OF GIVEN VALUES OF THE FUNCTION. MUST BE GE 3. *
  2278. ! * XOLD - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE *
  2279. ! * FUNCTION ARE GIVEN. MUST BE IN ASCENDING ORDER. *
  2280. ! * YOLD - THE GIVEN VALUES OF THE FUNCTION AT THE POINTS XOLD. *
  2281. ! * Y2 - THE SECOND DERIVATIVES AT THE POINTS XOLD. IF NATURAL *
  2282. ! * SPLINE IS FITTED Y2(1)=0. AND Y2(NOLD)=0. MUST BE *
  2283. ! * SPECIFIED. *
  2284. ! * NNEW - NUMBER OF VALUES OF THE FUNCTION TO BE CALCULATED. *
  2285. ! * XNEW - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE *
  2286. ! * FUNCTION ARE CALCULATED. XNEW(K) MUST BE GE XOLD(1) *
  2287. ! * AND LE XOLD(NOLD). *
  2288. ! * YNEW - THE VALUES OF THE FUNCTION TO BE CALCULATED. *
  2289. ! * P, Q - AUXILIARY VECTORS OF THE LENGTH NOLD-2. *
  2290. ! * *
  2291. ! ******************************************************************
  2292. !---------------------------------------------------------------------
  2293. IMPLICIT NONE
  2294. !---------------------------------------------------------------------
  2295. INTEGER,INTENT(IN) :: I,J,JTBX,NNEW,NOLD
  2296. REAL,DIMENSION(JTBX),INTENT(IN) :: XNEW,XOLD,YOLD
  2297. REAL,DIMENSION(JTBX),INTENT(INOUT) :: P,Q,Y2
  2298. REAL,DIMENSION(JTBX),INTENT(OUT) :: YNEW
  2299. !
  2300. INTEGER :: II,JJ,K,K1,K2,KOLD,NOLDM1
  2301. REAL :: AK,BK,CK,DEN,DX,DXC,DXL,DXR,DYDXL,DYDXR &
  2302. ,RDX,RTDXC,X,XK,XSQ,Y2K,Y2KP1
  2303. CHARACTER(LEN=255) :: message
  2304. !---------------------------------------------------------------------
  2305. ! debug
  2306. II=9999 !67 !35 !50 !4
  2307. JJ=9999 !31 !73 !115 !192
  2308. #if defined(EXPENSIVE_HWRF_DEBUG_STUFF)
  2309. IF(I.eq.II.and.J.eq.JJ)THEN
  2310. WRITE(message,*)'DEBUG in SPLINE1:HSO= ',xnew(1:nold)
  2311. CALL wrf_debug(1,trim(message))
  2312. DO K=1,NOLD
  2313. WRITE(message,*)'DEBUG in SPLINE1:L,ZETAI,PINTI= ' &
  2314. ,K,YOLD(K),XOLD(K)
  2315. CALL wrf_debug(1,trim(message))
  2316. ENDDO
  2317. ENDIF
  2318. #endif
  2319. !
  2320. NOLDM1=NOLD-1
  2321. !
  2322. DXL=XOLD(2)-XOLD(1)
  2323. DXR=XOLD(3)-XOLD(2)
  2324. DYDXL=(YOLD(2)-YOLD(1))/DXL
  2325. DYDXR=(YOLD(3)-YOLD(2))/DXR
  2326. RTDXC=0.5/(DXL+DXR)
  2327. !
  2328. P(1)= RTDXC*(6.*(DYDXR-DYDXL)-DXL*Y2(1))
  2329. Q(1)=-RTDXC*DXR
  2330. !
  2331. IF(NOLD.EQ.3)GO TO 150
  2332. !---------------------------------------------------------------------
  2333. K=3
  2334. !
  2335. 100 DXL=DXR
  2336. DYDXL=DYDXR
  2337. DXR=XOLD(K+1)-XOLD(K)
  2338. DYDXR=(YOLD(K+1)-YOLD(K))/DXR
  2339. DXC=DXL+DXR
  2340. DEN=1./(DXL*Q(K-2)+DXC+DXC)
  2341. !
  2342. P(K-1)= DEN*(6.*(DYDXR-DYDXL)-DXL*P(K-2))
  2343. Q(K-1)=-DEN*DXR
  2344. !
  2345. K=K+1
  2346. IF(K.LT.NOLD)GO TO 100
  2347. !-----------------------------------------------------------------------
  2348. 150 K=NOLDM1
  2349. !
  2350. 200 Y2(K)=P(K-1)+Q(K-1)*Y2(K+1)
  2351. !
  2352. K=K-1
  2353. IF(K.GT.1)GO TO 200
  2354. !-----------------------------------------------------------------------
  2355. K1=1
  2356. !
  2357. 300 XK=XNEW(K1)
  2358. !
  2359. DO 400 K2=2,NOLD
  2360. !
  2361. IF(XOLD(K2).GT.XK)THEN
  2362. KOLD=K2-1
  2363. GO TO 450
  2364. ENDIF
  2365. !
  2366. 400 CONTINUE
  2367. !
  2368. YNEW(K1)=YOLD(NOLD)
  2369. GO TO 600
  2370. !
  2371. 450 IF(K1.EQ.1)GO TO 500
  2372. IF(K.EQ.KOLD)GO TO 550
  2373. !
  2374. 500 K=KOLD
  2375. !
  2376. Y2K=Y2(K)
  2377. Y2KP1=Y2(K+1)
  2378. DX=XOLD(K+1)-XOLD(K)
  2379. RDX=1./DX
  2380. !
  2381. AK=.1666667*RDX*(Y2KP1-Y2K)
  2382. BK=0.5*Y2K
  2383. CK=RDX*(YOLD(K+1)-YOLD(K))-.1666667*DX*(Y2KP1+Y2K+Y2K)
  2384. !
  2385. 550 X=XK-XOLD(K)
  2386. XSQ=X*X
  2387. !
  2388. YNEW(K1)=AK*XSQ*X+BK*XSQ+CK*X+YOLD(K)
  2389. ! debug
  2390. #if defined(EXPENSIVE_HWRF_DEBUG_STUFF)
  2391. if(i.eq.ii.and.j.eq.jj)then
  2392. write(message,*) 'DEBUG:: k1,xnew(k1),ynew(k1): ', k1,xnew(k1),ynew(k1)
  2393. CALL wrf_debug(1,trim(message))
  2394. endif
  2395. #endif
  2396. !
  2397. 600 K1=K1+1
  2398. IF(K1.LE.NNEW)GO TO 300
  2399. RETURN
  2400. END SUBROUTINE SPLINE1
  2401. !---------------------------------------------------------------------
  2402. SUBROUTINE NEST_TERRAIN ( nest, config_flags )
  2403. USE module_domain
  2404. USE module_configure
  2405. USE module_timing
  2406. USE module_TERRAIN
  2407. USE wrfsi_static
  2408. USE module_SMOOTH_TERRAIN
  2409. IMPLICIT NONE
  2410. TYPE(domain) , POINTER :: nest
  2411. TYPE(grid_config_rec_type) , INTENT(IN) :: config_flags
  2412. !
  2413. ! Local variables
  2414. !
  2415. LOGICAL, EXTERNAL :: wrf_dm_on_monitor
  2416. INTEGER :: ids,ide,jds,jde,kds,kde
  2417. INTEGER :: ims,ime,jms,jme,kms,kme
  2418. INTEGER :: its,ite,jts,jte,kts,kte
  2419. INTEGER :: i_parent_start, j_parent_start
  2420. INTEGER :: parent_grid_ratio
  2421. INTEGER :: n,i,j,ii,jj,nnxp,nnyp
  2422. INTEGER :: i_start,j_start,level
  2423. REAL, DIMENSION(1,1), TARGET :: nothing
  2424. REAL :: lah_nest_11, loh_nest_11
  2425. INTEGER :: im_big, jm_big, i_add
  2426. INTEGER :: im, jm
  2427. CHARACTER(LEN=6) :: nestpath
  2428. integer :: input_type
  2429. character(len=128) :: input_fname
  2430. character (len=32) :: cname
  2431. integer :: ndim
  2432. character (len=3) :: memorder
  2433. character (len=32) :: stagger
  2434. integer, dimension(3) :: domain_start, domain_end
  2435. integer :: wrftype
  2436. character (len=128), dimension(3) :: dimnames
  2437. integer :: istatus
  2438. integer :: handle
  2439. integer :: comm_1, comm_2
  2440. real, allocatable, dimension(:,:,:) :: real_domain
  2441. character (len=10), dimension(24) :: name = (/ "XLAT_M ", &
  2442. "XLONG_M ", &
  2443. "XLAT_V ", &
  2444. "XLONG_V ", &
  2445. "E ", &
  2446. "F ", &
  2447. "LANDMASK ", &
  2448. "LANDUSEF ", &
  2449. "LU_INDEX ", &
  2450. "HCNVX ", &
  2451. "HSTDV ", &
  2452. "HASYW ", &
  2453. "HASYS ", &
  2454. "HASYSW ", &
  2455. "HASYNW ", &
  2456. "HLENW ", &
  2457. "HLENS ", &
  2458. "HLENSW ", &
  2459. "HLENNW ", &
  2460. "HANIS ", &
  2461. "HSLOP ", &
  2462. "HANGL ", &
  2463. "HZMAX ", &
  2464. "HGT_M " /)
  2465. integer, parameter :: IO_BIN=1, IO_NET=2
  2466. integer :: io_form_input
  2467. integer :: itsok,iteok,jtsok,jteok
  2468. CHARACTER(LEN=512) :: message
  2469. write(message,'("Nest d",I2," entering nest_terrain")') nest%id
  2470. call wrf_debug(1,trim(message))
  2471. call START_TIMING()
  2472. write(message,*)"in NEST_TERRAIN config_flags%io_form_input = ", config_flags%io_form_input
  2473. CALL wrf_debug(2,trim(message))
  2474. write(message,*)"in NEST_TERRAIN config_flags%auxinput1_inname = ", config_flags%auxinput1_inname
  2475. CALL wrf_debug(2,trim(message))
  2476. io_form_input = config_flags%io_form_input
  2477. if (config_flags%auxinput1_inname(1:7) == "met_nmm") then
  2478. input_type = 2
  2479. else
  2480. input_type = 1
  2481. end if
  2482. !----------------------------------------------------------------------------------
  2483. IDS = nest%sd31
  2484. IDE = nest%ed31
  2485. JDS = nest%sd32
  2486. JDE = nest%ed32
  2487. KDS = nest%sd33
  2488. KDE = nest%ed33
  2489. IMS = nest%sm31
  2490. IME = nest%em31
  2491. JMS = nest%sm32
  2492. JME = nest%em32
  2493. KMS = nest%sm33
  2494. KME = nest%em33
  2495. ITS = nest%sp31
  2496. ITE = nest%ep31
  2497. JTS = nest%sp32
  2498. JTE = nest%ep32
  2499. KTS = nest%sp33
  2500. KTE = nest%ep33
  2501. i_parent_start = nest%i_parent_start
  2502. j_parent_start = nest%j_parent_start
  2503. parent_grid_ratio = nest%parent_grid_ratio
  2504. NNXP=IDE-1
  2505. NNYP=JDE-1
  2506. im = NNXP
  2507. jm = NNYP
  2508. ! Find nesting depth:
  2509. call find_ijstart_level (nest,i_start,j_start,level)
  2510. write(message,*)" nest%id =", nest%id , " i_start,j_start,level =", i_start,j_start,level
  2511. CALL wrf_debug(2,trim(message))
  2512. if ( level <= 0 ) then
  2513. CALL wrf_error_fatal('this routine NEST_TERRAIN should not be called for top-level domain')
  2514. end if
  2515. ! Monitor process stores high-resolution topography:
  2516. #ifdef DM_PARALLEL
  2517. monitor_only: IF ( wrf_dm_on_monitor() ) THEN
  2518. #endif
  2519. call wrf_debug(1,'NEST_TERRAIN MASTER PROCESS')
  2520. call MASTER(IDS,IDE,JDS,JDE)
  2521. #ifdef DM_PARALLEL
  2522. ELSE
  2523. call wrf_debug(1,'NEST_TERRAIN SLAVE PROCESS')
  2524. call SLAVE(IDS,IDE,JDS,JDE)
  2525. ENDIF monitor_only
  2526. #endif
  2527. if(config_flags%terrain_smoothing==2) then
  2528. call wrf_debug(1,'Call fast smoother (smooth_terrain)')
  2529. call smooth_terrain(nest,12,12, &
  2530. IDS,IDE,JDS,JDE,KDS,KDE, &
  2531. IMS,IME,JMS,JME,KMS,KME, &
  2532. ITS,ITE,JTS,JTE,KTS,KTE)
  2533. elseif(config_flags%terrain_smoothing==1) then
  2534. continue ! already handled this case in the call to MASTER
  2535. elseif(config_flags%terrain_smoothing==0) then
  2536. call wrf_debug(1,'Terrain smoothing is disabled.')
  2537. else
  2538. write(message,*) 'Invalid option for terrain_smoothing: ',config_flags%terrain_smoothing
  2539. call wrf_error_fatal(message)
  2540. endif
  2541. DO J = jts,jte
  2542. DO I = its,ite
  2543. #ifdef IDEAL_NMM_TC
  2544. nest%hres_fis(I,J)= 0.0 ! idealized
  2545. #else
  2546. nest%hres_fis(i,j)=9.81*nest%hres_avc(i,j)
  2547. #endif
  2548. ENDDO
  2549. ENDDO
  2550. write(message,'("Nest d",I0," nest_terrain")') nest%id
  2551. call END_TIMING(trim(message))
  2552. CONTAINS
  2553. #ifdef DM_PARALLEL
  2554. SUBROUTINE SLAVE(IDS,IDE,JDS,JDE)
  2555. IMPLICIT NONE
  2556. integer, intent(in) :: IDS,IDE,JDS,JDE
  2557. REAL, DIMENSION(1,1) :: avc_nest,lnd_nest
  2558. call wrf_debug(1,'call wrf_global_to_patch_real in nest_terrain')
  2559. call wrf_global_to_patch_real(avc_nest,nest%hres_avc,nest%domdesc,'z','xy', &
  2560. ids, ide-1, jds, jde-1, 1, 1, &
  2561. ims, ime, jms, jme, 1, 1, &
  2562. its, ite, jts, jte, 1, 1)
  2563. call wrf_global_to_patch_real(lnd_nest,nest%hres_lnd,nest%domdesc,'z','xy', &
  2564. ids, ide-1, jds, jde-1, 1, 1, &
  2565. ims, ime, jms, jme, 1, 1, &
  2566. its, ite, jts, jte, 1, 1)
  2567. call wrf_debug(1,'back from wrf_global_to_patch_real in nest_terrain')
  2568. END SUBROUTINE SLAVE
  2569. #endif
  2570. SUBROUTINE MASTER(IDS,IDE,JDS,JDE)
  2571. IMPLICIT NONE
  2572. integer, intent(in) :: IDS,IDE,JDS,JDE
  2573. REAL, DIMENSION(IDS:IDE,JDS:JDE) :: avc_nest, lnd_nest
  2574. type(nmm_terrain), pointer :: tr
  2575. nullify(tr)
  2576. avc_nest = 0.0
  2577. lnd_nest = 0.0
  2578. tr=>terrain_for(level,input_type,io_form_input)
  2579. ! select subdomain from big fine grid
  2580. i_add = mod(j_start+1,2)
  2581. DO j=1,jde
  2582. DO i=1,ide
  2583. avc_nest(i,j) = tr%avc(i_start+i-1 + mod(j+1,2)*i_add, j_start+j-1)
  2584. lnd_nest(i,j) = tr%lnd(i_start+i-1 + mod(j+1,2)*i_add, j_start+j-1)
  2585. END DO
  2586. END DO
  2587. i=1 ; j=1
  2588. lah_nest_11 = tr%lah(i_start+i-1 + mod(j+1,2)*i_add, j_start+j-1)
  2589. loh_nest_11 = tr%loh(i_start+i-1 + mod(j+1,2)*i_add, j_start+j-1)
  2590. IF(ABS(lah_nest_11-nest%HLAT(1,1)) .GE. 0.5 .OR. &
  2591. ABS(loh_nest_11-nest%HLON(1,1)) .GE. 0.5)THEN
  2592. WRITE(message,*)'SOME MATCHING TEST i_parent_start, j_parent_start',i_parent_start,j_parent_start
  2593. CALL wrf_message(trim(message))
  2594. CALL wrf_message('WRFSI LAT COMPUTED LAT')
  2595. WRITE(message,*)lah_nest_11,nest%HLAT(1,1)
  2596. CALL wrf_message(trim(message))
  2597. CALL wrf_message('WRFSI LON COMPUTED LON')
  2598. WRITE(message,*)loh_nest_11,nest%HLON(1,1)
  2599. CALL wrf_message(trim(message))
  2600. CALL wrf_message('CHECK WRFSI CONFIGURATION AND INPUT HIGH RESOLUTION TOPOGRAPHY AND/OR GRID RATIO')
  2601. #ifndef IDEAL_NMM_TC
  2602. CALL wrf_error_fatal('LATLON MISMATCH: ERROR READING static FILE FOR THE NEST')
  2603. #endif
  2604. ENDIF
  2605. if(config_flags%terrain_smoothing==1) then
  2606. call wrf_debug(1,'Call slow smoother (smdhld).')
  2607. call smdhld(ids,ide,jds,jde,avc_nest,lnd_nest,12,12)
  2608. endif
  2609. #ifdef DM_PARALLEL
  2610. call wrf_debug(1,'call wrf_global_to_patch_real in nest_terrain')
  2611. call wrf_global_to_patch_real(avc_nest,nest%hres_avc,nest%domdesc,'z','xy', &
  2612. ids, ide-1, jds, jde-1, 1, 1, &
  2613. ims, ime, jms, jme, 1, 1, &
  2614. its, ite, jts, jte, 1, 1)
  2615. call wrf_global_to_patch_real(lnd_nest,nest%hres_lnd,nest%domdesc,'z','xy', &
  2616. ids, ide-1, jds, jde-1, 1, 1, &
  2617. ims, ime, jms, jme, 1, 1, &
  2618. its, ite, jts, jte, 1, 1)
  2619. call wrf_debug(1,'back from wrf_global_to_patch_real in nest_terrain')
  2620. #endif
  2621. END SUBROUTINE MASTER
  2622. END SUBROUTINE NEST_TERRAIN
  2623. !===========================================================================================
  2624. SUBROUTINE med_init_domain_constants_nmm ( parent, nest) !, config_flags)
  2625. ! Driver layer
  2626. USE module_domain
  2627. USE module_configure
  2628. USE module_timing
  2629. IMPLICIT NONE
  2630. TYPE(domain) , POINTER :: parent, nest, grid
  2631. !
  2632. !
  2633. INTERFACE
  2634. SUBROUTINE med_initialize_nest_nmm ( grid &
  2635. !
  2636. # include <dummy_new_args.inc>
  2637. !
  2638. )
  2639. USE module_domain
  2640. USE module_configure
  2641. USE module_timing
  2642. IMPLICIT NONE
  2643. TYPE(domain) , POINTER :: grid
  2644. #include <dummy_new_decl.inc>
  2645. END SUBROUTINE med_initialize_nest_nmm
  2646. END INTERFACE
  2647. !------------------------------------------------------------------------------
  2648. ! PURPOSE:
  2649. ! - initialize some data, mainly 2D & 3D nmm arrays very similar to
  2650. ! those done in ./dyn_nmm/module_initialize_real.f
  2651. !-----------------------------------------------------------------------------
  2652. !
  2653. grid => nest
  2654. CALL med_initialize_nest_nmm( grid &
  2655. !
  2656. # include <actual_new_args.inc>
  2657. !
  2658. )
  2659. END SUBROUTINE med_init_domain_constants_nmm
  2660. SUBROUTINE med_initialize_nest_nmm( grid &
  2661. !
  2662. # include <dummy_new_args.inc>
  2663. !
  2664. )
  2665. USE module_domain
  2666. USE module_configure
  2667. USE module_timing
  2668. IMPLICIT NONE
  2669. ! Local domain indices and counters.
  2670. INTEGER :: ids, ide, jds, jde, kds, kde, &
  2671. ims, ime, jms, jme, kms, kme, &
  2672. its, ite, jts, jte, kts, kte, &
  2673. i, j, k, nnxp, nnyp
  2674. TYPE(domain) , POINTER :: grid
  2675. ! Local data
  2676. LOGICAL, EXTERNAL :: wrf_dm_on_monitor
  2677. INTEGER :: KHH,KVH,JAM,JA,IHL, IHH, L
  2678. INTEGER :: II,JJ,ISRCH,ISUM
  2679. INTEGER, ALLOCATABLE, DIMENSION(:) :: KHL2,KVL2,KHH2,KVH2,KHLA,KHHA,KVLA,KVHA
  2680. INTEGER,PARAMETER :: KNUM=SELECTED_REAL_KIND(13)
  2681. !
  2682. REAL(KIND=KNUM) :: WB,SB,DLM,DPH,TPH0,STPH0,CTPH0
  2683. REAL(KIND=KNUM) :: STPH,CTPH,TDLM,TDPH,FP,TPH,TLM,TLM0
  2684. REAL :: TPH0D,TLM0D,ANBI,TSPH,DTAD,DTCF,DT
  2685. REAL :: ACDT,CDDAMP,DXP
  2686. REAL :: WBD,SBD,WBI,SBI,EBI
  2687. REAL :: DY_NMM0
  2688. REAL :: RSNOW,SNOFAC
  2689. REAL, ALLOCATABLE, DIMENSION(:) :: DXJ,WPDARJ,CPGFUJ,CURVJ, &
  2690. FCPJ,FDIVJ,EMJ,EMTJ,FADJ, &
  2691. HDACJ,DDMPUJ,DDMPVJ
  2692. !
  2693. REAL, PARAMETER:: SALP=2.60
  2694. REAL, PARAMETER:: SNUP=0.040
  2695. REAL, PARAMETER:: W_NMM=0.08
  2696. ! REAL, PARAMETER:: COAC=0.75
  2697. REAL, PARAMETER:: CODAMP=6.4
  2698. REAL, PARAMETER:: TWOM=.00014584
  2699. REAL, PARAMETER:: CP=1004.6
  2700. REAL, PARAMETER:: DFC=1.0
  2701. REAL, PARAMETER:: DDFC=1.0
  2702. REAL, PARAMETER:: ROI=916.6
  2703. REAL, PARAMETER:: R=287.04
  2704. REAL, PARAMETER:: CI=2060.0
  2705. REAL, PARAMETER:: ROS=1500.
  2706. REAL, PARAMETER:: CS=1339.2
  2707. REAL, PARAMETER:: DS=0.050
  2708. REAL, PARAMETER:: AKS=.0000005
  2709. REAL, PARAMETER:: DZG=2.85
  2710. REAL, PARAMETER:: DI=.1000
  2711. REAL, PARAMETER:: AKI=0.000001075
  2712. REAL, PARAMETER:: DZI=2.0
  2713. REAL, PARAMETER:: THL=210.
  2714. REAL, PARAMETER:: PLQ=70000.
  2715. REAL, PARAMETER:: ERAD=6371200.
  2716. REAL, PARAMETER:: DTR=0.01745329
  2717. REAL :: COAC
  2718. CHARACTER(LEN=255) :: message
  2719. ! Definitions of dummy arguments to solve
  2720. #include <dummy_new_decl.inc>
  2721. !#define COPY_IN
  2722. !#include <scalar_derefs.inc>
  2723. #ifdef DM_PARALLEL
  2724. # include <data_calls.inc>
  2725. #endif
  2726. CALL get_ijk_from_grid ( grid , &
  2727. ids, ide, jds, jde, kds, kde, &
  2728. ims, ime, jms, jme, kms, kme, &
  2729. its, ite, jts, jte, kts, kte )
  2730. !=================================================================================
  2731. !
  2732. !
  2733. call nl_get_coac(grid%id,coac)
  2734. DT=grid%dt !float(TIME_STEP)/parent_time_step_ratio
  2735. NNXP=min(ITE,IDE-1)
  2736. NNYP=min(JTE,JDE-1)
  2737. JAM=6+2*((JDE-1)-10) ! this should be the fix instead of JAM=6+2*(NNYP-10)
  2738. WRITE(message,*)'TIME STEP ON DOMAIN',grid%id,'==',dt
  2739. CALL wrf_message(trim(message))
  2740. WRITE(message,*)'IDS,IDE ON DOMAIN',grid%id,'==',ids,ide
  2741. CALL wrf_message(trim(message))
  2742. !
  2743. ALLOCATE(KHL2(JTS:NNYP),KVL2(JTS:NNYP),KHH2(JTS:NNYP),KVH2(JTS:NNYP))
  2744. ALLOCATE(DXJ(JTS:NNYP),WPDARJ(JTS:NNYP),CPGFUJ(JTS:NNYP),CURVJ(JTS:NNYP))
  2745. ALLOCATE(FCPJ(JTS:NNYP),FDIVJ(JTS:NNYP),FADJ(JTS:NNYP))
  2746. ALLOCATE(HDACJ(JTS:NNYP),DDMPUJ(JTS:NNYP),DDMPVJ(JTS:NNYP))
  2747. ALLOCATE(KHLA(JAM),KHHA(JAM))
  2748. ALLOCATE(KVLA(JAM),KVHA(JAM))
  2749. ! INITIALIZE SOME LAND/WATER SURFACE DATA ON THE BASIS OF INPUTS: SM, XICE, WEASD,
  2750. ! INTERPOLATED FROM MOTHER (WRFSI) DOMAIN. THIS PART OF THE CODE HAS TO BE REVISITED
  2751. ! LATER ON
  2752. ! Since SM has been changed on parent domain to be 0 over sea ice it can not be used here
  2753. ! to find where sea ice is. That's why alogirthm here is slightly different than the
  2754. ! one used in module_initalize_real.f
  2755. #ifdef HWRF
  2756. !zhang's doing: added to AVOID THIS COMPUTATION IF THE NEST IS STARTED USING ANALYSIS FILE
  2757. IF(.not. grid%analysis)THEN
  2758. #endif
  2759. DO J = JTS, MIN(JTE,JDE-1)
  2760. DO I = ITS, MIN(ITE,IDE-1)
  2761. IF (grid%sm(I,J).GT.0.9) THEN ! OVER WATER SURFACE
  2762. grid%epsr(I,J)= 0.97
  2763. grid%embck(I,J)= 0.97
  2764. grid%gffc(I,J)= 0.
  2765. grid%albedo(I,J)=.06
  2766. grid%albase(I,J)=.06
  2767. ENDIF
  2768. IF (grid%sice(I,J).GT.0.9) THEN ! OVER SEA-ICE
  2769. grid%sm(I,J)=0.
  2770. grid%si(I,J)=0.
  2771. grid%gffc(I,J)=0.
  2772. grid%albedo(I,J)=.60
  2773. grid%albase(I,J)=.60
  2774. ENDIF
  2775. IF (grid%sm(I,J).LT.0.5.AND.grid%sice(I,J).LT.0.5) THEN ! OVER LAND SURFACE
  2776. grid%si(I,J)=5.0*grid%weasd(I,J)/1000. ! SNOW WATER EQ (mm) OBTAINED FROM PARENT (grid%si) IS INTERPOLATED
  2777. grid%epsr(I,J)=1.0 ! EMISSIVITY DEFINED OVER LAND IN THE NESTED DOMAIN
  2778. grid%embck(I,J)=1.0 ! EMISSIVITY DEFINED OVER LAND IN THE NESTED DOMAIN
  2779. grid%gffc(I,J)=0.0 ! just leave zero as irrelevant
  2780. grid%sno(I,J)=grid%si(I,J)*.20 ! LAND-SNOW COVER
  2781. ENDIF
  2782. ENDDO
  2783. ENDDO
  2784. #if 0
  2785. DO J = JTS, MIN(JTE,JDE-1)
  2786. DO I = ITS, MIN(ITE,IDE-1)
  2787. IF(grid%sm(I,J).GT.0.9) THEN ! OVER WATER SURFACE
  2788. !
  2789. IF (XICE(I,J) .gt. 0)THEN ! XICE: SI INPUT ON PARENT, INTERPOLATED ONTO NEST
  2790. grid%si(I,J)=1.0 ! INITIALIZE SI BASED ON XICE FROM INTERPOLATED INPUT
  2791. ENDIF
  2792. !
  2793. grid%epsr(I,J)= 0.97 ! VALID OVER SEA SURFACE
  2794. grid%embck(I,J)= 0.97 ! VALID OVER SEA SURFACE
  2795. grid%gffc(I,J)= 0.
  2796. grid%albedo(I,J)=.06
  2797. grid%albase(I,J)=.06
  2798. !
  2799. IF(grid%si (I,J) .GT. 0.)THEN ! VALID OVER SEA-ICE
  2800. grid%sm(I,J)=0.
  2801. grid%si(I,J)=0. !
  2802. grid%sice(I,J)=1.
  2803. grid%gffc(I,J)=0. ! just leave zero as irrelevant
  2804. grid%albedo(I,J)=.60 ! DEFINE grid%albedo
  2805. grid%albase(I,J)=.60
  2806. ENDIF
  2807. !
  2808. ELSE ! OVER LAND SURFACE
  2809. !
  2810. grid%si(I,J)=5.0*grid%weasd(I,J)/1000. ! SNOW WATER EQ (mm) OBTAINED FROM PARENT (grid%si) IS INTERPOLATED
  2811. grid%epsr(I,J)=1.0 ! EMISSIVITY DEFINED OVER LAND IN THE NESTED DOMAIN
  2812. grid%embck(I,J)=1.0 ! EMISSIVITY DEFINED OVER LAND IN THE NESTED DOMAIN
  2813. grid%gffc(I,J)=0.0 ! just leave zero as irrelevant
  2814. grid%sice(I,J)=0. ! SEA ICE
  2815. grid%sno(I,J)=grid%si(I,J)*.20 ! LAND-SNOW COVER
  2816. !
  2817. ENDIF
  2818. !
  2819. ENDDO
  2820. ENDDO
  2821. #endif
  2822. ! This may just be a fix and may need some Registry related changes, later on
  2823. DO J = JTS, MIN(JTE,JDE-1)
  2824. DO I = ITS, MIN(ITE,IDE-1)
  2825. grid%vegfra(I,J)=grid%vegfrc(I,J)
  2826. ENDDO
  2827. ENDDO
  2828. ! DETERMINE ALBEDO OVER LAND ON THE BASIS OF INPUTS: SM, ALBASE, MXSNAL & VEGFRA
  2829. ! INTERPOLATED FROM MOTHER (WRFSI) DOMAIN
  2830. DO J = JTS, MIN(JTE,JDE-1)
  2831. DO I = ITS, MIN(ITE,IDE-1)
  2832. IF(grid%sm(I,J).LT.0.9.AND.grid%sice(I,J).LT.0.9) THEN
  2833. !
  2834. IF ( (grid%sno(I,J) .EQ. 0.0) .OR. & ! SNOWFREE ALBEDO
  2835. (grid%albase(I,J) .GE. grid%mxsnal(I,J) ) ) THEN
  2836. grid%albedo(I,J) = grid%albase(I,J)
  2837. ELSE
  2838. IF (grid%sno(I,J) .LT. SNUP) THEN ! MODIFY ALBEDO IF SNOWCOVER:
  2839. RSNOW = grid%sno(I,J)/SNUP ! BELOW SNOWDEPTH THRESHOLD
  2840. SNOFAC = 1. - ( EXP(-SALP*RSNOW) - RSNOW*EXP(-SALP))
  2841. ELSE
  2842. SNOFAC = 1.0 ! ABOVE SNOWDEPTH THRESHOLD
  2843. ENDIF
  2844. grid%albedo(I,J) = grid%albase(I,J) &
  2845. + (1.0-grid%vegfra(I,J))*SNOFAC*(grid%mxsnal(I,J)-grid%albase(I,J))
  2846. ENDIF
  2847. !
  2848. END IF
  2849. grid%si(I,J)=5.0*grid%weasd(I,J)
  2850. grid%sno(I,J)=grid%weasd(I,J)
  2851. ! this block probably superfluous. Meant to guarantee land/sea agreement
  2852. IF (grid%sm(I,J) .gt. 0.5)THEN
  2853. grid%landmask(I,J)=0.0
  2854. ELSE
  2855. grid%landmask(I,J)=1.0
  2856. ENDIF
  2857. IF (grid%sice(I,J) .eq. 1.0) then !!!! change vegtyp and sltyp to fit seaice (desireable??)
  2858. grid%isltyp(I,J)=16
  2859. grid%ivgtyp(I,J)=24
  2860. ENDIF
  2861. ENDDO
  2862. ENDDO
  2863. ! Check land water interface
  2864. ! The write(20,*) statements below were very slow on Jet when using
  2865. ! the intel compiler (added hours to the runtime). The fix
  2866. ! suggested by Chris Harrop was to send messages to wrf_message
  2867. ! instead:
  2868. DO J = JTS, MIN(JTE,JDE-1)
  2869. DO I = ITS,MIN(ITE,IDE-1)
  2870. IF(grid%sm(I,J).GT.0.9 .AND. grid%vegfra(I,J) .NE. 0) THEN
  2871. #if defined(USE_SLOW_INTERFACE_CHECK)
  2872. WRITE(20,*)'PROBLEM AT THE LAND-WATER INTERFACE (VEGFRA):', &
  2873. I,J,grid%sm(I-1,J),grid%vegfra(I-1,j),grid%sm(I,J),grid%vegfra(I,J)
  2874. #else
  2875. WRITE(message,*)'PROBLEM AT THE LAND-WATER INTERFACE (VEGFRA):', &
  2876. I,J,grid%sm(I-1,J),grid%vegfra(I-1,j),grid%sm(I,J),grid%vegfra(I,J)
  2877. CALL wrf_message(trim(message))
  2878. #endif
  2879. ENDIF
  2880. !
  2881. #if defined(HWRF)
  2882. ! HWRF should not perform the check below because the nmm_tsk is
  2883. ! update with the correct skin temperature every timestep (on both
  2884. ! land and sea points).
  2885. #else
  2886. IF(grid%sm(I,J).GT.0.9 .AND. grid%nmm_tsk(I,J) .NE. 0) THEN
  2887. #if defined(USE_SLOW_INTERFACE_CHECK)
  2888. WRITE(20,*)'PROBLEM AT THE LAND-WATER INTERFACE (NMM_TSK):', &
  2889. I,J,grid%sm(I-1,J),grid%nmm_tsk(I-1,J),grid%sm(I,J),grid%nmm_tsk(I,J)
  2890. #else
  2891. WRITE(message,*)'PROBLEM AT THE LAND-WATER INTERFACE (NMM_TSK):', &
  2892. I,J,grid%sm(I-1,J),grid%nmm_tsk(I-1,J),grid%sm(I,J),grid%nmm_tsk(I,J)
  2893. CALL wrf_message(trim(message))
  2894. #endif
  2895. ENDIF
  2896. #endif
  2897. ENDDO
  2898. ENDDO
  2899. ! hardwire root depth for time being
  2900. grid%rtdpth=0.
  2901. grid%rtdpth(1)=0.1
  2902. grid%rtdpth(2)=0.3
  2903. grid%rtdpth(3)=0.6
  2904. ! hardwire soil depth for time being
  2905. grid%sldpth=0.
  2906. grid%sldpth(1)=0.1
  2907. grid%sldpth(2)=0.3
  2908. grid%sldpth(3)=0.6
  2909. grid%sldpth(4)=1.0
  2910. #ifdef HWRF
  2911. !zhang's doing: added to AVOID THIS COMPUTATION IF THE NEST IS STARTED USING ANALYSIS FILE
  2912. ENDIF ! <------ for analysis set to false
  2913. #endif
  2914. !----------- END OF LAND SURFACE INITIALIZATION -------------------------------------
  2915. !
  2916. DO J = JTS, MIN(JTE,JDE-1)
  2917. DO I = ITS, MIN(ITE,IDE-1)
  2918. grid%res(I,J)=1.
  2919. ENDDO
  2920. ENDDO
  2921. ! INITIALIZE 2D BOUNDARY MASKS
  2922. !! grid%hbm2:
  2923. grid%hbm2=0.
  2924. DO J = JTS, MIN(JTE,JDE-1)
  2925. DO I = ITS, MIN(ITE,IDE-1)
  2926. IF((J .GE. 3 .and. J .LE. (JDE-1)-2) .AND. &
  2927. (I .GE. 2 .and. I .LE. (IDE-1)-2+MOD(J,2))) THEN
  2928. grid%hbm2(I,J)=1.
  2929. ENDIF
  2930. ENDDO
  2931. ENDDO
  2932. !! grid%hbm3:
  2933. grid%hbm3=0.
  2934. DO J=JTS,MIN(JTE,JDE-1)
  2935. grid%ihwg(J)=mod(J+1,2)-1
  2936. IF (J .ge. 4 .and. J .le. (JDE-1)-3) THEN
  2937. IHL=(IDS+1)-grid%ihwg(J)
  2938. IHH=(IDE-1)-2
  2939. DO I=ITS,MIN(ITE,IDE-1)
  2940. IF (I .ge. IHL .and. I .le. IHH) grid%hbm3(I,J)=1.
  2941. ENDDO
  2942. ENDIF
  2943. ENDDO
  2944. !! grid%vbm2
  2945. grid%vbm2=0.
  2946. DO J=JTS,MIN(JTE,JDE-1)
  2947. DO I=ITS,MIN(ITE,IDE-1)
  2948. IF((J .ge. 3 .and. J .le. (JDE-1)-2) .AND. &
  2949. (I .ge. 2 .and. I .le. (IDE-1)-1-MOD(J,2))) THEN
  2950. grid%vbm2(I,J)=1.
  2951. ENDIF
  2952. ENDDO
  2953. ENDDO
  2954. !! grid%vbm3
  2955. grid%vbm3=0.
  2956. DO J=JTS,MIN(JTE,JDE-1)
  2957. DO I=ITS,MIN(ITE,IDE-1)
  2958. IF((J .ge. 4 .and. J .le. (JDE-1)-3) .AND. &
  2959. (I .ge. 3-MOD(J,2) .and. I .le. (IDE-1)-2)) THEN
  2960. grid%vbm3(I,J)=1.
  2961. ENDIF
  2962. ENDDO
  2963. ENDDO
  2964. TPH0D = grid%CEN_LAT
  2965. TLM0D = grid%CEN_LON
  2966. TPH0 = TPH0D*DTR
  2967. WBD = grid%WBD0 ! gopal's doing: may use Registry WBD0 now
  2968. WB = WBD*DTR
  2969. SBD = grid%SBD0 ! gopal's doing: may use Registry SBD0 now
  2970. SB = SBD*DTR
  2971. DLM = grid%dlmd*DTR ! input now from med_nest_egrid_configure
  2972. DPH = grid%dphd*DTR ! input now from med_nest_egrid_configure
  2973. TDLM = DLM+DLM
  2974. TDPH = DPH+DPH
  2975. WBI = WB+TDLM
  2976. SBI = SB+TDPH
  2977. EBI = WB+((ide-1)-2)*TDLM ! gopal's doing: check this for nested domain
  2978. ANBI = SB+((jde-1)-3)*DPH ! gopal's doing: check this for nested domain
  2979. STPH0 = SIN(TPH0)
  2980. CTPH0 = COS(TPH0)
  2981. TSPH = 3600./grid%DT
  2982. DTAD = 1.0
  2983. DTCF = 4.0
  2984. DY_NMM0= grid%dy_nmm ! ERAD*DPH; input now from med_nest_egrid_configure
  2985. ! CORIOLIS PARAMETER (There appears to be some roundoff in computing TLM & STPH and other terms,
  2986. ! in the nested domain. The problem needs to be revisited
  2987. DO J=JTS,MIN(JTE,JDE-1)
  2988. TLM0=WB-TDLM+MOD(J,2)*DLM ! remember this is a wind point
  2989. TPH =SB+float(J-1)*DPH
  2990. STPH=SIN(TPH)
  2991. CTPH=COS(TPH)
  2992. DO I=ITS,MIN(ITE,IDE-1)
  2993. TLM=TLM0 + I*TDLM
  2994. FP=TWOM*(CTPH0*STPH+STPH0*CTPH*COS(TLM))
  2995. grid%f(I,J)=0.5*grid%DT*FP
  2996. ENDDO
  2997. ENDDO
  2998. DO J=JTS,MIN(JTE,JDE-1)
  2999. KHL2(J)=(IDE-1)*(J-1)-(J-1)/2+2
  3000. KVL2(J)=(IDE-1)*(J-1)-J/2+2
  3001. KHH2(J)=(IDE-1)*J-J/2-1
  3002. KVH2(J)=(IDE-1)*J-(J+1)/2-1
  3003. ENDDO
  3004. TPH=SB-DPH
  3005. DO J=JTS,MIN(JTE,JDE-1)
  3006. TPH=SB+float(J-1)*DPH
  3007. DXP=ERAD*DLM*COS(TPH)
  3008. DXJ(J)=DXP
  3009. WPDARJ(J)=-W_NMM*((ERAD*DLM*AMIN1(COS(ANBI),COS(SBI)))**2+DY_NMM0**2)/ &
  3010. (grid%DT*32.*DXP*DY_NMM0)
  3011. CPGFUJ(J)=-grid%DT/(48.*DXP)
  3012. CURVJ(J)=.5*grid%DT*TAN(TPH)/ERAD
  3013. FCPJ(J)=grid%DT/(CP*192.*DXP*DY_NMM0)
  3014. FDIVJ(J)=1./(12.*DXP*DY_NMM0)
  3015. FADJ(J)=-grid%DT/(48.*DXP*DY_NMM0)*DTAD
  3016. ACDT=grid%DT*SQRT((ERAD*DLM*AMIN1(COS(ANBI),COS(SBI)))**2+DY_NMM0**2)
  3017. CDDAMP=CODAMP*ACDT
  3018. HDACJ(J)=COAC*ACDT/(4.*DXP*DY_NMM0)
  3019. DDMPUJ(J)=CDDAMP/DXP
  3020. DDMPVJ(J)=CDDAMP/DY_NMM0
  3021. ENDDO
  3022. ! --------------DERIVED VERTICAL GRID CONSTANTS--------------------------
  3023. WRITE(message,*)'NEW CHANGE',grid%f4d,grid%ef4t,grid%f4q
  3024. CALL wrf_message(trim(message))
  3025. DO L=KDS,KDE-1
  3026. grid%rdeta(L)=1./grid%deta(L)
  3027. grid%f4q2(L)=-.25*grid%DT*DTAD/grid%deta(L)
  3028. ENDDO
  3029. DO J=JTS,MIN(JTE,JDE-1)
  3030. DO I=ITS,MIN(ITE,IDE-1)
  3031. grid%dx_nmm(I,J)=DXJ(J)
  3032. grid%wpdar(I,J)=WPDARJ(J)*grid%hbm2(I,J)
  3033. grid%cpgfu(I,J)=CPGFUJ(J)*grid%vbm2(I,J)
  3034. grid%curv(I,J)=CURVJ(J)*grid%vbm2(I,J)
  3035. grid%fcp(I,J)=FCPJ(J)*grid%hbm2(I,J)
  3036. grid%fdiv(I,J)=FDIVJ(J)*grid%hbm2(I,J)
  3037. grid%fad(I,J)=FADJ(J)
  3038. grid%hdacv(I,J)=HDACJ(J)*grid%vbm2(I,J)
  3039. grid%hdac(I,J)=HDACJ(J)*1.25*grid%hbm2(I,J)
  3040. ENDDO
  3041. ENDDO
  3042. DO J=JTS, MIN(JTE,JDE-1)
  3043. IF (J.LE.5.OR.J.GE.(JDE-1)-4) THEN
  3044. KHH=(IDE-1)-2+MOD(J,2) ! KHH is global...loop over I that have
  3045. DO I=ITS,MIN(ITE,IDE-1)
  3046. IF (I .ge. 2 .and. I .le. KHH) THEN
  3047. grid%hdac(I,J)=grid%hdac(I,J)* DFC
  3048. ENDIF
  3049. ENDDO
  3050. ELSE
  3051. KHH=2+MOD(J,2)
  3052. DO I=ITS,MIN(ITE,IDE-1)
  3053. IF (I .ge. 2 .and. I .le. KHH) THEN
  3054. grid%hdac(I,J)=grid%hdac(I,J)* DFC
  3055. ENDIF
  3056. ENDDO
  3057. KHH=(IDE-1)-2+MOD(J,2)
  3058. DO I=ITS,MIN(ITE,IDE-1)
  3059. IF (I .ge. (IDE-1)-2 .and. I .le. KHH) THEN
  3060. grid%hdac(I,J)=grid%hdac(I,J)* DFC
  3061. ENDIF
  3062. ENDDO
  3063. ENDIF
  3064. ENDDO
  3065. DO J=JTS,min(JTE,JDE-1)
  3066. DO I=ITS,min(ITE,IDE-1)
  3067. grid%ddmpu(I,J)=DDMPUJ(J)*grid%vbm2(I,J)
  3068. grid%ddmpv(I,J)=DDMPVJ(J)*grid%vbm2(I,J)
  3069. grid%hdacv(I,J)=grid%hdacv(I,J)*grid%vbm2(I,J)
  3070. ENDDO
  3071. ENDDO
  3072. ! --------------INCREASING DIFFUSION ALONG THE BOUNDARIES----------------
  3073. DO J=JTS,MIN(JTE,JDE-1)
  3074. IF (J.LE.5.OR.J.GE.JDE-1-4) THEN
  3075. KVH=(IDE-1)-1-MOD(J,2)
  3076. DO I=ITS,MIN(ITE,IDE-1)
  3077. IF (I .ge. 2 .and. I .le. KVH) THEN
  3078. grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC
  3079. grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC
  3080. grid%hdacv(I,J)=grid%hdacv(I,J)*DFC
  3081. ENDIF
  3082. ENDDO
  3083. ELSE
  3084. KVH=3-MOD(J,2)
  3085. DO I=ITS,MIN(ITE,IDE-1)
  3086. IF (I .ge. 2 .and. I .le. KVH) THEN
  3087. grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC
  3088. grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC
  3089. grid%hdacv(I,J)=grid%hdacv(I,J)*DFC
  3090. ENDIF
  3091. ENDDO
  3092. KVH=(IDE-1)-1-MOD(J,2)
  3093. DO I=ITS,MIN(ITE,IDE-1)
  3094. IF (I .ge. IDE-1-2 .and. I .le. KVH) THEN
  3095. grid%ddmpu(I,J)=grid%ddmpu(I,J)*DDFC
  3096. grid%ddmpv(I,J)=grid%ddmpv(I,J)*DDFC
  3097. grid%hdacv(I,J)=grid%hdacv(I,J)*DFC
  3098. ENDIF
  3099. ENDDO
  3100. ENDIF
  3101. ENDDO
  3102. ! This one was left over for nested domain
  3103. DO J = JTS, MIN(JTE,JDE-1)
  3104. DO I = ITS, MIN(ITE,IDE-1)
  3105. grid%GLAT(I,J)=grid%HLAT(I,J)*DTR
  3106. grid%GLON(I,J)=grid%HLON(I,J)*DTR
  3107. ENDDO
  3108. ENDDO
  3109. !! compute EMT, EM on global domain, and only on task 0.
  3110. ! IF (wrf_dm_on_monitor()) THEN !!!! NECESSARY TO LIMIT THIS TO TASK ZERO?
  3111. ALLOCATE(EMJ(JDS:JDE-1),EMTJ(JDS:JDE-1))
  3112. DO J=JDS,JDE-1
  3113. TPH=SB+float(J-1)*DPH
  3114. DXP=ERAD*DLM*COS(TPH)
  3115. EMJ(J)= grid%DT/( 4.*DXP)*DTAD
  3116. EMTJ(J)=grid%DT/(16.*DXP)*DTAD
  3117. ENDDO
  3118. JA=0
  3119. DO 161 J=3,5
  3120. JA=JA+1
  3121. KHLA(JA)=2
  3122. KHHA(JA)=(IDE-1)-1-MOD(J+1,2)
  3123. 161 grid%emt(JA)=EMTJ(J)
  3124. DO 162 J=(JDE-1)-4,(JDE-1)-2
  3125. JA=JA+1
  3126. KHLA(JA)=2
  3127. KHHA(JA)=(IDE-1)-1-MOD(J+1,2)
  3128. 162 grid%emt(JA)=EMTJ(J)
  3129. DO 163 J=6,(JDE-1)-5
  3130. JA=JA+1
  3131. KHLA(JA)=2
  3132. KHHA(JA)=2+MOD(J,2)
  3133. 163 grid%emt(JA)=EMTJ(J)
  3134. DO 164 J=6,(JDE-1)-5
  3135. JA=JA+1
  3136. KHLA(JA)=(IDE-1)-2
  3137. KHHA(JA)=(IDE-1)-1-MOD(J+1,2)
  3138. 164 grid%emt(JA)=EMTJ(J)
  3139. ! --------------SPREADING OF UPSTREAM VELOCITY-POINT ADVECTION FACTOR----
  3140. JA=0
  3141. DO 171 J=3,5
  3142. JA=JA+1
  3143. KVLA(JA)=2
  3144. KVHA(JA)=(IDE-1)-1-MOD(J,2)
  3145. 171 grid%em(JA)=EMJ(J)
  3146. DO 172 J=(JDE-1)-4,(JDE-2)-2
  3147. JA=JA+1
  3148. KVLA(JA)=2
  3149. KVHA(JA)=(IDE-1)-1-MOD(J,2)
  3150. 172 grid%em(JA)=EMJ(J)
  3151. DO 173 J=6,(JDE-1)-5
  3152. JA=JA+1
  3153. KVLA(JA)=2
  3154. KVHA(JA)=2+MOD(J+1,2)
  3155. 173 grid%em(JA)=EMJ(J)
  3156. DO 174 J=6,(JDE-1)-5
  3157. JA=JA+1
  3158. KVLA(JA)=(IDE-1)-2
  3159. KVHA(JA)=(IDE-1)-1-MOD(J,2)
  3160. 174 grid%em(JA)=EMJ(J)
  3161. ! ENDIF ! wrf_dm_on_monitor
  3162. !! must be a better place to put this, but will eliminate "phantom"
  3163. !! wind points here (no wind point on eastern boundary of odd numbered rows)
  3164. !!
  3165. ! phantom
  3166. IF (ABS(IDE-1-ITE) .eq. 1 ) THEN ! |
  3167. CALL wrf_message('zero phantom winds') ! H [x] H V
  3168. DO K=KDS,KDE-1 !
  3169. DO J=JDS,JDE-1,2 ! V [H] V H
  3170. IF (J .ge. JTS .and. J .le. JTE) THEN !
  3171. grid%u(IDE-1,J,K)=0. ! H [x] H V
  3172. grid%v(IDE-1,J,K)=0. ! ------ ------
  3173. ENDIF ! ide-1 ide
  3174. ENDDO ! NMM/si WRF
  3175. ENDDO ! domain domain
  3176. ENDIF ! (dummy)
  3177. ! just a test for gravity waves
  3178. ! PD=62000.
  3179. ! grid%u=0.0
  3180. ! grid%v=0.0
  3181. ! T=300.
  3182. ! Q=0.0
  3183. ! Q2=0.0
  3184. ! CWM=0.0
  3185. ! FIS=0.0
  3186. ! testx
  3187. ! DO J = JTS, MIN(JTE,JDE-1)
  3188. ! DO K = KTS,KTE
  3189. ! DO I = ITS, MIN(ITE,IDE-1)
  3190. ! grid%sm(I,J)=I
  3191. ! grid%u(I,K,J)=J
  3192. ! ENDDO
  3193. ! ENDDO
  3194. ! ENDDO
  3195. !
  3196. ! deallocs
  3197. DEALLOCATE(KHL2,KVL2,KHH2,KVH2)
  3198. DEALLOCATE(DXJ,WPDARJ,CPGFUJ,CURVJ)
  3199. DEALLOCATE(FCPJ,FDIVJ,FADJ)
  3200. DEALLOCATE(HDACJ,DDMPUJ,DDMPVJ)
  3201. DEALLOCATE(KHLA,KHHA)
  3202. DEALLOCATE(KVLA,KVHA)
  3203. END SUBROUTINE med_initialize_nest_nmm
  3204. !======================================================================
  3205. !--------------------------------------------------------------------------------------
  3206. #if 0
  3207. SUBROUTINE initial_nest_pivot ( parent , nest, iloc, jloc )
  3208. !==========================================================================================
  3209. !
  3210. ! This program produces i_start and j_start for the nested domain depending on the
  3211. ! central lat-lon of the storm.
  3212. !
  3213. !==========================================================================================
  3214. USE module_domain
  3215. USE module_configure
  3216. USE module_timing
  3217. USE module_dm
  3218. IMPLICIT NONE
  3219. TYPE(domain) , POINTER :: parent , nest
  3220. INTEGER, INTENT(OUT) :: ILOC,JLOC
  3221. INTEGER :: IMS,IME,JMS,JME,KMS,KME
  3222. INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE
  3223. INTEGER :: IMS,IME,JMS,JME,KMS,KME
  3224. INTEGER :: ITS,ITE,JTS,JTE,KTS,KTE
  3225. INTEGER :: NIDE,NJDE ! nest dimension
  3226. INTEGER :: I,J,ITER,IDUM,JDUM
  3227. REAL :: ALAT,ALON,DIFF1,DIFF2,ERR
  3228. REAL :: parent_CLAT,parent_CLON,parent_SLAT,parent_SLON
  3229. REAL :: parent_WBD,parent_SBD,parent_DLMD,parent_DPHD
  3230. !========================================================================================
  3231. ! First obtain central latitude and longitude for the parent domain
  3232. CALL nl_get_cen_lat (parent%ID, parent_CLAT)
  3233. CALL nl_get_cen_lon (parent%ID, parent_CLON)
  3234. ! CALL nl_get_storm_lat (parent%ID, parent_SLAT)
  3235. ! CALL nl_get_storm_lon (parent%ID, parent_SLON)
  3236. ! Parent grid configuration, including, western and southern boundary
  3237. IDS = parent%sd31
  3238. IDE = parent%ed31
  3239. JDS = parent%sd32
  3240. JDE = parent%ed32
  3241. KDS = parent%sd33
  3242. KDE = parent%ed33
  3243. IMS = parent%sm31
  3244. IME = parent%em31
  3245. JMS = parent%sm32
  3246. JME = parent%em32
  3247. KMS = parent%sm33
  3248. KME = parent%em33
  3249. ITS = parent%sp31
  3250. ITE = parent%ep31
  3251. JTS = parent%sp32
  3252. JTE = parent%ep32
  3253. KTS = parent%sp33
  3254. KTE = parent%ep33
  3255. NIDE = nest%ed31
  3256. NJDE = nest%ed32
  3257. parent_DLMD = parent%dx ! DLMD: dlamda in degrees
  3258. parent_DPHD = parent%dy ! DPHD: dphi in degrees
  3259. parent_WBD = -(IDE-2)*parent%dx ! WBD0: in deg;factor 2 takes care of dummy last column
  3260. parent_SBD = -((JDE-1)/2)*parent%dy ! SBD0: in degrees; note that JDE-1 should be odd
  3261. ALAT = parent_SLAT - 0.5*(NJDE-2)*parent_DPHD/nest%parent_grid_ratio
  3262. ALON = parent_SLON - 1.0*(NIDE-2)*parent_DLMD/nest%parent_grid_ratio
  3263. CALL EARTH_LATLON ( parent%HLAT,parent%HLON,parent%VLAT,parent%VLON, & !output
  3264. parent_DLMD,parent_DPHD,parent_WBD,parent_SBD, & !inputs
  3265. parent_CLAT,parent_CLON, &
  3266. IDS,IDE,JDS,JDE,KDS,KDE, &
  3267. IMS,IME,JMS,JME,KMS,KME, &
  3268. ITS,ITE,JTS,JTE,KTS,KTE )
  3269. ! start iteration
  3270. ILOC=-99
  3271. JLOC=-99
  3272. ERR=0.1
  3273. ITER=1
  3274. 100 CONTINUE
  3275. DO J = JTS,min(JTE,JDE-1)
  3276. DO I = ITS,min(ITE,IDE-1)
  3277. DIFF1 = ABS(ALAT - parent%HLAT(I,J))
  3278. DIFF2 = ABS(ALON - parent%HLON(I,J))
  3279. IF(DIFF1 .LE. ERR .AND. DIFF2 .LE. ERR)THEN
  3280. ILOC=I
  3281. JLOC=J
  3282. ENDIF
  3283. ENDDO
  3284. ENDDO
  3285. CALL wrf_dm_maxval_integer ( ILOC, idum, jdum )
  3286. CALL wrf_dm_maxval_integer ( JLOC, idum, jdum )
  3287. IF(ILOC .EQ. -99 .AND. JLOC .EQ. -99)THEN
  3288. ERR=ERR+0.1
  3289. ITER=ITER+1
  3290. IF(ITER .LE. 100)GO TO 100
  3291. ENDIF
  3292. IF(ILOC .NE. -99 .AND. JLOC .NE. -99)THEN
  3293. WRITE(message,*)'NOTE: I_PARENT_START AND J_PARENT_START FOUND FOR THE NESTED DOMAIN CONFIGURATION AT ITER=',ITER
  3294. CALL wrf_message(trim(message))
  3295. WRITE(message,*)'istart=',ILOC
  3296. CALL wrf_message(trim(message))
  3297. WRITE(message,*)'jstart=',JLOC
  3298. CALL wrf_message(trim(message))
  3299. ELSE
  3300. ILOC=IDE/3
  3301. JLOC=JDE/3
  3302. !
  3303. WRITE(message,*)'WARNING: COULD NOT LOCATE I_PARENT_START AND J_PARENT_START FROM INPUT STORM INFO'
  3304. CALL wrf_message(trim(message))
  3305. WRITE(message,*)'ISTART=',IDE/3
  3306. CALL wrf_message(trim(message))
  3307. WRITE(message,*)'JSTART=',JDE/3
  3308. CALL wrf_message(trim(message))
  3309. ENDIF
  3310. RETURN
  3311. END SUBROUTINE initial_nest_pivot
  3312. !============================================================================================
  3313. #endif
  3314. LOGICAL FUNCTION cd_feedback_mask_orig( pig, ips_save, ipe_save , pjg, jps_save, jpe_save, xstag, ystag )
  3315. INTEGER, INTENT(IN) :: pig, ips_save, ipe_save , pjg, jps_save, jpe_save
  3316. LOGICAL, INTENT(IN) :: xstag, ystag
  3317. INTEGER ioff, joff
  3318. ioff = 0 ; joff = 0
  3319. IF ( xstag ) ioff = 1
  3320. IF ( ystag ) joff = 1
  3321. cd_feedback_mask_orig = ( pig .ge. ips_save+1 .and. &
  3322. pjg .ge. jps_save+1 .and. &
  3323. pig .le. ipe_save-1 +ioff .and. &
  3324. pjg .le. jpe_save-1 +joff )
  3325. END FUNCTION cd_feedback_mask_orig
  3326. LOGICAL FUNCTION cd_feedback_mask( pig, ips_save, ipe_save , pjg, jps_save, jpe_save, xstag, ystag )
  3327. INTEGER, INTENT(IN) :: pig, ips_save, ipe_save , pjg, jps_save, jpe_save
  3328. LOGICAL, INTENT(IN) :: xstag, ystag
  3329. INTEGER ioff, joff
  3330. ioff = 0 ; joff = 0
  3331. IF ( xstag ) ioff = 1
  3332. IF ( ystag ) joff = 1
  3333. cd_feedback_mask = ( pig .ge. ips_save+1 .and. &
  3334. pjg .ge. jps_save+2 .and. &
  3335. pig .le. ipe_save-1-mod(pjg-jps_save,2) .and. &
  3336. pjg .le. jpe_save-2 )
  3337. END FUNCTION cd_feedback_mask
  3338. LOGICAL FUNCTION cd_feedback_mask_v( pig, ips_save, ipe_save , pjg, jps_save, jpe_save, xstag, ystag )
  3339. INTEGER, INTENT(IN) :: pig, ips_save, ipe_save , pjg, jps_save, jpe_save
  3340. LOGICAL, INTENT(IN) :: xstag, ystag
  3341. INTEGER ioff, joff
  3342. ioff = 0 ; joff = 0
  3343. IF ( xstag ) ioff = 1
  3344. IF ( ystag ) joff = 1
  3345. cd_feedback_mask_v = ( pig .ge. ips_save+1 .and. &
  3346. pjg .ge. jps_save+2 .and. &
  3347. pig .le. ipe_save-1-mod(pjg-jps_save+1,2) .and. &
  3348. pjg .le. jpe_save-2 )
  3349. END FUNCTION cd_feedback_mask_v
  3350. !----------------------------------------------------------------------------
  3351. #else
  3352. SUBROUTINE stub_nmm_nest_stub
  3353. END SUBROUTINE stub_nmm_nest_stub
  3354. #endif
  3355. RECURSIVE SUBROUTINE find_ijstart_level ( grid, i_start, j_start, level )
  3356. ! Dusan Jovic
  3357. USE module_domain
  3358. IMPLICIT NONE
  3359. ! Input data.
  3360. TYPE(domain) :: grid
  3361. INTEGER, INTENT (OUT) :: i_start, j_start, level
  3362. INTEGER :: iadd
  3363. if (grid%parent_id == 0 ) then
  3364. i_start = 1
  3365. j_start = 1
  3366. level = 0
  3367. else
  3368. call find_ijstart_level ( grid%parents(1)%ptr, i_start, j_start, level )
  3369. if (level > 0) then
  3370. iadd = (i_start-1)*3
  3371. if ( mod(j_start,2).ne.0 .and. mod(grid%j_parent_start,2).ne.0 ) iadd = iadd - 1
  3372. if ( mod(j_start,2).eq.0 .and. mod(grid%j_parent_start,2).eq.0 ) iadd = iadd + 2
  3373. else
  3374. iadd = -mod(grid%j_parent_start,2)
  3375. end if
  3376. i_start = iadd + grid%i_parent_start*3 - 1
  3377. j_start = ( (j_start-1) + (grid%j_parent_start-1) ) * 3 + 1
  3378. level = level + 1
  3379. end if
  3380. END SUBROUTINE find_ijstart_level