C $Header: /u/gcmpack/MITgcm/pkg/ctrl/ctrl_getobcsw.F,v 1.8 2007/10/09 00:00:00 jmc Exp $
C $Name: $
#include "CTRL_CPPOPTIONS.h"
#ifdef ALLOW_OBCS
# include "OBCS_OPTIONS.h"
#endif
subroutine CTRL_GETOBCSW(
I mytime,
I myiter,
I mythid
& )
c ==================================================================
c SUBROUTINE ctrl_getobcsw
c ==================================================================
c
c o Get western obc of the control vector and add it
c to dyn. fields
c
c started: heimbach@mit.edu, 29-Aug-2001
c
c modified: gebbie@mit.edu, 18-Mar-2003
c ==================================================================
c SUBROUTINE ctrl_getobcsw
c ==================================================================
implicit none
#ifdef ALLOW_OBCSW_CONTROL
c == global variables ==
#include "EEPARAMS.h"
#include "SIZE.h"
#include "PARAMS.h"
#include "GRID.h"
#include "OBCS.h"
#include "ctrl.h"
#include "ctrl_dummy.h"
#include "optim.h"
c == routine arguments ==
_RL mytime
integer myiter
integer mythid
c == local variables ==
integer bi,bj
integer i,j,k
integer itlo,ithi
integer jtlo,jthi
integer jmin,jmax
integer imin,imax
integer ilobcsw
integer iobcs
integer ip1
_RL dummy
_RL obcswfac
logical obcswfirst
logical obcswchanged
integer obcswcount0
integer obcswcount1
cgg _RL maskyz (1-oly:sny+oly,nr,nsx,nsy)
logical doglobalread
logical ladinit
character*(80) fnameobcsw
cgg( Variables for splitting barotropic/baroclinic vels.
_RL ubaro
_RL utop
cgg)
c == external functions ==
integer ilnblnk
external
c == end of interface ==
jtlo = mybylo(mythid)
jthi = mybyhi(mythid)
itlo = mybxlo(mythid)
ithi = mybxhi(mythid)
jmin = 1-oly
jmax = sny+oly
imin = 1-olx
imax = snx+olx
ip1 = 1
cgg( Initialize variables for balancing volume flux.
ubaro = 0.d0
utop = 0.d0
cgg)
c-- Now, read the control vector.
doglobalread = .false.
ladinit = .false.
if (optimcycle .ge. 0) then
ilobcsw=ilnblnk( xx_obcsw_file )
write(fnameobcsw(1:80),'(2a,i10.10)')
& xx_obcsw_file(1:ilobcsw), '.', optimcycle
endif
c-- Get the counters, flags, and the interpolation factor.
call CTRL_GET_GEN_REC(
I xx_obcswstartdate, xx_obcswperiod,
O obcswfac, obcswfirst, obcswchanged,
O obcswcount0,obcswcount1,
I mytime, myiter, mythid )
do iobcs = 1,nobcs
if ( obcswfirst ) then
call ACTIVE_READ_YZ( fnameobcsw, tmpfldyz,
& (obcswcount0-1)*nobcs+iobcs,
& doglobalread, ladinit, optimcycle,
& mythid, xx_obcsw_dummy )
#ifdef ALLOW_CTRL_OBCS_BALANCE
if ( optimcycle .gt. 0) then
if (iobcs .eq. 3) then
cgg Special attention is needed for the normal velocity.
cgg For the north, this is the v velocity, iobcs = 4.
cgg This is done on a columnwise basis here.
do bj = jtlo,jthi
do bi = itlo, ithi
do j = jmin,jmax
i = OB_Iw(J,bi,bj)
cgg The barotropic velocity is stored in the level 1.
ubaro = tmpfldyz(j,1,bi,bj)
tmpfldyz(j,1,bi,bj) = 0.d0
utop = 0.d0
do k = 1,Nr
cgg If cells are not full, this should be modified with hFac.
cgg
cgg The xx field (tmpfldxz) does not contain the velocity at the
cgg surface level. This velocity is not independent; it must
cgg exactly balance the volume flux, since we are dealing with
cgg the baroclinic velocity structure..
utop = tmpfldyz(j,k,bi,bj)*
& maskW(i+ip1,j,k,bi,bj) * delR(k) + utop
cgg Add the barotropic velocity component.
if (maskW(i+ip1,j,k,bi,bj) .ne. 0.) then
tmpfldyz(j,k,bi,bj) = tmpfldyz(j,k,bi,bj)+ ubaro
endif
enddo
cgg Compute the baroclinic velocity at level 1. Should balance flux.
tmpfldyz(j,1,bi,bj) = tmpfldyz(j,1,bi,bj)
& - utop / delR(1)
enddo
enddo
enddo
endif
if (iobcs .eq. 4) then
cgg Special attention is needed for the normal velocity.
cgg For the north, this is the v velocity, iobcs = 4.
cgg This is done on a columnwise basis here.
do bj = jtlo,jthi
do bi = itlo, ithi
do j = jmin,jmax
i = OB_Iw(J,bi,bj)
cgg The barotropic velocity is stored in the level 1.
ubaro = tmpfldyz(j,1,bi,bj)
tmpfldyz(j,1,bi,bj) = 0.d0
utop = 0.d0
do k = 1,Nr
cgg If cells are not full, this should be modified with hFac.
cgg
cgg The xx field (tmpfldxz) does not contain the velocity at the
cgg surface level. This velocity is not independent; it must
cgg exactly balance the volume flux, since we are dealing with
cgg the baroclinic velocity structure..
utop = tmpfldyz(j,k,bi,bj)*
& maskS(i,j,k,bi,bj) * delR(k) + utop
cgg Add the barotropic velocity component.
if (maskS(i,j,k,bi,bj) .ne. 0.) then
tmpfldyz(j,k,bi,bj) = tmpfldyz(j,k,bi,bj)+ ubaro
endif
enddo
cgg Compute the baroclinic velocity at level 1. Should balance flux.
tmpfldyz(j,1,bi,bj) = tmpfldyz(j,1,bi,bj)
& - utop / delR(1)
enddo
enddo
enddo
endif
endif
#endif /* ALLOW_CTRL_OBCS_BALANCE */
do bj = jtlo,jthi
do bi = itlo,ithi
do k = 1,nr
do j = jmin,jmax
xx_obcsw1(j,k,bi,bj,iobcs) = tmpfldyz (j,k,bi,bj)
cgg & * maskyz (j,k,bi,bj)
enddo
enddo
enddo
enddo
endif
if ( (obcswfirst) .or. (obcswchanged)) then
cgg( This is a terribly long way to do it. However, the dimensions do not exactly
cgg match up. I will blame Fortran for the ugliness.
do bj = jtlo,jthi
do bi = itlo,ithi
do k = 1,nr
do j = jmin,jmax
tmpfldyz(j,k,bi,bj) = xx_obcsw1(j,k,bi,bj,iobcs)
enddo
enddo
enddo
enddo
call EXF_SWAPFFIELDS_YZ( tmpfldyz2, tmpfldyz, mythid)
do bj = jtlo,jthi
do bi = itlo,ithi
do k = 1,nr
do j = jmin,jmax
xx_obcsw0(j,k,bi,bj,iobcs) = tmpfldyz2(j,k,bi,bj)
enddo
enddo
enddo
enddo
call ACTIVE_READ_YZ( fnameobcsw, tmpfldyz,
& (obcswcount1-1)*nobcs+iobcs,
& doglobalread, ladinit, optimcycle,
& mythid, xx_obcsw_dummy )
#ifdef ALLOW_CTRL_OBCS_BALANCE
if ( optimcycle .gt. 0) then
if (iobcs .eq. 3) then
cgg Special attention is needed for the normal velocity.
cgg For the north, this is the v velocity, iobcs = 4.
cgg This is done on a columnwise basis here.
do bj = jtlo,jthi
do bi = itlo, ithi
do j = jmin,jmax
i = OB_Iw(J,bi,bj)
cgg The barotropic velocity is stored in the level 1.
ubaro = tmpfldyz(j,1,bi,bj)
tmpfldyz(j,1,bi,bj) = 0.d0
utop = 0.d0
do k = 1,Nr
cgg If cells are not full, this should be modified with hFac.
cgg
cgg The xx field (tmpfldxz) does not contain the velocity at the
cgg surface level. This velocity is not independent; it must
cgg exactly balance the volume flux, since we are dealing with
cgg the baroclinic velocity structure..
utop = tmpfldyz(j,k,bi,bj)*
& maskW(i+ip1,j,k,bi,bj) * delR(k) + utop
cgg Add the barotropic velocity component.
if (maskW(i+ip1,j,k,bi,bj) .ne. 0.) then
tmpfldyz(j,k,bi,bj) = tmpfldyz(j,k,bi,bj)+ ubaro
endif
enddo
cgg Compute the baroclinic velocity at level 1. Should balance flux.
tmpfldyz(j,1,bi,bj) = tmpfldyz(j,1,bi,bj)
& - utop / delR(1)
enddo
enddo
enddo
endif
if (iobcs .eq. 4) then
cgg Special attention is needed for the normal velocity.
cgg For the north, this is the v velocity, iobcs = 4.
cgg This is done on a columnwise basis here.
do bj = jtlo,jthi
do bi = itlo, ithi
do j = jmin,jmax
i = OB_Iw(J,bi,bj)
cgg The barotropic velocity is stored in the level 1.
ubaro = tmpfldyz(j,1,bi,bj)
tmpfldyz(j,1,bi,bj) = 0.d0
utop = 0.d0
do k = 1,Nr
cgg If cells are not full, this should be modified with hFac.
cgg
cgg The xx field (tmpfldxz) does not contain the velocity at the
cgg surface level. This velocity is not independent; it must
cgg exactly balance the volume flux, since we are dealing with
cgg the baroclinic velocity structure..
utop = tmpfldyz(j,k,bi,bj)*
& maskS(i,j,k,bi,bj) * delR(k) + utop
cgg Add the barotropic velocity component.
if (maskS(i,j,k,bi,bj) .ne. 0.) then
tmpfldyz(j,k,bi,bj) = tmpfldyz(j,k,bi,bj)+ ubaro
endif
enddo
cgg Compute the baroclinic velocity at level 1. Should balance flux.
tmpfldyz(j,1,bi,bj) = tmpfldyz(j,1,bi,bj)
& - utop / delR(1)
enddo
enddo
enddo
endif
endif
#endif /* ALLOW_CTRL_OBCS_BALANCE */
do bj = jtlo,jthi
do bi = itlo,ithi
do k = 1,nr
do j = jmin,jmax
xx_obcsw1 (j,k,bi,bj,iobcs) = tmpfldyz (j,k,bi,bj)
cgg & * maskyz (j,k,bi,bj)
enddo
enddo
enddo
enddo
endif
c-- Add control to model variable.
do bj = jtlo, jthi
do bi = itlo, ithi
c-- Calculate mask for tracer cells (0 => land, 1 => water).
do k = 1,nr
do j = 1,sny
i = OB_Iw(j,bi,bj)
if (iobcs .EQ. 1) then
OBWt(j,k,bi,bj) = OBWt (j,k,bi,bj)
& + obcswfac *xx_obcsw0(j,k,bi,bj,iobcs)
& + (1. _d 0 - obcswfac)*xx_obcsw1(j,k,bi,bj,iobcs)
OBWt(j,k,bi,bj) = OBWt(j,k,bi,bj)
& *maskW(i+ip1,j,k,bi,bj)
else if (iobcs .EQ. 2) then
OBWs(j,k,bi,bj) = OBWs (j,k,bi,bj)
& + obcswfac *xx_obcsw0(j,k,bi,bj,iobcs)
& + (1. _d 0 - obcswfac)*xx_obcsw1(j,k,bi,bj,iobcs)
OBWs(j,k,bi,bj) = OBWs(j,k,bi,bj)
& *maskW(i+ip1,j,k,bi,bj)
else if (iobcs .EQ. 3) then
OBWu(j,k,bi,bj) = OBWu (j,k,bi,bj)
& + obcswfac *xx_obcsw0(j,k,bi,bj,iobcs)
& + (1. _d 0 - obcswfac)*xx_obcsw1(j,k,bi,bj,iobcs)
OBWu(j,k,bi,bj) = OBWu(j,k,bi,bj)
& *maskW(i+ip1,j,k,bi,bj)
else if (iobcs .EQ. 4) then
OBWv(j,k,bi,bj) = OBWv (j,k,bi,bj)
& + obcswfac *xx_obcsw0(j,k,bi,bj,iobcs)
& + (1. _d 0 - obcswfac)*xx_obcsw1(j,k,bi,bj,iobcs)
OBWv(j,k,bi,bj) = OBWv(j,k,bi,bj)
& *maskS(i,j,k,bi,bj)
endif
enddo
enddo
enddo
enddo
C-- End over iobcs loop
enddo
#else /* ALLOW_OBCSW_CONTROL undefined */
c == routine arguments ==
_RL mytime
integer myiter
integer mythid
c-- CPP flag ALLOW_OBCSW_CONTROL undefined.
#endif /* ALLOW_OBCSW_CONTROL */
end