1 MODULE module_optional_si_input
3 INTEGER :: flag_metgrid , flag_tavgsfc , flag_psfc , flag_soilhgt
5 INTEGER :: flag_qv , flag_qc , flag_qr , flag_qi , flag_qs , flag_qg
7 INTEGER :: flag_st000010 , flag_st010040 , flag_st040100 , flag_st100200 , flag_st010200 , &
8 flag_sm000010 , flag_sm010040 , flag_sm040100 , flag_sm100200 , flag_sm010200 , &
9 flag_sw000010 , flag_sw010040 , flag_sw040100 , flag_sw100200 , flag_sw010200
11 INTEGER :: flag_st000007 , flag_st007028 , flag_st028100 , flag_st100255 , &
12 flag_sm000007 , flag_sm007028 , flag_sm028100 , flag_sm100255
14 INTEGER :: flag_soilt000 , flag_soilt005 , flag_soilt020 , flag_soilt040 , flag_soilt160 , flag_soilt300 , &
15 flag_soilm000 , flag_soilm005 , flag_soilm020 , flag_soilm040 , flag_soilm160 , flag_soilm300 , &
16 flag_soilw000 , flag_soilw005 , flag_soilw020 , flag_soilw040 , flag_soilw160 , flag_soilw300
18 INTEGER :: flag_sst , flag_toposoil , flag_snowh
20 INTEGER :: num_st_levels_input , num_sm_levels_input , num_sw_levels_input
21 INTEGER :: num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc
22 INTEGER , DIMENSION(100) :: st_levels_input , sm_levels_input , sw_levels_input
23 REAL , ALLOCATABLE , DIMENSION(:,:,:) :: st_input , sm_input , sw_input
25 CHARACTER (LEN=8) , PRIVATE :: flag_name
27 LOGICAL :: already_been_here
31 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
33 SUBROUTINE init_module_optional_si_input ( grid , config_flags )
40 TYPE ( domain ) :: grid
41 TYPE (grid_config_rec_type) :: config_flags
43 INTEGER :: ids, ide, jds, jde, kds, kde, &
44 ims, ime, jms, jme, kms, kme, &
45 its, ite, jts, jte, kts, kte
47 ! Get the various indices, assume XZY ordering.
49 ids = grid%sd31 ; ide = grid%ed31 ;
50 kds = grid%sd32 ; kde = grid%ed32 ;
51 jds = grid%sd33 ; jde = grid%ed33 ;
53 ims = grid%sm31 ; ime = grid%em31 ;
54 kms = grid%sm32 ; kme = grid%em32 ;
55 jms = grid%sm33 ; jme = grid%em33 ;
57 its = grid%sp31 ; ite = grid%ep31 ; ! note that tile is entire patch
58 kts = grid%sp32 ; kte = grid%ep32 ; ! note that tile is entire patch
59 jts = grid%sp33 ; jte = grid%ep33 ; ! note that tile is entire patch
61 IF ( .NOT. already_been_here ) THEN
63 num_st_levels_alloc = config_flags%num_soil_layers * 3 ! used to be 2
64 num_sm_levels_alloc = config_flags%num_soil_layers * 3
65 num_sw_levels_alloc = config_flags%num_soil_layers * 3
67 IF ( ALLOCATED ( st_input ) ) DEALLOCATE ( st_input )
68 IF ( ALLOCATED ( sm_input ) ) DEALLOCATE ( sm_input )
69 IF ( ALLOCATED ( sw_input ) ) DEALLOCATE ( sw_input )
71 ALLOCATE ( st_input(ims:ime,num_st_levels_alloc,jms:jme) )
72 ALLOCATE ( sm_input(ims:ime,num_sm_levels_alloc,jms:jme) )
73 ALLOCATE ( sw_input(ims:ime,num_sw_levels_alloc,jms:jme) )
77 already_been_here = .TRUE.
79 END SUBROUTINE init_module_optional_si_input
81 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
83 SUBROUTINE optional_si_input ( grid , fid )
90 TYPE ( domain ) :: grid
91 INTEGER , INTENT(IN) :: fid
93 INTEGER :: ids, ide, jds, jde, kds, kde, &
94 ims, ime, jms, jme, kms, kme, &
95 its, ite, jts, jte, kts, kte
97 ! Get the various indices, assume XZY ordering.
99 ids = grid%sd31 ; ide = grid%ed31 ;
100 kds = grid%sd32 ; kde = grid%ed32 ;
101 jds = grid%sd33 ; jde = grid%ed33 ;
103 ims = grid%sm31 ; ime = grid%em31 ;
104 kms = grid%sm32 ; kme = grid%em32 ;
105 jms = grid%sm33 ; jme = grid%em33 ;
107 its = grid%sp31 ; ite = grid%ep31 ; ! note that tile is entire patch
108 kts = grid%sp32 ; kte = grid%ep32 ; ! note that tile is entire patch
109 jts = grid%sp33 ; jte = grid%ep33 ; ! note that tile is entire patch
112 CALL optional_tavgsfc ( grid , fid , &
113 ids, ide, jds, jde, kds, kde, &
114 ims, ime, jms, jme, kms, kme, &
115 its, ite, jts, jte, kts, kte )
117 CALL optional_moist ( grid , fid , &
118 ids, ide, jds, jde, kds, kde, &
119 ims, ime, jms, jme, kms, kme, &
120 its, ite, jts, jte, kts, kte )
122 CALL optional_metgrid ( grid , fid , &
123 ids, ide, jds, jde, kds, kde, &
124 ims, ime, jms, jme, kms, kme, &
125 its, ite, jts, jte, kts, kte )
127 CALL optional_sst ( grid , fid , &
128 ids, ide, jds, jde, kds, kde, &
129 ims, ime, jms, jme, kms, kme, &
130 its, ite, jts, jte, kts, kte )
132 CALL optional_snowh ( grid , fid , &
133 ids, ide, jds, jde, kds, kde, &
134 ims, ime, jms, jme, kms, kme, &
135 its, ite, jts, jte, kts, kte )
137 IF ( ( model_config_rec%sf_surface_physics(grid%id) .EQ. 1 ) .OR. &
138 ( model_config_rec%sf_surface_physics(grid%id) .EQ. 2 ) .OR. &
139 ( model_config_rec%sf_surface_physics(grid%id) .EQ. 3 ) .OR. &
140 ( model_config_rec%sf_surface_physics(grid%id) .EQ. 99 ) ) THEN
142 CALL optional_lsm ( grid , fid , &
143 ids, ide, jds, jde, kds, kde, &
144 ims, ime, jms, jme, kms, kme, &
145 its, ite, jts, jte, kts, kte )
147 CALL optional_lsm_levels ( grid , fid , &
148 ids, ide, jds, jde, kds, kde, &
149 ims, ime, jms, jme, kms, kme, &
150 its, ite, jts, jte, kts, kte )
153 END SUBROUTINE optional_si_input
155 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
157 SUBROUTINE optional_moist ( grid , fid , &
158 ids, ide, jds, jde, kds, kde, &
159 ims, ime, jms, jme, kms, kme, &
160 its, ite, jts, jte, kts, kte )
170 TYPE ( domain ) :: grid
171 INTEGER , INTENT(IN) :: fid
173 INTEGER :: ids, ide, jds, jde, kds, kde, &
174 ims, ime, jms, jme, kms, kme, &
175 its, ite, jts, jte, kts, kte
177 INTEGER :: itmp , icnt , ierr
186 flag_name(1:8) = 'QV '
187 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
188 IF ( ierr .EQ. 0 ) THEN
191 flag_name(1:8) = 'QC '
192 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
193 IF ( ierr .EQ. 0 ) THEN
196 flag_name(1:8) = 'QR '
197 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
198 IF ( ierr .EQ. 0 ) THEN
201 flag_name(1:8) = 'QI '
202 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
203 IF ( ierr .EQ. 0 ) THEN
206 flag_name(1:8) = 'QS '
207 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
208 IF ( ierr .EQ. 0 ) THEN
211 flag_name(1:8) = 'QG '
212 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
213 IF ( ierr .EQ. 0 ) THEN
217 END SUBROUTINE optional_moist
219 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
221 SUBROUTINE optional_metgrid ( grid , fid , &
222 ids, ide, jds, jde, kds, kde, &
223 ims, ime, jms, jme, kms, kme, &
224 its, ite, jts, jte, kts, kte )
233 TYPE ( domain ) :: grid
234 INTEGER , INTENT(IN) :: fid
236 INTEGER :: ids, ide, jds, jde, kds, kde, &
237 ims, ime, jms, jme, kms, kme, &
238 its, ite, jts, jte, kts, kte
240 INTEGER :: itmp , icnt , ierr
244 flag_name(1:8) = 'METGRID '
245 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
246 IF ( ierr .EQ. 0 ) THEN
250 END SUBROUTINE optional_metgrid
252 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
254 SUBROUTINE optional_sst ( grid , fid , &
255 ids, ide, jds, jde, kds, kde, &
256 ims, ime, jms, jme, kms, kme, &
257 its, ite, jts, jte, kts, kte )
266 TYPE ( domain ) :: grid
267 INTEGER , INTENT(IN) :: fid
269 INTEGER :: ids, ide, jds, jde, kds, kde, &
270 ims, ime, jms, jme, kms, kme, &
271 its, ite, jts, jte, kts, kte
273 INTEGER :: itmp , icnt , ierr
277 flag_name(1:8) = 'SST '
278 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
279 IF ( ierr .EQ. 0 ) THEN
283 END SUBROUTINE optional_sst
286 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
288 SUBROUTINE optional_tavgsfc ( grid , fid , &
289 ids, ide, jds, jde, kds, kde, &
290 ims, ime, jms, jme, kms, kme, &
291 its, ite, jts, jte, kts, kte )
300 TYPE ( domain ) :: grid
301 INTEGER , INTENT(IN) :: fid
303 INTEGER :: ids, ide, jds, jde, kds, kde, &
304 ims, ime, jms, jme, kms, kme, &
305 its, ite, jts, jte, kts, kte
307 INTEGER :: itmp , icnt , ierr
311 flag_name(1:8) = 'TAVGSFC '
312 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
313 IF ( ierr .EQ. 0 ) THEN
317 END SUBROUTINE optional_tavgsfc
319 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
321 SUBROUTINE optional_snowh ( grid , fid , &
322 ids, ide, jds, jde, kds, kde, &
323 ims, ime, jms, jme, kms, kme, &
324 its, ite, jts, jte, kts, kte )
333 TYPE ( domain ) :: grid
334 INTEGER , INTENT(IN) :: fid
336 INTEGER :: ids, ide, jds, jde, kds, kde, &
337 ims, ime, jms, jme, kms, kme, &
338 its, ite, jts, jte, kts, kte
340 INTEGER :: itmp , icnt , ierr
344 flag_name(1:8) = 'SNOWH '
345 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
346 IF ( ierr .EQ. 0 ) THEN
350 END SUBROUTINE optional_snowh
352 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
354 SUBROUTINE optional_lsm ( grid , fid , &
355 ids, ide, jds, jde, kds, kde, &
356 ims, ime, jms, jme, kms, kme, &
357 its, ite, jts, jte, kts, kte )
366 TYPE ( domain ) :: grid
367 INTEGER , INTENT(IN) :: fid
369 INTEGER :: ids, ide, jds, jde, kds, kde, &
370 ims, ime, jms, jme, kms, kme, &
371 its, ite, jts, jte, kts, kte
373 INTEGER :: itmp , icnt , ierr
379 flag_name(1:8) = 'TOPOSOIL'
380 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
381 IF ( ierr .EQ. 0 ) THEN
385 flag_name(1:8) = 'PSFC '
386 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
387 IF ( ierr .EQ. 0 ) THEN
391 flag_name(1:8) = 'SOILHGT '
392 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
393 IF ( ierr .EQ. 0 ) THEN
397 END SUBROUTINE optional_lsm
399 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
401 SUBROUTINE optional_lsm_levels ( grid , fid , &
402 ids, ide, jds, jde, kds, kde, &
403 ims, ime, jms, jme, kms, kme, &
404 its, ite, jts, jte, kts, kte )
413 TYPE ( domain ) :: grid
414 INTEGER , INTENT(IN) :: fid
416 INTEGER :: ids, ide, jds, jde, kds, kde, &
417 ims, ime, jms, jme, kms, kme, &
418 its, ite, jts, jte, kts, kte
420 INTEGER :: itmp , icnt , ierr , i , j
422 ! Initialize the soil temp and moisture flags to "field not found".
473 ! How many soil levels have we found? Well, right now, none.
475 num_st_levels_input = 0
476 num_sm_levels_input = 0
477 num_sw_levels_input = 0
482 flag_name(1:8) = 'ST000010'
483 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
484 IF ( ierr .EQ. 0 ) THEN
486 num_st_levels_input = num_st_levels_input + 1
487 st_levels_input(num_st_levels_input) = char2int2(flag_name(3:8))
488 DO j = jts , MIN(jde-1,jte)
489 DO i = its , MIN(ide-1,ite)
490 st_input(i,num_st_levels_input + 1,j) = grid%st000010(i,j)
494 flag_name(1:8) = 'ST010040'
495 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
496 IF ( ierr .EQ. 0 ) THEN
498 num_st_levels_input = num_st_levels_input + 1
499 st_levels_input(num_st_levels_input) = char2int2(flag_name(3:8))
500 DO j = jts , MIN(jde-1,jte)
501 DO i = its , MIN(ide-1,ite)
502 st_input(i,num_st_levels_input + 1,j) = grid%st010040(i,j)
506 flag_name(1:8) = 'ST040100'
507 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
508 IF ( ierr .EQ. 0 ) THEN
510 num_st_levels_input = num_st_levels_input + 1
511 st_levels_input(num_st_levels_input) = char2int2(flag_name(3:8))
512 DO j = jts , MIN(jde-1,jte)
513 DO i = its , MIN(ide-1,ite)
514 st_input(i,num_st_levels_input + 1,j) = grid%st040100(i,j)
518 flag_name(1:8) = 'ST100200'
519 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
520 IF ( ierr .EQ. 0 ) THEN
522 num_st_levels_input = num_st_levels_input + 1
523 st_levels_input(num_st_levels_input) = char2int2(flag_name(3:8))
524 DO j = jts , MIN(jde-1,jte)
525 DO i = its , MIN(ide-1,ite)
526 st_input(i,num_st_levels_input + 1,j) = grid%st100200(i,j)
530 flag_name(1:8) = 'ST010200'
531 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
532 IF ( ierr .EQ. 0 ) THEN
534 num_st_levels_input = num_st_levels_input + 1
535 st_levels_input(num_st_levels_input) = char2int2(flag_name(3:8))
536 DO j = jts , MIN(jde-1,jte)
537 DO i = its , MIN(ide-1,ite)
538 st_input(i,num_st_levels_input + 1,j) = grid%st010200(i,j)
542 flag_name(1:8) = 'SM000010'
543 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
544 IF ( ierr .EQ. 0 ) THEN
546 num_sm_levels_input = num_sm_levels_input + 1
547 sm_levels_input(num_sm_levels_input) = char2int2(flag_name(3:8))
548 DO j = jts , MIN(jde-1,jte)
549 DO i = its , MIN(ide-1,ite)
550 sm_input(i,num_sm_levels_input + 1,j) = grid%sm000010(i,j)
554 flag_name(1:8) = 'SM010040'
555 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
556 IF ( ierr .EQ. 0 ) THEN
558 num_sm_levels_input = num_sm_levels_input + 1
559 sm_levels_input(num_sm_levels_input) = char2int2(flag_name(3:8))
560 DO j = jts , MIN(jde-1,jte)
561 DO i = its , MIN(ide-1,ite)
562 sm_input(i,num_sm_levels_input + 1,j) = grid%sm010040(i,j)
566 flag_name(1:8) = 'SM040100'
567 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
568 IF ( ierr .EQ. 0 ) THEN
570 num_sm_levels_input = num_sm_levels_input + 1
571 sm_levels_input(num_sm_levels_input) = char2int2(flag_name(3:8))
572 DO j = jts , MIN(jde-1,jte)
573 DO i = its , MIN(ide-1,ite)
574 sm_input(i,num_sm_levels_input + 1,j) = grid%sm040100(i,j)
578 flag_name(1:8) = 'SM100200'
579 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
580 IF ( ierr .EQ. 0 ) THEN
582 num_sm_levels_input = num_sm_levels_input + 1
583 sm_levels_input(num_sm_levels_input) = char2int2(flag_name(3:8))
584 DO j = jts , MIN(jde-1,jte)
585 DO i = its , MIN(ide-1,ite)
586 sm_input(i,num_sm_levels_input + 1,j) = grid%sm100200(i,j)
590 flag_name(1:8) = 'SM010200'
591 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
592 IF ( ierr .EQ. 0 ) THEN
594 num_sm_levels_input = num_sm_levels_input + 1
595 sm_levels_input(num_sm_levels_input) = char2int2(flag_name(3:8))
596 DO j = jts , MIN(jde-1,jte)
597 DO i = its , MIN(ide-1,ite)
598 sm_input(i,num_sm_levels_input + 1,j) = grid%sm010200(i,j)
602 flag_name(1:8) = 'SW000010'
603 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
604 IF ( ierr .EQ. 0 ) THEN
606 num_sw_levels_input = num_sw_levels_input + 1
607 sw_levels_input(num_sw_levels_input) = char2int2(flag_name(3:8))
608 DO j = jts , MIN(jde-1,jte)
609 DO i = its , MIN(ide-1,ite)
610 sw_input(i,num_sw_levels_input + 1,j) = grid%sw000010(i,j)
614 flag_name(1:8) = 'SW010040'
615 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
616 IF ( ierr .EQ. 0 ) THEN
618 num_sw_levels_input = num_sw_levels_input + 1
619 sw_levels_input(num_sw_levels_input) = char2int2(flag_name(3:8))
620 DO j = jts , MIN(jde-1,jte)
621 DO i = its , MIN(ide-1,ite)
622 sw_input(i,num_sw_levels_input + 1,j) = grid%sw010040(i,j)
626 flag_name(1:8) = 'SW040100'
627 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
628 IF ( ierr .EQ. 0 ) THEN
630 num_sw_levels_input = num_sw_levels_input + 1
631 sw_levels_input(num_sw_levels_input) = char2int2(flag_name(3:8))
632 DO j = jts , MIN(jde-1,jte)
633 DO i = its , MIN(ide-1,ite)
634 sw_input(i,num_sw_levels_input + 1,j) = grid%sw040100(i,j)
638 flag_name(1:8) = 'SW100200'
639 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
640 IF ( ierr .EQ. 0 ) THEN
642 num_sw_levels_input = num_sw_levels_input + 1
643 sw_levels_input(num_sw_levels_input) = char2int2(flag_name(3:8))
644 DO j = jts , MIN(jde-1,jte)
645 DO i = its , MIN(ide-1,ite)
646 sw_input(i,num_sw_levels_input + 1,j) = grid%sw100200(i,j)
650 flag_name(1:8) = 'SW010200'
651 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
652 IF ( ierr .EQ. 0 ) THEN
654 num_sw_levels_input = num_sw_levels_input + 1
655 sw_levels_input(num_sw_levels_input) = char2int2(flag_name(3:8))
656 DO j = jts , MIN(jde-1,jte)
657 DO i = its , MIN(ide-1,ite)
658 sw_input(i,num_sw_levels_input + 1,j) = grid%sw010200(i,j)
662 flag_name(1:8) = 'ST000007'
663 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
664 IF ( ierr .EQ. 0 ) THEN
666 num_st_levels_input = num_st_levels_input + 1
667 st_levels_input(num_st_levels_input) = char2int2(flag_name(3:8))
668 DO j = jts , MIN(jde-1,jte)
669 DO i = its , MIN(ide-1,ite)
670 st_input(i,num_st_levels_input + 1,j) = grid%st000007(i,j)
674 flag_name(1:8) = 'ST007028'
675 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
676 IF ( ierr .EQ. 0 ) THEN
678 num_st_levels_input = num_st_levels_input + 1
679 st_levels_input(num_st_levels_input) = char2int2(flag_name(3:8))
680 DO j = jts , MIN(jde-1,jte)
681 DO i = its , MIN(ide-1,ite)
682 st_input(i,num_st_levels_input + 1,j) = grid%st007028(i,j)
686 flag_name(1:8) = 'ST028100'
687 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
688 IF ( ierr .EQ. 0 ) THEN
690 num_st_levels_input = num_st_levels_input + 1
691 st_levels_input(num_st_levels_input) = char2int2(flag_name(3:8))
692 DO j = jts , MIN(jde-1,jte)
693 DO i = its , MIN(ide-1,ite)
694 st_input(i,num_st_levels_input + 1,j) = grid%st028100(i,j)
698 flag_name(1:8) = 'ST100255'
699 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
700 IF ( ierr .EQ. 0 ) THEN
702 num_st_levels_input = num_st_levels_input + 1
703 st_levels_input(num_st_levels_input) = char2int2(flag_name(3:8))
704 DO j = jts , MIN(jde-1,jte)
705 DO i = its , MIN(ide-1,ite)
706 st_input(i,num_st_levels_input + 1,j) = grid%st100255(i,j)
710 flag_name(1:8) = 'SM000007'
711 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
712 IF ( ierr .EQ. 0 ) THEN
714 num_sm_levels_input = num_sm_levels_input + 1
715 sm_levels_input(num_sm_levels_input) = char2int2(flag_name(3:8))
716 DO j = jts , MIN(jde-1,jte)
717 DO i = its , MIN(ide-1,ite)
718 sm_input(i,num_sm_levels_input + 1,j) = grid%sm000007(i,j)
722 flag_name(1:8) = 'SM007028'
723 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
724 IF ( ierr .EQ. 0 ) THEN
726 num_sm_levels_input = num_sm_levels_input + 1
727 sm_levels_input(num_sm_levels_input) = char2int2(flag_name(3:8))
728 DO j = jts , MIN(jde-1,jte)
729 DO i = its , MIN(ide-1,ite)
730 sm_input(i,num_sm_levels_input + 1,j) = grid%sm007028(i,j)
734 flag_name(1:8) = 'SM028100'
735 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
736 IF ( ierr .EQ. 0 ) THEN
738 num_sm_levels_input = num_sm_levels_input + 1
739 sm_levels_input(num_sm_levels_input) = char2int2(flag_name(3:8))
740 DO j = jts , MIN(jde-1,jte)
741 DO i = its , MIN(ide-1,ite)
742 sm_input(i,num_sm_levels_input + 1,j) = grid%sm028100(i,j)
746 flag_name(1:8) = 'SM100255'
747 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
748 IF ( ierr .EQ. 0 ) THEN
750 num_sm_levels_input = num_sm_levels_input + 1
751 sm_levels_input(num_sm_levels_input) = char2int2(flag_name(3:8))
752 DO j = jts , MIN(jde-1,jte)
753 DO i = its , MIN(ide-1,ite)
754 sm_input(i,num_sm_levels_input + 1,j) = grid%sm100255(i,j)
758 flag_name(1:8) = 'SOILT000'
759 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
760 IF ( ierr .EQ. 0 ) THEN
762 num_st_levels_input = num_st_levels_input + 1
763 st_levels_input(num_st_levels_input) = char2int1(flag_name(6:8))
764 DO j = jts , MIN(jde-1,jte)
765 DO i = its , MIN(ide-1,ite)
766 st_input(i,num_st_levels_input ,j) = grid%soilt000(i,j)
770 flag_name(1:8) = 'SOILT005'
771 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
772 IF ( ierr .EQ. 0 ) THEN
774 num_st_levels_input = num_st_levels_input + 1
775 st_levels_input(num_st_levels_input) = char2int1(flag_name(6:8))
776 DO j = jts , MIN(jde-1,jte)
777 DO i = its , MIN(ide-1,ite)
778 st_input(i,num_st_levels_input ,j) = grid%soilt005(i,j)
782 flag_name(1:8) = 'SOILT020'
783 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
784 IF ( ierr .EQ. 0 ) THEN
786 num_st_levels_input = num_st_levels_input + 1
787 st_levels_input(num_st_levels_input) = char2int1(flag_name(6:8))
788 DO j = jts , MIN(jde-1,jte)
789 DO i = its , MIN(ide-1,ite)
790 st_input(i,num_st_levels_input ,j) = grid%soilt020(i,j)
794 flag_name(1:8) = 'SOILT040'
795 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
796 IF ( ierr .EQ. 0 ) THEN
798 num_st_levels_input = num_st_levels_input + 1
799 st_levels_input(num_st_levels_input) = char2int1(flag_name(6:8))
800 DO j = jts , MIN(jde-1,jte)
801 DO i = its , MIN(ide-1,ite)
802 st_input(i,num_st_levels_input ,j) = grid%soilt040(i,j)
806 flag_name(1:8) = 'SOILT160'
807 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
808 IF ( ierr .EQ. 0 ) THEN
810 num_st_levels_input = num_st_levels_input + 1
811 st_levels_input(num_st_levels_input) = char2int1(flag_name(6:8))
812 DO j = jts , MIN(jde-1,jte)
813 DO i = its , MIN(ide-1,ite)
814 st_input(i,num_st_levels_input ,j) = grid%soilt160(i,j)
818 flag_name(1:8) = 'SOILT300'
819 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
820 IF ( ierr .EQ. 0 ) THEN
822 num_st_levels_input = num_st_levels_input + 1
823 st_levels_input(num_st_levels_input) = char2int1(flag_name(6:8))
824 DO j = jts , MIN(jde-1,jte)
825 DO i = its , MIN(ide-1,ite)
826 st_input(i,num_st_levels_input ,j) = grid%soilt300(i,j)
830 flag_name(1:8) = 'SOILM000'
831 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
832 IF ( ierr .EQ. 0 ) THEN
834 num_sm_levels_input = num_sm_levels_input + 1
835 sm_levels_input(num_sm_levels_input) = char2int1(flag_name(6:8))
836 DO j = jts , MIN(jde-1,jte)
837 DO i = its , MIN(ide-1,ite)
838 sm_input(i,num_sm_levels_input ,j) = grid%soilm000(i,j)
842 flag_name(1:8) = 'SOILM005'
843 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
844 IF ( ierr .EQ. 0 ) THEN
846 num_sm_levels_input = num_sm_levels_input + 1
847 sm_levels_input(num_sm_levels_input) = char2int1(flag_name(6:8))
848 DO j = jts , MIN(jde-1,jte)
849 DO i = its , MIN(ide-1,ite)
850 sm_input(i,num_sm_levels_input ,j) = grid%soilm005(i,j)
854 flag_name(1:8) = 'SOILM020'
855 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
856 IF ( ierr .EQ. 0 ) THEN
858 num_sm_levels_input = num_sm_levels_input + 1
859 sm_levels_input(num_sm_levels_input) = char2int1(flag_name(6:8))
860 DO j = jts , MIN(jde-1,jte)
861 DO i = its , MIN(ide-1,ite)
862 sm_input(i,num_sm_levels_input ,j) = grid%soilm020(i,j)
866 flag_name(1:8) = 'SOILM040'
867 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
868 IF ( ierr .EQ. 0 ) THEN
870 num_sm_levels_input = num_sm_levels_input + 1
871 sm_levels_input(num_sm_levels_input) = char2int1(flag_name(6:8))
872 DO j = jts , MIN(jde-1,jte)
873 DO i = its , MIN(ide-1,ite)
874 sm_input(i,num_sm_levels_input ,j) = grid%soilm040(i,j)
878 flag_name(1:8) = 'SOILM160'
879 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
880 IF ( ierr .EQ. 0 ) THEN
882 num_sm_levels_input = num_sm_levels_input + 1
883 sm_levels_input(num_sm_levels_input) = char2int1(flag_name(6:8))
884 DO j = jts , MIN(jde-1,jte)
885 DO i = its , MIN(ide-1,ite)
886 sm_input(i,num_sm_levels_input ,j) = grid%soilm160(i,j)
890 flag_name(1:8) = 'SOILM300'
891 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
892 IF ( ierr .EQ. 0 ) THEN
894 num_sm_levels_input = num_sm_levels_input + 1
895 sm_levels_input(num_sm_levels_input) = char2int1(flag_name(6:8))
896 DO j = jts , MIN(jde-1,jte)
897 DO i = its , MIN(ide-1,ite)
898 sm_input(i,num_sm_levels_input ,j) = grid%soilm300(i,j)
902 flag_name(1:8) = 'SOILW000'
903 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
904 IF ( ierr .EQ. 0 ) THEN
906 num_sw_levels_input = num_sw_levels_input + 1
907 sw_levels_input(num_sw_levels_input) = char2int1(flag_name(6:8))
908 DO j = jts , MIN(jde-1,jte)
909 DO i = its , MIN(ide-1,ite)
910 sw_input(i,num_sw_levels_input ,j) = grid%soilw000(i,j)
914 flag_name(1:8) = 'SOILW005'
915 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
916 IF ( ierr .EQ. 0 ) THEN
918 num_sw_levels_input = num_sw_levels_input + 1
919 sw_levels_input(num_sw_levels_input) = char2int1(flag_name(6:8))
920 DO j = jts , MIN(jde-1,jte)
921 DO i = its , MIN(ide-1,ite)
922 sw_input(i,num_sw_levels_input ,j) = grid%soilw005(i,j)
926 flag_name(1:8) = 'SOILW020'
927 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
928 IF ( ierr .EQ. 0 ) THEN
930 num_sw_levels_input = num_sw_levels_input + 1
931 sw_levels_input(num_sw_levels_input) = char2int1(flag_name(6:8))
932 DO j = jts , MIN(jde-1,jte)
933 DO i = its , MIN(ide-1,ite)
934 sw_input(i,num_sw_levels_input ,j) = grid%soilw020(i,j)
938 flag_name(1:8) = 'SOILW040'
939 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
940 IF ( ierr .EQ. 0 ) THEN
942 num_sw_levels_input = num_sw_levels_input + 1
943 sw_levels_input(num_sw_levels_input) = char2int1(flag_name(6:8))
944 DO j = jts , MIN(jde-1,jte)
945 DO i = its , MIN(ide-1,ite)
946 sw_input(i,num_sw_levels_input ,j) = grid%soilw040(i,j)
950 flag_name(1:8) = 'SOILW160'
951 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
952 IF ( ierr .EQ. 0 ) THEN
954 num_sw_levels_input = num_sw_levels_input + 1
955 sw_levels_input(num_sw_levels_input) = char2int1(flag_name(6:8))
956 DO j = jts , MIN(jde-1,jte)
957 DO i = its , MIN(ide-1,ite)
958 sw_input(i,num_sw_levels_input ,j) = grid%soilw160(i,j)
962 flag_name(1:8) = 'SOILW300'
963 CALL wrf_get_dom_ti_integer ( fid, 'FLAG_' // flag_name, itmp, 1, icnt, ierr )
964 IF ( ierr .EQ. 0 ) THEN
966 num_sw_levels_input = num_sw_levels_input + 1
967 sw_levels_input(num_sw_levels_input) = char2int1(flag_name(6:8))
968 DO j = jts , MIN(jde-1,jte)
969 DO i = its , MIN(ide-1,ite)
970 sw_input(i,num_sw_levels_input ,j) = grid%soilw300(i,j)
975 ! OK, let's do a quick sanity check.
977 IF ( ( num_st_levels_input .GT. num_st_levels_alloc ) .OR. &
978 ( num_sm_levels_input .GT. num_sm_levels_alloc ) .OR. &
979 ( num_sw_levels_input .GT. num_sw_levels_alloc ) ) THEN
980 print *,'pain and woe, the soil level allocation is too small'
981 CALL wrf_error_fatal ( 'soil_levels_too_few' )
984 END SUBROUTINE optional_lsm_levels
986 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
988 FUNCTION char2int1( string3 ) RESULT ( int1 )
989 CHARACTER (LEN=3) , INTENT(IN) :: string3
991 READ(string3,fmt='(I3)') i1
993 END FUNCTION char2int1
995 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
997 FUNCTION char2int2( string6 ) RESULT ( int1 )
998 CHARACTER (LEN=6) , INTENT(IN) :: string6
999 INTEGER :: i2 , i1 , int1
1000 READ(string6,fmt='(I3,I3)') i1,i2
1001 int1 = ( i2 + i1 ) / 2
1002 END FUNCTION char2int2
1004 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1006 END MODULE module_optional_si_input