Changeset 10691
- Timestamp:
- 2019-02-15T17:41:15+01:00 (6 years ago)
- Location:
- NEMO/trunk/src/OCE/ICB
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk/src/OCE/ICB/icb_oce.F90
r10425 r10691 89 89 REAL(wp), PUBLIC, DIMENSION(:,:), ALLOCATABLE :: ua_e, va_e 90 90 REAL(wp), PUBLIC, DIMENSION(:,:), ALLOCATABLE :: ssh_e 91 REAL(wp), PUBLIC, DIMENSION(:,:), ALLOCATABLE :: tmask_e, umask_e, vmask_e 91 92 #if defined key_si3 || defined key_cice 92 93 REAL(wp), PUBLIC, DIMENSION(:,:), ALLOCATABLE :: ui_e, vi_e … … 169 170 ! 170 171 ! expanded arrays for bilinear interpolation 171 ALLOCATE( uo_e(0:jpi+1,0:jpj+1) , ua_e(0:jpi+1,0:jpj+1) , &172 & vo_e(0:jpi+1,0:jpj+1) , va_e(0:jpi+1,0:jpj+1) , &172 ALLOCATE( uo_e(0:jpi+1,0:jpj+1) , ua_e(0:jpi+1,0:jpj+1) , & 173 & vo_e(0:jpi+1,0:jpj+1) , va_e(0:jpi+1,0:jpj+1) , & 173 174 #if defined key_si3 || defined key_cice 174 175 & ui_e(0:jpi+1,0:jpj+1) , & … … 183 184 icb_alloc = icb_alloc + ill 184 185 186 ALLOCATE( tmask_e(0:jpi+1,0:jpj+1), umask_e(0:jpi+1,0:jpj+1), vmask_e(0:jpi+1,0:jpj+1), & 187 & STAT=ill) 188 icb_alloc = icb_alloc + ill 189 185 190 ALLOCATE( nicbfldpts(jpi) , nicbflddest(jpi) , nicbfldproc(jpni) , & 186 191 & nicbfldnsend(jpni), nicbfldexpect(jpni) , nicbfldreq(jpni), STAT=ill) -
NEMO/trunk/src/OCE/ICB/icbini.F90
r10570 r10691 224 224 src_calving_hflx(:,:) = 0._wp 225 225 226 ! definition of extended surface masked needed by icb_bilin_h 227 tmask_e(:,:) = 0._wp ; tmask_e(1:jpi,1:jpj) = tmask(:,:,1) 228 umask_e(:,:) = 0._wp ; umask_e(1:jpi,1:jpj) = umask(:,:,1) 229 vmask_e(:,:) = 0._wp ; vmask_e(1:jpi,1:jpj) = vmask(:,:,1) 230 CALL lbc_lnk_icb( 'icbini', tmask_e, 'T', +1._wp, 1, 1 ) 231 CALL lbc_lnk_icb( 'icbini', umask_e, 'T', +1._wp, 1, 1 ) 232 CALL lbc_lnk_icb( 'icbini', vmask_e, 'T', +1._wp, 1, 1 ) 233 ! 226 234 ! assign each new iceberg with a unique number constructed from the processor number 227 235 ! and incremented by the total number of processors -
NEMO/trunk/src/OCE/ICB/icbutl.F90
r10570 r10691 131 131 !! is half the off shore value, wile the normal-to-the-coast value is zero. 132 132 !! This is OK as a starting point. 133 !! !!pm HARD CODED: - rho_air now computed in sbcblk (what are the effect ?) 134 !! - drag coefficient (should it be namelist parameter ?) 133 135 !! 134 136 !!---------------------------------------------------------------------- … … 142 144 !!---------------------------------------------------------------------- 143 145 144 pe1 = icb_utl_bilin_e( e1t, e1u, e1v, e1f, pi, pj ) ! scale factors146 pe1 = icb_utl_bilin_e( e1t, e1u, e1v, e1f, pi, pj ) ! scale factors 145 147 pe2 = icb_utl_bilin_e( e2t, e2u, e2v, e2f, pi, pj ) 146 148 ! 147 puo = icb_utl_bilin_h( uo_e, pi, pj, 'U' )! ocean velocities148 pvo = icb_utl_bilin_h( vo_e, pi, pj, 'V' )149 psst = icb_utl_bilin_h( tt_e, pi, pj, 'T' )! SST150 pcn = icb_utl_bilin_h( fr_e , pi, pj, 'T' )! ice concentration151 pff = icb_utl_bilin_h( ff_e , pi, pj, 'F' )! Coriolis parameter152 ! 153 pua = icb_utl_bilin_h( ua_e , pi, pj, 'U' )! 10m wind154 pva = icb_utl_bilin_h( va_e , pi, pj, 'V' )! here (ua,va) are stress => rough conversion from stress to speed155 zcd = 1.22_wp * 1.5e-3_wp ! air density * drag coefficient149 puo = icb_utl_bilin_h( uo_e, pi, pj, 'U', .false. ) ! ocean velocities 150 pvo = icb_utl_bilin_h( vo_e, pi, pj, 'V', .false. ) 151 psst = icb_utl_bilin_h( tt_e, pi, pj, 'T', .true. ) ! SST 152 pcn = icb_utl_bilin_h( fr_e, pi, pj, 'T', .true. ) ! ice concentration 153 pff = icb_utl_bilin_h( ff_e, pi, pj, 'F', .false. ) ! Coriolis parameter 154 ! 155 pua = icb_utl_bilin_h( ua_e, pi, pj, 'U', .true. ) ! 10m wind 156 pva = icb_utl_bilin_h( va_e, pi, pj, 'V', .true. ) ! here (ua,va) are stress => rough conversion from stress to speed 157 zcd = 1.22_wp * 1.5e-3_wp ! air density * drag coefficient 156 158 zmod = 1._wp / MAX( 1.e-20, SQRT( zcd * SQRT( pua*pua + pva*pva) ) ) 157 159 pua = pua * zmod ! note: stress module=0 necessarly implies ua=va=0 … … 159 161 160 162 #if defined key_si3 161 pui = icb_utl_bilin_h( ui_e , pi, pj, 'U' )! sea-ice velocities162 pvi = icb_utl_bilin_h( vi_e , pi, pj, 'V' )163 phi = icb_utl_bilin_h( hicth, pi, pj, 'T' )! ice thickness163 pui = icb_utl_bilin_h( ui_e , pi, pj, 'U', .false. ) ! sea-ice velocities 164 pvi = icb_utl_bilin_h( vi_e , pi, pj, 'V', .false. ) 165 phi = icb_utl_bilin_h( hicth, pi, pj, 'T', .true. ) ! ice thickness 164 166 #else 165 167 pui = 0._wp … … 169 171 170 172 ! Estimate SSH gradient in i- and j-direction (centred evaluation) 171 pssh_i = ( icb_utl_bilin_h( ssh_e, pi+0.1_wp, pj, 'T' ) - &172 & icb_utl_bilin_h( ssh_e, pi-0.1_wp, pj, 'T' ) ) / ( 0.2_wp * pe1 )173 pssh_j = ( icb_utl_bilin_h( ssh_e, pi, pj+0.1_wp, 'T' ) - &174 & icb_utl_bilin_h( ssh_e, pi, pj-0.1_wp, 'T' ) ) / ( 0.2_wp * pe2 )173 pssh_i = ( icb_utl_bilin_h( ssh_e, pi+0.1_wp, pj, 'T', .true. ) - & 174 & icb_utl_bilin_h( ssh_e, pi-0.1_wp, pj, 'T', .true. ) ) / ( 0.2_wp * pe1 ) 175 pssh_j = ( icb_utl_bilin_h( ssh_e, pi, pj+0.1_wp, 'T', .true. ) - & 176 & icb_utl_bilin_h( ssh_e, pi, pj-0.1_wp, 'T', .true. ) ) / ( 0.2_wp * pe2 ) 175 177 ! 176 178 END SUBROUTINE icb_utl_interp 177 179 178 180 179 REAL(wp) FUNCTION icb_utl_bilin_h( pfld, pi, pj, cd_type )181 REAL(wp) FUNCTION icb_utl_bilin_h( pfld, pi, pj, cd_type, plmask ) 180 182 !!---------------------------------------------------------------------- 181 183 !! *** FUNCTION icb_utl_bilin *** … … 191 193 REAL(wp) , INTENT(in) :: pi, pj ! targeted coordinates in (i,j) referential 192 194 CHARACTER(len=1) , INTENT(in) :: cd_type ! type of pfld array grid-points: = T , U , V or F points 195 LOGICAL , INTENT(in) :: plmask ! special treatment of mask point 193 196 ! 194 197 INTEGER :: ii, ij ! local integer 195 198 REAL(wp) :: zi, zj ! local real 199 REAL(wp) :: zw1, zw2, zw3, zw4 200 REAL(wp), DIMENSION(4) :: zmask 196 201 !!---------------------------------------------------------------------- 197 202 ! … … 224 229 ! find position in this processor. Prevent near edge problems (see #1389) 225 230 ! 226 IF ( ii < mig( 1 ) ) THEN ; ii = 1 227 ELSEIF( ii > mig(jpi) ) THEN ; ii = jpi 231 IF ( ii < mig( 1 ) ) THEN ; ii = 1 ; 232 ELSEIF( ii > mig(jpi) ) THEN ; ii = jpi ; 228 233 ELSE ; ii = mi1(ii) 229 234 ENDIF 230 IF ( ij < mjg( 1 ) ) THEN ; ij = 1 231 ELSEIF( ij > mjg(jpj) ) THEN ; ij = jpj 235 IF ( ij < mjg( 1 ) ) THEN ; ij = 1 ; 236 ELSEIF( ij > mjg(jpj) ) THEN ; ij = jpj ; 232 237 ELSE ; ij = mj1(ij) 233 238 ENDIF 234 239 ! 235 IF( ii == jpi ) ii = ii-1 236 IF( ij == jpj ) ij = ij-1 237 ! 238 icb_utl_bilin_h = ( pfld(ii,ij ) * (1.-zi) + pfld(ii+1,ij ) * zi ) * (1.-zj) & 239 & + ( pfld(ii,ij+1) * (1.-zi) + pfld(ii+1,ij+1) * zi ) * zj 240 IF( ii == jpi ) ii = ii-1 241 IF( ij == jpj ) ij = ij-1 242 ! 243 ! define mask array 244 IF (plmask) THEN 245 ! land value is not used in the interpolation 246 SELECT CASE ( cd_type ) 247 CASE ( 'T' ) 248 zmask = (/tmask_e(ii,ij), tmask_e(ii+1,ij), tmask_e(ii,ij+1), tmask_e(ii+1,ij+1)/) 249 CASE ( 'U' ) 250 zmask = (/umask_e(ii,ij), umask_e(ii+1,ij), umask_e(ii,ij+1), umask_e(ii+1,ij+1)/) 251 CASE ( 'V' ) 252 zmask = (/vmask_e(ii,ij), vmask_e(ii+1,ij), vmask_e(ii,ij+1), vmask_e(ii+1,ij+1)/) 253 CASE ( 'F' ) 254 ! F case only used for coriolis, ff_f is not mask so zmask = 1 255 zmask = 1. 256 END SELECT 257 ELSE 258 ! land value is used during interpolation 259 zmask = 1. 260 END iF 261 ! 262 ! compute weight 263 zw1 = zmask(1) * (1._wp-zi) * (1._wp-zj) 264 zw2 = zmask(2) * zi * (1._wp-zj) 265 zw3 = zmask(3) * (1._wp-zi) * zj 266 zw4 = zmask(4) * zi * zj 267 ! 268 ! compute interpolated value 269 icb_utl_bilin_h = ( pfld(ii,ij)*zw1 + pfld(ii+1,ij)*zw2 + pfld(ii,ij+1)*zw3 + pfld(ii+1,ij+1)*zw4 ) / MAX(1.e-20, zw1+zw2+zw3+zw4) 240 270 ! 241 271 END FUNCTION icb_utl_bilin_h
Note: See TracChangeset
for help on using the changeset viewer.