Changeset 3294 for trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynbfr.F90
- Timestamp:
- 2012-01-28T17:44:18+01:00 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynbfr.F90
r2715 r3294 5 5 !!============================================================================== 6 6 !! History : 3.2 ! 2008-11 (A. C. Coward) Original code 7 !! 3.4 ! 2011-09 (H. Liu) Make it consistent with semi-implicit 8 !! Bottom friction (ln_bfrimp = .true.) 7 9 !!---------------------------------------------------------------------- 8 10 … … 13 15 USE dom_oce ! ocean space and time domain variables 14 16 USE zdf_oce ! ocean vertical physics variables 17 USE zdfbfr ! ocean bottom friction variables 15 18 USE trdmod ! ocean active dynamics and tracers trends 16 19 USE trdmod_oce ! ocean variables trends 17 20 USE in_out_manager ! I/O manager 18 21 USE prtctl ! Print control 22 USE timing ! Timing 23 USE wrk_nemo ! Memory Allocation 19 24 20 25 IMPLICIT NONE … … 42 47 !! ** Action : (ua,va) momentum trend increased by bottom friction trend 43 48 !!--------------------------------------------------------------------- 44 USE oce, ONLY: ztrduv => tsa ! tsa used as 4D workspace45 !!46 49 INTEGER, INTENT(in) :: kt ! ocean time-step index 47 50 !! … … 49 52 INTEGER :: ikbu, ikbv ! local integers 50 53 REAL(wp) :: zm1_2dt ! local scalar 54 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 51 55 !!--------------------------------------------------------------------- 52 56 ! 53 zm1_2dt = - 1._wp / ( 2._wp * rdt ) 57 IF( nn_timing == 1 ) CALL timing_start('dyn_bfr') 58 ! 59 IF( .NOT.ln_bfrimp) THEN ! only for explicit bottom friction form 60 ! implicit bfr is implemented in dynzdf_imp 54 61 55 IF( l_trddyn ) THEN ! temporary save of ua and va trends 56 ztrduv(:,:,:,1) = ua(:,:,:) 57 ztrduv(:,:,:,2) = va(:,:,:) 58 ENDIF 62 zm1_2dt = - 1._wp / ( 2._wp * rdt ) 63 64 IF( l_trddyn ) THEN ! temporary save of ua and va trends 65 CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 66 ztrdu(:,:,:) = ua(:,:,:) 67 ztrdv(:,:,:) = va(:,:,:) 68 ENDIF 69 59 70 60 71 # if defined key_vectopt_loop 61 DO jj = 1, 162 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling)72 DO jj = 1, 1 73 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) 63 74 # else 64 DO jj = 2, jpjm165 DO ji = 2, jpim175 DO jj = 2, jpjm1 76 DO ji = 2, jpim1 66 77 # endif 67 ikbu = mbku(ji,jj) ! deepest ocean u- & v-levels68 ikbv = mbkv(ji,jj)69 !70 ! Apply stability criteria on absolute value : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt)71 ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX( bfrua(ji,jj) / fse3u(ji,jj,ikbu) , zm1_2dt ) * ub(ji,jj,ikbu)72 va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX( bfrva(ji,jj) / fse3v(ji,jj,ikbv) , zm1_2dt ) * vb(ji,jj,ikbv)73 END DO74 END DO78 ikbu = mbku(ji,jj) ! deepest ocean u- & v-levels 79 ikbv = mbkv(ji,jj) 80 ! 81 ! Apply stability criteria on absolute value : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt) 82 ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX( bfrua(ji,jj) / fse3u(ji,jj,ikbu) , zm1_2dt ) * ub(ji,jj,ikbu) 83 va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX( bfrva(ji,jj) / fse3v(ji,jj,ikbv) , zm1_2dt ) * vb(ji,jj,ikbv) 84 END DO 85 END DO 75 86 87 ! 88 IF( l_trddyn ) THEN ! save the vertical diffusive trends for further diagnostics 89 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 90 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 91 CALL trd_mod( ztrdu(:,:,:), ztrdv(:,:,:), jpdyn_trd_bfr, 'DYN', kt ) 92 CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 93 ENDIF 94 ! ! print mean trends (used for debugging) 95 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' bfr - Ua: ', mask1=umask, & 96 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 97 ! 98 ENDIF ! end explicit bottom friction 76 99 ! 77 IF( l_trddyn ) THEN ! save the vertical diffusive trends for further diagnostics 78 ztrduv(:,:,:,1) = ua(:,:,:) - ztrduv(:,:,:,1) 79 ztrduv(:,:,:,2) = va(:,:,:) - ztrduv(:,:,:,2) 80 CALL trd_mod( ztrduv(:,:,:,1), ztrduv(:,:,:,2), jpdyn_trd_bfr, 'DYN', kt ) 81 ENDIF 82 ! ! print mean trends (used for debugging) 83 IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' bfr - Ua: ', mask1=umask, & 84 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 100 IF( nn_timing == 1 ) CALL timing_stop('dyn_bfr') 85 101 ! 86 102 END SUBROUTINE dyn_bfr
Note: See TracChangeset
for help on using the changeset viewer.