1 !WRF:MODEL_LAYER:BOUNDARY
12 ! LOGICAL :: periodic_x
13 ! LOGICAL :: symmetric_xs
14 ! LOGICAL :: symmetric_xe
17 ! LOGICAL :: periodic_y
18 ! LOGICAL :: symmetric_ys
19 ! LOGICAL :: symmetric_ye
23 ! LOGICAL :: specified
24 ! LOGICAL :: top_radiation
28 ! set the bdyzone. We are hardwiring this here and we'll
29 ! decide later where it should be set and stored
31 INTEGER, PARAMETER :: bdyzone = 4
32 INTEGER, PARAMETER :: bdyzone_x = bdyzone
33 INTEGER, PARAMETER :: bdyzone_y = bdyzone
36 MODULE PROCEDURE stuff_bdy_new , stuff_bdy_old
39 INTERFACE stuff_bdytend
40 MODULE PROCEDURE stuff_bdytend_new , stuff_bdytend_old
45 SUBROUTINE boundary_condition_check ( config_flags, bzone, error, gn )
47 ! this routine checks the boundary condition logicals
48 ! to make sure that the boundary conditions are not over
49 ! or under specified. The routine also checks that the
50 ! boundary zone is sufficiently sized for the specified
55 TYPE( grid_config_rec_type ) config_flags
57 INTEGER, INTENT(IN ) :: bzone, gn
58 INTEGER, INTENT(INOUT) :: error
62 INTEGER :: xs_bc, xe_bc, ys_bc, ye_bc, bzone_min
63 INTEGER :: nprocx, nprocy
65 CALL wrf_debug( 100 , ' checking boundary conditions for grid ' )
73 ! sum the number of conditions specified for each lateral boundary.
74 ! obviously, this number should be 1
76 IF( config_flags%periodic_x ) THEN
81 IF( config_flags%periodic_y ) THEN
86 IF( config_flags%symmetric_xs ) xs_bc = xs_bc + 1
87 IF( config_flags%symmetric_xe ) xe_bc = xe_bc + 1
88 IF( config_flags%open_xs ) xs_bc = xs_bc + 1
89 IF( config_flags%open_xe ) xe_bc = xe_bc + 1
92 IF( config_flags%symmetric_ys ) ys_bc = ys_bc + 1
93 IF( config_flags%symmetric_ye ) ye_bc = ye_bc + 1
94 IF( config_flags%open_ys ) ys_bc = ys_bc + 1
95 IF( config_flags%open_ye ) ye_bc = ye_bc + 1
97 IF( config_flags%nested ) THEN
104 IF( config_flags%specified ) THEN
105 IF( .NOT. config_flags%periodic_x)xs_bc = xs_bc + 1
106 IF( .NOT. config_flags%periodic_x)xe_bc = xe_bc + 1
111 IF( config_flags%polar ) THEN
116 ! check the number of conditions for each boundary
118 IF( (xs_bc /= 1) .or. &
125 write( wrf_err_message ,*) ' *** Error in boundary condition specification '
126 CALL wrf_message ( wrf_err_message )
127 write( wrf_err_message ,*) ' boundary conditions at xs ', xs_bc
128 CALL wrf_message ( wrf_err_message )
129 write( wrf_err_message ,*) ' boundary conditions at xe ', xe_bc
130 CALL wrf_message ( wrf_err_message )
131 write( wrf_err_message ,*) ' boundary conditions at ys ', ys_bc
132 CALL wrf_message ( wrf_err_message )
133 write( wrf_err_message ,*) ' boundary conditions at ye ', ye_bc
134 CALL wrf_message ( wrf_err_message )
135 write( wrf_err_message ,*) ' boundary conditions logicals are '
136 CALL wrf_message ( wrf_err_message )
137 write( wrf_err_message ,*) ' periodic_x ',config_flags%periodic_x
138 CALL wrf_message ( wrf_err_message )
139 write( wrf_err_message ,*) ' periodic_y ',config_flags%periodic_y
140 CALL wrf_message ( wrf_err_message )
141 write( wrf_err_message ,*) ' symmetric_xs ',config_flags%symmetric_xs
142 CALL wrf_message ( wrf_err_message )
143 write( wrf_err_message ,*) ' symmetric_xe ',config_flags%symmetric_xe
144 CALL wrf_message ( wrf_err_message )
145 write( wrf_err_message ,*) ' symmetric_ys ',config_flags%symmetric_ys
146 CALL wrf_message ( wrf_err_message )
147 write( wrf_err_message ,*) ' symmetric_ye ',config_flags%symmetric_ye
148 CALL wrf_message ( wrf_err_message )
149 write( wrf_err_message ,*) ' open_xs ',config_flags%open_xs
150 CALL wrf_message ( wrf_err_message )
151 write( wrf_err_message ,*) ' open_xe ',config_flags%open_xe
152 CALL wrf_message ( wrf_err_message )
153 write( wrf_err_message ,*) ' open_ys ',config_flags%open_ys
154 CALL wrf_message ( wrf_err_message )
155 write( wrf_err_message ,*) ' open_ye ',config_flags%open_ye
156 CALL wrf_message ( wrf_err_message )
157 write( wrf_err_message ,*) ' polar ',config_flags%polar
158 CALL wrf_message ( wrf_err_message )
159 write( wrf_err_message ,*) ' nested ',config_flags%nested
160 CALL wrf_message ( wrf_err_message )
161 write( wrf_err_message ,*) ' specified ',config_flags%specified
162 CALL wrf_message ( wrf_err_message )
163 CALL wrf_error_fatal( ' *** Error in boundary condition specification ' )
167 ! now check to see if boundary zone size is sufficient.
168 ! we could have the necessary boundary zone size be returned
169 ! to the calling routine.
171 IF( config_flags%periodic_x .or. &
172 config_flags%periodic_y .or. &
173 config_flags%symmetric_xs .or. &
174 config_flags%symmetric_xe .or. &
175 config_flags%symmetric_ys .or. &
176 config_flags%symmetric_ye ) THEN
178 bzone_min = MAX( 1, &
179 (config_flags%h_mom_adv_order+1)/2, &
180 (config_flags%h_sca_adv_order+1)/2 )
182 IF( bzone < bzone_min) THEN
185 WRITE ( wrf_err_message , * ) ' boundary zone not large enough '
186 CALL wrf_message ( wrf_err_message )
187 WRITE ( wrf_err_message , * ) ' boundary zone specified ',bzone
188 CALL wrf_message ( wrf_err_message )
189 WRITE ( wrf_err_message , * ) ' minimum boundary zone needed ',bzone_min
190 CALL wrf_error_fatal ( wrf_err_message )
195 CALL wrf_debug ( 100 , ' boundary conditions OK for grid ' )
197 END subroutine boundary_condition_check
199 !--------------------------------------------------------------------------
200 SUBROUTINE set_physical_bc2d( dat, variable_in, &
202 ids,ide, jds,jde, & ! domain dims
203 ims,ime, jms,jme, & ! memory dims
204 ips,ipe, jps,jpe, & ! patch dims
207 ! This subroutine sets the data in the boundary region, by direct
208 ! assignment if possible, for periodic and symmetric (wall)
209 ! boundary conditions. Currently, we are only doing 1 variable
210 ! at a time - lots of overhead, so maybe this routine can be easily
211 ! inlined later or we could pass multiple variables -
212 ! would probably want a largestep and smallstep version.
215 ! Modified the incoming its,ite,jts,jte to truly be the tile size.
216 ! This required modifying the loop limits when the "istag" or "jstag"
217 ! is used, as this is only required at the end of the domain.
221 INTEGER, INTENT(IN ) :: ids,ide, jds,jde
222 INTEGER, INTENT(IN ) :: ims,ime, jms,jme
223 INTEGER, INTENT(IN ) :: ips,ipe, jps,jpe
224 INTEGER, INTENT(IN ) :: its,ite, jts,jte
225 CHARACTER, INTENT(IN ) :: variable_in
227 CHARACTER :: variable
229 REAL, DIMENSION( ims:ime , jms:jme ) :: dat
230 TYPE( grid_config_rec_type ) config_flags
232 INTEGER :: i, j, istag, jstag, itime
234 LOGICAL :: debug, open_bc_copy
240 open_bc_copy = .false.
242 variable = variable_in
243 IF ( variable_in .ge. 'A' .and. variable_in .le. 'Z' ) THEN
244 variable = CHAR( ICHAR(variable_in) - ICHAR('A') + ICHAR('a') )
246 IF ((variable == 'u') .or. (variable == 'v') .or. &
247 (variable == 'w') .or. (variable == 't') .or. &
248 (variable == 'x') .or. (variable == 'y') .or. &
249 (variable == 'r') .or. (variable == 'p') ) open_bc_copy = .true.
251 ! begin, first set a staggering variable
256 IF ((variable == 'u') .or. (variable == 'x')) istag = 0
257 IF ((variable == 'v') .or. (variable == 'y')) jstag = 0
260 write(6,*) ' in bc2d, var is ',variable, istag, jstag
261 write(6,*) ' b.cs are ', &
262 config_flags%periodic_x, &
263 config_flags%periodic_y
266 IF ( variable == 'd' ) then !JDM
270 IF ( variable == 'e' ) then !JDM
273 IF ( variable == 'f' ) then !JDM
277 ! periodic conditions.
278 ! note, patch must cover full range in periodic dir, or else
279 ! its intra-patch communication that is handled elsewheres.
280 ! symmetry conditions can always be handled here, because no
281 ! outside patch communication is needed
283 periodicity_x: IF( ( config_flags%periodic_x ) ) THEN
284 IF ( ( ids == ips ) .and. ( ide == ipe ) ) THEN ! test if east and west both on-processor
285 IF ( its == ids ) THEN
287 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
288 DO i = 0,-(bdyzone-1),-1
289 dat(ids+i-1,j) = dat(ide+i-1,j)
295 IF ( ite == ide ) THEN
297 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
298 !! DO i = 1 , bdyzone
299 DO i = -istag , bdyzone
300 dat(ide+i+istag,j) = dat(ids+i+istag,j)
309 symmetry_xs: IF( ( config_flags%symmetric_xs ) .and. &
310 ( its == ids ) ) THEN
312 IF ( (variable /= 'u') .and. (variable /= 'x') ) THEN
314 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
316 dat(ids-i,j) = dat(ids+i-1,j) ! here, dat(0) = dat(1), etc
317 ENDDO ! symmetry about dat(0.5) (u=0 pt)
322 IF( variable == 'u' ) THEN
324 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
326 dat(ids-i,j) = - dat(ids+i,j) ! here, u(0) = - u(2), etc
327 ENDDO ! normal b.c symmetry at u(1)
332 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
334 dat(ids-i,j) = dat(ids+i,j) ! here, phi(0) = phi(2), etc
335 ENDDO ! normal b.c symmetry at phi(1)
345 ! now the symmetry boundary at xe
347 symmetry_xe: IF( ( config_flags%symmetric_xe ) .and. &
348 ( ite == ide ) ) THEN
350 IF ( (variable /= 'u') .and. (variable /= 'x') ) THEN
352 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
354 dat(ide+i-1,j) = dat(ide-i,j) ! sym. about dat(ide-0.5)
360 IF (variable == 'u' ) THEN
362 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
364 dat(ide+i,j) = - dat(ide-i,j) ! u(ide+1) = - u(ide-1), etc.
371 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
373 dat(ide+i,j) = dat(ide-i,j) ! phi(ide+1) = phi(ide-1), etc.
384 ! set open b.c in X copy into boundary zone here. WCS, 19 March 2000
386 open_xs: IF( ( config_flags%open_xs .or. &
387 config_flags%specified .or. &
388 config_flags%nested ) .and. &
389 ( its == ids ) .and. open_bc_copy ) THEN
391 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
392 dat(ids-1,j) = dat(ids,j) ! here, dat(0) = dat(1)
393 dat(ids-2,j) = dat(ids,j)
394 dat(ids-3,j) = dat(ids,j)
400 ! now the open boundary copy at xe
402 open_xe: IF( ( config_flags%open_xe .or. &
403 config_flags%specified .or. &
404 config_flags%nested ) .and. &
405 ( ite == ide ) .and. open_bc_copy ) THEN
407 IF ( variable /= 'u' .and. variable /= 'x') THEN
409 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
410 dat(ide ,j) = dat(ide-1,j)
411 dat(ide+1,j) = dat(ide-1,j)
412 dat(ide+2,j) = dat(ide-1,j)
417 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
418 dat(ide+1,j) = dat(ide,j)
419 dat(ide+2,j) = dat(ide,j)
420 dat(ide+3,j) = dat(ide,j)
427 ! end open b.c in X copy into boundary zone addition. WCS, 19 March 2000
431 ! same procedure in y
433 periodicity_y: IF( ( config_flags%periodic_y ) ) THEN
434 IF ( ( jds == jps ) .and. ( jde == jpe ) ) THEN ! test of both north and south on processor
436 IF( jts == jds ) then
438 DO j = 0, -(bdyzone-1), -1
439 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
440 dat(i,jds+j-1) = dat(i,jde+j-1)
446 IF( jte == jde ) then
448 DO j = -jstag, bdyzone
449 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
450 dat(i,jde+j+jstag) = dat(i,jds+j+jstag)
460 symmetry_ys: IF( ( config_flags%symmetric_ys ) .and. &
463 IF ( (variable /= 'v') .and. (variable /= 'y') ) THEN
466 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
467 dat(i,jds-j) = dat(i,jds+j-1)
473 IF (variable == 'v') THEN
476 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
477 dat(i,jds-j) = - dat(i,jds+j)
484 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
485 dat(i,jds-j) = dat(i,jds+j)
495 ! now the symmetry boundary at ye
497 symmetry_ye: IF( ( config_flags%symmetric_ye ) .and. &
498 ( jte == jde ) ) THEN
500 IF ( (variable /= 'v') .and. (variable /= 'y') ) THEN
503 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
504 dat(i,jde+j-1) = dat(i,jde-j)
510 IF (variable == 'v' ) THEN
513 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
514 dat(i,jde+j) = - dat(i,jde-j) ! bugfix: changed jds on rhs to jde , JM 20020410
521 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
522 dat(i,jde+j) = dat(i,jde-j)
532 ! set open b.c in Y copy into boundary zone here. WCS, 19 March 2000
534 open_ys: IF( ( config_flags%open_ys .or. &
535 config_flags%polar .or. &
536 config_flags%specified .or. &
537 config_flags%nested ) .and. &
538 ( jts == jds) .and. open_bc_copy ) THEN
540 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
541 dat(i,jds-1) = dat(i,jds)
542 dat(i,jds-2) = dat(i,jds)
543 dat(i,jds-3) = dat(i,jds)
548 ! now the open boundary copy at ye
550 open_ye: IF( ( config_flags%open_ye .or. &
551 config_flags%polar .or. &
552 config_flags%specified .or. &
553 config_flags%nested ) .and. &
554 ( jte == jde ) .and. open_bc_copy ) THEN
556 IF (variable /= 'v' .and. variable /= 'y' ) THEN
558 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
559 dat(i,jde ) = dat(i,jde-1)
560 dat(i,jde+1) = dat(i,jde-1)
561 dat(i,jde+2) = dat(i,jde-1)
566 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
567 dat(i,jde+1) = dat(i,jde)
568 dat(i,jde+2) = dat(i,jde)
569 dat(i,jde+3) = dat(i,jde)
576 ! end open b.c in Y copy into boundary zone addition. WCS, 19 March 2000
580 ! fix corners for doubly periodic domains
582 IF ( config_flags%periodic_x .and. config_flags%periodic_y &
583 .and. (ids == ips) .and. (ide == ipe) &
584 .and. (jds == jps) .and. (jde == jpe) ) THEN
586 IF ( (its == ids) .and. (jts == jds) ) THEN ! lower left corner fill
587 DO j = 0, -(bdyzone-1), -1
588 DO i = 0, -(bdyzone-1), -1
589 dat(ids+i-1,jds+j-1) = dat(ide+i-1,jde+j-1)
594 IF ( (ite == ide) .and. (jts == jds) ) THEN ! lower right corner fill
595 DO j = 0, -(bdyzone-1), -1
597 dat(ide+i+istag,jds+j-1) = dat(ids+i+istag,jde+j-1)
602 IF ( (ite == ide) .and. (jte == jde) ) THEN ! upper right corner fill
605 dat(ide+i+istag,jde+j+jstag) = dat(ids+i+istag,jds+j+jstag)
610 IF ( (its == ids) .and. (jte == jde) ) THEN ! upper left corner fill
612 DO i = 0, -(bdyzone-1), -1
613 dat(ids+i-1,jde+j+jstag) = dat(ide+i-1,jds+j+jstag)
620 END SUBROUTINE set_physical_bc2d
622 !-----------------------------------
624 SUBROUTINE set_physical_bc3d( dat, variable_in, &
626 ids,ide, jds,jde, kds,kde, & ! domain dims
627 ims,ime, jms,jme, kms,kme, & ! memory dims
628 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
629 its,ite, jts,jte, kts,kte )
631 ! This subroutine sets the data in the boundary region, by direct
632 ! assignment if possible, for periodic and symmetric (wall)
633 ! boundary conditions. Currently, we are only doing 1 variable
634 ! at a time - lots of overhead, so maybe this routine can be easily
635 ! inlined later or we could pass multiple variables -
636 ! would probably want a largestep and smallstep version.
639 ! Modified the incoming its,ite,jts,jte to truly be the tile size.
640 ! This required modifying the loop limits when the "istag" or "jstag"
641 ! is used, as this is only required at the end of the domain.
645 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde
646 INTEGER, INTENT(IN ) :: ims,ime, jms,jme, kms,kme
647 INTEGER, INTENT(IN ) :: ips,ipe, jps,jpe, kps,kpe
648 INTEGER, INTENT(IN ) :: its,ite, jts,jte, kts,kte
649 CHARACTER, INTENT(IN ) :: variable_in
651 CHARACTER :: variable
653 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) :: dat
654 TYPE( grid_config_rec_type ) config_flags
656 INTEGER :: i, j, k, istag, jstag, itime, k_end
658 LOGICAL :: debug, open_bc_copy
664 open_bc_copy = .false.
666 variable = variable_in
667 IF ( variable_in .ge. 'A' .and. variable_in .le. 'Z' ) THEN
668 variable = CHAR( ICHAR(variable_in) - ICHAR('A') + ICHAR('a') )
671 IF ((variable == 'u') .or. (variable == 'v') .or. &
672 (variable == 'w') .or. (variable == 't') .or. &
673 (variable == 'd') .or. (variable == 'e') .or. &
674 (variable == 'x') .or. (variable == 'y') .or. &
675 (variable == 'f') .or. (variable == 'r') .or. &
676 (variable == 'p') ) open_bc_copy = .true.
678 ! begin, first set a staggering variable
682 k_end = max(1,min(kde-1,kte))
685 IF ((variable == 'u') .or. (variable == 'x')) istag = 0
686 IF ((variable == 'v') .or. (variable == 'y')) jstag = 0
687 IF ((variable == 'd') .or. (variable == 'xy')) then
691 IF ((variable == 'e') ) then
696 IF ((variable == 'f') ) then
701 IF ( variable == 'w') k_end = min(kde,kte)
706 write(6,*) ' in bc, var is ',variable, istag, jstag, kte, k_end
707 write(6,*) ' b.cs are ', &
708 config_flags%periodic_x, &
709 config_flags%periodic_y
714 ! periodic conditions.
715 ! note, patch must cover full range in periodic dir, or else
716 ! its intra-patch communication that is handled elsewheres.
717 ! symmetry conditions can always be handled here, because no
718 ! outside patch communication is needed
720 periodicity_x: IF( ( config_flags%periodic_x ) ) THEN
722 IF ( ( ids == ips ) .and. ( ide == ipe ) ) THEN ! test if both east and west on-processor
723 IF ( its == ids ) THEN
725 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
727 DO i = 0,-(bdyzone-1),-1
728 dat(ids+i-1,k,j) = dat(ide+i-1,k,j)
736 IF ( ite == ide ) THEN
738 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
740 DO i = -istag , bdyzone
741 dat(ide+i+istag,k,j) = dat(ids+i+istag,k,j)
752 symmetry_xs: IF( ( config_flags%symmetric_xs ) .and. &
753 ( its == ids ) ) THEN
755 IF ( (variable /= 'u') .and. (variable /= 'x') ) THEN
757 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
760 dat(ids-i,k,j) = dat(ids+i-1,k,j) ! here, dat(0) = dat(1), etc
761 ENDDO ! symmetry about dat(0.5) (u = 0 pt)
767 IF ( variable == 'u' ) THEN
769 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
772 dat(ids-i,k,j) = - dat(ids+i,k,j) ! here, u(0) = - u(2), etc
773 ENDDO ! normal b.c symmetry at u(1)
779 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
782 dat(ids-i,k,j) = dat(ids+i,k,j) ! here, phi(0) = phi(2), etc
783 ENDDO ! normal b.c symmetry at phi(1)
794 ! now the symmetry boundary at xe
796 symmetry_xe: IF( ( config_flags%symmetric_xe ) .and. &
797 ( ite == ide ) ) THEN
799 IF ( (variable /= 'u') .and. (variable /= 'x') ) THEN
801 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
804 dat(ide+i-1,k,j) = dat(ide-i,k,j) ! sym. about dat(ide-0.5)
811 IF (variable == 'u') THEN
813 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
816 dat(ide+i,k,j) = - dat(ide-i,k,j) ! u(ide+1) = - u(ide-1), etc.
823 DO j = MAX(jds,jts-1), MIN(jte+1,jde+jstag)
826 dat(ide+i,k,j) = dat(ide-i,k,j) ! phi(ide+1) = - phi(ide-1), etc.
837 ! set open b.c in X copy into boundary zone here. WCS, 19 March 2000
839 open_xs: IF( ( config_flags%open_xs .or. &
840 config_flags%specified .or. &
841 config_flags%nested ) .and. &
842 ( its == ids ) .and. open_bc_copy ) THEN
844 DO j = jts-bdyzone, MIN(jte,jde+jstag)+bdyzone
846 dat(ids-1,k,j) = dat(ids,k,j) ! here, dat(0) = dat(1), etc
847 dat(ids-2,k,j) = dat(ids,k,j)
848 dat(ids-3,k,j) = dat(ids,k,j)
855 ! now the open_xe boundary copy
857 open_xe: IF( ( config_flags%open_xe .or. &
858 config_flags%specified .or. &
859 config_flags%nested ) .and. &
860 ( ite == ide ) .and. open_bc_copy ) THEN
862 IF (variable /= 'u' .and. variable /= 'x' ) THEN
864 DO j = jts-bdyzone, MIN(jte,jde+jstag)+bdyzone
866 dat(ide ,k,j) = dat(ide-1,k,j)
867 dat(ide+1,k,j) = dat(ide-1,k,j)
868 dat(ide+2,k,j) = dat(ide-1,k,j)
874 !!!!!!! I am not sure about this one! JM 20020402
875 DO j = MAX(jds,jts-1)-bdyzone, MIN(jte+1,jde+jstag)+bdyzone
877 dat(ide+1,k,j) = dat(ide,k,j)
878 dat(ide+2,k,j) = dat(ide,k,j)
879 dat(ide+3,k,j) = dat(ide,k,j)
887 ! end open b.c in X copy into boundary zone addition. WCS, 19 March 2000
891 ! same procedure in y
893 periodicity_y: IF( ( config_flags%periodic_y ) ) THEN
894 IF ( ( jds == jps ) .and. ( jde == jpe ) ) THEN ! test if both north and south on processor
895 IF( jts == jds ) then
897 DO j = 0, -(bdyzone-1), -1
899 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
900 dat(i,k,jds+j-1) = dat(i,k,jde+j-1)
907 IF( jte == jde ) then
909 DO j = -jstag, bdyzone
911 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
912 dat(i,k,jde+j+jstag) = dat(i,k,jds+j+jstag)
923 symmetry_ys: IF( ( config_flags%symmetric_ys ) .and. &
926 IF ( (variable /= 'v') .and. (variable /= 'y') ) THEN
930 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
931 dat(i,k,jds-j) = dat(i,k,jds+j-1)
938 IF (variable == 'v') THEN
942 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
943 dat(i,k,jds-j) = - dat(i,k,jds+j)
952 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
953 dat(i,k,jds-j) = dat(i,k,jds+j)
964 ! now the symmetry boundary at ye
966 symmetry_ye: IF( ( config_flags%symmetric_ye ) .and. &
967 ( jte == jde ) ) THEN
969 IF ( (variable /= 'v') .and. (variable /= 'y') ) THEN
973 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
974 dat(i,k,jde+j-1) = dat(i,k,jde-j)
981 IF ( variable == 'v' ) THEN
985 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
986 dat(i,k,jde+j) = - dat(i,k,jde-j)
995 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
996 dat(i,k,jde+j) = dat(i,k,jde-j)
1007 ! set open b.c in Y copy into boundary zone here. WCS, 19 March 2000
1009 open_ys: IF( ( config_flags%open_ys .or. &
1010 config_flags%polar .or. &
1011 config_flags%specified .or. &
1012 config_flags%nested ) .and. &
1013 ( jts == jds) .and. open_bc_copy ) THEN
1016 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
1017 dat(i,k,jds-1) = dat(i,k,jds)
1018 dat(i,k,jds-2) = dat(i,k,jds)
1019 dat(i,k,jds-3) = dat(i,k,jds)
1025 ! now the open boundary copy at ye
1027 open_ye: IF( ( config_flags%open_ye .or. &
1028 config_flags%polar .or. &
1029 config_flags%specified .or. &
1030 config_flags%nested ) .and. &
1031 ( jte == jde ) .and. open_bc_copy ) THEN
1033 IF (variable /= 'v' .and. variable /= 'y' ) THEN
1036 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
1037 dat(i,k,jde ) = dat(i,k,jde-1)
1038 dat(i,k,jde+1) = dat(i,k,jde-1)
1039 dat(i,k,jde+2) = dat(i,k,jde-1)
1046 DO i = MAX(ids,its-1), MIN(ite+1,ide+istag)
1047 dat(i,k,jde+1) = dat(i,k,jde)
1048 dat(i,k,jde+2) = dat(i,k,jde)
1049 dat(i,k,jde+3) = dat(i,k,jde)
1057 ! end open b.c in Y copy into boundary zone addition. WCS, 19 March 2000
1059 END IF periodicity_y
1061 ! fix corners for doubly periodic domains
1063 IF ( config_flags%periodic_x .and. config_flags%periodic_y &
1064 .and. (ids == ips) .and. (ide == ipe) &
1065 .and. (jds == jps) .and. (jde == jpe) ) THEN
1067 IF ( (its == ids) .and. (jts == jds) ) THEN ! lower left corner fill
1068 DO j = 0, -(bdyzone-1), -1
1070 DO i = 0, -(bdyzone-1), -1
1071 dat(ids+i-1,k,jds+j-1) = dat(ide+i-1,k,jde+j-1)
1077 IF ( (ite == ide) .and. (jts == jds) ) THEN ! lower right corner fill
1078 DO j = 0, -(bdyzone-1), -1
1081 dat(ide+i+istag,k,jds+j-1) = dat(ids+i+istag,k,jde+j-1)
1087 IF ( (ite == ide) .and. (jte == jde) ) THEN ! upper right corner fill
1091 dat(ide+i+istag,k,jde+j+jstag) = dat(ids+i+istag,k,jds+j+jstag)
1097 IF ( (its == ids) .and. (jte == jde) ) THEN ! upper left corner fill
1100 DO i = 0, -(bdyzone-1), -1
1101 dat(ids+i-1,k,jde+j+jstag) = dat(ide+i-1,k,jds+j+jstag)
1109 END SUBROUTINE set_physical_bc3d
1111 SUBROUTINE init_module_bc
1112 END SUBROUTINE init_module_bc
1114 !------------------------------------------------------------------------
1116 ! a couple versions of this call to allow a smaller-than-memory dimensioned field (e.g. tile sized)
1117 ! to be passed in as the first argument. Both of these call the _core version defined below.
1118 SUBROUTINE relax_bdytend ( field, field_tend, &
1119 field_bdy_xs, field_bdy_xe, &
1120 field_bdy_ys, field_bdy_ye, &
1121 field_bdy_tend_xs, field_bdy_tend_xe, &
1122 field_bdy_tend_ys, field_bdy_tend_ye, &
1123 variable_in, config_flags, &
1124 spec_bdy_width, spec_zone, relax_zone, &
1126 ids,ide, jds,jde, kds,kde, & ! domain dims
1127 ims,ime, jms,jme, kms,kme, & ! memory dims
1128 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1129 its,ite, jts,jte, kts,kte &
1134 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde
1135 INTEGER, INTENT(IN ) :: ims,ime, jms,jme, kms,kme
1136 INTEGER, INTENT(IN ) :: ips,ipe, jps,jpe, kps,kpe
1137 INTEGER, INTENT(IN ) :: its,ite, jts,jte, kts,kte
1138 INTEGER, INTENT(IN ) :: spec_bdy_width, spec_zone, relax_zone
1139 REAL, INTENT(IN ) :: dtbc
1140 CHARACTER, INTENT(IN ) :: variable_in
1142 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(IN ) :: field
1143 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(INOUT) :: field_tend
1144 REAL, DIMENSION( jms:jme , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_xs, field_bdy_xe
1145 REAL, DIMENSION( ims:ime , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_ys, field_bdy_ye
1146 REAL, DIMENSION( jms:jme , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_tend_xs, field_bdy_tend_xe
1147 REAL, DIMENSION( ims:ime , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_tend_ys, field_bdy_tend_ye
1148 REAL, DIMENSION( spec_bdy_width ), INTENT(IN ) :: fcx, gcx
1149 TYPE( grid_config_rec_type ) config_flags
1151 CALL relax_bdytend_core ( field, field_tend, &
1152 field_bdy_xs, field_bdy_xe, &
1153 field_bdy_ys, field_bdy_ye, &
1154 field_bdy_tend_xs, field_bdy_tend_xe, &
1155 field_bdy_tend_ys, field_bdy_tend_ye, &
1156 variable_in, config_flags, &
1157 spec_bdy_width, spec_zone, relax_zone, &
1159 ids,ide, jds,jde, kds,kde, & ! domain dims
1160 ims,ime, jms,jme, kms,kme, & ! memory dims
1161 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1162 its,ite, jts,jte, kts,kte, & ! patch dims
1163 ims,ime, jms,jme, kms,kme ) ! dimension of the field argument
1164 END SUBROUTINE relax_bdytend
1166 ! version that allows tile-sized version of field. Note, caller should define the
1167 ! field to be -+1 of tile size in each dimension because routine is going off onto halo
1168 ! for example, see relax_bdytend in dyn_em/module_bc_em.F
1169 SUBROUTINE relax_bdytend_tile ( field, field_tend, &
1170 field_bdy_xs, field_bdy_xe, &
1171 field_bdy_ys, field_bdy_ye, &
1172 field_bdy_tend_xs, field_bdy_tend_xe, &
1173 field_bdy_tend_ys, field_bdy_tend_ye, &
1174 variable_in, config_flags, &
1175 spec_bdy_width, spec_zone, relax_zone, &
1177 ids,ide, jds,jde, kds,kde, & ! domain dims
1178 ims,ime, jms,jme, kms,kme, & ! memory dims
1179 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1180 its,ite, jts,jte, kts,kte, &
1181 iXs,iXe, jXs,jXe, kXs,kXe & ! dims of first argument
1184 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde
1185 INTEGER, INTENT(IN ) :: ims,ime, jms,jme, kms,kme
1186 INTEGER, INTENT(IN ) :: ips,ipe, jps,jpe, kps,kpe
1187 INTEGER, INTENT(IN ) :: its,ite, jts,jte, kts,kte
1188 INTEGER, INTENT(IN ) :: iXs,iXe, jXs,jXe, kXs,kXe
1189 INTEGER, INTENT(IN ) :: spec_bdy_width, spec_zone, relax_zone
1190 REAL, INTENT(IN ) :: dtbc
1191 CHARACTER, INTENT(IN ) :: variable_in
1193 REAL, DIMENSION( iXs:iXe , kXs:kXe , jXs:jXe ), INTENT(IN ) :: field
1194 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(INOUT) :: field_tend
1195 REAL, DIMENSION( jms:jme , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_xs, field_bdy_xe
1196 REAL, DIMENSION( ims:ime , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_ys, field_bdy_ye
1197 REAL, DIMENSION( jms:jme , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_tend_xs, field_bdy_tend_xe
1198 REAL, DIMENSION( ims:ime , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_tend_ys, field_bdy_tend_ye
1199 REAL, DIMENSION( spec_bdy_width ), INTENT(IN ) :: fcx, gcx
1200 TYPE( grid_config_rec_type ) config_flags
1202 CALL relax_bdytend_core ( field, field_tend, &
1203 field_bdy_xs, field_bdy_xe, &
1204 field_bdy_ys, field_bdy_ye, &
1205 field_bdy_tend_xs, field_bdy_tend_xe, &
1206 field_bdy_tend_ys, field_bdy_tend_ye, &
1207 variable_in, config_flags, &
1208 spec_bdy_width, spec_zone, relax_zone, &
1210 ids,ide, jds,jde, kds,kde, & ! domain dims
1211 ims,ime, jms,jme, kms,kme, & ! memory dims
1212 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1213 its,ite, jts,jte, kts,kte, &
1214 iXs,iXe, jXs,jXe, kXs,kXe ) ! dimension of the field argument
1215 END SUBROUTINE relax_bdytend_tile
1217 SUBROUTINE relax_bdytend_core ( field, field_tend, &
1218 field_bdy_xs, field_bdy_xe, &
1219 field_bdy_ys, field_bdy_ye, &
1220 field_bdy_tend_xs, field_bdy_tend_xe, &
1221 field_bdy_tend_ys, field_bdy_tend_ye, &
1222 variable_in, config_flags, &
1223 spec_bdy_width, spec_zone, relax_zone, &
1225 ids,ide, jds,jde, kds,kde, & ! domain dims
1226 ims,ime, jms,jme, kms,kme, & ! memory dims
1227 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1228 its,ite, jts,jte, kts,kte, & ! patch dims
1229 iXs,iXe, jXs,jXe, kXs,kXe & ! field (1st arg) dims; might be tile or patch
1232 ! This subroutine adds the tendencies in the boundary relaxation region, for specified
1233 ! boundary conditions.
1234 ! spec_bdy_width is only used to dimension the boundary arrays.
1235 ! relax_zone is the inner edge of the boundary relaxation zone treated here.
1236 ! spec_zone is the width of the outer specified b.c.s that are not changed here.
1241 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde
1242 INTEGER, INTENT(IN ) :: ims,ime, jms,jme, kms,kme
1243 INTEGER, INTENT(IN ) :: ips,ipe, jps,jpe, kps,kpe
1244 INTEGER, INTENT(IN ) :: its,ite, jts,jte, kts,kte
1245 INTEGER, INTENT(IN ) :: iXs,iXe, jXs,jXe, kXs,kXe
1246 INTEGER, INTENT(IN ) :: spec_bdy_width, spec_zone, relax_zone
1247 REAL, INTENT(IN ) :: dtbc
1248 CHARACTER, INTENT(IN ) :: variable_in
1251 REAL, DIMENSION( iXs:iXe , kXs:kXe , jXs:jXe ), INTENT(IN ) :: field
1252 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(INOUT) :: field_tend
1253 REAL, DIMENSION( jms:jme , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_xs, field_bdy_xe
1254 REAL, DIMENSION( ims:ime , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_ys, field_bdy_ye
1255 REAL, DIMENSION( jms:jme , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_tend_xs, field_bdy_tend_xe
1256 REAL, DIMENSION( ims:ime , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_tend_ys, field_bdy_tend_ye
1257 REAL, DIMENSION( spec_bdy_width ), INTENT(IN ) :: fcx, gcx
1258 TYPE( grid_config_rec_type ) config_flags
1260 CHARACTER :: variable
1261 INTEGER :: i, j, k, ibs, ibe, jbs, jbe, itf, jtf, ktf, im1, ip1
1262 INTEGER :: b_dist, b_limit
1263 REAL :: fls0, fls1, fls2, fls3, fls4
1264 LOGICAL :: periodic_x
1266 periodic_x = config_flags%periodic_x
1267 variable = variable_in
1269 IF (variable == 'U') variable = 'u'
1270 IF (variable == 'V') variable = 'v'
1271 IF (variable == 'M') variable = 'm'
1272 IF (variable == 'H') variable = 'h'
1276 itf = min(ite,ide-1)
1279 jtf = min(jte,jde-1)
1281 IF (variable == 'u') ibe = ide
1282 IF (variable == 'u') itf = min(ite,ide)
1283 IF (variable == 'v') jbe = jde
1284 IF (variable == 'v') jtf = min(jte,jde)
1285 IF (variable == 'm') ktf = kte
1286 IF (variable == 'h') ktf = kte
1289 IF (jts - jbs .lt. relax_zone) THEN
1291 DO j = max(jts,jbs+spec_zone), min(jtf,jbs+relax_zone-1)
1294 IF(periodic_x)b_limit = 0
1296 DO i = max(its,b_limit+ibs), min(itf,ibe-b_limit)
1299 fls0 = field_bdy_ys(i, k, b_dist+1) &
1300 + dtbc * field_bdy_tend_ys(i, k, b_dist+1) &
1302 fls1 = field_bdy_ys(im1, k, b_dist+1) &
1303 + dtbc * field_bdy_tend_ys(im1, k, b_dist+1) &
1305 fls2 = field_bdy_ys(ip1, k, b_dist+1) &
1306 + dtbc * field_bdy_tend_ys(ip1, k, b_dist+1) &
1308 fls3 = field_bdy_ys(i, k, b_dist) &
1309 + dtbc * field_bdy_tend_ys(i, k, b_dist) &
1311 fls4 = field_bdy_ys(i, k, b_dist+2) &
1312 + dtbc * field_bdy_tend_ys(i, k, b_dist+2) &
1314 field_tend(i,k,j) = field_tend(i,k,j) &
1315 + fcx(b_dist+1)*fls0 &
1316 - gcx(b_dist+1)*(fls1+fls2+fls3+fls4-4.*fls0)
1322 IF (jbe - jtf .lt. relax_zone) THEN
1326 DO j = max(jts,jbe-relax_zone+1), min(jtf,jbe-spec_zone)
1329 IF(periodic_x)b_limit = 0
1333 DO i = max(its,b_limit+ibs), min(itf,ibe-b_limit)
1336 fls0 = field_bdy_ye(i, k, b_dist+1) &
1337 + dtbc * field_bdy_tend_ye(i, k, b_dist+1) &
1339 fls1 = field_bdy_ye(im1, k, b_dist+1) &
1340 + dtbc * field_bdy_tend_ye(im1, k, b_dist+1) &
1342 fls2 = field_bdy_ye(ip1, k, b_dist+1) &
1343 + dtbc * field_bdy_tend_ye(ip1, k, b_dist+1) &
1345 fls3 = field_bdy_ye(i, k, b_dist) &
1346 + dtbc * field_bdy_tend_ye(i, k, b_dist) &
1348 fls4 = field_bdy_ye(i, k, b_dist+2) &
1349 + dtbc * field_bdy_tend_ye(i, k, b_dist+2) &
1351 field_tend(i,k,j) = field_tend(i,k,j) &
1352 + fcx(b_dist+1)*fls0 &
1353 - gcx(b_dist+1)*(fls1+fls2+fls3+fls4-4.*fls0)
1360 IF(.NOT.periodic_x)THEN
1361 IF (its - ibs .lt. relax_zone) THEN
1363 DO i = max(its,ibs+spec_zone), min(itf,ibs+relax_zone-1)
1366 DO j = max(jts,b_dist+jbs+1), min(jtf,jbe-b_dist-1)
1367 fls0 = field_bdy_xs(j, k, b_dist+1) &
1368 + dtbc * field_bdy_tend_xs(j, k, b_dist+1) &
1370 fls1 = field_bdy_xs(j-1, k, b_dist+1) &
1371 + dtbc * field_bdy_tend_xs(j-1, k, b_dist+1) &
1373 fls2 = field_bdy_xs(j+1, k, b_dist+1) &
1374 + dtbc * field_bdy_tend_xs(j+1, k, b_dist+1) &
1376 fls3 = field_bdy_xs(j, k, b_dist) &
1377 + dtbc * field_bdy_tend_xs(j, k, b_dist) &
1379 fls4 = field_bdy_xs(j, k, b_dist+2) &
1380 + dtbc * field_bdy_tend_xs(j, k, b_dist+2) &
1382 field_tend(i,k,j) = field_tend(i,k,j) &
1383 + fcx(b_dist+1)*fls0 &
1384 - gcx(b_dist+1)*(fls1+fls2+fls3+fls4-4.*fls0)
1391 IF (ibe - itf .lt. relax_zone) THEN
1393 DO i = max(its,ibe-relax_zone+1), min(itf,ibe-spec_zone)
1396 DO j = max(jts,b_dist+jbs+1), min(jtf,jbe-b_dist-1)
1397 fls0 = field_bdy_xe(j, k, b_dist+1) &
1398 + dtbc * field_bdy_tend_xe(j, k, b_dist+1) &
1400 fls1 = field_bdy_xe(j-1, k, b_dist+1) &
1401 + dtbc * field_bdy_tend_xe(j-1, k, b_dist+1) &
1403 fls2 = field_bdy_xe(j+1, k, b_dist+1) &
1404 + dtbc * field_bdy_tend_xe(j+1, k, b_dist+1) &
1406 fls3 = field_bdy_xe(j, k, b_dist) &
1407 + dtbc * field_bdy_tend_xe(j, k, b_dist) &
1409 fls4 = field_bdy_xe(j, k, b_dist+2) &
1410 + dtbc * field_bdy_tend_xe(j, k, b_dist+2) &
1412 field_tend(i,k,j) = field_tend(i,k,j) &
1413 + fcx(b_dist+1)*fls0 &
1414 - gcx(b_dist+1)*(fls1+fls2+fls3+fls4-4.*fls0)
1423 END SUBROUTINE relax_bdytend_core
1424 !------------------------------------------------------------------------
1426 SUBROUTINE spec_bdytend ( field_tend, &
1427 field_bdy_xs, field_bdy_xe, &
1428 field_bdy_ys, field_bdy_ye, &
1429 field_bdy_tend_xs, field_bdy_tend_xe, &
1430 field_bdy_tend_ys, field_bdy_tend_ye, &
1431 variable_in, config_flags, &
1432 spec_bdy_width, spec_zone, &
1433 ids,ide, jds,jde, kds,kde, & ! domain dims
1434 ims,ime, jms,jme, kms,kme, & ! memory dims
1435 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1436 its,ite, jts,jte, kts,kte )
1438 ! This subroutine sets the tendencies in the boundary specified region.
1439 ! spec_bdy_width is only used to dimension the boundary arrays.
1440 ! spec_zone is the width of the outer specified b.c.s that are set here.
1445 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde
1446 INTEGER, INTENT(IN ) :: ims,ime, jms,jme, kms,kme
1447 INTEGER, INTENT(IN ) :: ips,ipe, jps,jpe, kps,kpe
1448 INTEGER, INTENT(IN ) :: its,ite, jts,jte, kts,kte
1449 INTEGER, INTENT(IN ) :: spec_bdy_width, spec_zone
1450 CHARACTER, INTENT(IN ) :: variable_in
1453 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(OUT ) :: field_tend
1454 REAL, DIMENSION( jms:jme , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_xs, field_bdy_xe
1455 REAL, DIMENSION( ims:ime , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_ys, field_bdy_ye
1456 REAL, DIMENSION( jms:jme , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_tend_xs, field_bdy_tend_xe
1457 REAL, DIMENSION( ims:ime , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_tend_ys, field_bdy_tend_ye
1458 TYPE( grid_config_rec_type ) config_flags
1460 CHARACTER :: variable
1461 INTEGER :: i, j, k, ibs, ibe, jbs, jbe, itf, jtf, ktf
1462 INTEGER :: b_dist, b_limit
1463 LOGICAL :: periodic_x
1465 periodic_x = config_flags%periodic_x
1467 variable = variable_in
1469 IF (variable == 'U') variable = 'u'
1470 IF (variable == 'V') variable = 'v'
1471 IF (variable == 'M') variable = 'm'
1472 IF (variable == 'H') variable = 'h'
1476 itf = min(ite,ide-1)
1479 jtf = min(jte,jde-1)
1481 IF (variable == 'u') ibe = ide
1482 IF (variable == 'u') itf = min(ite,ide)
1483 IF (variable == 'v') jbe = jde
1484 IF (variable == 'v') jtf = min(jte,jde)
1485 IF (variable == 'm') ktf = kte
1486 IF (variable == 'h') ktf = kte
1488 IF (jts - jbs .lt. spec_zone) THEN
1490 DO j = jts, min(jtf,jbs+spec_zone-1)
1493 IF(periodic_x)b_limit = 0
1495 DO i = max(its,b_limit+ibs), min(itf,ibe-b_limit)
1496 field_tend(i,k,j) = field_bdy_tend_ys(i, k, b_dist+1)
1501 IF (jbe - jtf .lt. spec_zone) THEN
1505 DO j = max(jts,jbe-spec_zone+1), jtf
1508 IF(periodic_x)b_limit = 0
1512 DO i = max(its,b_limit+ibs), min(itf,ibe-b_limit)
1513 field_tend(i,k,j) = field_bdy_tend_ye(i, k, b_dist+1)
1519 IF(.NOT.periodic_x)THEN
1520 IF (its - ibs .lt. spec_zone) THEN
1522 DO i = its, min(itf,ibs+spec_zone-1)
1525 DO j = max(jts,b_dist+jbs+1), min(jtf,jbe-b_dist-1)
1526 field_tend(i,k,j) = field_bdy_tend_xs(j, k, b_dist+1)
1532 IF (ibe - itf .lt. spec_zone) THEN
1534 DO i = max(its,ibe-spec_zone+1), itf
1537 DO j = max(jts,b_dist+jbs+1), min(jtf,jbe-b_dist-1)
1538 field_tend(i,k,j) = field_bdy_tend_xe(j, k, b_dist+1)
1545 END SUBROUTINE spec_bdytend
1546 !------------------------------------------------------------------------
1548 SUBROUTINE spec_bdyfield ( field, &
1549 field_bdy_xs, field_bdy_xe, &
1550 field_bdy_ys, field_bdy_ye, &
1551 variable_in, config_flags, &
1552 spec_bdy_width, spec_zone, &
1553 ids,ide, jds,jde, kds,kde, & ! domain dims
1554 ims,ime, jms,jme, kms,kme, & ! memory dims
1555 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1556 its,ite, jts,jte, kts,kte )
1558 ! This subroutine sets the tendencies in the boundary specified region.
1559 ! spec_bdy_width is only used to dimension the boundary arrays.
1560 ! spec_zone is the width of the outer specified b.c.s that are set here.
1565 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde
1566 INTEGER, INTENT(IN ) :: ims,ime, jms,jme, kms,kme
1567 INTEGER, INTENT(IN ) :: ips,ipe, jps,jpe, kps,kpe
1568 INTEGER, INTENT(IN ) :: its,ite, jts,jte, kts,kte
1569 INTEGER, INTENT(IN ) :: spec_bdy_width, spec_zone
1570 CHARACTER, INTENT(IN ) :: variable_in
1573 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(OUT ) :: field
1574 REAL, DIMENSION( jms:jme , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_xs, field_bdy_xe
1575 REAL, DIMENSION( ims:ime , kds:kde , spec_bdy_width ), INTENT(IN ) :: field_bdy_ys, field_bdy_ye
1576 TYPE( grid_config_rec_type ) config_flags
1578 CHARACTER :: variable
1579 INTEGER :: i, j, k, ibs, ibe, jbs, jbe, itf, jtf, ktf
1580 INTEGER :: b_dist, b_limit
1581 LOGICAL :: periodic_x
1583 periodic_x = config_flags%periodic_x
1585 variable = variable_in
1587 IF (variable == 'U') variable = 'u'
1588 IF (variable == 'V') variable = 'v'
1589 IF (variable == 'M') variable = 'm'
1590 IF (variable == 'H') variable = 'h'
1594 itf = min(ite,ide-1)
1597 jtf = min(jte,jde-1)
1599 IF (variable == 'u') ibe = ide
1600 IF (variable == 'u') itf = min(ite,ide)
1601 IF (variable == 'v') jbe = jde
1602 IF (variable == 'v') jtf = min(jte,jde)
1603 IF (variable == 'm') ktf = kte
1604 IF (variable == 'h') ktf = kte
1606 IF (jts - jbs .lt. spec_zone) THEN
1608 DO j = jts, min(jtf,jbs+spec_zone-1)
1611 IF(periodic_x)b_limit = 0
1613 DO i = max(its,b_limit+ibs), min(itf,ibe-b_limit)
1614 field(i,k,j) = field_bdy_ys(i, k, b_dist+1)
1619 IF (jbe - jtf .lt. spec_zone) THEN
1621 DO j = max(jts,jbe-spec_zone+1), jtf
1624 IF(periodic_x)b_limit = 0
1626 DO i = max(its,b_limit+ibs), min(itf,ibe-b_limit)
1627 field(i,k,j) = field_bdy_ye(i, k, b_dist+1)
1633 IF(.NOT.periodic_x)THEN
1634 IF (its - ibs .lt. spec_zone) THEN
1636 DO i = its, min(itf,ibs+spec_zone-1)
1639 DO j = max(jts,b_dist+jbs+1), min(jtf,jbe-b_dist-1)
1640 field(i,k,j) = field_bdy_xs(j, k, b_dist+1)
1646 IF (ibe - itf .lt. spec_zone) THEN
1648 DO i = max(its,ibe-spec_zone+1), itf
1651 DO j = max(jts,b_dist+jbs+1), min(jtf,jbe-b_dist-1)
1652 field(i,k,j) = field_bdy_xe(j, k, b_dist+1)
1659 END SUBROUTINE spec_bdyfield
1660 !------------------------------------------------------------------------
1662 SUBROUTINE spec_bdyupdate( field, &
1664 variable_in, config_flags, &
1666 ids,ide, jds,jde, kds,kde, & ! domain dims
1667 ims,ime, jms,jme, kms,kme, & ! memory dims
1668 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1669 its,ite, jts,jte, kts,kte )
1671 ! This subroutine adds the tendencies in the boundary specified region.
1672 ! spec_zone is the width of the outer specified b.c.s that are set here.
1677 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde
1678 INTEGER, INTENT(IN ) :: ims,ime, jms,jme, kms,kme
1679 INTEGER, INTENT(IN ) :: ips,ipe, jps,jpe, kps,kpe
1680 INTEGER, INTENT(IN ) :: its,ite, jts,jte, kts,kte
1681 INTEGER, INTENT(IN ) :: spec_zone
1682 CHARACTER, INTENT(IN ) :: variable_in
1683 REAL, INTENT(IN ) :: dt
1686 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(INOUT) :: field
1687 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(IN ) :: field_tend
1688 TYPE( grid_config_rec_type ) config_flags
1690 CHARACTER :: variable
1691 INTEGER :: i, j, k, ibs, ibe, jbs, jbe, itf, jtf, ktf
1692 INTEGER :: b_dist, b_limit
1693 LOGICAL :: periodic_x
1695 periodic_x = config_flags%periodic_x
1697 variable = variable_in
1699 IF (variable == 'U') variable = 'u'
1700 IF (variable == 'V') variable = 'v'
1701 IF (variable == 'M') variable = 'm'
1702 IF (variable == 'H') variable = 'h'
1706 itf = min(ite,ide-1)
1709 jtf = min(jte,jde-1)
1711 IF (variable == 'u') ibe = ide
1712 IF (variable == 'u') itf = min(ite,ide)
1713 IF (variable == 'v') jbe = jde
1714 IF (variable == 'v') jtf = min(jte,jde)
1715 IF (variable == 'm') ktf = kte
1716 IF (variable == 'h') ktf = kte
1718 IF (jts - jbs .lt. spec_zone) THEN
1720 DO j = jts, min(jtf,jbs+spec_zone-1)
1723 IF(periodic_x)b_limit = 0
1725 DO i = max(its,b_limit+ibs), min(itf,ibe-b_limit)
1726 field(i,k,j) = field(i,k,j) + dt*field_tend(i,k,j)
1731 IF (jbe - jtf .lt. spec_zone) THEN
1733 DO j = max(jts,jbe-spec_zone+1), jtf
1736 IF(periodic_x)b_limit = 0
1738 DO i = max(its,b_limit+ibs), min(itf,ibe-b_limit)
1739 field(i,k,j) = field(i,k,j) + dt*field_tend(i,k,j)
1745 IF(.NOT.periodic_x)THEN
1746 IF (its - ibs .lt. spec_zone) THEN
1748 DO i = its, min(itf,ibs+spec_zone-1)
1751 DO j = max(jts,b_dist+jbs+1), min(jtf,jbe-b_dist-1)
1752 field(i,k,j) = field(i,k,j) + dt*field_tend(i,k,j)
1758 IF (ibe - itf .lt. spec_zone) THEN
1760 DO i = max(its,ibe-spec_zone+1), itf
1763 DO j = max(jts,b_dist+jbs+1), min(jtf,jbe-b_dist-1)
1764 field(i,k,j) = field(i,k,j) + dt*field_tend(i,k,j)
1771 END SUBROUTINE spec_bdyupdate
1772 !------------------------------------------------------------------------
1774 SUBROUTINE zero_grad_bdy ( field, &
1775 variable_in, config_flags, &
1777 ids,ide, jds,jde, kds,kde, & ! domain dims
1778 ims,ime, jms,jme, kms,kme, & ! memory dims
1779 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1780 its,ite, jts,jte, kts,kte )
1782 ! This subroutine sets zero gradient conditions in the boundary specified region.
1783 ! spec_zone is the width of the outer specified b.c.s that are set here.
1788 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde
1789 INTEGER, INTENT(IN ) :: ims,ime, jms,jme, kms,kme
1790 INTEGER, INTENT(IN ) :: ips,ipe, jps,jpe, kps,kpe
1791 INTEGER, INTENT(IN ) :: its,ite, jts,jte, kts,kte
1792 INTEGER, INTENT(IN ) :: spec_zone
1793 CHARACTER, INTENT(IN ) :: variable_in
1796 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(INOUT) :: field
1797 TYPE( grid_config_rec_type ) config_flags
1799 CHARACTER :: variable
1800 INTEGER :: i, j, k, ibs, ibe, jbs, jbe, itf, jtf, ktf, i_inner, j_inner
1801 INTEGER :: b_dist, b_limit
1802 LOGICAL :: periodic_x
1804 periodic_x = config_flags%periodic_x
1806 variable = variable_in
1808 IF (variable == 'U') variable = 'u'
1809 IF (variable == 'V') variable = 'v'
1813 itf = min(ite,ide-1)
1816 jtf = min(jte,jde-1)
1818 IF (variable == 'u') ibe = ide
1819 IF (variable == 'u') itf = min(ite,ide)
1820 IF (variable == 'v') jbe = jde
1821 IF (variable == 'v') jtf = min(jte,jde)
1822 IF (variable == 'w') ktf = kde
1824 IF (jts - jbs .lt. spec_zone) THEN
1826 DO j = jts, min(jtf,jbs+spec_zone-1)
1829 IF(periodic_x)b_limit = 0
1831 DO i = max(its,b_limit+ibs), min(itf,ibe-b_limit)
1832 i_inner = max(i,ibs+spec_zone)
1833 i_inner = min(i_inner,ibe-spec_zone)
1834 IF(periodic_x)i_inner = i
1835 field(i,k,j) = field(i_inner,k,jbs+spec_zone)
1840 IF (jbe - jtf .lt. spec_zone) THEN
1842 DO j = max(jts,jbe-spec_zone+1), jtf
1845 IF(periodic_x)b_limit = 0
1847 DO i = max(its,b_limit+ibs), min(itf,ibe-b_limit)
1848 i_inner = max(i,ibs+spec_zone)
1849 i_inner = min(i_inner,ibe-spec_zone)
1850 IF(periodic_x)i_inner = i
1851 field(i,k,j) = field(i_inner,k,jbe-spec_zone)
1857 IF(.NOT.periodic_x)THEN
1858 IF (its - ibs .lt. spec_zone) THEN
1860 DO i = its, min(itf,ibs+spec_zone-1)
1863 DO j = max(jts,b_dist+jbs+1), min(jtf,jbe-b_dist-1)
1864 j_inner = max(j,jbs+spec_zone)
1865 j_inner = min(j_inner,jbe-spec_zone)
1866 field(i,k,j) = field(ibs+spec_zone,k,j_inner)
1872 IF (ibe - itf .lt. spec_zone) THEN
1874 DO i = max(its,ibe-spec_zone+1), itf
1877 DO j = max(jts,b_dist+jbs+1), min(jtf,jbe-b_dist-1)
1878 j_inner = max(j,jbs+spec_zone)
1879 j_inner = min(j_inner,jbe-spec_zone)
1880 field(i,k,j) = field(ibe-spec_zone,k,j_inner)
1887 END SUBROUTINE zero_grad_bdy
1888 !------------------------------------------------------------------------
1890 SUBROUTINE flow_dep_bdy ( field, &
1891 u, v, config_flags, &
1893 ids,ide, jds,jde, kds,kde, & ! domain dims
1894 ims,ime, jms,jme, kms,kme, & ! memory dims
1895 ips,ipe, jps,jpe, kps,kpe, & ! patch dims
1896 its,ite, jts,jte, kts,kte )
1898 ! This subroutine sets zero gradient conditions for outflow and zero value
1899 ! for inflow in the boundary specified region. Note that field must be unstaggered.
1900 ! The velocities, u and v, will only be used to check their sign (coupled vels OK)
1901 ! spec_zone is the width of the outer specified b.c.s that are set here.
1906 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde
1907 INTEGER, INTENT(IN ) :: ims,ime, jms,jme, kms,kme
1908 INTEGER, INTENT(IN ) :: ips,ipe, jps,jpe, kps,kpe
1909 INTEGER, INTENT(IN ) :: its,ite, jts,jte, kts,kte
1910 INTEGER, INTENT(IN ) :: spec_zone
1913 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(INOUT) :: field
1914 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(IN ) :: u
1915 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), INTENT(IN ) :: v
1916 TYPE( grid_config_rec_type ) config_flags
1918 INTEGER :: i, j, k, ibs, ibe, jbs, jbe, itf, jtf, ktf, i_inner, j_inner
1919 INTEGER :: b_dist, b_limit
1920 LOGICAL :: periodic_x
1922 periodic_x = config_flags%periodic_x
1926 itf = min(ite,ide-1)
1929 jtf = min(jte,jde-1)
1932 IF (jts - jbs .lt. spec_zone) THEN
1934 DO j = jts, min(jtf,jbs+spec_zone-1)
1937 IF(periodic_x)b_limit = 0
1939 DO i = max(its,b_limit+ibs), min(itf,ibe-b_limit)
1940 i_inner = max(i,ibs+spec_zone)
1941 i_inner = min(i_inner,ibe-spec_zone)
1942 IF(periodic_x)i_inner = i
1943 IF(v(i,k,j) .lt. 0.)THEN
1944 field(i,k,j) = field(i_inner,k,jbs+spec_zone)
1952 IF (jbe - jtf .lt. spec_zone) THEN
1954 DO j = max(jts,jbe-spec_zone+1), jtf
1957 IF(periodic_x)b_limit = 0
1959 DO i = max(its,b_limit+ibs), min(itf,ibe-b_limit)
1960 i_inner = max(i,ibs+spec_zone)
1961 i_inner = min(i_inner,ibe-spec_zone)
1962 IF(periodic_x)i_inner = i
1963 IF(v(i,k,j+1) .gt. 0.)THEN
1964 field(i,k,j) = field(i_inner,k,jbe-spec_zone)
1973 IF(.NOT.periodic_x)THEN
1974 IF (its - ibs .lt. spec_zone) THEN
1976 DO i = its, min(itf,ibs+spec_zone-1)
1979 DO j = max(jts,b_dist+jbs+1), min(jtf,jbe-b_dist-1)
1980 j_inner = max(j,jbs+spec_zone)
1981 j_inner = min(j_inner,jbe-spec_zone)
1982 IF(u(i,k,j) .lt. 0.)THEN
1983 field(i,k,j) = field(ibs+spec_zone,k,j_inner)
1992 IF (ibe - itf .lt. spec_zone) THEN
1994 DO i = max(its,ibe-spec_zone+1), itf
1997 DO j = max(jts,b_dist+jbs+1), min(jtf,jbe-b_dist-1)
1998 j_inner = max(j,jbs+spec_zone)
1999 j_inner = min(j_inner,jbe-spec_zone)
2000 IF(u(i+1,k,j) .gt. 0.)THEN
2001 field(i,k,j) = field(ibe-spec_zone,k,j_inner)
2011 END SUBROUTINE flow_dep_bdy
2013 !------------------------------------------------------------------------------
2015 SUBROUTINE stuff_bdy_new ( data3d , space_bdy_xs, space_bdy_xe, space_bdy_ys, space_bdy_ye, &
2018 ids, ide, jds, jde, kds, kde , &
2019 ims, ime, jms, jme, kms, kme , &
2020 its, ite, jts, jte, kts, kte )
2022 ! This routine puts the data in the 3d arrays into the proper locations
2023 ! for the lateral boundary arrays.
2025 USE module_state_description
2029 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde
2030 INTEGER , INTENT(IN) :: ims, ime, jms, jme, kms, kme
2031 INTEGER , INTENT(IN) :: its, ite, jts, jte, kts, kte
2032 INTEGER , INTENT(IN) :: spec_bdy_width
2033 REAL , DIMENSION(ims:ime,kms:kme,jms:jme) , INTENT(IN) :: data3d
2034 REAL , DIMENSION(jms:jme,kds:kde,spec_bdy_width) , INTENT(OUT) :: space_bdy_xs, space_bdy_xe
2035 REAL , DIMENSION(ims:ime,kds:kde,spec_bdy_width) , INTENT(OUT) :: space_bdy_ys, space_bdy_ye
2036 CHARACTER (LEN=1) , INTENT(IN) :: char_stagger
2038 INTEGER :: i , ii , j , jj , k
2040 ! There are four lateral boundary locations that are stored.
2044 IF ( char_stagger .EQ. 'W' ) THEN
2045 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2047 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2048 space_bdy_xs(j,k,i) = data3d(i,k,j)
2052 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2053 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2055 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2056 space_bdy_xs(j,k,i) = data3d(i,k,j)
2060 ELSE IF ( char_stagger .EQ. 'V' ) THEN
2061 DO j = MAX(jds,jts) , MIN(jde,jte)
2062 DO k = kds , kde - 1
2063 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2064 space_bdy_xs(j,k,i) = data3d(i,k,j)
2069 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2070 DO k = kds , kde - 1
2071 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2072 space_bdy_xs(j,k,i) = data3d(i,k,j)
2080 IF ( char_stagger .EQ. 'U' ) THEN
2081 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2082 DO k = kds , kde - 1
2083 DO i = MIN(ide,ite) , MAX(ide - spec_bdy_width + 1,its) , -1
2085 space_bdy_xe(j,k,ii) = data3d(i,k,j)
2089 ELSE IF ( char_stagger .EQ. 'V' ) THEN
2090 DO j = MAX(jds,jts) , MIN(jde,jte)
2091 DO k = kds , kde - 1
2092 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2094 space_bdy_xe(j,k,ii) = data3d(i,k,j)
2098 ELSE IF ( char_stagger .EQ. 'W' ) THEN
2099 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2101 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2103 space_bdy_xe(j,k,ii) = data3d(i,k,j)
2107 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2108 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2110 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2112 space_bdy_xe(j,k,ii) = data3d(i,k,j)
2117 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2118 DO k = kds , kde - 1
2119 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2121 space_bdy_xe(j,k,ii) = data3d(i,k,j)
2129 IF ( char_stagger .EQ. 'W' ) THEN
2130 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2132 DO i = MAX(ids,its) , MIN(ide-1,ite)
2133 space_bdy_ys(i,k,j) = data3d(i,k,j)
2137 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2138 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2140 DO i = MAX(ids,its) , MIN(ide-1,ite)
2141 space_bdy_ys(i,k,j) = data3d(i,k,j)
2145 ELSE IF ( char_stagger .EQ. 'U' ) THEN
2146 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2147 DO k = kds , kde - 1
2148 DO i = MAX(ids,its) , MIN(ide,ite)
2149 space_bdy_ys(i,k,j) = data3d(i,k,j)
2154 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2155 DO k = kds , kde - 1
2156 DO i = MAX(ids,its) , MIN(ide-1,ite)
2157 space_bdy_ys(i,k,j) = data3d(i,k,j)
2165 IF ( char_stagger .EQ. 'V' ) THEN
2166 DO j = MIN(jde,jte) , MAX(jde - spec_bdy_width + 1,jts) , -1
2167 DO k = kds , kde - 1
2168 DO i = MAX(ids,its) , MIN(ide-1,ite)
2170 space_bdy_ye(i,k,jj) = data3d(i,k,j)
2174 ELSE IF ( char_stagger .EQ. 'U' ) THEN
2175 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2176 DO k = kds , kde - 1
2177 DO i = MAX(ids,its) , MIN(ide,ite)
2179 space_bdy_ye(i,k,jj) = data3d(i,k,j)
2183 ELSE IF ( char_stagger .EQ. 'W' ) THEN
2184 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2186 DO i = MAX(ids,its) , MIN(ide-1,ite)
2188 space_bdy_ye(i,k,jj) = data3d(i,k,j)
2192 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2193 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2195 DO i = MAX(ids,its) , MIN(ide-1,ite)
2197 space_bdy_ye(i,k,jj) = data3d(i,k,j)
2202 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2203 DO k = kds , kde - 1
2204 DO i = MAX(ids,its) , MIN(ide-1,ite)
2206 space_bdy_ye(i,k,jj) = data3d(i,k,j)
2212 END SUBROUTINE stuff_bdy_new
2214 SUBROUTINE stuff_bdytend_new ( data3dnew , data3dold , time_diff , &
2215 space_bdy_xs, space_bdy_xe, space_bdy_ys, space_bdy_ye, &
2218 ids, ide, jds, jde, kds, kde , &
2219 ims, ime, jms, jme, kms, kme , &
2220 its, ite, jts, jte, kts, kte )
2222 ! This routine puts the tendency data into the proper locations
2223 ! for the lateral boundary arrays.
2225 USE module_state_description
2229 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde
2230 INTEGER , INTENT(IN) :: ims, ime, jms, jme, kms, kme
2231 INTEGER , INTENT(IN) :: its, ite, jts, jte, kts, kte
2232 INTEGER , INTENT(IN) :: spec_bdy_width
2233 REAL , DIMENSION(ims:ime,kms:kme,jms:jme) , INTENT(IN) :: data3dnew , data3dold
2234 REAL , DIMENSION(jms:jme,kds:kde,spec_bdy_width) , INTENT(OUT) :: space_bdy_xs, space_bdy_xe
2235 REAL , DIMENSION(ims:ime,kds:kde,spec_bdy_width) , INTENT(OUT) :: space_bdy_ys, space_bdy_ye
2236 CHARACTER (LEN=1) , INTENT(IN) :: char_stagger
2237 REAL , INTENT(IN) :: time_diff ! seconds
2239 INTEGER :: i , ii , j , jj , k
2241 ! There are four lateral boundary locations that are stored.
2245 IF ( char_stagger .EQ. 'W' ) THEN
2246 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2248 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2249 space_bdy_xs(j,k,i) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2253 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2254 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2256 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2257 space_bdy_xs(j,k,i) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2261 ELSE IF ( char_stagger .EQ. 'V' ) THEN
2262 DO j = MAX(jds,jts) , MIN(jde,jte)
2263 DO k = kds , kde - 1
2264 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2265 space_bdy_xs(j,k,i) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2270 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2271 DO k = kds , kde - 1
2272 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2273 space_bdy_xs(j,k,i) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2281 IF ( char_stagger .EQ. 'U' ) THEN
2282 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2283 DO k = kds , kde - 1
2284 DO i = MIN(ide,ite) , MAX(ide - spec_bdy_width + 1,its) , -1
2286 space_bdy_xe(j,k,ii) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2290 ELSE IF ( char_stagger .EQ. 'V' ) THEN
2291 DO j = MAX(jds,jts) , MIN(jde,jte)
2292 DO k = kds , kde - 1
2293 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2295 space_bdy_xe(j,k,ii) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2299 ELSE IF ( char_stagger .EQ. 'W' ) THEN
2300 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2302 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2304 space_bdy_xe(j,k,ii) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2308 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2309 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2311 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2313 space_bdy_xe(j,k,ii) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2318 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2319 DO k = kds , kde - 1
2320 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2322 space_bdy_xe(j,k,ii) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2330 IF ( char_stagger .EQ. 'W' ) THEN
2331 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2333 DO i = MAX(ids,its) , MIN(ide-1,ite)
2334 space_bdy_ys(i,k,j) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2338 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2339 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2341 DO i = MAX(ids,its) , MIN(ide-1,ite)
2342 space_bdy_ys(i,k,j) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2346 ELSE IF ( char_stagger .EQ. 'U' ) THEN
2347 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2348 DO k = kds , kde - 1
2349 DO i = MAX(ids,its) , MIN(ide,ite)
2350 space_bdy_ys(i,k,j) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2355 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2356 DO k = kds , kde - 1
2357 DO i = MAX(ids,its) , MIN(ide-1,ite)
2358 space_bdy_ys(i,k,j) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2366 IF ( char_stagger .EQ. 'V' ) THEN
2367 DO j = MIN(jde,jte) , MAX(jde - spec_bdy_width + 1,jts) , -1
2368 DO k = kds , kde - 1
2369 DO i = MAX(ids,its) , MIN(ide-1,ite)
2371 space_bdy_ye(i,k,jj) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2375 ELSE IF ( char_stagger .EQ. 'U' ) THEN
2376 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2377 DO k = kds , kde - 1
2378 DO i = MAX(ids,its) , MIN(ide,ite)
2380 space_bdy_ye(i,k,jj) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2384 ELSE IF ( char_stagger .EQ. 'W' ) THEN
2385 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2387 DO i = MAX(ids,its) , MIN(ide-1,ite)
2389 space_bdy_ye(i,k,jj) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2393 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2394 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2396 DO i = MAX(ids,its) , MIN(ide-1,ite)
2398 space_bdy_ye(i,k,jj) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2403 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2404 DO k = kds , kde - 1
2405 DO i = MAX(ids,its) , MIN(ide-1,ite)
2407 space_bdy_ye(i,k,jj) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2413 END SUBROUTINE stuff_bdytend_new
2415 !--- old versions for use with modules that use the old bdy data structures ---
2417 SUBROUTINE stuff_bdy_old ( data3d , space_bdy , char_stagger , &
2418 ijds , ijde , spec_bdy_width , &
2419 ids, ide, jds, jde, kds, kde , &
2420 ims, ime, jms, jme, kms, kme , &
2421 its, ite, jts, jte, kts, kte )
2423 ! This routine puts the data in the 3d arrays into the proper locations
2424 ! for the lateral boundary arrays.
2426 USE module_state_description
2430 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde
2431 INTEGER , INTENT(IN) :: ims, ime, jms, jme, kms, kme
2432 INTEGER , INTENT(IN) :: its, ite, jts, jte, kts, kte
2433 INTEGER , INTENT(IN) :: ijds , ijde , spec_bdy_width
2434 REAL , DIMENSION(ims:ime,kms:kme,jms:jme) , INTENT(IN) :: data3d
2435 REAL , DIMENSION(ijds:ijde,kds:kde,spec_bdy_width,4) , INTENT(OUT) :: space_bdy
2436 CHARACTER (LEN=1) , INTENT(IN) :: char_stagger
2438 INTEGER :: i , ii , j , jj , k
2440 ! There are four lateral boundary locations that are stored.
2444 IF ( char_stagger .EQ. 'W' ) THEN
2445 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2447 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2448 space_bdy(j,k,i,P_XSB) = data3d(i,k,j)
2452 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2453 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2455 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2456 space_bdy(j,k,i,P_XSB) = data3d(i,k,j)
2460 ELSE IF ( char_stagger .EQ. 'V' ) THEN
2461 DO j = MAX(jds,jts) , MIN(jde,jte)
2462 DO k = kds , kde - 1
2463 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2464 space_bdy(j,k,i,P_XSB) = data3d(i,k,j)
2469 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2470 DO k = kds , kde - 1
2471 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2472 space_bdy(j,k,i,P_XSB) = data3d(i,k,j)
2480 IF ( char_stagger .EQ. 'U' ) THEN
2481 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2482 DO k = kds , kde - 1
2483 DO i = MIN(ide,ite) , MAX(ide - spec_bdy_width + 1,its) , -1
2485 space_bdy(j,k,ii,P_XEB) = data3d(i,k,j)
2489 ELSE IF ( char_stagger .EQ. 'V' ) THEN
2490 DO j = MAX(jds,jts) , MIN(jde,jte)
2491 DO k = kds , kde - 1
2492 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2494 space_bdy(j,k,ii,P_XEB) = data3d(i,k,j)
2498 ELSE IF ( char_stagger .EQ. 'W' ) THEN
2499 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2501 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2503 space_bdy(j,k,ii,P_XEB) = data3d(i,k,j)
2507 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2508 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2510 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2512 space_bdy(j,k,ii,P_XEB) = data3d(i,k,j)
2517 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2518 DO k = kds , kde - 1
2519 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2521 space_bdy(j,k,ii,P_XEB) = data3d(i,k,j)
2529 IF ( char_stagger .EQ. 'W' ) THEN
2530 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2532 DO i = MAX(ids,its) , MIN(ide-1,ite)
2533 space_bdy(i,k,j,P_YSB) = data3d(i,k,j)
2537 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2538 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2540 DO i = MAX(ids,its) , MIN(ide-1,ite)
2541 space_bdy(i,k,j,P_YSB) = data3d(i,k,j)
2545 ELSE IF ( char_stagger .EQ. 'U' ) THEN
2546 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2547 DO k = kds , kde - 1
2548 DO i = MAX(ids,its) , MIN(ide,ite)
2549 space_bdy(i,k,j,P_YSB) = data3d(i,k,j)
2554 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2555 DO k = kds , kde - 1
2556 DO i = MAX(ids,its) , MIN(ide-1,ite)
2557 space_bdy(i,k,j,P_YSB) = data3d(i,k,j)
2565 IF ( char_stagger .EQ. 'V' ) THEN
2566 DO j = MIN(jde,jte) , MAX(jde - spec_bdy_width + 1,jts) , -1
2567 DO k = kds , kde - 1
2568 DO i = MAX(ids,its) , MIN(ide-1,ite)
2570 space_bdy(i,k,jj,P_YEB) = data3d(i,k,j)
2574 ELSE IF ( char_stagger .EQ. 'U' ) THEN
2575 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2576 DO k = kds , kde - 1
2577 DO i = MAX(ids,its) , MIN(ide,ite)
2579 space_bdy(i,k,jj,P_YEB) = data3d(i,k,j)
2583 ELSE IF ( char_stagger .EQ. 'W' ) THEN
2584 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2586 DO i = MAX(ids,its) , MIN(ide-1,ite)
2588 space_bdy(i,k,jj,P_YEB) = data3d(i,k,j)
2592 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2593 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2595 DO i = MAX(ids,its) , MIN(ide-1,ite)
2597 space_bdy(i,k,jj,P_YEB) = data3d(i,k,j)
2602 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2603 DO k = kds , kde - 1
2604 DO i = MAX(ids,its) , MIN(ide-1,ite)
2606 space_bdy(i,k,jj,P_YEB) = data3d(i,k,j)
2612 END SUBROUTINE stuff_bdy_old
2614 SUBROUTINE stuff_bdytend_old ( data3dnew , data3dold , time_diff , space_bdy , char_stagger , &
2615 ijds , ijde , spec_bdy_width , &
2616 ids, ide, jds, jde, kds, kde , &
2617 ims, ime, jms, jme, kms, kme , &
2618 its, ite, jts, jte, kts, kte )
2620 ! This routine puts the tendency data into the proper locations
2621 ! for the lateral boundary arrays.
2623 USE module_state_description
2627 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde
2628 INTEGER , INTENT(IN) :: ims, ime, jms, jme, kms, kme
2629 INTEGER , INTENT(IN) :: its, ite, jts, jte, kts, kte
2630 INTEGER , INTENT(IN) :: ijds , ijde , spec_bdy_width
2631 REAL , DIMENSION(ims:ime,kms:kme,jms:jme) , INTENT(IN) :: data3dnew , data3dold
2632 ! REAL , DIMENSION(:,:,:,:) , INTENT(OUT) :: space_bdy
2633 REAL , DIMENSION(ijds:ijde,kds:kde,spec_bdy_width,4) , INTENT(OUT) :: space_bdy
2634 CHARACTER (LEN=1) , INTENT(IN) :: char_stagger
2635 REAL , INTENT(IN) :: time_diff ! seconds
2637 INTEGER :: i , ii , j , jj , k
2639 ! There are four lateral boundary locations that are stored.
2643 IF ( char_stagger .EQ. 'W' ) THEN
2644 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2646 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2647 space_bdy(j,k,i,P_XSB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2648 ! space_bdy(j,k,i,P_XSB) = 0. ! zeroout
2652 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2653 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2655 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2656 space_bdy(j,k,i,P_XSB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2657 ! space_bdy(j,k,i,P_XSB) = 0. ! zeroout
2661 ELSE IF ( char_stagger .EQ. 'V' ) THEN
2662 DO j = MAX(jds,jts) , MIN(jde,jte)
2663 DO k = kds , kde - 1
2664 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2665 space_bdy(j,k,i,P_XSB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2666 ! space_bdy(j,k,i,P_XSB) = 0. ! zeroout
2671 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2672 DO k = kds , kde - 1
2673 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2674 space_bdy(j,k,i,P_XSB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2675 ! space_bdy(j,k,i,P_XSB) = 0. ! zeroout
2683 IF ( char_stagger .EQ. 'U' ) THEN
2684 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2685 DO k = kds , kde - 1
2686 DO i = MIN(ide,ite) , MAX(ide - spec_bdy_width + 1,its) , -1
2688 space_bdy(j,k,ii,P_XEB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2689 ! space_bdy(j,k,ii,P_XEB) = 0. ! zeroout
2693 ELSE IF ( char_stagger .EQ. 'V' ) THEN
2694 DO j = MAX(jds,jts) , MIN(jde,jte)
2695 DO k = kds , kde - 1
2696 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2698 space_bdy(j,k,ii,P_XEB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2699 ! space_bdy(j,k,ii,P_XEB) = 0. ! zeroout
2703 ELSE IF ( char_stagger .EQ. 'W' ) THEN
2704 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2706 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2708 space_bdy(j,k,ii,P_XEB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2709 ! space_bdy(j,k,ii,P_XEB) = 0. ! zeroout
2713 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2714 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2716 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2718 space_bdy(j,k,ii,P_XEB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2719 ! space_bdy(j,k,ii,P_XEB) = 0. ! zeroout
2724 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2725 DO k = kds , kde - 1
2726 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2728 space_bdy(j,k,ii,P_XEB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2729 ! space_bdy(j,k,ii,P_XEB) = 0. ! zeroout
2737 IF ( char_stagger .EQ. 'W' ) THEN
2738 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2740 DO i = MAX(ids,its) , MIN(ide-1,ite)
2741 space_bdy(i,k,j,P_YSB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2742 ! space_bdy(i,k,j,P_YSB) = 0. ! zeroout
2746 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2747 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2749 DO i = MAX(ids,its) , MIN(ide-1,ite)
2750 space_bdy(i,k,j,P_YSB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2751 ! space_bdy(i,k,j,P_YSB) = 0. ! zeroout
2755 ELSE IF ( char_stagger .EQ. 'U' ) THEN
2756 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2757 DO k = kds , kde - 1
2758 DO i = MAX(ids,its) , MIN(ide,ite)
2759 space_bdy(i,k,j,P_YSB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2760 ! space_bdy(i,k,j,P_YSB) = 0. ! zeroout
2765 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2766 DO k = kds , kde - 1
2767 DO i = MAX(ids,its) , MIN(ide-1,ite)
2768 space_bdy(i,k,j,P_YSB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2769 ! space_bdy(i,k,j,P_YSB) = 0. ! zeroout
2777 IF ( char_stagger .EQ. 'V' ) THEN
2778 DO j = MIN(jde,jte) , MAX(jde - spec_bdy_width + 1,jts) , -1
2779 DO k = kds , kde - 1
2780 DO i = MAX(ids,its) , MIN(ide-1,ite)
2782 space_bdy(i,k,jj,P_YEB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2783 ! space_bdy(i,k,jj,P_YEB) = 0. ! zeroout
2787 ELSE IF ( char_stagger .EQ. 'U' ) THEN
2788 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2789 DO k = kds , kde - 1
2790 DO i = MAX(ids,its) , MIN(ide,ite)
2792 space_bdy(i,k,jj,P_YEB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2793 ! space_bdy(i,k,jj,P_YEB) = 0. ! zeroout
2797 ELSE IF ( char_stagger .EQ. 'W' ) THEN
2798 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2800 DO i = MAX(ids,its) , MIN(ide-1,ite)
2802 space_bdy(i,k,jj,P_YEB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2803 ! space_bdy(i,k,jj,P_YEB) = 0. ! zeroout
2807 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2808 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2810 DO i = MAX(ids,its) , MIN(ide-1,ite)
2812 space_bdy(i,k,jj,P_YEB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2813 ! space_bdy(i,k,jj,P_YEB) = 0. ! zeroout
2818 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2819 DO k = kds , kde - 1
2820 DO i = MAX(ids,its) , MIN(ide-1,ite)
2822 space_bdy(i,k,jj,P_YEB) = ( data3dnew(i,k,j) - data3dold(i,k,j) ) / time_diff
2823 ! space_bdy(i,k,jj,P_YEB) = 0. ! zeroout
2829 END SUBROUTINE stuff_bdytend_old
2831 SUBROUTINE stuff_bdy_ijk ( data3d , space_bdy_xs, space_bdy_xe, &
2832 space_bdy_ys, space_bdy_ye, &
2833 char_stagger , spec_bdy_width, &
2834 ids, ide, jds, jde, kds, kde , &
2835 ims, ime, jms, jme, kms, kme , &
2836 its, ite, jts, jte, kts, kte )
2838 ! This routine puts the data in the 3d arrays into the proper locations
2839 ! for the lateral boundary arrays.
2841 USE module_state_description
2845 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde
2846 INTEGER , INTENT(IN) :: ims, ime, jms, jme, kms, kme
2847 INTEGER , INTENT(IN) :: its, ite, jts, jte, kts, kte
2848 INTEGER , INTENT(IN) :: spec_bdy_width
2849 REAL , DIMENSION(ims:ime,jms:jme,kms:kme) , INTENT(IN) :: data3d
2850 ! REAL , DIMENSION(:,:,:,:) , INTENT(OUT) :: space_bdy
2851 ! REAL , DIMENSION(ijds:ijde,kds:kde,spec_bdy_width,4,1) , INTENT(OUT) :: space_bdy
2852 REAL , DIMENSION(jms:jme,kds:kde,spec_bdy_width) , INTENT(OUT) :: space_bdy_xs, space_bdy_xe
2853 REAL , DIMENSION(ims:ime,kds:kde,spec_bdy_width) , INTENT(OUT) :: space_bdy_ys, space_bdy_ye
2854 CHARACTER (LEN=1) , INTENT(IN) :: char_stagger
2856 INTEGER :: i , ii , j , jj , k
2858 ! There are four lateral boundary locations that are stored.
2862 IF ( char_stagger .EQ. 'W' ) THEN
2864 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2865 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2866 space_bdy_xs(j,k,i) = data3d(i,j,k)
2870 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2872 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2873 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2874 space_bdy_xs(j,k,i) = data3d(i,j,k)
2878 ELSE IF ( char_stagger .EQ. 'V' ) THEN
2879 DO k = kds , kde - 1
2880 DO j = MAX(jds,jts) , MIN(jde,jte)
2881 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2882 space_bdy_xs(j,k,i) = data3d(i,j,k)
2887 DO k = kds , kde - 1
2888 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2889 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
2890 space_bdy_xs(j,k,i) = data3d(i,j,k)
2898 IF ( char_stagger .EQ. 'U' ) THEN
2899 DO k = kds , kde - 1
2900 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2901 DO i = MIN(ide,ite) , MAX(ide - spec_bdy_width + 1,its) , -1
2903 space_bdy_xe(j,k,ii) = data3d(i,j,k)
2907 ELSE IF ( char_stagger .EQ. 'V' ) THEN
2908 DO k = kds , kde - 1
2909 DO j = MAX(jds,jts) , MIN(jde,jte)
2910 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2912 space_bdy_xe(j,k,ii) = data3d(i,j,k)
2916 ELSE IF ( char_stagger .EQ. 'W' ) THEN
2918 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2919 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2921 space_bdy_xe(j,k,ii) = data3d(i,j,k)
2925 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2927 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2928 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2930 space_bdy_xe(j,k,ii) = data3d(i,j,k)
2935 DO k = kds , kde - 1
2936 DO j = MAX(jds,jts) , MIN(jde-1,jte)
2937 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
2939 space_bdy_xe(j,k,ii) = data3d(i,j,k)
2947 IF ( char_stagger .EQ. 'W' ) THEN
2949 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2950 DO i = MAX(ids,its) , MIN(ide-1,ite)
2951 space_bdy_ys(i,k,j) = data3d(i,j,k)
2955 ELSE IF ( char_stagger .EQ. 'M' ) THEN
2957 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2958 DO i = MAX(ids,its) , MIN(ide-1,ite)
2959 space_bdy_ys(i,k,j) = data3d(i,j,k)
2963 ELSE IF ( char_stagger .EQ. 'U' ) THEN
2964 DO k = kds , kde - 1
2965 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2966 DO i = MAX(ids,its) , MIN(ide,ite)
2967 space_bdy_ys(i,k,j) = data3d(i,j,k)
2972 DO k = kds , kde - 1
2973 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
2974 DO i = MAX(ids,its) , MIN(ide-1,ite)
2975 space_bdy_ys(i,k,j) = data3d(i,j,k)
2983 IF ( char_stagger .EQ. 'V' ) THEN
2984 DO k = kds , kde - 1
2985 DO j = MIN(jde,jte) , MAX(jde - spec_bdy_width + 1,jts) , -1
2986 DO i = MAX(ids,its) , MIN(ide-1,ite)
2988 space_bdy_ye(i,k,jj) = data3d(i,j,k)
2992 ELSE IF ( char_stagger .EQ. 'U' ) THEN
2993 DO k = kds , kde - 1
2994 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
2995 DO i = MAX(ids,its) , MIN(ide,ite)
2997 space_bdy_ye(i,k,jj) = data3d(i,j,k)
3001 ELSE IF ( char_stagger .EQ. 'W' ) THEN
3003 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
3004 DO i = MAX(ids,its) , MIN(ide-1,ite)
3006 space_bdy_ye(i,k,jj) = data3d(i,j,k)
3010 ELSE IF ( char_stagger .EQ. 'M' ) THEN
3012 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
3013 DO i = MAX(ids,its) , MIN(ide-1,ite)
3015 space_bdy_ye(i,k,jj) = data3d(i,j,k)
3020 DO k = kds , kde - 1
3021 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
3022 DO i = MAX(ids,its) , MIN(ide-1,ite)
3024 space_bdy_ye(i,k,jj) = data3d(i,j,k)
3025 ! if (K .eq. 54 .and. I .eq. 369) then
3026 ! write(0,*) 'N bound i,k,jj,P_YEB,data3d,space_bdy: ', i,k,jj,P_YEB,data3d(I,j,k),space_bdy(i,k,jj,P_YEB,1)
3034 END SUBROUTINE stuff_bdy_ijk
3036 SUBROUTINE stuff_bdytend_ijk ( data3dnew , data3dold , time_diff , &
3037 space_bdy_xs, space_bdy_xe, space_bdy_ys, space_bdy_ye, &
3040 ids, ide, jds, jde, kds, kde , &
3041 ims, ime, jms, jme, kms, kme , &
3042 its, ite, jts, jte, kts, kte )
3044 ! This routine puts the tendency data into the proper locations
3045 ! for the lateral boundary arrays.
3047 USE module_state_description
3051 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde
3052 INTEGER , INTENT(IN) :: ims, ime, jms, jme, kms, kme
3053 INTEGER , INTENT(IN) :: its, ite, jts, jte, kts, kte
3054 INTEGER , INTENT(IN) :: spec_bdy_width
3055 ! REAL , DIMENSION(ims:ime,kms:kme,jms:jme) , INTENT(IN) :: data3dnew , data3dold
3056 REAL , DIMENSION(ims:ime,jms:jme,kms:kme) , INTENT(IN) :: data3dnew , data3dold
3057 REAL , DIMENSION(jms:jme,kds:kde,spec_bdy_width) , INTENT(OUT) :: space_bdy_xs, space_bdy_xe
3058 REAL , DIMENSION(ims:ime,kds:kde,spec_bdy_width) , INTENT(OUT) :: space_bdy_ys, space_bdy_ye
3060 CHARACTER (LEN=1) , INTENT(IN) :: char_stagger
3061 REAL , INTENT(IN) :: time_diff ! seconds
3063 INTEGER :: i , ii , j , jj , k
3065 ! There are four lateral boundary locations that are stored.
3069 IF ( char_stagger .EQ. 'W' ) THEN
3071 DO j = MAX(jds,jts) , MIN(jde-1,jte)
3072 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
3073 space_bdy_xs(j,k,i) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3077 ELSE IF ( char_stagger .EQ. 'M' ) THEN
3079 DO j = MAX(jds,jts) , MIN(jde-1,jte)
3080 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
3081 space_bdy_xs(j,k,i) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3085 ELSE IF ( char_stagger .EQ. 'V' ) THEN
3086 DO k = kds , kde - 1
3087 DO j = MAX(jds,jts) , MIN(jde,jte)
3088 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
3089 space_bdy_xs(j,k,i) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3094 DO k = kds , kde - 1
3095 DO j = MAX(jds,jts) , MIN(jde-1,jte)
3096 DO i = MAX(ids,its) , MIN(ids + spec_bdy_width - 1,ite)
3097 space_bdy_xs(j,k,i) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3105 IF ( char_stagger .EQ. 'U' ) THEN
3106 DO k = kds , kde - 1
3107 DO j = MAX(jds,jts) , MIN(jde-1,jte)
3108 DO i = MIN(ide,ite) , MAX(ide - spec_bdy_width + 1,its) , -1
3110 space_bdy_xe(j,k,ii) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3114 ELSE IF ( char_stagger .EQ. 'V' ) THEN
3115 DO k = kds , kde - 1
3116 DO j = MAX(jds,jts) , MIN(jde,jte)
3117 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
3119 space_bdy_xe(j,k,ii) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3123 ELSE IF ( char_stagger .EQ. 'W' ) THEN
3125 DO j = MAX(jds,jts) , MIN(jde-1,jte)
3126 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
3128 space_bdy_xe(j,k,ii) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3132 ELSE IF ( char_stagger .EQ. 'M' ) THEN
3134 DO j = MAX(jds,jts) , MIN(jde-1,jte)
3135 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
3137 space_bdy_xe(j,k,ii) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3142 DO k = kds , kde - 1
3143 DO j = MAX(jds,jts) , MIN(jde-1,jte)
3144 DO i = MIN(ide - 1,ite) , MAX(ide - spec_bdy_width,its) , -1
3146 space_bdy_xe(j,k,ii) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3154 IF ( char_stagger .EQ. 'W' ) THEN
3156 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
3157 DO i = MAX(ids,its) , MIN(ide-1,ite)
3158 space_bdy_ys(i,k,j) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3162 ELSE IF ( char_stagger .EQ. 'M' ) THEN
3164 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
3165 DO i = MAX(ids,its) , MIN(ide-1,ite)
3166 space_bdy_ys(i,k,j) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3170 ELSE IF ( char_stagger .EQ. 'U' ) THEN
3171 DO k = kds , kde - 1
3172 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
3173 DO i = MAX(ids,its) , MIN(ide,ite)
3174 space_bdy_ys(i,k,j) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3179 DO k = kds , kde - 1
3180 DO j = MAX(jds,jts) , MIN(jds + spec_bdy_width - 1,jte)
3181 DO i = MAX(ids,its) , MIN(ide-1,ite)
3182 space_bdy_ys(i,k,j) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3190 IF ( char_stagger .EQ. 'V' ) THEN
3191 DO k = kds , kde - 1
3192 DO j = MIN(jde,jte) , MAX(jde - spec_bdy_width + 1,jts) , -1
3193 DO i = MAX(ids,its) , MIN(ide-1,ite)
3195 space_bdy_ye(i,k,jj) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3199 ELSE IF ( char_stagger .EQ. 'U' ) THEN
3200 DO k = kds , kde - 1
3201 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
3202 DO i = MAX(ids,its) , MIN(ide,ite)
3204 space_bdy_ye(i,k,jj) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3208 ELSE IF ( char_stagger .EQ. 'W' ) THEN
3210 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
3211 DO i = MAX(ids,its) , MIN(ide-1,ite)
3213 space_bdy_ye(i,k,jj) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3217 ELSE IF ( char_stagger .EQ. 'M' ) THEN
3219 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
3220 DO i = MAX(ids,its) , MIN(ide-1,ite)
3222 space_bdy_ye(i,k,jj) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3227 DO k = kds , kde - 1
3228 DO j = MIN(jde-1,jte) , MAX(jde - spec_bdy_width,jts) , -1
3229 DO i = MAX(ids,its) , MIN(ide-1,ite)
3231 space_bdy_ye(i,k,jj) = ( data3dnew(i,j,k) - data3dold(i,j,k) ) / time_diff
3232 ! if (K .eq. 54 .and. I .eq. 369) then
3233 ! write(0,*) 'N bound i,k,jj,data3dnew,data3dold: ', i,k,jj,data3dnew(I,j,k),data3dold(i,j,k)
3240 END SUBROUTINE stuff_bdytend_ijk
3242 END MODULE module_bc
3244 SUBROUTINE get_bdyzone_x ( bzx )
3249 END SUBROUTINE get_bdyzone_x
3251 SUBROUTINE get_bdyzone_y ( bzy)
3256 END SUBROUTINE get_bdyzone_y
3258 SUBROUTINE get_bdyzone ( bz)
3263 END SUBROUTINE get_bdyzone