Changeset 4105
- Timestamp:
- 2013-10-22T16:47:27+02:00 (11 years ago)
- Location:
- branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90
r3851 r4105 29 29 USE iom ! IOM library 30 30 USE in_out_manager ! I/O logical units 31 USE dynspg_oce, ONLY: lk_dynspg_ts ! Split-explicit free surface flag 31 32 #if defined key_lim2 32 33 USE ice_2 … … 93 94 CALL wrk_alloc(jpi,jpj,pu2d,pv2d) 94 95 95 pu2d(:,:) = 0. e096 pv2d(:,:) = 0. e096 pu2d(:,:) = 0._wp 97 pv2d(:,:) = 0._wp 97 98 98 99 DO ik = 1, jpkm1 !! Vertically integrated momentum trends … … 195 196 IF( nn_dyn2d(ib_bdy) .gt. 0 ) THEN 196 197 IF( nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 197 dta_bdy(ib_bdy)%ssh(:) = 0. 0198 dta_bdy(ib_bdy)%u2d(:) = 0. 0199 dta_bdy(ib_bdy)%v2d(:) = 0. 0198 dta_bdy(ib_bdy)%ssh(:) = 0._wp 199 dta_bdy(ib_bdy)%u2d(:) = 0._wp 200 dta_bdy(ib_bdy)%v2d(:) = 0._wp 200 201 ENDIF 201 202 IF (nn_tra(ib_bdy).ne.4) THEN … … 216 217 217 218 igrd = 2 ! zonal velocity 218 dta_bdy(ib_bdy)%u2d(:) = 0. 0219 dta_bdy(ib_bdy)%u2d(:) = 0._wp 219 220 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 220 221 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) … … 230 231 END DO 231 232 igrd = 3 ! meridional velocity 232 dta_bdy(ib_bdy)%v2d(:) = 0. 0233 dta_bdy(ib_bdy)%v2d(:) = 0._wp 233 234 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 234 235 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) … … 272 273 ELSE 273 274 IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .eq. 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 274 dta_bdy(ib_bdy)%ssh(:) = 0. 0275 dta_bdy(ib_bdy)%u2d(:) = 0. 0276 dta_bdy(ib_bdy)%v2d(:) = 0. 0275 dta_bdy(ib_bdy)%ssh(:) = 0._wp 276 dta_bdy(ib_bdy)%u2d(:) = 0._wp 277 dta_bdy(ib_bdy)%v2d(:) = 0._wp 277 278 ENDIF 278 279 IF( nb_bdy_fld(ib_bdy) .gt. 0 ) THEN ! update external data … … 286 287 & nn_dyn3d_dta(ib_bdy) .EQ. 1 ) ) THEN 287 288 igrd = 2 ! zonal velocity 288 dta_bdy(ib_bdy)%u2d(:) = 0. 0289 dta_bdy(ib_bdy)%u2d(:) = 0._wp 289 290 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 290 291 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) … … 300 301 END DO 301 302 igrd = 3 ! meridional velocity 302 dta_bdy(ib_bdy)%v2d(:) = 0. 0303 dta_bdy(ib_bdy)%v2d(:) = 0._wp 303 304 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 304 305 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) … … 314 315 END DO 315 316 ENDIF 316 IF( nn_dyn2d(ib_bdy) .gt. 0 .and. nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing317 CALL bdytide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta_bdy(ib_bdy), &318 & td=tides(ib_bdy), time_offset=time_offset )319 ENDIF320 317 ENDIF 321 318 ENDIF … … 324 321 END DO ! ib_bdy 325 322 323 #if defined key_tide 324 ! Add tides if not split-explicit free surface else this is done in ts loop 325 IF (.NOT.lk_dynspg_ts) CALL bdy_dta_tides( kt=kt, time_offset=time_offset ) 326 #endif 326 327 IF ( ln_apr_obc ) THEN 327 328 DO ib_bdy = 1, nb_bdy … … 476 477 IF( nn_dyn2d(ib_bdy) .gt. 0 .and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq. 3 ) ) THEN 477 478 478 IF( nn_ tra(ib_bdy) .ne. 4 ) THEN ! runoff condition : no ssh reading479 IF( nn_dyn2d(ib_bdy) .ne. jp_frs .and. nn_tra(ib_bdy) .ne. 4 ) THEN ! runoff condition : no ssh reading 479 480 jfld = jfld + 1 480 481 blf_i(jfld) = bn_ssh … … 572 573 ! Recalculate field counts 573 574 !------------------------- 574 nb_bdy_fld_sum = 0575 575 IF( ib_bdy .eq. 1 ) THEN 576 nb_bdy_fld_sum = 0 576 577 nb_bdy_fld(ib_bdy) = jfld 577 578 nb_bdy_fld_sum = jfld … … 616 617 ALLOCATE( dta_bdy(ib_bdy)%u2d(ilen0(2)) ) 617 618 ALLOCATE( dta_bdy(ib_bdy)%v2d(ilen0(3)) ) 618 IF ( nn_dyn2d_dta(ib_bdy).eq.1.or.nn_dyn2d_dta(ib_bdy).eq.3) THEN619 IF ( nn_dyn2d(ib_bdy) .ne. jp_frs .and. (nn_dyn2d_dta(ib_bdy).eq.1.or.nn_dyn2d_dta(ib_bdy).eq.3) ) THEN 619 620 jfld = jfld + 1 620 621 dta_bdy(ib_bdy)%ssh => bf(jfld)%fnow(:,1,1) -
branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn.F90
r3294 r4105 30 30 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 31 31 USE in_out_manager ! 32 USE domvvl ! variable volume 32 33 33 34 IMPLICIT NONE … … 82 83 !------------------------------------------------------- 83 84 84 pu2d(:,:) = 0.e0 85 pv2d(:,:) = 0.e0 86 DO jk = 1, jpkm1 !! Vertically integrated momentum trends 87 pu2d(:,:) = pu2d(:,:) + fse3u(:,:,jk) * umask(:,:,jk) * ua(:,:,jk) 88 pv2d(:,:) = pv2d(:,:) + fse3v(:,:,jk) * vmask(:,:,jk) * va(:,:,jk) 89 END DO 90 pu2d(:,:) = pu2d(:,:) * phur(:,:) 91 pv2d(:,:) = pv2d(:,:) * phvr(:,:) 85 pu2d(:,:) = 0._wp 86 pv2d(:,:) = 0._wp 87 ! bg jchanut tschanges (not specifically related to ts; this is a bug) 88 IF (lk_vvl) THEN 89 DO jk = 1, jpkm1 !! Vertically integrated momentum trends 90 pu2d(:,:) = pu2d(:,:) + fse3u_a(:,:,jk) * umask(:,:,jk) * ua(:,:,jk) 91 pv2d(:,:) = pv2d(:,:) + fse3v_a(:,:,jk) * vmask(:,:,jk) * va(:,:,jk) 92 END DO 93 pu2d(:,:) = pu2d(:,:) / ( hu_0(:,:) + sshu_a(:,:) + 1._wp - umask(:,:,1) ) 94 pv2d(:,:) = pv2d(:,:) / ( hv_0(:,:) + sshv_a(:,:) + 1._wp - vmask(:,:,1) ) 95 ! end jchanut tschanges 96 ELSE 97 DO jk = 1, jpkm1 !! Vertically integrated momentum trends 98 pu2d(:,:) = pu2d(:,:) + fse3u(:,:,jk) * umask(:,:,jk) * ua(:,:,jk) 99 pv2d(:,:) = pv2d(:,:) + fse3v(:,:,jk) * vmask(:,:,jk) * va(:,:,jk) 100 END DO 101 pu2d(:,:) = pu2d(:,:) * phur(:,:) 102 pv2d(:,:) = pv2d(:,:) * phvr(:,:) 103 ENDIF 104 92 105 DO jk = 1 , jpkm1 93 ua(:,:,jk) = ua(:,:,jk) - pu2d(:,:) 94 va(:,:,jk) = va(:,:,jk) - pv2d(:,:) 106 ua(:,:,jk) = ua(:,:,jk) - pu2d(:,:) * umask(:,:,jk) 107 va(:,:,jk) = va(:,:,jk) - pv2d(:,:) * vmask(:,:,jk) 95 108 END DO 96 109 -
branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn2d.F90
r3680 r4105 6 6 !! History : 3.4 ! 2011 (D. Storkey) new module as part of BDY rewrite 7 7 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Optimization of BDY communications 8 !! 3.5 ! 2013-07 (J. Chanut) Compliant with time splitting changes 8 9 !!---------------------------------------------------------------------- 9 10 #if defined key_bdy … … 27 28 28 29 PUBLIC bdy_dyn2d ! routine called in dynspg_ts and bdy_dyn 30 PUBLIC bdy_ssh ! routine called in dynspg_ts or sshwzv 29 31 30 32 !!---------------------------------------------------------------------- … … 135 137 REAL(wp) :: zcorr ! Flather correction 136 138 REAL(wp) :: zforc ! temporary scalar 139 REAL(wp) :: zflag, z1_2 ! " " 137 140 !!---------------------------------------------------------------------- 138 141 139 142 IF( nn_timing == 1 ) CALL timing_start('bdy_dyn2d_fla') 143 144 z1_2 = 0.5_wp 140 145 141 146 ! ---------------------------------! … … 147 152 ! Fill temporary array with ssh data (here spgu): 148 153 igrd = 1 149 spgu(:,:) = 0. 0154 spgu(:,:) = 0._wp 150 155 DO jb = 1, idx%nblenrim(igrd) 151 156 ii = idx%nbi(jb,igrd) … … 164 169 ! 165 170 zcorr = - idx%flagu(jb) * SQRT( grav * phur(ii, ij) ) * ( pssh(iim1, ij) - spgu(iip1,ij) ) 166 zforc = dta%u2d(jb) 167 pu2d(ii,ij) = zforc + zcorr * umask(ii,ij,1) 171 ! bg jchanut tschanges: Set zflag to 0 below to revert to Flather scheme 172 !! zforc = dta%u2d(jb) 173 zflag = ABS(idx%flagu(jb)) 174 iim1 = ii + idx%flagu(jb) 175 zforc = dta%u2d(jb) * (1._wp - z1_2*zflag) + z1_2 * zflag * pu2d(iim1,ij) 176 pu2d(ii,ij) = zforc + (1._wp - z1_2*zflag) * zcorr * umask(ii,ij,1) 177 ! end jchanut tschanges 168 178 END DO 169 179 ! … … 177 187 ! 178 188 zcorr = - idx%flagv(jb) * SQRT( grav * phvr(ii, ij) ) * ( pssh(ii, ijm1) - spgu(ii,ijp1) ) 179 zforc = dta%v2d(jb) 180 pv2d(ii,ij) = zforc + zcorr * vmask(ii,ij,1) 189 ! bg jchanut tschanges: Set zflag to 0 below to revert to std Flather scheme 190 !! zforc = dta%v2d(jb) 191 zflag = ABS(idx%flagv(jb)) 192 ijm1 = ij + idx%flagv(jb) 193 zforc = dta%v2d(jb) * (1._wp - z1_2*zflag) + z1_2 * zflag * pv2d(ii,ijm1) 194 pv2d(ii,ij) = zforc + (1._wp - z1_2*zflag) * zcorr * vmask(ii,ij,1) 195 ! end jchanut tschanges 181 196 END DO 182 197 CALL lbc_bdy_lnk( pu2d, 'U', -1., ib_bdy ) ! Boundary points should be updated … … 186 201 ! 187 202 END SUBROUTINE bdy_dyn2d_fla 203 204 SUBROUTINE bdy_ssh( zssh ) 205 !!---------------------------------------------------------------------- 206 !! *** SUBROUTINE bdy_ssh *** 207 !! 208 !! ** Purpose : Duplicate sea level across open boundaries 209 !! 210 !!---------------------------------------------------------------------- 211 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: zssh ! Sea level 212 !! 213 INTEGER :: ib_bdy, ib, igrd ! local integers 214 INTEGER :: ii, ij, zcoef, zcoef1, zcoef2, ip, jp ! " " 215 216 igrd = 1 ! Everything is at T-points here 217 218 DO ib_bdy = 1, nb_bdy 219 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 220 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 221 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 222 ! Set gradient direction: 223 zcoef1 = bdytmask(ii-1,ij ) + bdytmask(ii+1,ij ) 224 zcoef2 = bdytmask(ii ,ij-1) + bdytmask(ii ,ij+1) 225 IF ( zcoef1+zcoef2 == 0 ) THEN 226 ! corner 227 ! zcoef = tmask(ii-1,ij,1) + tmask(ii+1,ij,1) + tmask(ii,ij-1,1) + tmask(ii,ij+1,1) 228 ! zssh(ii,ij) = zssh(ii-1,ij ) * tmask(ii-1,ij ,1) + & 229 ! & zssh(ii+1,ij ) * tmask(ii+1,ij ,1) + & 230 ! & zssh(ii ,ij-1) * tmask(ii ,ij-1,1) + & 231 ! & zssh(ii ,ij+1) * tmask(ii ,ij+1,1) 232 zcoef = bdytmask(ii-1,ij) + bdytmask(ii+1,ij) + bdytmask(ii,ij-1) + bdytmask(ii,ij+1) 233 zssh(ii,ij) = zssh(ii-1,ij ) * bdytmask(ii-1,ij ) + & 234 & zssh(ii+1,ij ) * bdytmask(ii+1,ij ) + & 235 & zssh(ii ,ij-1) * bdytmask(ii ,ij-1) + & 236 & zssh(ii ,ij+1) * bdytmask(ii ,ij+1) 237 zssh(ii,ij) = ( zssh(ii,ij) / MAX( 1, zcoef) ) * tmask(ii,ij,1) 238 ELSE 239 ip = bdytmask(ii+1,ij ) - bdytmask(ii-1,ij ) 240 jp = bdytmask(ii ,ij+1) - bdytmask(ii ,ij-1) 241 zssh(ii,ij) = zssh(ii+ip,ij+jp) * tmask(ii+ip,ij+jp,1) 242 ENDIF 243 END DO 244 245 ! Boundary points should be updated 246 CALL lbc_bdy_lnk( zssh(:,:), 'T', 1., ib_bdy ) 247 END DO 248 249 END SUBROUTINE bdy_ssh 188 250 #else 189 251 !!---------------------------------------------------------------------- … … 192 254 CONTAINS 193 255 SUBROUTINE bdy_dyn2d( kt ) ! Empty routine 194 WRITE(*,*) 'bdy_dyn_frs: You should not have seen this print! error?', kt 256 INTEGER, intent(in) :: kt 257 WRITE(*,*) 'bdy_dyn2d: You should not have seen this print! error?', kt 195 258 END SUBROUTINE bdy_dyn2d 196 259 #endif -
branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90
r3703 r4105 161 161 162 162 DO ib_bdy = 1,nb_bdy 163 icount = 0 ! flag to set max rimwidth to 1 if no relaxation 163 164 IF(lwp) WRITE(numout,*) ' ' 164 165 IF(lwp) WRITE(numout,*) '------ Open boundary data set ',ib_bdy,'------' … … 175 176 CASE(jp_none) ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 176 177 CASE(jp_frs) ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 178 icount = icount + 1 177 179 CASE(jp_flather) ; IF(lwp) WRITE(numout,*) ' Flather radiation condition' 178 180 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for nn_dyn2d' ) … … 196 198 CASE(jp_none) ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 197 199 CASE(jp_frs) ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 200 icount = icount + 1 198 201 CASE( 2 ) ; IF(lwp) WRITE(numout,*) ' Specified value' 199 202 CASE( 3 ) ; IF(lwp) WRITE(numout,*) ' Zero baroclinic velocities (runoff case)' … … 215 218 CALL ctl_stop( 'Use FRS OR relaxation' ) 216 219 ELSE 220 icount = icount + 1 217 221 IF(lwp) WRITE(numout,*) ' + baroclinic velocities relaxation zone' 218 222 IF(lwp) WRITE(numout,*) ' Damping time scale: ',rn_time_dmp(ib_bdy),' days' … … 228 232 CASE(jp_none) ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 229 233 CASE(jp_frs) ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 234 icount = icount + 1 230 235 CASE( 2 ) ; IF(lwp) WRITE(numout,*) ' Specified value' 231 236 CASE( 3 ) ; IF(lwp) WRITE(numout,*) ' Neumann conditions' … … 248 253 CALL ctl_stop( 'Use FRS OR relaxation' ) 249 254 ELSE 255 icount = icount + 1 250 256 IF(lwp) WRITE(numout,*) ' + T/S relaxation zone' 251 257 IF(lwp) WRITE(numout,*) ' Damping time scale: ',rn_time_dmp(ib_bdy),' days' … … 262 268 CASE( 0 ) ; IF(lwp) WRITE(numout,*) ' no open boundary condition' 263 269 CASE( 1 ) ; IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 270 icount = icount + 1 264 271 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for nn_tra' ) 265 272 END SELECT … … 273 280 IF(lwp) WRITE(numout,*) 274 281 #endif 275 276 IF(lwp) WRITE(numout,*) ' Width of relaxation zone = ', nn_rimwidth(ib_bdy) 277 IF(lwp) WRITE(numout,*) 282 IF ( icount>0 ) THEN 283 IF(lwp) WRITE(numout,*) ' Width of relaxation zone = ', nn_rimwidth(ib_bdy) 284 IF(lwp) WRITE(numout,*) 285 ELSE 286 nn_rimwidth(ib_bdy) = 1 ! no relaxation 287 ENDIF 278 288 279 289 ENDDO … … 446 456 ENDIF 447 457 448 ENDDO 458 ENDDO 449 459 450 460 ! 2. Now fill indices corresponding to straight open boundary arrays: … … 752 762 ! check if point is in local domain 753 763 IF( nbidta(ib,igrd,ib_bdy) >= iw .AND. nbidta(ib,igrd,ib_bdy) <= ie .AND. & 754 & nbjdta(ib,igrd,ib_bdy) >= is .AND. nbjdta(ib,igrd,ib_bdy) <= in ) THEN 764 & nbjdta(ib,igrd,ib_bdy) >= is .AND. nbjdta(ib,igrd,ib_bdy) <= in .AND. & 765 & nbrdta(ib,igrd,ib_bdy) <= nn_rimwidth(ib_bdy) ) THEN 755 766 ! 756 767 icount = icount + 1 … … 765 776 ! Allocate index arrays for this boundary set 766 777 !-------------------------------------------- 767 ilen1 = MAXVAL(idx_bdy(ib_bdy)%nblen(:)) 778 779 ilen1 = MAXVAL(idx_bdy(ib_bdy)%nblen(1:jpbgrd)) 780 ilen1 = MAX(1,ilen1) 768 781 ALLOCATE( idx_bdy(ib_bdy)%nbi(ilen1,jpbgrd) ) 769 782 ALLOCATE( idx_bdy(ib_bdy)%nbj(ilen1,jpbgrd) ) … … 1008 1021 ! bdytmask = 1 on the computational domain AND on open boundaries 1009 1022 ! = 0 elsewhere 1010 1023 bdytmask(:,:) = 1.e0 1024 bdyumask(:,:) = 1.e0 1025 bdyvmask(:,:) = 1.e0 1026 1011 1027 IF( ln_mask_file ) THEN 1012 1028 CALL iom_open( cn_mask_file, inum ) -
branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdytides.F90
r3651 r4105 9 9 !! 3.3 ! 2010-09 (D.Storkey and E.O'Dea) bug fixes 10 10 !! 3.4 ! 2012-09 (G. Reffray and J. Chanut) New inputs + mods 11 !! 3.5 ! 2013-07 (J. Chanut) Compliant with time splitting changes 11 12 !!---------------------------------------------------------------------- 12 13 #if defined key_bdy … … 32 33 ! USE tide_mod ! Useless ?? 33 34 USE fldread, ONLY: fld_map 35 USE dynspg_oce, ONLY: lk_dynspg_ts 34 36 35 37 IMPLICIT NONE … … 38 40 PUBLIC bdytide_init ! routine called in bdy_init 39 41 PUBLIC bdytide_update ! routine called in bdy_dta 42 PUBLIC bdy_dta_tides ! routine called in dyn_spg_ts 40 43 41 44 TYPE, PUBLIC :: TIDES_DATA !: Storage for external tidal harmonics data … … 49 52 50 53 TYPE(TIDES_DATA), PUBLIC, DIMENSION(jp_bdy), TARGET :: tides !: External tidal harmonics data 54 TYPE(OBC_DATA) , PRIVATE, DIMENSION(jp_bdy) :: dta_bdy_s !: bdy external data (slow component) 51 55 52 56 !!---------------------------------------------------------------------- … … 143 147 ALLOCATE( td%v ( ilen0(3), nb_harmo, 2 ) ) 144 148 145 td%ssh0(:,:,:) = 0. e0146 td%ssh (:,:,:) = 0.e0147 td%u0 (:,:,:) = 0.e0148 td%u (:,:,:) = 0.e0149 td%v0 (:,:,:) = 0.e0150 td%v (:,:,:) = 0.e0149 td%ssh0(:,:,:) = 0._wp 150 td%ssh (:,:,:) = 0._wp 151 td%u0 (:,:,:) = 0._wp 152 td%u (:,:,:) = 0._wp 153 td%v0 (:,:,:) = 0._wp 154 td%v (:,:,:) = 0._wp 151 155 152 156 IF (ln_bdytide_2ddta) THEN … … 252 256 ENDIF 253 257 ! 258 IF ( lk_dynspg_ts ) THEN ! Allocate arrays to save slowly varying boundary data during 259 ! time splitting integration 260 ALLOCATE( dta_bdy_s(ib_bdy)%ssh ( ilen0(1) ) ) 261 ALLOCATE( dta_bdy_s(ib_bdy)%u2d ( ilen0(2) ) ) 262 ALLOCATE( dta_bdy_s(ib_bdy)%v2d ( ilen0(3) ) ) 263 dta_bdy_s(ib_bdy)%ssh(:) = 0.e0 264 dta_bdy_s(ib_bdy)%u2d(:) = 0.e0 265 dta_bdy_s(ib_bdy)%v2d(:) = 0.e0 266 ENDIF 267 ! 254 268 ENDIF ! nn_dyn2d_dta(ib_bdy) .ge. 2 255 269 ! … … 297 311 ENDIF 298 312 299 IF ( nsec_day == NINT(0.5 * rdttra(1)) .AND. zflag==1 ) THEN313 IF ( nsec_day == NINT(0.5_wp * rdttra(1)) .AND. zflag==1 ) THEN 300 314 ! 301 315 kt_tide = kt … … 318 332 319 333 IF( PRESENT(jit) ) THEN 320 z_arg = ( ((kt-kt_tide)-1) * rdt + (jit+time_add) * rdt / REAL(nn_baro,wp) )334 z_arg = ((kt-kt_tide) * rdt + (jit+0.5_wp*(time_add-1)) * rdt / REAL(nn_baro,wp) ) 321 335 ELSE 322 336 z_arg = ((kt-kt_tide)+time_add) * rdt … … 324 338 325 339 ! Linear ramp on tidal component at open boundaries 326 zramp = 1. 327 IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg + (kt_tide-nit000)*rdt)/(rdttideramp*rday),0. ),1.)340 zramp = 1._wp 341 IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg + (kt_tide-nit000)*rdt)/(rdttideramp*rday),0._wp),1._wp) 328 342 329 343 DO itide = 1, nb_harmo … … 351 365 ! 352 366 END SUBROUTINE bdytide_update 367 368 SUBROUTINE bdy_dta_tides( kt, kit, time_offset ) 369 !!---------------------------------------------------------------------- 370 !! *** SUBROUTINE bdy_dta_tides *** 371 !! 372 !! ** Purpose : - Add tidal forcing to ssh, u2d and v2d OBC data arrays. 373 !! 374 !!---------------------------------------------------------------------- 375 INTEGER, INTENT( in ) :: kt ! Main timestep counter 376 INTEGER, INTENT( in ),OPTIONAL :: kit ! Barotropic timestep counter (for timesplitting option) 377 INTEGER, INTENT( in ),OPTIONAL :: time_offset ! time offset in units of timesteps. NB. if kit 378 ! is present then units = subcycle timesteps. 379 ! time_offset = 0 => get data at "now" time level 380 ! time_offset = -1 => get data at "before" time level 381 ! time_offset = +1 => get data at "after" time level 382 ! etc. 383 !! 384 LOGICAL :: lk_first_btstp ! =.TRUE. if time splitting and first barotropic step 385 INTEGER, DIMENSION(jpbgrd) :: ilen0 386 INTEGER, DIMENSION(1:jpbgrd) :: nblen, nblenrim ! short cuts 387 INTEGER :: itide, ib_bdy, ib, igrd ! loop indices 388 INTEGER :: time_add ! time offset in units of timesteps 389 REAL(wp) :: z_arg, z_sarg, zramp, zoff, z_cost, z_sist 390 !!---------------------------------------------------------------------- 391 392 IF( nn_timing == 1 ) CALL timing_start('bdy_dta_tides') 393 394 lk_first_btstp=.TRUE. 395 IF ( PRESENT(kit).AND.( kit /= 1 ) ) THEN ; lk_first_btstp=.FALSE. ; ENDIF 396 397 time_add = 0 398 IF( PRESENT(time_offset) ) THEN 399 time_add = time_offset 400 ENDIF 401 402 ! Absolute time from model initialization: 403 IF( PRESENT(kit) ) THEN 404 z_arg = ( kt + (kit+0.5_wp*(time_add-1)) / REAL(nn_baro,wp) ) * rdt 405 ELSE 406 z_arg = ( kt + time_add ) * rdt 407 ENDIF 408 409 ! Linear ramp on tidal component at open boundaries 410 zramp = 1. 411 IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg - nit000*rdt)/(rdttideramp*rday),0.),1.) 412 413 DO ib_bdy = 1,nb_bdy 414 415 ! line below should be simplified (runoff case) 416 IF (( nn_dyn2d_dta(ib_bdy) .ge. 2 ).AND.(nn_tra(ib_bdy).NE.4)) THEN 417 418 nblen(1:jpbgrd) = idx_bdy(ib_bdy)%nblen(1:jpbgrd) 419 nblenrim(1:jpbgrd) = idx_bdy(ib_bdy)%nblenrim(1:jpbgrd) 420 421 IF( nn_dyn2d(ib_bdy) .eq. jp_frs ) THEN 422 ilen0(:)=nblen(:) 423 ELSE 424 ilen0(:)=nblenrim(:) 425 ENDIF 426 427 ! We refresh nodal factors every day below 428 ! This should be done somewhere else 429 IF ( nsec_day == NINT(0.5_wp * rdttra(1)) .AND. lk_first_btstp ) THEN 430 ! 431 kt_tide = kt 432 ! 433 IF(lwp) THEN 434 WRITE(numout,*) 435 WRITE(numout,*) 'bdy_tide_dta : Refresh nodal factors for tidal open bdy data at kt=',kt 436 WRITE(numout,*) '~~~~~~~~~~~~~~ ' 437 ENDIF 438 ! 439 CALL tide_init_elevation ( idx=idx_bdy(ib_bdy), td=tides(ib_bdy) ) 440 CALL tide_init_velocities( idx=idx_bdy(ib_bdy), td=tides(ib_bdy) ) 441 ! 442 ENDIF 443 zoff = -kt_tide * rdt ! time offset relative to nodal factor computation time 444 ! 445 ! If time splitting, save data at first barotropic iteration 446 IF ( PRESENT(kit) ) THEN 447 IF ( lk_first_btstp ) THEN ! Save slow varying open boundary data: 448 dta_bdy_s(ib_bdy)%ssh(1:ilen0(1)) = dta_bdy(ib_bdy)%ssh(1:ilen0(1)) 449 dta_bdy_s(ib_bdy)%u2d(1:ilen0(2)) = dta_bdy(ib_bdy)%u2d(1:ilen0(2)) 450 dta_bdy_s(ib_bdy)%v2d(1:ilen0(3)) = dta_bdy(ib_bdy)%v2d(1:ilen0(3)) 451 452 ELSE ! Initialize arrays from slow varying open boundary data: 453 dta_bdy(ib_bdy)%ssh(1:ilen0(1)) = dta_bdy_s(ib_bdy)%ssh(1:ilen0(1)) 454 dta_bdy(ib_bdy)%u2d(1:ilen0(2)) = dta_bdy_s(ib_bdy)%u2d(1:ilen0(2)) 455 dta_bdy(ib_bdy)%v2d(1:ilen0(3)) = dta_bdy_s(ib_bdy)%v2d(1:ilen0(3)) 456 ENDIF 457 ENDIF 458 ! 459 ! Update open boundary data arrays: 460 DO itide = 1, nb_harmo 461 ! 462 z_sarg = (z_arg + zoff) * omega_tide(itide) 463 z_cost = zramp * COS( z_sarg ) 464 z_sist = zramp * SIN( z_sarg ) 465 ! 466 igrd=1 ! SSH on tracer grid 467 DO ib = 1, ilen0(igrd) 468 dta_bdy(ib_bdy)%ssh(ib) = dta_bdy(ib_bdy)%ssh(ib) + & 469 & ( tides(ib_bdy)%ssh(ib,itide,1)*z_cost + & 470 & tides(ib_bdy)%ssh(ib,itide,2)*z_sist ) 471 END DO 472 ! 473 igrd=2 ! U grid 474 DO ib = 1, ilen0(igrd) 475 dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) + & 476 & ( tides(ib_bdy)%u(ib,itide,1)*z_cost + & 477 & tides(ib_bdy)%u(ib,itide,2)*z_sist ) 478 END DO 479 ! 480 igrd=3 ! V grid 481 DO ib = 1, ilen0(igrd) 482 dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) + & 483 & ( tides(ib_bdy)%v(ib,itide,1)*z_cost + & 484 & tides(ib_bdy)%v(ib,itide,2)*z_sist ) 485 END DO 486 END DO 487 END IF 488 END DO 489 ! 490 IF( nn_timing == 1 ) CALL timing_stop('bdy_dta_tides') 491 ! 492 END SUBROUTINE bdy_dta_tides 353 493 354 494 SUBROUTINE tide_init_elevation( idx, td ) … … 457 597 WRITE(*,*) 'bdytide_update: You should not have seen this print! error?', kt, jit 458 598 END SUBROUTINE bdytide_update 599 SUBROUTINE bdy_dta_tides( kt, jit ) ! Empty routine 600 WRITE(*,*) 'bdy_dta_tides: You should not have seen this print! error?', kt, jit 601 END SUBROUTINE bdy_dta_tides 459 602 #endif 460 603 -
branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv_ubs.F90
r3294 r4105 29 29 30 30 REAL(wp), PARAMETER :: gamma1 = 1._wp/3._wp ! =1/4 quick ; =1/3 3rd order UBS 31 REAL(wp), PARAMETER :: gamma2 = 1._wp/ 8._wp ! =0 2nd order ; =1/84th order centred31 REAL(wp), PARAMETER :: gamma2 = 1._wp/32._wp ! =0 2nd order ; =1/32 4th order centred 32 32 33 33 PUBLIC dyn_adv_ubs ! routine called by step.F90 … … 57 57 !! = 1/3 3rd order Upstream biased scheme 58 58 !! gamma2 = 0 2nd order finite differencing 59 !! = 1/ 84th order finite differencing59 !! = 1/32 4th order finite differencing 60 60 !! For stability reasons, the first term of the fluxes which cor- 61 61 !! responds to a second order centered scheme is evaluated using … … 64 64 !! before velocity (forward in time). 65 65 !! Default value (hard coded in the begining of the module) are 66 !! gamma1=1/3 and gamma2=1/ 8.66 !! gamma1=1/3 and gamma2=1/32. 67 67 !! 68 68 !! ** Action : - (ua,va) updated with the 3D advective momentum trends -
branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_imp.F90
r3625 r4105 16 16 USE oce ! ocean dynamics and tracers 17 17 USE dom_oce ! ocean space and time domain 18 USE domvvl ! variable volume 18 19 USE sbc_oce ! surface boundary condition: ocean 19 20 USE zdf_oce ! ocean vertical physics … … 24 25 USE wrk_nemo ! Memory Allocation 25 26 USE timing ! Timing 27 USE dynadv ! dynamics: vector invariant versus flux form 28 USE dynspg_oce, ONLY: lk_dynspg_ts 29 USE dynspg_ts 26 30 27 31 IMPLICIT NONE … … 29 33 30 34 PUBLIC dyn_zdf_imp ! called by step.F90 35 36 REAL(wp) :: r_vvl ! variable volume indicator, =1 if lk_vvl=T, =0 otherwise 31 37 32 38 !! * Substitutions … … 64 70 INTEGER :: ikbu, ikbv ! local integers 65 71 REAL(wp) :: z1_p2dt, zcoef, zzwi, zzws, zrhs ! local scalars 72 REAL(wp) :: ze3ua, ze3va 66 73 !!---------------------------------------------------------------------- 67 74 68 75 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwi, zwd, zws 69 REAL(wp), POINTER, DIMENSION(:,:) :: zavmu, zavmv70 76 !!---------------------------------------------------------------------- 71 77 ! … … 73 79 ! 74 80 CALL wrk_alloc( jpi,jpj,jpk, zwi, zwd, zws ) 75 CALL wrk_alloc( jpi,jpj, zavmu, zavmv )76 81 ! 77 82 IF( kt == nit000 ) THEN … … 79 84 IF(lwp) WRITE(numout,*) 'dyn_zdf_imp : vertical momentum diffusion implicit operator' 80 85 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 86 ! 87 IF( lk_vvl ) THEN ; r_vvl = 1._wp ! Variable volume indicator 88 ELSE ; r_vvl = 0._wp 89 ENDIF 81 90 ENDIF 82 91 … … 94 103 IF( ln_bfrimp ) THEN 95 104 # if defined key_vectopt_loop 96 DO jj = 1, 197 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling)105 DO jj = 1, 1 106 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) 98 107 # else 99 DO jj = 2, jpjm1100 DO ji = 2, jpim1108 DO jj = 2, jpjm1 109 DO ji = 2, jpim1 101 110 # endif 102 ikbu = mbku(ji,jj) ! ocean bottom level at u- and v-points 103 ikbv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 104 zavmu(ji,jj) = avmu(ji,jj,ikbu+1) 105 zavmv(ji,jj) = avmv(ji,jj,ikbv+1) 106 avmu(ji,jj,ikbu+1) = -bfrua(ji,jj) * fse3uw(ji,jj,ikbu+1) 107 avmv(ji,jj,ikbv+1) = -bfrva(ji,jj) * fse3vw(ji,jj,ikbv+1) 108 END DO 109 END DO 110 ENDIF 111 ikbu = mbku(ji,jj) ! ocean bottom level at u- and v-points 112 ikbv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 113 avmu(ji,jj,ikbu+1) = -bfrua(ji,jj) * fse3uw(ji,jj,ikbu+1) 114 avmv(ji,jj,ikbv+1) = -bfrva(ji,jj) * fse3vw(ji,jj,ikbv+1) 115 END DO 116 END DO 117 ENDIF 118 119 #if defined key_dynspg_ts 120 IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN ! applied on velocity 121 DO jk = 1, jpkm1 122 ua(:,:,jk) = ( ub(:,:,jk) + p2dt * ua(:,:,jk) ) * umask(:,:,jk) 123 va(:,:,jk) = ( vb(:,:,jk) + p2dt * va(:,:,jk) ) * vmask(:,:,jk) 124 END DO 125 ELSE ! applied on thickness weighted velocity 126 DO jk = 1, jpkm1 127 ua(:,:,jk) = ( ub(:,:,jk) * fse3u_b(:,:,jk) & 128 & + p2dt * ua(:,:,jk) * fse3u_n(:,:,jk) ) & 129 & / fse3u_a(:,:,jk) * umask(:,:,jk) 130 va(:,:,jk) = ( vb(:,:,jk) * fse3v_b(:,:,jk) & 131 & + p2dt * va(:,:,jk) * fse3v_n(:,:,jk) ) & 132 & / fse3v_a(:,:,jk) * vmask(:,:,jk) 133 END DO 134 ENDIF 135 136 IF ( ln_bfrimp .AND.lk_dynspg_ts ) THEN 137 ! remove barotropic velocities: 138 DO jk = 1, jpkm1 139 ua(:,:,jk) = (ua(:,:,jk) - ua_b(:,:)) * umask(:,:,jk) 140 va(:,:,jk) = (va(:,:,jk) - va_b(:,:)) * vmask(:,:,jk) 141 ENDDO 142 ! Add bottom stress due to barotropic component only: 143 DO jj = 2, jpjm1 144 DO ji = fs_2, fs_jpim1 ! vector opt. 145 ikbu = mbku(ji,jj) ! ocean bottom level at u- and v-points 146 ikbv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 147 ze3ua = ( 1._wp - r_vvl ) * fse3u_n(ji,jj,ikbu) + r_vvl * fse3u_a(ji,jj,ikbu) 148 ze3va = ( 1._wp - r_vvl ) * fse3v_n(ji,jj,ikbv) + r_vvl * fse3v_a(ji,jj,ikbv) 149 ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + p2dt * bfrua(ji,jj) * ua_b(ji,jj) / ze3ua 150 va(ji,jj,ikbv) = va(ji,jj,ikbv) + p2dt * bfrva(ji,jj) * va_b(ji,jj) / ze3va 151 END DO 152 END DO 153 ENDIF 154 #endif 111 155 112 156 ! 2. Vertical diffusion on u … … 119 163 DO jj = 2, jpjm1 120 164 DO ji = fs_2, fs_jpim1 ! vector opt. 121 zcoef = - p2dt / fse3u(ji,jj,jk) 165 ze3ua = ( 1._wp - r_vvl ) * fse3u_n(ji,jj,jk) + r_vvl * fse3u_a(ji,jj,jk) ! after scale factor at T-point 166 zcoef = - p2dt / ze3ua 122 167 zzwi = zcoef * avmu (ji,jj,jk ) / fse3uw(ji,jj,jk ) 123 168 zwi(ji,jj,jk) = zzwi * umask(ji,jj,jk) … … 128 173 END DO 129 174 END DO 130 DO jj = 2, jpjm1 ! Surface bou dary conditions175 DO jj = 2, jpjm1 ! Surface boundary conditions 131 176 DO ji = fs_2, fs_jpim1 ! vector opt. 132 177 zwi(ji,jj,1) = 0._wp … … 160 205 DO jj = 2, jpjm1 !== second recurrence: SOLk = RHSk - Lk / Dk-1 Lk-1 == 161 206 DO ji = fs_2, fs_jpim1 ! vector opt. 162 ua(ji,jj,1) = ub(ji,jj,1) + p2dt * ( ua(ji,jj,1) + 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) ) & 163 & * r1_rau0 / fse3u(ji,jj,1) ) 207 ze3ua = ( 1._wp - r_vvl ) * fse3u_n(ji,jj,1) + r_vvl * fse3u_a(ji,jj,1) 208 #if defined key_dynspg_ts 209 ua(ji,jj,1) = ua(ji,jj,1) + p2dt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) ) & 210 & / ( ze3ua * rau0 ) 211 #else 212 ua(ji,jj,1) = ub(ji,jj,1) + p2dt *(ua(ji,jj,1) + 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) ) & 213 & / ( fse3u(ji,jj,1) * rau0 ) ) 214 #endif 164 215 END DO 165 216 END DO … … 167 218 DO jj = 2, jpjm1 168 219 DO ji = fs_2, fs_jpim1 ! vector opt. 169 zrhs = ub(ji,jj,jk) + p2dt * ua(ji,jj,jk) ! zrhs=right hand side 220 #if defined key_dynspg_ts 221 zrhs = ua(ji,jj,jk) ! zrhs=right hand side 222 #else 223 zrhs = ub(ji,jj,jk) + p2dt * ua(ji,jj,jk) 224 #endif 170 225 ua(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1) 171 226 END DO … … 186 241 END DO 187 242 243 #if ! defined key_dynspg_ts 188 244 ! Normalization to obtain the general momentum trend ua 189 245 DO jk = 1, jpkm1 … … 194 250 END DO 195 251 END DO 196 252 #endif 197 253 198 254 ! 3. Vertical diffusion on v … … 205 261 DO jj = 2, jpjm1 206 262 DO ji = fs_2, fs_jpim1 ! vector opt. 207 zcoef = -p2dt / fse3v(ji,jj,jk) 263 ze3va = ( 1._wp - r_vvl ) * fse3v_n(ji,jj,jk) + r_vvl * fse3v_a(ji,jj,jk) ! after scale factor at T-point 264 zcoef = - p2dt / ze3va 208 265 zzwi = zcoef * avmv (ji,jj,jk ) / fse3vw(ji,jj,jk ) 209 266 zwi(ji,jj,jk) = zzwi * vmask(ji,jj,jk) … … 214 271 END DO 215 272 END DO 216 DO jj = 2, jpjm1 ! Surface bou dary conditions273 DO jj = 2, jpjm1 ! Surface boundary conditions 217 274 DO ji = fs_2, fs_jpim1 ! vector opt. 218 275 zwi(ji,jj,1) = 0._wp … … 246 303 DO jj = 2, jpjm1 !== second recurrence: SOLk = RHSk - Lk / Dk-1 Lk-1 == 247 304 DO ji = fs_2, fs_jpim1 ! vector opt. 248 va(ji,jj,1) = vb(ji,jj,1) + p2dt * ( va(ji,jj,1) + 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) ) & 249 & * r1_rau0 / fse3v(ji,jj,1) ) 305 ze3va = ( 1._wp - r_vvl ) * fse3v_n(ji,jj,1) + r_vvl * fse3v_a(ji,jj,1) 306 #if defined key_dynspg_ts 307 va(ji,jj,1) = va(ji,jj,1) + p2dt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) ) & 308 & / ( ze3va * rau0 ) 309 #else 310 va(ji,jj,1) = vb(ji,jj,1) + p2dt *(va(ji,jj,1) + 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) ) & 311 & / ( fse3v(ji,jj,1) * rau0 ) ) 312 #endif 250 313 END DO 251 314 END DO … … 253 316 DO jj = 2, jpjm1 254 317 DO ji = fs_2, fs_jpim1 ! vector opt. 255 zrhs = vb(ji,jj,jk) + p2dt * va(ji,jj,jk) ! zrhs=right hand side 318 #if defined key_dynspg_ts 319 zrhs = va(ji,jj,jk) ! zrhs=right hand side 320 #else 321 zrhs = vb(ji,jj,jk) + p2dt * va(ji,jj,jk) 322 #endif 256 323 va(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1) 257 324 END DO … … 273 340 274 341 ! Normalization to obtain the general momentum trend va 342 #if ! defined key_dynspg_ts 275 343 DO jk = 1, jpkm1 276 344 DO jj = 2, jpjm1 … … 280 348 END DO 281 349 END DO 282 350 #endif 351 352 ! J. Chanut: Lines below are useless ? 283 353 !! restore bottom layer avmu(v) 284 354 IF( ln_bfrimp ) THEN … … 292 362 ikbu = mbku(ji,jj) ! ocean bottom level at u- and v-points 293 363 ikbv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 294 avmu(ji,jj,ikbu+1) = zavmu(ji,jj)295 avmv(ji,jj,ikbv+1) = zavmv(ji,jj)364 avmu(ji,jj,ikbu+1) = 0.e0 365 avmv(ji,jj,ikbv+1) = 0.e0 296 366 END DO 297 367 END DO … … 299 369 ! 300 370 CALL wrk_dealloc( jpi,jpj,jpk, zwi, zwd, zws) 301 CALL wrk_dealloc( jpi,jpj, zavmu, zavmv)302 371 ! 303 372 IF( nn_timing == 1 ) CALL timing_stop('dyn_zdf_imp') -
branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/nemogcm.F90
r3769 r4105 339 339 CALL istate_init ! ocean initial state (Dynamics and tracers) 340 340 341 IF( lk_tide ) CALL tide_init( nit000 ) ! Initialisation of the tidal harmonics 342 343 IF( lk_bdy ) CALL bdy_init ! Open boundaries initialisation 344 IF( lk_bdy ) CALL bdy_dta_init ! Open boundaries initialisation of external data arrays 345 IF( lk_bdy ) CALL bdytide_init ! Open boundaries initialisation of tidal harmonic forcing 341 IF( lk_tide ) CALL tide_init( nit000 ) ! Initialisation of the tidal harmonics 342 343 IF( lk_bdy ) CALL bdy_init ! Open boundaries initialisation 344 IF( lk_bdy ) CALL bdy_dta_init ! Open boundaries initialisation of external data arrays 345 IF( lk_bdy .AND. lk_tide ) & 346 & CALL bdytide_init ! Open boundaries initialisation of tidal harmonic forcing 346 347 347 348 CALL dyn_nept_init ! simplified form of Neptune effect
Note: See TracChangeset
for help on using the changeset viewer.