Changeset 6225 for branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/NST_SRC/agrif_opa_interp.F90
- Timestamp:
- 2016-01-08T10:35:19+01:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/NST_SRC/agrif_opa_interp.F90
r4486 r6225 7 7 !! - ! 2005-11 (XXX) 8 8 !! 3.2 ! 2009-04 (R. Benshila) 9 !! 3.6 ! 2014-09 (R. Benshila) 9 10 !!---------------------------------------------------------------------- 10 11 #if defined key_agrif && ! defined key_offline … … 21 22 USE oce 22 23 USE dom_oce 23 USE sol_oce24 USE zdf_oce 24 25 USE agrif_oce 25 26 USE phycst 27 ! 26 28 USE in_out_manager 27 29 USE agrif_opa_sponge 28 30 USE lib_mpp 29 31 USE wrk_nemo 30 USE dynspg_oce 31 32 32 33 IMPLICIT NONE 33 34 PRIVATE 34 35 35 ! Barotropic arrays used to store open boundary data during36 ! time-splitting loop:37 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) :: ubdy_w, vbdy_w, hbdy_w38 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) :: ubdy_e, vbdy_e, hbdy_e39 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) :: ubdy_n, vbdy_n, hbdy_n40 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) :: ubdy_s, vbdy_s, hbdy_s41 42 36 PUBLIC Agrif_tra, Agrif_dyn, Agrif_ssh, Agrif_dyn_ts, Agrif_ssh_ts, Agrif_dta_ts 43 PUBLIC interpu, interpv, interpunb, interpvnb, interpsshn 44 45 # include "domzgr_substitute.h90" 37 PUBLIC interpun, interpvn 38 PUBLIC interptsn, interpsshn 39 PUBLIC interpunb, interpvnb, interpub2b, interpvb2b 40 PUBLIC interpe3t, interpumsk, interpvmsk 41 # if defined key_zdftke 42 PUBLIC Agrif_tke, interpavm 43 # endif 44 45 INTEGER :: bdy_tinterp = 0 46 46 47 # include "vectopt_loop_substitute.h90" 47 48 !!---------------------------------------------------------------------- 48 !! NEMO/NST 3. 3 , NEMO Consortium (2010)49 !! NEMO/NST 3.7 , NEMO Consortium (2015) 49 50 !! $Id$ 50 51 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 51 52 !!---------------------------------------------------------------------- 52 53 CONTAINS 54 53 CONTAINS 54 55 55 SUBROUTINE Agrif_tra 56 56 !!---------------------------------------------------------------------- 57 !! *** ROUTINE Agrif_Tra *** 58 !!---------------------------------------------------------------------- 59 !! 60 INTEGER :: ji, jj, jk, jn ! dummy loop indices 61 REAL(wp) :: zrhox , alpha1, alpha2, alpha3 62 REAL(wp) :: alpha4, alpha5, alpha6, alpha7 63 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztsa 57 !! *** ROUTINE Agrif_tra *** 64 58 !!---------------------------------------------------------------------- 65 59 ! 66 60 IF( Agrif_Root() ) RETURN 67 68 CALL wrk_alloc( jpi, jpj, jpk, jpts, ztsa ) 69 70 Agrif_SpecialValue = 0.e0 61 ! 62 Agrif_SpecialValue = 0._wp 71 63 Agrif_UseSpecialValue = .TRUE. 72 ztsa(:,:,:,:) = 0.e073 74 CALL Agrif_Bc_variable( ztsa, tsn_id, procname=interptsn )64 ! 65 CALL Agrif_Bc_variable( tsn_id, procname=interptsn ) 66 ! 75 67 Agrif_UseSpecialValue = .FALSE. 76 77 zrhox = Agrif_Rhox() 78 79 alpha1 = ( zrhox - 1. ) * 0.5 80 alpha2 = 1. - alpha1 81 82 alpha3 = ( zrhox - 1. ) / ( zrhox + 1. ) 83 alpha4 = 1. - alpha3 84 85 alpha6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. ) 86 alpha7 = - ( zrhox - 1. ) / ( zrhox + 3. ) 87 alpha5 = 1. - alpha6 - alpha7 88 89 IF( nbondi == 1 .OR. nbondi == 2 ) THEN 90 91 DO jn = 1, jpts 92 tsa(nlci,:,:,jn) = alpha1 * ztsa(nlci,:,:,jn) + alpha2 * ztsa(nlci-1,:,:,jn) 68 ! 69 END SUBROUTINE Agrif_tra 70 71 72 SUBROUTINE Agrif_dyn( kt ) 73 !!---------------------------------------------------------------------- 74 !! *** ROUTINE Agrif_DYN *** 75 !!---------------------------------------------------------------------- 76 INTEGER, INTENT(in) :: kt 77 ! 78 INTEGER :: ji, jj, jk ! dummy loop indices 79 INTEGER :: j1, j2, i1, i2 80 REAL(wp), POINTER, DIMENSION(:,:) :: zub, zvb 81 !!---------------------------------------------------------------------- 82 ! 83 IF( Agrif_Root() ) RETURN 84 ! 85 CALL wrk_alloc( jpi,jpj, zub, zvb ) 86 ! 87 Agrif_SpecialValue = 0._wp 88 Agrif_UseSpecialValue = ln_spc_dyn 89 ! 90 CALL Agrif_Bc_variable( un_interp_id, procname=interpun ) 91 CALL Agrif_Bc_variable( vn_interp_id, procname=interpvn ) 92 ! 93 Agrif_UseSpecialValue = .FALSE. 94 ! 95 ! prevent smoothing in ghost cells 96 i1 = 1 ; i2 = jpi 97 j1 = 1 ; j2 = jpj 98 IF( nbondj == -1 .OR. nbondj == 2 ) j1 = 3 99 IF( nbondj == +1 .OR. nbondj == 2 ) j2 = nlcj-2 100 IF( nbondi == -1 .OR. nbondi == 2 ) i1 = 3 101 IF( nbondi == +1 .OR. nbondi == 2 ) i2 = nlci-2 102 103 IF( nbondi == -1 .OR. nbondi == 2 ) THEN 104 ! 105 ! Smoothing 106 ! --------- 107 IF( .NOT.ln_dynspg_ts ) THEN ! Store transport 108 ua_b(2,:) = 0._wp 93 109 DO jk = 1, jpkm1 94 110 DO jj = 1, jpj 95 IF( umask(nlci-2,jj,jk) == 0.e0 ) THEN 96 tsa(nlci-1,jj,jk,jn) = tsa(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk) 97 ELSE 98 tsa(nlci-1,jj,jk,jn)=(alpha4*tsa(nlci,jj,jk,jn)+alpha3*tsa(nlci-2,jj,jk,jn))*tmask(nlci-1,jj,jk) 99 IF( un(nlci-2,jj,jk) > 0.e0 ) THEN 100 tsa(nlci-1,jj,jk,jn)=( alpha6*tsa(nlci-2,jj,jk,jn)+alpha5*tsa(nlci,jj,jk,jn) & 101 & + alpha7*tsa(nlci-3,jj,jk,jn) ) * tmask(nlci-1,jj,jk) 102 ENDIF 103 ENDIF 104 END DO 105 END DO 106 ENDDO 107 ENDIF 108 109 IF( nbondj == 1 .OR. nbondj == 2 ) THEN 110 111 DO jn = 1, jpts 112 tsa(:,nlcj,:,jn) = alpha1 * ztsa(:,nlcj,:,jn) + alpha2 * ztsa(:,nlcj-1,:,jn) 111 ua_b(2,jj) = ua_b(2,jj) + e3u_a(2,jj,jk) * ua(2,jj,jk) 112 END DO 113 END DO 114 DO jj = 1, jpj 115 ua_b(2,jj) = ua_b(2,jj) * r1_hu_a(2,jj) 116 END DO 117 ENDIF 118 ! 119 DO jk=1,jpkm1 ! Smooth 120 DO jj=j1,j2 121 ua(2,jj,jk) = 0.25_wp*(ua(1,jj,jk)+2._wp*ua(2,jj,jk)+ua(3,jj,jk)) 122 ua(2,jj,jk) = ua(2,jj,jk) * umask(2,jj,jk) 123 END DO 124 END DO 125 ! 126 zub(2,:) = 0._wp ! Correct transport 127 DO jk = 1, jpkm1 128 DO jj = 1, jpj 129 zub(2,jj) = zub(2,jj) + e3u_a(2,jj,jk) * ua(2,jj,jk) 130 END DO 131 END DO 132 DO jj=1,jpj 133 zub(2,jj) = zub(2,jj) * r1_hu_a(2,jj) 134 END DO 135 136 DO jk=1,jpkm1 137 DO jj=1,jpj 138 ua(2,jj,jk) = (ua(2,jj,jk)+ua_b(2,jj)-zub(2,jj))*umask(2,jj,jk) 139 END DO 140 END DO 141 142 ! Set tangential velocities to time splitting estimate 143 !----------------------------------------------------- 144 IF( ln_dynspg_ts ) THEN 145 zvb(2,:) = 0._wp 146 DO jk = 1, jpkm1 147 DO jj = 1, jpj 148 zvb(2,jj) = zvb(2,jj) + e3v_a(2,jj,jk) * va(2,jj,jk) 149 END DO 150 END DO 151 DO jj = 1, jpj 152 zvb(2,jj) = zvb(2,jj) * r1_hv_a(2,jj) 153 END DO 154 DO jk = 1, jpkm1 155 DO jj = 1, jpj 156 va(2,jj,jk) = (va(2,jj,jk)+va_b(2,jj)-zvb(2,jj)) * vmask(2,jj,jk) 157 END DO 158 END DO 159 ENDIF 160 ! 161 ! Mask domain edges: 162 !------------------- 163 DO jk = 1, jpkm1 164 DO jj = 1, jpj 165 ua(1,jj,jk) = 0._wp 166 va(1,jj,jk) = 0._wp 167 END DO 168 END DO 169 ! 170 ENDIF 171 172 IF( nbondi == 1 .OR. nbondi == 2 ) THEN 173 174 ! Smoothing 175 ! --------- 176 IF( .NOT.ln_dynspg_ts ) THEN ! Store transport 177 ua_b(nlci-2,:) = 0._wp 178 DO jk=1,jpkm1 179 DO jj=1,jpj 180 ua_b(nlci-2,jj) = ua_b(nlci-2,jj) + e3u_a(nlci-2,jj,jk) * ua(nlci-2,jj,jk) 181 END DO 182 END DO 183 DO jj=1,jpj 184 ua_b(nlci-2,jj) = ua_b(nlci-2,jj) * r1_hu_a(nlci-2,jj) 185 END DO 186 ENDIF 187 188 DO jk = 1, jpkm1 ! Smooth 189 DO jj = j1, j2 190 ua(nlci-2,jj,jk) = 0.25_wp * umask(nlci-2,jj,jk) & 191 & * ( ua(nlci-3,jj,jk) + 2._wp*ua(nlci-2,jj,jk) + ua(nlci-1,jj,jk) ) 192 END DO 193 END DO 194 195 zub(nlci-2,:) = 0._wp ! Correct transport 196 DO jk = 1, jpkm1 197 DO jj = 1, jpj 198 zub(nlci-2,jj) = zub(nlci-2,jj) + e3u_a(nlci-2,jj,jk) * ua(nlci-2,jj,jk) 199 END DO 200 END DO 201 DO jj = 1, jpj 202 zub(nlci-2,jj) = zub(nlci-2,jj) * r1_hu_a(nlci-2,jj) 203 END DO 204 205 DO jk = 1, jpkm1 206 DO jj = 1, jpj 207 ua(nlci-2,jj,jk) = ( ua(nlci-2,jj,jk) + ua_b(nlci-2,jj) - zub(nlci-2,jj) ) * umask(nlci-2,jj,jk) 208 END DO 209 END DO 210 ! 211 ! Set tangential velocities to time splitting estimate 212 !----------------------------------------------------- 213 IF( ln_dynspg_ts ) THEN 214 zvb(nlci-1,:) = 0._wp 215 DO jk = 1, jpkm1 216 DO jj = 1, jpj 217 zvb(nlci-1,jj) = zvb(nlci-1,jj) + e3v_a(nlci-1,jj,jk) * va(nlci-1,jj,jk) 218 END DO 219 END DO 220 DO jj=1,jpj 221 zvb(nlci-1,jj) = zvb(nlci-1,jj) * r1_hv_a(nlci-1,jj) 222 END DO 223 DO jk = 1, jpkm1 224 DO jj = 1, jpj 225 va(nlci-1,jj,jk) = ( va(nlci-1,jj,jk) + va_b(nlci-1,jj) - zvb(nlci-1,jj) ) * vmask(nlci-1,jj,jk) 226 END DO 227 END DO 228 ENDIF 229 ! 230 ! Mask domain edges: 231 !------------------- 232 DO jk = 1, jpkm1 233 DO jj = 1, jpj 234 ua(nlci-1,jj,jk) = 0._wp 235 va(nlci ,jj,jk) = 0._wp 236 END DO 237 END DO 238 ! 239 ENDIF 240 241 IF( nbondj == -1 .OR. nbondj == 2 ) THEN 242 243 ! Smoothing 244 ! --------- 245 IF( .NOT.ln_dynspg_ts ) THEN ! Store transport 246 va_b(:,2) = 0._wp 113 247 DO jk = 1, jpkm1 114 248 DO ji = 1, jpi 115 IF( vmask(ji,nlcj-2,jk) == 0.e0 ) THEN 116 tsa(ji,nlcj-1,jk,jn) = tsa(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk) 117 ELSE 118 tsa(ji,nlcj-1,jk,jn)=(alpha4*tsa(ji,nlcj,jk,jn)+alpha3*tsa(ji,nlcj-2,jk,jn))*tmask(ji,nlcj-1,jk) 119 IF (vn(ji,nlcj-2,jk) > 0.e0 ) THEN 120 tsa(ji,nlcj-1,jk,jn)=( alpha6*tsa(ji,nlcj-2,jk,jn)+alpha5*tsa(ji,nlcj,jk,jn) & 121 & + alpha7*tsa(ji,nlcj-3,jk,jn) ) * tmask(ji,nlcj-1,jk) 122 ENDIF 123 ENDIF 124 END DO 125 END DO 126 ENDDO 127 ENDIF 128 129 IF( nbondi == -1 .OR. nbondi == 2 ) THEN 130 DO jn = 1, jpts 131 tsa(1,:,:,jn) = alpha1 * ztsa(1,:,:,jn) + alpha2 * ztsa(2,:,:,jn) 132 DO jk = 1, jpkm1 133 DO jj = 1, jpj 134 IF( umask(2,jj,jk) == 0.e0 ) THEN 135 tsa(2,jj,jk,jn) = tsa(1,jj,jk,jn) * tmask(2,jj,jk) 136 ELSE 137 tsa(2,jj,jk,jn)=(alpha4*tsa(1,jj,jk,jn)+alpha3*tsa(3,jj,jk,jn))*tmask(2,jj,jk) 138 IF( un(2,jj,jk) < 0.e0 ) THEN 139 tsa(2,jj,jk,jn)=(alpha6*tsa(3,jj,jk,jn)+alpha5*tsa(1,jj,jk,jn)+alpha7*tsa(4,jj,jk,jn))*tmask(2,jj,jk) 140 ENDIF 141 ENDIF 142 END DO 143 END DO 144 END DO 145 ENDIF 146 147 IF( nbondj == -1 .OR. nbondj == 2 ) THEN 148 DO jn = 1, jpts 149 tsa(:,1,:,jn) = alpha1 * ztsa(:,1,:,jn) + alpha2 * ztsa(:,2,:,jn) 150 DO jk=1,jpk 151 DO ji=1,jpi 152 IF( vmask(ji,2,jk) == 0.e0 ) THEN 153 tsa(ji,2,jk,jn)=tsa(ji,1,jk,jn) * tmask(ji,2,jk) 154 ELSE 155 tsa(ji,2,jk,jn)=(alpha4*tsa(ji,1,jk,jn)+alpha3*tsa(ji,3,jk,jn))*tmask(ji,2,jk) 156 IF( vn(ji,2,jk) < 0.e0 ) THEN 157 tsa(ji,2,jk,jn)=(alpha6*tsa(ji,3,jk,jn)+alpha5*tsa(ji,1,jk,jn)+alpha7*tsa(ji,4,jk,jn))*tmask(ji,2,jk) 158 ENDIF 159 ENDIF 160 END DO 161 END DO 162 ENDDO 163 ENDIF 164 ! 165 CALL wrk_dealloc( jpi, jpj, jpk, jpts, ztsa ) 166 ! 167 END SUBROUTINE Agrif_tra 168 169 170 SUBROUTINE Agrif_dyn( kt ) 171 !!---------------------------------------------------------------------- 172 !! *** ROUTINE Agrif_DYN *** 173 !!---------------------------------------------------------------------- 174 !! 175 INTEGER, INTENT(in) :: kt 176 !! 177 INTEGER :: ji,jj,jk 178 REAL(wp) :: timeref 179 REAL(wp) :: z2dt, znugdt 180 REAL(wp) :: zrhox, zrhoy 181 REAL(wp), POINTER, DIMENSION(:,:,:) :: zua, zva 182 REAL(wp), POINTER, DIMENSION(:,:) :: spgv1, spgu1, zua2d, zva2d 183 !!---------------------------------------------------------------------- 184 185 IF( Agrif_Root() ) RETURN 186 187 CALL wrk_alloc( jpi, jpj, spgv1, spgu1, zua2d, zva2d ) 188 CALL wrk_alloc( jpi, jpj, jpk, zua, zva ) 189 190 zrhox = Agrif_Rhox() 191 zrhoy = Agrif_Rhoy() 192 193 timeref = 1. 194 195 ! time step: leap-frog 196 z2dt = 2. * rdt 197 ! time step: Euler if restart from rest 198 IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt 199 ! coefficients 200 znugdt = grav * z2dt 201 202 Agrif_SpecialValue=0. 203 Agrif_UseSpecialValue = ln_spc_dyn 204 205 zua = 0. 206 zva = 0. 207 CALL Agrif_Bc_variable(zua,un_id,procname=interpu) 208 CALL Agrif_Bc_variable(zva,vn_id,procname=interpv) 209 zua2d = 0. 210 zva2d = 0. 211 212 #if defined key_dynspg_flt 213 Agrif_SpecialValue=0. 214 Agrif_UseSpecialValue = ln_spc_dyn 215 CALL Agrif_Bc_variable(zua2d,e1u_id,calledweight=1.,procname=interpu2d) 216 CALL Agrif_Bc_variable(zva2d,e2v_id,calledweight=1.,procname=interpv2d) 217 #endif 218 Agrif_UseSpecialValue = .FALSE. 219 220 221 IF((nbondi == -1).OR.(nbondi == 2)) THEN 222 223 #if defined key_dynspg_flt 224 DO jj=1,jpj 225 laplacu(2,jj) = timeref * (zua2d(2,jj)/(zrhoy*e2u(2,jj)))*umask(2,jj,1) 226 END DO 227 #endif 228 229 DO jk=1,jpkm1 230 DO jj=1,jpj 231 ua(1:2,jj,jk) = (zua(1:2,jj,jk)/(zrhoy*e2u(1:2,jj))) 232 ua(1:2,jj,jk) = ua(1:2,jj,jk) / fse3u_a(1:2,jj,jk) 233 END DO 234 END DO 235 236 #if defined key_dynspg_flt 237 DO jk=1,jpkm1 238 DO jj=1,jpj 239 ua(2,jj,jk) = (ua(2,jj,jk) - z2dt * znugdt * laplacu(2,jj))*umask(2,jj,jk) 240 END DO 241 END DO 242 243 spgu(2,:)=0. 244 245 DO jk=1,jpkm1 246 DO jj=1,jpj 247 spgu(2,jj)=spgu(2,jj)+fse3u_a(2,jj,jk)*ua(2,jj,jk) 248 END DO 249 END DO 250 251 DO jj=1,jpj 252 IF (umask(2,jj,1).NE.0.) THEN 253 spgu(2,jj)=spgu(2,jj)*hur_a(2,jj) 254 ENDIF 255 END DO 256 #else 257 spgu(2,:) = ua_b(2,:) 258 #endif 259 260 DO jk=1,jpkm1 261 DO jj=1,jpj 262 ua(2,jj,jk) = 0.25*(ua(1,jj,jk)+2.*ua(2,jj,jk)+ua(3,jj,jk)) 263 ua(2,jj,jk) = ua(2,jj,jk) * umask(2,jj,jk) 264 END DO 265 END DO 266 267 spgu1(2,:)=0. 268 269 DO jk=1,jpkm1 270 DO jj=1,jpj 271 spgu1(2,jj)=spgu1(2,jj)+fse3u_a(2,jj,jk)*ua(2,jj,jk) 272 END DO 273 END DO 274 275 DO jj=1,jpj 276 IF (umask(2,jj,1).NE.0.) THEN 277 spgu1(2,jj)=spgu1(2,jj)*hur_a(2,jj) 278 ENDIF 279 END DO 280 281 DO jk=1,jpkm1 282 DO jj=1,jpj 283 ua(2,jj,jk) = (ua(2,jj,jk)+spgu(2,jj)-spgu1(2,jj))*umask(2,jj,jk) 284 END DO 285 END DO 286 287 DO jk=1,jpkm1 288 DO jj=1,jpj 289 va(2,jj,jk) = (zva(2,jj,jk)/(zrhox*e1v(2,jj)))*vmask(2,jj,jk) 290 va(2,jj,jk) = va(2,jj,jk) / fse3v_a(2,jj,jk) 291 END DO 292 END DO 293 294 #if defined key_dynspg_ts 295 ! Set tangential velocities to time splitting estimate 296 spgv1(2,:)=0. 297 DO jk=1,jpkm1 298 DO jj=1,jpj 299 spgv1(2,jj)=spgv1(2,jj)+fse3v_a(2,jj,jk)*va(2,jj,jk) 300 END DO 301 END DO 302 303 DO jj=1,jpj 304 spgv1(2,jj)=spgv1(2,jj)*hvr_a(2,jj) 305 END DO 306 307 DO jk=1,jpkm1 308 DO jj=1,jpj 309 va(2,jj,jk) = (va(2,jj,jk)+va_b(2,jj)-spgv1(2,jj))*vmask(2,jj,jk) 310 END DO 311 END DO 312 #endif 313 314 ENDIF 315 316 IF((nbondi == 1).OR.(nbondi == 2)) THEN 317 #if defined key_dynspg_flt 318 DO jj=1,jpj 319 laplacu(nlci-2,jj) = timeref * (zua2d(nlci-2,jj)/(zrhoy*e2u(nlci-2,jj))) 320 END DO 321 #endif 322 323 DO jk=1,jpkm1 324 DO jj=1,jpj 325 ua(nlci-2:nlci-1,jj,jk) = (zua(nlci-2:nlci-1,jj,jk)/(zrhoy*e2u(nlci-2:nlci-1,jj))) 326 ua(nlci-2:nlci-1,jj,jk) = ua(nlci-2:nlci-1,jj,jk) / fse3u_a(nlci-2:nlci-1,jj,jk) 327 END DO 328 END DO 329 330 #if defined key_dynspg_flt 331 DO jk=1,jpkm1 332 DO jj=1,jpj 333 ua(nlci-2,jj,jk) = (ua(nlci-2,jj,jk)- z2dt * znugdt * laplacu(nlci-2,jj))*umask(nlci-2,jj,jk) 334 END DO 335 END DO 336 337 338 spgu(nlci-2,:)=0. 339 340 do jk=1,jpkm1 341 do jj=1,jpj 342 spgu(nlci-2,jj)=spgu(nlci-2,jj)+fse3u_a(nlci-2,jj,jk)*ua(nlci-2,jj,jk) 343 enddo 344 enddo 345 346 DO jj=1,jpj 347 IF (umask(nlci-2,jj,1).NE.0.) THEN 348 spgu(nlci-2,jj)=spgu(nlci-2,jj)*hur_a(nlci-2,jj) 349 ENDIF 350 END DO 351 #else 352 spgu(nlci-2,:) = ua_b(nlci-2,:) 353 #endif 354 355 DO jk=1,jpkm1 356 DO jj=1,jpj 357 ua(nlci-2,jj,jk) = 0.25*(ua(nlci-3,jj,jk)+2.*ua(nlci-2,jj,jk)+ua(nlci-1,jj,jk)) 358 359 ua(nlci-2,jj,jk) = ua(nlci-2,jj,jk) * umask(nlci-2,jj,jk) 360 361 END DO 362 END DO 363 364 spgu1(nlci-2,:)=0. 365 366 DO jk=1,jpkm1 367 DO jj=1,jpj 368 spgu1(nlci-2,jj)=spgu1(nlci-2,jj)+fse3u_a(nlci-2,jj,jk)*ua(nlci-2,jj,jk)*umask(nlci-2,jj,jk) 369 END DO 370 END DO 371 372 DO jj=1,jpj 373 IF (umask(nlci-2,jj,1).NE.0.) THEN 374 spgu1(nlci-2,jj)=spgu1(nlci-2,jj)*hur_a(nlci-2,jj) 375 ENDIF 376 END DO 377 378 DO jk=1,jpkm1 379 DO jj=1,jpj 380 ua(nlci-2,jj,jk) = (ua(nlci-2,jj,jk)+spgu(nlci-2,jj)-spgu1(nlci-2,jj))*umask(nlci-2,jj,jk) 381 END DO 382 END DO 383 384 DO jk=1,jpkm1 385 DO jj=1,jpj-1 386 va(nlci-1,jj,jk) = (zva(nlci-1,jj,jk)/(zrhox*e1v(nlci-1,jj)))*vmask(nlci-1,jj,jk) 387 va(nlci-1,jj,jk) = va(nlci-1,jj,jk) / fse3v_a(nlci-1,jj,jk) 388 END DO 389 END DO 390 391 #if defined key_dynspg_ts 392 ! Set tangential velocities to time splitting estimate 393 spgv1(nlci-1,:)=0._wp 394 DO jk=1,jpkm1 395 DO jj=1,jpj 396 spgv1(nlci-1,jj)=spgv1(nlci-1,jj)+fse3v_a(nlci-1,jj,jk)*va(nlci-1,jj,jk)*vmask(nlci-1,jj,jk) 397 END DO 398 END DO 399 400 DO jj=1,jpj 401 spgv1(nlci-1,jj)=spgv1(nlci-1,jj)*hvr_a(nlci-1,jj) 402 END DO 403 404 DO jk=1,jpkm1 405 DO jj=1,jpj 406 va(nlci-1,jj,jk) = (va(nlci-1,jj,jk)+va_b(nlci-1,jj)-spgv1(nlci-1,jj))*vmask(nlci-1,jj,jk) 407 END DO 408 END DO 409 #endif 410 411 ENDIF 412 413 IF((nbondj == -1).OR.(nbondj == 2)) THEN 414 415 #if defined key_dynspg_flt 416 DO ji=1,jpi 417 laplacv(ji,2) = timeref * (zva2d(ji,2)/(zrhox*e1v(ji,2))) 418 END DO 419 #endif 420 249 va_b(ji,2) = va_b(ji,2) + e3v_a(ji,2,jk) * va(ji,2,jk) 250 END DO 251 END DO 252 DO ji=1,jpi 253 va_b(ji,2) = va_b(ji,2) * r1_hv_a(ji,2) 254 END DO 255 ENDIF 256 ! 257 DO jk = 1, jpkm1 ! Smooth 258 DO ji = i1, i2 259 va(ji,2,jk) = 0.25_wp * vmask(ji,2,jk) & 260 & * ( va(ji,1,jk) + 2._wp*va(ji,2,jk) + va(ji,3,jk) ) 261 END DO 262 END DO 263 ! 264 zvb(:,2) = 0._wp ! Correct transport 421 265 DO jk=1,jpkm1 422 266 DO ji=1,jpi 423 va(ji,1:2,jk) = (zva(ji,1:2,jk)/(zrhox*e1v(ji,1:2))) 424 va(ji,1:2,jk) = va(ji,1:2,jk) / fse3v_a(ji,1:2,jk) 425 END DO 426 END DO 427 428 #if defined key_dynspg_flt 429 DO jk=1,jpkm1 430 DO ji=1,jpi 431 va(ji,2,jk) = (va(ji,2,jk) - z2dt * znugdt * laplacv(ji,2))*vmask(ji,2,jk) 432 END DO 433 END DO 434 435 spgv(:,2)=0. 436 437 DO jk=1,jpkm1 438 DO ji=1,jpi 439 spgv(ji,2)=spgv(ji,2)+fse3v_a(ji,2,jk)*va(ji,2,jk) 440 END DO 441 END DO 442 443 DO ji=1,jpi 444 IF (vmask(ji,2,1).NE.0.) THEN 445 spgv(ji,2)=spgv(ji,2)*hvr_a(ji,2) 446 ENDIF 447 END DO 448 #else 449 spgv(:,2)=va_b(:,2) 450 #endif 451 452 DO jk=1,jpkm1 453 DO ji=1,jpi 454 va(ji,2,jk)=0.25*(va(ji,1,jk)+2.*va(ji,2,jk)+va(ji,3,jk)) 455 va(ji,2,jk)=va(ji,2,jk)*vmask(ji,2,jk) 456 END DO 457 END DO 458 459 spgv1(:,2)=0. 460 461 DO jk=1,jpkm1 462 DO ji=1,jpi 463 spgv1(ji,2)=spgv1(ji,2)+fse3v_a(ji,2,jk)*va(ji,2,jk)*vmask(ji,2,jk) 464 END DO 465 END DO 466 467 DO ji=1,jpi 468 IF (vmask(ji,2,1).NE.0.) THEN 469 spgv1(ji,2)=spgv1(ji,2)*hvr_a(ji,2) 470 ENDIF 471 END DO 472 473 DO jk=1,jpkm1 474 DO ji=1,jpi 475 va(ji,2,jk) = (va(ji,2,jk)+spgv(ji,2)-spgv1(ji,2))*vmask(ji,2,jk) 476 END DO 477 END DO 478 479 DO jk=1,jpkm1 480 DO ji=1,jpi 481 ua(ji,2,jk) = (zua(ji,2,jk)/(zrhoy*e2u(ji,2)))*umask(ji,2,jk) 482 ua(ji,2,jk) = ua(ji,2,jk) / fse3u_a(ji,2,jk) 483 END DO 484 END DO 485 486 #if defined key_dynspg_ts 267 zvb(ji,2) = zvb(ji,2) + e3v_a(ji,2,jk) * va(ji,2,jk) * vmask(ji,2,jk) 268 END DO 269 END DO 270 DO ji = 1, jpi 271 zvb(ji,2) = zvb(ji,2) * r1_hv_a(ji,2) 272 END DO 273 DO jk = 1, jpkm1 274 DO ji = 1, jpi 275 va(ji,2,jk) = ( va(ji,2,jk) + va_b(ji,2) - zvb(ji,2) ) * vmask(ji,2,jk) 276 END DO 277 END DO 278 487 279 ! Set tangential velocities to time splitting estimate 488 spgu1(:,2)=0._wp 489 DO jk=1,jpkm1 490 DO ji=1,jpi 491 spgu1(ji,2)=spgu1(ji,2)+fse3u_a(ji,2,jk)*ua(ji,2,jk)*umask(ji,2,jk) 492 END DO 493 END DO 494 495 DO ji=1,jpi 496 spgu1(ji,2)=spgu1(ji,2)*hur_a(ji,2) 497 END DO 498 499 DO jk=1,jpkm1 500 DO ji=1,jpi 501 ua(ji,2,jk) = (ua(ji,2,jk)+ua_b(ji,2)-spgu1(ji,2))*umask(ji,2,jk) 502 END DO 503 END DO 504 #endif 505 ENDIF 506 507 IF((nbondj == 1).OR.(nbondj == 2)) THEN 508 509 #if defined key_dynspg_flt 510 DO ji=1,jpi 511 laplacv(ji,nlcj-2) = timeref * (zva2d(ji,nlcj-2)/(zrhox*e1v(ji,nlcj-2))) 512 END DO 513 #endif 514 515 DO jk=1,jpkm1 516 DO ji=1,jpi 517 va(ji,nlcj-2:nlcj-1,jk) = (zva(ji,nlcj-2:nlcj-1,jk)/(zrhox*e1v(ji,nlcj-2:nlcj-1))) 518 va(ji,nlcj-2:nlcj-1,jk) = va(ji,nlcj-2:nlcj-1,jk) / fse3v_a(ji,nlcj-2:nlcj-1,jk) 519 END DO 520 END DO 521 522 #if defined key_dynspg_flt 523 DO jk=1,jpkm1 524 DO ji=1,jpi 525 va(ji,nlcj-2,jk) = (va(ji,nlcj-2,jk)-z2dt * znugdt * laplacv(ji,nlcj-2))*vmask(ji,nlcj-2,jk) 526 END DO 527 END DO 528 529 spgv(:,nlcj-2)=0. 530 531 DO jk=1,jpkm1 532 DO ji=1,jpi 533 spgv(ji,nlcj-2)=spgv(ji,nlcj-2)+fse3v_a(ji,nlcj-2,jk)*va(ji,nlcj-2,jk) 534 END DO 535 END DO 536 537 DO ji=1,jpi 538 IF (vmask(ji,nlcj-2,1).NE.0.) THEN 539 spgv(ji,nlcj-2)=spgv(ji,nlcj-2)*hvr_a(ji,nlcj-2) 540 ENDIF 541 END DO 542 #else 543 spgv(:,nlcj-2)=va_b(:,nlcj-2) 544 #endif 545 546 DO jk=1,jpkm1 547 DO ji=1,jpi 548 va(ji,nlcj-2,jk)=0.25*(va(ji,nlcj-3,jk)+2.*va(ji,nlcj-2,jk)+va(ji,nlcj-1,jk)) 549 va(ji,nlcj-2,jk) = va(ji,nlcj-2,jk) * vmask(ji,nlcj-2,jk) 550 END DO 551 END DO 552 553 spgv1(:,nlcj-2)=0. 554 555 DO jk=1,jpkm1 556 DO ji=1,jpi 557 spgv1(ji,nlcj-2)=spgv1(ji,nlcj-2)+fse3v_a(ji,nlcj-2,jk)*va(ji,nlcj-2,jk) 558 END DO 559 END DO 560 561 DO ji=1,jpi 562 IF (vmask(ji,nlcj-2,1).NE.0.) THEN 563 spgv1(ji,nlcj-2)=spgv1(ji,nlcj-2)*hvr_a(ji,nlcj-2) 564 ENDIF 565 END DO 566 567 DO jk=1,jpkm1 568 DO ji=1,jpi 569 va(ji,nlcj-2,jk) = (va(ji,nlcj-2,jk)+spgv(ji,nlcj-2)-spgv1(ji,nlcj-2))*vmask(ji,nlcj-2,jk) 570 END DO 571 END DO 572 573 DO jk=1,jpkm1 574 DO ji=1,jpi 575 ua(ji,nlcj-1,jk) = (zua(ji,nlcj-1,jk)/(zrhoy*e2u(ji,nlcj-1)))*umask(ji,nlcj-1,jk) 576 ua(ji,nlcj-1,jk) = ua(ji,nlcj-1,jk) / fse3u_a(ji,nlcj-1,jk) 577 END DO 578 END DO 579 580 #if defined key_dynspg_ts 280 !----------------------------------------------------- 281 IF( ln_dynspg_ts ) THEN 282 zub(:,2) = 0._wp 283 DO jk = 1, jpkm1 284 DO ji = 1, jpi 285 zub(ji,2) = zub(ji,2) + e3u_a(ji,2,jk) * ua(ji,2,jk) * umask(ji,2,jk) 286 END DO 287 END DO 288 DO ji = 1, jpi 289 zub(ji,2) = zub(ji,2) * r1_hu_a(ji,2) 290 END DO 291 292 DO jk = 1, jpkm1 293 DO ji = 1, jpi 294 ua(ji,2,jk) = ( ua(ji,2,jk) + ua_b(ji,2) - zub(ji,2) ) * umask(ji,2,jk) 295 END DO 296 END DO 297 ENDIF 298 299 ! Mask domain edges: 300 !------------------- 301 DO jk = 1, jpkm1 302 DO ji = 1, jpi 303 ua(ji,1,jk) = 0._wp 304 va(ji,1,jk) = 0._wp 305 END DO 306 END DO 307 308 ENDIF 309 310 IF( nbondj == 1 .OR. nbondj == 2 ) THEN 311 ! 312 ! Smoothing 313 ! --------- 314 IF( .NOT.ln_dynspg_ts ) THEN ! Store transport 315 va_b(:,nlcj-2) = 0._wp 316 DO jk = 1, jpkm1 317 DO ji = 1, jpi 318 va_b(ji,nlcj-2) = va_b(ji,nlcj-2) + e3v_a(ji,nlcj-2,jk) * va(ji,nlcj-2,jk) 319 END DO 320 END DO 321 DO ji = 1, jpi 322 va_b(ji,nlcj-2) = va_b(ji,nlcj-2) * r1_hv_a(ji,nlcj-2) 323 END DO 324 ENDIF 325 ! 326 DO jk = 1, jpkm1 ! Smooth 327 DO ji = i1, i2 328 va(ji,nlcj-2,jk) = 0.25_wp * vmask(ji,nlcj-2,jk) & 329 & * ( va(ji,nlcj-3,jk) + 2._wp * va(ji,nlcj-2,jk) + va(ji,nlcj-1,jk) ) 330 END DO 331 END DO 332 ! 333 zvb(:,nlcj-2) = 0._wp ! Correct transport 334 DO jk = 1, jpkm1 335 DO ji = 1, jpi 336 zvb(ji,nlcj-2) = zvb(ji,nlcj-2) + e3v_a(ji,nlcj-2,jk) * va(ji,nlcj-2,jk) * vmask(ji,nlcj-2,jk) 337 END DO 338 END DO 339 DO ji = 1, jpi 340 zvb(ji,nlcj-2) = zvb(ji,nlcj-2) * r1_hv_a(ji,nlcj-2) 341 END DO 342 DO jk = 1, jpkm1 343 DO ji = 1, jpi 344 va(ji,nlcj-2,jk) = ( va(ji,nlcj-2,jk) + va_b(ji,nlcj-2) - zvb(ji,nlcj-2) ) * vmask(ji,nlcj-2,jk) 345 END DO 346 END DO 347 ! 581 348 ! Set tangential velocities to time splitting estimate 582 spgu1(:,nlcj-1)=0._wp 583 DO jk=1,jpkm1 584 DO ji=1,jpi 585 spgu1(ji,nlcj-1)=spgu1(ji,nlcj-1)+fse3u_a(ji,nlcj-1,jk)*ua(ji,nlcj-1,jk) 586 END DO 587 END DO 588 589 DO ji=1,jpi 590 spgu1(ji,nlcj-1)=spgu1(ji,nlcj-1)*hur_a(ji,nlcj-1) 591 END DO 592 593 DO jk=1,jpkm1 594 DO ji=1,jpi 595 ua(ji,nlcj-1,jk) = (ua(ji,nlcj-1,jk)+ua_b(ji,nlcj-1)-spgu1(ji,nlcj-1))*umask(ji,nlcj-1,jk) 596 END DO 597 END DO 598 #endif 599 600 ENDIF 601 ! 602 CALL wrk_dealloc( jpi, jpj, spgv1, spgu1, zua2d, zva2d ) 603 CALL wrk_dealloc( jpi, jpj, jpk, zua, zva ) 349 !----------------------------------------------------- 350 IF( ln_dynspg_ts ) THEN 351 zub(:,nlcj-1) = 0._wp 352 DO jk = 1, jpkm1 353 DO ji = 1, jpi 354 zub(ji,nlcj-1) = zub(ji,nlcj-1) + e3u_a(ji,nlcj-1,jk) * ua(ji,nlcj-1,jk) * umask(ji,nlcj-1,jk) 355 END DO 356 END DO 357 DO ji = 1, jpi 358 zub(ji,nlcj-1) = zub(ji,nlcj-1) * r1_hu_a(ji,nlcj-1) 359 END DO 360 ! 361 DO jk = 1, jpkm1 362 DO ji = 1, jpi 363 ua(ji,nlcj-1,jk) = ( ua(ji,nlcj-1,jk) + ua_b(ji,nlcj-1) - zub(ji,nlcj-1) ) * umask(ji,nlcj-1,jk) 364 END DO 365 END DO 366 ENDIF 367 ! 368 ! Mask domain edges: 369 !------------------- 370 DO jk = 1, jpkm1 371 DO ji = 1, jpi 372 ua(ji,nlcj ,jk) = 0._wp 373 va(ji,nlcj-1,jk) = 0._wp 374 END DO 375 END DO 376 ! 377 ENDIF 378 ! 379 CALL wrk_dealloc( jpi,jpj, zub, zvb ) 604 380 ! 605 381 END SUBROUTINE Agrif_dyn 382 606 383 607 384 SUBROUTINE Agrif_dyn_ts( jn ) … … 614 391 INTEGER :: ji, jj 615 392 !!---------------------------------------------------------------------- 616 393 ! 617 394 IF( Agrif_Root() ) RETURN 618 395 ! 619 396 IF((nbondi == -1).OR.(nbondi == 2)) THEN 620 397 DO jj=1,jpj 621 398 va_e(2,jj) = vbdy_w(jj) * hvr_e(2,jj) 622 ! Specified fluxes:399 ! Specified fluxes: 623 400 ua_e(2,jj) = ubdy_w(jj) * hur_e(2,jj) 624 ! Characteristics method:625 !alt ua_e(2,jj) = 0.5_wp * ( ubdy_w(jj) * hur_e(2,jj) + ua_e(3,jj) &626 !alt & - sqrt(grav * hur_e(2,jj)) * (sshn_e(3,jj) - hbdy_w(jj)) )627 END DO 628 ENDIF 629 401 ! Characteristics method: 402 !alt ua_e(2,jj) = 0.5_wp * ( ubdy_w(jj) * hur_e(2,jj) + ua_e(3,jj) & 403 !alt & - sqrt(grav * hur_e(2,jj)) * (sshn_e(3,jj) - hbdy_w(jj)) ) 404 END DO 405 ENDIF 406 ! 630 407 IF((nbondi == 1).OR.(nbondi == 2)) THEN 631 408 DO jj=1,jpj 632 409 va_e(nlci-1,jj) = vbdy_e(jj) * hvr_e(nlci-1,jj) 633 ! Specified fluxes:410 ! Specified fluxes: 634 411 ua_e(nlci-2,jj) = ubdy_e(jj) * hur_e(nlci-2,jj) 635 ! Characteristics method:636 !alt ua_e(nlci-2,jj) = 0.5_wp * ( ubdy_e(jj) * hur_e(nlci-2,jj) + ua_e(nlci-3,jj) &637 !alt & + sqrt(grav * hur_e(nlci-2,jj)) * (sshn_e(nlci-2,jj) - hbdy_e(jj)) )638 END DO 639 ENDIF 640 412 ! Characteristics method: 413 !alt ua_e(nlci-2,jj) = 0.5_wp * ( ubdy_e(jj) * hur_e(nlci-2,jj) + ua_e(nlci-3,jj) & 414 !alt & + sqrt(grav * hur_e(nlci-2,jj)) * (sshn_e(nlci-2,jj) - hbdy_e(jj)) ) 415 END DO 416 ENDIF 417 ! 641 418 IF((nbondj == -1).OR.(nbondj == 2)) THEN 642 419 DO ji=1,jpi 643 420 ua_e(ji,2) = ubdy_s(ji) * hur_e(ji,2) 644 ! Specified fluxes:421 ! Specified fluxes: 645 422 va_e(ji,2) = vbdy_s(ji) * hvr_e(ji,2) 646 ! Characteristics method:647 !alt va_e(ji,2) = 0.5_wp * ( vbdy_s(ji) * hvr_e(ji,2) + va_e(ji,3) &648 !alt & - sqrt(grav * hvr_e(ji,2)) * (sshn_e(ji,3) - hbdy_s(ji)) )649 END DO 650 ENDIF 651 423 ! Characteristics method: 424 !alt va_e(ji,2) = 0.5_wp * ( vbdy_s(ji) * hvr_e(ji,2) + va_e(ji,3) & 425 !alt & - sqrt(grav * hvr_e(ji,2)) * (sshn_e(ji,3) - hbdy_s(ji)) ) 426 END DO 427 ENDIF 428 ! 652 429 IF((nbondj == 1).OR.(nbondj == 2)) THEN 653 430 DO ji=1,jpi 654 431 ua_e(ji,nlcj-1) = ubdy_n(ji) * hur_e(ji,nlcj-1) 655 ! Specified fluxes:432 ! Specified fluxes: 656 433 va_e(ji,nlcj-2) = vbdy_n(ji) * hvr_e(ji,nlcj-2) 657 ! Characteristics method:658 !alt va_e(ji,nlcj-2) = 0.5_wp * ( vbdy_n(ji) * hvr_e(ji,nlcj-2) + va_e(ji,nlcj-3) &659 !alt & + sqrt(grav * hvr_e(ji,nlcj-2)) * (sshn_e(ji,nlcj-2) - hbdy_n(ji)) )434 ! Characteristics method: 435 !alt va_e(ji,nlcj-2) = 0.5_wp * ( vbdy_n(ji) * hvr_e(ji,nlcj-2) + va_e(ji,nlcj-3) & 436 !alt & + sqrt(grav * hvr_e(ji,nlcj-2)) * (sshn_e(ji,nlcj-2) - hbdy_n(ji)) ) 660 437 END DO 661 438 ENDIF 662 439 ! 663 440 END SUBROUTINE Agrif_dyn_ts 441 664 442 665 443 SUBROUTINE Agrif_dta_ts( kt ) … … 672 450 INTEGER :: ji, jj 673 451 LOGICAL :: ll_int_cons 674 REAL(wp) :: zrhox, zrhoy, zrhot, zt 675 REAL(wp) :: zaa, zab, zat 676 REAL(wp) :: zt0, zt1 677 REAL(wp), POINTER, DIMENSION(:,:) :: zunb, zvnb, zsshn 678 REAL(wp), POINTER, DIMENSION(:,:) :: zuab, zvab, zubb, zvbb, zutn, zvtn 679 !!---------------------------------------------------------------------- 680 452 REAL(wp) :: zrhot, zt 453 !!---------------------------------------------------------------------- 454 ! 681 455 IF( Agrif_Root() ) RETURN 682 683 ll_int_cons = ln_bt_fw ! Assume conservative temporal integration in 684 ! the forward case only 685 686 zrhox = Agrif_Rhox() 687 zrhoy = Agrif_Rhoy() 456 ! 457 ll_int_cons = ln_bt_fw ! Assume conservative temporal integration in the forward case only 458 ! 688 459 zrhot = Agrif_rhot() 689 690 IF ( kt==nit000 ) THEN ! Allocate boundary data arrays 691 ALLOCATE( ubdy_w(jpj), vbdy_w(jpj), hbdy_w(jpj)) 692 ALLOCATE( ubdy_e(jpj), vbdy_e(jpj), hbdy_e(jpj)) 693 ALLOCATE( ubdy_n(jpi), vbdy_n(jpi), hbdy_n(jpi)) 694 ALLOCATE( ubdy_s(jpi), vbdy_s(jpi), hbdy_s(jpi)) 695 ENDIF 696 697 CALL wrk_alloc( jpi, jpj, zunb, zvnb, zsshn ) 698 460 ! 699 461 ! "Central" time index for interpolation: 700 IF (ln_bt_fw) THEN701 zt = REAL( Agrif_NbStepint()+0.5_wp,wp) / zrhot462 IF( ln_bt_fw ) THEN 463 zt = REAL( Agrif_NbStepint()+0.5_wp, wp ) / zrhot 702 464 ELSE 703 zt = REAL( Agrif_NbStepint(),wp) / zrhot704 ENDIF 705 465 zt = REAL( Agrif_NbStepint() , wp ) / zrhot 466 ENDIF 467 ! 706 468 ! Linear interpolation of sea level 707 Agrif_SpecialValue = 0. e0469 Agrif_SpecialValue = 0._wp 708 470 Agrif_UseSpecialValue = .TRUE. 709 CALL Agrif_Bc_variable( zsshn, sshn_id,calledweight=zt, procname=interpsshn )471 CALL Agrif_Bc_variable( sshn_id, calledweight=zt, procname=interpsshn ) 710 472 Agrif_UseSpecialValue = .FALSE. 711 473 ! 712 474 ! Interpolate barotropic fluxes 713 475 Agrif_SpecialValue=0. 714 476 Agrif_UseSpecialValue = ln_spc_dyn 715 716 IF (ll_int_cons) THEN ! Conservative interpolation 717 CALL wrk_alloc( jpi, jpj, zuab, zvab, zubb, zvbb, zutn, zvtn ) 718 zuab(:,:) = 0._wp ; zvab(:,:) = 0._wp 719 zubb(:,:) = 0._wp ; zvbb(:,:) = 0._wp 720 zutn(:,:) = 0._wp ; zvtn(:,:) = 0._wp 721 CALL Agrif_Bc_variable(zubb,unb_id ,calledweight=0._wp, procname=interpunb) ! Before 722 CALL Agrif_Bc_variable(zvbb,vnb_id ,calledweight=0._wp, procname=interpvnb) 723 CALL Agrif_Bc_variable(zuab,unb_id ,calledweight=1._wp, procname=interpunb) ! After 724 CALL Agrif_Bc_variable(zvab,vnb_id ,calledweight=1._wp, procname=interpvnb) 725 CALL Agrif_Bc_variable(zutn,ub2b_id,calledweight=1._wp, procname=interpub2b)! Time integrated 726 CALL Agrif_Bc_variable(zvtn,vb2b_id,calledweight=1._wp, procname=interpvb2b) 727 477 ! 478 IF( ll_int_cons ) THEN ! Conservative interpolation 479 ! orders matters here !!!!!! 480 CALL Agrif_Bc_variable( ub2b_interp_id, calledweight=1._wp, procname=interpub2b ) ! Time integrated 481 CALL Agrif_Bc_variable( vb2b_interp_id, calledweight=1._wp, procname=interpvb2b ) 482 bdy_tinterp = 1 483 CALL Agrif_Bc_variable( unb_id , calledweight=1._wp, procname=interpunb ) ! After 484 CALL Agrif_Bc_variable( vnb_id , calledweight=1._wp, procname=interpvnb ) 485 bdy_tinterp = 2 486 CALL Agrif_Bc_variable( unb_id , calledweight=0._wp, procname=interpunb ) ! Before 487 CALL Agrif_Bc_variable( vnb_id , calledweight=0._wp, procname=interpvnb ) 488 ELSE ! Linear interpolation 489 bdy_tinterp = 0 490 ubdy_w(:) = 0._wp ; vbdy_w(:) = 0._wp 491 ubdy_e(:) = 0._wp ; vbdy_e(:) = 0._wp 492 ubdy_n(:) = 0._wp ; vbdy_n(:) = 0._wp 493 ubdy_s(:) = 0._wp ; vbdy_s(:) = 0._wp 494 CALL Agrif_Bc_variable( unb_id, calledweight=zt, procname=interpunb ) 495 CALL Agrif_Bc_variable( vnb_id, calledweight=zt, procname=interpvnb ) 496 ENDIF 497 Agrif_UseSpecialValue = .FALSE. 498 ! 499 END SUBROUTINE Agrif_dta_ts 500 501 502 SUBROUTINE Agrif_ssh( kt ) 503 !!---------------------------------------------------------------------- 504 !! *** ROUTINE Agrif_DYN *** 505 !!---------------------------------------------------------------------- 506 INTEGER, INTENT(in) :: kt 507 !! 508 !!---------------------------------------------------------------------- 509 ! 510 IF( Agrif_Root() ) RETURN 511 ! 512 IF((nbondi == -1).OR.(nbondi == 2)) THEN 513 ssha(2,:)=ssha(3,:) 514 sshn(2,:)=sshn(3,:) 515 ENDIF 516 ! 517 IF((nbondi == 1).OR.(nbondi == 2)) THEN 518 ssha(nlci-1,:)=ssha(nlci-2,:) 519 sshn(nlci-1,:)=sshn(nlci-2,:) 520 ENDIF 521 ! 522 IF((nbondj == -1).OR.(nbondj == 2)) THEN 523 ssha(:,2)=ssha(:,3) 524 sshn(:,2)=sshn(:,3) 525 ENDIF 526 ! 527 IF((nbondj == 1).OR.(nbondj == 2)) THEN 528 ssha(:,nlcj-1)=ssha(:,nlcj-2) 529 sshn(:,nlcj-1)=sshn(:,nlcj-2) 530 ENDIF 531 ! 532 END SUBROUTINE Agrif_ssh 533 534 535 SUBROUTINE Agrif_ssh_ts( jn ) 536 !!---------------------------------------------------------------------- 537 !! *** ROUTINE Agrif_ssh_ts *** 538 !!---------------------------------------------------------------------- 539 INTEGER, INTENT(in) :: jn 540 !! 541 INTEGER :: ji,jj 542 !!---------------------------------------------------------------------- 543 ! 544 IF((nbondi == -1).OR.(nbondi == 2)) THEN 545 DO jj = 1, jpj 546 ssha_e(2,jj) = hbdy_w(jj) 547 END DO 548 ENDIF 549 ! 550 IF((nbondi == 1).OR.(nbondi == 2)) THEN 551 DO jj = 1, jpj 552 ssha_e(nlci-1,jj) = hbdy_e(jj) 553 END DO 554 ENDIF 555 ! 556 IF((nbondj == -1).OR.(nbondj == 2)) THEN 557 DO ji = 1, jpi 558 ssha_e(ji,2) = hbdy_s(ji) 559 END DO 560 ENDIF 561 ! 562 IF((nbondj == 1).OR.(nbondj == 2)) THEN 563 DO ji = 1, jpi 564 ssha_e(ji,nlcj-1) = hbdy_n(ji) 565 END DO 566 ENDIF 567 ! 568 END SUBROUTINE Agrif_ssh_ts 569 570 # if defined key_zdftke 571 572 SUBROUTINE Agrif_tke 573 !!---------------------------------------------------------------------- 574 !! *** ROUTINE Agrif_tke *** 575 !!---------------------------------------------------------------------- 576 REAL(wp) :: zalpha 577 !!---------------------------------------------------------------------- 578 ! 579 zalpha = REAL( Agrif_NbStepint() + Agrif_IRhot() - 1, wp ) / REAL( Agrif_IRhot(), wp ) 580 IF( zalpha > 1. ) zalpha = 1. 581 ! 582 Agrif_SpecialValue = 0.e0 583 Agrif_UseSpecialValue = .TRUE. 584 ! 585 CALL Agrif_Bc_variable(avm_id ,calledweight=zalpha, procname=interpavm) 586 ! 587 Agrif_UseSpecialValue = .FALSE. 588 ! 589 END SUBROUTINE Agrif_tke 590 591 # endif 592 593 SUBROUTINE interptsn( ptab, i1, i2, j1, j2, k1, k2, n1, n2, before, nb, ndir ) 594 !!---------------------------------------------------------------------- 595 !! *** ROUTINE interptsn *** 596 !!---------------------------------------------------------------------- 597 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: ptab 598 INTEGER , INTENT(in ) :: i1, i2, j1, j2, k1, k2, n1, n2 599 LOGICAL , INTENT(in ) :: before 600 INTEGER , INTENT(in ) :: nb , ndir 601 ! 602 INTEGER :: ji, jj, jk, jn ! dummy loop indices 603 INTEGER :: imin, imax, jmin, jmax 604 REAL(wp) :: zrhox , zalpha1, zalpha2, zalpha3 605 REAL(wp) :: zalpha4, zalpha5, zalpha6, zalpha7 606 LOGICAL :: western_side, eastern_side,northern_side,southern_side 607 !!---------------------------------------------------------------------- 608 ! 609 IF (before) THEN 610 ptab(i1:i2,j1:j2,k1:k2,n1:n2) = tsn(i1:i2,j1:j2,k1:k2,n1:n2) 611 ELSE 612 ! 613 western_side = (nb == 1).AND.(ndir == 1) 614 eastern_side = (nb == 1).AND.(ndir == 2) 615 southern_side = (nb == 2).AND.(ndir == 1) 616 northern_side = (nb == 2).AND.(ndir == 2) 617 ! 618 zrhox = Agrif_Rhox() 619 ! 620 zalpha1 = ( zrhox - 1. ) * 0.5 621 zalpha2 = 1. - zalpha1 622 ! 623 zalpha3 = ( zrhox - 1. ) / ( zrhox + 1. ) 624 zalpha4 = 1. - zalpha3 625 ! 626 zalpha6 = 2. * ( zrhox - 1. ) / ( zrhox + 1. ) 627 zalpha7 = - ( zrhox - 1. ) / ( zrhox + 3. ) 628 zalpha5 = 1. - zalpha6 - zalpha7 629 ! 630 imin = i1 631 imax = i2 632 jmin = j1 633 jmax = j2 634 ! 635 ! Remove CORNERS 636 IF((nbondj == -1).OR.(nbondj == 2)) jmin = 3 637 IF((nbondj == +1).OR.(nbondj == 2)) jmax = nlcj-2 638 IF((nbondi == -1).OR.(nbondi == 2)) imin = 3 639 IF((nbondi == +1).OR.(nbondi == 2)) imax = nlci-2 640 ! 641 IF( eastern_side ) THEN 642 DO jn = 1, jpts 643 tsa(nlci,j1:j2,k1:k2,jn) = zalpha1 * ptab(nlci,j1:j2,k1:k2,jn) + zalpha2 * ptab(nlci-1,j1:j2,k1:k2,jn) 644 DO jk = 1, jpkm1 645 DO jj = jmin,jmax 646 IF( umask(nlci-2,jj,jk) == 0._wp ) THEN 647 tsa(nlci-1,jj,jk,jn) = tsa(nlci,jj,jk,jn) * tmask(nlci-1,jj,jk) 648 ELSE 649 tsa(nlci-1,jj,jk,jn)=(zalpha4*tsa(nlci,jj,jk,jn)+zalpha3*tsa(nlci-2,jj,jk,jn))*tmask(nlci-1,jj,jk) 650 IF( un(nlci-2,jj,jk) > 0._wp ) THEN 651 tsa(nlci-1,jj,jk,jn)=( zalpha6*tsa(nlci-2,jj,jk,jn)+zalpha5*tsa(nlci,jj,jk,jn) & 652 + zalpha7*tsa(nlci-3,jj,jk,jn) ) * tmask(nlci-1,jj,jk) 653 ENDIF 654 ENDIF 655 END DO 656 END DO 657 tsa(nlci,j1:j2,k1:k2,jn) = 0._wp 658 END DO 659 ENDIF 660 ! 661 IF( northern_side ) THEN 662 DO jn = 1, jpts 663 tsa(i1:i2,nlcj,k1:k2,jn) = zalpha1 * ptab(i1:i2,nlcj,k1:k2,jn) + zalpha2 * ptab(i1:i2,nlcj-1,k1:k2,jn) 664 DO jk = 1, jpkm1 665 DO ji = imin,imax 666 IF( vmask(ji,nlcj-2,jk) == 0._wp ) THEN 667 tsa(ji,nlcj-1,jk,jn) = tsa(ji,nlcj,jk,jn) * tmask(ji,nlcj-1,jk) 668 ELSE 669 tsa(ji,nlcj-1,jk,jn)=(zalpha4*tsa(ji,nlcj,jk,jn)+zalpha3*tsa(ji,nlcj-2,jk,jn))*tmask(ji,nlcj-1,jk) 670 IF (vn(ji,nlcj-2,jk) > 0._wp ) THEN 671 tsa(ji,nlcj-1,jk,jn)=( zalpha6*tsa(ji,nlcj-2,jk,jn)+zalpha5*tsa(ji,nlcj,jk,jn) & 672 + zalpha7*tsa(ji,nlcj-3,jk,jn) ) * tmask(ji,nlcj-1,jk) 673 ENDIF 674 ENDIF 675 END DO 676 END DO 677 tsa(i1:i2,nlcj,k1:k2,jn) = 0._wp 678 END DO 679 ENDIF 680 ! 681 IF( western_side ) THEN 682 DO jn = 1, jpts 683 tsa(1,j1:j2,k1:k2,jn) = zalpha1 * ptab(1,j1:j2,k1:k2,jn) + zalpha2 * ptab(2,j1:j2,k1:k2,jn) 684 DO jk = 1, jpkm1 685 DO jj = jmin,jmax 686 IF( umask(2,jj,jk) == 0._wp ) THEN 687 tsa(2,jj,jk,jn) = tsa(1,jj,jk,jn) * tmask(2,jj,jk) 688 ELSE 689 tsa(2,jj,jk,jn)=(zalpha4*tsa(1,jj,jk,jn)+zalpha3*tsa(3,jj,jk,jn))*tmask(2,jj,jk) 690 IF( un(2,jj,jk) < 0._wp ) THEN 691 tsa(2,jj,jk,jn)=(zalpha6*tsa(3,jj,jk,jn)+zalpha5*tsa(1,jj,jk,jn)+zalpha7*tsa(4,jj,jk,jn))*tmask(2,jj,jk) 692 ENDIF 693 ENDIF 694 END DO 695 END DO 696 tsa(1,j1:j2,k1:k2,jn) = 0._wp 697 END DO 698 ENDIF 699 ! 700 IF( southern_side ) THEN 701 DO jn = 1, jpts 702 tsa(i1:i2,1,k1:k2,jn) = zalpha1 * ptab(i1:i2,1,k1:k2,jn) + zalpha2 * ptab(i1:i2,2,k1:k2,jn) 703 DO jk = 1, jpk 704 DO ji=imin,imax 705 IF( vmask(ji,2,jk) == 0._wp ) THEN 706 tsa(ji,2,jk,jn)=tsa(ji,1,jk,jn) * tmask(ji,2,jk) 707 ELSE 708 tsa(ji,2,jk,jn)=(zalpha4*tsa(ji,1,jk,jn)+zalpha3*tsa(ji,3,jk,jn))*tmask(ji,2,jk) 709 IF( vn(ji,2,jk) < 0._wp ) THEN 710 tsa(ji,2,jk,jn)=(zalpha6*tsa(ji,3,jk,jn)+zalpha5*tsa(ji,1,jk,jn)+zalpha7*tsa(ji,4,jk,jn))*tmask(ji,2,jk) 711 ENDIF 712 ENDIF 713 END DO 714 END DO 715 tsa(i1:i2,1,k1:k2,jn) = 0._wp 716 END DO 717 ENDIF 718 ! 719 ! Treatment of corners 720 ! 721 ! East south 722 IF ((eastern_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN 723 tsa(nlci-1,2,:,:) = ptab(nlci-1,2,:,:) 724 ENDIF 725 ! East north 726 IF ((eastern_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN 727 tsa(nlci-1,nlcj-1,:,:) = ptab(nlci-1,nlcj-1,:,:) 728 ENDIF 729 ! West south 730 IF ((western_side).AND.((nbondj == -1).OR.(nbondj == 2))) THEN 731 tsa(2,2,:,:) = ptab(2,2,:,:) 732 ENDIF 733 ! West north 734 IF ((western_side).AND.((nbondj == 1).OR.(nbondj == 2))) THEN 735 tsa(2,nlcj-1,:,:) = ptab(2,nlcj-1,:,:) 736 ENDIF 737 ! 738 ENDIF 739 ! 740 END SUBROUTINE interptsn 741 742 743 SUBROUTINE interpsshn( ptab, i1, i2, j1, j2, before, nb, ndir ) 744 !!---------------------------------------------------------------------- 745 !! *** ROUTINE interpsshn *** 746 !!---------------------------------------------------------------------- 747 INTEGER , INTENT(in ) :: i1, i2, j1, j2 748 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab 749 LOGICAL , INTENT(in ) :: before 750 INTEGER , INTENT(in ) :: nb , ndir 751 ! 752 LOGICAL :: western_side, eastern_side,northern_side,southern_side 753 !!---------------------------------------------------------------------- 754 ! 755 IF( before) THEN 756 ptab(i1:i2,j1:j2) = sshn(i1:i2,j1:j2) 757 ELSE 758 western_side = (nb == 1).AND.(ndir == 1) 759 eastern_side = (nb == 1).AND.(ndir == 2) 760 southern_side = (nb == 2).AND.(ndir == 1) 761 northern_side = (nb == 2).AND.(ndir == 2) 762 IF(western_side) hbdy_w(j1:j2) = ptab(i1,j1:j2) * tmask(i1,j1:j2,1) 763 IF(eastern_side) hbdy_e(j1:j2) = ptab(i1,j1:j2) * tmask(i1,j1:j2,1) 764 IF(southern_side) hbdy_s(i1:i2) = ptab(i1:i2,j1) * tmask(i1:i2,j1,1) 765 IF(northern_side) hbdy_n(i1:i2) = ptab(i1:i2,j1) * tmask(i1:i2,j1,1) 766 ENDIF 767 ! 768 END SUBROUTINE interpsshn 769 770 771 SUBROUTINE interpun( ptab, i1, i2, j1, j2, k1, k2, before ) 772 !!---------------------------------------------------------------------- 773 !! *** ROUTINE interpun *** 774 !!---------------------------------------------------------------------- 775 INTEGER , INTENT(in ) :: i1, i2, j1, j2, k1, k2 776 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 777 LOGICAL , INTENT(in ) :: before 778 ! 779 INTEGER :: ji, jj, jk 780 REAL(wp) :: zrhoy 781 !!---------------------------------------------------------------------- 782 ! 783 IF( before ) THEN 784 DO jk = k1, jpk 785 ptab(i1:i2,j1:j2,jk) = e2u(i1:i2,j1:j2) * e3u_n(i1:i2,j1:j2,jk) * un(i1:i2,j1:j2,jk) 786 END DO 787 ELSE 788 zrhoy = Agrif_Rhoy() 789 DO jk = 1, jpkm1 790 DO jj=j1,j2 791 ua(i1:i2,jj,jk) = ptab(i1:i2,jj,jk) / ( zrhoy * e2u(i1:i2,jj) * e3u_n(i1:i2,jj,jk) ) 792 END DO 793 END DO 794 ENDIF 795 ! 796 END SUBROUTINE interpun 797 798 799 SUBROUTINE interpvn( ptab, i1, i2, j1, j2, k1, k2, before ) 800 !!---------------------------------------------------------------------- 801 !! *** ROUTINE interpvn *** 802 !!---------------------------------------------------------------------- 803 INTEGER , INTENT(in ) :: i1, i2, j1, j2, k1, k2 804 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 805 LOGICAL , INTENT(in ) :: before 806 ! 807 INTEGER :: ji, jj, jk 808 REAL(wp) :: zrhox 809 !!---------------------------------------------------------------------- 810 ! 811 IF( before ) THEN !interpv entre 1 et k2 et interpv2d en jpkp1 812 DO jk = k1, jpk 813 ptab(i1:i2,j1:j2,jk) = e1v(i1:i2,j1:j2) * e3v_n(i1:i2,j1:j2,jk) * vn(i1:i2,j1:j2,jk) 814 END DO 815 ELSE 816 zrhox= Agrif_Rhox() 817 DO jk = 1, jpkm1 818 va(i1:i2,j1:j2,jk) = ptab(i1:i2,j1:j2,jk) / ( zrhox * e1v(i1:i2,j1:j2) * e3v_n(i1:i2,j1:j2,jk) ) 819 END DO 820 ENDIF 821 ! 822 END SUBROUTINE interpvn 823 824 825 SUBROUTINE interpunb( ptab, i1, i2, j1, j2, before, nb, ndir ) 826 !!---------------------------------------------------------------------- 827 !! *** ROUTINE interpunb *** 828 !!---------------------------------------------------------------------- 829 INTEGER , INTENT(in ) :: i1, i2, j1, j2 830 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab 831 LOGICAL , INTENT(in ) :: before 832 INTEGER , INTENT(in ) :: nb , ndir 833 ! 834 INTEGER :: ji, jj 835 REAL(wp) :: zrhoy, zrhot, zt0, zt1, ztcoeff 836 LOGICAL :: western_side, eastern_side,northern_side,southern_side 837 !!---------------------------------------------------------------------- 838 ! 839 IF( before ) THEN 840 ptab(i1:i2,j1:j2) = e2u(i1:i2,j1:j2) * hu_n(i1:i2,j1:j2) * un_b(i1:i2,j1:j2) 841 ELSE 842 western_side = (nb == 1).AND.(ndir == 1) 843 eastern_side = (nb == 1).AND.(ndir == 2) 844 southern_side = (nb == 2).AND.(ndir == 1) 845 northern_side = (nb == 2).AND.(ndir == 2) 846 zrhoy = Agrif_Rhoy() 847 zrhot = Agrif_rhot() 848 ! Time indexes bounds for integration 849 zt0 = REAL(Agrif_NbStepint() , wp) / zrhot 850 zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot 851 ! Polynomial interpolation coefficients: 852 IF( bdy_tinterp == 1 ) THEN 853 ztcoeff = zrhot * ( zt1**2._wp * ( zt1 - 1._wp) & 854 & - zt0**2._wp * ( zt0 - 1._wp) ) 855 ELSEIF( bdy_tinterp == 2 ) THEN 856 ztcoeff = zrhot * ( zt1 * ( zt1 - 1._wp)**2._wp & 857 & - zt0 * ( zt0 - 1._wp)**2._wp ) 858 859 ELSE 860 ztcoeff = 1 861 ENDIF 862 ! 863 IF(western_side) THEN 864 ubdy_w(j1:j2) = ubdy_w(j1:j2) + ztcoeff * ptab(i1,j1:j2) 865 ENDIF 866 IF(eastern_side) THEN 867 ubdy_e(j1:j2) = ubdy_e(j1:j2) + ztcoeff * ptab(i1,j1:j2) 868 ENDIF 869 IF(southern_side) THEN 870 ubdy_s(i1:i2) = ubdy_s(i1:i2) + ztcoeff * ptab(i1:i2,j1) 871 ENDIF 872 IF(northern_side) THEN 873 ubdy_n(i1:i2) = ubdy_n(i1:i2) + ztcoeff * ptab(i1:i2,j1) 874 ENDIF 875 ! 876 IF( bdy_tinterp == 0 .OR. bdy_tinterp == 2) THEN 877 IF(western_side) THEN 878 ubdy_w(j1:j2) = ubdy_w(j1:j2) / (zrhoy*e2u(i1,j1:j2)) * umask(i1,j1:j2,1) 879 ENDIF 880 IF(eastern_side) THEN 881 ubdy_e(j1:j2) = ubdy_e(j1:j2) / (zrhoy*e2u(i1,j1:j2)) * umask(i1,j1:j2,1) 882 ENDIF 883 IF(southern_side) THEN 884 ubdy_s(i1:i2) = ubdy_s(i1:i2) / (zrhoy*e2u(i1:i2,j1)) * umask(i1:i2,j1,1) 885 ENDIF 886 IF(northern_side) THEN 887 ubdy_n(i1:i2) = ubdy_n(i1:i2) / (zrhoy*e2u(i1:i2,j1)) * umask(i1:i2,j1,1) 888 ENDIF 889 ENDIF 890 ENDIF 891 ! 892 END SUBROUTINE interpunb 893 894 895 SUBROUTINE interpvnb( ptab, i1, i2, j1, j2, before, nb, ndir ) 896 !!---------------------------------------------------------------------- 897 !! *** ROUTINE interpvnb *** 898 !!---------------------------------------------------------------------- 899 INTEGER , INTENT(in ) :: i1, i2, j1, j2 900 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab 901 LOGICAL , INTENT(in ) :: before 902 INTEGER , INTENT(in ) :: nb , ndir 903 ! 904 INTEGER :: ji,jj 905 REAL(wp) :: zrhox, zrhot, zt0, zt1, ztcoeff 906 LOGICAL :: western_side, eastern_side,northern_side,southern_side 907 !!---------------------------------------------------------------------- 908 ! 909 IF( before ) THEN 910 ptab(i1:i2,j1:j2) = e1v(i1:i2,j1:j2) * hv_n(i1:i2,j1:j2) * vn_b(i1:i2,j1:j2) 911 ELSE 912 western_side = (nb == 1).AND.(ndir == 1) 913 eastern_side = (nb == 1).AND.(ndir == 2) 914 southern_side = (nb == 2).AND.(ndir == 1) 915 northern_side = (nb == 2).AND.(ndir == 2) 916 zrhox = Agrif_Rhox() 917 zrhot = Agrif_rhot() 918 ! Time indexes bounds for integration 919 zt0 = REAL(Agrif_NbStepint() , wp) / zrhot 920 zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot 921 IF( bdy_tinterp == 1 ) THEN 922 ztcoeff = zrhot * ( zt1**2._wp * ( zt1 - 1._wp) & 923 & - zt0**2._wp * ( zt0 - 1._wp) ) 924 ELSEIF( bdy_tinterp == 2 ) THEN 925 ztcoeff = zrhot * ( zt1 * ( zt1 - 1._wp)**2._wp & 926 & - zt0 * ( zt0 - 1._wp)**2._wp ) 927 ELSE 928 ztcoeff = 1 929 ENDIF 930 ! 931 IF(western_side) THEN 932 vbdy_w(j1:j2) = vbdy_w(j1:j2) + ztcoeff * ptab(i1,j1:j2) 933 ENDIF 934 IF(eastern_side) THEN 935 vbdy_e(j1:j2) = vbdy_e(j1:j2) + ztcoeff * ptab(i1,j1:j2) 936 ENDIF 937 IF(southern_side) THEN 938 vbdy_s(i1:i2) = vbdy_s(i1:i2) + ztcoeff * ptab(i1:i2,j1) 939 ENDIF 940 IF(northern_side) THEN 941 vbdy_n(i1:i2) = vbdy_n(i1:i2) + ztcoeff * ptab(i1:i2,j1) 942 ENDIF 943 ! 944 IF( bdy_tinterp == 0 .OR. bdy_tinterp == 2) THEN 945 IF(western_side) THEN 946 vbdy_w(j1:j2) = vbdy_w(j1:j2) / (zrhox*e1v(i1,j1:j2)) & 947 & * vmask(i1,j1:j2,1) 948 ENDIF 949 IF(eastern_side) THEN 950 vbdy_e(j1:j2) = vbdy_e(j1:j2) / (zrhox*e1v(i1,j1:j2)) & 951 & * vmask(i1,j1:j2,1) 952 ENDIF 953 IF(southern_side) THEN 954 vbdy_s(i1:i2) = vbdy_s(i1:i2) / (zrhox*e1v(i1:i2,j1)) & 955 & * vmask(i1:i2,j1,1) 956 ENDIF 957 IF(northern_side) THEN 958 vbdy_n(i1:i2) = vbdy_n(i1:i2) / (zrhox*e1v(i1:i2,j1)) & 959 & * vmask(i1:i2,j1,1) 960 ENDIF 961 ENDIF 962 ENDIF 963 ! 964 END SUBROUTINE interpvnb 965 966 967 SUBROUTINE interpub2b( ptab, i1, i2, j1, j2, before, nb, ndir ) 968 !!---------------------------------------------------------------------- 969 !! *** ROUTINE interpub2b *** 970 !!---------------------------------------------------------------------- 971 INTEGER , INTENT(in ) :: i1, i2, j1, j2 972 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab 973 LOGICAL , INTENT(in ) :: before 974 INTEGER , INTENT(in ) :: nb , ndir 975 ! 976 INTEGER :: ji,jj 977 REAL(wp) :: zrhot, zt0, zt1,zat 978 LOGICAL :: western_side, eastern_side,northern_side,southern_side 979 !!---------------------------------------------------------------------- 980 IF( before ) THEN 981 ptab(i1:i2,j1:j2) = e2u(i1:i2,j1:j2) * ub2_b(i1:i2,j1:j2) 982 ELSE 983 western_side = (nb == 1).AND.(ndir == 1) 984 eastern_side = (nb == 1).AND.(ndir == 2) 985 southern_side = (nb == 2).AND.(ndir == 1) 986 northern_side = (nb == 2).AND.(ndir == 2) 987 zrhot = Agrif_rhot() 728 988 ! Time indexes bounds for integration 729 989 zt0 = REAL(Agrif_NbStepint() , wp) / zrhot 730 990 zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot 731 732 991 ! Polynomial interpolation coefficients: 733 zaa = zrhot * ( zt1**2._wp * ( zt1 - 1._wp) & 734 & - zt0**2._wp * ( zt0 - 1._wp) ) 735 zab = zrhot * ( zt1 * ( zt1 - 1._wp)**2._wp & 736 & - zt0 * ( zt0 - 1._wp)**2._wp ) 737 zat = zrhot * ( zt1**2._wp * (-2._wp*zt1 + 3._wp) & 738 & - zt0**2._wp * (-2._wp*zt0 + 3._wp) ) 739 740 ! Do time interpolation 741 IF((nbondi == -1).OR.(nbondi == 2)) THEN 742 DO jj=1,jpj 743 zunb(2,jj) = zaa * zuab(2,jj) + zab * zubb(2,jj) + zat * zutn(2,jj) 744 zvnb(2,jj) = zaa * zvab(2,jj) + zab * zvbb(2,jj) + zat * zvtn(2,jj) 745 END DO 746 ENDIF 747 IF((nbondi == 1).OR.(nbondi == 2)) THEN 748 DO jj=1,jpj 749 zunb(nlci-2,jj) = zaa * zuab(nlci-2,jj) + zab * zubb(nlci-2,jj) + zat * zutn(nlci-2,jj) 750 zvnb(nlci-1,jj) = zaa * zvab(nlci-1,jj) + zab * zvbb(nlci-1,jj) + zat * zvtn(nlci-1,jj) 751 END DO 752 ENDIF 753 IF((nbondj == -1).OR.(nbondj == 2)) THEN 754 DO ji=1,jpi 755 zunb(ji,2) = zaa * zuab(ji,2) + zab * zubb(ji,2) + zat * zutn(ji,2) 756 zvnb(ji,2) = zaa * zvab(ji,2) + zab * zvbb(ji,2) + zat * zvtn(ji,2) 757 END DO 758 ENDIF 759 IF((nbondj == 1).OR.(nbondj == 2)) THEN 760 DO ji=1,jpi 761 zunb(ji,nlcj-1) = zaa * zuab(ji,nlcj-1) + zab * zubb(ji,nlcj-1) + zat * zutn(ji,nlcj-1) 762 zvnb(ji,nlcj-2) = zaa * zvab(ji,nlcj-2) + zab * zvbb(ji,nlcj-2) + zat * zvtn(ji,nlcj-2) 763 END DO 764 ENDIF 765 CALL wrk_dealloc( jpi, jpj, zuab, zvab, zubb, zvbb, zutn, zvtn ) 766 767 ELSE ! Linear interpolation 768 zunb(:,:) = 0._wp ; zvnb(:,:) = 0._wp 769 CALL Agrif_Bc_variable(zunb,unb_id,calledweight=zt, procname=interpunb) 770 CALL Agrif_Bc_variable(zvnb,vnb_id,calledweight=zt, procname=interpvnb) 771 ENDIF 772 Agrif_UseSpecialValue = .FALSE. 773 774 ! Fill boundary data arrays: 775 IF((nbondi == -1).OR.(nbondi == 2)) THEN 776 DO jj=1,jpj 777 ubdy_w(jj) = (zunb(2,jj)/(zrhoy*e2u(2,jj))) * umask(2,jj,1) 778 vbdy_w(jj) = (zvnb(2,jj)/(zrhox*e1v(2,jj))) * vmask(2,jj,1) 779 hbdy_w(jj) = zsshn(2,jj) * tmask(2,jj,1) 780 END DO 781 ENDIF 782 783 IF((nbondi == 1).OR.(nbondi == 2)) THEN 784 DO jj=1,jpj 785 ubdy_e(jj) = zunb(nlci-2,jj)/(zrhoy*e2u(nlci-2,jj)) * umask(nlci-2,jj,1) 786 vbdy_e(jj) = zvnb(nlci-1,jj)/(zrhox*e1v(nlci-1,jj)) * vmask(nlci-1,jj,1) 787 hbdy_e(jj) = zsshn(nlci-1,jj) * tmask(nlci-1,jj,1) 788 END DO 789 ENDIF 790 791 IF((nbondj == -1).OR.(nbondj == 2)) THEN 792 DO ji=1,jpi 793 ubdy_s(ji) = zunb(ji,2)/(zrhoy*e2u(ji,2)) * umask(ji,2,1) 794 vbdy_s(ji) = zvnb(ji,2)/(zrhox*e1v(ji,2)) * vmask(ji,2,1) 795 hbdy_s(ji) = zsshn(ji,2) * tmask(ji,2,1) 796 END DO 797 ENDIF 798 799 IF((nbondj == 1).OR.(nbondj == 2)) THEN 800 DO ji=1,jpi 801 ubdy_n(ji) = zunb(ji,nlcj-1)/(zrhoy*e2u(ji,nlcj-1)) * umask(ji,nlcj-1,1) 802 vbdy_n(ji) = zvnb(ji,nlcj-2)/(zrhox*e1v(ji,nlcj-2)) * vmask(ji,nlcj-2,1) 803 hbdy_n(ji) = zsshn(ji,nlcj-1) * tmask(ji,nlcj-1,1) 804 END DO 805 ENDIF 806 807 CALL wrk_dealloc( jpi, jpj, zunb, zvnb, zsshn ) 808 809 END SUBROUTINE Agrif_dta_ts 810 811 SUBROUTINE Agrif_ssh( kt ) 812 !!---------------------------------------------------------------------- 813 !! *** ROUTINE Agrif_DYN *** 814 !!---------------------------------------------------------------------- 815 INTEGER, INTENT(in) :: kt 816 !! 817 !!---------------------------------------------------------------------- 818 819 IF( Agrif_Root() ) RETURN 820 821 822 IF((nbondi == -1).OR.(nbondi == 2)) THEN 823 ssha(2,:)=ssha(3,:) 824 sshn(2,:)=sshn(3,:) 825 ENDIF 826 827 IF((nbondi == 1).OR.(nbondi == 2)) THEN 828 ssha(nlci-1,:)=ssha(nlci-2,:) 829 sshn(nlci-1,:)=sshn(nlci-2,:) 830 ENDIF 831 832 IF((nbondj == -1).OR.(nbondj == 2)) THEN 833 ssha(:,2)=ssha(:,3) 834 sshn(:,2)=sshn(:,3) 835 ENDIF 836 837 IF((nbondj == 1).OR.(nbondj == 2)) THEN 838 ssha(:,nlcj-1)=ssha(:,nlcj-2) 839 sshn(:,nlcj-1)=sshn(:,nlcj-2) 840 ENDIF 841 842 END SUBROUTINE Agrif_ssh 843 844 SUBROUTINE Agrif_ssh_ts( jn ) 845 !!---------------------------------------------------------------------- 846 !! *** ROUTINE Agrif_ssh_ts *** 847 !!---------------------------------------------------------------------- 848 INTEGER, INTENT(in) :: jn 849 !! 850 INTEGER :: ji,jj 851 !!---------------------------------------------------------------------- 852 853 IF((nbondi == -1).OR.(nbondi == 2)) THEN 854 DO jj=1,jpj 855 ssha_e(2,jj) = hbdy_w(jj) 856 END DO 857 ENDIF 858 859 IF((nbondi == 1).OR.(nbondi == 2)) THEN 860 DO jj=1,jpj 861 ssha_e(nlci-1,jj) = hbdy_e(jj) 862 END DO 863 ENDIF 864 865 IF((nbondj == -1).OR.(nbondj == 2)) THEN 866 DO ji=1,jpi 867 ssha_e(ji,2) = hbdy_s(ji) 868 END DO 869 ENDIF 870 871 IF((nbondj == 1).OR.(nbondj == 2)) THEN 872 DO ji=1,jpi 873 ssha_e(ji,nlcj-1) = hbdy_n(ji) 874 END DO 875 ENDIF 876 877 END SUBROUTINE Agrif_ssh_ts 878 879 SUBROUTINE interpsshn(tabres,i1,i2,j1,j2) 880 !!---------------------------------------------------------------------- 881 !! *** ROUTINE interpsshn *** 882 !!---------------------------------------------------------------------- 883 INTEGER, INTENT(in) :: i1,i2,j1,j2 884 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 885 !! 886 INTEGER :: ji,jj 887 !!---------------------------------------------------------------------- 888 889 tabres(i1:i2,j1:j2) = sshn(i1:i2,j1:j2) 890 891 END SUBROUTINE interpsshn 892 893 SUBROUTINE interpu(tabres,i1,i2,j1,j2,k1,k2) 894 !!---------------------------------------------------------------------- 895 !! *** ROUTINE interpu *** 896 !!---------------------------------------------------------------------- 897 INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 898 REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 899 !! 900 INTEGER :: ji,jj,jk 901 !!---------------------------------------------------------------------- 902 903 DO jk=k1,k2 904 DO jj=j1,j2 905 DO ji=i1,i2 906 tabres(ji,jj,jk) = e2u(ji,jj) * un(ji,jj,jk) 907 tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3u_n(ji,jj,jk) 908 END DO 909 END DO 910 END DO 911 END SUBROUTINE interpu 912 913 914 SUBROUTINE interpu2d(tabres,i1,i2,j1,j2) 915 !!---------------------------------------------------------------------- 916 !! *** ROUTINE interpu2d *** 917 !!---------------------------------------------------------------------- 918 INTEGER, INTENT(in) :: i1,i2,j1,j2 919 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 920 !! 921 INTEGER :: ji,jj 922 !!---------------------------------------------------------------------- 923 924 DO jj=j1,j2 925 DO ji=i1,i2 926 tabres(ji,jj) = e2u(ji,jj) * ((gcx(ji+1,jj) - gcx(ji,jj))/e1u(ji,jj)) & 927 * umask(ji,jj,1) 928 END DO 929 END DO 930 931 END SUBROUTINE interpu2d 932 933 934 SUBROUTINE interpv(tabres,i1,i2,j1,j2,k1,k2) 935 !!---------------------------------------------------------------------- 936 !! *** ROUTINE interpv *** 937 !!---------------------------------------------------------------------- 938 INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2 939 REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 940 !! 992 zat = zrhot * ( zt1**2._wp * (-2._wp*zt1 + 3._wp) & 993 & - zt0**2._wp * (-2._wp*zt0 + 3._wp) ) 994 ! 995 IF(western_side ) ubdy_w(j1:j2) = zat * ptab(i1,j1:j2) 996 IF(eastern_side ) ubdy_e(j1:j2) = zat * ptab(i1,j1:j2) 997 IF(southern_side) ubdy_s(i1:i2) = zat * ptab(i1:i2,j1) 998 IF(northern_side) ubdy_n(i1:i2) = zat * ptab(i1:i2,j1) 999 ENDIF 1000 ! 1001 END SUBROUTINE interpub2b 1002 1003 1004 SUBROUTINE interpvb2b( ptab, i1, i2, j1, j2, before, nb, ndir ) 1005 !!---------------------------------------------------------------------- 1006 !! *** ROUTINE interpvb2b *** 1007 !!---------------------------------------------------------------------- 1008 INTEGER , INTENT(in ) :: i1, i2, j1, j2 1009 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: ptab 1010 LOGICAL , INTENT(in ) :: before 1011 INTEGER , INTENT(in ) :: nb , ndir 1012 ! 1013 INTEGER :: ji,jj 1014 REAL(wp) :: zrhot, zt0, zt1,zat 1015 LOGICAL :: western_side, eastern_side,northern_side,southern_side 1016 !!---------------------------------------------------------------------- 1017 ! 1018 IF( before ) THEN 1019 ptab(i1:i2,j1:j2) = e1v(i1:i2,j1:j2) * vb2_b(i1:i2,j1:j2) 1020 ELSE 1021 western_side = (nb == 1).AND.(ndir == 1) 1022 eastern_side = (nb == 1).AND.(ndir == 2) 1023 southern_side = (nb == 2).AND.(ndir == 1) 1024 northern_side = (nb == 2).AND.(ndir == 2) 1025 zrhot = Agrif_rhot() 1026 ! Time indexes bounds for integration 1027 zt0 = REAL(Agrif_NbStepint() , wp) / zrhot 1028 zt1 = REAL(Agrif_NbStepint()+1, wp) / zrhot 1029 ! Polynomial interpolation coefficients: 1030 zat = zrhot * ( zt1**2._wp * (-2._wp*zt1 + 3._wp) & 1031 & - zt0**2._wp * (-2._wp*zt0 + 3._wp) ) 1032 ! 1033 IF(western_side ) vbdy_w(j1:j2) = zat * ptab(i1,j1:j2) 1034 IF(eastern_side ) vbdy_e(j1:j2) = zat * ptab(i1,j1:j2) 1035 IF(southern_side) vbdy_s(i1:i2) = zat * ptab(i1:i2,j1) 1036 IF(northern_side) vbdy_n(i1:i2) = zat * ptab(i1:i2,j1) 1037 ENDIF 1038 ! 1039 END SUBROUTINE interpvb2b 1040 1041 1042 SUBROUTINE interpe3t( ptab, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 1043 !!---------------------------------------------------------------------- 1044 !! *** ROUTINE interpe3t *** 1045 !!---------------------------------------------------------------------- 1046 INTEGER , INTENT(in ) :: i1, i2, j1, j2, k1, k2 1047 REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 1048 LOGICAL , INTENT(in ) :: before 1049 INTEGER , INTENT(in ) :: nb , ndir 1050 ! 941 1051 INTEGER :: ji, jj, jk 942 !!---------------------------------------------------------------------- 943 944 DO jk=k1,k2 945 DO jj=j1,j2 946 DO ji=i1,i2 947 tabres(ji,jj,jk) = e1v(ji,jj) * vn(ji,jj,jk) 948 tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3v_n(ji,jj,jk) 949 END DO 950 END DO 951 END DO 952 953 END SUBROUTINE interpv 954 955 956 SUBROUTINE interpv2d(tabres,i1,i2,j1,j2) 957 !!---------------------------------------------------------------------- 958 !! *** ROUTINE interpu2d *** 959 !!---------------------------------------------------------------------- 960 INTEGER, INTENT(in) :: i1,i2,j1,j2 961 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 962 !! 963 INTEGER :: ji,jj 964 !!---------------------------------------------------------------------- 965 966 DO jj=j1,j2 967 DO ji=i1,i2 968 tabres(ji,jj) = e1v(ji,jj) * ((gcx(ji,jj+1) - gcx(ji,jj))/e2v(ji,jj)) & 969 * vmask(ji,jj,1) 970 END DO 971 END DO 972 973 END SUBROUTINE interpv2d 974 975 SUBROUTINE interpunb(tabres,i1,i2,j1,j2) 976 !!---------------------------------------------------------------------- 977 !! *** ROUTINE interpunb *** 978 !!---------------------------------------------------------------------- 979 INTEGER, INTENT(in) :: i1,i2,j1,j2 980 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 981 !! 982 INTEGER :: ji,jj 983 !!---------------------------------------------------------------------- 984 985 DO jj=j1,j2 986 DO ji=i1,i2 987 tabres(ji,jj) = un_b(ji,jj) * e2u(ji,jj) * hu(ji,jj) 988 END DO 989 END DO 990 991 END SUBROUTINE interpunb 992 993 SUBROUTINE interpvnb(tabres,i1,i2,j1,j2) 994 !!---------------------------------------------------------------------- 995 !! *** ROUTINE interpvnb *** 996 !!---------------------------------------------------------------------- 997 INTEGER, INTENT(in) :: i1,i2,j1,j2 998 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 999 !! 1000 INTEGER :: ji,jj 1001 !!---------------------------------------------------------------------- 1002 1003 DO jj=j1,j2 1004 DO ji=i1,i2 1005 tabres(ji,jj) = vn_b(ji,jj) * e1v(ji,jj) * hv(ji,jj) 1006 END DO 1007 END DO 1008 1009 END SUBROUTINE interpvnb 1010 1011 SUBROUTINE interpub2b(tabres,i1,i2,j1,j2) 1012 !!---------------------------------------------------------------------- 1013 !! *** ROUTINE interpub2b *** 1014 !!---------------------------------------------------------------------- 1015 INTEGER, INTENT(in) :: i1,i2,j1,j2 1016 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 1017 !! 1018 INTEGER :: ji,jj 1019 !!---------------------------------------------------------------------- 1020 1021 DO jj=j1,j2 1022 DO ji=i1,i2 1023 tabres(ji,jj) = ub2_b(ji,jj) * e2u(ji,jj) 1024 END DO 1025 END DO 1026 1027 END SUBROUTINE interpub2b 1028 1029 SUBROUTINE interpvb2b(tabres,i1,i2,j1,j2) 1030 !!---------------------------------------------------------------------- 1031 !! *** ROUTINE interpvb2b *** 1032 !!---------------------------------------------------------------------- 1033 INTEGER, INTENT(in) :: i1,i2,j1,j2 1034 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 1035 !! 1036 INTEGER :: ji,jj 1037 !!---------------------------------------------------------------------- 1038 1039 DO jj=j1,j2 1040 DO ji=i1,i2 1041 tabres(ji,jj) = vb2_b(ji,jj) * e1v(ji,jj) 1042 END DO 1043 END DO 1044 1045 END SUBROUTINE interpvb2b 1052 LOGICAL :: western_side, eastern_side, northern_side, southern_side 1053 REAL(wp) :: ztmpmsk 1054 !!---------------------------------------------------------------------- 1055 ! 1056 IF( before ) THEN 1057 ptab(i1:i2,j1:j2,k1:k2) = tmask(i1:i2,j1:j2,k1:k2) * e3t_0(i1:i2,j1:j2,k1:k2) 1058 ELSE 1059 western_side = (nb == 1).AND.(ndir == 1) 1060 eastern_side = (nb == 1).AND.(ndir == 2) 1061 southern_side = (nb == 2).AND.(ndir == 1) 1062 northern_side = (nb == 2).AND.(ndir == 2) 1063 1064 DO jk = k1, k2 1065 DO jj = j1, j2 1066 DO ji = i1, i2 1067 ! Get velocity mask at boundary edge points: 1068 IF( western_side ) ztmpmsk = umask(ji ,jj ,1) 1069 IF( eastern_side ) ztmpmsk = umask(nlci-2,jj ,1) 1070 IF( northern_side) ztmpmsk = vmask(ji ,nlcj-2,1) 1071 IF( southern_side) ztmpmsk = vmask(ji ,2 ,1) 1072 ! 1073 IF( ABS( ptab(ji,jj,jk) - tmask(ji,jj,jk) * e3t_0(ji,jj,jk) )*ztmpmsk > 1.D-2) THEN 1074 IF (western_side) THEN 1075 WRITE(numout,*) 'ERROR bathymetry merge at the western border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 1076 ELSEIF (eastern_side) THEN 1077 WRITE(numout,*) 'ERROR bathymetry merge at the eastern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 1078 ELSEIF (southern_side) THEN 1079 WRITE(numout,*) 'ERROR bathymetry merge at the southern border ji,jj,jk', ji+nimpp-1,jj+njmpp-1,jk 1080 ELSEIF (northern_side) THEN 1081 WRITE(numout,*) 'ERROR bathymetry merge at the northen border ji,jj,jk', ji+nimpp-1,jj+njmpp-1,jk 1082 ENDIF 1083 WRITE(numout,*) ' ptab(ji,jj,jk), e3t(ji,jj,jk) ', ptab(ji,jj,jk), e3t_0(ji,jj,jk) 1084 kindic_agr = kindic_agr + 1 1085 ENDIF 1086 END DO 1087 END DO 1088 END DO 1089 ! 1090 ENDIF 1091 ! 1092 END SUBROUTINE interpe3t 1093 1094 1095 SUBROUTINE interpumsk( ptab, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 1096 !!---------------------------------------------------------------------- 1097 !! *** ROUTINE interpumsk *** 1098 !!---------------------------------------------------------------------- 1099 INTEGER , INTENT(in ) :: i1, i2, j1, j2, k1, k2 1100 REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 1101 LOGICAL , INTENT(in ) :: before 1102 INTEGER , INTENT(in ) :: nb , ndir 1103 ! 1104 INTEGER :: ji, jj, jk 1105 LOGICAL :: western_side, eastern_side 1106 !!---------------------------------------------------------------------- 1107 ! 1108 IF( before ) THEN 1109 ptab(i1:i2,j1:j2,k1:k2) = umask(i1:i2,j1:j2,k1:k2) 1110 ELSE 1111 western_side = (nb == 1).AND.(ndir == 1) 1112 eastern_side = (nb == 1).AND.(ndir == 2) 1113 DO jk = k1, k2 1114 DO jj = j1, j2 1115 DO ji = i1, i2 1116 ! Velocity mask at boundary edge points: 1117 IF (ABS(ptab(ji,jj,jk) - umask(ji,jj,jk)) > 1.D-2) THEN 1118 IF (western_side) THEN 1119 WRITE(numout,*) 'ERROR with umask at the western border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 1120 WRITE(numout,*) ' masks: parent, child ', ptab(ji,jj,jk), umask(ji,jj,jk) 1121 kindic_agr = kindic_agr + 1 1122 ELSEIF (eastern_side) THEN 1123 WRITE(numout,*) 'ERROR with umask at the eastern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 1124 WRITE(numout,*) ' masks: parent, child ', ptab(ji,jj,jk), umask(ji,jj,jk) 1125 kindic_agr = kindic_agr + 1 1126 ENDIF 1127 ENDIF 1128 END DO 1129 END DO 1130 END DO 1131 ! 1132 ENDIF 1133 ! 1134 END SUBROUTINE interpumsk 1135 1136 1137 SUBROUTINE interpvmsk( ptab, i1, i2, j1, j2, k1, k2, before, nb, ndir ) 1138 !!---------------------------------------------------------------------- 1139 !! *** ROUTINE interpvmsk *** 1140 !!---------------------------------------------------------------------- 1141 INTEGER , INTENT(in ) :: i1,i2,j1,j2,k1,k2 1142 REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 1143 LOGICAL , INTENT(in ) :: before 1144 INTEGER , INTENT(in ) :: nb , ndir 1145 ! 1146 INTEGER :: ji, jj, jk 1147 LOGICAL :: northern_side, southern_side 1148 !!---------------------------------------------------------------------- 1149 ! 1150 IF( before ) THEN 1151 ptab(i1:i2,j1:j2,k1:k2) = vmask(i1:i2,j1:j2,k1:k2) 1152 ELSE 1153 southern_side = (nb == 2).AND.(ndir == 1) 1154 northern_side = (nb == 2).AND.(ndir == 2) 1155 DO jk = k1, k2 1156 DO jj = j1, j2 1157 DO ji = i1, i2 1158 ! Velocity mask at boundary edge points: 1159 IF (ABS(ptab(ji,jj,jk) - vmask(ji,jj,jk)) > 1.D-2) THEN 1160 IF (southern_side) THEN 1161 WRITE(numout,*) 'ERROR with vmask at the southern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 1162 WRITE(numout,*) ' masks: parent, child ', ptab(ji,jj,jk), vmask(ji,jj,jk) 1163 kindic_agr = kindic_agr + 1 1164 ELSEIF (northern_side) THEN 1165 WRITE(numout,*) 'ERROR with vmask at the northern border ji,jj,jk ', ji+nimpp-1,jj+njmpp-1,jk 1166 WRITE(numout,*) ' masks: parent, child ', ptab(ji,jj,jk), vmask(ji,jj,jk) 1167 kindic_agr = kindic_agr + 1 1168 ENDIF 1169 ENDIF 1170 END DO 1171 END DO 1172 END DO 1173 ! 1174 ENDIF 1175 ! 1176 END SUBROUTINE interpvmsk 1177 1178 # if defined key_zdftke 1179 1180 SUBROUTINE interpavm( ptab, i1, i2, j1, j2, k1, k2, before ) 1181 !!---------------------------------------------------------------------- 1182 !! *** ROUTINE interavm *** 1183 !!---------------------------------------------------------------------- 1184 INTEGER , INTENT(in ) :: i1, i2, j1, j2, k1, k2 1185 REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 1186 LOGICAL , INTENT(in ) :: before 1187 !!---------------------------------------------------------------------- 1188 ! 1189 IF( before ) THEN 1190 ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2) 1191 ELSE 1192 avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 1193 ENDIF 1194 ! 1195 END SUBROUTINE interpavm 1196 1197 # endif /* key_zdftke */ 1046 1198 1047 1199 #else
Note: See TracChangeset
for help on using the changeset viewer.