30 SUBROUTINE vibc (ng, tile, model)
37 integer,
intent(in) :: ng, tile, model
41 character (len=*),
parameter :: MyFile = &
47 CALL wclock_on (ng, model, 42, __line__, myfile)
49 CALL ice_vibc_tile (ng, tile, model, &
50 & lbi, ubi, lbj, ubj, &
51 & imins, imaxs, jmins, jmaxs, &
52 & liuol(ng), liunw(ng), &
55 CALL wclock_off (ng, model, 42, __line__, myfile)
62 SUBROUTINE ice_vibc_tile (ng, tile, model, &
63 & LBi, UBi, LBj, UBj, &
64 & IminS, ImaxS, JminS, JmaxS, &
71 integer,
intent(in) :: ng, tile, model
72 integer,
intent(in) :: LBi, UBi, LBj, UBj
73 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
74 integer,
intent(in) :: liuol, liunw
77 real(r8),
intent(inout) :: vi(LBi:,LBj:,:)
79 real(r8),
intent(inout) :: vi(LBi:UBi,LBj:UBj,2)
84 integer :: i, Jmax, Jmin, j, know
86 real(r8),
parameter :: eps =1.0e-20_r8
87 real(r8) :: Ce, Cx, cff, dVde, dVdt, dVdx, tau
89 real(r8),
dimension(IminS:ImaxS,JminS:JmaxS) :: grad
91#include "set_bounds.h"
103 IF (
domain(ng)%Western_Edge(tile))
THEN
109 grad(istr-1,j)=vi(istr-1,j+1,know)- &
111 grad(istr ,j)=vi(istr ,j+1,know)- &
115 dvdt=vi(istr,j,know )-vi(istr ,j,liunw)
116 dvdx=vi(istr,j,liunw)-vi(istr+1,j,liunw)
118 IF ((dvdt*dvdx).lt.0.0_r8)
THEN
125 IF ((dvdt*dvdx).lt.0.0_r8) dvdt=0.0_r8
126 IF ((dvdt*(grad(istr,j-1)+grad(istr,j))).gt.0.0_r8)
THEN
131 cff=max(dvdx*dvdx+dvde*dvde,eps)
134 ce=min(cff,max(dvdt*dvde,-cff))
138 vi(istr-1,j,liunw)=(cff*vi(istr-1,j,know)+ &
139 & cx *vi(istr ,j,liunw)- &
140 & max(ce,0.0_r8)*grad(istr-1,j-1)- &
141 & min(ce,0.0_r8)*grad(istr-1,j ))/ &
144 vi(istr-1,j,liunw)=vi(istr-1,j,liunw)+ &
149 vi(istr-1,j,liunw)=vi(istr-1,j,liunw)* &
150 &
grid(ng)%vmask(istr-1,j)
160 vi(istr-1,j,liunw)=vi(istr-1,j,liunw)* &
161 &
grid(ng)%vmask(istr-1,j)
164 vi(istr-1,j,liunw)=vi(istr-1,j,liunw)* &
165 &
grid(ng)%vmask_wet(istr-1,j)
173 vi(istr-1,j,liunw)=vi(istr,j,liunw)
175 vi(istr-1,j,liunw)=vi(istr-1,j,liunw)* &
176 &
grid(ng)%vmask(istr-1,j)
179 vi(istr-1,j,liunw)=vi(istr-1,j,liunw)* &
180 &
grid(ng)%vmask_wet(istr-1,j)
196 vi(istr-1,j,liunw)=
gamma2(ng)*vi(istr-1,j,liunw)
198 vi(istr-1,j,liunw)=vi(istr-1,j,liunw)* &
199 &
grid(ng)%vmask(istr-1,j)
202 vi(istr-1,j,liunw)=vi(istr-1,j,liunw)* &
203 &
grid(ng)%vmask_wet(istr-1,j)
213 IF (
domain(ng)%Eastern_Edge(tile))
THEN
219 grad(iend ,j)=vi(iend ,j+1,know)- &
221 grad(iend+1,j)=vi(iend+1,j+1,know)- &
225 dvdt=vi(iend,j,know )-vi(iend ,j,liunw)
226 dvdx=vi(iend,j,liunw)-vi(iend-1,j,liunw)
228 IF ((dvdt*dvdx).lt.0.0_r8)
THEN
235 IF ((dvdt*dvdx).lt.0.0_r8) dvdt=0.0_r8
236 IF ((dvdt*(grad(iend,j-1)+grad(iend,j))).gt.0.0_r8)
THEN
241 cff=max(dvdx*dvdx+dvde*dvde,eps)
244 ce=min(cff,max(dvdt*dvde,-cff))
248 vi(iend+1,j,liunw)=(cff*vi(iend+1,j,know)+ &
249 & cx *vi(iend ,j,liunw)- &
250 & max(ce,0.0_r8)*grad(iend+1,j-1)- &
251 & min(ce,0.0_r8)*grad(iend+1,j ))/ &
254 vi(iend+1,j,liunw)=vi(iend+1,j,liunw)+ &
259 vi(iend+1,j,liunw)=vi(iend+1,j,liunw)* &
260 &
grid(ng)%vmask(iend+1,j)
270 vi(iend+1,j,liunw)=vi(iend+1,j,liunw)* &
271 &
grid(ng)%vmask(iend+1,j)
274 vi(iend+1,j,liunw)=vi(iend+1,j,liunw)* &
275 &
grid(ng)%vmask_wet(iend+1,j)
283 vi(iend+1,j,liunw)=vi(iend,j,liunw)
285 vi(iend+1,j,liunw)=vi(iend+1,j,liunw)* &
286 &
grid(ng)%vmask(iend+1,j)
289 vi(iend+1,j,liunw)=vi(iend+1,j,liunw)* &
290 &
grid(ng)%vmask_wet(iend+1,j)
306 vi(iend+1,j,liunw)=
gamma2(ng)*vi(iend,j,liunw)
308 vi(iend+1,j,liunw)=vi(iend+1,j,liunw)* &
309 &
grid(ng)%vmask(iend+1,j)
312 vi(iend+1,j,liunw)=vi(iend+1,j,liunw)* &
313 &
grid(ng)%vmask_wet(iend+1,j)
323 IF (
domain(ng)%Southern_Edge(tile))
THEN
329 grad(i,jstr )=vi(i ,jstr ,know)- &
331 grad(i,jstr+1)=vi(i ,jstr+1,know)- &
332 & vi(i-1,jstr+1,know)
335 dvdt=vi(i,jstr+1,know )-vi(i,jstr+1,liunw)
336 dvde=vi(i,jstr+1,liunw)-vi(i,jstr+2,liunw)
338 IF ((dvdt*dvde).lt.0.0_r8)
THEN
345 IF ((dvdt*dvde).lt.0.0_r8) dvdt=0.0_r8
346 IF ((dvdt*(grad(i,jstr+1)+grad(i+1,jstr+1))).gt.0.0_r8)
THEN
349 dvdx=grad(i+1,jstr+1)
351 cff=max(dvdx*dvdx+dvde*dvde,eps)
353 cx=min(cff,max(dvdt*dvdx,-cff))
358 vi(i,jstr,liunw)=(cff*vi(i,jstr ,know)+ &
359 & ce *vi(i,jstr+1,liunw)- &
360 & max(cx,0.0_r8)*grad(i ,jstr)- &
361 & min(cx,0.0_r8)*grad(i+1,jstr))/ &
364 vi(i,jstr,liunw)=vi(i,jstr,liunw)+ &
369 vi(i,jstr,liunw)=vi(i,jstr,liunw)* &
370 &
grid(ng)%vmask(i,jstr)
380 vi(i,jstr,liunw)=vi(i,jstr,liunw)* &
381 &
grid(ng)%vmask(i,jstr)
384 vi(i,jstr,liunw)=vi(i,jstr,liunw)* &
385 &
grid(ng)%vmask_wet(i,jstr)
393 vi(i,jstr,liunw)=vi(i,jstr+1,liunw)
395 vi(i,jstr,liunw)=vi(i,jstr,liunw)* &
396 &
grid(ng)%vmask(i,jstr)
399 vi(i,jstr,liunw)=vi(i,jstr,liunw)* &
400 &
grid(ng)%vmask_wet(i,jstr)
408 vi(i,jstr,liunw)=0.0_r8
417 IF (
domain(ng)%Northern_Edge(tile))
THEN
423 grad(i,jend )=vi(i ,jend ,know)- &
425 grad(i,jend+1)=vi(i ,jend+1,know)- &
426 & vi(i-1,jend+1,know)
429 dvdt=vi(i,jend,know )-vi(i,jend ,liunw)
430 dvde=vi(i,jend,liunw)-vi(i,jend-1,liunw)
432 IF ((dvdt*dvde).lt.0.0_r8)
THEN
439 IF ((dvdt*dvde).lt.0.0_r8) dvdt=0.0_r8
440 IF ((dvdt*(grad(i,jend)+grad(i+1,jend))).gt.0.0_r8)
THEN
445 cff=max(dvdx*dvdx+dvde*dvde,eps)
447 cx=min(cff,max(dvdt*dvdx,-cff))
452 vi(i,jend+1,liunw)=(cff*vi(i,jend+1,know)+ &
453 & ce *vi(i,jend ,liunw)- &
454 & max(cx,0.0_r8)*grad(i ,jend+1)- &
455 & min(cx,0.0_r8)*grad(i+1,jend+1))/ &
458 vi(i,jend+1,liunw)=vi(i,jend+1,liunw)+ &
463 vi(i,jend+1,liunw)=vi(i,jend+1,liunw)* &
464 &
grid(ng)%vmask(i,jend+1)
474 vi(i,jend+1,liunw)=vi(i,jend+1,liunw)* &
475 &
grid(ng)%vmask(i,jend)
478 vi(i,jend+1,liunw)=vi(i,jend+1,liunw)* &
479 &
grid(ng)%vmask_wet(i,jend)
487 vi(i,jend+1,liunw)=vi(i,jend,liunw)
489 vi(i,jend+1,liunw)=vi(i,jend+1,liunw)* &
490 &
grid(ng)%vmask(i,jend)
493 vi(i,jend+1,liunw)=vi(i,jend+1,liunw)* &
494 &
grid(ng)%vmask_wet(i,jend)
502 vi(i,jend+1,liunw)=0.0_r8
512 IF (
domain(ng)%SouthWest_Corner(tile))
THEN
513 vi(istr-1,jstr,liunw)=0.5_r8*(vi(istr-1,jstr+1,liunw)+ &
514 & vi(istr ,jstr ,liunw))
516 IF (
domain(ng)%SouthEast_Corner(tile))
THEN
517 vi(iend+1,jstr,liunw)=0.5_r8*(vi(iend ,jstr ,liunw)+ &
518 & vi(iend+1,jstr+1,liunw))
520 IF (
domain(ng)%NorthWest_Corner(tile))
THEN
521 vi(istr-1,jend+1,liunw)=0.5_r8*(vi(istr-1,jend ,liunw)+ &
522 & vi(istr ,jend+1,liunw))
524 IF (
domain(ng)%NorthEast_Corner(tile))
THEN
525 vi(iend+1,jend+1,liunw)=0.5_r8*(vi(iend+1,jend ,liunw)+ &
526 & vi(iend ,jend+1,liunw))
531 END SUBROUTINE ice_vibc_tile
type(t_grid), dimension(:), allocatable grid
integer, parameter isvice
type(t_ice_lobc), dimension(:,:), allocatable ice_lobc
type(t_ice), dimension(:), allocatable ice
integer, dimension(nices) ibice
type(t_lbc), dimension(:,:,:), allocatable lbc
type(t_domain), dimension(:), allocatable domain
real(dp), dimension(:), allocatable dt
logical, dimension(:), allocatable ewperiodic
logical, dimension(:), allocatable nsperiodic
real(r8), dimension(:), allocatable gamma2
integer, parameter isouth
real(dp), dimension(:,:), allocatable m2obc_out
integer, parameter inorth
real(dp), dimension(:,:), allocatable m2obc_in
recursive subroutine wclock_off(ng, model, region, line, routine)
recursive subroutine wclock_on(ng, model, region, line, routine)