Changeset 3991 for branches/2013/dev_r3987_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn2d.F90
- Timestamp:
- 2013-07-29T11:04:44+02:00 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2013/dev_r3987_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn2d.F90
r3680 r3991 18 18 USE dom_oce ! ocean space and time domain 19 19 USE bdy_oce ! ocean open boundary conditions 20 USE bdylib ! BDY library routines 20 21 USE dynspg_oce ! for barotropic variables 21 22 USE phycst ! physical constants … … 26 27 PRIVATE 27 28 28 PUBLIC bdy_dyn2d 29 PUBLIC bdy_dyn2d ! routine called in dynspg_ts and bdy_dyn 29 30 30 31 !!---------------------------------------------------------------------- … … 48 49 DO ib_bdy=1, nb_bdy 49 50 50 SELECT CASE( nn_dyn2d(ib_bdy) )51 CASE( jp_none)51 SELECT CASE( cn_dyn2d(ib_bdy) ) 52 CASE('none') 52 53 CYCLE 53 CASE( jp_frs)54 CASE('frs') 54 55 CALL bdy_dyn2d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 55 CASE( jp_flather)56 CASE('flather') 56 57 CALL bdy_dyn2d_fla( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 58 CASE('orlanski') 59 CALL bdy_dyn2d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.false. ) 60 CASE('orlanski_npo') 61 CALL bdy_dyn2d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.true. ) 57 62 CASE DEFAULT 58 63 CALL ctl_stop( 'bdy_dyn2d : unrecognised option for open boundaries for barotropic variables' ) … … 89 94 ij = idx%nbj(jb,igrd) 90 95 zwgt = idx%nbw(jb,igrd) 91 pu 2d(ii,ij) = ( pu2d(ii,ij) + zwgt * ( dta%u2d(jb) - pu2d(ii,ij) ) ) * umask(ii,ij,1)96 pua2d(ii,ij) = ( pua2d(ii,ij) + zwgt * ( dta%u2d(jb) - pua2d(ii,ij) ) ) * umask(ii,ij,1) 92 97 END DO 93 98 ! … … 97 102 ij = idx%nbj(jb,igrd) 98 103 zwgt = idx%nbw(jb,igrd) 99 pv 2d(ii,ij) = ( pv2d(ii,ij) + zwgt * ( dta%v2d(jb) - pv2d(ii,ij) ) ) * vmask(ii,ij,1)104 pva2d(ii,ij) = ( pva2d(ii,ij) + zwgt * ( dta%v2d(jb) - pva2d(ii,ij) ) ) * vmask(ii,ij,1) 100 105 END DO 101 CALL lbc_bdy_lnk( pu 2d, 'U', -1., ib_bdy )102 CALL lbc_bdy_lnk( pv 2d, 'V', -1., ib_bdy) ! Boundary points should be updated106 CALL lbc_bdy_lnk( pua2d, 'U', -1., ib_bdy ) 107 CALL lbc_bdy_lnk( pva2d, 'V', -1., ib_bdy) ! Boundary points should be updated 103 108 ! 104 109 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_frs') … … 133 138 INTEGER :: jb, igrd ! dummy loop indices 134 139 INTEGER :: ii, ij, iim1, iip1, ijm1, ijp1 ! 2D addresses 140 REAL(wp), POINTER :: flagu, flagv ! short cuts 135 141 REAL(wp) :: zcorr ! Flather correction 136 142 REAL(wp) :: zforc ! temporary scalar … … 160 166 ii = idx%nbi(jb,igrd) 161 167 ij = idx%nbj(jb,igrd) 162 iim1 = ii + MAX( 0, INT( idx%flagu(jb) ) ) ! T pts i-indice inside the boundary 163 iip1 = ii - MIN( 0, INT( idx%flagu(jb) ) ) ! T pts i-indice outside the boundary 168 flagu => idx%flagu(jb,igrd) 169 iim1 = ii + MAX( 0, INT( flagu ) ) ! T pts i-indice inside the boundary 170 iip1 = ii - MIN( 0, INT( flagu ) ) ! T pts i-indice outside the boundary 164 171 ! 165 zcorr = - idx%flagu(jb)* SQRT( grav * phur(ii, ij) ) * ( pssh(iim1, ij) - spgu(iip1,ij) )172 zcorr = - flagu * SQRT( grav * phur(ii, ij) ) * ( pssh(iim1, ij) - spgu(iip1,ij) ) 166 173 zforc = dta%u2d(jb) 167 pu 2d(ii,ij) = zforc + zcorr * umask(ii,ij,1)174 pua2d(ii,ij) = zforc + zcorr * umask(ii,ij,1) 168 175 END DO 169 176 ! … … 173 180 ii = idx%nbi(jb,igrd) 174 181 ij = idx%nbj(jb,igrd) 175 ijm1 = ij + MAX( 0, INT( idx%flagv(jb) ) ) ! T pts j-indice inside the boundary 176 ijp1 = ij - MIN( 0, INT( idx%flagv(jb) ) ) ! T pts j-indice outside the boundary 182 flagv => idx%flagv(jb,igrd) 183 ijm1 = ij + MAX( 0, INT( flagv ) ) ! T pts j-indice inside the boundary 184 ijp1 = ij - MIN( 0, INT( flagv ) ) ! T pts j-indice outside the boundary 177 185 ! 178 zcorr = - idx%flagv(jb)* SQRT( grav * phvr(ii, ij) ) * ( pssh(ii, ijm1) - spgu(ii,ijp1) )186 zcorr = - flagv * SQRT( grav * phvr(ii, ij) ) * ( pssh(ii, ijm1) - spgu(ii,ijp1) ) 179 187 zforc = dta%v2d(jb) 180 pv 2d(ii,ij) = zforc + zcorr * vmask(ii,ij,1)181 END DO 182 CALL lbc_bdy_lnk( pu 2d, 'U', -1., ib_bdy ) ! Boundary points should be updated183 CALL lbc_bdy_lnk( pv 2d, 'V', -1., ib_bdy ) !188 pva2d(ii,ij) = zforc + zcorr * vmask(ii,ij,1) 189 END DO 190 CALL lbc_bdy_lnk( pua2d, 'U', -1., ib_bdy ) ! Boundary points should be updated 191 CALL lbc_bdy_lnk( pva2d, 'V', -1., ib_bdy ) ! 184 192 ! 185 193 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_fla') 186 194 ! 187 195 END SUBROUTINE bdy_dyn2d_fla 196 197 198 SUBROUTINE bdy_dyn2d_orlanski( idx, dta, ib_bdy, ll_npo ) 199 !!---------------------------------------------------------------------- 200 !! *** SUBROUTINE bdy_dyn2d_orlanski *** 201 !! 202 !! - Apply Orlanski radiation condition adaptively: 203 !! - radiation plus weak nudging at outflow points 204 !! - no radiation and strong nudging at inflow points 205 !! 206 !! 207 !! References: Marchesiello, McWilliams and Shchepetkin, Ocean Modelling vol. 3 (2001) 208 !!---------------------------------------------------------------------- 209 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 210 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 211 INTEGER, INTENT(in) :: ib_bdy ! number of current open boundary set 212 LOGICAL, INTENT(in) :: ll_npo ! flag for NPO version 213 214 INTEGER :: ib, igrd ! dummy loop indices 215 INTEGER :: ii, ij, iibm1, ijbm1 ! indices 216 !!---------------------------------------------------------------------- 217 218 IF( nn_timing == 1 ) CALL timing_start('bdy_dyn2d_orlanski') 219 ! 220 igrd = 2 ! Orlanski bc on u-velocity; 221 ! 222 CALL bdy_orlanski_2d( idx, igrd, pub2d, pua2d, dta%u2d, ll_npo ) 223 224 igrd = 3 ! Orlanski bc on v-velocity 225 ! 226 CALL bdy_orlanski_2d( idx, igrd, pvb2d, pva2d, dta%v2d, ll_npo ) 227 ! 228 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_orlanski') 229 ! 230 CALL lbc_bdy_lnk( pua2d, 'U', -1., ib_bdy ) ! Boundary points should be updated 231 CALL lbc_bdy_lnk( pva2d, 'V', -1., ib_bdy ) ! 232 ! 233 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_orlanski') 234 ! 235 END SUBROUTINE bdy_dyn2d_orlanski 236 188 237 #else 189 238 !!----------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.