merge standard release WRF/WPS V3.0.1.1 into wrffire
[wrffire.git] / wrfv2_fire / share / module_soil_pre.F
blob1f992501257af6f3c2f328e57a76eb23591a3e9c
1 #if ( ! NMM_CORE == 1 )
3 MODULE module_soil_pre
5    USE module_date_time
6    USE module_state_description
8 CONTAINS
10    SUBROUTINE adjust_for_seaice_pre ( xice , landmask , tsk , ivgtyp , vegcat , lu_index , &
11                                       xland , landusef , isltyp , soilcat , soilctop , &
12                                       soilcbot , tmn , &
13                                       seaice_threshold , &
14                                       num_veg_cat , num_soil_top_cat , num_soil_bot_cat , &
15                                       iswater , isice , &
16                                       scheme , &
17                                       ids , ide , jds , jde , kds , kde , &
18                                       ims , ime , jms , jme , kms , kme , &
19                                       its , ite , jts , jte , kts , kte )
21       IMPLICIT NONE
23       INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
24                               ims , ime , jms , jme , kms , kme , &
25                               its , ite , jts , jte , kts , kte , &
26                               iswater , isice 
27       INTEGER , INTENT(IN) :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat , scheme
29       REAL , DIMENSION(ims:ime,1:num_veg_cat,jms:jme) , INTENT(INOUT):: landusef
30       REAL , DIMENSION(ims:ime,1:num_soil_top_cat,jms:jme) , INTENT(INOUT):: soilctop
31       REAL , DIMENSION(ims:ime,1:num_soil_bot_cat,jms:jme) , INTENT(INOUT):: soilcbot
32       INTEGER , DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: isltyp , ivgtyp
33       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: landmask , xice , tsk , lu_index , &
34                                                            vegcat, xland , soilcat , tmn
35       REAL , INTENT(IN) :: seaice_threshold
37       INTEGER :: i , j , num_seaice_changes , loop
38       CHARACTER (LEN=132) :: message
39       
40       num_seaice_changes = 0
41       fix_seaice : SELECT CASE ( scheme ) 
43          CASE ( SLABSCHEME ) 
44             DO j = jts , MIN(jde-1,jte)
45                DO i = its , MIN(ide-1,ite)
46                   IF ( xice(i,j) .GT. 200.0 ) THEN
47                      xice(i,j) = 0.
48                      num_seaice_changes = num_seaice_changes + 1
49                   END IF
50                END DO
51             END DO
52             IF ( num_seaice_changes .GT. 0 ) THEN
53                WRITE ( message , FMT='(A,I6)' ) &
54                'Total pre number of sea ice locations removed (due to FLAG values) = ', &
55                num_seaice_changes
56                CALL wrf_debug ( 0 , message )  
57             END IF
58             num_seaice_changes = 0
59             DO j = jts , MIN(jde-1,jte)
60                DO i = its , MIN(ide-1,ite)
61                   IF ( ( xice(i,j) .GE. 0.5 ) .OR. &
62                        ( ( landmask(i,j) .LT. 0.5 ) .AND. ( tsk(i,j) .LT. seaice_threshold ) ) ) THEN
63                      xice(i,j) = 1.
64                      num_seaice_changes = num_seaice_changes + 1
65                      if(landmask(i,j) .LT. 0.5 )tmn(i,j) = 271.4
66                      vegcat(i,j)=isice
67                      ivgtyp(i,j)=isice
68                      lu_index(i,j)=isice
69                      landmask(i,j)=1.
70                      xland(i,j)=1.
71                      DO loop=1,num_veg_cat
72                         landusef(i,loop,j)=0.
73                      END DO
74                      landusef(i,ivgtyp(i,j),j)=1.
76                      isltyp(i,j) = 16
77                      soilcat(i,j)=isltyp(i,j)
78                      DO loop=1,num_soil_top_cat
79                         soilctop(i,loop,j)=0
80                      END DO
81                      DO loop=1,num_soil_bot_cat
82                         soilcbot(i,loop,j)=0
83                      END DO
84                      soilctop(i,isltyp(i,j),j)=1.
85                      soilcbot(i,isltyp(i,j),j)=1.
86                   END IF
87                END DO
88             END DO
89             IF ( num_seaice_changes .GT. 0 ) THEN
90                WRITE ( message , FMT='(A,I6)' ) &
91                'Total pre number of sea ice location changes (water to land) = ', num_seaice_changes
92                CALL wrf_debug ( 0 , message )  
93             END IF
95          CASE ( LSMSCHEME , RUCLSMSCHEME ) 
96             num_seaice_changes = 0
97             DO j = jts , MIN(jde-1,jte)
98                DO i = its , MIN(ide-1,ite)
99                   IF ( landmask(i,j) .GT. 0.5 ) THEN
100                      if (xice(i,j).gt.0) num_seaice_changes = num_seaice_changes + 1
101                      xice(i,j) = 0.
102                   END IF
103                END DO
104             END DO
105             IF ( num_seaice_changes .GT. 0 ) THEN
106                WRITE ( message , FMT='(A,I6)' ) &
107                'Total pre number of land location changes (seaice set to zero) = ', num_seaice_changes
108                CALL wrf_debug ( 0 , message )
109             END IF
111       END SELECT fix_seaice
113    END SUBROUTINE adjust_for_seaice_pre
115    SUBROUTINE adjust_for_seaice_post ( xice , landmask , tsk_old , tsk , ivgtyp , vegcat , lu_index , &
116                                       xland , landusef , isltyp , soilcat , soilctop , &
117                                       soilcbot , tmn , vegfra , &
118                                       tslb , smois , sh2o , &
119                                       seaice_threshold , &
120                                       num_veg_cat , num_soil_top_cat , num_soil_bot_cat , &
121                                       num_soil_layers , &
122                                       iswater , isice , &
123                                       scheme , &
124                                       ids , ide , jds , jde , kds , kde , &
125                                       ims , ime , jms , jme , kms , kme , &
126                                       its , ite , jts , jte , kts , kte )
128       IMPLICIT NONE
130       INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
131                               ims , ime , jms , jme , kms , kme , &
132                               its , ite , jts , jte , kts , kte , &
133                               iswater , isice 
134       INTEGER , INTENT(IN) :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat , scheme
135       INTEGER , INTENT(IN) :: num_soil_layers
137       REAL , DIMENSION(ims:ime,1:num_veg_cat,jms:jme) , INTENT(INOUT):: landusef
138       REAL , DIMENSION(ims:ime,1:num_soil_top_cat,jms:jme) , INTENT(INOUT):: soilctop
139       REAL , DIMENSION(ims:ime,1:num_soil_bot_cat,jms:jme) , INTENT(INOUT):: soilcbot
140       REAL , DIMENSION(ims:ime,1:num_soil_layers,jms:jme) , INTENT(INOUT):: tslb , smois , sh2o
141       INTEGER , DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: isltyp , ivgtyp
142       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: landmask , xice , tsk , lu_index , &
143                                                            vegcat, xland , soilcat , tmn , &
144                                                            tsk_old , vegfra
145       REAL , INTENT(IN) :: seaice_threshold
146       REAL :: total_depth , mid_point_depth
148       INTEGER :: i , j , num_seaice_changes , loop
149       CHARACTER (LEN=132) :: message
150       
151       num_seaice_changes = 0
152       fix_seaice : SELECT CASE ( scheme ) 
154          CASE ( SLABSCHEME ) 
156          CASE ( LSMSCHEME , RUCLSMSCHEME ) 
157             DO j = jts , MIN(jde-1,jte)
158                DO i = its , MIN(ide-1,ite)
159                   IF ( xice(i,j) .GT. 200.0 ) THEN
160                      xice(i,j) = 0.
161                      num_seaice_changes = num_seaice_changes + 1
162                   END IF
163                END DO
164             END DO
165             IF ( num_seaice_changes .GT. 0 ) THEN
166                WRITE ( message , FMT='(A,I6)' ) &
167                'Total post number of sea ice locations removed (due to FLAG values) = ', &
168                num_seaice_changes
169                CALL wrf_debug ( 0 , message )  
170             END IF
171             num_seaice_changes = 0
172             DO j = jts , MIN(jde-1,jte)
173                DO i = its , MIN(ide-1,ite)
174                   IF ( ( ( tsk(i,j) .LT. 170 ) .OR. ( tsk(i,j) .GT. 400 ) ) .AND. &
175                        ( ( tsk_old(i,j) .GT. 170 ) .AND. ( tsk_old(i,j) .LT. 400 ) ) )THEN
176                      tsk(i,j) = tsk_old(i,j)
177                   END IF
178                   IF ( ( ( tsk(i,j) .LT. 170 ) .OR. ( tsk(i,j) .GT. 400 ) ) .AND. &
179                        ( ( tsk_old(i,j) .LT. 170 ) .OR. ( tsk_old(i,j) .GT. 400 ) ) )THEN
180                      print *,'TSK woes in seaice post, i,j=',i,j,'  tsk = ',tsk(i,j), tsk_old(i,j)
181                      CALL wrf_error_fatal ( 'TSK is unrealistic, problems for seaice post')
182                   ELSE IF ( ( xice(i,j) .GE. 0.5 ) .OR. &
183                        ( ( landmask(i,j) .LT. 0.5 ) .AND. ( tsk(i,j) .LT. seaice_threshold ) ) ) THEN
184                      xice(i,j) = 1.
185                      num_seaice_changes = num_seaice_changes + 1
186                      if(landmask(i,j) .LT. 0.5 )tmn(i,j) = 271.4
187                      vegcat(i,j)=isice
188                      ivgtyp(i,j)=isice
189                      lu_index(i,j)=isice
190                      landmask(i,j)=1.
191                      xland(i,j)=1.
192                      vegfra(i,j)=0.
193                      DO loop=1,num_veg_cat
194                         landusef(i,loop,j)=0.
195                      END DO
196                      landusef(i,ivgtyp(i,j),j)=1.
198                      tsk_old(i,j) = tsk(i,j)
200                      isltyp(i,j) = 16
201                      soilcat(i,j)=isltyp(i,j)
202                      DO loop=1,num_soil_top_cat
203                         soilctop(i,loop,j)=0
204                      END DO
205                      DO loop=1,num_soil_bot_cat
206                         soilcbot(i,loop,j)=0
207                      END DO
208                      soilctop(i,isltyp(i,j),j)=1.
209                      soilcbot(i,isltyp(i,j),j)=1.
211                      total_depth = 3. ! ice is 3 m deep, num_soil_layers equispaced layers
212                      DO loop = 1,num_soil_layers
213                         mid_point_depth=(total_depth/num_soil_layers)/2. + &
214                                         (loop-1)*(total_depth/num_soil_layers)
215                         tslb(i,loop,j) = ( (total_depth-mid_point_depth)*tsk(i,j) + &
216                                             mid_point_depth*tmn(i,j) ) / total_depth
217                      END DO
219                      DO loop=1,num_soil_layers
220                         smois(i,loop,j) = 1.0
221                         sh2o(i,loop,j)  = 0.0
222                      END DO
223                   ELSE IF ( xice(i,j) .LT. 0.5 ) THEN
224                      xice(i,j) = 0.
225                   END IF
226                END DO
227             END DO
228             IF ( num_seaice_changes .GT. 0 ) THEN
229                WRITE ( message , FMT='(A,I6)' ) &
230                'Total post number of sea ice location changes (water to land) = ', num_seaice_changes
231                CALL wrf_debug ( 0 , message )  
232             END IF
234       END SELECT fix_seaice
236    END SUBROUTINE adjust_for_seaice_post
238    SUBROUTINE process_percent_cat_new ( landmask ,  &
239                                 landuse_frac , soil_top_cat , soil_bot_cat , &
240                                 isltyp , ivgtyp , &
241                                 num_veg_cat , num_soil_top_cat , num_soil_bot_cat , &
242                                 ids , ide , jds , jde , kds , kde , &
243                                 ims , ime , jms , jme , kms , kme , &
244                                 its , ite , jts , jte , kts , kte , &
245                                 iswater )
247       IMPLICIT NONE
249       INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
250                               ims , ime , jms , jme , kms , kme , &
251                               its , ite , jts , jte , kts , kte , &
252                               iswater
253       INTEGER , INTENT(IN) :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat
254       REAL , DIMENSION(ims:ime,1:num_veg_cat,jms:jme) , INTENT(INOUT):: landuse_frac
255       REAL , DIMENSION(ims:ime,1:num_soil_top_cat,jms:jme) , INTENT(IN):: soil_top_cat
256       REAL , DIMENSION(ims:ime,1:num_soil_bot_cat,jms:jme) , INTENT(IN):: soil_bot_cat
257       INTEGER , DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: isltyp , ivgtyp
258       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: landmask
260       INTEGER :: i , j , l , ll, dominant_index
261       REAL :: dominant_value
263 #ifdef WRF_CHEM
264 !      REAL :: lwthresh = .99
265       REAL :: lwthresh = .50
266 #else
267       REAL :: lwthresh = .50
268 #endif
270       INTEGER , PARAMETER :: iswater_soil = 14
271       INTEGER :: iforce
272       CHARACTER (LEN=132) :: message
273 integer :: change_water , change_land
274 change_water = 0 
275 change_land = 0
277       !  Sanity check on the 50/50 points
279       DO j = jts , MIN(jde-1,jte)
280          DO i = its , MIN(ide-1,ite)
281             dominant_value = landuse_frac(i,iswater,j)
282             IF ( dominant_value .EQ. lwthresh ) THEN
283                DO l = 1 , num_veg_cat
284                   IF ( l .EQ. iswater ) CYCLE
285                   IF ( ( landuse_frac(i,l,j) .EQ. lwthresh ) .AND. ( landmask(i,j) .LT. 0.5 ) ) THEN
286                      PRINT *,i,j,' water and category ',l,' both at 50%, landmask is ',landmask(i,j)
287                      landuse_frac(i,l,j) = lwthresh - .01
288                      landuse_frac(i,iswater,j) = lwthresh + 0.01
289                   ELSE IF ( ( landuse_frac(i,l,j) .EQ. lwthresh ) .AND. ( landmask(i,j) .GT. 0.5 ) ) THEN
290                      PRINT *,i,j,' water and category ',l,' both at 50%, landmask is ',landmask(i,j)
291                      landuse_frac(i,l,j) = lwthresh + .01
292                      landuse_frac(i,iswater,j) = lwthresh - 0.01
293                   END IF
294                END DO
295             END IF
296          END DO
297       END DO
299       !  Compute the dominant VEGETATION INDEX.
301       DO j = jts , MIN(jde-1,jte)
302          DO i = its , MIN(ide-1,ite)
303             dominant_value = landuse_frac(i,1,j)
304             dominant_index = 1
305             DO l = 2 , num_veg_cat
306                IF        ( l .EQ. iswater ) THEN
307                   ! wait a bit
308                ELSE IF ( ( l .NE. iswater ) .AND. ( landuse_frac(i,l,j) .GT. dominant_value ) ) THEN
309                   dominant_value = landuse_frac(i,l,j)
310                   dominant_index = l
311                END IF
312             END DO
313             IF ( landuse_frac(i,iswater,j) .GT. lwthresh ) THEN
314                dominant_value = landuse_frac(i,iswater,j)
315                dominant_index = iswater
316             ELSE IF ( ( landuse_frac(i,iswater,j) .EQ. lwthresh) .AND. &
317                       ( landmask(i,j) .LT. 0.5) .AND. &
318                       ( dominant_value .EQ. lwthresh) ) THEN
319                dominant_value = landuse_frac(i,iswater,j)
320                dominant_index = iswater
321             ELSE IF ( ( landuse_frac(i,iswater,j) .EQ. lwthresh) .AND. &
322                       ( landmask(i,j) .GT. 0.5) .AND. &
323                       ( dominant_value .EQ. lwthresh) ) THEN
324                !no op
325             ELSE IF ( ( landuse_frac(i,iswater,j) .EQ. lwthresh ) .AND. &
326                       ( dominant_value .LT. lwthresh ) ) THEN
327                dominant_value = landuse_frac(i,iswater,j)
328                dominant_index = iswater
329             END IF
330             IF      ( dominant_index .EQ. iswater ) THEN
331 if(landmask(i,j).gt.lwthresh) then
332 !print *,'changing to water at point ',i,j
333 !print '(24(i3,1x))',1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12, 13, 14, 15, 16, 17,18,19,20,21, 22, 23,24
334 !print '(24(i3,1x))',nint(landuse_frac(i,:,j)*100)
335 change_water=change_water+1
336 endif
337                landmask(i,j) = 0
338             ELSE IF ( dominant_index .NE. iswater ) THEN
339 if(landmask(i,j).lt.lwthresh) then
340 !print *,'changing to land at point ',i,j
341 !print '(24(i3,1x))',1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12, 13, 14, 15, 16, 17,18,19,20,21, 22, 23,24
342 !print '(24(i3,1x))',nint(landuse_frac(i,:,j)*100)
343 change_land=change_land+1
344 endif
345                landmask(i,j) = 1
346             END IF
347             ivgtyp(i,j) = dominant_index
348          END DO
349       END DO
351       !  Compute the dominant SOIL TEXTURE INDEX, TOP.
353       iforce = 0
354       DO i = its , MIN(ide-1,ite)
355          DO j = jts , MIN(jde-1,jte)
356             dominant_value = soil_top_cat(i,1,j)
357             dominant_index = 1
358             IF ( landmask(i,j) .GT. lwthresh ) THEN
359                DO l = 2 , num_soil_top_cat
360                   IF ( ( l .NE. iswater_soil ) .AND. ( soil_top_cat(i,l,j) .GT. dominant_value ) ) THEN
361                      dominant_value = soil_top_cat(i,l,j)
362                      dominant_index = l
363                   END IF
364                END DO
365                IF ( dominant_value .LT. 0.01 ) THEN
366                   iforce = iforce + 1
367                   WRITE ( message , FMT = '(A,I4,I4)' ) &
368                   'based on landuse, changing soil to land at point ',i,j
369                   CALL wrf_debug(1,message)
370                   WRITE ( message , FMT = '(16(i3,1x))' ) &
371                   1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12, 13, 14, 15, 16
372                   CALL wrf_debug(1,message)
373                   WRITE ( message , FMT = '(16(i3,1x))' ) &
374                   nint(soil_top_cat(i,:,j)*100)
375                   CALL wrf_debug(1,message)
376                   dominant_index = 8
377                END IF
378             ELSE
379                dominant_index = iswater_soil
380             END IF
381             isltyp(i,j) = dominant_index
382          END DO
383       END DO
385 if(iforce.ne.0)then
386 WRITE(message,FMT='(A,I4,A,I6)' ) &
387 'forcing artificial silty clay loam at ',iforce,' points, out of ',&
388 (MIN(ide-1,ite)-its+1)*(MIN(jde-1,jte)-jts+1)
389 CALL wrf_debug(0,message)
390 endif
391 print *,'LAND  CHANGE = ',change_land
392 print *,'WATER CHANGE = ',change_water
394    END SUBROUTINE process_percent_cat_new
396    SUBROUTINE process_soil_real ( tsk , tmn , &
397                                 landmask , sst , &
398                                 st_input , sm_input , sw_input , st_levels_input , sm_levels_input , sw_levels_input , &
399                                 zs , dzs , tslb , smois , sh2o , &
400                                 flag_sst , flag_soilt000, flag_soilm000, &
401                                 ids , ide , jds , jde , kds , kde , &
402                                 ims , ime , jms , jme , kms , kme , &
403                                 its , ite , jts , jte , kts , kte , &
404                                 sf_surface_physics , num_soil_layers , real_data_init_type , &
405                                 num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
406                                 num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc )
408       IMPLICIT NONE
410       INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
411                               ims , ime , jms , jme , kms , kme , &
412                               its , ite , jts , jte , kts , kte , &
413                               sf_surface_physics , num_soil_layers , real_data_init_type , &
414                               num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
415                               num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc 
417       INTEGER , INTENT(IN) :: flag_sst, flag_soilt000, flag_soilm000
419       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst
421       INTEGER , DIMENSION(1:num_st_levels_input) , INTENT(INOUT) :: st_levels_input
422       INTEGER , DIMENSION(1:num_sm_levels_input) , INTENT(INOUT) :: sm_levels_input
423       INTEGER , DIMENSION(1:num_sw_levels_input) , INTENT(INOUT) :: sw_levels_input
424       REAL , DIMENSION(ims:ime,1:num_st_levels_alloc,jms:jme) , INTENT(INOUT) :: st_input
425       REAL , DIMENSION(ims:ime,1:num_sm_levels_alloc,jms:jme) , INTENT(INOUT) :: sm_input
426       REAL , DIMENSION(ims:ime,1:num_sw_levels_alloc,jms:jme) , INTENT(INOUT) :: sw_input
428       REAL, DIMENSION(1:num_soil_layers), INTENT(OUT)  ::  zs,dzs
429       REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb , smois , sh2o
430       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tmn 
431       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tsk
433       INTEGER :: i , j , l , dominant_index , num_soil_cat , num_veg_cat
434       REAL :: dominant_value
436       !  Initialize the soil depth, and the soil temperature and moisture.
437    
438       IF      ( ( sf_surface_physics .EQ. 1 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
439          CALL init_soil_depth_1 ( zs , dzs , num_soil_layers )
440          CALL init_soil_1_real ( tsk , tmn , tslb , zs , dzs , num_soil_layers , real_data_init_type , &
441                                  landmask , sst , flag_sst , &
442                                  ids , ide , jds , jde , kds , kde , &
443                                  ims , ime , jms , jme , kms , kme , &
444                                  its , ite , jts , jte , kts , kte )
446       ELSE IF ( ( sf_surface_physics .EQ. 2 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
447          CALL init_soil_depth_2 ( zs , dzs , num_soil_layers )
448          CALL init_soil_2_real ( tsk , tmn , smois , sh2o , tslb , &
449                                  st_input , sm_input , sw_input , landmask , sst , &
450                                  zs , dzs , &
451                                  st_levels_input , sm_levels_input , sw_levels_input , &
452                                  num_soil_layers , num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
453                                  num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , &
454                                  flag_sst , flag_soilt000 , flag_soilm000 , &
455                                  ids , ide , jds , jde , kds , kde , &
456                                  ims , ime , jms , jme , kms , kme , &
457                                  its , ite , jts , jte , kts , kte )
458 !        CALL init_soil_old ( tsk , tmn , &
459 !                             smois , tslb , zs , dzs , num_soil_layers , &
460 !                             st000010_input , st010040_input , st040100_input , st100200_input , &
461 !                             st010200_input , &
462 !                             sm000010_input , sm010040_input , sm040100_input , sm100200_input , &
463 !                             sm010200_input , &
464 !                             landmask_input , sst_input , &
465 !                             ids , ide , jds , jde , kds , kde , &
466 !                             ims , ime , jms , jme , kms , kme , &
467 !                             its , ite , jts , jte , kts , kte )
468       ELSE IF ( ( sf_surface_physics .EQ. 3 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
469          CALL init_soil_depth_3 ( zs , dzs , num_soil_layers )
470          CALL init_soil_3_real ( tsk , tmn , smois , tslb , &
471                                  st_input , sm_input , landmask , sst , &
472                                  zs , dzs , &
473                                  st_levels_input , sm_levels_input , &
474                                  num_soil_layers , num_st_levels_input , num_sm_levels_input , &
475                                  num_st_levels_alloc , num_sm_levels_alloc , &
476                                  flag_sst , flag_soilt000 , flag_soilm000 , &
477                                  ids , ide , jds , jde , kds , kde , &
478                                  ims , ime , jms , jme , kms , kme , &
479                                  its , ite , jts , jte , kts , kte )
480       ELSE IF ( ( sf_surface_physics .EQ. 7 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
481          CALL init_soil_depth_7 ( zs , dzs , num_soil_layers )
482          CALL init_soil_7_real ( tsk , tmn , smois , sh2o, tslb , &
483                                  st_input , sm_input , sw_input, landmask , sst , &
484                                  zs , dzs , &
485                                  st_levels_input , sm_levels_input , sw_levels_input, &
486                                  num_soil_layers , num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
487                                  num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , &
488                                  flag_sst , flag_soilt000 , flag_soilm000 , &
489                                  ids , ide , jds , jde , kds , kde , &
490                                  ims , ime , jms , jme , kms , kme , &
491                                  its , ite , jts , jte , kts , kte )
492       END IF
494    END SUBROUTINE process_soil_real
496    SUBROUTINE process_soil_ideal ( xland,xice,vegfra,snow,canwat,  &
497                                    ivgtyp,isltyp,tslb,smois, &
498                                    tsk,tmn,zs,dzs,           &
499                                    num_soil_layers,          &
500                                    sf_surface_physics ,      &
501                                    ids,ide, jds,jde, kds,kde,&
502                                    ims,ime, jms,jme, kms,kme,&
503                                    its,ite, jts,jte, kts,kte )
505       IMPLICIT NONE
507       INTEGER, INTENT(IN) ::ids,ide, jds,jde, kds,kde,  &
508                             ims,ime, jms,jme, kms,kme,  &
509                             its,ite, jts,jte, kts,kte
510   
511       INTEGER, INTENT(IN) :: num_soil_layers , sf_surface_physics
513       REAL, DIMENSION( ims:ime, num_soil_layers, jms:jme ) , INTENT(INOUT) :: smois, tslb
515       REAL, DIMENSION(num_soil_layers), INTENT(OUT) :: dzs,zs
517       REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT) :: tsk, tmn
518       REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT) :: xland, snow, canwat, xice, vegfra
519       INTEGER, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT) :: ivgtyp, isltyp
521       !  Local variables.
523       INTEGER :: itf,jtf
525       itf=MIN(ite,ide-1)
526       jtf=MIN(jte,jde-1)
528       IF      ( ( sf_surface_physics .EQ. 1 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
529          CALL init_soil_depth_1 ( zs , dzs , num_soil_layers )
530          CALL init_soil_1_ideal(tsk,tmn,tslb,xland,                      &
531                                 ivgtyp,zs,dzs,num_soil_layers,           &
532                                 ids,ide, jds,jde, kds,kde,               &
533                                 ims,ime, jms,jme, kms,kme,               &
534                                 its,ite, jts,jte, kts,kte                )
535       ELSE IF ( ( sf_surface_physics .EQ. 2 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
536          CALL init_soil_depth_2 ( zs , dzs , num_soil_layers )
537          CALL init_soil_2_ideal ( xland,xice,vegfra,snow,canwat,         &
538                                   ivgtyp,isltyp,tslb,smois,tmn,          &
539                                   num_soil_layers,                       &
540                                   ids,ide, jds,jde, kds,kde,             &
541                                   ims,ime, jms,jme, kms,kme,             &
542                                   its,ite, jts,jte, kts,kte              )
543       ELSE IF ( ( sf_surface_physics .EQ. 3 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
544          CALL init_soil_depth_3 ( zs , dzs , num_soil_layers )
546       END IF
548    END SUBROUTINE process_soil_ideal
550    SUBROUTINE adjust_soil_temp_new ( tmn , sf_surface_physics , &
551                                  tsk , ter , toposoil , landmask , flag_toposoil , flag_tavgsfc , &
552                                       st000010 ,      st010040 ,      st040100 ,      st100200 ,      st010200 , &
553                                  flag_st000010 , flag_st010040 , flag_st040100 , flag_st100200 , flag_st010200 , & 
554                                       st000007 ,      st007028 ,      st028100 ,      st100255 , &
555                                  flag_st000007 , flag_st007028 , flag_st028100 , flag_st100255 , &
556                                       soilt000 ,      soilt005 ,      soilt020 ,      soilt040 ,      soilt160 ,      soilt300 , &
557                                  flag_soilt000 , flag_soilt005 , flag_soilt020 , flag_soilt040 , flag_soilt160 , flag_soilt300 , &
558                                  ids , ide , jds , jde , kds , kde , &
559                                  ims , ime , jms , jme , kms , kme , &
560                                  its , ite , jts , jte , kts , kte )
562       IMPLICIT NONE
563    
564       INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
565                               ims , ime , jms , jme , kms , kme , &
566                               its , ite , jts , jte , kts , kte 
568       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN)    :: ter , toposoil , landmask
569       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tmn , tsk
570       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: st000010 , st010040 , st040100 , st100200 , st010200
571       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: st000007 , st007028 , st028100 , st100255
572       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: soilt000 , soilt005 , soilt020 , soilt040 , soilt160 , soilt300
574       INTEGER , INTENT(IN) :: flag_st000010 , flag_st010040 , flag_st040100 , flag_st100200 , flag_st010200
575       INTEGER , INTENT(IN) :: flag_st000007 , flag_st007028 , flag_st028100 , flag_st100255
576       INTEGER , INTENT(IN) :: flag_soilt000 , flag_soilt005 , flag_soilt020 , flag_soilt040 , flag_soilt160 , flag_soilt300
577       INTEGER , INTENT(IN) :: sf_surface_physics , flag_toposoil , flag_tavgsfc
579       INTEGER :: i , j
581       REAL :: soil_elev_min_val ,  soil_elev_max_val , soil_elev_min_dif , soil_elev_max_dif
583       !  Adjust the annual mean temperature as if it is based on from a sea-level elevation
584       !  if the value used is from the actual annula mean data set.  If the input field to 
585       !  be used for tmn is one of the first-guess input temp fields, need to do an adjustment
586       !  only on the diff in topo from the model terrain and the first-guess terrain.
588        SELECT CASE ( sf_surface_physics )
589    
590          CASE (LSMSCHEME)
591             DO j = jts , MIN(jde-1,jte)
592                DO i = its , MIN(ide-1,ite)
593                   IF (landmask(i,j) .GT. 0.5 ) THEN
594                      tmn(i,j) = tmn(i,j) - 0.0065 * ter(i,j)
595                   END IF
596                END DO
597             END DO
599          CASE (RUCLSMSCHEME)
600             DO j = jts , MIN(jde-1,jte)
601                DO i = its , MIN(ide-1,ite)
602                   IF (landmask(i,j) .GT. 0.5 ) THEN
603                      tmn(i,j) = tmn(i,j) - 0.0065 * ter(i,j)
604                   END IF
605                END DO
606             END DO
608       END SELECT
611       !  Do we have a soil field with which to modify soil temperatures?
613       IF ( flag_toposoil .EQ. 1 ) THEN
615          DO j = jts , MIN(jde-1,jte)
616             DO i = its , MIN(ide-1,ite)
618                !  Is the toposoil field OK, or is it a subversive soil elevation field.  We can tell
619                !  usually by looking at values.  Anything less than -1000 m (lower than the Dead Sea) is
620                !  bad.  Anything larger than 10 km (taller than Everest) is toast.  Also, anything where 
621                !  the difference between the soil elevation and the terrain is greater than 3 km means
622                !  that the soil data is either all zeros or that the data are inconsistent.  Any of these
623                !  three conditions is grievous enough to induce a WRF fatality.  However, if they are at
624                !  a water point, then we can safely ignore them.
625          
626                soil_elev_min_val = toposoil(i,j) 
627                soil_elev_max_val = toposoil(i,j) 
628                soil_elev_min_dif = ter(i,j) - toposoil(i,j)
629                soil_elev_max_dif = ter(i,j) - toposoil(i,j)
630          
631                IF      ( ( soil_elev_min_val .LT. -1000 ) .AND. ( landmask(i,j) .LT. 0.5 ) ) THEN
632                   CYCLE
633                ELSE IF ( ( soil_elev_min_val .LT. -1000 ) .AND. ( landmask(i,j) .GT. 0.5 ) ) THEN
634 !print *,'no soil temperature elevation adjustment, soil height too small = ',toposoil(i,j)
635 cycle
636 !                 CALL wrf_error_fatal ( 'TOPOSOIL values have large negative values < -1000 m, unrealistic.' )
637                ENDIF
638          
639                IF      ( ( soil_elev_max_val .GT. 10000 ) .AND. ( landmask(i,j) .LT. 0.5 ) ) THEN
640                   CYCLE
641                ELSE IF ( ( soil_elev_max_val .GT. 10000 ) .AND. ( landmask(i,j) .GT. 0.5 ) ) THEN
642 print *,'no soil temperature elevation adjustment, soil height too high = ',toposoil(i,j)
643 cycle
644                   CALL wrf_error_fatal ( 'TOPOSOIL values have large positive values > 10,000 m , unrealistic.' )
645                ENDIF
646          
647                IF      ( ( ( soil_elev_min_dif .LT. -3000 ) .OR. ( soil_elev_max_dif .GT. 3000 ) ) .AND. &
648                            ( landmask(i,j) .LT. 0.5 ) ) THEN
649                   CYCLE
650                ELSE IF ( ( ( soil_elev_min_dif .LT. -3000 ) .OR. ( soil_elev_max_dif .GT. 3000 ) ) .AND. &
651                            ( landmask(i,j) .GT. 0.5 ) ) THEN
652 print *,'no soil temperature elevation adjustment, diff of soil height and terrain = ',ter(i,j) - toposoil(i,j)
653 cycle
654                   CALL wrf_error_fatal ( 'TOPOSOIL difference with terrain elevation differs by more than 3000 m, unrealistic' )
655                ENDIF
657                !  For each of the fields that we would like to modify, check to see if it came in from the SI.
658                !  If so, then use a -6.5 K/km lapse rate (based on the elevation diffs).  We only adjust when we
659                !  are not at a water point.
661                IF (landmask(i,j) .GT. 0.5 ) THEN
663                   IF ( sf_surface_physics .EQ. SLABSCHEME ) THEN
664                      IF ( ( flag_tavgsfc  .EQ. 1 ) .OR. &
665                           ( flag_st010040 .EQ. 1 ) .OR. &
666                           ( flag_st000010 .EQ. 1 ) .OR. &
667                           ( flag_soilt020 .EQ. 1 ) .OR. &
668                           ( flag_st007028 .EQ. 1 ) ) THEN
669                         tmn(i,j) = tmn(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
670                      ELSE
671                         tmn(i,j) = tmn(i,j) - 0.0065 * ter(i,j)
672                      END IF
673                   END IF 
675                   tsk(i,j) = tsk(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
676       
677                   IF ( flag_st000010 .EQ. 1 ) THEN
678                      st000010(i,j) = st000010(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
679                   END IF
680                   IF ( flag_st010040 .EQ. 1 ) THEN
681                      st010040(i,j) = st010040(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
682                   END IF
683                   IF ( flag_st040100 .EQ. 1 ) THEN
684                      st040100(i,j) = st040100(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
685                   END IF
686                   IF ( flag_st100200 .EQ. 1 ) THEN
687                      st100200(i,j) = st100200(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
688                   END IF
689                   IF ( flag_st010200 .EQ. 1 ) THEN
690                      st010200(i,j) = st010200(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
691                   END IF
693                   IF ( flag_st000007 .EQ. 1 ) THEN
694                      st000007(i,j) = st000007(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
695                   END IF
696                   IF ( flag_st007028 .EQ. 1 ) THEN
697                      st007028(i,j) = st007028(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
698                   END IF
699                   IF ( flag_st028100 .EQ. 1 ) THEN
700                      st028100(i,j) = st028100(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
701                   END IF
702                   IF ( flag_st100255 .EQ. 1 ) THEN
703                      st100255(i,j) = st100255(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
704                   END IF
705       
706                   IF ( flag_soilt000 .EQ. 1 ) THEN
707                      soilt000(i,j) = soilt000(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
708                   END IF
709                   IF ( flag_soilt005 .EQ. 1 ) THEN
710                      soilt005(i,j) = soilt005(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
711                   END IF
712                   IF ( flag_soilt020 .EQ. 1 ) THEN
713                      soilt020(i,j) = soilt020(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
714                   END IF
715                   IF ( flag_soilt040 .EQ. 1 ) THEN
716                      soilt040(i,j) = soilt040(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
717                   END IF
718                   IF ( flag_soilt160 .EQ. 1 ) THEN
719                      soilt160(i,j) = soilt160(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
720                   END IF
721                   IF ( flag_soilt300 .EQ. 1 ) THEN
722                      soilt300(i,j) = soilt300(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
723                   END IF
724    
725                END IF
726             END DO
727          END DO
729       END IF
731    END SUBROUTINE adjust_soil_temp_new
734    SUBROUTINE init_soil_depth_1 ( zs , dzs , num_soil_layers )
736       IMPLICIT NONE
737    
738       INTEGER, INTENT(IN) :: num_soil_layers
739    
740       REAL, DIMENSION(1:num_soil_layers), INTENT(OUT)  ::  zs,dzs
741    
742       INTEGER                   ::      l
744       !  Define layers (top layer = 0.01 m).  Double the thicknesses at each step (dzs values).
745       !  The distance from the ground level to the midpoint of the layer is given by zs.
747       !    -------   Ground Level   ----------      ||      ||   ||  || 
748       !                                             ||      ||   ||  || zs(1) = 0.005 m
749       !    --  --  --  --  --  --  --  --  --       ||      ||   ||  \/
750       !                                             ||      ||   ||
751       !    -----------------------------------      ||  ||  ||   \/   dzs(1) = 0.01 m
752       !                                             ||  ||  || 
753       !                                             ||  ||  || zs(2) = 0.02
754       !    --  --  --  --  --  --  --  --  --       ||  ||  \/
755       !                                             ||  ||
756       !                                             ||  ||
757       !    -----------------------------------  ||  ||  \/   dzs(2) = 0.02 m
758       !                                         ||  || 
759       !                                         ||  ||
760       !                                         ||  || 
761       !                                         ||  || zs(3) = 0.05
762       !    --  --  --  --  --  --  --  --  --   ||  \/
763       !                                         ||
764       !                                         ||
765       !                                         ||
766       !                                         ||
767       !    -----------------------------------  \/   dzs(3) = 0.04 m
769       IF ( num_soil_layers .NE. 5 ) THEN
770          PRINT '(A)','Usually, the 5-layer diffusion uses 5 layers.  Change this in the namelist.'
771          CALL wrf_error_fatal ( '5-layer_diffusion_uses_5_layers' )
772       END IF
773    
774       dzs(1)=.01
775       zs(1)=.5*dzs(1)
776    
777       DO l=2,num_soil_layers
778          dzs(l)=2*dzs(l-1)
779          zs(l)=zs(l-1)+.5*dzs(l-1)+.5*dzs(l)
780       ENDDO
782    END SUBROUTINE init_soil_depth_1
784    SUBROUTINE init_soil_depth_2 ( zs , dzs , num_soil_layers )
786       IMPLICIT NONE
787    
788       INTEGER, INTENT(IN) :: num_soil_layers
789    
790       REAL, DIMENSION(1:num_soil_layers), INTENT(OUT)  ::  zs,dzs
791    
792       INTEGER                   ::      l
794       dzs = (/ 0.1 , 0.3 , 0.6 , 1.0 /)
796       IF ( num_soil_layers .NE. 4 ) THEN
797          PRINT '(A)','Usually, the LSM uses 4 layers.  Change this in the namelist.'
798          CALL wrf_error_fatal ( 'LSM_uses_4_layers' )
799       END IF
801       zs(1)=.5*dzs(1)
802    
803       DO l=2,num_soil_layers
804          zs(l)=zs(l-1)+.5*dzs(l-1)+.5*dzs(l)
805       ENDDO
807    END SUBROUTINE init_soil_depth_2
809    SUBROUTINE init_soil_depth_3 ( zs , dzs , num_soil_layers )
811       IMPLICIT NONE
813       INTEGER, INTENT(IN) :: num_soil_layers
815       REAL, DIMENSION(1:num_soil_layers), INTENT(OUT)  ::  zs,dzs
817       INTEGER                   ::      l
819       CHARACTER (LEN=132) :: message
821 ! in RUC LSM ZS - soil levels, and DZS - soil layer thicknesses, not used
822 ! ZS is specified in the namelist: num_soil_layers = 6 or 9.
823 ! Other options with number of levels are possible, but
824 ! WRF users should change consistently the namelist entry with the
825 !    ZS array in this subroutine.
827      IF ( num_soil_layers .EQ. 6) THEN
828       zs  = (/ 0.00 , 0.05 , 0.20 , 0.40 , 1.60 , 3.00 /)
829 !      dzs = (/ 0.00 , 0.125, 0.175 , 0.70 , 1.30 , 1.40 /)
830      ELSEIF ( num_soil_layers .EQ. 9) THEN
831       zs  = (/ 0.00 , 0.05 , 0.20 , 0.40 , 0.60, 1.00, 1.60 , 2.20, 3.00 /)
832 !      dzs = (/ 0.00 , 0.125, 0.175 , 0.70 , 1.30 , 1.40 /)
833      ENDIF
835       IF ( num_soil_layers .EQ. 4 .OR. num_soil_layers .EQ. 5 ) THEN
836          write (message, FMT='(A)') 'The RUC LSM uses 6, 9 or more levels.  Change this in the namelist.'
837          CALL wrf_error_fatal ( message )
838       END IF
840    END SUBROUTINE init_soil_depth_3
842    SUBROUTINE init_soil_depth_7 ( zs , dzs , num_soil_layers )
844       IMPLICIT NONE
845    
846       INTEGER, INTENT(IN) :: num_soil_layers
847    
848       REAL, DIMENSION(1:num_soil_layers), INTENT(OUT)  ::  zs,dzs
849    
850       INTEGER                   ::      l
852       dzs = (/ 0.01 , 0.99 /)
854       IF ( num_soil_layers .NE. 2 ) THEN
855          PRINT '(A)','Usually, the PX LSM uses 2 layers.  Change this in the namelist.'
856          CALL wrf_error_fatal ( 'PXLSM_uses_2_layers' )
857       END IF
859       zs(1) = 0.5 * dzs(1)
860       zs(2) = dzs(1) + 0.5 * dzs(2)
862    END SUBROUTINE init_soil_depth_7
864    SUBROUTINE init_soil_1_real ( tsk , tmn , tslb , zs , dzs , &
865                                  num_soil_layers , real_data_init_type , &
866                                  landmask , sst , flag_sst , &
867                                  ids , ide , jds , jde , kds , kde , &
868                                  ims , ime , jms , jme , kms , kme , &
869                                  its , ite , jts , jte , kts , kte )
871       IMPLICIT NONE
873       INTEGER , INTENT(IN) :: num_soil_layers , real_data_init_type , &
874                               ids , ide , jds , jde , kds , kde , &
875                               ims , ime , jms , jme , kms , kme , &
876                               its , ite , jts , jte , kts , kte 
878       INTEGER , INTENT(IN) :: flag_sst
880       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst
881       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tsk , tmn
883       REAL , DIMENSION(num_soil_layers) :: zs , dzs
885       REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb
887       INTEGER :: i , j , l
889       !  Soil temperature is linearly interpolated between the skin temperature (taken to be at a
890       !  depth of 0.5 cm) and the deep soil, annual temperature (taken to be at a depth of 23 cm).
891       !  The tslb(i,1,j) is the skin temperature, and the tslb(i,num_soil_layers,j) level is the 
892       !  annual mean temperature.
894       DO j = jts , MIN(jde-1,jte)
895          DO i = its , MIN(ide-1,ite)
896             IF ( landmask(i,j) .GT. 0.5 ) THEN
897                DO l = 1 , num_soil_layers
898                   tslb(i,l,j)= ( tsk(i,j) * ( zs(num_soil_layers) - zs(l) )   + &
899                                  tmn(i,j) * ( zs(              l) - zs(1) ) ) / &
900                                             ( zs(num_soil_layers) - zs(1) )
901                END DO
902             ELSE
903                IF ( ( real_data_init_type .EQ. 1 ) .AND. ( flag_sst .EQ. 1 ) ) THEN
904                   DO l = 1 , num_soil_layers
905                      tslb(i,l,j)= sst(i,j)
906                   END DO
907                ELSE
908                   DO l = 1 , num_soil_layers
909                      tslb(i,l,j)= tsk(i,j)
910                   END DO
911                END IF
912             END IF
913          END DO
914       END DO
916    END SUBROUTINE init_soil_1_real
918    SUBROUTINE init_soil_1_ideal(tsk,tmn,tslb,xland,             &
919                        ivgtyp,ZS,DZS,num_soil_layers,           &
920                        ids,ide, jds,jde, kds,kde,               &
921                        ims,ime, jms,jme, kms,kme,               &
922                        its,ite, jts,jte, kts,kte                )
924       IMPLICIT NONE
925    
926       INTEGER, INTENT(IN   )    ::      ids,ide, jds,jde, kds,kde, &
927                                         ims,ime, jms,jme, kms,kme, &
928                                         its,ite, jts,jte, kts,kte
929    
930       INTEGER, INTENT(IN   )    ::      num_soil_layers
931    
932       REAL, DIMENSION( ims:ime , num_soil_layers , jms:jme ), INTENT(OUT) :: tslb
933       REAL, DIMENSION( ims:ime , jms:jme ), INTENT(OUT) :: xland
934       INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(OUT) :: ivgtyp
935    
936       REAL, DIMENSION(1:), INTENT(IN) :: dzs,zs
937    
938       REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(IN) :: tsk, tmn
940       !  Lcal variables.
941    
942       INTEGER :: l,j,i,itf,jtf
943    
944       itf=MIN(ite,ide-1)
945       jtf=MIN(jte,jde-1)
946    
947       IF (num_soil_layers.NE.1)THEN
948          DO j=jts,jtf
949             DO l=1,num_soil_layers
950                DO i=its,itf
951                  tslb(i,l,j)=( tsk(i,j)*(zs(num_soil_layers)-zs(l)) + tmn(i,j)*(zs(l)-zs(1)) ) / &
952                              ( zs(num_soil_layers)-zs(1) )
953                ENDDO
954             ENDDO
955          ENDDO
956       ENDIF
958 !     DO j=jts,jtf
959 !        DO i=its,itf
960 !          xland(i,j)  = 2
961 !          ivgtyp(i,j) = 7
962 !        ENDDO
963 !     ENDDO
965    END SUBROUTINE init_soil_1_ideal
967    SUBROUTINE init_soil_2_real ( tsk , tmn , smois , sh2o , tslb , &
968                                  st_input , sm_input , sw_input , landmask , sst , &
969                                  zs , dzs , &
970                                  st_levels_input , sm_levels_input , sw_levels_input , &
971                                  num_soil_layers , num_st_levels_input , num_sm_levels_input ,  num_sw_levels_input , &
972                                  num_st_levels_alloc , num_sm_levels_alloc ,  num_sw_levels_alloc , &
973                                  flag_sst , flag_soilt000 , flag_soilm000 , &
974                                  ids , ide , jds , jde , kds , kde , &
975                                  ims , ime , jms , jme , kms , kme , &
976                                  its , ite , jts , jte , kts , kte )
978       IMPLICIT NONE
980       INTEGER , INTENT(IN) :: num_soil_layers , &
981                               num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
982                               num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , &
983                               ids , ide , jds , jde , kds , kde , &
984                               ims , ime , jms , jme , kms , kme , &
985                               its , ite , jts , jte , kts , kte 
987       INTEGER , INTENT(IN) :: flag_sst, flag_soilt000, flag_soilm000
989       INTEGER , DIMENSION(1:num_st_levels_input) , INTENT(INOUT) :: st_levels_input
990       INTEGER , DIMENSION(1:num_sm_levels_input) , INTENT(INOUT) :: sm_levels_input
991       INTEGER , DIMENSION(1:num_sw_levels_input) , INTENT(INOUT) :: sw_levels_input
993       REAL , DIMENSION(ims:ime,1:num_st_levels_alloc,jms:jme) , INTENT(INOUT) :: st_input
994       REAL , DIMENSION(ims:ime,1:num_sm_levels_alloc,jms:jme) , INTENT(INOUT) :: sm_input
995       REAL , DIMENSION(ims:ime,1:num_sw_levels_alloc,jms:jme) , INTENT(INOUT) :: sw_input
996       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst
998       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tmn
999       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tsk
1000       REAL , DIMENSION(num_soil_layers) :: zs , dzs
1002       REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb , smois , sh2o
1004       REAL , ALLOCATABLE , DIMENSION(:) :: zhave
1006       INTEGER :: i , j , l , lout , lin , lwant , lhave , num
1007       REAL :: temp
1008       LOGICAL :: found_levels
1010       CHARACTER (LEN=132) :: message
1012       !  Are there any soil temp and moisture levels - ya know, they are mandatory.
1014       num = num_st_levels_input * num_sm_levels_input
1016       IF ( num .GE. 1 ) THEN
1018          !  Ordered levels that we have data for.
1020 !tgs add option to initialize from RUCLSM
1021          IF ( flag_soilt000 .eq. 1 ) THEN
1022            write(message, FMT='(A)') ' Assume RUC LSM 6-level input'
1023            CALL wrf_message ( message )
1024            ALLOCATE ( zhave( MAX(num_st_levels_input,num_sm_levels_input,num_sw_levels_input)  ) )
1025          ELSE
1026            write(message, FMT='(A)') ' Assume Noah LSM input'
1027            CALL wrf_message ( message )
1028          ALLOCATE ( zhave( MAX(num_st_levels_input,num_sm_levels_input,num_sw_levels_input) +2) )
1029          END IF
1032          !  Sort the levels for temperature.
1033    
1034          outert : DO lout = 1 , num_st_levels_input-1
1035             innert : DO lin = lout+1 , num_st_levels_input
1036                IF ( st_levels_input(lout) .GT. st_levels_input(lin) ) THEN
1037                   temp = st_levels_input(lout) 
1038                   st_levels_input(lout) = st_levels_input(lin)
1039                   st_levels_input(lin) = NINT(temp)
1040                   DO j = jts , MIN(jde-1,jte)
1041                      DO i = its , MIN(ide-1,ite)
1042                         temp = st_input(i,lout+1,j)
1043                         st_input(i,lout+1,j) = st_input(i,lin+1,j)
1044                         st_input(i,lin+1,j) = temp
1045                      END DO
1046                   END DO
1047                END IF
1048             END DO innert
1049          END DO outert
1050 !tgs add IF
1051       IF ( flag_soilt000 .NE. 1 ) THEN
1052          DO j = jts , MIN(jde-1,jte)
1053             DO i = its , MIN(ide-1,ite)
1054                st_input(i,1,j) = tsk(i,j)
1055                st_input(i,num_st_levels_input+2,j) = tmn(i,j)
1056             END DO
1057          END DO
1058       ENDIF
1059    
1060          !  Sort the levels for moisture.
1061    
1062          outerm: DO lout = 1 , num_sm_levels_input-1
1063             innerm : DO lin = lout+1 , num_sm_levels_input
1064                IF ( sm_levels_input(lout) .GT. sm_levels_input(lin) ) THEN
1065                   temp = sm_levels_input(lout) 
1066                   sm_levels_input(lout) = sm_levels_input(lin)
1067                   sm_levels_input(lin) = NINT(temp)
1068                   DO j = jts , MIN(jde-1,jte)
1069                      DO i = its , MIN(ide-1,ite)
1070                         temp = sm_input(i,lout+1,j)
1071                         sm_input(i,lout+1,j) = sm_input(i,lin+1,j)
1072                         sm_input(i,lin+1,j) = temp
1073                      END DO
1074                   END DO
1075                END IF
1076             END DO innerm
1077          END DO outerm
1078 !tgs add IF
1079       IF ( flag_soilm000 .NE. 1 ) THEN
1080          DO j = jts , MIN(jde-1,jte)
1081             DO i = its , MIN(ide-1,ite)
1082                sm_input(i,1,j) = sm_input(i,2,j)
1083                sm_input(i,num_sm_levels_input+2,j) = sm_input(i,num_sm_levels_input+1,j)
1084             END DO
1085          END DO
1086       ENDIF
1087    
1088          !  Sort the levels for liquid moisture.
1089    
1090          outerw: DO lout = 1 , num_sw_levels_input-1
1091             innerw : DO lin = lout+1 , num_sw_levels_input
1092                IF ( sw_levels_input(lout) .GT. sw_levels_input(lin) ) THEN
1093                   temp = sw_levels_input(lout) 
1094                   sw_levels_input(lout) = sw_levels_input(lin)
1095                   sw_levels_input(lin) = NINT(temp)
1096                   DO j = jts , MIN(jde-1,jte)
1097                      DO i = its , MIN(ide-1,ite)
1098                         temp = sw_input(i,lout+1,j)
1099                         sw_input(i,lout+1,j) = sw_input(i,lin+1,j)
1100                         sw_input(i,lin+1,j) = temp
1101                      END DO
1102                   END DO
1103                END IF
1104             END DO innerw
1105          END DO outerw
1106          IF ( num_sw_levels_input .GT. 1 ) THEN
1107             DO j = jts , MIN(jde-1,jte)
1108                DO i = its , MIN(ide-1,ite)
1109                   sw_input(i,1,j) = sw_input(i,2,j)
1110                   sw_input(i,num_sw_levels_input+2,j) = sw_input(i,num_sw_levels_input+1,j)
1111                END DO
1112             END DO
1113          END IF
1115          found_levels = .TRUE.
1117       ELSE IF ( ( num .LE. 0 ) .AND. (  start_date .NE. current_date ) ) THEN
1119          found_levels = .FALSE.
1121       ELSE
1122          CALL wrf_error_fatal ( &
1123          'No input soil level data (temperature, moisture or liquid, or all are missing). Required for LSM.' )
1124       END IF
1126       !  Is it OK to continue?
1128       IF ( found_levels ) THEN
1130          !tgs:  Here are the levels that we have from the input for temperature.
1132          IF ( flag_soilt000 .EQ. 1 ) THEN
1133             DO l = 1 , num_st_levels_input
1134                zhave(l) = st_levels_input(l) / 100.
1135             END DO
1137          !  Interpolate between the layers we have (zhave) and those that we want (zs).
1139          z_wantt : DO lwant = 1 , num_soil_layers
1140             z_havet : DO lhave = 1 , num_st_levels_input -1
1141                IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
1142                     ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
1143                   DO j = jts , MIN(jde-1,jte)
1144                      DO i = its , MIN(ide-1,ite)
1145                         tslb(i,lwant,j)= ( st_input(i,lhave,j ) * ( zhave(lhave+1) - zs   (lwant) ) + &
1146                                            st_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
1147                                                                    ( zhave(lhave+1) - zhave(lhave) )
1148                      END DO
1149                   END DO
1150                   EXIT z_havet
1151                END IF
1152             END DO z_havet
1153          END DO z_wantt
1155          ELSE
1157          !  Here are the levels that we have from the input for temperature.  The input levels plus
1158          !  two more: the skin temperature at 0 cm, and the annual mean temperature at 300 cm.
1160          zhave(1) = 0.
1161          DO l = 1 , num_st_levels_input
1162             zhave(l+1) = st_levels_input(l) / 100.
1163          END DO
1164          zhave(num_st_levels_input+2) = 300. / 100.
1165    
1166          !  Interpolate between the layers we have (zhave) and those that we want (zs).
1167    
1168          z_wantt_2: DO lwant = 1 , num_soil_layers
1169             z_havet_2 : DO lhave = 1 , num_st_levels_input +2 -1
1170                IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
1171                     ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
1172                   DO j = jts , MIN(jde-1,jte)
1173                      DO i = its , MIN(ide-1,ite)
1174                         tslb(i,lwant,j)= ( st_input(i,lhave  ,j) * ( zhave(lhave+1) - zs   (lwant) ) + &
1175                                            st_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
1176                                                                    ( zhave(lhave+1) - zhave(lhave) )
1177                      END DO
1178                   END DO
1179                   EXIT z_havet_2
1180                END IF
1181             END DO z_havet_2
1182          END DO z_wantt_2
1184       END IF
1186 !tgs:
1187       IF ( flag_soilm000 .EQ. 1 ) THEN
1188          DO l = 1 , num_sm_levels_input
1189             zhave(l) = sm_levels_input(l) / 100.
1190          END DO
1192       !  Interpolate between the layers we have (zhave) and those that we want (zs).
1194       z_wantm : DO lwant = 1 , num_soil_layers
1195          z_havem : DO lhave = 1 , num_sm_levels_input -1
1196             IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
1197                  ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
1198                DO j = jts , MIN(jde-1,jte)
1199                   DO i = its , MIN(ide-1,ite)
1200                      smois(i,lwant,j)= ( sm_input(i,lhave,j ) * ( zhave(lhave+1) - zs   (lwant) ) + &
1201                                          sm_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
1202                                                                  ( zhave(lhave+1) - zhave(lhave) )
1203                   END DO
1204                END DO
1205                EXIT z_havem
1206             END IF
1207          END DO z_havem
1208       END DO z_wantm
1210       ELSE
1211          !  Here are the levels that we have from the input for moisture.  The input levels plus
1212          !  two more: a value at 0 cm and one at 300 cm.  The 0 cm value is taken to be identical
1213          !  to the most shallow layer's value.  Similarly, the 300 cm value is taken to be the same
1214          !  as the most deep layer's value.
1215    
1216          zhave(1) = 0.
1217          DO l = 1 , num_sm_levels_input
1218             zhave(l+1) = sm_levels_input(l) / 100.
1219          END DO
1220          zhave(num_sm_levels_input+2) = 300. / 100.
1221    
1222          !  Interpolate between the layers we have (zhave) and those that we want (zs).
1223    
1224          z_wantm_2 : DO lwant = 1 , num_soil_layers
1225             z_havem_2 : DO lhave = 1 , num_sm_levels_input +2 -1
1226                IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
1227                     ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
1228                   DO j = jts , MIN(jde-1,jte)
1229                      DO i = its , MIN(ide-1,ite)
1230                         smois(i,lwant,j)= ( sm_input(i,lhave  ,j) * ( zhave(lhave+1) - zs   (lwant) ) + &
1231                                             sm_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
1232                                                                     ( zhave(lhave+1) - zhave(lhave) )
1233                      END DO
1234                   END DO
1235                   EXIT z_havem_2
1236                END IF
1237             END DO z_havem_2
1238          END DO z_wantm_2
1239        ENDIF
1240    
1241          !  Any liquid soil moisture to worry about?
1242    
1243          IF ( num_sw_levels_input .GT. 1 ) THEN
1244    
1245             zhave(1) = 0.
1246             DO l = 1 , num_sw_levels_input
1247                zhave(l+1) = sw_levels_input(l) / 100.
1248             END DO
1249             zhave(num_sw_levels_input+2) = 300. / 100.
1250       
1251             !  Interpolate between the layers we have (zhave) and those that we want (zs).
1252       
1253             z_wantw : DO lwant = 1 , num_soil_layers
1254                z_havew : DO lhave = 1 , num_sw_levels_input +2 -1
1255                   IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
1256                        ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
1257                      DO j = jts , MIN(jde-1,jte)
1258                         DO i = its , MIN(ide-1,ite)
1259                            sh2o(i,lwant,j)= ( sw_input(i,lhave  ,j) * ( zhave(lhave+1) - zs   (lwant) ) + &
1260                                                sw_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
1261                                                                        ( zhave(lhave+1) - zhave(lhave) )
1262                         END DO
1263                      END DO
1264                      EXIT z_havew
1265                   END IF
1266                END DO z_havew
1267             END DO z_wantw
1268    
1269          END IF
1270    
1271    
1272          !  Over water, put in reasonable values for soil temperature and moisture.  These won't be
1273          !  used, but they will make a more continuous plot.
1274    
1275          IF ( flag_sst .EQ. 1 ) THEN
1276             DO j = jts , MIN(jde-1,jte)
1277                DO i = its , MIN(ide-1,ite)
1278                   IF ( landmask(i,j) .LT. 0.5 ) THEN
1279                      DO l = 1 , num_soil_layers
1280                         tslb(i,l,j)= sst(i,j)
1281                         smois(i,l,j)= 1.0
1282                         sh2o (i,l,j)= 1.0
1283                      END DO
1284                   END IF
1285                END DO
1286             END DO
1287          ELSE
1288             DO j = jts , MIN(jde-1,jte)
1289                DO i = its , MIN(ide-1,ite)
1290                   IF ( landmask(i,j) .LT. 0.5 ) THEN
1291                      DO l = 1 , num_soil_layers
1292                         tslb(i,l,j)= tsk(i,j)
1293                         smois(i,l,j)= 1.0
1294                         sh2o (i,l,j)= 1.0
1295                      END DO
1296                   END IF
1297                END DO
1298             END DO
1299          END IF
1300    
1301          DEALLOCATE (zhave)
1303       END IF
1305    END SUBROUTINE init_soil_2_real
1307    SUBROUTINE init_soil_2_ideal ( xland,xice,vegfra,snow,canwat,     &
1308                      ivgtyp,isltyp,tslb,smois,tmn,                  &
1309                      num_soil_layers,                               &
1310                      ids,ide, jds,jde, kds,kde,                     &
1311                      ims,ime, jms,jme, kms,kme,                     &
1312                      its,ite, jts,jte, kts,kte                      )
1314       IMPLICIT NONE 
1315    
1316       INTEGER, INTENT(IN) ::ids,ide, jds,jde, kds,kde,  &
1317                             ims,ime, jms,jme, kms,kme,  &
1318                             its,ite, jts,jte, kts,kte
1319    
1320       INTEGER, INTENT(IN) ::num_soil_layers
1321    
1322       REAL, DIMENSION( ims:ime, num_soil_layers, jms:jme ) , INTENT(OUT) :: smois, tslb 
1323    
1324       REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT)  :: xland, snow, canwat, xice, vegfra, tmn
1325    
1326       INTEGER, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT) :: ivgtyp, isltyp
1327    
1328       INTEGER :: icm,jcm,itf,jtf
1329       INTEGER ::  i,j,l
1330    
1331       itf=min0(ite,ide-1)
1332       jtf=min0(jte,jde-1)
1333    
1334       icm = ide/2
1335       jcm = jde/2
1336    
1337       DO j=jts,jtf
1338          DO l=1,num_soil_layers
1339             DO i=its,itf
1340                if (xland(i,j) .lt. 1.5) then  
1341                smois(i,1,j)=0.30
1342                smois(i,2,j)=0.30
1343                smois(i,3,j)=0.30
1344                smois(i,4,j)=0.30
1345       
1346                tslb(i,1,j)=290.
1347                tslb(i,2,j)=290.
1348                tslb(i,3,j)=290.         
1349                tslb(i,4,j)=290. 
1350                endif
1351             ENDDO
1352          ENDDO
1353       ENDDO                                 
1355    END SUBROUTINE init_soil_2_ideal
1357    SUBROUTINE init_soil_3_real ( tsk , tmn , smois , tslb , &
1358                                  st_input , sm_input , landmask, sst, &
1359                                  zs , dzs , &
1360                                  st_levels_input , sm_levels_input , &
1361                                  num_soil_layers , num_st_levels_input , num_sm_levels_input ,  &
1362                                  num_st_levels_alloc , num_sm_levels_alloc , &
1363                                  flag_sst , flag_soilt000 , flag_soilm000 , &
1364                                  ids , ide , jds , jde , kds , kde , &
1365                                  ims , ime , jms , jme , kms , kme , &
1366                                  its , ite , jts , jte , kts , kte )
1368       IMPLICIT NONE
1370       INTEGER , INTENT(IN) :: num_soil_layers , &
1371                               num_st_levels_input , num_sm_levels_input , &
1372                               num_st_levels_alloc , num_sm_levels_alloc , &
1373                               ids , ide , jds , jde , kds , kde , &
1374                               ims , ime , jms , jme , kms , kme , &
1375                               its , ite , jts , jte , kts , kte
1377       INTEGER , INTENT(IN) :: flag_sst, flag_soilt000, flag_soilm000
1379       INTEGER , DIMENSION(1:num_st_levels_input) , INTENT(INOUT) :: st_levels_input
1380       INTEGER , DIMENSION(1:num_sm_levels_input) , INTENT(INOUT) :: sm_levels_input
1382       REAL , DIMENSION(ims:ime,1:num_st_levels_alloc,jms:jme) , INTENT(INOUT) :: st_input
1383       REAL , DIMENSION(ims:ime,1:num_sm_levels_alloc,jms:jme) , INTENT(INOUT) :: sm_input
1384       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst
1386       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tmn
1387       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tsk
1388       REAL , DIMENSION(num_soil_layers) :: zs , dzs
1390       REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb , smois
1392       REAL , ALLOCATABLE , DIMENSION(:) :: zhave
1394       INTEGER :: i , j , l , lout , lin , lwant , lhave, k
1395       REAL :: temp
1397       CHARACTER (LEN=132) :: message
1399       !  Allocate the soil layer array used for interpolating.
1401       IF ( ( num_st_levels_input .LE. 0 ) .OR. & 
1402            ( num_sm_levels_input .LE. 0 ) ) THEN
1403          write (message, FMT='(A)')&
1404 'No input soil level data (either temperature or moisture, or both are missing).  Required for RUC LSM.' 
1405          CALL wrf_error_fatal ( message )
1406       ELSE
1407          IF ( flag_soilt000 .eq. 1 ) THEN
1408            write(message, FMT='(A)') ' Assume RUC LSM 6-level input'
1409            CALL wrf_message ( message )
1410            ALLOCATE ( zhave( MAX(num_st_levels_input,num_sm_levels_input)  ) )
1411          ELSE
1412            write(message, FMT='(A)') ' Assume non-RUC LSM input'
1413            CALL wrf_message ( message )
1414            ALLOCATE ( zhave( MAX(num_st_levels_input,num_soil_layers)  ) )
1415          END IF
1416       END IF
1418       !  Sort the levels for temperature.
1420       outert : DO lout = 1 , num_st_levels_input-1
1421          innert : DO lin = lout+1 , num_st_levels_input
1422             IF ( st_levels_input(lout) .GT. st_levels_input(lin) ) THEN
1423                temp = st_levels_input(lout) 
1424                st_levels_input(lout) = st_levels_input(lin)
1425                st_levels_input(lin) = NINT(temp)
1426                DO j = jts , MIN(jde-1,jte)
1427                   DO i = its , MIN(ide-1,ite)
1428                      temp = st_input(i,lout,j)
1429                      st_input(i,lout,j) = st_input(i,lin,j)
1430                      st_input(i,lin,j) = temp
1431                   END DO
1432                END DO
1433             END IF
1434          END DO innert
1435       END DO outert
1437       IF ( flag_soilt000 .NE. 1 ) THEN
1438       DO j = jts , MIN(jde-1,jte)
1439          DO i = its , MIN(ide-1,ite)
1440             st_input(i,1,j) = tsk(i,j)
1441             st_input(i,num_st_levels_input+2,j) = tmn(i,j)
1442          END DO
1443       END DO
1444       END IF
1446       !  Sort the levels for moisture.
1448       outerm: DO lout = 1 , num_sm_levels_input-1
1449          innerm : DO lin = lout+1 , num_sm_levels_input
1450             IF ( sm_levels_input(lout) .GT. sm_levels_input(lin) ) THEN
1451                temp = sm_levels_input(lout) 
1452                sm_levels_input(lout) = sm_levels_input(lin)
1453                sm_levels_input(lin) = NINT(temp)
1454                DO j = jts , MIN(jde-1,jte)
1455                   DO i = its , MIN(ide-1,ite)
1456                      temp = sm_input(i,lout,j)
1457                      sm_input(i,lout,j) = sm_input(i,lin,j)
1458                      sm_input(i,lin,j) = temp
1459                   END DO
1460                END DO
1461             END IF
1462          END DO innerm
1463       END DO outerm
1465       IF ( flag_soilm000 .NE. 1 ) THEN
1466       DO j = jts , MIN(jde-1,jte)
1467          DO i = its , MIN(ide-1,ite)
1468             sm_input(i,1,j) = (sm_input(i,2,j)-sm_input(i,3,j))/   &
1469                               (st_levels_input(2)-st_levels_input(1))*st_levels_input(1)+  &
1470                               sm_input(i,2,j)
1471 !           sm_input(i,1,j) = sm_input(i,2,j)
1472             sm_input(i,num_sm_levels_input+2,j) = sm_input(i,num_sm_levels_input+1,j)
1473          END DO
1474       END DO
1475       END IF
1477       !  Here are the levels that we have from the input for temperature.
1479       IF ( flag_soilt000 .EQ. 1 ) THEN
1480          DO l = 1 , num_st_levels_input
1481             zhave(l) = st_levels_input(l) / 100.
1482          END DO
1484       !  Interpolate between the layers we have (zhave) and those that we want (zs).
1487       z_wantt : DO lwant = 1 , num_soil_layers
1488          z_havet : DO lhave = 1 , num_st_levels_input -1
1489             IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
1490                  ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
1491                DO j = jts , MIN(jde-1,jte)
1492                   DO i = its , MIN(ide-1,ite)
1493                      tslb(i,lwant,j)= ( st_input(i,lhave,j ) * ( zhave(lhave+1) - zs   (lwant) ) + &
1494                                         st_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
1495                                                                 ( zhave(lhave+1) - zhave(lhave) )
1496                   END DO
1497                END DO
1498                EXIT z_havet
1499             END IF
1500          END DO z_havet
1501       END DO z_wantt
1503       ELSE
1505          zhave(1) = 0.
1506          DO l = 1 , num_st_levels_input
1507             zhave(l+1) = st_levels_input(l) / 100.
1508          END DO
1509          zhave(num_st_levels_input+2) = 300. / 100.
1511       !  Interpolate between the layers we have (zhave) and those that we want (zs).
1513       z_wantt_2 : DO lwant = 1 , num_soil_layers
1514          z_havet_2 : DO lhave = 1 , num_st_levels_input +2
1515             IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
1516                  ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
1517                DO j = jts , MIN(jde-1,jte)
1518                   DO i = its , MIN(ide-1,ite)
1519                      tslb(i,lwant,j)= ( st_input(i,lhave,j ) * ( zhave(lhave+1) - zs   (lwant) ) + &
1520                                         st_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
1521                                                                 ( zhave(lhave+1) - zhave(lhave) )
1522                   END DO
1523                END DO
1524                EXIT z_havet_2
1525             END IF
1526          END DO z_havet_2
1527       END DO z_wantt_2
1529       END IF
1531       !  Here are the levels that we have from the input for moisture.
1533       IF ( flag_soilm000 .EQ. 1 ) THEN
1534          DO l = 1 , num_sm_levels_input
1535             zhave(l) = sm_levels_input(l) / 100.
1536          END DO
1538       !  Interpolate between the layers we have (zhave) and those that we want (zs).
1540       z_wantm : DO lwant = 1 , num_soil_layers
1541          z_havem : DO lhave = 1 , num_sm_levels_input -1
1542             IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
1543                  ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
1544                DO j = jts , MIN(jde-1,jte)
1545                   DO i = its , MIN(ide-1,ite)
1546                      smois(i,lwant,j)= ( sm_input(i,lhave,j ) * ( zhave(lhave+1) - zs   (lwant) ) + &
1547                                          sm_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
1548                                                                  ( zhave(lhave+1) - zhave(lhave) )
1549                   END DO
1550                END DO
1551                EXIT z_havem
1552             END IF
1553          END DO z_havem
1554       END DO z_wantm
1556       ELSE
1558          zhave(1) = 0.
1559          DO l = 1 , num_sm_levels_input
1560             zhave(l+1) = sm_levels_input(l) / 100.
1561          END DO
1562          zhave(num_sm_levels_input+2) = 300. / 100.
1564       z_wantm_2 : DO lwant = 1 , num_soil_layers
1565          z_havem_2 : DO lhave = 1 , num_sm_levels_input +2
1566             IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
1567                  ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
1568                DO j = jts , MIN(jde-1,jte)
1569                   DO i = its , MIN(ide-1,ite)
1570                      smois(i,lwant,j)= ( sm_input(i,lhave,j ) * ( zhave(lhave+1) - zs   (lwant) ) + &
1571                                          sm_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
1572                                                                  ( zhave(lhave+1) - zhave(lhave) )
1573                   END DO
1574                END DO
1575                EXIT z_havem_2
1576             END IF
1577          END DO z_havem_2
1578       END DO z_wantm_2
1580       END IF
1581       !  Over water, put in reasonable values for soil temperature and moisture.  These won't be
1582       !  used, but they will make a more continuous plot.
1584       IF ( flag_sst .EQ. 1 ) THEN
1585          DO j = jts , MIN(jde-1,jte)
1586             DO i = its , MIN(ide-1,ite)
1587                IF ( landmask(i,j) .LT. 0.5 ) THEN
1588                   DO l = 1 , num_soil_layers
1589                      tslb(i,l,j) = sst(i,j)
1590                      tsk(i,j)    = sst(i,j)
1591                      smois(i,l,j)= 1.0
1592                   END DO
1593                END IF
1594             END DO
1595          END DO
1596       ELSE
1597          DO j = jts , MIN(jde-1,jte)
1598             DO i = its , MIN(ide-1,ite)
1599                IF ( landmask(i,j) .LT. 0.5 ) THEN
1600                   DO l = 1 , num_soil_layers
1601                      tslb(i,l,j)= tsk(i,j)
1602                      smois(i,l,j)= 1.0
1603                   END DO
1604                END IF
1605             END DO
1606          END DO
1607       END IF
1609       DEALLOCATE (zhave)
1611    END SUBROUTINE init_soil_3_real
1612    SUBROUTINE init_soil_7_real ( tsk , tmn , smois , sh2o , tslb , &
1613                                  st_input , sm_input , sw_input , landmask , sst ,     &
1614                                  zs , dzs ,                                            &
1615                                  st_levels_input , sm_levels_input , sw_levels_input , &
1616                                  num_soil_layers , num_st_levels_input ,               &
1617                                  num_sm_levels_input ,  num_sw_levels_input ,          &
1618                                  num_st_levels_alloc , num_sm_levels_alloc ,           &
1619                                  num_sw_levels_alloc ,                                 &
1620                                  flag_sst , flag_soilt000 , flag_soilmt000 ,           &
1621                                  ids , ide , jds , jde , kds , kde ,                   &
1622                                  ims , ime , jms , jme , kms , kme ,                   &
1623                                  its , ite , jts , jte , kts , kte )
1625       ! for soil temperature and moisture initialization for the PX LSM
1627       IMPLICIT NONE
1629       INTEGER , INTENT(IN) :: num_soil_layers , &
1630                               num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
1631                               num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , &
1632                               ids , ide , jds , jde , kds , kde , &
1633                               ims , ime , jms , jme , kms , kme , &
1634                               its , ite , jts , jte , kts , kte 
1636       INTEGER , INTENT(IN) :: flag_sst, flag_soilt000, flag_soilmt000
1638       INTEGER , DIMENSION(1:num_st_levels_input) , INTENT(INOUT) :: st_levels_input
1639       INTEGER , DIMENSION(1:num_sm_levels_input) , INTENT(INOUT) :: sm_levels_input
1640       INTEGER , DIMENSION(1:num_sw_levels_input) , INTENT(INOUT) :: sw_levels_input
1642       REAL , DIMENSION(ims:ime,1:num_st_levels_alloc,jms:jme) , INTENT(INOUT) :: st_input
1643       REAL , DIMENSION(ims:ime,1:num_sm_levels_alloc,jms:jme) , INTENT(INOUT) :: sm_input
1644       REAL , DIMENSION(ims:ime,1:num_sw_levels_alloc,jms:jme) , INTENT(INOUT) :: sw_input
1645       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst
1647       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tmn
1648       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tsk
1649       REAL , DIMENSION(num_soil_layers) :: zs , dzs
1651       REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb , smois , sh2o
1653       REAL , ALLOCATABLE , DIMENSION(:) :: zhave
1655       INTEGER :: i , j , l , lout , lin , lwant , lhave , num
1656       REAL    :: temp
1657       LOGICAL :: found_levels
1659       !  Are there any soil temp and moisture levels - ya know, they are mandatory.
1661       num = num_st_levels_input * num_sm_levels_input
1663       IF ( num .GE. 1 ) THEN
1665          !  Ordered levels that we have data for.
1667          ALLOCATE ( zhave( MAX(num_st_levels_input,num_sm_levels_input,num_sw_levels_input) +2) )
1669          !  Sort the levels for temperature.
1670          outert : DO lout = 1 , num_st_levels_input-1
1671             innert : DO lin = lout+1 , num_st_levels_input
1672                IF ( st_levels_input(lout) .GT. st_levels_input(lin) ) THEN
1673                   temp = st_levels_input(lout) 
1674                   st_levels_input(lout) = st_levels_input(lin)
1675                   st_levels_input(lin) = NINT(temp)
1676                   DO j = jts , MIN(jde-1,jte)
1677                      DO i = its , MIN(ide-1,ite)
1678                         temp = st_input(i,lout+1,j)
1679                         st_input(i,lout+1,j) = st_input(i,lin+1,j)
1680                         st_input(i,lin+1,j) = temp
1681                      END DO
1682                   END DO
1683                END IF
1684             END DO innert
1685          END DO outert
1686          DO j = jts , MIN(jde-1,jte)
1687             DO i = its , MIN(ide-1,ite)
1688                st_input(i,1,j) = tsk(i,j)
1689                st_input(i,num_st_levels_input+2,j) = tmn(i,j)
1690             END DO
1691          END DO
1692    
1693          !  Sort the levels for moisture.
1694   
1695          outerm: DO lout = 1 , num_sm_levels_input-1
1696             innerm : DO lin = lout+1 , num_sm_levels_input
1697               IF ( sm_levels_input(lout) .GT. sm_levels_input(lin) ) THEN
1698                   temp = sm_levels_input(lout) 
1699                   sm_levels_input(lout) = sm_levels_input(lin)
1700                   sm_levels_input(lin) = NINT(temp)
1701                   DO j = jts , MIN(jde-1,jte)
1702                      DO i = its , MIN(ide-1,ite)
1703                         temp = sm_input(i,lout+1,j)
1704                         sm_input(i,lout+1,j) = sm_input(i,lin+1,j)
1705                         sm_input(i,lin+1,j) = temp
1706                      END DO
1707                   END DO
1708                END IF
1709             END DO innerm
1710          END DO outerm
1711          DO j = jts , MIN(jde-1,jte)
1712             DO i = its , MIN(ide-1,ite)
1713                sm_input(i,1,j) = sm_input(i,2,j)
1714                sm_input(i,num_sm_levels_input+2,j) = sm_input(i,num_sm_levels_input+1,j)
1715             END DO
1716          END DO
1717    
1718          !  Sort the levels for liquid moisture.
1719    
1720          outerw: DO lout = 1 , num_sw_levels_input-1
1721             innerw : DO lin = lout+1 , num_sw_levels_input
1722                IF ( sw_levels_input(lout) .GT. sw_levels_input(lin) ) THEN
1723                   temp = sw_levels_input(lout) 
1724                   sw_levels_input(lout) = sw_levels_input(lin)
1725                   sw_levels_input(lin) = NINT(temp)
1726                   DO j = jts , MIN(jde-1,jte)
1727                      DO i = its , MIN(ide-1,ite)
1728                         temp = sw_input(i,lout+1,j)
1729                         sw_input(i,lout+1,j) = sw_input(i,lin+1,j)
1730                         sw_input(i,lin+1,j) = temp
1731                      END DO
1732                   END DO
1733                END IF
1734             END DO innerw
1735          END DO outerw
1736         IF ( num_sw_levels_input .GT. 1 ) THEN
1737             DO j = jts , MIN(jde-1,jte)
1738                DO i = its , MIN(ide-1,ite)
1739                   sw_input(i,1,j) = sw_input(i,2,j)
1740                   sw_input(i,num_sw_levels_input+2,j) = sw_input(i,num_sw_levels_input+1,j)
1741                END DO
1742             END DO
1743          END IF
1745          found_levels = .TRUE.
1747       ELSE IF ( ( num .LE. 0 ) .AND. (  start_date .NE. current_date ) ) THEN
1749          found_levels = .FALSE.
1751       ELSE
1752          CALL wrf_error_fatal ( &
1753          'No input soil level data (temperature, moisture or liquid, or all are missing). Required for PX LSM.' )
1754       END IF
1756       !  Is it OK to continue?
1758       IF ( found_levels ) THEN
1760          !  Here are the levels that we have from the input for temperature.  The input levels plus
1761          !  two more: the skin temperature at 0 cm, and the annual mean temperature at 300 cm.
1763          zhave(1) = 0.
1764          DO l = 1 , num_st_levels_input
1765             zhave(l+1) = st_levels_input(l) / 100.
1766         END DO
1767          zhave(num_st_levels_input+2) = 300. / 100.
1768    
1769          !  Interpolate between the layers we have (zhave) and those that we want (zs).
1770    
1771          z_wantt : DO lwant = 1 , num_soil_layers
1772             z_havet : DO lhave = 1 , num_st_levels_input +2 -1
1773                IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
1774                     ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
1775                   DO j = jts , MIN(jde-1,jte)
1776                      DO i = its , MIN(ide-1,ite)
1777                         tslb(i,lwant,j)= ( st_input(i,lhave  ,j) * ( zhave(lhave+1) - zs   (lwant) ) + &
1778                                            st_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
1779                                                                    ( zhave(lhave+1) - zhave(lhave) )
1780                      END DO
1781                   END DO
1782                   EXIT z_havet
1783                END IF
1784             END DO z_havet
1785          END DO z_wantt
1787          !  Here are the levels that we have from the input for moisture.  The input levels plus
1788          !  two more: a value at 0 cm and one at 300 cm.  The 0 cm value is taken to be identical
1789          !  to the most shallow layer's value.  Similarly, the 300 cm value is taken to be the same
1790          !  as the most deep layer's value.
1791    
1792          zhave(1) = 0.
1793          DO l = 1 , num_sm_levels_input
1794             zhave(l+1) = sm_levels_input(l) / 100.
1795          END DO
1796         zhave(num_sm_levels_input+2) = 300. / 100.
1797    
1798          !  Interpolate between the layers we have (zhave) and those that we want (zs).
1799    
1800          z_wantm : DO lwant = 1 , num_soil_layers
1801             z_havem : DO lhave = 1 , num_sm_levels_input +2 -1
1802                IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
1803                     ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
1804                   DO j = jts , MIN(jde-1,jte)
1805                      DO i = its , MIN(ide-1,ite)
1806                         smois(i,lwant,j)= ( sm_input(i,lhave  ,j) * ( zhave(lhave+1) - zs   (lwant) ) + &
1807                                             sm_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
1808                                                                     ( zhave(lhave+1) - zhave(lhave) )
1809                      END DO
1810                   END DO
1811                   EXIT z_havem
1812                END IF
1813             END DO z_havem
1814          END DO z_wantm
1815    
1816          !  Any liquid soil moisture to worry about?
1817    
1818          IF ( num_sw_levels_input .GT. 1 ) THEN
1819    
1820             zhave(1) = 0.
1821             DO l = 1 , num_sw_levels_input
1822                zhave(l+1) = sw_levels_input(l) / 100.
1823             END DO
1824             zhave(num_sw_levels_input+2) = 300. / 100.
1825       
1826           !  Interpolate between the layers we have (zhave) and those that we want (zs).
1827       
1828             z_wantw : DO lwant = 1 , num_soil_layers
1829                z_havew : DO lhave = 1 , num_sw_levels_input +2 -1
1830                   IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
1831                        ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
1832                      DO j = jts , MIN(jde-1,jte)
1833                         DO i = its , MIN(ide-1,ite)
1834                            sh2o(i,lwant,j)= ( sw_input(i,lhave  ,j) * ( zhave(lhave+1) - zs   (lwant) ) + &
1835                                                sw_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
1836                                                                        ( zhave(lhave+1) - zhave(lhave) )
1837                         END DO
1838                      END DO
1839                      EXIT z_havew
1840                   END IF
1841                END DO z_havew
1842             END DO z_wantw
1843    
1844          END IF
1845    
1846   
1847         !  Over water, put in reasonable values for soil temperature and moisture.  These won't be
1848         !  used, but they will make a more continuous plot.
1849   
1850      DO j = jts , MIN(jde-1,jte)
1851         DO i = its , MIN(ide-1,ite)
1852              tslb(i,1,j)= tsk(i,j)
1853              tslb(i,2,j)= tmn(i,j)
1854         END DO
1855      END DO
1857          IF ( flag_sst .EQ. 1 ) THEN
1858             DO j = jts , MIN(jde-1,jte)
1859                DO i = its , MIN(ide-1,ite)
1860                   IF ( landmask(i,j) .LT. 0.5 ) THEN
1861                      DO l = 1 , num_soil_layers
1862                         tslb(i,l,j)= sst(i,j)
1863                         smois(i,l,j)= 1.0
1864                         sh2o (i,l,j)= 1.0
1865                      END DO
1866                   END IF
1867                END DO
1868             END DO
1869          ELSE
1870             DO j = jts , MIN(jde-1,jte)
1871                DO i = its , MIN(ide-1,ite)
1872                   IF ( landmask(i,j) .LT. 0.5 ) THEN
1873                      DO l = 1 , num_soil_layers
1874                         tslb(i,l,j)= tsk(i,j)
1875                         smois(i,l,j)= 1.0
1876                         sh2o (i,l,j)= 1.0
1877                      END DO
1878                   END IF
1879                END DO
1880             END DO
1881          END IF
1882    
1883          DEALLOCATE (zhave)
1885       END IF
1887    END SUBROUTINE init_soil_7_real
1890 END MODULE module_soil_pre
1892 #else
1894 MODULE module_soil_pre
1896    USE module_date_time
1897    USE module_state_description
1899 CONTAINS
1901    SUBROUTINE adjust_for_seaice_pre ( xice , landmask , tsk , ivgtyp , vegcat , lu_index , &
1902                                       xland , landusef , isltyp , soilcat , soilctop , &
1903                                       soilcbot , tmn , &
1904                                       seaice_threshold , &
1905                                       num_veg_cat , num_soil_top_cat , num_soil_bot_cat , &
1906                                       iswater , isice , &
1907                                       scheme , &
1908                                       ids , ide , jds , jde , kds , kde , &
1909                                       ims , ime , jms , jme , kms , kme , &
1910                                       its , ite , jts , jte , kts , kte )
1912       IMPLICIT NONE
1914       INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
1915                               ims , ime , jms , jme , kms , kme , &
1916                               its , ite , jts , jte , kts , kte , &
1917                               iswater , isice 
1918       INTEGER , INTENT(IN) :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat , scheme
1920       REAL , DIMENSION(ims:ime,1:num_veg_cat,jms:jme) , INTENT(INOUT):: landusef
1921       REAL , DIMENSION(ims:ime,1:num_soil_top_cat,jms:jme) , INTENT(INOUT):: soilctop
1922       REAL , DIMENSION(ims:ime,1:num_soil_bot_cat,jms:jme) , INTENT(INOUT):: soilcbot
1923       INTEGER , DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: isltyp , ivgtyp
1924       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: landmask , xice , tsk , lu_index , &
1925                                                            vegcat, xland , soilcat , tmn
1926       REAL , INTENT(IN) :: seaice_threshold
1928       INTEGER :: i , j , num_seaice_changes , loop
1929       CHARACTER (LEN=132) :: message
1930       
1931       fix_seaice : SELECT CASE ( scheme ) 
1933          CASE ( SLABSCHEME ) 
1934             DO j = jts , MIN(jde-1,jte)
1935                DO i = its , MIN(ide-1,ite)
1936                   IF ( xice(i,j) .GT. 200.0 ) THEN
1937                      xice(i,j) = 0.
1938                      num_seaice_changes = num_seaice_changes + 1
1939                   END IF
1940                END DO
1941             END DO
1942             IF ( num_seaice_changes .GT. 0 ) THEN
1943                WRITE ( message , FMT='(A,I6)' ) &
1944                'Total pre number of sea ice locations removed (due to FLAG values) = ', &
1945                num_seaice_changes
1946                CALL wrf_debug ( 0 , message )  
1947             END IF
1948             num_seaice_changes = 0
1949             DO j = jts , MIN(jde-1,jte)
1950                DO i = its , MIN(ide-1,ite)
1951                   IF ( ( xice(i,j) .GE. 0.5 ) .OR. &
1952                        ( ( landmask(i,j) .LT. 0.5 ) .AND. ( tsk(i,j) .LT. seaice_threshold ) ) ) THEN
1953                      xice(i,j) = 1.
1954                      num_seaice_changes = num_seaice_changes + 1
1955                      tmn(i,j) = 271.4
1956                      vegcat(i,j)=isice
1957                      lu_index(i,j)=ivgtyp(i,j)
1958                      landmask(i,j)=1.
1959                      xland(i,j)=1.
1960                      DO loop=1,num_veg_cat
1961                         landusef(i,loop,j)=0.
1962                      END DO
1963                      landusef(i,ivgtyp(i,j),j)=1.
1965                      isltyp(i,j) = 16
1966                      soilcat(i,j)=isltyp(i,j)
1967                      DO loop=1,num_soil_top_cat
1968                         soilctop(i,loop,j)=0
1969                      END DO
1970                      DO loop=1,num_soil_bot_cat
1971                         soilcbot(i,loop,j)=0
1972                      END DO
1973                      soilctop(i,isltyp(i,j),j)=1.
1974                      soilcbot(i,isltyp(i,j),j)=1.
1975                   END IF
1976                END DO
1977             END DO
1978             IF ( num_seaice_changes .GT. 0 ) THEN
1979                WRITE ( message , FMT='(A,I6)' ) &
1980                'Total pre number of sea ice location changes (water to land) = ', num_seaice_changes
1981                CALL wrf_debug ( 0 , message )  
1982             END IF
1984          CASE ( LSMSCHEME ) 
1985          CASE ( RUCLSMSCHEME ) 
1987       END SELECT fix_seaice
1989    END SUBROUTINE adjust_for_seaice_pre
1991    SUBROUTINE adjust_for_seaice_post ( xice , landmask , tsk , ivgtyp , vegcat , lu_index , &
1992                                       xland , landusef , isltyp , soilcat , soilctop , &
1993                                       soilcbot , tmn , &
1994                                       tslb , smois , sh2o , &
1995                                       seaice_threshold , &
1996                                       num_veg_cat , num_soil_top_cat , num_soil_bot_cat , &
1997                                       num_soil_layers , &
1998                                       iswater , isice , &
1999                                       scheme , &
2000                                       ids , ide , jds , jde , kds , kde , &
2001                                       ims , ime , jms , jme , kms , kme , &
2002                                       its , ite , jts , jte , kts , kte )
2004       IMPLICIT NONE
2006       INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
2007                               ims , ime , jms , jme , kms , kme , &
2008                               its , ite , jts , jte , kts , kte , &
2009                               iswater , isice 
2010       INTEGER , INTENT(IN) :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat , scheme
2011       INTEGER , INTENT(IN) :: num_soil_layers
2013       REAL , DIMENSION(ims:ime,1:num_veg_cat,jms:jme) , INTENT(INOUT):: landusef
2014       REAL , DIMENSION(ims:ime,1:num_soil_top_cat,jms:jme) , INTENT(INOUT):: soilctop
2015       REAL , DIMENSION(ims:ime,1:num_soil_bot_cat,jms:jme) , INTENT(INOUT):: soilcbot
2016       REAL , DIMENSION(ims:ime,1:num_soil_layers,jms:jme) , INTENT(INOUT):: tslb , smois , sh2o
2017       INTEGER , DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: isltyp , ivgtyp
2018       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: landmask , xice , tsk , lu_index , &
2019                                                            vegcat, xland , soilcat , tmn
2020       REAL , INTENT(IN) :: seaice_threshold
2021       REAL :: total_depth , mid_point_depth
2023       INTEGER :: i , j , num_seaice_changes , loop
2024       CHARACTER (LEN=132) :: message
2025       
2026       fix_seaice : SELECT CASE ( scheme ) 
2028          CASE ( SLABSCHEME ) 
2030          CASE ( LSMSCHEME ) 
2031             DO j = jts , MIN(jde-1,jte)
2032                DO i = its , MIN(ide-1,ite)
2033                   IF ( xice(i,j) .GT. 200.0 ) THEN
2034                      xice(i,j) = 0.
2035                      num_seaice_changes = num_seaice_changes + 1
2036                   END IF
2037                END DO
2038             END DO
2039             IF ( num_seaice_changes .GT. 0 ) THEN
2040                WRITE ( message , FMT='(A,I6)' ) &
2041                'Total post number of sea ice locations removed (due to FLAG values) = ', &
2042                num_seaice_changes
2043                CALL wrf_debug ( 0 , message )  
2044             END IF
2045             num_seaice_changes = 0
2046             DO j = jts , MIN(jde-1,jte)
2047                DO i = its , MIN(ide-1,ite)
2048                   IF ( ( xice(i,j) .GE. 0.5 ) .OR. &
2049                        ( ( landmask(i,j) .LT. 0.5 ) .AND. ( tsk(i,j) .LT. seaice_threshold ) ) ) THEN
2050                      xice(i,j) = 1.
2051                      num_seaice_changes = num_seaice_changes + 1
2052                      tmn(i,j) = 271.16
2053                      vegcat(i,j)=isice
2054                      lu_index(i,j)=ivgtyp(i,j)
2055                      landmask(i,j)=1.
2056                      xland(i,j)=1.
2057                      DO loop=1,num_veg_cat
2058                         landusef(i,loop,j)=0.
2059                      END DO
2060                      landusef(i,ivgtyp(i,j),j)=1.
2062                      isltyp(i,j) = 16
2063                      soilcat(i,j)=isltyp(i,j)
2064                      DO loop=1,num_soil_top_cat
2065                         soilctop(i,loop,j)=0
2066                      END DO
2067                      DO loop=1,num_soil_bot_cat
2068                         soilcbot(i,loop,j)=0
2069                      END DO
2070                      soilctop(i,isltyp(i,j),j)=1.
2071                      soilcbot(i,isltyp(i,j),j)=1.
2073                      total_depth = 3. ! ice is 3 m deep, num_soil_layers equispaced layers
2074                      DO loop = 1,num_soil_layers
2075                         mid_point_depth=(total_depth/num_soil_layers)/2. + &
2076                                         (loop-1)*(total_depth/num_soil_layers)
2077                         tslb(i,loop,j) = ( (total_depth-mid_point_depth)*tsk(i,j) + &
2078                                             mid_point_depth*tmn(i,j) ) / total_depth
2079                      END DO
2081                      DO loop=1,num_soil_layers
2082                         smois(i,loop,j) = 1.0
2083                         sh2o(i,loop,j)  = 0.0
2084                      END DO
2085                   END IF
2086                END DO
2087             END DO
2088             IF ( num_seaice_changes .GT. 0 ) THEN
2089                WRITE ( message , FMT='(A,I6)' ) &
2090                'Total post number of sea ice location changes (water to land) = ', num_seaice_changes
2091                CALL wrf_debug ( 0 , message )  
2092             END IF
2094          CASE ( RUCLSMSCHEME ) 
2096       END SELECT fix_seaice
2098    END SUBROUTINE adjust_for_seaice_post
2100    SUBROUTINE process_percent_cat_new ( landmask ,  &
2101                                 landuse_frac , soil_top_cat , soil_bot_cat , &
2102                                 isltyp , ivgtyp , &
2103                                 num_veg_cat , num_soil_top_cat , num_soil_bot_cat , &
2104                                 ids , ide , jds , jde , kds , kde , &
2105                                 ims , ime , jms , jme , kms , kme , &
2106                                 its , ite , jts , jte , kts , kte , &
2107                                 iswater )
2109       IMPLICIT NONE
2111       INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
2112                               ims , ime , jms , jme , kms , kme , &
2113                               its , ite , jts , jte , kts , kte , &
2114                               iswater
2115       INTEGER , INTENT(IN) :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat
2116       REAL , DIMENSION(ims:ime,1:num_veg_cat,jms:jme) , INTENT(INOUT):: landuse_frac
2117       REAL , DIMENSION(ims:ime,1:num_soil_top_cat,jms:jme) , INTENT(IN):: soil_top_cat
2118       REAL , DIMENSION(ims:ime,1:num_soil_bot_cat,jms:jme) , INTENT(IN):: soil_bot_cat
2119       INTEGER , DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: isltyp , ivgtyp
2120       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: landmask
2122       INTEGER :: i , j , l , ll, dominant_index
2123       REAL :: dominant_value
2125 #ifdef WRF_CHEM
2126 !      REAL :: lwthresh = .99
2127       REAL :: lwthresh = .50
2128 #else
2129       REAL :: lwthresh = .50
2130 #endif
2132       INTEGER , PARAMETER :: iswater_soil = 14
2133       INTEGER :: iforce
2134       CHARACTER (LEN=1024) :: message
2136       !  Sanity check on the 50/50 points
2138       DO j = jts , MIN(jde-1,jte)
2139          DO i = its , MIN(ide-1,ite)
2140             dominant_value = landuse_frac(i,iswater,j)
2141             IF ( dominant_value .EQ. lwthresh ) THEN
2142                DO l = 1 , num_veg_cat
2143                   IF ( l .EQ. iswater ) CYCLE
2144                   IF ( landuse_frac(i,l,j) .EQ. lwthresh ) THEN
2145                 write(message, FMT='(I4,I4,A,I4,A,F12.4)') i,j,' water and category ',l,' both at 50%, landmask is ',landmask(i,j)
2146                 call wrf_message ( message )
2147                      landuse_frac(i,l,j) = lwthresh - .01
2148                      landuse_frac(i,iswater,j) = 1. - (lwthresh + 0.01)
2149                   END IF
2150                END DO
2151             END IF
2152          END DO
2153       END DO
2155       !  Compute the dominant VEGETATION INDEX.
2157       DO j = jts , MIN(jde-1,jte)
2158          DO i = its , MIN(ide-1,ite)
2159             dominant_value = landuse_frac(i,1,j)
2160             dominant_index = 1
2161             DO l = 2 , num_veg_cat
2162                IF        ( l .EQ. iswater ) THEN
2163                   ! wait a bit
2164                ELSE IF ( ( l .NE. iswater ) .AND. ( landuse_frac(i,l,j) .GT. dominant_value ) ) THEN
2165                   dominant_value = landuse_frac(i,l,j)
2166                   dominant_index = l
2167                END IF
2168             END DO
2169             IF ( landuse_frac(i,iswater,j) .GT. lwthresh ) THEN
2170                dominant_value = landuse_frac(i,iswater,j)
2171                dominant_index = iswater
2172 #if 0
2173 si needs to beef up consistency checks before we can use this part
2174             ELSE IF ( ( landuse_frac(i,iswater,j) .EQ. lwthresh) .AND. &
2175                       ( dominant_value .EQ. lwthresh) ) THEN
2176                ! no op
2177 #else
2178 ELSEIF((landuse_frac(i,iswater,j).EQ.lwthresh).AND.(dominant_value.EQ.lwthresh).and.(dominant_index.LT.iswater))THEN
2179 write(message,*)'temporary SI landmask fix'
2180 call wrf_message(trim(message))
2181 ! no op
2182 ELSEIF((landuse_frac(i,iswater,j).EQ.lwthresh).AND.(dominant_value.EQ.lwthresh).and.(dominant_index.GT.iswater))THEN
2183 write(message,*)'temporary SI landmask fix'
2184 call wrf_message(trim(message))
2185 dominant_value = landuse_frac(i,iswater,j)
2186 dominant_index = iswater
2187 #endif
2188             ELSE IF ( ( landuse_frac(i,iswater,j) .EQ. lwthresh ) .AND. &
2189                       ( dominant_value .LT. lwthresh ) ) THEN
2190                dominant_value = landuse_frac(i,iswater,j)
2191                dominant_index = iswater
2192             END IF
2193             IF      ( dominant_index .EQ. iswater ) THEN
2194 if(landmask(i,j).gt.lwthresh) then
2195 write(message,*) 'changing to water at point ',i,j
2196 call wrf_message(trim(message))
2197 write(message,*)  nint(landuse_frac(i,:,j)*100)
2198 call wrf_message(trim(message))
2199 endif
2200                landmask(i,j) = 0
2201             ELSE IF ( dominant_index .NE. iswater ) THEN
2202 if(landmask(i,j).lt.lwthresh) then
2203 write(message,*) 'changing to land at point ',i,j
2204 call wrf_message(trim(message))
2205 write(message,*) nint(landuse_frac(i,:,j)*100)
2206 call wrf_message(trim(message))
2207 endif
2208                landmask(i,j) = 1
2209             END IF
2210             ivgtyp(i,j) = dominant_index
2211          END DO
2212       END DO
2214       !  Compute the dominant SOIL TEXTURE INDEX, TOP.
2216       iforce = 0
2217       DO i = its , MIN(ide-1,ite)
2218          DO j = jts , MIN(jde-1,jte)
2219             dominant_value = soil_top_cat(i,1,j)
2220             dominant_index = 1
2221             IF ( landmask(i,j) .GT. lwthresh ) THEN
2222                DO l = 2 , num_soil_top_cat
2223                   IF ( ( l .NE. iswater_soil ) .AND. ( soil_top_cat(i,l,j) .GT. dominant_value ) ) THEN
2224                      dominant_value = soil_top_cat(i,l,j)
2225                      dominant_index = l
2226                   END IF
2227                END DO
2228                IF ( dominant_value .LT. 0.01 ) THEN
2229                   iforce = iforce + 1
2230                   WRITE ( message , FMT = '(A,I4,I4)' ) &
2231                   'based on landuse, changing soil to land at point ',i,j
2232                   CALL wrf_debug(1,message)
2233                   WRITE ( message , FMT = '(16(i3,1x))' ) &
2234                   1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12, 13, 14, 15, 16
2235                   CALL wrf_debug(1,message)
2236                   WRITE ( message , FMT = '(16(i3,1x))' ) &
2237                   nint(soil_top_cat(i,:,j)*100)
2238                   CALL wrf_debug(1,message)
2239                   dominant_index = 8
2240                END IF
2241             ELSE
2242                dominant_index = iswater_soil
2243             END IF
2244             isltyp(i,j) = dominant_index
2245          END DO
2246       END DO
2248 if(iforce.ne.0)then
2249 WRITE(message,FMT='(A,I4,A,I6)' ) &
2250 'forcing artificial silty clay loam at ',iforce,' points, out of ',&
2251 (MIN(ide-1,ite)-its+1)*(MIN(jde-1,jte)-jts+1)
2252 CALL wrf_debug(0,message)
2253 endif
2255    END SUBROUTINE process_percent_cat_new
2257    SUBROUTINE process_soil_real ( tsk , tmn , &
2258                                 landmask , sst , &
2259                                 st_input , sm_input , sw_input , st_levels_input , sm_levels_input , sw_levels_input , &
2260                                 zs , dzs , tslb , smois , sh2o , &
2261                                 flag_sst , flag_soilt000, flag_soilm000, &
2262                                 ids , ide , jds , jde , kds , kde , &
2263                                 ims , ime , jms , jme , kms , kme , &
2264                                 its , ite , jts , jte , kts , kte , &
2265                                 sf_surface_physics , num_soil_layers , real_data_init_type , &
2266                                 num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
2267                                 num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc )
2269       IMPLICIT NONE
2271       INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
2272                               ims , ime , jms , jme , kms , kme , &
2273                               its , ite , jts , jte , kts , kte , &
2274                               sf_surface_physics , num_soil_layers , real_data_init_type , &
2275                               num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
2276                               num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc 
2278       INTEGER , INTENT(IN) :: flag_sst, flag_soilt000, flag_soilm000
2280       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst
2282       INTEGER , DIMENSION(1:num_st_levels_input) , INTENT(INOUT) :: st_levels_input
2283       INTEGER , DIMENSION(1:num_sm_levels_input) , INTENT(INOUT) :: sm_levels_input
2284       INTEGER , DIMENSION(1:num_sw_levels_input) , INTENT(INOUT) :: sw_levels_input
2285       REAL , DIMENSION(ims:ime,1:num_st_levels_alloc,jms:jme) , INTENT(INOUT) :: st_input
2286       REAL , DIMENSION(ims:ime,1:num_sm_levels_alloc,jms:jme) , INTENT(INOUT) :: sm_input
2287       REAL , DIMENSION(ims:ime,1:num_sw_levels_alloc,jms:jme) , INTENT(INOUT) :: sw_input
2289       REAL, DIMENSION(1:num_soil_layers), INTENT(OUT)  ::  zs,dzs
2290       REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb , smois , sh2o
2291       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tmn 
2292       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tsk
2294       INTEGER :: i , j , l , dominant_index , num_soil_cat , num_veg_cat
2295       REAL :: dominant_value
2297       !  Initialize the soil depth, and the soil temperature and moisture.
2299       IF      ( ( sf_surface_physics .EQ. 1 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
2300          CALL init_soil_depth_1 ( zs , dzs , num_soil_layers )
2301          CALL init_soil_1_real ( tsk , tmn , tslb , zs , dzs , num_soil_layers , real_data_init_type , &
2302                                  landmask , sst , flag_sst , &
2303                                  ids , ide , jds , jde , kds , kde , &
2304                                  ims , ime , jms , jme , kms , kme , &
2305                                  its , ite , jts , jte , kts , kte )
2307       ELSE IF ( ( sf_surface_physics .EQ. 2 .or. sf_surface_physics .EQ. 99 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
2308          CALL init_soil_depth_2 ( zs , dzs , num_soil_layers )
2309          CALL init_soil_2_real ( tsk , tmn , smois , sh2o , tslb , &
2310                                  st_input , sm_input , sw_input , landmask , sst , &
2311                                  zs , dzs , &
2312                                  st_levels_input , sm_levels_input , sw_levels_input , &
2313                                  num_soil_layers , num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
2314                                  num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , &
2315                                  flag_sst , flag_soilt000 , flag_soilm000 , &
2316                                  ids , ide , jds , jde , kds , kde , &
2317                                  ims , ime , jms , jme , kms , kme , &
2318                                  its , ite , jts , jte , kts , kte )
2319 !        CALL init_soil_old ( tsk , tmn , &
2320 !                             smois , tslb , zs , dzs , num_soil_layers , &
2321 !                             st000010_input , st010040_input , st040100_input , st100200_input , &
2322 !                             st010200_input , &
2323 !                             sm000010_input , sm010040_input , sm040100_input , sm100200_input , &
2324 !                             sm010200_input , &
2325 !                             landmask_input , sst_input , &
2326 !                             ids , ide , jds , jde , kds , kde , &
2327 !                             ims , ime , jms , jme , kms , kme , &
2328 !                             its , ite , jts , jte , kts , kte )
2329       ELSE IF ( ( sf_surface_physics .EQ. 3 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
2330          CALL init_soil_depth_3 ( zs , dzs , num_soil_layers )
2331          CALL init_soil_3_real ( tsk , tmn , smois , tslb , &
2332                                  st_input , sm_input , landmask , sst , &
2333                                  zs , dzs , &
2334                                  st_levels_input , sm_levels_input , &
2335                                  num_soil_layers , num_st_levels_input , num_sm_levels_input , &
2336                                  num_st_levels_alloc , num_sm_levels_alloc , &
2337                                  flag_sst , flag_soilt000 , flag_soilm000 , &
2338                                  ids , ide , jds , jde , kds , kde , &
2339                                  ims , ime , jms , jme , kms , kme , &
2340                                  its , ite , jts , jte , kts , kte )
2341       END IF
2343    END SUBROUTINE process_soil_real
2345    SUBROUTINE process_soil_ideal ( xland,xice,vegfra,snow,canwat,  &
2346                                    ivgtyp,isltyp,tslb,smois, &
2347                                    tsk,tmn,zs,dzs,           &
2348                                    num_soil_layers,          &
2349                                    sf_surface_physics ,      &
2350                                    ids,ide, jds,jde, kds,kde,&
2351                                    ims,ime, jms,jme, kms,kme,&
2352                                    its,ite, jts,jte, kts,kte )
2354       IMPLICIT NONE
2356       INTEGER, INTENT(IN) ::ids,ide, jds,jde, kds,kde,  &
2357                             ims,ime, jms,jme, kms,kme,  &
2358                             its,ite, jts,jte, kts,kte
2359   
2360       INTEGER, INTENT(IN) :: num_soil_layers , sf_surface_physics
2362       REAL, DIMENSION( ims:ime, num_soil_layers, jms:jme ) , INTENT(INOUT) :: smois, tslb
2364       REAL, DIMENSION(num_soil_layers), INTENT(OUT) :: dzs,zs
2366       REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT) :: tsk, tmn
2367       REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT) :: xland, snow, canwat, xice, vegfra
2368       INTEGER, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT) :: ivgtyp, isltyp
2370       !  Local variables.
2372       INTEGER :: itf,jtf
2374       itf=MIN(ite,ide-1)
2375       jtf=MIN(jte,jde-1)
2377       IF      ( ( sf_surface_physics .EQ. 1 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
2378          CALL init_soil_depth_1 ( zs , dzs , num_soil_layers )
2379          CALL init_soil_1_ideal(tsk,tmn,tslb,xland,                      &
2380                                 ivgtyp,zs,dzs,num_soil_layers,           &
2381                                 ids,ide, jds,jde, kds,kde,               &
2382                                 ims,ime, jms,jme, kms,kme,               &
2383                                 its,ite, jts,jte, kts,kte                )
2384       ELSE IF ( ( sf_surface_physics .EQ. 2 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
2385          CALL init_soil_depth_2 ( zs , dzs , num_soil_layers )
2386          CALL init_soil_2_ideal ( xland,xice,vegfra,snow,canwat,         &
2387                                   ivgtyp,isltyp,tslb,smois,tmn,          &
2388                                   num_soil_layers,                       &
2389                                   ids,ide, jds,jde, kds,kde,             &
2390                                   ims,ime, jms,jme, kms,kme,             &
2391                                   its,ite, jts,jte, kts,kte              )
2392       ELSE IF ( ( sf_surface_physics .EQ. 3 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
2393          CALL init_soil_depth_3 ( zs , dzs , num_soil_layers )
2395       END IF
2397    END SUBROUTINE process_soil_ideal
2399    SUBROUTINE adjust_soil_temp_new ( tmn , sf_surface_physics , &
2400                                  tsk , ter , toposoil , landmask , flag_toposoil , &
2401                                       st000010 ,      st010040 ,      st040100 ,      st100200 ,      st010200 , &
2402                                  flag_st000010 , flag_st010040 , flag_st040100 , flag_st100200 , flag_st010200 , & 
2403                                       soilt000 ,      soilt005 ,      soilt020 ,      soilt040 ,      soilt160 ,      soilt300 , &
2404                                  flag_soilt000 , flag_soilt005 , flag_soilt020 , flag_soilt040 , flag_soilt160 , flag_soilt300 , &
2405                                  ids , ide , jds , jde , kds , kde , &
2406                                  ims , ime , jms , jme , kms , kme , &
2407                                  its , ite , jts , jte , kts , kte )
2409       IMPLICIT NONE
2410    
2411       INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
2412                               ims , ime , jms , jme , kms , kme , &
2413                               its , ite , jts , jte , kts , kte 
2415       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN)    :: ter , toposoil , landmask
2416       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tmn , tsk
2417       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: st000010 , st010040 , st040100 , st100200 , st010200
2418       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: soilt000 , soilt005 , soilt020 , soilt040 , soilt160 , soilt300
2420       INTEGER , INTENT(IN) :: flag_st000010 , flag_st010040 , flag_st040100 , flag_st100200 , flag_st010200
2421       INTEGER , INTENT(IN) :: flag_soilt000 , flag_soilt005 , flag_soilt020 , flag_soilt040 , flag_soilt160 , flag_soilt300
2422       INTEGER , INTENT(IN) :: sf_surface_physics , flag_toposoil
2424       INTEGER :: i , j
2426       REAL :: soil_elev_min_val ,  soil_elev_max_val , soil_elev_min_dif , soil_elev_max_dif
2428       !  Do we have a soil field with which to modify soil temperatures?
2430       IF ( flag_toposoil .EQ. 1 ) THEN
2432          DO j = jts , MIN(jde-1,jte)
2433             DO i = its , MIN(ide-1,ite)
2435                !  Is the toposoil field OK, or is it a subversive soil elevation field.  We can tell
2436                !  usually by looking at values.  Anything less than -1000 m (lower than the Dead Sea) is
2437                !  bad.  Anything larger than 10 km (taller than Everest) is toast.  Also, anything where 
2438                !  the difference between the soil elevation and the terrain is greater than 3 km means
2439                !  that the soil data is either all zeros or that the data are inconsistent.  Any of these
2440                !  three conditions is grievous enough to induce a WRF fatality.  However, if they are at
2441                !  a water point, then we can safely ignore them.
2442          
2443                soil_elev_min_val = toposoil(i,j) 
2444                soil_elev_max_val = toposoil(i,j) 
2445                soil_elev_min_dif = ter(i,j) - toposoil(i,j)
2446                soil_elev_max_dif = ter(i,j) - toposoil(i,j)
2447          
2448                IF      ( ( soil_elev_min_val .LT. -1000 ) .AND. ( landmask(i,j) .LT. 0.5 ) ) THEN
2449                   CYCLE
2450                ELSE IF ( ( soil_elev_min_val .LT. -1000 ) .AND. ( landmask(i,j) .GT. 0.5 ) ) THEN
2451 !print *,'no soil temperature elevation adjustment, soil height too small = ',toposoil(i,j)
2452 cycle
2453 !                 CALL wrf_error_fatal ( 'TOPOSOIL values have large negative values < -1000 m, unrealistic.' )
2454                ENDIF
2455          
2456                IF      ( ( soil_elev_max_val .GT. 10000 ) .AND. ( landmask(i,j) .LT. 0.5 ) ) THEN
2457                   CYCLE
2458                ELSE IF ( ( soil_elev_max_val .GT. 10000 ) .AND. ( landmask(i,j) .GT. 0.5 ) ) THEN
2459 print *,'no soil temperature elevation adjustment, soil height too high = ',toposoil(i,j)
2460 cycle
2461                   CALL wrf_error_fatal ( 'TOPOSOIL values have large positive values > 10,000 m , unrealistic.' )
2462                ENDIF
2463          
2464                IF      ( ( ( soil_elev_min_dif .LT. -3000 ) .OR. ( soil_elev_max_dif .GT. 3000 ) ) .AND. &
2465                            ( landmask(i,j) .LT. 0.5 ) ) THEN
2466                   CYCLE
2467                ELSE IF ( ( ( soil_elev_min_dif .LT. -3000 ) .OR. ( soil_elev_max_dif .GT. 3000 ) ) .AND. &
2468                            ( landmask(i,j) .GT. 0.5 ) ) THEN
2469 print *,'no soil temperature elevation adjustment, diff of soil height and terrain = ',ter(i,j) - toposoil(i,j)
2470 cycle
2471                   CALL wrf_error_fatal ( 'TOPOSOIL difference with terrain elevation differs by more than 3000 m, unrealistic' )
2472                ENDIF
2474                !  For each of the fields that we would like to modify, check to see if it came in from the SI.
2475                !  If so, then use a -6.5 K/km lapse rate (based on the elevation diffs).  We only adjust when we
2476                !  are not at a water point.
2478                IF (landmask(i,j) .GT. 0.5 ) THEN
2479    
2480                   IF ( sf_surface_physics .EQ. 1 .OR. sf_surface_physics .EQ. 7) THEN
2481                      tmn(i,j) = tmn(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
2482                   END IF
2483                   
2484                   tsk(i,j) = tsk(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
2485       
2486                   IF ( flag_st000010 .EQ. 1 ) THEN
2487                      st000010(i,j) = st000010(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
2488                   END IF
2489                   IF ( flag_st010040 .EQ. 1 ) THEN
2490                      st010040(i,j) = st010040(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
2491                   END IF
2492                   IF ( flag_st040100 .EQ. 1 ) THEN
2493                      st040100(i,j) = st040100(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
2494                   END IF
2495                   IF ( flag_st100200 .EQ. 1 ) THEN
2496                      st100200(i,j) = st100200(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
2497                   END IF
2498                   IF ( flag_st010200 .EQ. 1 ) THEN
2499                      st010200(i,j) = st010200(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
2500                   END IF
2501       
2502                   IF ( flag_soilt000 .EQ. 1 ) THEN
2503                      soilt000(i,j) = soilt000(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
2504                   END IF
2505                   IF ( flag_soilt005 .EQ. 1 ) THEN
2506                      soilt005(i,j) = soilt005(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
2507                   END IF
2508                   IF ( flag_soilt020 .EQ. 1 ) THEN
2509                      soilt020(i,j) = soilt020(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
2510                   END IF
2511                   IF ( flag_soilt040 .EQ. 1 ) THEN
2512                      soilt040(i,j) = soilt040(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
2513                   END IF
2514                   IF ( flag_soilt160 .EQ. 1 ) THEN
2515                      soilt160(i,j) = soilt160(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
2516                   END IF
2517                   IF ( flag_soilt300 .EQ. 1 ) THEN
2518                      soilt300(i,j) = soilt300(i,j) - 0.0065 * ( ter(i,j) - toposoil(i,j) )
2519                   END IF
2520    
2521                END IF
2522             END DO
2523          END DO
2525       END IF
2527    END SUBROUTINE adjust_soil_temp_new
2530    SUBROUTINE init_soil_depth_1 ( zs , dzs , num_soil_layers )
2532       IMPLICIT NONE
2533    
2534       INTEGER, INTENT(IN) :: num_soil_layers
2535    
2536       REAL, DIMENSION(1:num_soil_layers), INTENT(OUT)  ::  zs,dzs
2537    
2538       INTEGER                   ::      l
2540       CHARACTER (LEN=132) :: message
2542       !  Define layers (top layer = 0.01 m).  Double the thicknesses at each step (dzs values).
2543       !  The distance from the ground level to the midpoint of the layer is given by zs.
2545       !    -------   Ground Level   ----------      ||      ||   ||  || 
2546       !                                             ||      ||   ||  || zs(1) = 0.005 m
2547       !    --  --  --  --  --  --  --  --  --       ||      ||   ||  \/
2548       !                                             ||      ||   ||
2549       !    -----------------------------------      ||  ||  ||   \/   dzs(1) = 0.01 m
2550       !                                             ||  ||  || 
2551       !                                             ||  ||  || zs(2) = 0.02
2552       !    --  --  --  --  --  --  --  --  --       ||  ||  \/
2553       !                                             ||  ||
2554       !                                             ||  ||
2555       !    -----------------------------------  ||  ||  \/   dzs(2) = 0.02 m
2556       !                                         ||  || 
2557       !                                         ||  ||
2558       !                                         ||  || 
2559       !                                         ||  || zs(3) = 0.05
2560       !    --  --  --  --  --  --  --  --  --   ||  \/
2561       !                                         ||
2562       !                                         ||
2563       !                                         ||
2564       !                                         ||
2565       !    -----------------------------------  \/   dzs(3) = 0.04 m
2567       IF ( num_soil_layers .NE. 5 ) THEN
2568          write(message,FMT= '(A)') 'Usually, the 5-layer diffusion uses 5 layers.  Change this in the namelist.'
2569          CALL wrf_error_fatal ( message )
2570       END IF
2571    
2572       dzs(1)=.01
2573       zs(1)=.5*dzs(1)
2574    
2575       DO l=2,num_soil_layers
2576          dzs(l)=2*dzs(l-1)
2577          zs(l)=zs(l-1)+.5*dzs(l-1)+.5*dzs(l)
2578       ENDDO
2580    END SUBROUTINE init_soil_depth_1
2582    SUBROUTINE init_soil_depth_2 ( zs , dzs , num_soil_layers )
2584       IMPLICIT NONE
2585    
2586       INTEGER, INTENT(IN) :: num_soil_layers
2587    
2588       REAL, DIMENSION(1:num_soil_layers), INTENT(OUT)  ::  zs,dzs
2589    
2590       INTEGER                   ::      l
2592       CHARACTER (LEN=132) :: message
2594       dzs = (/ 0.1 , 0.3 , 0.6 , 1.0 /)
2596       IF ( num_soil_layers .NE. 4 ) THEN
2597          write(message,FMT='(A)') 'Usually, the LSM uses 4 layers.  Change this in the namelist.'
2598          CALL wrf_error_fatal ( message )
2599       END IF
2601       zs(1)=.5*dzs(1)
2602    
2603       DO l=2,num_soil_layers
2604          zs(l)=zs(l-1)+.5*dzs(l-1)+.5*dzs(l)
2605       ENDDO
2607    END SUBROUTINE init_soil_depth_2
2609    SUBROUTINE init_soil_depth_3 ( zs , dzs , num_soil_layers )
2611       IMPLICIT NONE
2612    
2613       INTEGER, INTENT(IN) :: num_soil_layers
2614    
2615       REAL, DIMENSION(1:num_soil_layers), INTENT(OUT)  ::  zs,dzs
2616    
2617       INTEGER                   ::      l
2619       CHARACTER (LEN=132) :: message
2621 ! in RUC LSM ZS - soil levels, and DZS - soil layer thicknesses, not used
2622 ! ZS is specified in the namelist: num_soil_layers = 6 or 9.
2623 ! Other options with number of levels are possible, but
2624 ! WRF users should change consistently the namelist entry with the
2625 !    ZS array in this subroutine.
2627      IF ( num_soil_layers .EQ. 6) THEN
2628       zs  = (/ 0.00 , 0.05 , 0.20 , 0.40 , 1.60 , 3.00 /)
2629 !      dzs = (/ 0.00 , 0.125, 0.175 , 0.70 , 1.30 , 1.40 /)
2630      ELSEIF ( num_soil_layers .EQ. 9) THEN
2631       zs  = (/ 0.00 , 0.05 , 0.20 , 0.40 , 0.60, 1.00, 1.60 , 2.20, 3.00 /)
2632 !      dzs = (/ 0.00 , 0.125, 0.175 , 0.70 , 1.30 , 1.40 /)
2633      ENDIF
2635       IF ( num_soil_layers .EQ. 4 .OR. num_soil_layers .EQ. 5 ) THEN
2636          WRITE(message,FMT= '(A)')'Usually, the RUC LSM uses 6, 9 or more levels.  Change this in the namelist.'
2637          CALL wrf_error_fatal ( message )
2638       END IF
2640    END SUBROUTINE init_soil_depth_3
2642    SUBROUTINE init_soil_1_real ( tsk , tmn , tslb , zs , dzs , &
2643                                  num_soil_layers , real_data_init_type , &
2644                                  landmask , sst , flag_sst , &
2645                                  ids , ide , jds , jde , kds , kde , &
2646                                  ims , ime , jms , jme , kms , kme , &
2647                                  its , ite , jts , jte , kts , kte )
2649       IMPLICIT NONE
2651       INTEGER , INTENT(IN) :: num_soil_layers , real_data_init_type , &
2652                               ids , ide , jds , jde , kds , kde , &
2653                               ims , ime , jms , jme , kms , kme , &
2654                               its , ite , jts , jte , kts , kte 
2656       INTEGER , INTENT(IN) :: flag_sst
2658       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst
2659       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tsk , tmn
2661       REAL , DIMENSION(num_soil_layers) :: zs , dzs
2663       REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb
2665       INTEGER :: i , j , l
2667       !  Soil temperature is linearly interpolated between the skin temperature (taken to be at a
2668       !  depth of 0.5 cm) and the deep soil, annual temperature (taken to be at a depth of 23 cm).
2669       !  The tslb(i,1,j) is the skin temperature, and the tslb(i,num_soil_layers,j) level is the 
2670       !  annual mean temperature.
2672       DO j = jts , MIN(jde-1,jte)
2673          DO i = its , MIN(ide-1,ite)
2674             IF ( landmask(i,j) .GT. 0.5 ) THEN
2675                DO l = 1 , num_soil_layers
2676                   tslb(i,l,j)= ( tsk(i,j) * ( zs(num_soil_layers) - zs(l) )   + &
2677                                  tmn(i,j) * ( zs(              l) - zs(1) ) ) / &
2678                                             ( zs(num_soil_layers) - zs(1) )
2679                END DO
2680             ELSE
2681                IF ( ( real_data_init_type .EQ. 1 ) .AND. ( flag_sst .EQ. 1 ) ) THEN
2682                   DO l = 1 , num_soil_layers
2683                      tslb(i,l,j)= sst(i,j)
2684                   END DO
2685                ELSE
2686                   DO l = 1 , num_soil_layers
2687                      tslb(i,l,j)= tsk(i,j)
2688                   END DO
2689                END IF
2690             END IF
2691          END DO
2692       END DO
2694    END SUBROUTINE init_soil_1_real
2696    SUBROUTINE init_soil_1_ideal(tsk,tmn,tslb,xland,             &
2697                        ivgtyp,ZS,DZS,num_soil_layers,           &
2698                        ids,ide, jds,jde, kds,kde,               &
2699                        ims,ime, jms,jme, kms,kme,               &
2700                        its,ite, jts,jte, kts,kte                )
2702       IMPLICIT NONE
2703    
2704       INTEGER, INTENT(IN   )    ::      ids,ide, jds,jde, kds,kde, &
2705                                         ims,ime, jms,jme, kms,kme, &
2706                                         its,ite, jts,jte, kts,kte
2707    
2708       INTEGER, INTENT(IN   )    ::      num_soil_layers
2709    
2710       REAL, DIMENSION( ims:ime , 1 , jms:jme ), INTENT(OUT) :: tslb
2711       REAL, DIMENSION( ims:ime , jms:jme ), INTENT(OUT) :: xland
2712       INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(OUT) :: ivgtyp
2713    
2714       REAL, DIMENSION(1:), INTENT(IN) :: dzs,zs
2715    
2716       REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(IN) :: tsk, tmn
2718       !  Lcal variables.
2719    
2720       INTEGER :: l,j,i,itf,jtf
2721    
2722       itf=MIN(ite,ide-1)
2723       jtf=MIN(jte,jde-1)
2724    
2725       IF (num_soil_layers.NE.1)THEN
2726          DO j=jts,jtf
2727             DO l=1,num_soil_layers
2728                DO i=its,itf
2729                  tslb(i,l,j)=( tsk(i,j)*(zs(num_soil_layers)-zs(l)) + tmn(i,j)*(zs(l)-zs(1)) ) / &
2730                              ( zs(num_soil_layers)-zs(1) )
2731                ENDDO
2732             ENDDO
2733          ENDDO
2734       ENDIF
2735       DO j=jts,jtf
2736          DO i=its,itf
2737            xland(i,j)  = 2
2738            ivgtyp(i,j) = 7
2739          ENDDO
2740       ENDDO
2742    END SUBROUTINE init_soil_1_ideal
2744    SUBROUTINE init_soil_2_real ( tsk , tmn , smois , sh2o , tslb , &
2745                                  st_input , sm_input , sw_input , landmask , sst , &
2746                                  zs , dzs , &
2747                                  st_levels_input , sm_levels_input , sw_levels_input , &
2748                                  num_soil_layers , num_st_levels_input , num_sm_levels_input ,  num_sw_levels_input , &
2749                                  num_st_levels_alloc , num_sm_levels_alloc ,  num_sw_levels_alloc , &
2750                                  flag_sst , flag_soilt000 , flag_soilm000 , &
2751                                  ids , ide , jds , jde , kds , kde , &
2752                                  ims , ime , jms , jme , kms , kme , &
2753                                  its , ite , jts , jte , kts , kte )
2755       IMPLICIT NONE
2757       INTEGER , INTENT(IN) :: num_soil_layers , &
2758                               num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
2759                               num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , &
2760                               ids , ide , jds , jde , kds , kde , &
2761                               ims , ime , jms , jme , kms , kme , &
2762                               its , ite , jts , jte , kts , kte 
2764       INTEGER , INTENT(IN) :: flag_sst, flag_soilt000, flag_soilm000
2766       INTEGER , DIMENSION(1:num_st_levels_input) , INTENT(INOUT) :: st_levels_input
2767       INTEGER , DIMENSION(1:num_sm_levels_input) , INTENT(INOUT) :: sm_levels_input
2768       INTEGER , DIMENSION(1:num_sw_levels_input) , INTENT(INOUT) :: sw_levels_input
2770       REAL , DIMENSION(ims:ime,1:num_st_levels_alloc,jms:jme) , INTENT(INOUT) :: st_input
2771       REAL , DIMENSION(ims:ime,1:num_sm_levels_alloc,jms:jme) , INTENT(INOUT) :: sm_input
2772       REAL , DIMENSION(ims:ime,1:num_sw_levels_alloc,jms:jme) , INTENT(INOUT) :: sw_input
2773       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst
2775       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tmn
2776       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tsk
2777       REAL , DIMENSION(num_soil_layers) :: zs , dzs
2779       REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb , smois , sh2o
2781       REAL , ALLOCATABLE , DIMENSION(:) :: zhave
2783       INTEGER :: i , j , l , lout , lin , lwant , lhave , num
2784       REAL :: temp
2785       LOGICAL :: found_levels
2787       CHARACTER (LEN=132) :: message
2789       !  Are there any soil temp and moisture levels - ya know, they are mandatory.
2791       num = num_st_levels_input * num_sm_levels_input
2793       IF ( num .GE. 1 ) THEN
2795          !  Ordered levels that we have data for.
2796          IF ( flag_soilt000 .eq. 1 ) THEN
2797            write(message, FMT='(A)') ' Assume RUC LSM 6-level input'
2798            CALL wrf_message ( message )
2799            ALLOCATE ( zhave( MAX(num_st_levels_input,num_sm_levels_input,num_sw_levels_input)  ) )
2800          ELSE
2801            write(message, FMT='(A)') ' Assume Noah LSM input'
2802            CALL wrf_message ( message )
2803          ALLOCATE ( zhave( MAX(num_st_levels_input,num_sm_levels_input,num_sw_levels_input) +2) )
2804          END IF
2807          !  Sort the levels for temperature.
2808 !print*,'num_st_levels_input, st_levels_input', num_st_levels_input, st_levels_input
2809 !print*,'num_sm_levels_input,num_sw_levels_input',num_sm_levels_input,num_sw_levels_input
2810    
2811          outert : DO lout = 1 , num_st_levels_input-1
2812             innert : DO lin = lout+1 , num_st_levels_input
2813                IF ( st_levels_input(lout) .GT. st_levels_input(lin) ) THEN
2814                   temp = st_levels_input(lout) 
2815                   st_levels_input(lout) = st_levels_input(lin)
2816                   st_levels_input(lin) = NINT(temp)
2817                   DO j = jts , MIN(jde-1,jte)
2818                      DO i = its , MIN(ide-1,ite)
2819                         temp = st_input(i,lout+1,j)
2820                         st_input(i,lout+1,j) = st_input(i,lin+1,j)
2821                         st_input(i,lin+1,j) = temp
2822                      END DO
2823                   END DO
2824                END IF
2825             END DO innert
2826          END DO outert
2827 !tgs add IF
2828       IF ( flag_soilt000 .NE. 1 ) THEN
2829          DO j = jts , MIN(jde-1,jte)
2830             DO i = its , MIN(ide-1,ite)
2831                st_input(i,1,j) = tsk(i,j)
2832                st_input(i,num_st_levels_input+2,j) = tmn(i,j)
2833             END DO
2834          END DO
2835       ENDIF
2838 #if ( NMM_CORE == 1 )
2839 !new
2840 !       write(0,*) 'st_input(1) in init_soil_2_real'
2841 !       DO J=MIN(jde-1,jte),JTS, -MIN(jde-1,jte)/15
2842 !       write(0,616) (st_input(I,1,J),I=its , MIN(ide-1,ite),MIN(ide-1,ite)/10)
2843 !       ENDDO
2845 !       write(0,*) 'st_input(2) in init_soil_2_real'
2846 !       DO J=MIN(jde-1,jte),JTS, -MIN(jde-1,jte)/15
2847 !       write(0,616) (st_input(I,2,J),I=its , MIN(ide-1,ite),MIN(ide-1,ite)/10)
2848 !       ENDDO
2850   616   format(20(f4.0,1x))
2851 #endif
2852    
2853          !  Sort the levels for moisture.
2854    
2855          outerm: DO lout = 1 , num_sm_levels_input-1
2856             innerm : DO lin = lout+1 , num_sm_levels_input
2857                IF ( sm_levels_input(lout) .GT. sm_levels_input(lin) ) THEN
2858                   temp = sm_levels_input(lout) 
2859                   sm_levels_input(lout) = sm_levels_input(lin)
2860                   sm_levels_input(lin) = NINT(temp)
2861                   DO j = jts , MIN(jde-1,jte)
2862                      DO i = its , MIN(ide-1,ite)
2863                         temp = sm_input(i,lout+1,j)
2864                         sm_input(i,lout+1,j) = sm_input(i,lin+1,j)
2865                         sm_input(i,lin+1,j) = temp
2866                      END DO
2867                   END DO
2868                END IF
2869             END DO innerm
2870          END DO outerm
2871 !tgs add IF
2872       IF ( flag_soilm000 .NE. 1 ) THEN
2873          DO j = jts , MIN(jde-1,jte)
2874             DO i = its , MIN(ide-1,ite)
2875                sm_input(i,1,j) = sm_input(i,2,j)
2876                sm_input(i,num_sm_levels_input+2,j) = sm_input(i,num_sm_levels_input+1,j)
2877             END DO
2878          END DO
2879       ENDIF
2880    
2881          !  Sort the levels for liquid moisture.
2882    
2883          outerw: DO lout = 1 , num_sw_levels_input-1
2884             innerw : DO lin = lout+1 , num_sw_levels_input
2885                IF ( sw_levels_input(lout) .GT. sw_levels_input(lin) ) THEN
2886                   temp = sw_levels_input(lout) 
2887                   sw_levels_input(lout) = sw_levels_input(lin)
2888                   sw_levels_input(lin) = NINT(temp)
2889                   DO j = jts , MIN(jde-1,jte)
2890                      DO i = its , MIN(ide-1,ite)
2891                         temp = sw_input(i,lout+1,j)
2892                         sw_input(i,lout+1,j) = sw_input(i,lin+1,j)
2893                         sw_input(i,lin+1,j) = temp
2894                      END DO
2895                   END DO
2896                END IF
2897             END DO innerw
2898          END DO outerw
2899          IF ( num_sw_levels_input .GT. 1 ) THEN
2900             DO j = jts , MIN(jde-1,jte)
2901                DO i = its , MIN(ide-1,ite)
2902                   sw_input(i,1,j) = sw_input(i,2,j)
2903                   sw_input(i,num_sw_levels_input+2,j) = sw_input(i,num_sw_levels_input+1,j)
2904                END DO
2905             END DO
2906          END IF
2908          found_levels = .TRUE.
2910       ELSE IF ( ( num .LE. 0 ) .AND. (  start_date .NE. current_date ) ) THEN
2912          found_levels = .FALSE.
2914       ELSE
2915          CALL wrf_error_fatal ( &
2916          'No input soil level data (temperature, moisture or liquid, or all are missing). Required for LSM.' )
2917       END IF
2919       !  Is it OK to continue?
2921       IF ( found_levels ) THEN
2923 !tgs add IF
2924       IF ( flag_soilt000 .NE.1) THEN
2925 !tgs initialize from Noah data
2926          !  Here are the levels that we have from the input for temperature.  The input levels plus
2927          !  two more: the skin temperature at 0 cm, and the annual mean temperature at 300 cm.
2929          zhave(1) = 0.
2930          DO l = 1 , num_st_levels_input
2931             zhave(l+1) = st_levels_input(l) / 100.
2932          END DO
2933          zhave(num_st_levels_input+2) = 300. / 100.
2934    
2935          !  Interpolate between the layers we have (zhave) and those that we want (zs).
2936    
2937          z_wantt : DO lwant = 1 , num_soil_layers
2938             z_havet : DO lhave = 1 , num_st_levels_input +2 -1
2939                IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
2940                     ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
2941                   DO j = jts , MIN(jde-1,jte)
2942                      DO i = its , MIN(ide-1,ite)
2943                         tslb(i,lwant,j)= ( st_input(i,lhave  ,j) * ( zhave(lhave+1) - zs   (lwant) ) + &
2944                                            st_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
2945                                                                    ( zhave(lhave+1) - zhave(lhave) )
2946                      END DO
2947                   END DO
2948                   EXIT z_havet
2949                END IF
2950             END DO z_havet
2951          END DO z_wantt
2953      ELSE
2955 !tgs initialize from RUCLSM data
2956          DO l = 1 , num_st_levels_input
2957             zhave(l) = st_levels_input(l) / 100.
2958          END DO
2960       !  Interpolate between the layers we have (zhave) and those that we want (zs).
2963       z_wantt_2 : DO lwant = 1 , num_soil_layers
2964          z_havet_2 : DO lhave = 1 , num_st_levels_input -1
2965             IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
2966                  ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
2967                DO j = jts , MIN(jde-1,jte)
2968                   DO i = its , MIN(ide-1,ite)
2969                      tslb(i,lwant,j)= ( st_input(i,lhave,j ) * ( zhave(lhave+1) - zs   (lwant) ) + &
2970                                         st_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
2971                                                                 ( zhave(lhave+1) - zhave(lhave) )
2972                   END DO
2973                END DO
2974                EXIT z_havet_2
2975             END IF
2976          END DO z_havet_2
2977       END DO z_wantt_2
2979       ENDIF
2982       IF ( flag_soilm000 .NE. 1 ) THEN
2983 !tgs initialize from Noah
2984          !  Here are the levels that we have from the input for moisture.  The input levels plus
2985          !  two more: a value at 0 cm and one at 300 cm.  The 0 cm value is taken to be identical
2986          !  to the most shallow layer's value.  Similarly, the 300 cm value is taken to be the same
2987          !  as the most deep layer's value.
2988    
2989          zhave(1) = 0.
2990          DO l = 1 , num_sm_levels_input
2991             zhave(l+1) = sm_levels_input(l) / 100.
2992          END DO
2993          zhave(num_sm_levels_input+2) = 300. / 100.
2994    
2995          !  Interpolate between the layers we have (zhave) and those that we want (zs).
2996    
2997          z_wantm : DO lwant = 1 , num_soil_layers
2998             z_havem : DO lhave = 1 , num_sm_levels_input +2 -1
2999                IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
3000                     ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
3001                   DO j = jts , MIN(jde-1,jte)
3002                      DO i = its , MIN(ide-1,ite)
3003                         smois(i,lwant,j)= ( sm_input(i,lhave  ,j) * ( zhave(lhave+1) - zs   (lwant) ) + &
3004                                             sm_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
3005                                                                     ( zhave(lhave+1) - zhave(lhave) )
3006                      END DO
3007                   END DO
3008                   EXIT z_havem
3009                END IF
3010             END DO z_havem
3011          END DO z_wantm
3012    
3013      ELSE
3015 !tgs  initialize from RUCLSM data
3016          DO l = 1 , num_sm_levels_input
3017             zhave(l) = sm_levels_input(l) / 100.
3018          END DO
3020       !  Interpolate between the layers we have (zhave) and those that we want (zs).
3022       z_wantm_2 : DO lwant = 1 , num_soil_layers
3023          z_havem_2 : DO lhave = 1 , num_sm_levels_input -1
3024             IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
3025                  ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
3026                DO j = jts , MIN(jde-1,jte)
3027                   DO i = its , MIN(ide-1,ite)
3028                      smois(i,lwant,j)= ( sm_input(i,lhave,j ) * ( zhave(lhave+1) - zs   (lwant) ) + &
3029                                          sm_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
3030                                                                  ( zhave(lhave+1) - zhave(lhave) )
3031                   END DO
3032                END DO
3033                EXIT z_havem_2
3034              END IF
3035          END DO z_havem_2
3036       END DO z_wantm_2
3038      ENDIF
3039          !  Any liquid soil moisture to worry about?
3040    
3041          IF ( num_sw_levels_input .GT. 1 ) THEN
3042    
3043             zhave(1) = 0.
3044             DO l = 1 , num_sw_levels_input
3045                zhave(l+1) = sw_levels_input(l) / 100.
3046             END DO
3047             zhave(num_sw_levels_input+2) = 300. / 100.
3048       
3049             !  Interpolate between the layers we have (zhave) and those that we want (zs).
3050       
3051             z_wantw : DO lwant = 1 , num_soil_layers
3052                z_havew : DO lhave = 1 , num_sw_levels_input +2 -1
3053                   IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
3054                        ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
3055                      DO j = jts , MIN(jde-1,jte)
3056                         DO i = its , MIN(ide-1,ite)
3057                            sh2o(i,lwant,j)= ( sw_input(i,lhave  ,j) * ( zhave(lhave+1) - zs   (lwant) ) + &
3058                                                sw_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
3059                                                                        ( zhave(lhave+1) - zhave(lhave) )
3060                         END DO
3061                      END DO
3062                      EXIT z_havew
3063                   END IF
3064                END DO z_havew
3065             END DO z_wantw
3066    
3067          END IF
3068    
3069    
3070          !  Over water, put in reasonable values for soil temperature and moisture.  These won't be
3071          !  used, but they will make a more continuous plot.
3072    
3073          IF ( flag_sst .EQ. 1 ) THEN
3074             DO j = jts , MIN(jde-1,jte)
3075                DO i = its , MIN(ide-1,ite)
3076                   IF ( landmask(i,j) .LT. 0.5 ) THEN
3077                      DO l = 1 , num_soil_layers
3078                         tslb(i,l,j)= sst(i,j)
3079 !tgs add line for tsk
3080                         tsk(i,j)    = sst(i,j)
3081                         smois(i,l,j)= 1.0
3082                         sh2o (i,l,j)= 1.0
3083                      END DO
3084                   END IF
3085                END DO
3086             END DO
3087          ELSE
3088             DO j = jts , MIN(jde-1,jte)
3089                DO i = its , MIN(ide-1,ite)
3090                   IF ( landmask(i,j) .LT. 0.5 ) THEN
3091                      DO l = 1 , num_soil_layers
3092                         tslb(i,l,j)= tsk(i,j)
3093                         smois(i,l,j)= 1.0
3094                         sh2o (i,l,j)= 1.0
3095                      END DO
3096                   END IF
3097                END DO
3098             END DO
3099          END IF
3100    
3101          DEALLOCATE (zhave)
3103       END IF
3105    END SUBROUTINE init_soil_2_real
3107    SUBROUTINE init_soil_2_ideal ( xland,xice,vegfra,snow,canwat,     &
3108                      ivgtyp,isltyp,tslb,smois,tmn,                  &
3109                      num_soil_layers,                               &
3110                      ids,ide, jds,jde, kds,kde,                     &
3111                      ims,ime, jms,jme, kms,kme,                     &
3112                      its,ite, jts,jte, kts,kte                      )
3114       IMPLICIT NONE 
3115    
3116       INTEGER, INTENT(IN) ::ids,ide, jds,jde, kds,kde,  &
3117                             ims,ime, jms,jme, kms,kme,  &
3118                             its,ite, jts,jte, kts,kte
3119    
3120       INTEGER, INTENT(IN) ::num_soil_layers
3121    
3122       REAL, DIMENSION( ims:ime, num_soil_layers, jms:jme ) , INTENT(OUT) :: smois, tslb 
3123    
3124       REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT)  :: xland, snow, canwat, xice, vegfra, tmn
3125    
3126       INTEGER, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT) :: ivgtyp, isltyp
3127    
3128       INTEGER :: icm,jcm,itf,jtf
3129       INTEGER ::  i,j,l
3130    
3131       itf=min0(ite,ide-1)
3132       jtf=min0(jte,jde-1)
3133    
3134       icm = ide/2
3135       jcm = jde/2
3136    
3137       DO j=jts,jtf
3138          DO l=1,num_soil_layers
3139             DO i=its,itf
3140    
3141                smois(i,1,j)=0.10
3142                smois(i,2,j)=0.10
3143                smois(i,3,j)=0.10
3144                smois(i,4,j)=0.10
3145       
3146                tslb(i,1,j)=295.           
3147                tslb(i,2,j)=297.          
3148                tslb(i,3,j)=293.         
3149                tslb(i,4,j)=293. 
3151             ENDDO
3152          ENDDO
3153       ENDDO                                 
3155       DO j=jts,jtf
3156          DO i=its,itf
3157             xland(i,j)  =   2
3158             tmn(i,j)    = 294. 
3159             xice(i,j)   =   0.
3160             vegfra(i,j) =   0. 
3161             snow(i,j)   =   0.
3162             canwat(i,j) =   0.
3163             ivgtyp(i,j) =   7
3164             isltyp(i,j) =   8
3165          ENDDO
3166       ENDDO
3168    END SUBROUTINE init_soil_2_ideal
3170    SUBROUTINE init_soil_3_real ( tsk , tmn , smois , tslb , &
3171                                  st_input , sm_input , landmask, sst, &
3172                                  zs , dzs , &
3173                                  st_levels_input , sm_levels_input , &
3174                                  num_soil_layers , num_st_levels_input , num_sm_levels_input ,  &
3175                                  num_st_levels_alloc , num_sm_levels_alloc , &
3176                                  flag_sst , flag_soilt000 , flag_soilm000 , &
3177                                  ids , ide , jds , jde , kds , kde , &
3178                                  ims , ime , jms , jme , kms , kme , &
3179                                  its , ite , jts , jte , kts , kte )
3181       IMPLICIT NONE
3183       INTEGER , INTENT(IN) :: num_soil_layers , &
3184                               num_st_levels_input , num_sm_levels_input , &
3185                               num_st_levels_alloc , num_sm_levels_alloc , &
3186                               ids , ide , jds , jde , kds , kde , &
3187                               ims , ime , jms , jme , kms , kme , &
3188                               its , ite , jts , jte , kts , kte
3190       INTEGER , INTENT(IN) :: flag_sst, flag_soilt000, flag_soilm000
3192       INTEGER , DIMENSION(1:num_st_levels_input) , INTENT(INOUT) :: st_levels_input
3193       INTEGER , DIMENSION(1:num_sm_levels_input) , INTENT(INOUT) :: sm_levels_input
3195       REAL , DIMENSION(ims:ime,1:num_st_levels_alloc,jms:jme) , INTENT(INOUT) :: st_input
3196       REAL , DIMENSION(ims:ime,1:num_sm_levels_alloc,jms:jme) , INTENT(INOUT) :: sm_input
3197       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst
3199       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tmn
3200       REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tsk
3201       REAL , DIMENSION(num_soil_layers) :: zs , dzs
3203       REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb , smois
3205       REAL , ALLOCATABLE , DIMENSION(:) :: zhave
3207       INTEGER :: i , j , l , lout , lin , lwant , lhave
3208       REAL :: temp
3210       !  Allocate the soil layer array used for interpolating.
3212       IF ( ( num_st_levels_input .LE. 0 ) .OR. & 
3213            ( num_sm_levels_input .LE. 0 ) ) THEN
3214          PRINT '(A)','No input soil level data (either temperature or moisture, or both are missing).  Required for RUC LSM.'
3215          CALL wrf_error_fatal ( 'no soil data' )
3216       ELSE
3217          IF ( flag_soilt000 .eq. 1 ) THEN
3218            PRINT '(A)',' Assume RUC LSM 6-level input'
3219            ALLOCATE ( zhave( MAX(num_st_levels_input,num_sm_levels_input)  ) )
3220          ELSE
3221            PRINT '(A)',' Assume non-RUC LSM input'
3222            ALLOCATE ( zhave( MAX(num_st_levels_input,num_soil_layers)  ) )
3223          END IF
3224       END IF
3226       !  Sort the levels for temperature.
3228       outert : DO lout = 1 , num_st_levels_input-1
3229          innert : DO lin = lout+1 , num_st_levels_input
3230             IF ( st_levels_input(lout) .GT. st_levels_input(lin) ) THEN
3231                temp = st_levels_input(lout) 
3232                st_levels_input(lout) = st_levels_input(lin)
3233                st_levels_input(lin) = NINT(temp)
3234                DO j = jts , MIN(jde-1,jte)
3235                   DO i = its , MIN(ide-1,ite)
3236                      temp = st_input(i,lout,j)
3237                      st_input(i,lout,j) = st_input(i,lin,j)
3238                      st_input(i,lin,j) = temp
3239                   END DO
3240                END DO
3241             END IF
3242          END DO innert
3243       END DO outert
3245       IF ( flag_soilt000 .NE. 1 ) THEN
3246       DO j = jts , MIN(jde-1,jte)
3247          DO i = its , MIN(ide-1,ite)
3248             st_input(i,1,j) = tsk(i,j)
3249             st_input(i,num_st_levels_input+2,j) = tmn(i,j)
3250          END DO
3251       END DO
3252       END IF
3254       !  Sort the levels for moisture.
3256       outerm: DO lout = 1 , num_sm_levels_input-1
3257          innerm : DO lin = lout+1 , num_sm_levels_input
3258             IF ( sm_levels_input(lout) .GT. sm_levels_input(lin) ) THEN
3259                temp = sm_levels_input(lout) 
3260                sm_levels_input(lout) = sm_levels_input(lin)
3261                sm_levels_input(lin) = NINT(temp)
3262                DO j = jts , MIN(jde-1,jte)
3263                   DO i = its , MIN(ide-1,ite)
3264                      temp = sm_input(i,lout,j)
3265                      sm_input(i,lout,j) = sm_input(i,lin,j)
3266                      sm_input(i,lin,j) = temp
3267                   END DO
3268                END DO
3269             END IF
3270          END DO innerm
3271       END DO outerm
3273       IF ( flag_soilm000 .NE. 1 ) THEN
3274       DO j = jts , MIN(jde-1,jte)
3275          DO i = its , MIN(ide-1,ite)
3276             sm_input(i,1,j) = sm_input(i,2,j)
3277             sm_input(i,num_sm_levels_input+2,j) = sm_input(i,num_sm_levels_input+1,j)
3278          END DO
3279       END DO
3280       END IF
3282       !  Here are the levels that we have from the input for temperature.
3284       IF ( flag_soilt000 .EQ. 1 ) THEN
3285          DO l = 1 , num_st_levels_input
3286             zhave(l) = st_levels_input(l) / 100.
3287          END DO
3289       !  Interpolate between the layers we have (zhave) and those that we want (zs).
3291       z_wantt : DO lwant = 1 , num_soil_layers
3292          z_havet : DO lhave = 1 , num_st_levels_input -1
3293             IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
3294                  ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
3295                DO j = jts , MIN(jde-1,jte)
3296                   DO i = its , MIN(ide-1,ite)
3297                      tslb(i,lwant,j)= ( st_input(i,lhave,j ) * ( zhave(lhave+1) - zs   (lwant) ) + &
3298                                         st_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
3299                                                                 ( zhave(lhave+1) - zhave(lhave) )
3300                   END DO
3301                END DO
3302                EXIT z_havet
3303             END IF
3304          END DO z_havet
3305       END DO z_wantt
3307       ELSE
3309          zhave(1) = 0.
3310          DO l = 1 , num_st_levels_input
3311             zhave(l+1) = st_levels_input(l) / 100.
3312          END DO
3313          zhave(num_st_levels_input+2) = 300. / 100.
3315       !  Interpolate between the layers we have (zhave) and those that we want (zs).
3317       z_wantt_2 : DO lwant = 1 , num_soil_layers
3318          z_havet_2 : DO lhave = 1 , num_st_levels_input +2
3319             IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
3320                  ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
3321                DO j = jts , MIN(jde-1,jte)
3322                   DO i = its , MIN(ide-1,ite)
3323                      tslb(i,lwant,j)= ( st_input(i,lhave,j ) * ( zhave(lhave+1) - zs   (lwant) ) + &
3324                                         st_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
3325                                                                 ( zhave(lhave+1) - zhave(lhave) )
3326                   END DO
3327                END DO
3328                EXIT z_havet_2
3329             END IF
3330          END DO z_havet_2
3331       END DO z_wantt_2
3333       END IF
3335       !  Here are the levels that we have from the input for moisture.
3337       IF ( flag_soilm000 .EQ. 1 ) THEN
3338          DO l = 1 , num_sm_levels_input
3339             zhave(l) = sm_levels_input(l) / 100.
3340          END DO
3342       !  Interpolate between the layers we have (zhave) and those that we want (zs).
3344       z_wantm : DO lwant = 1 , num_soil_layers
3345          z_havem : DO lhave = 1 , num_sm_levels_input -1
3346             IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
3347                  ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
3348                DO j = jts , MIN(jde-1,jte)
3349                   DO i = its , MIN(ide-1,ite)
3350                      smois(i,lwant,j)= ( sm_input(i,lhave,j ) * ( zhave(lhave+1) - zs   (lwant) ) + &
3351                                          sm_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
3352                                                                  ( zhave(lhave+1) - zhave(lhave) )
3353                   END DO
3354                END DO
3355                EXIT z_havem
3356             END IF
3357          END DO z_havem
3358       END DO z_wantm
3360       ELSE
3362          zhave(1) = 0.
3363          DO l = 1 , num_sm_levels_input
3364             zhave(l+1) = sm_levels_input(l) / 100.
3365          END DO
3366          zhave(num_sm_levels_input+2) = 300. / 100.
3368       z_wantm_2 : DO lwant = 1 , num_soil_layers
3369          z_havem_2 : DO lhave = 1 , num_sm_levels_input +2
3370             IF ( ( zs(lwant) .GE. zhave(lhave  ) ) .AND. &
3371                  ( zs(lwant) .LE. zhave(lhave+1) ) ) THEN
3372                DO j = jts , MIN(jde-1,jte)
3373                   DO i = its , MIN(ide-1,ite)
3374                      smois(i,lwant,j)= ( sm_input(i,lhave,j ) * ( zhave(lhave+1) - zs   (lwant) ) + &
3375                                          sm_input(i,lhave+1,j) * ( zs   (lwant  ) - zhave(lhave) ) ) / &
3376                                                                  ( zhave(lhave+1) - zhave(lhave) )
3377                   END DO
3378                END DO
3379                EXIT z_havem_2
3380             END IF
3381          END DO z_havem_2
3382       END DO z_wantm_2
3384       END IF
3385       !  Over water, put in reasonable values for soil temperature and moisture.  These won't be
3386       !  used, but they will make a more continuous plot.
3388       IF ( flag_sst .EQ. 1 ) THEN
3389          DO j = jts , MIN(jde-1,jte)
3390             DO i = its , MIN(ide-1,ite)
3391                IF ( landmask(i,j) .LT. 0.5 ) THEN
3392                   DO l = 1 , num_soil_layers
3393                      tslb(i,l,j) = sst(i,j)
3394                      tsk(i,j)    = sst(i,j)
3395                      smois(i,l,j)= 1.0
3396                   END DO
3397                END IF
3398             END DO
3399          END DO
3400       ELSE
3401          DO j = jts , MIN(jde-1,jte)
3402             DO i = its , MIN(ide-1,ite)
3403                IF ( landmask(i,j) .LT. 0.5 ) THEN
3404                   DO l = 1 , num_soil_layers
3405                      tslb(i,l,j)= tsk(i,j)
3406                      smois(i,l,j)= 1.0
3407                   END DO
3408                END IF
3409             END DO
3410          END DO
3411       END IF
3413       DEALLOCATE (zhave)
3415    END SUBROUTINE init_soil_3_real
3417 END MODULE module_soil_pre
3419 #endif