Changeset 15784
- Timestamp:
- 2022-04-21T12:19:38+02:00 (2 years ago)
- Location:
- NEMO/branches/UKMO/NEMO_4.0.4_CO9_wadcpl/src/OCE
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/UKMO/NEMO_4.0.4_CO9_wadcpl/src/OCE/BDY/bdy_oce.F90
r14075 r15784 43 43 INTEGER , DIMENSION(2) :: nread 44 44 LOGICAL :: lneed_ssh 45 !--- davbyr 46 LOGICAL :: lforced_ssh 47 !--- END davbyr 45 48 LOGICAL :: lneed_dyn2d 46 49 LOGICAL :: lneed_dyn3d … … 117 120 REAL(wp), DIMENSION(jp_bdy) :: rice_hpnd !: pond thick. of incoming sea ice 118 121 REAL(wp), DIMENSION(jp_bdy) :: rice_hlid !: pond lid thick. of incoming sea ice 122 123 ! davbyr 124 LOGICAL, DIMENSION(jp_bdy) :: ln_ssh_bdy !: =T USE SSH BDY - name list switch 125 REAL(wp), DIMENSION(jp_bdy) :: rn_ssh_shift !: =F SHIFT SSH AT A BORDER BY rn_ssh_shift m_ 126 ! END davbyr 119 127 ! 120 128 !!---------------------------------------------------------------------- -
NEMO/branches/UKMO/NEMO_4.0.4_CO9_wadcpl/src/OCE/BDY/bdydta.F90
r14075 r15784 362 362 ENDIF 363 363 ENDIF 364 365 ! davbyr - add a shift to the boundary + free elevation Enda, JT from NEMO RAN 3.6 366 DO jbdy = 1, nb_bdy 367 IF( dta_bdy(jbdy)%lneed_ssh ) THEN 368 igrd = 1 369 DO ib = 1, idx_bdy(jbdy)%nblenrim(igrd) ! ssh is used only on the rim 370 ii = idx_bdy(jbdy)%nbi(ib,igrd) 371 ij = idx_bdy(jbdy)%nbj(ib,igrd) 372 dta_bdy(jbdy)%ssh(ib) = dta_bdy(jbdy)%ssh(ib) + rn_ssh_shift(jbdy) * tmask(ii,ij,1) 373 IF( .NOT. dta_bdy(jbdy)%lforced_ssh ) dta_bdy(jbdy)%ssh(ib) = sshn(ii,ij) * tmask(ii,ij,1) 374 END DO 375 END IF 376 END DO 377 !--- END davbyr 378 364 379 ! 365 380 IF( ln_timing ) CALL timing_stop('bdy_dta') -
NEMO/branches/UKMO/NEMO_4.0.4_CO9_wadcpl/src/OCE/BDY/bdyini.F90
r15783 r15784 69 69 & ln_vol, nn_volctl, nn_rimwidth 70 70 ! 71 ! davbyr Propagating ENDA's stuff from 3.6 72 NAMELIST/nambdy_ssh/ ln_ssh_bdy, rn_ssh_shift 73 INTEGER :: ib_bdy 74 ! END davbyr 71 75 INTEGER :: ios ! Local integer output status for namelist read 72 76 !!---------------------------------------------------------------------- … … 97 101 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'nambdy in configuration namelist' ) 98 102 IF(lwm) WRITE ( numond, nambdy ) 103 104 ! davbyr Propagating ENDA's stuff from 3.6 105 REWIND( numnam_ref ) ! Namelist nambdy in reference namelist :Unstructured open boundaries 106 READ ( numnam_ref, nambdy_ssh, IOSTAT = ios, ERR = 905) 107 905 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy_ssh in reference namelist' ) 108 109 REWIND( numnam_cfg ) ! Namelist nambdy in configuration namelist :Unstructured open boundaries 110 READ ( numnam_cfg, nambdy_ssh, IOSTAT = ios, ERR = 906) 111 906 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy_ssh in configuration namelist' ) 112 IF(lwm) WRITE ( numond, nambdy_ssh ) 113 114 IF(lwp) WRITE(numout,*) 115 IF(lwp) WRITE(numout,*) 'nambdy_ssh : use of ssh boundaries' 116 IF(lwp) WRITE(numout,*) '~~~~~~~~' 117 IF(lwp) WRITE(numout,*) ' ln_ssh_bdy: ' 118 DO ib_bdy = 1,nb_bdy 119 IF(lwp) WRITE(numout,*) ' ln_ssh_bdy (',ib_bdy,'): ',ln_ssh_bdy(ib_bdy) 120 IF(lwp) WRITE(numout,*) ' rn_ssh_shift: ' 121 ENDDO 122 DO ib_bdy = 1,nb_bdy 123 IF(lwp) WRITE(numout,*) ' rn_ssh_shift(',ib_bdy,'): ',rn_ssh_shift(ib_bdy) 124 ENDDO 125 IF(lwp) WRITE(numout,*) '~~~~~~~~' 126 IF(lwp) WRITE(numout,*) 127 ! END davbyr 99 128 100 129 IF( .NOT. Agrif_Root() ) ln_bdy = .FALSE. ! forced for Agrif children … … 201 230 dta_bdy(ib_bdy)%lneed_ssh = cn_dyn2d(ib_bdy) == 'flather' 202 231 dta_bdy(ib_bdy)%lneed_dyn2d = cn_dyn2d(ib_bdy) /= 'none' 232 233 ! davbyr propagating JT override dta_bdy(ib_bdy)%ll_ssh with namelist value (ln_ssh_bdy) 234 dta_bdy(ib_bdy)%lforced_ssh = ln_ssh_bdy(ib_bdy) 235 IF(lwp) WRITE(numout,*) 'nambdy_ssh : use of ssh boundaries' 236 IF(lwp) WRITE(numout,*) '~~~~~~~~' 237 IF(lwp) WRITE(numout,*) ' ib_bdy: ',ib_bdy 238 IF(lwp) WRITE(numout,*) ' dta_bdy(ib_bdy)%lneed_ssh : ',dta_bdy(ib_bdy)%lneed_ssh 239 IF(lwp) WRITE(numout,*) ' dta_bdy(ib_bdy)%lforced_ssh: ',dta_bdy(ib_bdy)%lforced_ssh 240 IF(lwp) WRITE(numout,*) '~~~~~~~~' 241 ! END davbyr 203 242 204 243 IF( lwp .AND. dta_bdy(ib_bdy)%lneed_dyn2d ) THEN -
NEMO/branches/UKMO/NEMO_4.0.4_CO9_wadcpl/src/OCE/DOM/dom_oce.F90
r14075 r15784 152 152 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: r1_hv_b , r1_hv_n , r1_hv_a !: inverse of v-depth [1/m] 153 153 154 !CEOD Scale of water column down to shallowest of neighbourinbg points over total 155 !water depth 156 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: scaled_e3t_0_ik , scaled_e3t_0_jk 157 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: scaled_e3t_0_ip1k , scaled_e3t_0_jp1k 158 !CEOD 154 159 INTEGER, PUBLIC :: nla10 !: deepest W level Above ~10m (nlb10 - 1) 155 160 INTEGER, PUBLIC :: nlb10 !: shallowest W level Bellow ~10m (nla10 + 1) … … 294 299 ! 295 300 ALLOCATE( wmask(jpi,jpj,jpk) , wumask(jpi,jpj,jpk), wvmask(jpi,jpj,jpk) , STAT=ierr(12) ) 301 !CEOD 302 ALLOCATE( scaled_e3t_0_ik (jpi,jpj) , scaled_e3t_0_jk (jpi,jpj) , & 303 & scaled_e3t_0_ip1k(jpi,jpj) , scaled_e3t_0_jp1k(jpi,jpj) , STAT=ierr(13) ) 304 ! 296 305 ! 297 306 dom_oce_alloc = MAXVAL(ierr) -
NEMO/branches/UKMO/NEMO_4.0.4_CO9_wadcpl/src/OCE/DOM/domain.F90
r15783 r15784 79 79 INTEGER , DIMENSION(jpi,jpj) :: ik_top , ik_bot ! top and bottom ocean level 80 80 REAL(wp), DIMENSION(jpi,jpj) :: z1_hu_0, z1_hv_0 81 !CEOD 82 REAL(wp), DIMENSION(jpi,jpj) :: k_bot_i_min, k_bot_j_min 83 REAL(wp), DIMENSION(jpi,jpj) :: sum_e3t_0_min_ik 84 REAL(wp), DIMENSION(jpi,jpj) :: sum_e3t_0_min_jk 85 REAL(wp), DIMENSION(jpi,jpj) :: sum_e3t_0_min_ip1k 86 REAL(wp), DIMENSION(jpi,jpj) :: sum_e3t_0_min_jp1k 81 87 !!---------------------------------------------------------------------- 82 88 ! … … 155 161 hv_0(:,:) = hv_0(:,:) + e3v_0(:,:,jk) * vmask(:,:,jk) 156 162 END DO 163 !CEOD Here we need to work out which is the shallowest point in terms of k 164 ! levels at neighbouring points in i and j directions. 165 ! Then we need to work out the proportion of the water column down to ht_0 that 166 ! that level is for both i points. 167 ! e.g. point i could say go down to level 10 but point i+1 only level 5 168 ! then work out depth of bottom of level 5 at point i over depth at point i to 169 ! level 10 170 ! This is needed later to work out where a u point depth should be when using 171 ! enveloping coordinates, as it will be 1/2 depth at t point at level 5 for i,i+1 172 ! points Because level 5 at i can change in time, thus u bed can change in time! 173 ! What about under ice shelves? Need rto return to that later 174 175 ! 1) get the shallowest k level at neighbouring i and j points store in ! k_bot_i_min 176 177 DO jj = 1, jpjm1 178 DO ji = 1, jpim1 ! SPG with the application of W/D gravity filters 179 k_bot_i_min(ji,jj) = MIN( ik_bot(ji,jj), ik_bot(ji+1,jj )) 180 k_bot_j_min(ji,jj) = MIN( ik_bot(ji,jj), ik_bot(ji, jj+1)) 181 ENDDO 182 ENDDO 183 ! 2) Work out the depth down to the shallowest k level both at point i and i+1 184 ! (likewise for j) 185 186 sum_e3t_0_min_ik(:,:) = 0 187 sum_e3t_0_min_jk(:,:) = 0 188 sum_e3t_0_min_ip1k(:,:) = 0 189 sum_e3t_0_min_jp1k(:,:) = 0 190 191 !Get sum of e3t_0s down to local min 192 DO jj = 1, jpjm1 193 DO ji = 1, jpim1 194 DO jk = 1, k_bot_i_min(ji,jj) 195 196 sum_e3t_0_min_ik (ji,jj) = sum_e3t_0_min_ik (ji,jj) + e3t_0(ji ,jj,jk)*tmask(ji,jj,jk) 197 sum_e3t_0_min_ip1k(ji,jj) = sum_e3t_0_min_ip1k(ji,jj) + e3t_0(ji+1,jj,jk)*tmask(ji+1,jj,jk) 198 ENDDO 199 200 DO jk = 1, k_bot_j_min(ji,jj) 201 sum_e3t_0_min_jk (ji,jj) = sum_e3t_0_min_jk (ji,jj) + e3t_0(ji,jj ,jk)*tmask(ji,jj,jk) 202 sum_e3t_0_min_jp1k(ji,jj) = sum_e3t_0_min_jp1k(ji,jj) + e3t_0(ji,jj+1,jk)*tmask(ji,jj+1,jk) 203 ENDDO 204 ! 3) Then work out what fraction of the at rest water column that is, we later 205 ! multiply the now water depth by this scale to work out the bottom of the kth 206 ! level at time now in dynspg_ts 207 scaled_e3t_0_ik (ji,jj) = sum_e3t_0_min_ik (ji,jj)/( ht_0(ji ,jj ) + 1._wp - ssmask(ji,jj)) 208 scaled_e3t_0_jk (ji,jj) = sum_e3t_0_min_jk (ji,jj)/( ht_0(ji ,jj ) + 1._wp - ssmask(ji,jj)) 209 scaled_e3t_0_ip1k(ji,jj) = sum_e3t_0_min_ip1k(ji,jj)/( ht_0(ji+1,jj ) + 1._wp - ssmask(ji+1,jj)) 210 scaled_e3t_0_jp1k(ji,jj) = sum_e3t_0_min_jp1k(ji,jj)/( ht_0(ji ,jj+1) + 1._wp - ssmask(ji,jj+1)) 211 ENDDO 212 ENDDO 157 213 ! 158 214 ! !== time varying part of coordinate system ==! -
NEMO/branches/UKMO/NEMO_4.0.4_CO9_wadcpl/src/OCE/DOM/dtatsd.F90
r14075 r15784 179 179 ptsd(:,:,:,jp_sal) = sf_tsd(jp_sal)%fnow(:,:,:) 180 180 ! 181 IF( ln_sco ) THEN !== s- or mixed s-zps-coordinate ==! 182 ! 183 IF( kt == nit000 .AND. lwp )THEN 184 WRITE(numout,*) 185 WRITE(numout,*) 'dta_tsd: interpolates T & S data onto the s- or mixed s-z-coordinate mesh' 186 ENDIF 187 ! 188 DO jj = 1, jpj ! vertical interpolation of T & S 189 DO ji = 1, jpi 190 DO jk = 1, jpk ! determines the intepolated T-S profiles at each (i,j) points 191 zl = gdept_0(ji,jj,jk) 192 IF( zl < gdept_1d(1 ) ) THEN ! above the first level of data 193 ztp(jk) = ptsd(ji,jj,1 ,jp_tem) 194 zsp(jk) = ptsd(ji,jj,1 ,jp_sal) 195 ELSEIF( zl > gdept_1d(jpk) ) THEN ! below the last level of data 196 ztp(jk) = ptsd(ji,jj,jpkm1,jp_tem) 197 zsp(jk) = ptsd(ji,jj,jpkm1,jp_sal) 198 ELSE ! inbetween : vertical interpolation between jkk & jkk+1 199 DO jkk = 1, jpkm1 ! when gdept(jkk) < zl < gdept(jkk+1) 200 IF( (zl-gdept_1d(jkk)) * (zl-gdept_1d(jkk+1)) <= 0._wp ) THEN 201 zi = ( zl - gdept_1d(jkk) ) / (gdept_1d(jkk+1)-gdept_1d(jkk)) 202 ztp(jk) = ptsd(ji,jj,jkk,jp_tem) + ( ptsd(ji,jj,jkk+1,jp_tem) - ptsd(ji,jj,jkk,jp_tem) ) * zi 203 zsp(jk) = ptsd(ji,jj,jkk,jp_sal) + ( ptsd(ji,jj,jkk+1,jp_sal) - ptsd(ji,jj,jkk,jp_sal) ) * zi 204 ENDIF 205 END DO 206 ENDIF 207 END DO 208 DO jk = 1, jpkm1 209 ptsd(ji,jj,jk,jp_tem) = ztp(jk) * tmask(ji,jj,jk) ! mask required for mixed zps-s-coord 210 ptsd(ji,jj,jk,jp_sal) = zsp(jk) * tmask(ji,jj,jk) 211 END DO 212 ptsd(ji,jj,jpk,jp_tem) = 0._wp 213 ptsd(ji,jj,jpk,jp_sal) = 0._wp 214 END DO 215 END DO 216 ! 217 ELSE !== z- or zps- coordinate ==! 181 !CEOD, We think this is incorrect we dont want to do this. 218 182 ! 219 183 ptsd(:,:,:,jp_tem) = ptsd(:,:,:,jp_tem) * tmask(:,:,:) ! Mask … … 239 203 ENDIF 240 204 ! 241 ENDIF 205 !CEOD 242 206 ! 243 207 IF( .NOT.ln_tsd_dmp ) THEN !== deallocate T & S structure ==! -
NEMO/branches/UKMO/NEMO_4.0.4_CO9_wadcpl/src/OCE/DYN/dynspg_ts.F90
r14075 r15784 150 150 REAL(wp) :: r1_2dt_b, z1_hu, z1_hv ! local scalars 151 151 REAL(wp) :: za0, za1, za2, za3 ! - - 152 REAL(wp), DIMENSION(jpi,jpj) :: zdep_u, zdep_v 152 153 REAL(wp) :: zztmp, zldg ! - - 153 154 REAL(wp) :: zhu_bck, zhv_bck, zhdiv ! - - … … 459 460 DO jj = 1, jpj 460 461 DO ji = 1, jpim1 ! not jpi-column 461 zhup2_e(ji,jj) = hu_0(ji,jj) + r1_2 * r1_e1e2u(ji,jj) & 462 & * ( e1e2t(ji ,jj) * zsshp2_e(ji ,jj) & 463 & + e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj) ) * ssumask(ji,jj) 462 zhup2_e(ji,jj) = r1_2 * r1_e1e2u(ji,jj) * ( e1e2t(ji ,jj) * zhtp2_e(ji ,jj)*scaled_e3t_0_ik (ji,jj) & 463 & + e1e2t(ji+1,jj) * zhtp2_e(ji+1,jj)*scaled_e3t_0_ip1k(ji,jj) ) *ssumask(ji,jj) 464 464 END DO 465 465 END DO 466 466 DO jj = 1, jpjm1 ! not jpj-row 467 467 DO ji = 1, jpi 468 zhvp2_e(ji,jj) = hv_0(ji,jj) + r1_2 * r1_e1e2v(ji,jj) & 469 & * ( e1e2t(ji,jj ) * zsshp2_e(ji,jj ) & 470 & + e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1) ) * ssvmask(ji,jj) 468 zhvp2_e(ji,jj) = r1_2 * r1_e1e2v(ji,jj) * ( e1e2t(ji,jj ) * zhtp2_e(ji, jj)*scaled_e3t_0_jk (ji,jj) & 469 & + e1e2t(ji,jj+1) * zhtp2_e(ji,jj+1)*scaled_e3t_0_jp1k(ji,jj) ) *ssvmask(ji,jj) 471 470 END DO 472 471 END DO … … 647 646 ! ! hu_e, hv_e hold depth at jn, zhup2_e, zhvp2_e hold extrapolated depth at jn+1/2 648 647 ! ! backward interpolated depth used in spg terms at jn+1/2 649 zhu_bck = hu_0(ji,jj) + r1_2*r1_e1e2u(ji,jj) * ( e1e2t(ji ,jj) * zsshp2_e(ji ,jj) & 650 & + e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj) ) * ssumask(ji,jj) 651 zhv_bck = hv_0(ji,jj) + r1_2*r1_e1e2v(ji,jj) * ( e1e2t(ji,jj ) * zsshp2_e(ji,jj ) & 652 & + e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1) ) * ssvmask(ji,jj) 653 ! ! inverse depth at jn+1 654 z1_hu = ssumask(ji,jj) / ( hu_0(ji,jj) + zsshu_a(ji,jj) + 1._wp - ssumask(ji,jj) ) 655 z1_hv = ssvmask(ji,jj) / ( hv_0(ji,jj) + zsshv_a(ji,jj) + 1._wp - ssvmask(ji,jj) ) 656 ! 648 zhu_bck = r1_2 * r1_e1e2u(ji,jj) * ( e1e2t(ji ,jj)*(ht_0(ji ,jj) + zsshp2_e(ji ,jj))*scaled_e3t_0_ik (ji,jj) & 649 & + e1e2t(ji+1,jj)*(ht_0(ji+1,jj) + zsshp2_e(ji+1,jj))*scaled_e3t_0_ip1k(ji,jj) & 650 & ) * ssumask(ji,jj) 651 652 zhv_bck = r1_2 * r1_e1e2v(ji,jj) * ( e1e2t(ji,jj )*(ht_0(ji,jj ) + zsshp2_e(ji,jj ))*scaled_e3t_0_jk (ji,jj) & 653 & + e1e2t(ji,jj+1)*(ht_0(ji,jj+1) + zsshp2_e(ji,jj+1))*scaled_e3t_0_jp1k(ji,jj) & 654 & ) * ssvmask(ji,jj) 655 656 z1_hu = ssumask(ji,jj) / ( r1_2 * r1_e1e2u(ji,jj) *(e1e2t(ji ,jj)*(ht_0(ji,jj) + ssha_e(ji,jj) )*scaled_e3t_0_ik(ji ,jj) & 657 & +e1e2t(ji+1,jj)*(ht_0(ji+1,jj) + ssha_e(ji+1,jj))*scaled_e3t_0_ip1k(ji,jj)) + 1._wp - ssumask(ji,jj) ) 658 659 z1_hv = ssvmask(ji,jj) / ( r1_2 * r1_e1e2v(ji,jj)* ( e1e2t(ji,jj )*(ht_0(ji,jj) + ssha_e(ji,jj) )*scaled_e3t_0_jk(ji ,jj) & 660 & + e1e2t(ji,jj+1)* (ht_0(ji,jj+1) + ssha_e(ji,jj+1))*scaled_e3t_0_jp1k(ji,jj)) + 1._wp - ssvmask(ji,jj) ) 661 662 657 663 ua_e(ji,jj) = ( hu_e (ji,jj) * un_e (ji,jj) & 658 664 & + rdtbt * ( zhu_bck * zu_spg (ji,jj) & ! … … 678 684 679 685 IF( .NOT.ln_linssh ) THEN !* Update ocean depth (variable volume case only) 680 hu_e (2:jpim1,2:jpjm1) = hu_0(2:jpim1,2:jpjm1) + zsshu_a(2:jpim1,2:jpjm1) 686 DO jj = 1, jpjm1 687 DO ji = 1, jpim1 ! NO Vector Opt. 688 zdep_u(ji,jj) = r1_2 * r1_e1e2u(ji,jj) * ( e1e2t(ji,jj ) * (ssha_e(ji, jj)+ht_0(ji, jj))*scaled_e3t_0_ik (ji,jj) & 689 & + e1e2t(ji+1,jj) * (ssha_e(ji+1,jj)+ht_0(ji+1,jj))*scaled_e3t_0_ip1k(ji,jj) )*ssumask(ji,jj) 690 zdep_v(ji,jj) = r1_2 * r1_e1e2v(ji,jj) * ( e1e2t(ji,jj ) * (ssha_e(ji, jj)+ht_0(ji, jj))*scaled_e3t_0_jk (ji,jj ) & 691 & + e1e2t(ji,jj+1) * (ssha_e(ji,jj+1)+ht_0(ji,jj+1))*scaled_e3t_0_jp1k(ji,jj) )*ssvmask(ji,jj) 692 ENDDO 693 ENDDO 694 CALL lbc_lnk_multi( 'dynspg_ts', zdep_u, 'U', -1._wp ) 695 CALL lbc_lnk_multi( 'dynspg_ts', zdep_v, 'V', -1._wp ) 696 697 hu_e (2:jpim1,2:jpjm1) = zdep_u(2:jpim1,2:jpjm1) 681 698 hur_e(2:jpim1,2:jpjm1) = ssumask(2:jpim1,2:jpjm1) / ( hu_e(2:jpim1,2:jpjm1) + 1._wp - ssumask(2:jpim1,2:jpjm1) ) 682 hv_e (2:jpim1,2:jpjm1) = hv_0(2:jpim1,2:jpjm1) + zsshv_a(2:jpim1,2:jpjm1)699 hv_e (2:jpim1,2:jpjm1) = zdep_v(2:jpim1,2:jpjm1) 683 700 hvr_e(2:jpim1,2:jpjm1) = ssvmask(2:jpim1,2:jpjm1) / ( hv_e(2:jpim1,2:jpjm1) + 1._wp - ssvmask(2:jpim1,2:jpjm1) ) 684 701 CALL lbc_lnk_multi( 'dynspg_ts', ua_e , 'U', -1._wp, va_e , 'V', -1._wp & … … 778 795 & * ( e1e2t(ji,jj ) * ssha(ji,jj ) & 779 796 & + e1e2t(ji,jj+1) * ssha(ji,jj+1) ) 780 END DO 781 END DO 797 zdep_u(ji,jj) = r1_2 * r1_e1e2u(ji,jj) * ( e1e2t(ji,jj ) * (ssha(ji, jj)+ht_0(ji, jj))*scaled_e3t_0_ik(ji ,jj) & 798 & + e1e2t(ji+1,jj) * (ssha(ji+1,jj)+ht_0(ji+1,jj))*scaled_e3t_0_ip1k(ji,jj) ) 799 zdep_v(ji,jj) = r1_2 * r1_e1e2v(ji,jj) * ( e1e2t(ji,jj ) * (ssha(ji, jj)+ht_0(ji, jj))*scaled_e3t_0_jk(ji,jj ) & 800 & + e1e2t(ji,jj+1) * (ssha(ji,jj+1)+ht_0(ji,jj+1))*scaled_e3t_0_jp1k(ji,jj) ) 801 END DO 802 END DO 803 CALL lbc_lnk_multi( 'dynspg_ts', zdep_u, 'U', -1._wp ) 804 CALL lbc_lnk_multi( 'dynspg_ts', zdep_v, 'V', -1._wp ) 805 782 806 CALL lbc_lnk_multi( 'dynspg_ts', zsshu_a, 'U', 1._wp, zsshv_a, 'V', 1._wp ) ! Boundary conditions 783 807 ! … … 787 811 END DO 788 812 ! Save barotropic velocities not transport: 789 ua_b(:,:) = ua_b(:,:) / ( hu_0(:,:) + zsshu_a(:,:) + 1._wp - ssumask(:,:) )790 va_b(:,:) = va_b(:,:) / ( hv_0(:,:) + zsshv_a(:,:) + 1._wp - ssvmask(:,:) )813 ua_b(:,:) = ua_b(:,:) / ( zdep_u(:,:) + 1._wp - ssumask(:,:) ) 814 va_b(:,:) = va_b(:,:) / ( zdep_v(:,:) + 1._wp - ssvmask(:,:) ) 791 815 ENDIF 792 816 -
NEMO/branches/UKMO/NEMO_4.0.4_CO9_wadcpl/src/OCE/SBC/sbctide.F90
r14075 r15784 16 16 USE ioipsl ! NetCDF IPSL library 17 17 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 18 19 USE bdytides ! davbyr - Access to love number 18 20 19 21 IMPLICIT NONE … … 108 110 109 111 DO jk = 1, nb_harmo 110 zcons = 0.7_wp * Wave(ntide(jk))%equitide * ftide(jk) 112 ! davbyr - Insert variable Love number where once was 0.7 113 zcons = dn_love_number * Wave(ntide(jk))%equitide * ftide(jk) 114 ! END davbyr 111 115 DO ji = 1, jpi 112 116 DO jj = 1, jpj … … 119 123 IF ( Wave(ntide(jk))%nutide == 1 ) THEN ; zcs = zcons * SIN( 2._wp*zlat ) 120 124 ELSEIF( Wave(ntide(jk))%nutide == 2 ) THEN ; zcs = zcons * COS( zlat )**2 125 ! davbyr - Include long period tidal forcing 126 ELSEIF( Wave(ntide(jk))%nutide == 0 ) THEN ; zcs = zcons * (0.5_wp-1.5_wp*SIN(zlat)**2._wp) 127 ! END - davbyr 121 128 ELSE ; zcs = 0._wp 122 129 ENDIF -
NEMO/branches/UKMO/NEMO_4.0.4_CO9_wadcpl/src/OCE/SBC/tide.h90
r15783 r15784 2 2 !! History : 3.2 ! 2007 (O. Le Galloudec) Original code 3 3 !!---------------------------------------------------------------------- 4 4 !! TIDES ADDED ! 2017 (Nico Bruneau) 5 !! Following this document that seems to match implemented code 6 !! https://docs.lib.noaa.gov/rescue/cgs_specpubs/QB275U35no981924.pdf 7 !! see page 189 for some proposed values 8 !! 9 !! The convention which seems to have been chosen is the Shureman one and 10 !! not the Cartwright and Tayer (1971) 11 !! This is probably due to the fact the Schureman has a solar calendar 12 !! while Cartwright and Tayer is based on a lunar calendar 13 !! 14 !! Therefore the coefficient are not the Doodson number but the one 15 !! defined by Schureman. For example : 16 !! M2 : Doodson : 2 0 0 0 0 0 17 !! Schureman : 2 -2 2 0 0 0 18 !! 19 !! Components 1-34 are for FES 2014 20 !! Components >= 35 are the one that were initially present in NEMO and not in FES14 21 !! keep in mind than equitide coefficient have been ajusted for the 22 !! 34 FES 2014 constituents 23 !! 24 !! The different coefficient are as follows 25 !! - nt = T = Number of Julian centuries (36625 days) from Greenwich mean noon on December 31, 1899. 26 !! = Hour angle of mean sun 27 !! - ns = s = mean longitude of the moon 28 !! - nh = h = mean longitude of the sun 29 !! - np = p = mean longitude of the lunar perigee 30 !! - np1 = p1 = mean longitude of the solar perigee 31 !! - shift appears in table as a bias in degree 32 !! - nksi Coefficient for the longitude in moon's orbit of lunar intersection 33 !! - nu0 Coefficient for the right ascension of lunar intersection 34 !! - nu1 Coefficient for the term in argument of lunisolar constituent K1 35 !! - nu2 Coefficient for the term in argument of lunisolar constituent K2 36 !! - R = ??? 37 !! - Formula = Nodal factor function; see the table of Schureman. Implemented in tide_mod.F90 38 !! 39 !! The equitide parameter seems to be the equilibrium tide amplitude corrected 40 !! with the C_n^m coefficient: see Cartwright and Tayer (1971) equation 12 41 !! and Table 2 42 !! As an example in their Table 4c (p66), M2 (200000) has an amplitude of 43 !! around 0.63186 m 44 !! Table 2, give us a correction of m = 2, n = 2 (semi-diurnal) 45 !! 0.63186*3*sqrt( 5 / 96 / pi ) = 0.24407 46 !! very close to the one define originally here : 0.242297 47 !! Third order terms are neglected 48 !! 49 !! So to correct (to match what is implemented in sbctide.F90 - take care CT71 uses co-latitude): 50 !! - long wave : Amplitude from CT71 * [ -1 * sqrt( 5 / 4 / pi ) ] 51 !! - diurnal : Amplitude from CT71 * [ -3/2 * sqrt( 5 / 24 / pi ) ] 52 !! - semi-diur : Amplitude from CT71 * [ 3 * sqrt( 5 / 96 / pi ) ] 53 !! 54 !! ATTENTION: convention seems to be to have a positive coefficient and a 180 shift to 55 !! represent negative value. to be confirmed though. 56 !! 57 !! All equtide were computed using the last epocs from Cartwright and Tayer (1971) multiply by 58 !! the corresponding coefficient of their table 2 59 !! 60 !! nutide is used to compute tide potential - it uses a different formulation depending of nutide 61 !! see sbctide.F90 in function tide_init_potential 62 !! 63 !! Some random note 64 !! in cnes fes tool: 65 !! Msf has nksi = 2 and nnu0 = -2 which is reverse from Schureman (I kept the Schureman one) 66 !! 67 !!---------------------------------------------------------------------- 68 ! 5 69 ! !! name_tide , equitide , nutide , nt , ns , nh , np , np1 , shift , nksi , nnu0 , nnu1 , nnu2 , R , formula !! 6 70 ! !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !! 7 Wave( 1) = tide( 'M2' , 0.242297 , 2 , 2 , -2 , 2 , 0 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 78 )8 Wave( 2) = tide( 'N2' , 0.046313 , 2 , 2 , -3 , 2 , 1 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 78 )9 Wave( 3) = tide( '2N2' , 0.006184 , 2 , 2 , -4 , 2 , 2 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 78 )10 Wave( 4) = tide( 'S2' , 0.113572 , 2 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )11 Wave( 5) = tide( 'K2' , 0.030875 , 2 , 2 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , -2 , 0 , 235 )12 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !13 Wave( 6) = tide( 'K1' , 0.142408 , 1 , 1 , 0 , 1 , 0 , 0 , -90 , 0 , 0 , -1 , 0 , 0 , 227 )14 Wave( 7) = tide( 'O1' , 0.101266 , 1 , 1 , -2 , 1 , 0 , 0 , +90 , 2 , -1 , 0 , 0 , 0 , 75 )15 Wave( 8) = tide( 'Q1' , 0.019387 , 1 , 1 , -3 , 1 , 1 , 0 , +90 , 2 , -1 , 0 , 0 , 0 , 75 )16 Wave( 9) = tide( 'P1' , 0.047129 , 1 , 1 , 0 , -1 , 0 , 0 , +90 , 0 , 0 , 0 , 0 , 0 , 0 )17 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !18 Wave(10) = tide( 'M4' , 0.000000 , 4 , 4 , -4 , 4 , 0 , 0 , 0 , 4 , -4 , 0 , 0 , 0 , 1 )19 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !20 Wave(11) = tide( 'Mf' , 0.042017 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , -2 , 0 , 0 , 0 , 0 , 74 )21 Wave(12) = tide( 'Mm' , 0.022191 , 0 , 0 , 1 , 0 , -1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 73 )22 Wave(13) = tide( 'Msqm' , 0.000667 , 0 , 0 , 4 , -2 , 0 , 0 , 0 , -2 , 0 , 0 , 0 , 0 , 74 )23 Wave(14) = tide( 'Mtm' , 0.008049 , 0 , 0 , 3 , 0 , -1 , 0 , 0 , -2 , 0 , 0 , 0 , 0 , 74 )24 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !25 Wave(15) = tide( 'S1' , 0.000000 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )26 Wave(16) = tide( 'MU2' , 0.005841 , 2 , 2 , -4 , 4 , 0 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 78 )27 Wave(17) = tide( 'NU2' , 0.009094 , 2 , 2 , -3 , 4 , -1 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 78 )28 Wave(18) = tide( 'L2' , 0.006694 , 2 , 2 , -1 , 2 , -1 , 0 , +180 , 2 , -2 , 0 , 0 , 0 , 215 )29 Wave(19) = tide( 'T2' , 0.006614 , 2 , 2 , 0 , -1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 )30 71 ! 31 ! !! name_tide , equitide , nutide , nt , ns , nh , np , np1 , shift , nksi , nnu0 , nnu1 , nnu2 , R , formula !! 32 Wave(20) = tide( 'MNS2' , 0.000000 , 2 , 2 , -5 , 4 , 1 , 0 , 0 , 4 , -4 , 0 , 0 , 0 , 6 ) 33 Wave(21) = tide( 'Lam2' , 0.001760 , 2 , 2 , -1 , 0 , 1 , 0 , +180 , 2 , -2 , 0 , 0 , 0 , 78 ) 34 Wave(22) = tide( 'MSN2' , 0.000000 , 2 , 2 , 1 , 0 , 1 , 0 , 0 , 2 , -2 , 0 , 2 , 0 , 6 ) 35 Wave(23) = tide( '2SM2' , 0.000000 , 2 , 2 , 2 , -2 , 0 , 0 , 0 , -2 , 2 , 0 , 0 , 0 , 16 ) 36 Wave(24) = tide( 'MO3' , 0.000000 , 3 , 3 , -4 , 1 , 0 , 0 , +90 , 2 , -2 , 0 , 0 , 0 , 13 ) 37 Wave(25) = tide( 'MK3' , 0.000000 , 3 , 3 , -2 , 3 , 0 , 0 , -90 , 2 , -2 , -1 , 0 , 0 , 10 ) 38 Wave(26) = tide( 'MN4' , 0.000000 , 4 , 4 , -5 , 4 , 1 , 0 , 0 , 4 , -4 , 0 , 0 , 0 , 1 ) 39 Wave(27) = tide( 'MS4' , 0.000000 , 4 , 4 , -2 , 2 , 0 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 2 ) 40 Wave(28) = tide( 'M6' , 0.000000 , 6 , 6 , -6 , 6 , 0 , 0 , 0 , 6 , -6 , 0 , 0 , 0 , 4 ) 41 Wave(29) = tide( '2MS6' , 0.000000 , 6 , 6 , -4 , 4 , 0 , 0 , 0 , 4 , -4 , 0 , 0 , 0 , 6 ) 42 Wave(30) = tide( '2MK6' , 0.000000 , 6 , 6 , -4 , 6 , 0 , 0 , 0 , 4 , -4 , 0 , -2 , 0 , 5 ) 43 Wave(31) = tide( '3M2S2' , 0.000000 , 2 , 2 , -6 , 6 , 0 , 0 , 0 , 6 , -6 , 0 , 0 , 0 , 12 ) 72 ! Long Period Tides 73 Wave( 1) = tide( 'SA' , 0.003103 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) 74 Wave( 2) = tide( 'SSA' , 0.019523 , 0 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) 75 Wave( 3) = tide( 'MM' , 0.022191 , 0 , 0 , 1 , 0 , -1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 73 ) 76 Wave( 4) = tide( 'MF' , 0.042023 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , -2 , 0 , 0 , 0 , 0 , 74 ) 77 Wave( 5) = tide( 'MTM' , 0.008042 , 0 , 0 , 3 , 0 , -1 , 0 , 0 , -2 , 0 , 0 , 0 , 0 , 74 ) 78 Wave( 6) = tide( 'MSF' , 0.003671 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , -2 , 2 , 0 , 0 , 0 , 78 ) 79 Wave( 7) = tide( 'MSQM' , 0.001293 , 0 , 0 , 4 , -2 , 0 , 0 , 0 , -2 , 0 , 0 , 0 , 0 , 74 ) 80 ! 81 ! Diurnal Tides 82 Wave( 8) = tide( 'K1' , 0.142442 , 1 , 1 , 0 , 1 , 0 , 0 , -90 , 0 , 0 , -1 , 0 , 0 , 227 ) 83 Wave( 9) = tide( 'O1' , 0.101277 , 1 , 1 , -2 , 1 , 0 , 0 , +90 , 2 , -1 , 0 , 0 , 0 , 75 ) 84 Wave(10) = tide( 'Q1' , 0.019383 , 1 , 1 , -3 , 1 , 1 , 0 , +90 , 2 , -1 , 0 , 0 , 0 , 75 ) 85 Wave(11) = tide( 'P1' , 0.047145 , 1 , 1 , 0 , -1 , 0 , 0 , +90 , 0 , 0 , 0 , 0 , 0 , 0 ) 86 Wave(12) = tide( 'S1' ,-0.001116 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) 87 Wave(13) = tide( 'J1' ,-0.007961 , 1 , 1 , 1 , 1 , -1 , 0 , -90 , 0 , -1 , 0 , 0 , 0 , 76 ) 88 ! 89 ! Semi-Diurnal Tides 90 Wave(14) = tide( 'M2' , 0.244083 , 2 , 2 , -2 , 2 , 0 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 78 ) 91 Wave(15) = tide( 'N2' , 0.046720 , 2 , 2 , -3 , 2 , 1 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 78 ) 92 Wave(16) = tide( 'S2' , 0.113565 , 2 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) 93 Wave(17) = tide( 'K2' , 0.030875 , 2 , 2 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , -2 , 0 , 235 ) 94 Wave(18) = tide( 'L2' , 0.006903 , 2 , 2 , -1 , 2 , -1 , 0 , +180 , 2 , -2 , 0 , 0 , 0 , 215 ) 95 Wave(19) = tide( 'T2' , 0.006644 , 2 , 2 , 0 , -1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) 96 Wave(20) = tide( 'R2' , 0.000950 , 2 , 2 , 0 , 1 , 0 , -1 , +180 , 2 , 0 , 0 , 0 , 0 , 0 ) 97 ! 98 Wave(21) = tide( 'MU2' , 0.007451 , 2 , 2 , -4 , 4 , 0 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 78 ) 99 Wave(22) = tide( 'NU2' , 0.008873 , 2 , 2 , -3 , 4 , -1 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 78 ) 100 Wave(23) = tide( '2N2' , 0.006176 , 2 , 2 , -4 , 2 , 2 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 78 ) 101 Wave(24) = tide( 'MKS2' , 0.000000 , 2 , 2 , -2 , 4 , 0 , 0 , 0 , 2 , -2 , 0 , -2 , 0 , 4 ) 102 Wave(25) = tide( 'LA2' , 0.001800 , 2 , 2 , -1 , 0 , 1 , 0 , +180 , 2 , -2 , 0 , 0 , 0 , 78 ) 103 Wave(26) = tide( 'EPS2' , 0.001796 , 2 , 2 , -5 , 4 , 1 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 78 ) 104 ! 105 ! Harmonic and others 106 Wave(27) = tide( 'M3' , 0.000000 , 3 , 3 , -3 , 3 , 0 , 0 , 0 , 3 , -3 , 0 , 0 , 0 , 149 ) 107 Wave(28) = tide( 'M4' , 0.000000 , 4 , 4 , -4 , 4 , 0 , 0 , 0 , 4 , -4 , 0 , 0 , 0 , 1 ) 108 Wave(29) = tide( 'M6' , 0.000000 , 6 , 6 , -6 , 6 , 0 , 0 , 0 , 6 , -6 , 0 , 0 , 0 , 18 ) 109 Wave(30) = tide( 'M8' , 0.000000 , 8 , 8 , -8 , 8 , 0 , 0 , 0 , 8 , -8 , 0 , 0 , 0 , 20 ) 110 Wave(31) = tide( 'N4' , 0.000000 , 4 , 4 , -6 , 4 , 2 , 0 , 0 , 4 , -4 , 0 , 0 , 0 , 1 ) 111 Wave(32) = tide( 'S4' , 0.000000 , 4 , 4 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) 112 Wave(33) = tide( 'MN4' , 0.000000 , 4 , 4 , -5 , 4 , 1 , 0 , 0 , 4 , -4 , 0 , 0 , 0 , 1 ) 113 Wave(34) = tide( 'MS4' , 0.000000 , 4 , 4 , -2 , 2 , 0 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 78 ) 114 ! -
NEMO/branches/UKMO/NEMO_4.0.4_CO9_wadcpl/src/OCE/SBC/tide_mod.F90
r15783 r15784 16 16 PUBLIC tide_init_Wave ! called by tideini and diaharm modules 17 17 18 INTEGER, PUBLIC, PARAMETER :: jpmax_harmo = 31 !: maximum number of harmonic 18 ! davbyr: increase maximum number of harmonics from 19 to 34 19 INTEGER, PUBLIC, PARAMETER :: jpmax_harmo = 34 !: maximum number of harmonic 19 20 20 21 TYPE, PUBLIC :: tide … … 331 332 zf = zf * zf1 * zf1 332 333 ! 334 335 !--- davbyr 11/2017 336 CASE( 20 ) !== formule 20, compound waves ( 78 x 78 x 78 x 78 ) 337 zf1 = nodal_factort(78) 338 zf = zf1 * zf1 * zf1 * zf1 339 !--- END davbyr 333 340 CASE( 73 ) !== formule 73 334 341 zs = sin(sh_I) -
NEMO/branches/UKMO/NEMO_4.0.4_CO9_wadcpl/src/OCE/SBC/tideini.F90
r14075 r15784 34 34 REAL(wp), PUBLIC :: rdttideramp !: 35 35 REAL(wp), PUBLIC :: rn_scal_load !: 36 ! davbyr - read love number from namelist 37 REAL(wp), PUBLIC :: dn_love_number !: 38 ! END davbyr 36 39 CHARACTER(lc), PUBLIC :: cn_tide_load !: 37 40 … … 54 57 ! 55 58 NAMELIST/nam_tide/ln_tide, ln_tide_pot, ln_scal_load, ln_read_load, cn_tide_load, & 56 & ln_tide_ramp, rn_scal_load, rdttideramp, clname59 & ln_tide_ramp, rn_scal_load, rdttideramp, dn_love_number, clname 57 60 !!---------------------------------------------------------------------- 58 61 ! … … 80 83 WRITE(numout,*) ' Fraction of SSH used in scal. approx. rn_scal_load = ', rn_scal_load 81 84 WRITE(numout,*) ' Duration (days) of ramp rdttideramp = ', rdttideramp 85 ! davbyr - Love number (one line) 86 WRITE(numout,*) ' Love Number dn_love_number = ', dn_love_number 82 87 ENDIF 83 88 ELSE
Note: See TracChangeset
for help on using the changeset viewer.