- Timestamp:
- 2017-11-24T17:56:51+01:00 (6 years ago)
- Location:
- branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90
r8586 r8813 51 51 52 52 #if defined key_lim3 53 LOGICAL :: ll_bdylim3 ! determine whether ice input is 1cat (F) or Xcat (T) type54 INTEGER :: jfld_hti, jfld_hts, jfld_ai! indices of ice thickness, snow thickness and concentration in bf structure53 INTEGER :: nice_cat ! number of categories in the input file 54 INTEGER :: jfld_hti, jfld_hts, jfld_ai ! indices of ice thickness, snow thickness and concentration in bf structure 55 55 #endif 56 56 57 57 !!---------------------------------------------------------------------- 58 !! NEMO/OPA 3.3 , NEMO Consortium (2010)58 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 59 59 !! $Id$ 60 60 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 80 80 ! ! etc. 81 81 ! 82 INTEGER :: ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd, jl ! local indices 82 INTEGER :: jbdy, jfld, jstart, jend, ib, jl ! dummy loop indices 83 INTEGER :: ii, ij, ik, igrd ! local integers 83 84 INTEGER, DIMENSION(jpbgrd) :: ilen1 84 85 INTEGER, POINTER, DIMENSION(:) :: nblen, nblenrim ! short cuts … … 95 96 !----------------------------- 96 97 97 DO ib_bdy = 1, nb_bdy98 DO jbdy = 1, nb_bdy 98 99 ! 99 nblen => idx_bdy(ib_bdy)%nblen100 nblenrim => idx_bdy( ib_bdy)%nblenrim101 dta => dta_bdy(ib_bdy)102 103 IF( nn_dyn2d_dta( ib_bdy) == 0 ) THEN100 nblen => idx_bdy(jbdy)%nblen 101 nblenrim => idx_bdy(jbdy)%nblenrim 102 dta => dta_bdy(jbdy) 103 ! 104 IF( nn_dyn2d_dta(jbdy) == 0 ) THEN 104 105 ilen1(:) = nblen(:) 105 106 IF( dta%ll_ssh ) THEN 106 107 igrd = 1 107 108 DO ib = 1, ilen1(igrd) 108 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)109 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)110 dta_bdy( ib_bdy)%ssh(ib) = sshn(ii,ij) * tmask(ii,ij,1)109 ii = idx_bdy(jbdy)%nbi(ib,igrd) 110 ij = idx_bdy(jbdy)%nbj(ib,igrd) 111 dta_bdy(jbdy)%ssh(ib) = sshn(ii,ij) * tmask(ii,ij,1) 111 112 END DO 112 END 113 ENDIF 113 114 IF( dta%ll_u2d ) THEN 114 115 igrd = 2 115 116 DO ib = 1, ilen1(igrd) 116 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)117 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)118 dta_bdy( ib_bdy)%u2d(ib) = un_b(ii,ij) * umask(ii,ij,1)117 ii = idx_bdy(jbdy)%nbi(ib,igrd) 118 ij = idx_bdy(jbdy)%nbj(ib,igrd) 119 dta_bdy(jbdy)%u2d(ib) = un_b(ii,ij) * umask(ii,ij,1) 119 120 END DO 120 END 121 ENDIF 121 122 IF( dta%ll_v2d ) THEN 122 123 igrd = 3 123 124 DO ib = 1, ilen1(igrd) 124 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)125 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)126 dta_bdy( ib_bdy)%v2d(ib) = vn_b(ii,ij) * vmask(ii,ij,1)125 ii = idx_bdy(jbdy)%nbi(ib,igrd) 126 ij = idx_bdy(jbdy)%nbj(ib,igrd) 127 dta_bdy(jbdy)%v2d(ib) = vn_b(ii,ij) * vmask(ii,ij,1) 127 128 END DO 128 END 129 ENDIF 130 131 IF( nn_dyn3d_dta( ib_bdy) == 0 ) THEN129 ENDIF 130 ENDIF 131 ! 132 IF( nn_dyn3d_dta(jbdy) == 0 ) THEN 132 133 ilen1(:) = nblen(:) 133 134 IF( dta%ll_u3d ) THEN … … 135 136 DO ib = 1, ilen1(igrd) 136 137 DO ik = 1, jpkm1 137 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)138 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)139 dta_bdy( ib_bdy)%u3d(ib,ik) = ( un(ii,ij,ik) - un_b(ii,ij) ) * umask(ii,ij,ik)138 ii = idx_bdy(jbdy)%nbi(ib,igrd) 139 ij = idx_bdy(jbdy)%nbj(ib,igrd) 140 dta_bdy(jbdy)%u3d(ib,ik) = ( un(ii,ij,ik) - un_b(ii,ij) ) * umask(ii,ij,ik) 140 141 END DO 141 142 END DO 142 END 143 ENDIF 143 144 IF( dta%ll_v3d ) THEN 144 145 igrd = 3 145 146 DO ib = 1, ilen1(igrd) 146 147 DO ik = 1, jpkm1 147 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)148 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)149 dta_bdy( ib_bdy)%v3d(ib,ik) = ( vn(ii,ij,ik) - vn_b(ii,ij) ) * vmask(ii,ij,ik)148 ii = idx_bdy(jbdy)%nbi(ib,igrd) 149 ij = idx_bdy(jbdy)%nbj(ib,igrd) 150 dta_bdy(jbdy)%v3d(ib,ik) = ( vn(ii,ij,ik) - vn_b(ii,ij) ) * vmask(ii,ij,ik) 150 151 END DO 151 152 END DO 152 END 153 ENDIF 154 155 IF( nn_tra_dta( ib_bdy) == 0 ) THEN153 ENDIF 154 ENDIF 155 156 IF( nn_tra_dta(jbdy) == 0 ) THEN 156 157 ilen1(:) = nblen(:) 157 158 IF( dta%ll_tem ) THEN … … 159 160 DO ib = 1, ilen1(igrd) 160 161 DO ik = 1, jpkm1 161 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)162 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)163 dta_bdy( ib_bdy)%tem(ib,ik) = tsn(ii,ij,ik,jp_tem) * tmask(ii,ij,ik)162 ii = idx_bdy(jbdy)%nbi(ib,igrd) 163 ij = idx_bdy(jbdy)%nbj(ib,igrd) 164 dta_bdy(jbdy)%tem(ib,ik) = tsn(ii,ij,ik,jp_tem) * tmask(ii,ij,ik) 164 165 END DO 165 166 END DO 166 END 167 ENDIF 167 168 IF( dta%ll_sal ) THEN 168 169 igrd = 1 169 170 DO ib = 1, ilen1(igrd) 170 171 DO ik = 1, jpkm1 171 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)172 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)173 dta_bdy( ib_bdy)%sal(ib,ik) = tsn(ii,ij,ik,jp_sal) * tmask(ii,ij,ik)172 ii = idx_bdy(jbdy)%nbi(ib,igrd) 173 ij = idx_bdy(jbdy)%nbj(ib,igrd) 174 dta_bdy(jbdy)%sal(ib,ik) = tsn(ii,ij,ik,jp_sal) * tmask(ii,ij,ik) 174 175 END DO 175 176 END DO 176 END 177 ENDIF 178 179 #if defined key_lim3 180 IF( nn_ice_lim_dta( ib_bdy) == 0 ) THEN177 ENDIF 178 ENDIF 179 180 #if defined key_lim3 181 IF( nn_ice_lim_dta(jbdy) == 0 ) THEN ! set ice to initial values 181 182 ilen1(:) = nblen(:) 182 183 IF( dta%ll_a_i ) THEN … … 184 185 DO jl = 1, jpl 185 186 DO ib = 1, ilen1(igrd) 186 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)187 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)188 dta_bdy( ib_bdy)%a_i (ib,jl) = a_i(ii,ij,jl) * tmask(ii,ij,1)187 ii = idx_bdy(jbdy)%nbi(ib,igrd) 188 ij = idx_bdy(jbdy)%nbj(ib,igrd) 189 dta_bdy(jbdy)%a_i (ib,jl) = a_i(ii,ij,jl) * tmask(ii,ij,1) 189 190 END DO 190 191 END DO … … 194 195 DO jl = 1, jpl 195 196 DO ib = 1, ilen1(igrd) 196 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)197 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)198 dta_bdy( ib_bdy)%h_i (ib,jl) = h_i(ii,ij,jl) * tmask(ii,ij,1)197 ii = idx_bdy(jbdy)%nbi(ib,igrd) 198 ij = idx_bdy(jbdy)%nbj(ib,igrd) 199 dta_bdy(jbdy)%h_i (ib,jl) = h_i(ii,ij,jl) * tmask(ii,ij,1) 199 200 END DO 200 201 END DO … … 204 205 DO jl = 1, jpl 205 206 DO ib = 1, ilen1(igrd) 206 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)207 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)208 dta_bdy( ib_bdy)%h_s (ib,jl) = h_s(ii,ij,jl) * tmask(ii,ij,1)207 ii = idx_bdy(jbdy)%nbi(ib,igrd) 208 ij = idx_bdy(jbdy)%nbj(ib,igrd) 209 dta_bdy(jbdy)%h_s (ib,jl) = h_s(ii,ij,jl) * tmask(ii,ij,1) 209 210 END DO 210 211 END DO … … 212 213 ENDIF 213 214 #endif 214 END DO ! ib_bdy215 END DO ! jbdy 215 216 ! 216 217 ENDIF ! kt == nit000 … … 220 221 221 222 jstart = 1 222 DO ib_bdy = 1, nb_bdy223 dta => dta_bdy( ib_bdy)224 IF( nn_dta( ib_bdy) == 1 ) THEN ! skip this bit if no external data required223 DO jbdy = 1, nb_bdy 224 dta => dta_bdy(jbdy) 225 IF( nn_dta(jbdy) == 1 ) THEN ! skip this bit if no external data required 225 226 226 227 IF( PRESENT(jit) ) THEN 227 228 ! Update barotropic boundary conditions only 228 229 ! jit is optional argument for fld_read and bdytide_update 229 IF( cn_dyn2d( ib_bdy) /= 'none' ) THEN230 IF( nn_dyn2d_dta( ib_bdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays230 IF( cn_dyn2d(jbdy) /= 'none' ) THEN 231 IF( nn_dyn2d_dta(jbdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 231 232 IF( dta%ll_ssh ) dta%ssh(:) = 0._wp 232 233 IF( dta%ll_u2d ) dta%u2d(:) = 0._wp 233 234 IF( dta%ll_u3d ) dta%v2d(:) = 0._wp 234 235 ENDIF 235 IF (cn_tra( ib_bdy) /= 'runoff') THEN236 IF( nn_dyn2d_dta( ib_bdy) == 1 .OR. nn_dyn2d_dta(ib_bdy) == 3 ) THEN236 IF (cn_tra(jbdy) /= 'runoff') THEN 237 IF( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 ) THEN 237 238 238 239 jend = jstart + dta%nread(2) - 1 239 IF( ln_full_vel_array( ib_bdy) ) THEN240 IF( ln_full_vel_array(jbdy) ) THEN 240 241 CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend), & 241 & kit=jit, kt_offset=time_offset , jpk_bdy=nb_jpk_bdy, fvl=ln_full_vel_array( ib_bdy) )242 & kit=jit, kt_offset=time_offset , jpk_bdy=nb_jpk_bdy, fvl=ln_full_vel_array(jbdy) ) 242 243 ELSE 243 244 CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend), & … … 246 247 247 248 ! If full velocities in boundary data then extract barotropic velocities from 3D fields 248 IF( ln_full_vel_array( ib_bdy) .AND. &249 & ( nn_dyn2d_dta( ib_bdy) == 1 .OR. nn_dyn2d_dta(ib_bdy) == 3 .OR. &250 & nn_dyn3d_dta( ib_bdy) == 1 ) )THEN249 IF( ln_full_vel_array(jbdy) .AND. & 250 & ( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 .OR. & 251 & nn_dyn3d_dta(jbdy) == 1 ) )THEN 251 252 252 253 igrd = 2 ! zonal velocity 253 254 dta%u2d(:) = 0._wp 254 DO ib = 1, idx_bdy( ib_bdy)%nblen(igrd)255 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)256 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)255 DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 256 ii = idx_bdy(jbdy)%nbi(ib,igrd) 257 ij = idx_bdy(jbdy)%nbj(ib,igrd) 257 258 DO ik = 1, jpkm1 258 259 dta%u2d(ib) = dta%u2d(ib) & … … 263 264 igrd = 3 ! meridional velocity 264 265 dta%v2d(:) = 0._wp 265 DO ib = 1, idx_bdy( ib_bdy)%nblen(igrd)266 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)267 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)266 DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 267 ii = idx_bdy(jbdy)%nbi(ib,igrd) 268 ij = idx_bdy(jbdy)%nbj(ib,igrd) 268 269 DO ik = 1, jpkm1 269 270 dta%v2d(ib) = dta%v2d(ib) & … … 274 275 ENDIF 275 276 ENDIF 276 IF( nn_dyn2d_dta( ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing277 CALL bdytide_update( kt=kt, idx=idx_bdy( ib_bdy), dta=dta, td=tides(ib_bdy), &277 IF( nn_dyn2d_dta(jbdy) .ge. 2 ) THEN ! update tidal harmonic forcing 278 CALL bdytide_update( kt=kt, idx=idx_bdy(jbdy), dta=dta, td=tides(jbdy), & 278 279 & jit=jit, time_offset=time_offset ) 279 280 ENDIF … … 281 282 ENDIF 282 283 ELSE 283 IF (cn_tra( ib_bdy) == 'runoff') then ! runoff condition284 jend = nb_bdy_fld( ib_bdy)284 IF (cn_tra(jbdy) == 'runoff') then ! runoff condition 285 jend = nb_bdy_fld(jbdy) 285 286 CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), & 286 287 & map=nbmap_ptr(jstart:jend), kt_offset=time_offset ) 287 288 ! 288 289 igrd = 2 ! zonal velocity 289 DO ib = 1, idx_bdy( ib_bdy)%nblen(igrd)290 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)291 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)290 DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 291 ii = idx_bdy(jbdy)%nbi(ib,igrd) 292 ij = idx_bdy(jbdy)%nbj(ib,igrd) 292 293 dta%u2d(ib) = dta%u2d(ib) / ( e2u(ii,ij) * hu_0(ii,ij) ) 293 294 END DO 294 295 ! 295 296 igrd = 3 ! meridional velocity 296 DO ib = 1, idx_bdy( ib_bdy)%nblen(igrd)297 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)298 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)297 DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 298 ii = idx_bdy(jbdy)%nbi(ib,igrd) 299 ij = idx_bdy(jbdy)%nbj(ib,igrd) 299 300 dta%v2d(ib) = dta%v2d(ib) / ( e1v(ii,ij) * hv_0(ii,ij) ) 300 301 END DO 301 302 ELSE 302 IF( nn_dyn2d_dta( ib_bdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays303 IF( nn_dyn2d_dta(jbdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 303 304 IF( dta%ll_ssh ) dta%ssh(:) = 0._wp 304 305 IF( dta%ll_u2d ) dta%u2d(:) = 0._wp … … 308 309 jend = jstart + dta%nread(1) - 1 309 310 CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), & 310 & map=nbmap_ptr(jstart:jend), kt_offset=time_offset, jpk_bdy=nb_jpk_bdy, fvl=ln_full_vel_array( ib_bdy) )311 & map=nbmap_ptr(jstart:jend), kt_offset=time_offset, jpk_bdy=nb_jpk_bdy, fvl=ln_full_vel_array(jbdy) ) 311 312 ENDIF 312 313 ! If full velocities in boundary data then split into barotropic and baroclinic data 313 IF( ln_full_vel_array( ib_bdy) .and. &314 & ( nn_dyn2d_dta( ib_bdy) == 1 .OR. nn_dyn2d_dta(ib_bdy) == 3 .OR. &315 & nn_dyn3d_dta( ib_bdy) == 1 ) ) THEN314 IF( ln_full_vel_array(jbdy) .and. & 315 & ( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 .OR. & 316 & nn_dyn3d_dta(jbdy) == 1 ) ) THEN 316 317 igrd = 2 ! zonal velocity 317 318 dta%u2d(:) = 0._wp 318 DO ib = 1, idx_bdy( ib_bdy)%nblen(igrd)319 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)320 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)319 DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 320 ii = idx_bdy(jbdy)%nbi(ib,igrd) 321 ij = idx_bdy(jbdy)%nbj(ib,igrd) 321 322 DO ik = 1, jpkm1 322 323 dta%u2d(ib) = dta%u2d(ib) & … … 330 331 igrd = 3 ! meridional velocity 331 332 dta%v2d(:) = 0._wp 332 DO ib = 1, idx_bdy( ib_bdy)%nblen(igrd)333 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)334 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)333 DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 334 ii = idx_bdy(jbdy)%nbi(ib,igrd) 335 ij = idx_bdy(jbdy)%nbj(ib,igrd) 335 336 DO ik = 1, jpkm1 336 337 dta%v2d(ib) = dta%v2d(ib) & … … 346 347 ENDIF 347 348 #if defined key_lim3 348 IF( .NOT. ll_bdylim3 .AND. cn_ice_lim(ib_bdy) /= 'none' .AND. nn_ice_lim_dta(ib_bdy) == 1 ) THEN ! bdy ice input (case input is 1cat) 349 CALL ice_var_itd ( bf(jfld_hti)%fnow(:,1,1), bf(jfld_hts)%fnow(:,1,1), bf(jfld_ai)%fnow(:,1,1), & 350 & dta_bdy(ib_bdy)%h_i, dta_bdy(ib_bdy)%h_s, dta_bdy(ib_bdy)%a_i ) 349 IF( cn_ice_lim(jbdy) /= 'none' .AND. nn_ice_lim_dta(jbdy) == 1 ) THEN 350 IF( nice_cat == 1 ) THEN ! case input cat = 1 351 CALL ice_var_itd ( bf(jfld_hti)%fnow(:,1,1), bf(jfld_hts)%fnow(:,1,1), bf(jfld_ai)%fnow(:,1,1), & 352 & dta_bdy(jbdy)%h_i , dta_bdy(jbdy)%h_s , dta_bdy(jbdy)%a_i ) 353 ELSEIF( nice_cat /= 1 .AND. nice_cat /= jpl ) THEN ! case input cat /=1 and /=jpl 354 CALL ice_var_itd2( bf(jfld_hti)%fnow(:,1,:), bf(jfld_hts)%fnow(:,1,:), bf(jfld_ai)%fnow(:,1,:), & 355 & dta_bdy(jbdy)%h_i , dta_bdy(jbdy)%h_s , dta_bdy(jbdy)%a_i ) 356 ENDIF 351 357 ENDIF 352 358 #endif 353 359 ENDIF 354 360 jstart = jstart + dta%nread(1) 355 END IF ! nn_dta(ib_bdy) = 1356 END DO ! ib_bdy361 ENDIF ! nn_dta(jbdy) = 1 362 END DO ! jbdy 357 363 358 364 IF ( ln_tide ) THEN 359 365 IF (ln_dynspg_ts) THEN ! Fill temporary arrays with slow-varying bdy data 360 DO ib_bdy = 1, nb_bdy ! Tidal component added in ts loop361 IF ( nn_dyn2d_dta( ib_bdy) .ge. 2 ) THEN362 nblen => idx_bdy( ib_bdy)%nblen363 nblenrim => idx_bdy( ib_bdy)%nblenrim364 IF( cn_dyn2d( ib_bdy) == 'frs' ) THEN; ilen1(:)=nblen(:) ; ELSE ; ilen1(:)=nblenrim(:) ; ENDIF365 IF ( dta_bdy( ib_bdy)%ll_ssh ) dta_bdy_s(ib_bdy)%ssh(1:ilen1(1)) = dta_bdy(ib_bdy)%ssh(1:ilen1(1))366 IF ( dta_bdy( ib_bdy)%ll_u2d ) dta_bdy_s(ib_bdy)%u2d(1:ilen1(2)) = dta_bdy(ib_bdy)%u2d(1:ilen1(2))367 IF ( dta_bdy( ib_bdy)%ll_v2d ) dta_bdy_s(ib_bdy)%v2d(1:ilen1(3)) = dta_bdy(ib_bdy)%v2d(1:ilen1(3))366 DO jbdy = 1, nb_bdy ! Tidal component added in ts loop 367 IF ( nn_dyn2d_dta(jbdy) .ge. 2 ) THEN 368 nblen => idx_bdy(jbdy)%nblen 369 nblenrim => idx_bdy(jbdy)%nblenrim 370 IF( cn_dyn2d(jbdy) == 'frs' ) THEN; ilen1(:)=nblen(:) ; ELSE ; ilen1(:)=nblenrim(:) ; ENDIF 371 IF ( dta_bdy(jbdy)%ll_ssh ) dta_bdy_s(jbdy)%ssh(1:ilen1(1)) = dta_bdy(jbdy)%ssh(1:ilen1(1)) 372 IF ( dta_bdy(jbdy)%ll_u2d ) dta_bdy_s(jbdy)%u2d(1:ilen1(2)) = dta_bdy(jbdy)%u2d(1:ilen1(2)) 373 IF ( dta_bdy(jbdy)%ll_v2d ) dta_bdy_s(jbdy)%v2d(1:ilen1(3)) = dta_bdy(jbdy)%v2d(1:ilen1(3)) 368 374 ENDIF 369 375 END DO … … 375 381 376 382 IF ( ln_apr_obc ) THEN 377 DO ib_bdy = 1, nb_bdy378 IF (cn_tra( ib_bdy) /= 'runoff')THEN383 DO jbdy = 1, nb_bdy 384 IF (cn_tra(jbdy) /= 'runoff')THEN 379 385 igrd = 1 ! meridional velocity 380 DO ib = 1, idx_bdy( ib_bdy)%nblenrim(igrd)381 ii = idx_bdy( ib_bdy)%nbi(ib,igrd)382 ij = idx_bdy( ib_bdy)%nbj(ib,igrd)383 dta_bdy( ib_bdy)%ssh(ib) = dta_bdy(ib_bdy)%ssh(ib) + ssh_ib(ii,ij)386 DO ib = 1, idx_bdy(jbdy)%nblenrim(igrd) 387 ii = idx_bdy(jbdy)%nbi(ib,igrd) 388 ij = idx_bdy(jbdy)%nbj(ib,igrd) 389 dta_bdy(jbdy)%ssh(ib) = dta_bdy(jbdy)%ssh(ib) + ssh_ib(ii,ij) 384 390 END DO 385 391 ENDIF … … 402 408 !! 403 409 !!---------------------------------------------------------------------- 404 INTEGER :: ib_bdy, jfld, jstart, jend, ierror, ios ! Local integers410 INTEGER :: jbdy, jfld, jstart, jend, ierror, ios ! Local integers 405 411 ! 406 412 CHARACTER(len=100) :: cn_dir ! Root directory for location of data files … … 408 414 CHARACTER(len = 256):: clname ! temporary file name 409 415 LOGICAL :: ln_full_vel ! =T => full velocities in 3D boundary data 410 416 ! ! =F => baroclinic velocities in 3D boundary data 411 417 INTEGER :: ilen_global ! Max length required for global bdy dta arrays 412 418 INTEGER, ALLOCATABLE, DIMENSION(:) :: ilen1, ilen3 ! size of 1st and 3rd dimensions of local arrays … … 416 422 TYPE(OBC_DATA), POINTER :: dta ! short cut 417 423 #if defined key_lim3 418 INTEGER :: zndims ! number of dimensions in an array (i.e. 3 = wo ice cat; 4 = w ice cat) 424 INTEGER :: kndims ! number of dimensions in an array (i.e. 3 = wo ice cat; 4 = w ice cat) 425 INTEGER, DIMENSION(4) :: kdimsz ! size of dimensions 419 426 INTEGER :: inum,id1 ! local integer 420 427 #endif … … 440 447 441 448 ! Set nn_dta 442 DO ib_bdy = 1, nb_bdy443 nn_dta( ib_bdy) = MAX( nn_dyn2d_dta(ib_bdy)&444 ,nn_dyn3d_dta(ib_bdy)&445 ,nn_tra_dta(ib_bdy)&446 #if defined key_lim3 447 ,nn_ice_lim_dta(ib_bdy) &449 DO jbdy = 1, nb_bdy 450 nn_dta(jbdy) = MAX( nn_dyn2d_dta (jbdy) & 451 & , nn_dyn3d_dta (jbdy) & 452 & , nn_tra_dta (jbdy) & 453 #if defined key_lim3 454 & , nn_ice_lim_dta(jbdy) & 448 455 #endif 449 456 ) 450 IF(nn_dta( ib_bdy) > 1) nn_dta(ib_bdy) = 1457 IF(nn_dta(jbdy) > 1) nn_dta(jbdy) = 1 451 458 END DO 452 459 … … 455 462 ALLOCATE( nb_bdy_fld(nb_bdy) ) 456 463 nb_bdy_fld(:) = 0 457 DO ib_bdy = 1, nb_bdy458 IF( cn_dyn2d( ib_bdy) /= 'none' .and. ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) ) THEN459 nb_bdy_fld( ib_bdy) = nb_bdy_fld(ib_bdy) + 3460 ENDIF 461 IF( cn_dyn3d( ib_bdy) /= 'none' .and. nn_dyn3d_dta(ib_bdy) == 1 ) THEN462 nb_bdy_fld( ib_bdy) = nb_bdy_fld(ib_bdy) + 2463 ENDIF 464 IF( cn_tra( ib_bdy) /= 'none' .and. nn_tra_dta(ib_bdy) == 1 ) THEN465 nb_bdy_fld( ib_bdy) = nb_bdy_fld(ib_bdy) + 2466 ENDIF 467 #if defined key_lim3 468 IF( cn_ice_lim( ib_bdy) /= 'none' .and. nn_ice_lim_dta(ib_bdy) == 1 ) THEN469 nb_bdy_fld( ib_bdy) = nb_bdy_fld(ib_bdy) + 3464 DO jbdy = 1, nb_bdy 465 IF( cn_dyn2d(jbdy) /= 'none' .AND. ( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) ) THEN 466 nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 3 467 ENDIF 468 IF( cn_dyn3d(jbdy) /= 'none' .AND. nn_dyn3d_dta(jbdy) == 1 ) THEN 469 nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 2 470 ENDIF 471 IF( cn_tra(jbdy) /= 'none' .AND. nn_tra_dta(jbdy) == 1 ) THEN 472 nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 2 473 ENDIF 474 #if defined key_lim3 475 IF( cn_ice_lim(jbdy) /= 'none' .AND. nn_ice_lim_dta(jbdy) == 1 ) THEN 476 nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 3 470 477 ENDIF 471 478 #endif 472 IF(lwp) WRITE(numout,*) 'Maximum number of files to open =', nb_bdy_fld(ib_bdy)479 IF(lwp) WRITE(numout,*) 'Maximum number of files to open =', nb_bdy_fld(jbdy) 473 480 END DO 474 481 … … 496 503 REWIND(numnam_cfg) 497 504 jfld = 0 498 DO ib_bdy = 1, nb_bdy499 IF( nn_dta( ib_bdy) == 1 ) THEN505 DO jbdy = 1, nb_bdy 506 IF( nn_dta(jbdy) == 1 ) THEN 500 507 READ ( numnam_ref, nambdy_dta, IOSTAT = ios, ERR = 901) 501 508 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy_dta in reference namelist', lwp ) … … 505 512 IF(lwm) WRITE( numond, nambdy_dta ) 506 513 507 cn_dir_array( ib_bdy) = cn_dir508 ln_full_vel_array( ib_bdy) = ln_full_vel509 510 nblen => idx_bdy( ib_bdy)%nblen511 nblenrim => idx_bdy( ib_bdy)%nblenrim512 dta => dta_bdy( ib_bdy)514 cn_dir_array(jbdy) = cn_dir 515 ln_full_vel_array(jbdy) = ln_full_vel 516 517 nblen => idx_bdy(jbdy)%nblen 518 nblenrim => idx_bdy(jbdy)%nblenrim 519 dta => dta_bdy(jbdy) 513 520 dta%nread(2) = 0 514 521 515 522 ! Only read in necessary fields for this set. 516 523 ! Important that barotropic variables come first. 517 IF( nn_dyn2d_dta( ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) THEN524 IF( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) THEN 518 525 519 526 IF( dta%ll_ssh ) THEN … … 521 528 jfld = jfld + 1 522 529 blf_i(jfld) = bn_ssh 523 ibdy(jfld) = ib_bdy530 ibdy(jfld) = jbdy 524 531 igrid(jfld) = 1 525 532 ilen1(jfld) = nblen(igrid(jfld)) … … 528 535 ENDIF 529 536 530 IF( dta%ll_u2d .and. .not. ln_full_vel_array( ib_bdy) ) THEN537 IF( dta%ll_u2d .and. .not. ln_full_vel_array(jbdy) ) THEN 531 538 if(lwp) write(numout,*) '++++++ reading in u2d field' 532 539 jfld = jfld + 1 533 540 blf_i(jfld) = bn_u2d 534 ibdy(jfld) = ib_bdy541 ibdy(jfld) = jbdy 535 542 igrid(jfld) = 2 536 543 ilen1(jfld) = nblen(igrid(jfld)) … … 539 546 ENDIF 540 547 541 IF( dta%ll_v2d .and. .not. ln_full_vel_array( ib_bdy) ) THEN548 IF( dta%ll_v2d .and. .not. ln_full_vel_array(jbdy) ) THEN 542 549 if(lwp) write(numout,*) '++++++ reading in v2d field' 543 550 jfld = jfld + 1 544 551 blf_i(jfld) = bn_v2d 545 ibdy(jfld) = ib_bdy552 ibdy(jfld) = jbdy 546 553 igrid(jfld) = 3 547 554 ilen1(jfld) = nblen(igrid(jfld)) … … 554 561 ! read 3D velocities if baroclinic velocities require OR if 555 562 ! barotropic velocities required and ln_full_vel set to .true. 556 IF( nn_dyn3d_dta( ib_bdy) == 1 .OR. &557 & ( ln_full_vel_array( ib_bdy) .AND. ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) ) ) THEN558 559 IF( dta%ll_u3d .OR. ( ln_full_vel_array( ib_bdy) .and. dta%ll_u2d ) ) THEN563 IF( nn_dyn3d_dta(jbdy) == 1 .OR. & 564 & ( ln_full_vel_array(jbdy) .AND. ( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 ) ) ) THEN 565 566 IF( dta%ll_u3d .OR. ( ln_full_vel_array(jbdy) .and. dta%ll_u2d ) ) THEN 560 567 if(lwp) write(numout,*) '++++++ reading in u3d field' 561 568 jfld = jfld + 1 562 569 blf_i(jfld) = bn_u3d 563 ibdy(jfld) = ib_bdy570 ibdy(jfld) = jbdy 564 571 igrid(jfld) = 2 565 572 ilen1(jfld) = nblen(igrid(jfld)) 566 573 ilen3(jfld) = jpk 567 IF( ln_full_vel_array( ib_bdy) .and. dta%ll_u2d ) dta%nread(2) = dta%nread(2) + 1568 ENDIF 569 570 IF( dta%ll_v3d .OR. ( ln_full_vel_array( ib_bdy) .and. dta%ll_v2d ) ) THEN574 IF( ln_full_vel_array(jbdy) .and. dta%ll_u2d ) dta%nread(2) = dta%nread(2) + 1 575 ENDIF 576 577 IF( dta%ll_v3d .OR. ( ln_full_vel_array(jbdy) .and. dta%ll_v2d ) ) THEN 571 578 if(lwp) write(numout,*) '++++++ reading in v3d field' 572 579 jfld = jfld + 1 573 580 blf_i(jfld) = bn_v3d 574 ibdy(jfld) = ib_bdy581 ibdy(jfld) = jbdy 575 582 igrid(jfld) = 3 576 583 ilen1(jfld) = nblen(igrid(jfld)) 577 584 ilen3(jfld) = jpk 578 IF( ln_full_vel_array( ib_bdy) .and. dta%ll_v2d ) dta%nread(2) = dta%nread(2) + 1585 IF( ln_full_vel_array(jbdy) .and. dta%ll_v2d ) dta%nread(2) = dta%nread(2) + 1 579 586 ENDIF 580 587 … … 582 589 583 590 ! temperature and salinity 584 IF( nn_tra_dta( ib_bdy) == 1 ) THEN591 IF( nn_tra_dta(jbdy) == 1 ) THEN 585 592 586 593 IF( dta%ll_tem ) THEN … … 588 595 jfld = jfld + 1 589 596 blf_i(jfld) = bn_tem 590 ibdy(jfld) = ib_bdy597 ibdy(jfld) = jbdy 591 598 igrid(jfld) = 1 592 599 ilen1(jfld) = nblen(igrid(jfld)) … … 598 605 jfld = jfld + 1 599 606 blf_i(jfld) = bn_sal 600 ibdy(jfld) = ib_bdy607 ibdy(jfld) = jbdy 601 608 igrid(jfld) = 1 602 609 ilen1(jfld) = nblen(igrid(jfld)) … … 608 615 #if defined key_lim3 609 616 ! sea ice 610 IF( nn_ice_lim_dta( ib_bdy) == 1 ) THEN617 IF( nn_ice_lim_dta(jbdy) == 1 ) THEN 611 618 ! Test for types of ice input (1cat or Xcat) 612 619 ! Build file name to find dimensions … … 622 629 ! 623 630 CALL iom_open ( clname, inum ) 624 id1 = iom_varid( inum, bn_a_i%clvar, k ndims=zndims, ldstop = .FALSE. )631 id1 = iom_varid( inum, bn_a_i%clvar, kdimsz=kdimsz, kndims=kndims, ldstop = .FALSE. ) 625 632 CALL iom_close ( inum ) 626 633 627 IF ( zndims == 4 ) THEN628 ll_bdylim3 = .TRUE.! Xcat input634 IF ( kndims == 4 ) THEN 635 nice_cat = kdimsz(4) ! Xcat input 629 636 ELSE 630 ll_bdylim3 = .FALSE.! 1cat input637 nice_cat = 1 ! 1cat input 631 638 ENDIF 632 639 ! End test … … 635 642 jfld = jfld + 1 636 643 blf_i(jfld) = bn_a_i 637 ibdy(jfld) = ib_bdy644 ibdy(jfld) = jbdy 638 645 igrid(jfld) = 1 639 646 ilen1(jfld) = nblen(igrid(jfld)) 640 IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF647 ilen3(jfld) = nice_cat 641 648 ENDIF 642 649 … … 644 651 jfld = jfld + 1 645 652 blf_i(jfld) = bn_h_i 646 ibdy(jfld) = ib_bdy653 ibdy(jfld) = jbdy 647 654 igrid(jfld) = 1 648 655 ilen1(jfld) = nblen(igrid(jfld)) 649 IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF656 ilen3(jfld) = nice_cat 650 657 ENDIF 651 658 652 659 IF( dta%ll_h_s ) THEN 653 660 jfld = jfld + 1 654 655 ibdy(jfld) = ib_bdy661 blf_i(jfld) = bn_h_s 662 ibdy(jfld) = jbdy 656 663 igrid(jfld) = 1 657 664 ilen1(jfld) = nblen(igrid(jfld)) 658 IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF665 ilen3(jfld) = nice_cat 659 666 ENDIF 660 667 … … 663 670 ! Recalculate field counts 664 671 !------------------------- 665 IF( ib_bdy == 1 ) THEN672 IF( jbdy == 1 ) THEN 666 673 nb_bdy_fld_sum = 0 667 nb_bdy_fld( ib_bdy) = jfld674 nb_bdy_fld(jbdy) = jfld 668 675 nb_bdy_fld_sum = jfld 669 676 ELSE 670 nb_bdy_fld( ib_bdy) = jfld - nb_bdy_fld_sum671 nb_bdy_fld_sum = nb_bdy_fld_sum + nb_bdy_fld( ib_bdy)672 ENDIF 673 674 dta%nread(1) = nb_bdy_fld( ib_bdy)677 nb_bdy_fld(jbdy) = jfld - nb_bdy_fld_sum 678 nb_bdy_fld_sum = nb_bdy_fld_sum + nb_bdy_fld(jbdy) 679 ENDIF 680 681 dta%nread(1) = nb_bdy_fld(jbdy) 675 682 676 683 ENDIF ! nn_dta == 1 677 ENDDO ! ib_bdy684 ENDDO ! jbdy 678 685 679 686 DO jfld = 1, nb_bdy_fld_sum … … 687 694 !------------------------------------- 688 695 jstart = 1 689 DO ib_bdy = 1, nb_bdy690 jend = jstart - 1 + nb_bdy_fld( ib_bdy)691 CALL fld_fill( bf(jstart:jend), blf_i(jstart:jend), cn_dir_array( ib_bdy), 'bdy_dta', &696 DO jbdy = 1, nb_bdy 697 jend = jstart - 1 + nb_bdy_fld(jbdy) 698 CALL fld_fill( bf(jstart:jend), blf_i(jstart:jend), cn_dir_array(jbdy), 'bdy_dta', & 692 699 & 'open boundary conditions', 'nambdy_dta' ) 693 700 jstart = jend + 1 … … 700 707 701 708 jfld = 0 702 DO ib_bdy=1, nb_bdy703 704 nblen => idx_bdy( ib_bdy)%nblen705 dta => dta_bdy( ib_bdy)709 DO jbdy=1, nb_bdy 710 711 nblen => idx_bdy(jbdy)%nblen 712 dta => dta_bdy(jbdy) 706 713 707 714 if(lwp) then … … 715 722 endif 716 723 717 IF ( nn_dyn2d_dta( ib_bdy) == 0 .or. nn_dyn2d_dta(ib_bdy) == 2 ) THEN724 IF ( nn_dyn2d_dta(jbdy) == 0 .or. nn_dyn2d_dta(jbdy) == 2 ) THEN 718 725 if(lwp) write(numout,*) '++++++ dta%ssh/u2d/u3d allocated space' 719 726 IF( dta%ll_ssh ) ALLOCATE( dta%ssh(nblen(1)) ) … … 721 728 IF( dta%ll_v2d ) ALLOCATE( dta%v2d(nblen(3)) ) 722 729 ENDIF 723 IF ( nn_dyn2d_dta( ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) THEN730 IF ( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) THEN 724 731 IF( dta%ll_ssh ) THEN 725 732 if(lwp) write(numout,*) '++++++ dta%ssh pointing to fnow' … … 728 735 ENDIF 729 736 IF ( dta%ll_u2d ) THEN 730 IF ( ln_full_vel_array( ib_bdy) ) THEN737 IF ( ln_full_vel_array(jbdy) ) THEN 731 738 if(lwp) write(numout,*) '++++++ dta%u2d allocated space' 732 739 ALLOCATE( dta%u2d(nblen(2)) ) … … 738 745 ENDIF 739 746 IF ( dta%ll_v2d ) THEN 740 IF ( ln_full_vel_array( ib_bdy) ) THEN747 IF ( ln_full_vel_array(jbdy) ) THEN 741 748 if(lwp) write(numout,*) '++++++ dta%v2d allocated space' 742 749 ALLOCATE( dta%v2d(nblen(3)) ) … … 749 756 ENDIF 750 757 751 IF ( nn_dyn3d_dta( ib_bdy) == 0 ) THEN758 IF ( nn_dyn3d_dta(jbdy) == 0 ) THEN 752 759 if(lwp) write(numout,*) '++++++ dta%u3d/v3d allocated space' 753 IF( dta%ll_u3d ) ALLOCATE( dta_bdy( ib_bdy)%u3d(nblen(2),jpk) )754 IF( dta%ll_v3d ) ALLOCATE( dta_bdy( ib_bdy)%v3d(nblen(3),jpk) )755 ENDIF 756 IF ( nn_dyn3d_dta( ib_bdy) == 1 .or. &757 & ( ln_full_vel_array( ib_bdy) .and. ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) ) ) THEN758 IF ( dta%ll_u3d .or. ( ln_full_vel_array( ib_bdy) .and. dta%ll_u2d ) ) THEN760 IF( dta%ll_u3d ) ALLOCATE( dta_bdy(jbdy)%u3d(nblen(2),jpk) ) 761 IF( dta%ll_v3d ) ALLOCATE( dta_bdy(jbdy)%v3d(nblen(3),jpk) ) 762 ENDIF 763 IF ( nn_dyn3d_dta(jbdy) == 1 .or. & 764 & ( ln_full_vel_array(jbdy) .and. ( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) ) ) THEN 765 IF ( dta%ll_u3d .or. ( ln_full_vel_array(jbdy) .and. dta%ll_u2d ) ) THEN 759 766 if(lwp) write(numout,*) '++++++ dta%u3d pointing to fnow' 760 767 jfld = jfld + 1 761 dta_bdy( ib_bdy)%u3d => bf(jfld)%fnow(:,1,:)762 ENDIF 763 IF ( dta%ll_v3d .or. ( ln_full_vel_array( ib_bdy) .and. dta%ll_v2d ) ) THEN768 dta_bdy(jbdy)%u3d => bf(jfld)%fnow(:,1,:) 769 ENDIF 770 IF ( dta%ll_v3d .or. ( ln_full_vel_array(jbdy) .and. dta%ll_v2d ) ) THEN 764 771 if(lwp) write(numout,*) '++++++ dta%v3d pointing to fnow' 765 772 jfld = jfld + 1 766 dta_bdy( ib_bdy)%v3d => bf(jfld)%fnow(:,1,:)767 ENDIF 768 ENDIF 769 770 IF( nn_tra_dta( ib_bdy) == 0 ) THEN773 dta_bdy(jbdy)%v3d => bf(jfld)%fnow(:,1,:) 774 ENDIF 775 ENDIF 776 777 IF( nn_tra_dta(jbdy) == 0 ) THEN 771 778 if(lwp) write(numout,*) '++++++ dta%tem/sal allocated space' 772 IF( dta%ll_tem ) ALLOCATE( dta_bdy( ib_bdy)%tem(nblen(1),jpk) )773 IF( dta%ll_sal ) ALLOCATE( dta_bdy( ib_bdy)%sal(nblen(1),jpk) )779 IF( dta%ll_tem ) ALLOCATE( dta_bdy(jbdy)%tem(nblen(1),jpk) ) 780 IF( dta%ll_sal ) ALLOCATE( dta_bdy(jbdy)%sal(nblen(1),jpk) ) 774 781 ELSE 775 782 IF( dta%ll_tem ) THEN 776 783 if(lwp) write(numout,*) '++++++ dta%tem pointing to fnow' 777 784 jfld = jfld + 1 778 dta_bdy( ib_bdy)%tem => bf(jfld)%fnow(:,1,:)785 dta_bdy(jbdy)%tem => bf(jfld)%fnow(:,1,:) 779 786 ENDIF 780 787 IF( dta%ll_sal ) THEN 781 788 if(lwp) write(numout,*) '++++++ dta%sal pointing to fnow' 782 789 jfld = jfld + 1 783 dta_bdy( ib_bdy)%sal => bf(jfld)%fnow(:,1,:)784 ENDIF 785 ENDIF 786 787 #if defined key_lim3 788 IF (cn_ice_lim( ib_bdy) /= 'none') THEN789 IF( nn_ice_lim_dta( ib_bdy) == 0 ) THEN790 ALLOCATE( dta_bdy( ib_bdy)%a_i(nblen(1),jpl) )791 ALLOCATE( dta_bdy( ib_bdy)%h_i(nblen(1),jpl) )792 ALLOCATE( dta_bdy( ib_bdy)%h_s(nblen(1),jpl) )790 dta_bdy(jbdy)%sal => bf(jfld)%fnow(:,1,:) 791 ENDIF 792 ENDIF 793 794 #if defined key_lim3 795 IF (cn_ice_lim(jbdy) /= 'none') THEN 796 IF( nn_ice_lim_dta(jbdy) == 0 ) THEN 797 ALLOCATE( dta_bdy(jbdy)%a_i(nblen(1),jpl) ) 798 ALLOCATE( dta_bdy(jbdy)%h_i(nblen(1),jpl) ) 799 ALLOCATE( dta_bdy(jbdy)%h_s(nblen(1),jpl) ) 793 800 ELSE 794 IF ( ll_bdylim3 ) THEN ! case input is Xcat795 jfld = jfld + 1 796 dta_bdy( ib_bdy)%a_i => bf(jfld)%fnow(:,1,:)797 jfld = jfld + 1 798 dta_bdy( ib_bdy)%h_i => bf(jfld)%fnow(:,1,:)799 jfld = jfld + 1 800 dta_bdy( ib_bdy)%h_s => bf(jfld)%fnow(:,1,:)801 ELSE ! case input is 1cat801 IF ( nice_cat == jpl ) THEN ! case input cat = jpl 802 jfld = jfld + 1 803 dta_bdy(jbdy)%a_i => bf(jfld)%fnow(:,1,:) 804 jfld = jfld + 1 805 dta_bdy(jbdy)%h_i => bf(jfld)%fnow(:,1,:) 806 jfld = jfld + 1 807 dta_bdy(jbdy)%h_s => bf(jfld)%fnow(:,1,:) 808 ELSE ! case input cat = 1 OR (/=1 and /=jpl) 802 809 jfld_ai = jfld + 1 803 810 jfld_hti = jfld + 2 804 811 jfld_hts = jfld + 3 805 812 jfld = jfld + 3 806 ALLOCATE( dta_bdy( ib_bdy)%a_i(nblen(1),jpl) )807 ALLOCATE( dta_bdy( ib_bdy)%h_i(nblen(1),jpl) )808 ALLOCATE( dta_bdy( ib_bdy)%h_s(nblen(1),jpl) )809 dta_bdy( ib_bdy)%a_i(:,:) = 0._wp810 dta_bdy( ib_bdy)%h_i(:,:) = 0._wp811 dta_bdy( ib_bdy)%h_s(:,:) = 0._wp813 ALLOCATE( dta_bdy(jbdy)%a_i(nblen(1),jpl) ) 814 ALLOCATE( dta_bdy(jbdy)%h_i(nblen(1),jpl) ) 815 ALLOCATE( dta_bdy(jbdy)%h_s(nblen(1),jpl) ) 816 dta_bdy(jbdy)%a_i(:,:) = 0._wp 817 dta_bdy(jbdy)%h_i(:,:) = 0._wp 818 dta_bdy(jbdy)%h_s(:,:) = 0._wp 812 819 ENDIF 813 820 … … 816 823 #endif 817 824 ! 818 END DO ! ib_bdy825 END DO ! jbdy 819 826 ! 820 827 IF( nn_timing == 1 ) CALL timing_stop('bdy_dta_init') -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_ice.F90
r8586 r8813 48 48 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: alb_ice !: ice albedo [-] 49 49 50 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qml_ice !: heat available for snow / ice surface melting [W/m2] 51 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qcn_ice !: heat conduction flux in the layer below surface [W/m2] 52 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: qsr_ice_tr !: solar flux transmitted below the ice surface [W/m2] 53 50 54 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: utau_ice !: atmos-ice u-stress. VP: I-pt ; EVP: U,V-pts [N/m2] 51 55 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: vtau_ice !: atmos-ice v-stress. VP: I-pt ; EVP: U,V-pts [N/m2] 52 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fr1_i0 !: Solar surface transmission parameter, thick ice [-]53 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fr2_i0 !: Solar surface transmission parameter, thin ice [-]54 56 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: emp_ice !: sublimation - precip over sea ice [kg/m2/s] 55 57 … … 123 125 ALLOCATE( qns_ice (jpi,jpj,jpl) , qsr_ice (jpi,jpj,jpl) , & 124 126 & qla_ice (jpi,jpj,jpl) , dqla_ice(jpi,jpj,jpl) , & 125 & dqns_ice(jpi,jpj,jpl) , tn_ice (jpi,jpj,jpl) , alb_ice (jpi,jpj,jpl) , & 127 & dqns_ice(jpi,jpj,jpl) , tn_ice (jpi,jpj,jpl) , alb_ice (jpi,jpj,jpl) , & 128 & qml_ice(jpi,jpj,jpl) , qcn_ice(jpi,jpj,jpl) , qsr_ice_tr(jpi,jpj,jpl), & 126 129 & utau_ice(jpi,jpj) , vtau_ice(jpi,jpj) , wndm_ice(jpi,jpj) , & 127 & fr1_i0 (jpi,jpj) , fr2_i0 (jpi,jpj) , &128 130 & evap_ice(jpi,jpj,jpl) , devap_ice(jpi,jpj,jpl) , qprec_ice(jpi,jpj) , & 129 131 & qemp_ice(jpi,jpj) , qevap_ice(jpi,jpj,jpl) , qemp_oce (jpi,jpj) , & … … 139 141 a_i(jpi,jpj,ncat) , topmelt(jpi,jpj,ncat) , botmelt(jpi,jpj,ncat) , & 140 142 STAT= ierr(2) ) 141 IF( ln_cpl ) ALLOCATE( u_ice(jpi,jpj) , fr1_i0(jpi,jpj) ,tn_ice (jpi,jpj,1) , &142 & v_ice(jpi,jpj) , fr2_i0(jpi,jpj) ,alb_ice(jpi,jpj,1) , &143 IF( ln_cpl ) ALLOCATE( u_ice(jpi,jpj) , tn_ice (jpi,jpj,1) , & 144 & v_ice(jpi,jpj) , alb_ice(jpi,jpj,1) , & 143 145 & emp_ice(jpi,jpj) , qns_ice(jpi,jpj,1) , dqns_ice(jpi,jpj,1) , & 144 146 & STAT= ierr(3) ) … … 161 163 PRIVATE 162 164 163 PUBLIC sbc_ice_alloc165 PUBLIC sbc_ice_alloc ! 164 166 165 167 LOGICAL , PUBLIC, PARAMETER :: lk_lim3 = .FALSE. !: no LIM-3 ice model … … 168 170 REAL(wp) , PUBLIC, PARAMETER :: cldf_ice = 0.81 !: cloud fraction over sea ice, summer CLIO value [-] 169 171 INTEGER , PUBLIC, PARAMETER :: jpl = 1 170 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: u_ice, v_ice ,fr1_i0,fr2_i0! jpi, jpj172 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: u_ice, v_ice ! jpi, jpj 171 173 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: tn_ice, alb_ice, qns_ice, dqns_ice ! (jpi,jpj,jpl) 172 174 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: a_i … … 176 178 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: topmelt, botmelt 177 179 ! 178 !! arrays relat ing to embedding ice in the ocean. These arrays need to be declared179 !! even if no ice model is required. In the no ice model or traditional levitating180 !! ice cases they contain only zeros180 !! arrays related to embedding ice in the ocean. 181 !! These arrays need to be declared even if no ice model is required. 182 !! In the no ice model or traditional levitating ice cases they contain only zeros 181 183 !! --------------------- 182 184 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: snwice_mass !: mass of snow and ice at current ice time step [Kg/m2] -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk.F90
r8637 r8813 15 15 !! 3.7 ! 2014-06 (L. Brodeau) simplification and optimization of CORE bulk 16 16 !! 4.0 ! 2016-06 (L. Brodeau) sbcblk_core becomes sbcblk and is not restricted to the CORE algorithm anymore 17 !! 17 !! ! ==> based on AeroBulk (http://aerobulk.sourceforge.net/) 18 18 !! 4.0 ! 2016-10 (G. Madec) introduce a sbc_blk_init routine 19 !! 4.0 ! 2016-10 (M. Vancoppenolle) Introduce Jules emulator (M. Vancoppenolle) 19 20 !!---------------------------------------------------------------------- 20 21 … … 23 24 !! sbc_blk : bulk formulation as ocean surface boundary condition 24 25 !! blk_oce : computes momentum, heat and freshwater fluxes over ocean 25 !! blk_ice : computes momentum, heat and freshwater fluxes over sea ice26 26 !! rho_air : density of (moist) air (depends on T_air, q_air and SLP 27 27 !! cp_air : specific heat of (moist) air (depends spec. hum. q_air) 28 28 !! q_sat : saturation humidity as a function of SLP and temperature 29 29 !! L_vap : latent heat of vaporization of water as a function of temperature 30 !! sea-ice case only : 31 !! blk_ice_tau : provide the air-ice stress 32 !! blk_ice_flx : provide the heat and mass fluxes at air-ice interface 33 !! blk_ice_qcn : provide ice surface temperature and snow/ice conduction flux (emulating JULES coupler) 34 !! Cdn10_Lupkes2012 : Lupkes et al. (2012) air-ice drag 35 !! Cdn10_Lupkes2015 : Lupkes et al. (2015) air-ice drag 30 36 !!---------------------------------------------------------------------- 31 37 USE oce ! ocean dynamics and tracers … … 42 48 USE ice , ONLY : u_ice, v_ice, jpl, a_i_b, at_i_b, tm_su 43 49 USE icethd_dh ! for CALL ice_thd_snwblow 50 USE icethd_zdf,ONLY: rn_cnd_s ! for blk_ice_qcn 44 51 #endif 45 52 USE sbcblk_algo_ncar ! => turb_ncar : NCAR - CORE (Large & Yeager, 2009) … … 63 70 PUBLIC blk_ice_tau ! routine called in icestp module 64 71 PUBLIC blk_ice_flx ! routine called in icestp module 65 #endif 72 PUBLIC blk_ice_qcn ! routine called in icestp module 73 #endif 66 74 67 75 !!Lolo: should ultimately be moved in the module with all physical constants ? … … 111 119 LOGICAL :: ln_Cd_L15 = .FALSE. ! Modify the drag ice-atm depending on ice concentration (from Lupkes et al. JGR2015) 112 120 ! 113 !!cr REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: Cd_oce ! air-ocean drag (clem)114 121 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: Cd_atm ! transfer coefficient for momentum (tau) 115 122 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: Ch_atm ! transfer coefficient for sensible heat (Q_sens) … … 139 146 !! *** ROUTINE sbc_blk_alloc *** 140 147 !!------------------------------------------------------------------- 141 !!cr ALLOCATE( Cd_oce(jpi,jpj) , STAT=sbc_blk_alloc )142 148 ALLOCATE( Cd_atm (jpi,jpj), Ch_atm (jpi,jpj), Ce_atm (jpi,jpj), t_zu(jpi,jpj), q_zu(jpi,jpj), & 143 149 & cdn_oce(jpi,jpj), chn_oce(jpi,jpj), cen_oce(jpi,jpj), STAT=sbc_blk_alloc ) … … 147 153 END FUNCTION sbc_blk_alloc 148 154 155 149 156 SUBROUTINE sbc_blk_init 150 157 !!--------------------------------------------------------------------- … … 154 161 !! 155 162 !! ** Method : 156 !!157 !! C A U T I O N : never mask the surface stress fields158 !! the stress is assumed to be in the (i,j) mesh referential159 !!160 !! ** Action :161 163 !! 162 164 !!---------------------------------------------------------------------- … … 285 287 !! 286 288 !! ** Purpose : provide at each time step the surface ocean fluxes 287 !! (momentum, heat, freshwater and runoff)289 !! (momentum, heat, freshwater and runoff) 288 290 !! 289 291 !! ** Method : (1) READ each fluxes in NetCDF files: … … 566 568 END SUBROUTINE blk_oce 567 569 570 571 572 FUNCTION rho_air( ptak, pqa, pslp ) 573 !!------------------------------------------------------------------------------- 574 !! *** FUNCTION rho_air *** 575 !! 576 !! ** Purpose : compute density of (moist) air using the eq. of state of the atmosphere 577 !! 578 !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 579 !!------------------------------------------------------------------------------- 580 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptak ! air temperature [K] 581 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa ! air specific humidity [kg/kg] 582 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pslp ! pressure in [Pa] 583 REAL(wp), DIMENSION(jpi,jpj) :: rho_air ! density of moist air [kg/m^3] 584 !!------------------------------------------------------------------------------- 585 ! 586 rho_air = pslp / ( R_dry*ptak * ( 1._wp + rctv0*pqa ) ) 587 ! 588 END FUNCTION rho_air 589 590 591 FUNCTION cp_air( pqa ) 592 !!------------------------------------------------------------------------------- 593 !! *** FUNCTION cp_air *** 594 !! 595 !! ** Purpose : Compute specific heat (Cp) of moist air 596 !! 597 !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 598 !!------------------------------------------------------------------------------- 599 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa ! air specific humidity [kg/kg] 600 REAL(wp), DIMENSION(jpi,jpj) :: cp_air ! specific heat of moist air [J/K/kg] 601 !!------------------------------------------------------------------------------- 602 ! 603 Cp_air = Cp_dry + Cp_vap * pqa 604 ! 605 END FUNCTION cp_air 606 607 608 FUNCTION q_sat( ptak, pslp ) 609 !!---------------------------------------------------------------------------------- 610 !! *** FUNCTION q_sat *** 611 !! 612 !! ** Purpose : Specific humidity at saturation in [kg/kg] 613 !! Based on accurate estimate of "e_sat" 614 !! aka saturation water vapor (Goff, 1957) 615 !! 616 !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 617 !!---------------------------------------------------------------------------------- 618 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptak ! air temperature [K] 619 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pslp ! sea level atmospheric pressure [Pa] 620 REAL(wp), DIMENSION(jpi,jpj) :: q_sat ! Specific humidity at saturation [kg/kg] 621 ! 622 INTEGER :: ji, jj ! dummy loop indices 623 REAL(wp) :: ze_sat, ztmp ! local scalar 624 !!---------------------------------------------------------------------------------- 625 ! 626 DO jj = 1, jpj 627 DO ji = 1, jpi 628 ! 629 ztmp = rt0 / ptak(ji,jj) 630 ! 631 ! Vapour pressure at saturation [hPa] : WMO, (Goff, 1957) 632 ze_sat = 10.**( 10.79574*(1. - ztmp) - 5.028*LOG10(ptak(ji,jj)/rt0) & 633 & + 1.50475*10.**(-4)*(1. - 10.**(-8.2969*(ptak(ji,jj)/rt0 - 1.)) ) & 634 & + 0.42873*10.**(-3)*(10.**(4.76955*(1. - ztmp)) - 1.) + 0.78614 ) 635 ! 636 q_sat(ji,jj) = reps0 * ze_sat/( 0.01_wp*pslp(ji,jj) - (1._wp - reps0)*ze_sat ) ! 0.01 because SLP is in [Pa] 637 ! 638 END DO 639 END DO 640 ! 641 END FUNCTION q_sat 642 643 644 FUNCTION gamma_moist( ptak, pqa ) 645 !!---------------------------------------------------------------------------------- 646 !! *** FUNCTION gamma_moist *** 647 !! 648 !! ** Purpose : Compute the moist adiabatic lapse-rate. 649 !! => http://glossary.ametsoc.org/wiki/Moist-adiabatic_lapse_rate 650 !! => http://www.geog.ucsb.edu/~joel/g266_s10/lecture_notes/chapt03/oh10_3_01/oh10_3_01.html 651 !! 652 !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 653 !!---------------------------------------------------------------------------------- 654 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptak ! air temperature [K] 655 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa ! specific humidity [kg/kg] 656 REAL(wp), DIMENSION(jpi,jpj) :: gamma_moist ! moist adiabatic lapse-rate 657 ! 658 INTEGER :: ji, jj ! dummy loop indices 659 REAL(wp) :: zrv, ziRT ! local scalar 660 !!---------------------------------------------------------------------------------- 661 ! 662 DO jj = 1, jpj 663 DO ji = 1, jpi 664 zrv = pqa(ji,jj) / (1. - pqa(ji,jj)) 665 ziRT = 1. / (R_dry*ptak(ji,jj)) ! 1/RT 666 gamma_moist(ji,jj) = grav * ( 1. + cevap*zrv*ziRT ) / ( Cp_dry + cevap*cevap*zrv*reps0*ziRT/ptak(ji,jj) ) 667 END DO 668 END DO 669 ! 670 END FUNCTION gamma_moist 671 672 673 FUNCTION L_vap( psst ) 674 !!--------------------------------------------------------------------------------- 675 !! *** FUNCTION L_vap *** 676 !! 677 !! ** Purpose : Compute the latent heat of vaporization of water from temperature 678 !! 679 !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 680 !!---------------------------------------------------------------------------------- 681 REAL(wp), DIMENSION(jpi,jpj) :: L_vap ! latent heat of vaporization [J/kg] 682 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: psst ! water temperature [K] 683 !!---------------------------------------------------------------------------------- 684 ! 685 L_vap = ( 2.501 - 0.00237 * ( psst(:,:) - rt0) ) * 1.e6 686 ! 687 END FUNCTION L_vap 688 568 689 #if defined key_lim3 690 !!---------------------------------------------------------------------- 691 !! 'key_lim3' ESIM sea-ice model 692 !!---------------------------------------------------------------------- 693 !! blk_ice_tau : provide the air-ice stress 694 !! blk_ice_flx : provide the heat and mass fluxes at air-ice interface 695 !! blk_ice_qcn : provide ice surface temperature and snow/ice conduction flux (emulating JULES coupler) 696 !! Cdn10_Lupkes2012 : Lupkes et al. (2012) air-ice drag 697 !! Cdn10_Lupkes2015 : Lupkes et al. (2015) air-ice drag 698 !!---------------------------------------------------------------------- 569 699 570 700 SUBROUTINE blk_ice_tau … … 688 818 689 819 690 SUBROUTINE blk_ice_flx( ptsu, p alb )820 SUBROUTINE blk_ice_flx( ptsu, phs, phi, palb ) 691 821 !!--------------------------------------------------------------------- 692 822 !! *** ROUTINE blk_ice_flx *** 693 823 !! 694 !! ** Purpose : provide the surface boundary condition over sea-ice824 !! ** Purpose : provide the heat and mass fluxes at air-ice interface 695 825 !! 696 826 !! ** Method : compute heat and freshwater exchanged … … 701 831 !!--------------------------------------------------------------------- 702 832 REAL(wp), DIMENSION(:,:,:), INTENT(in) :: ptsu ! sea ice surface temperature 833 REAL(wp), DIMENSION(:,:,:), INTENT(in) :: phs ! snow thickness 834 REAL(wp), DIMENSION(:,:,:), INTENT(in) :: phi ! ice thickness 703 835 REAL(wp), DIMENSION(:,:,:), INTENT(in) :: palb ! ice albedo (all skies) 704 836 !! … … 707 839 REAL(wp) :: zcoef_dqlw, zcoef_dqla ! - - 708 840 REAL(wp) :: zztmp, z1_lsub ! - - 841 REAL(wp) :: zfrqsr_tr_i ! sea ice shortwave fraction transmitted below through the ice 842 REAL(wp) :: zfr1, zfr2, zfac ! local variables 709 843 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z_qlw ! long wave heat flux over ice 710 844 REAL(wp), DIMENSION(jpi,jpj,jpl) :: z_qsb ! sensible heat flux over ice … … 717 851 IF( ln_timing ) CALL timing_start('blk_ice_flx') 718 852 ! 719 ! 720 ! local scalars 721 zcoef_dqlw = 4.0 * 0.95 * Stef 722 zcoef_dqla = -Ls * 11637800. * (-5897.8) 853 zcoef_dqlw = 4.0 * 0.95 * Stef ! local scalars 854 zcoef_dqla = -Ls * 11637800. * (-5897.8) 723 855 ! 724 856 zrhoa(:,:) = rho_air( sf(jp_tair)%fnow(:,:,1), sf(jp_humi)%fnow(:,:,1), sf(jp_slp)%fnow(:,:,1) ) … … 815 947 END DO 816 948 817 !-------------------------------------------------------------------- 818 ! FRACTIONs of net shortwave radiation which is not absorbed in the 819 ! thin surface layer and penetrates inside the ice cover 820 ! ( Maykut and Untersteiner, 1971 ; Ebert and Curry, 1993 ) 821 ! 822 fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 823 fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 949 ! --- absorbed and transmitted shortwave radiation (W/m2) --- ! 950 ! 951 ! former coding was 952 ! fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 953 ! fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 954 955 ! --- surface transmission parameter (i0, Grenfell Maykut 77) --- ! 956 zfr1 = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) ! standard value 957 zfr2 = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) ! zfr2 such that zfr1 + zfr2 to equal 1 958 959 qsr_ice_tr(:,:,:) = 0._wp 960 961 DO jl = 1, jpl 962 DO jj = 1, jpj 963 DO ji = 1, jpi 964 ! 965 zfac = MAX( 0._wp , 1._wp - phi(ji,jj,jl) * 10._wp ) ! linear weighting factor: =0 for phi=0, =1 for phi = 0.1 966 zfrqsr_tr_i = zfr1 + zfac * zfr2 ! below 10 cm, linearly increase zfrqsr_tr_i until 1 at zero thickness 967 ! 968 IF ( phs(ji,jj,jl) <= 0._wp ) THEN ; zfrqsr_tr_i = zfr1 + zfac * zfr2 969 ELSE ; zfrqsr_tr_i = 0._wp ! snow fully opaque 970 ENDIF 971 ! 972 qsr_ice_tr(ji,jj,jl) = zfrqsr_tr_i * qsr_ice(ji,jj,jl) ! transmitted solar radiation 973 ! 974 END DO 975 END DO 976 END DO 824 977 ! 825 978 IF(ln_ctl) THEN … … 836 989 END SUBROUTINE blk_ice_flx 837 990 838 #endif 839 840 FUNCTION rho_air( ptak, pqa, pslp ) 841 !!------------------------------------------------------------------------------- 842 !! *** FUNCTION rho_air *** 843 !! 844 !! ** Purpose : compute density of (moist) air using the eq. of state of the atmosphere 845 !! 846 !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 847 !!------------------------------------------------------------------------------- 848 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptak ! air temperature [K] 849 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa ! air specific humidity [kg/kg] 850 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pslp ! pressure in [Pa] 851 REAL(wp), DIMENSION(jpi,jpj) :: rho_air ! density of moist air [kg/m^3] 852 !!------------------------------------------------------------------------------- 853 ! 854 rho_air = pslp / ( R_dry*ptak * ( 1._wp + rctv0*pqa ) ) 855 ! 856 END FUNCTION rho_air 857 858 859 FUNCTION cp_air( pqa ) 860 !!------------------------------------------------------------------------------- 861 !! *** FUNCTION cp_air *** 862 !! 863 !! ** Purpose : Compute specific heat (Cp) of moist air 864 !! 865 !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 866 !!------------------------------------------------------------------------------- 867 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa ! air specific humidity [kg/kg] 868 REAL(wp), DIMENSION(jpi,jpj) :: cp_air ! specific heat of moist air [J/K/kg] 869 !!------------------------------------------------------------------------------- 870 ! 871 Cp_air = Cp_dry + Cp_vap * pqa 872 ! 873 END FUNCTION cp_air 874 875 876 FUNCTION q_sat( ptak, pslp ) 877 !!---------------------------------------------------------------------------------- 878 !! *** FUNCTION q_sat *** 879 !! 880 !! ** Purpose : Specific humidity at saturation in [kg/kg] 881 !! Based on accurate estimate of "e_sat" 882 !! aka saturation water vapor (Goff, 1957) 883 !! 884 !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 885 !!---------------------------------------------------------------------------------- 886 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptak ! air temperature [K] 887 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pslp ! sea level atmospheric pressure [Pa] 888 REAL(wp), DIMENSION(jpi,jpj) :: q_sat ! Specific humidity at saturation [kg/kg] 889 ! 890 INTEGER :: ji, jj ! dummy loop indices 891 REAL(wp) :: ze_sat, ztmp ! local scalar 892 !!---------------------------------------------------------------------------------- 893 ! 894 DO jj = 1, jpj 895 DO ji = 1, jpi 896 ! 897 ztmp = rt0 / ptak(ji,jj) 898 ! 899 ! Vapour pressure at saturation [hPa] : WMO, (Goff, 1957) 900 ze_sat = 10.**( 10.79574*(1. - ztmp) - 5.028*LOG10(ptak(ji,jj)/rt0) & 901 & + 1.50475*10.**(-4)*(1. - 10.**(-8.2969*(ptak(ji,jj)/rt0 - 1.)) ) & 902 & + 0.42873*10.**(-3)*(10.**(4.76955*(1. - ztmp)) - 1.) + 0.78614 ) 991 992 SUBROUTINE blk_ice_qcn( k_monocat, ptsu, ptb, phs, phi ) 993 !!--------------------------------------------------------------------- 994 !! *** ROUTINE blk_ice_qcn *** 995 !! 996 !! ** Purpose : Compute surface temperature and snow/ice conduction flux 997 !! to force sea ice / snow thermodynamics 998 !! in the case JULES coupler is emulated 999 !! 1000 !! ** Method : compute surface energy balance assuming neglecting heat storage 1001 !! following the 0-layer Semtner (1976) approach 1002 !! 1003 !! ** Outputs : - ptsu : sea-ice / snow surface temperature (K) 1004 !! - qcn_ice : surface inner conduction flux (W/m2) 1005 !! 1006 !!--------------------------------------------------------------------- 1007 INTEGER , INTENT(in ) :: k_monocat ! single-category option 1008 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: ptsu ! sea ice / snow surface temperature 1009 REAL(wp), DIMENSION(:,:) , INTENT(in ) :: ptb ! sea ice base temperature 1010 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: phs ! snow thickness 1011 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: phi ! sea ice thickness 1012 ! 1013 INTEGER , PARAMETER :: nit = 10 ! number of iterations 1014 REAL(wp), PARAMETER :: zepsilon = 0.1_wp ! characteristic thickness for enhanced conduction 1015 ! 1016 INTEGER :: ji, jj, jl ! dummy loop indices 1017 INTEGER :: iter ! local integer 1018 REAL(wp) :: zfac, zfac2, zfac3 ! local scalars 1019 REAL(wp) :: zkeff_h, ztsu ! 1020 REAL(wp) :: zqc, zqnet ! 1021 REAL(wp) :: zhe, zqa0 ! 1022 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zgfac ! enhanced conduction factor 1023 !!--------------------------------------------------------------------- 1024 1025 IF( nn_timing == 1 ) CALL timing_start('blk_ice_qcn') 1026 1027 ! -------------------------------------! 1028 ! I Enhanced conduction factor ! 1029 ! -------------------------------------! 1030 ! Emulates the enhancement of conduction by unresolved thin ice (k_monocat = 1/3) 1031 ! Fichefet and Morales Maqueda, JGR 1997 1032 ! 1033 zgfac(:,:,:) = 1._wp 1034 1035 SELECT CASE ( k_monocat ) 1036 ! 1037 CASE ( 1 , 3 ) 1038 ! 1039 zfac = 1._wp / ( rn_cnd_s + rcdic ) 1040 zfac2 = EXP(1._wp) * 0.5_wp * zepsilon 1041 zfac3 = 2._wp / zepsilon 1042 ! 1043 DO jl = 1, jpl 1044 DO jj = 1 , jpj 1045 DO ji = 1, jpi 1046 ! ! Effective thickness 1047 zhe = ( rn_cnd_s * phi(ji,jj,jl) + rcdic * phs(ji,jj,jl) ) * zfac 1048 ! ! Enhanced conduction factor 1049 IF( zhe >= zfac2 ) & 1050 zgfac(ji,jj,jl) = MIN( 2._wp, ( 0.5_wp + 0.5 * LOG( zhe * zfac3 ) ) ) 1051 END DO 1052 END DO 1053 END DO 1054 ! 1055 END SELECT 1056 1057 ! -------------------------------------------------------------! 1058 ! II Surface temperature and conduction flux ! 1059 ! -------------------------------------------------------------! 1060 ! 1061 zfac = rcdic * rn_cnd_s 1062 ! ! ========================== ! 1063 DO jl = 1, jpl ! Loop over ice categories ! 1064 ! ! ========================== ! 1065 DO jj = 1 , jpj 1066 DO ji = 1, jpi 1067 ! ! Effective conductivity of the snow-ice system divided by thickness 1068 zkeff_h = zfac * zgfac(ji,jj,jl) / ( rcdic * phs(ji,jj,jl) + rn_cnd_s * phi(ji,jj,jl) ) 1069 ! ! Store initial surface temperature 1070 ztsu = ptsu(ji,jj,jl) 1071 ! ! Net initial atmospheric heat flux 1072 zqa0 = qsr_ice(ji,jj,jl) - qsr_ice_tr(ji,jj,jl) + qns_ice(ji,jj,jl) 903 1073 ! 904 q_sat(ji,jj) = reps0 * ze_sat/( 0.01_wp*pslp(ji,jj) - (1._wp - reps0)*ze_sat ) ! 0.01 because SLP is in [Pa] 905 ! 906 END DO 907 END DO 908 ! 909 END FUNCTION q_sat 910 911 912 FUNCTION gamma_moist( ptak, pqa ) 913 !!---------------------------------------------------------------------------------- 914 !! *** FUNCTION gamma_moist *** 915 !! 916 !! ** Purpose : Compute the moist adiabatic lapse-rate. 917 !! => http://glossary.ametsoc.org/wiki/Moist-adiabatic_lapse_rate 918 !! => http://www.geog.ucsb.edu/~joel/g266_s10/lecture_notes/chapt03/oh10_3_01/oh10_3_01.html 919 !! 920 !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 921 !!---------------------------------------------------------------------------------- 922 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: ptak ! air temperature [K] 923 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqa ! specific humidity [kg/kg] 924 REAL(wp), DIMENSION(jpi,jpj) :: gamma_moist ! moist adiabatic lapse-rate 925 ! 926 INTEGER :: ji, jj ! dummy loop indices 927 REAL(wp) :: zrv, ziRT ! local scalar 928 !!---------------------------------------------------------------------------------- 929 ! 930 DO jj = 1, jpj 931 DO ji = 1, jpi 932 zrv = pqa(ji,jj) / (1. - pqa(ji,jj)) 933 ziRT = 1. / (R_dry*ptak(ji,jj)) ! 1/RT 934 gamma_moist(ji,jj) = grav * ( 1. + cevap*zrv*ziRT ) / ( Cp_dry + cevap*cevap*zrv*reps0*ziRT/ptak(ji,jj) ) 935 END DO 936 END DO 937 ! 938 END FUNCTION gamma_moist 939 940 941 FUNCTION L_vap( psst ) 942 !!--------------------------------------------------------------------------------- 943 !! *** FUNCTION L_vap *** 944 !! 945 !! ** Purpose : Compute the latent heat of vaporization of water from temperature 946 !! 947 !! ** Author: L. Brodeau, june 2016 / AeroBulk (https://sourceforge.net/p/aerobulk) 948 !!---------------------------------------------------------------------------------- 949 REAL(wp), DIMENSION(jpi,jpj) :: L_vap ! latent heat of vaporization [J/kg] 950 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: psst ! water temperature [K] 951 !!---------------------------------------------------------------------------------- 952 ! 953 L_vap = ( 2.501 - 0.00237 * ( psst(:,:) - rt0) ) * 1.e6 954 ! 955 END FUNCTION L_vap 956 957 #if defined key_lim3 1074 DO iter = 1, nit ! --- Iteration loop 1075 ! ! Conduction heat flux through snow-ice system (>0 downwards) 1076 zqc = zkeff_h * ( ztsu - ptb(ji,jj) ) 1077 ! ! Surface energy budget 1078 zqnet = zqa0 + dqns_ice(ji,jj,jl) * ( ztsu - ptsu(ji,jj,jl) ) - zqc 1079 ! ! Temperature update 1080 ztsu = ztsu - zqnet / ( dqns_ice(ji,jj,jl) - zkeff_h ) 1081 END DO 1082 ! 1083 ptsu (ji,jj,jl) = MIN( rt0, ztsu ) 1084 qcn_ice(ji,jj,jl) = zkeff_h * ( ptsu(ji,jj,jl) - ptb(ji,jj) ) 1085 ! 1086 END DO 1087 END DO 1088 ! 1089 END DO 1090 ! 1091 IF( nn_timing == 1 ) CALL timing_stop('blk_ice_qcn') 1092 ! 1093 END SUBROUTINE blk_ice_qcn 1094 958 1095 959 1096 SUBROUTINE Cdn10_Lupkes2012( Cd ) … … 961 1098 !! *** ROUTINE Cdn10_Lupkes2012 *** 962 1099 !! 963 !! ** Purpose : Recompute the ice-atm drag at 10m height to make964 !! it dependent on edges at leads, melt ponds and flows.1100 !! ** Purpose : Recompute the neutral air-ice drag referenced at 10m 1101 !! to make it dependent on edges at leads, melt ponds and flows. 965 1102 !! After some approximations, this can be resumed to a dependency 966 1103 !! on ice concentration. … … 1012 1149 !! *** ROUTINE Cdn10_Lupkes2015 *** 1013 1150 !! 1014 !! ** pUrpose : 1lternative turbulent transfert coefficients formulation1151 !! ** pUrpose : Alternative turbulent transfert coefficients formulation 1015 1152 !! between sea-ice and atmosphere with distinct momentum 1016 1153 !! and heat coefficients depending on sea-ice concentration -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_algo_coare.F90
r8637 r8813 49 49 PUBLIC :: TURB_COARE ! called by sbcblk.F90 50 50 51 ! !! COARE own values for given constants:52 REAL(wp), PARAMETER :: zi0 = 600. ! scale height of the atmospheric boundary layer...153 REAL(wp), PARAMETER :: Beta0 = 1.25 54 REAL(wp), PARAMETER :: rctv0 = 0.608 ! constant to obtain virtual temperature...51 ! !! COARE own values for given constants: 52 REAL(wp), PARAMETER :: zi0 = 600._wp ! scale height of the atmospheric boundary layer... 53 REAL(wp), PARAMETER :: Beta0 = 1.250_wp ! gustiness parameter 54 REAL(wp), PARAMETER :: rctv0 = 0.608_wp ! constant to obtain virtual temperature... 55 55 56 56 !!---------------------------------------------------------------------- -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90
r8637 r8813 971 971 !! emp upward mass flux [evap. - precip. (- runoffs) (- calving)] (ocean only case) 972 972 !!---------------------------------------------------------------------- 973 USE zdf_oce, ONLY : ln_zdfswm 974 975 IMPLICIT NONE 976 977 INTEGER, INTENT(in) :: kt ! ocean model time step index 978 INTEGER, INTENT(in) :: k_fsbc ! frequency of sbc (-> ice model) computation 979 INTEGER, INTENT(in) :: k_ice ! ice management in the sbc (=0/1/2/3) 973 USE zdf_oce, ONLY : ln_zdfswm 974 ! 975 INTEGER, INTENT(in) :: kt ! ocean model time step index 976 INTEGER, INTENT(in) :: k_fsbc ! frequency of sbc (-> ice model) computation 977 INTEGER, INTENT(in) :: k_ice ! ice management in the sbc (=0/1/2/3) 980 978 !! 981 979 LOGICAL :: llnewtx, llnewtau ! update wind stress components and module?? … … 1170 1168 ! Calculate the 3D Stokes drift both in coupled and not fully uncoupled mode 1171 1169 IF( srcv(jpr_sdrftx)%laction .OR. srcv(jpr_sdrfty)%laction .OR. srcv(jpr_wper)%laction & 1172 1170 & .OR. srcv(jpr_hsig)%laction ) THEN 1173 1171 CALL sbc_stokes() 1174 1172 ENDIF … … 1525 1523 1526 1524 1527 SUBROUTINE sbc_cpl_ice_flx( picefr, palbi, psst, pist )1525 SUBROUTINE sbc_cpl_ice_flx( picefr, palbi, psst, pist, phs, phi ) 1528 1526 !!---------------------------------------------------------------------- 1529 1527 !! *** ROUTINE sbc_cpl_ice_flx *** … … 1576 1574 !!---------------------------------------------------------------------- 1577 1575 REAL(wp), INTENT(in), DIMENSION(:,:) :: picefr ! ice fraction [0 to 1] 1578 ! optional arguments, used only in 'mixed oce-ice' case1576 ! !! ! optional arguments, used only in 'mixed oce-ice' case 1579 1577 REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL :: palbi ! all skies ice albedo 1580 1578 REAL(wp), INTENT(in), DIMENSION(:,: ), OPTIONAL :: psst ! sea surface temperature [Celsius] 1581 1579 REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL :: pist ! ice surface temperature [Kelvin] 1582 ! 1583 INTEGER :: jl ! dummy loop index 1584 REAL(wp), POINTER, DIMENSION(:,: ) :: zcptn, zcptrain, zcptsnw, ziceld, zmsk, zsnw 1585 REAL(wp), POINTER, DIMENSION(:,: ) :: zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip, zevap_oce, zevap_ice, zdevap_ice 1586 REAL(wp), POINTER, DIMENSION(:,: ) :: zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice 1587 REAL(wp), POINTER, DIMENSION(:,:,:) :: zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice 1580 REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL :: phs ! snow depth [m] 1581 REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL :: phi ! ice thickness [m] 1582 ! 1583 INTEGER :: ji, jj, jl ! dummy loop index 1584 REAL(wp) :: ztri ! local scalar 1585 REAL(wp), DIMENSION(jpi,jpj) :: zcptn, zcptrain, zcptsnw, ziceld, zmsk, zsnw 1586 REAL(wp), DIMENSION(jpi,jpj) :: zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip , zevap_oce, zevap_ice, zdevap_ice 1587 REAL(wp), DIMENSION(jpi,jpj) :: zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice 1588 REAL(wp), DIMENSION(jpi,jpj,jpl) :: zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice !!gm , zfrqsr_tr_i 1588 1589 !!---------------------------------------------------------------------- 1589 1590 ! 1590 1591 IF( nn_timing == 1 ) CALL timing_start('sbc_cpl_ice_flx') 1591 1592 ! 1592 CALL wrk_alloc( jpi,jpj, zcptn, zcptrain, zcptsnw, ziceld, zmsk, zsnw )1593 CALL wrk_alloc( jpi,jpj, zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip, zevap_oce, zevap_ice, zdevap_ice )1594 CALL wrk_alloc( jpi,jpj, zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice )1595 CALL wrk_alloc( jpi,jpj,jpl, zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice )1596 1597 1593 IF( ln_mixcpl ) zmsk(:,:) = 1. - xcplmask(:,:,0) 1598 ziceld(:,:) = 1. - picefr(:,:)1599 zcptn (:,:) = rcp * sst_m(:,:)1594 ziceld(:,:) = 1._wp - picefr(:,:) 1595 zcptn (:,:) = rcp * sst_m(:,:) 1600 1596 ! 1601 1597 ! ! ========================= ! … … 1622 1618 #if defined key_lim3 1623 1619 ! zsnw = snow fraction over ice after wind blowing (=picefr if no blowing) 1624 zsnw(:,:) = 0._wp ;CALL ice_thd_snwblow( ziceld, zsnw )1620 zsnw(:,:) = 0._wp ; CALL ice_thd_snwblow( ziceld, zsnw ) 1625 1621 1626 1622 ! --- evaporation minus precipitation corrected (because of wind blowing on snow) --- ! … … 1659 1655 sprecip(:,:) = sprecip(:,:) * xcplmask(:,:,0) + zsprecip(:,:) * zmsk(:,:) 1660 1656 tprecip(:,:) = tprecip(:,:) * xcplmask(:,:,0) + ztprecip(:,:) * zmsk(:,:) 1661 DO jl =1,jpl1657 DO jl = 1, jpl 1662 1658 evap_ice (:,:,jl) = evap_ice (:,:,jl) * xcplmask(:,:,0) + zevap_ice (:,:) * zmsk(:,:) 1663 1659 devap_ice(:,:,jl) = devap_ice(:,:,jl) * xcplmask(:,:,0) + zdevap_ice(:,:) * zmsk(:,:) 1664 END DO1660 END DO 1665 1661 ELSE 1666 emp_tot(:,:) = 1667 emp_ice(:,:) = 1668 emp_oce(:,:) = 1669 sprecip(:,:) = 1670 tprecip(:,:) = 1671 DO jl =1,jpl1662 emp_tot(:,:) = zemp_tot(:,:) 1663 emp_ice(:,:) = zemp_ice(:,:) 1664 emp_oce(:,:) = zemp_oce(:,:) 1665 sprecip(:,:) = zsprecip(:,:) 1666 tprecip(:,:) = ztprecip(:,:) 1667 DO jl = 1, jpl 1672 1668 evap_ice (:,:,jl) = zevap_ice (:,:) 1673 1669 devap_ice(:,:,jl) = zdevap_ice(:,:) 1674 END DO1670 END DO 1675 1671 ENDIF 1676 1672 … … 1691 1687 fwfisf(:,:) = - frcv(jpr_isf)%z3(:,:,1) 1692 1688 ENDIF 1693 1689 ! 1694 1690 IF( ln_mixcpl ) THEN 1695 1691 emp_tot(:,:) = emp_tot(:,:) * xcplmask(:,:,0) + zemp_tot(:,:) * zmsk(:,:) … … 1703 1699 tprecip(:,:) = ztprecip(:,:) 1704 1700 ENDIF 1705 1701 ! 1706 1702 #endif 1703 1707 1704 ! outputs 1708 1705 !! IF( srcv(jpr_rnf)%laction ) CALL iom_put( 'runoffs' , rnf(:,:) * tmask(:,:,1) ) ! runoff … … 1730 1727 zqns_ice(:,:,1:jpl) = frcv(jpr_qnsice)%z3(:,:,1:jpl) 1731 1728 ELSE 1732 DO jl =1,jpl1729 DO jl = 1, jpl 1733 1730 zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) ! Set all category values equal 1734 END DO1731 END DO 1735 1732 ENDIF 1736 1733 CASE( 'oce and ice' ) ! the total flux is computed from ocean and ice fluxes … … 1743 1740 ELSE 1744 1741 qns_tot(:,:) = qns_tot(:,:) + picefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 1745 DO jl =1,jpl1742 DO jl = 1, jpl 1746 1743 zqns_tot(:,: ) = zqns_tot(:,:) + picefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 1747 1744 zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) 1748 END DO1745 END DO 1749 1746 ENDIF 1750 1747 CASE( 'mixed oce-ice' ) ! the ice flux is cumputed from the total flux, the SST and ice informations … … 1766 1763 ! note: ziceld cannot be = 0 since we limit the ice concentration to amax 1767 1764 zqns_oce = 0._wp 1768 WHERE( ziceld /= 0._wp ) zqns_oce(:,:) = ( zqns_tot(:,:) - SUM( a_i * zqns_ice, dim=3 ) ) / ziceld(:,:)1765 WHERE( ziceld /= 0._wp ) zqns_oce(:,:) = ( zqns_tot(:,:) - SUM( a_i * zqns_ice, dim=3 ) ) / ziceld(:,:) 1769 1766 1770 1767 ! Heat content per unit mass of snow (J/kg) … … 1859 1856 ELSE 1860 1857 ! Set all category values equal for the moment 1861 DO jl =1,jpl1858 DO jl = 1, jpl 1862 1859 zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 1863 END DO1860 END DO 1864 1861 ENDIF 1865 1862 zqsr_tot(:,: ) = frcv(jpr_qsrmix)%z3(:,:,1) … … 1868 1865 zqsr_tot(:,: ) = ziceld(:,:) * frcv(jpr_qsroce)%z3(:,:,1) 1869 1866 IF ( TRIM(sn_rcv_qsr%clcat) == 'yes' ) THEN 1870 DO jl =1,jpl1867 DO jl = 1, jpl 1871 1868 zqsr_tot(:,: ) = zqsr_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qsrice)%z3(:,:,jl) 1872 1869 zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,jl) 1873 END DO1870 END DO 1874 1871 ELSE 1875 1872 qsr_tot(:,: ) = qsr_tot(:,:) + picefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 1876 DO jl =1,jpl1873 DO jl = 1, jpl 1877 1874 zqsr_tot(:,: ) = zqsr_tot(:,:) + picefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 1878 1875 zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 1879 END DO1876 END DO 1880 1877 ENDIF 1881 1878 CASE( 'mixed oce-ice' ) … … 1890 1887 IF( ln_dm2dc .AND. ln_cpl ) THEN ! modify qsr to include the diurnal cycle 1891 1888 zqsr_tot(:,: ) = sbc_dcy( zqsr_tot(:,: ) ) 1892 DO jl =1,jpl1889 DO jl = 1, jpl 1893 1890 zqsr_ice(:,:,jl) = sbc_dcy( zqsr_ice(:,:,jl) ) 1894 END DO1891 END DO 1895 1892 ENDIF 1896 1893 … … 1908 1905 qsr_tot(:,:) = qsr(:,:) * ziceld(:,:) + SUM( qsr_ice(:,:,:) * a_i(:,:,:), dim=3 ) ! total flux from blk 1909 1906 qsr_tot(:,:) = qsr_tot(:,:) * xcplmask(:,:,0) + zqsr_tot(:,:)* zmsk(:,:) 1910 DO jl =1,jpl1907 DO jl = 1, jpl 1911 1908 qsr_ice(:,:,jl) = qsr_ice(:,:,jl) * xcplmask(:,:,0) + zqsr_ice(:,:,jl)* zmsk(:,:) 1912 END DO1909 END DO 1913 1910 ELSE 1914 1911 qsr_tot(:,: ) = zqsr_tot(:,: ) … … 1946 1943 END SELECT 1947 1944 1948 ! Surface transimission parameter io (Maykut Untersteiner , 1971 ; Ebert and Curry, 1993 ) 1949 ! Used for LIM3 1950 ! Coupled case: since cloud cover is not received from atmosphere 1951 ! ===> used prescribed cloud fraction representative for polar oceans in summer (0.81) 1952 fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 1953 fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 1954 1955 CALL wrk_dealloc( jpi,jpj, zcptn, zcptrain, zcptsnw, ziceld, zmsk, zsnw ) 1956 CALL wrk_dealloc( jpi,jpj, zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip, zevap_oce, zevap_ice, zdevap_ice ) 1957 CALL wrk_dealloc( jpi,jpj, zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice ) 1958 CALL wrk_dealloc( jpi,jpj,jpl, zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice ) 1945 ! ! ========================= ! 1946 ! ! Transmitted Qsr ! [W/m2] 1947 ! ! ========================= ! 1948 SELECT CASE( nice_jules ) 1949 CASE( np_jules_OFF ) !== No Jules coupler ==! 1950 ! 1951 !!gm ! former coding was 1952 !!gm ! Coupled case: since cloud cover is not received from atmosphere 1953 !!gm ! ===> used prescribed cloud fraction representative for polar oceans in summer (0.81) 1954 !!gm ! fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 1955 !!gm ! fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 1956 !!gm 1957 !!gm ! to retrieve that coding, we needed to access h_i & h_s from here 1958 !!gm ! we could even retrieve cloud fraction from the coupler 1959 !!gm ! 1960 !!gm zfrqsr_tr_i(:,:,:) = 0._wp ! surface transmission parameter 1961 !!gm ! 1962 !!gm DO jl = 1, jpl 1963 !!gm DO jj = 1 , jpj 1964 !!gm DO ji = 1, jpi 1965 !!gm ! !--- surface transmission parameter (Grenfell Maykut 77) --- ! 1966 !!gm zfrqsr_tr_i(ji,jj,jl) = 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice 1967 !!gm ! 1968 !!gm ! ! --- influence of snow and thin ice --- ! 1969 !!gm IF ( phs(ji,jj,jl) >= 0.0_wp ) zfrqsr_tr_i(ji,jj,jl) = 0._wp ! snow fully opaque 1970 !!gm IF ( phi(ji,jj,jl) <= 0.1_wp ) zfrqsr_tr_i(ji,jj,jl) = 1._wp ! thin ice transmits all solar radiation 1971 !!gm END DO 1972 !!gm END DO 1973 !!gm END DO 1974 !!gm ! 1975 !!gm qsr_ice_tr(:,:,:) = zfrqsr_tr_i(:,:,:) * qsr_ice(:,:,:) ! transmitted solar radiation 1976 !!gm ! 1977 !!gm better coding of the above calculation: 1978 ! 1979 ! ! ===> used prescribed cloud fraction representative for polar oceans in summer (0.81) 1980 ztri = 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ! surface transmission parameter (Grenfell Maykut 77) 1981 ! 1982 qsr_ice_tr(:,:,:) = ztri * qsr_ice(:,:,:) 1983 WHERE( phs(:,:,:) >= 0.0_wp ) qsr_ice_tr(:,:,:) = 0._wp ! snow fully opaque 1984 WHERE( phi(:,:,:) <= 0.1_wp ) qsr_ice_tr(:,:,:) = qsr_ice(:,:,:) ! thin ice transmits all solar radiation 1985 !!gm end 1986 ! 1987 CASE( np_jules_ACTIVE ) !== Jules coupler is active ==! 1988 ! 1989 ! ! ===> here we must receive the qsr_ice_tr array from the coupler 1990 ! for now just assume zero (fully opaque ice) 1991 qsr_ice_tr(:,:,:) = 0._wp 1992 ! 1993 END SELECT 1959 1994 ! 1960 1995 IF( nn_timing == 1 ) CALL timing_stop('sbc_cpl_ice_flx') … … 2081 2116 IF( ssnd(jps_albmix)%laction ) THEN ! mixed ice-ocean 2082 2117 ztmp1(:,:) = alb_oce_mix(:,:) * zfr_l(:,:) 2083 DO jl =1,jpl2118 DO jl = 1, jpl 2084 2119 ztmp1(:,:) = ztmp1(:,:) + alb_ice(:,:,jl) * a_i(:,:,jl) 2085 2120 END DO -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_cice.F90
r8586 r8813 710 710 ! ! Prepare Coupling fields ! 711 711 ! ! =========================== ! 712 713 ! x and y comp of ice velocity714 712 ! 713 ! x and y comp of ice velocity 714 ! 715 715 CALL cice2nemo(uvel,u_ice,'F', -1. ) 716 716 CALL cice2nemo(vvel,v_ice,'F', -1. ) 717 718 ! Ice concentration (CO_1) = a_i calculated at end of cice_sbc_out719 720 ! Snow and ice thicknesses (CO_2 and CO_3)721 722 DO jl = 1, ncat717 ! 718 ! Ice concentration (CO_1) = a_i calculated at end of cice_sbc_out 719 ! 720 ! Snow and ice thicknesses (CO_2 and CO_3) 721 ! 722 DO jl = 1, ncat 723 723 CALL cice2nemo( vsnon(:,:,jl,:), h_s(:,:,jl),'T', 1. ) 724 724 CALL cice2nemo( vicen(:,:,jl,:), h_i(:,:,jl),'T', 1. ) 725 END DO725 END DO 726 726 ! 727 727 IF( nn_timing == 1 ) CALL timing_stop('cice_sbc_hadgam') -
branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/SBC/sbcisf.F90
r8586 r8813 21 21 ! 22 22 USE in_out_manager ! I/O manager 23 USE iom ! I/O managerlibrary23 USE iom ! I/O library 24 24 USE fldread ! read input field at current time step 25 25 USE lbclnk ! … … 41 41 REAL(wp), PUBLIC :: rn_gammas0 !: salinity exchange coeficient [] 42 42 43 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_tsc_b, risf_tsc !: before and now T & S isf contents [K.m/s & PSU.m/s]44 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qisf !: net heat flux from ice shelf [W/m2]45 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rzisf_tbl !:depth of calving front (shallowest point) nn_isf ==2/346 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rhisf_tbl, rhisf_tbl_0 !:thickness of tbl [m]47 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: r1_hisf_tbl !:1/thickness of tbl48 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ralpha !:proportion of bottom cell influenced by tbl49 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: risfLeff !:effective length (Leff) BG03 nn_isf==250 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ttbl, stbl, utbl, vtbl !:top boundary layer variable at T point51 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: misfkt, misfkb !:Level of ice shelf base52 53 LOGICAL, PUBLIC :: l_isfcpl = .false. ! isf recieved from oasis54 55 REAL(wp), PUBLIC, SAVE :: rcpi = 2000.0_wp ! specific heat of ice shelf [J/kg/K]56 REAL(wp), PUBLIC, SAVE :: rkappa = 1.54e-6_wp ! heat diffusivity through the ice-shelf [m2/s]57 REAL(wp), PUBLIC, SAVE :: rhoisf = 920.0_wp ! volumic mass of ice shelf [kg/m3]58 REAL(wp), PUBLIC, SAVE :: tsurf = -20.0_wp ! air temperature on top of ice shelf [C]59 REAL(wp), PUBLIC, SAVE :: rlfusisf = 0.334e6_wp ! latent heat of fusion of ice shelf [J/kg]43 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: misfkt , misfkb !: Level of ice shelf base 44 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rzisf_tbl !: depth of calving front (shallowest point) nn_isf ==2/3 45 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rhisf_tbl, rhisf_tbl_0 !: thickness of tbl [m] 46 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: r1_hisf_tbl !: 1/thickness of tbl 47 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ralpha !: proportion of bottom cell influenced by tbl 48 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: risfLeff !: effective length (Leff) BG03 nn_isf==2 49 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ttbl, stbl, utbl, vtbl !: top boundary layer variable at T point 50 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: qisf !: net heat flux from ice shelf [W/m2] 51 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: risf_tsc_b, risf_tsc !: before and now T & S isf contents [K.m/s & PSU.m/s] 52 53 LOGICAL, PUBLIC :: l_isfcpl = .false. !: isf recieved from oasis 54 55 REAL(wp), PUBLIC, SAVE :: rcpi = 2000.0_wp !: specific heat of ice shelf [J/kg/K] 56 REAL(wp), PUBLIC, SAVE :: rkappa = 1.54e-6_wp !: heat diffusivity through the ice-shelf [m2/s] 57 REAL(wp), PUBLIC, SAVE :: rhoisf = 920.0_wp !: volumic mass of ice shelf [kg/m3] 58 REAL(wp), PUBLIC, SAVE :: tsurf = -20.0_wp !: air temperature on top of ice shelf [C] 59 REAL(wp), PUBLIC, SAVE :: rlfusisf = 0.334e6_wp !: latent heat of fusion of ice shelf [J/kg] 60 60 61 61 !: Variable used in fldread to read the forcing file (nn_isf == 4 .OR. nn_isf == 3) … … 70 70 71 71 !!---------------------------------------------------------------------- 72 !! NEMO/OPA 3.7 , LOCEAN-IPSL (2015)72 !! NEMO/OPA 4.0 , LOCEAN-IPSL (2017) 73 73 !! $Id$ 74 74 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) … … 91 91 INTEGER, INTENT(in) :: kt ! ocean time step 92 92 ! 93 INTEGER :: ji, jj, jk ! loop index94 INTEGER :: ikt, ikb ! local integers93 INTEGER :: ji, jj, jk ! loop index 94 INTEGER :: ikt, ikb ! local integers 95 95 REAL(wp), DIMENSION(jpi,jpj) :: zt_frz, zdep ! freezing temperature (zt_frz) at depth (zdep) 96 96 REAL(wp), DIMENSION(:,:) , ALLOCATABLE :: zqhcisf2d
Note: See TracChangeset
for help on using the changeset viewer.