- Timestamp:
- 2016-07-19T10:38:35+02:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/NST_SRC/agrif_opa_update.F90
r4491 r6808 1 #define TWO_WAY 2 1 #define TWO_WAY /* TWO WAY NESTING */ 2 #undef DECAL_FEEDBACK /* SEPARATION of INTERFACES*/ 3 3 4 MODULE agrif_opa_update 4 5 #if defined key_agrif && ! defined key_offline … … 10 11 USE lib_mpp 11 12 USE wrk_nemo 12 USE dynspg_oce13 USE zdf_oce ! vertical physics: ocean variables 13 14 14 15 IMPLICIT NONE 15 16 PRIVATE 16 17 17 PUBLIC Agrif_Update_Tra, Agrif_Update_Dyn 18 19 INTEGER, PUBLIC :: nbcline = 020 18 PUBLIC Agrif_Update_Tra, Agrif_Update_Dyn,Update_Scales 19 # if defined key_zdftke 20 PUBLIC Agrif_Update_Tke 21 # endif 21 22 !!---------------------------------------------------------------------- 22 !! NEMO/NST 3. 3, NEMO Consortium (2010)23 !! NEMO/NST 3.6 , NEMO Consortium (2010) 23 24 !! $Id$ 24 25 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 25 26 !!---------------------------------------------------------------------- 26 27 27 CONTAINS 28 28 29 SUBROUTINE Agrif_Update_Tra( kt)29 RECURSIVE SUBROUTINE Agrif_Update_Tra( ) 30 30 !!--------------------------------------------- 31 31 !! *** ROUTINE Agrif_Update_Tra *** 32 !!--------------------------------------------- 33 ! 34 IF (Agrif_Root()) RETURN 35 ! 36 #if defined TWO_WAY 37 IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update tracers from grid Number',Agrif_Fixed(), 'nbcline', nbcline 38 39 Agrif_UseSpecialValueInUpdate = .TRUE. 40 Agrif_SpecialValueFineGrid = 0. 41 ! 42 IF (MOD(nbcline,nbclineupdate) == 0) THEN 43 # if ! defined DECAL_FEEDBACK 44 CALL Agrif_Update_Variable(tsn_id, procname=updateTS) 45 # else 46 CALL Agrif_Update_Variable(tsn_id, locupdate=(/1,0/),procname=updateTS) 47 # endif 48 ELSE 49 # if ! defined DECAL_FEEDBACK 50 CALL Agrif_Update_Variable(tsn_id,locupdate=(/0,2/), procname=updateTS) 51 # else 52 CALL Agrif_Update_Variable(tsn_id,locupdate=(/1,2/), procname=updateTS) 53 # endif 54 ENDIF 55 ! 56 Agrif_UseSpecialValueInUpdate = .FALSE. 57 ! 58 IF ( lk_agrif_doupd ) THEN ! Initialisation: do recursive update: 59 CALL Agrif_ChildGrid_To_ParentGrid() 60 CALL Agrif_Update_Tra() 61 CALL Agrif_ParentGrid_To_ChildGrid() 62 ENDIF 63 ! 64 #endif 65 ! 66 END SUBROUTINE Agrif_Update_Tra 67 68 69 RECURSIVE SUBROUTINE Agrif_Update_Dyn( ) 70 !!--------------------------------------------- 71 !! *** ROUTINE Agrif_Update_Dyn *** 72 !!--------------------------------------------- 73 ! 74 IF (Agrif_Root()) RETURN 75 ! 76 #if defined TWO_WAY 77 IF (lwp.AND.lk_agrif_debug) Write(*,*) 'Update momentum from grid Number',Agrif_Fixed(), 'nbcline', nbcline 78 79 Agrif_UseSpecialValueInUpdate = .FALSE. 80 Agrif_SpecialValueFineGrid = 0. 81 ! 82 IF (mod(nbcline,nbclineupdate) == 0) THEN 83 # if ! defined DECAL_FEEDBACK 84 CALL Agrif_Update_Variable(un_update_id,procname = updateU) 85 CALL Agrif_Update_Variable(vn_update_id,procname = updateV) 86 # else 87 CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateU) 88 CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updateV) 89 # endif 90 ELSE 91 # if ! defined DECAL_FEEDBACK 92 CALL Agrif_Update_Variable(un_update_id,locupdate=(/0,1/),procname = updateU) 93 CALL Agrif_Update_Variable(vn_update_id,locupdate=(/0,1/),procname = updateV) 94 # else 95 CALL Agrif_Update_Variable(un_update_id,locupdate1=(/0,1/),locupdate2=(/1,1/),procname = updateU) 96 CALL Agrif_Update_Variable(vn_update_id,locupdate1=(/1,1/),locupdate2=(/0,1/),procname = updateV) 97 # endif 98 ENDIF 99 100 # if ! defined DECAL_FEEDBACK 101 CALL Agrif_Update_Variable(e1u_id,procname = updateU2d) 102 CALL Agrif_Update_Variable(e2v_id,procname = updateV2d) 103 # else 104 CALL Agrif_Update_Variable(e1u_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateU2d) 105 CALL Agrif_Update_Variable(e2v_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updateV2d) 106 # endif 107 108 IF ( ln_dynspg_ts.AND.ln_bt_fw ) THEN 109 ! Update time integrated transports 110 IF (mod(nbcline,nbclineupdate) == 0) THEN 111 # if ! defined DECAL_FEEDBACK 112 CALL Agrif_Update_Variable(ub2b_update_id,procname = updateub2b) 113 CALL Agrif_Update_Variable(vb2b_update_id,procname = updatevb2b) 114 # else 115 CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/0,-1/),locupdate2=(/1,-2/),procname = updateub2b) 116 CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1,-2/),locupdate2=(/0,-1/),procname = updatevb2b) 117 # endif 118 ELSE 119 # if ! defined DECAL_FEEDBACK 120 CALL Agrif_Update_Variable(ub2b_update_id,locupdate=(/0,1/),procname = updateub2b) 121 CALL Agrif_Update_Variable(vb2b_update_id,locupdate=(/0,1/),procname = updatevb2b) 122 # else 123 CALL Agrif_Update_Variable(ub2b_update_id,locupdate1=(/0,1/),locupdate2=(/1,1/),procname = updateub2b) 124 CALL Agrif_Update_Variable(vb2b_update_id,locupdate1=(/1,1/),locupdate2=(/0,1/),procname = updatevb2b) 125 # endif 126 ENDIF 127 END IF 128 ! 129 nbcline = nbcline + 1 130 ! 131 Agrif_UseSpecialValueInUpdate = .TRUE. 132 Agrif_SpecialValueFineGrid = 0. 133 # if ! defined DECAL_FEEDBACK 134 CALL Agrif_Update_Variable(sshn_id,procname = updateSSH) 135 # else 136 CALL Agrif_Update_Variable(sshn_id,locupdate=(/1,0/),procname = updateSSH) 137 # endif 138 Agrif_UseSpecialValueInUpdate = .FALSE. 139 ! 140 #endif 141 ! 142 ! Do recursive update: 143 IF ( lk_agrif_doupd ) THEN ! Initialisation: do recursive update: 144 CALL Agrif_ChildGrid_To_ParentGrid() 145 CALL Agrif_Update_Dyn() 146 CALL Agrif_ParentGrid_To_ChildGrid() 147 ENDIF 148 ! 149 END SUBROUTINE Agrif_Update_Dyn 150 151 # if defined key_zdftke 152 153 SUBROUTINE Agrif_Update_Tke( kt ) 154 !!--------------------------------------------- 155 !! *** ROUTINE Agrif_Update_Tke *** 32 156 !!--------------------------------------------- 33 157 !! 34 158 INTEGER, INTENT(in) :: kt 35 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztab 36 37 38 IF((Agrif_NbStepint() .NE. (Agrif_irhot()-1)).AND.(kt /= 0)) RETURN 39 #if defined TWO_WAY 40 CALL wrk_alloc( jpi, jpj, jpk, jpts, ztab ) 159 ! 160 IF( ( Agrif_NbStepint() .NE. 0 ) .AND. (kt /= 0) ) RETURN 161 # if defined TWO_WAY 41 162 42 163 Agrif_UseSpecialValueInUpdate = .TRUE. 43 164 Agrif_SpecialValueFineGrid = 0. 44 165 45 IF (MOD(nbcline,nbclineupdate) == 0) THEN 46 CALL Agrif_Update_Variable(ztab,tsn_id, procname=updateTS) 47 ELSE 48 CALL Agrif_Update_Variable(ztab,tsn_id,locupdate=(/0,2/), procname=updateTS) 49 ENDIF 166 CALL Agrif_Update_Variable( en_id, locupdate=(/0,0/), procname=updateEN ) 167 CALL Agrif_Update_Variable(avt_id, locupdate=(/0,0/), procname=updateAVT ) 168 CALL Agrif_Update_Variable(avm_id, locupdate=(/0,0/), procname=updateAVM ) 50 169 51 170 Agrif_UseSpecialValueInUpdate = .FALSE. 52 171 53 CALL wrk_dealloc( jpi, jpj, jpk, jpts, ztab ) 54 #endif 55 56 END SUBROUTINE Agrif_Update_Tra 57 58 SUBROUTINE Agrif_Update_Dyn( kt ) 59 !!--------------------------------------------- 60 !! *** ROUTINE Agrif_Update_Dyn *** 61 !!--------------------------------------------- 62 !! 63 INTEGER, INTENT(in) :: kt 64 REAL(wp), POINTER, DIMENSION(:,:) :: ztab2d 65 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztab 66 67 68 IF ((Agrif_NbStepint() .NE. (Agrif_irhot()-1)).AND.(kt /= 0)) Return 69 #if defined TWO_WAY 70 CALL wrk_alloc( jpi, jpj, ztab2d ) 71 CALL wrk_alloc( jpi, jpj, jpk, ztab ) 72 73 IF (mod(nbcline,nbclineupdate) == 0) THEN 74 CALL Agrif_Update_Variable(ztab,un_id,procname = updateU) 75 CALL Agrif_Update_Variable(ztab,vn_id,procname = updateV) 76 ELSE 77 CALL Agrif_Update_Variable(ztab,un_id,locupdate=(/0,1/),procname = updateU) 78 CALL Agrif_Update_Variable(ztab,vn_id,locupdate=(/0,1/),procname = updateV) 79 ENDIF 80 81 CALL Agrif_Update_Variable(ztab2d,e1u_id,procname = updateU2d) 82 CALL Agrif_Update_Variable(ztab2d,e2v_id,procname = updateV2d) 83 84 #if defined key_dynspg_ts 85 IF (ln_bt_fw) THEN 86 ! Update time integrated transports 87 IF (mod(nbcline,nbclineupdate) == 0) THEN 88 CALL Agrif_Update_Variable(ztab2d,ub2b_id,procname = updateub2b) 89 CALL Agrif_Update_Variable(ztab2d,vb2b_id,procname = updatevb2b) 90 ELSE 91 CALL Agrif_Update_Variable(ztab2d,ub2b_id,locupdate=(/0,1/),procname = updateub2b) 92 CALL Agrif_Update_Variable(ztab2d,vb2b_id,locupdate=(/0,1/),procname = updatevb2b) 93 ENDIF 94 END IF 95 #endif 96 97 nbcline = nbcline + 1 98 99 Agrif_UseSpecialValueInUpdate = .TRUE. 100 Agrif_SpecialValueFineGrid = 0. 101 CALL Agrif_Update_Variable(ztab2d,sshn_id,procname = updateSSH) 102 Agrif_UseSpecialValueInUpdate = .FALSE. 103 104 CALL wrk_dealloc( jpi, jpj, ztab2d ) 105 CALL wrk_dealloc( jpi, jpj, jpk, ztab ) 106 107 !Done in step 108 ! CALL Agrif_ChildGrid_To_ParentGrid() 109 ! CALL recompute_diags( kt ) 110 ! CALL Agrif_ParentGrid_To_ChildGrid() 111 112 #endif 113 114 END SUBROUTINE Agrif_Update_Dyn 115 116 SUBROUTINE recompute_diags( kt ) 117 !!--------------------------------------------- 118 !! *** ROUTINE recompute_diags *** 119 !!--------------------------------------------- 120 INTEGER, INTENT(in) :: kt 121 122 END SUBROUTINE recompute_diags 172 # endif 173 174 END SUBROUTINE Agrif_Update_Tke 175 176 # endif /* key_zdftke */ 123 177 124 178 SUBROUTINE updateTS( tabres, i1, i2, j1, j2, k1, k2, n1, n2, before ) … … 126 180 !! *** ROUTINE updateT *** 127 181 !!--------------------------------------------- 128 # include "domzgr_substitute.h90"129 130 182 INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 131 183 REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 132 LOGICAL, iNTENT(in) :: before133 184 LOGICAL, INTENT(in) :: before 185 !! 134 186 INTEGER :: ji,jj,jk,jn 135 187 !!--------------------------------------------- 188 ! 136 189 IF (before) THEN 137 190 DO jn = n1,n2 … … 146 199 ELSE 147 200 IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN 148 ! Add asselin part201 ! Add asselin part 149 202 DO jn = n1,n2 150 203 DO jk=k1,k2 … … 153 206 IF( tabres(ji,jj,jk,jn) .NE. 0. ) THEN 154 207 tsb(ji,jj,jk,jn) = tsb(ji,jj,jk,jn) & 155 & + atfp * ( tabres(ji,jj,jk,jn) &156 & - tsn(ji,jj,jk,jn) ) * tmask(ji,jj,jk)208 & + atfp * ( tabres(ji,jj,jk,jn) & 209 & - tsn(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 157 210 ENDIF 158 211 ENDDO … … 161 214 ENDDO 162 215 ENDIF 163 164 216 DO jn = n1,n2 165 217 DO jk=k1,k2 … … 174 226 END DO 175 227 ENDIF 176 228 ! 177 229 END SUBROUTINE updateTS 178 230 231 179 232 SUBROUTINE updateu( tabres, i1, i2, j1, j2, k1, k2, before ) 180 233 !!--------------------------------------------- 181 234 !! *** ROUTINE updateu *** 182 235 !!--------------------------------------------- 183 # include "domzgr_substitute.h90" 184 185 INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2 236 INTEGER , INTENT(in ) :: i1, i2, j1, j2, k1, k2 186 237 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: tabres 187 LOGICAL, INTENT(in) :: before 188 189 INTEGER :: ji, jj, jk 190 REAL(wp) :: zrhoy 191 192 IF (before) THEN 238 LOGICAL , INTENT(in ) :: before 239 ! 240 INTEGER :: ji, jj, jk 241 REAL(wp) :: zrhoy 242 !!--------------------------------------------- 243 ! 244 IF( before ) THEN 193 245 zrhoy = Agrif_Rhoy() 246 DO jk = k1, k2 247 tabres(i1:i2,j1:j2,jk) = zrhoy * e2u(i1:i2,j1:j2) * e3u_n(i1:i2,j1:j2,jk) * un(i1:i2,j1:j2,jk) 248 END DO 249 ELSE 194 250 DO jk=k1,k2 195 251 DO jj=j1,j2 196 252 DO ji=i1,i2 197 tabres(ji,jj,jk) = e2u(ji,jj) * un(ji,jj,jk) 198 tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3u_n(ji,jj,jk) 199 END DO 200 END DO 201 END DO 202 tabres = zrhoy * tabres 203 ELSE 204 DO jk=k1,k2 205 DO jj=j1,j2 206 DO ji=i1,i2 207 tabres(ji,jj,jk) = tabres(ji,jj,jk) / e2u(ji,jj) / fse3u_n(ji,jj,jk) 253 tabres(ji,jj,jk) = tabres(ji,jj,jk) * r1_e2u(ji,jj) / e3u_n(ji,jj,jk) 208 254 ! 209 255 IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part 210 256 ub(ji,jj,jk) = ub(ji,jj,jk) & 211 & + atfp * ( tabres(ji,jj,jk) - un(ji,jj,jk) ) * umask(ji,jj,jk)257 & + atfp * ( tabres(ji,jj,jk) - un(ji,jj,jk) ) * umask(ji,jj,jk) 212 258 ENDIF 213 259 ! … … 217 263 END DO 218 264 ENDIF 219 265 ! 220 266 END SUBROUTINE updateu 221 267 268 222 269 SUBROUTINE updatev( tabres, i1, i2, j1, j2, k1, k2, before ) 223 270 !!--------------------------------------------- 224 271 !! *** ROUTINE updatev *** 225 272 !!--------------------------------------------- 226 # include "domzgr_substitute.h90"227 228 273 INTEGER :: i1,i2,j1,j2,k1,k2 229 274 INTEGER :: ji,jj,jk 230 275 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2) :: tabres 231 276 LOGICAL :: before 232 277 !! 233 278 REAL(wp) :: zrhox 234 279 !!--------------------------------------------- 280 ! 235 281 IF (before) THEN 236 282 zrhox = Agrif_Rhox() … … 238 284 DO jj=j1,j2 239 285 DO ji=i1,i2 240 tabres(ji,jj,jk) = e1v(ji,jj) * vn(ji,jj,jk) 241 tabres(ji,jj,jk) = tabres(ji,jj,jk) * fse3v_n(ji,jj,jk) 242 END DO 243 END DO 244 END DO 245 tabres = zrhox * tabres 286 tabres(ji,jj,jk) = zrhox * e1v(ji,jj) * e3v_n(ji,jj,jk) * vn(ji,jj,jk) 287 END DO 288 END DO 289 END DO 246 290 ELSE 247 291 DO jk=k1,k2 248 292 DO jj=j1,j2 249 293 DO ji=i1,i2 250 tabres(ji,jj,jk) = tabres(ji,jj,jk) / e1v(ji,jj) / fse3v_n(ji,jj,jk)294 tabres(ji,jj,jk) = tabres(ji,jj,jk) * r1_e1v(ji,jj) / e3v_n(ji,jj,jk) 251 295 ! 252 296 IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part 253 297 vb(ji,jj,jk) = vb(ji,jj,jk) & 254 & + atfp * ( tabres(ji,jj,jk) - vn(ji,jj,jk) ) * vmask(ji,jj,jk)298 & + atfp * ( tabres(ji,jj,jk) - vn(ji,jj,jk) ) * vmask(ji,jj,jk) 255 299 ENDIF 256 300 ! … … 260 304 END DO 261 305 ENDIF 262 306 ! 263 307 END SUBROUTINE updatev 264 308 309 265 310 SUBROUTINE updateu2d( tabres, i1, i2, j1, j2, before ) 266 311 !!--------------------------------------------- 267 312 !! *** ROUTINE updateu2d *** 268 313 !!--------------------------------------------- 269 # include "domzgr_substitute.h90"270 271 314 INTEGER, INTENT(in) :: i1, i2, j1, j2 272 315 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 273 316 LOGICAL, INTENT(in) :: before 274 317 !! 275 318 INTEGER :: ji, jj, jk 276 319 REAL(wp) :: zrhoy 277 320 REAL(wp) :: zcorr 278 321 !!--------------------------------------------- 322 ! 279 323 IF (before) THEN 280 324 zrhoy = Agrif_Rhoy() 281 325 DO jj=j1,j2 282 326 DO ji=i1,i2 283 tabres(ji,jj) = un_b(ji,jj) * hu(ji,jj) * e2u(ji,jj) 284 END DO 285 END DO 286 tabres = zrhoy * tabres 287 ELSE 288 DO jj=j1,j2 289 DO ji=i1,i2 290 tabres(ji,jj) = tabres(ji,jj) * hur(ji,jj) / e2u(ji,jj) 327 tabres(ji,jj) = zrhoy * un_b(ji,jj) * hu_n(ji,jj) * e2u(ji,jj) 328 END DO 329 END DO 330 ELSE 331 DO jj=j1,j2 332 DO ji=i1,i2 333 tabres(ji,jj) = tabres(ji,jj) * r1_hu_n(ji,jj) * r1_e2u(ji,jj) 291 334 ! 292 335 ! Update "now" 3d velocities: 293 spgu(ji,jj) = 0. e0336 spgu(ji,jj) = 0._wp 294 337 DO jk=1,jpkm1 295 spgu(ji,jj) = spgu(ji,jj) + fse3u_n(ji,jj,jk) * un(ji,jj,jk)296 END DO 297 spgu(ji,jj) = spgu(ji,jj) * hur(ji,jj)338 spgu(ji,jj) = spgu(ji,jj) + e3u_n(ji,jj,jk) * un(ji,jj,jk) 339 END DO 340 spgu(ji,jj) = spgu(ji,jj) * r1_hu_n(ji,jj) 298 341 ! 299 342 zcorr = tabres(ji,jj) - spgu(ji,jj) … … 303 346 ! 304 347 ! Update barotropic velocities: 305 #if defined key_dynspg_ts 306 IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part307 zcorr = tabres(ji,jj) - un_b(ji,jj)308 ub_b(ji,jj) = ub_b(ji,jj) + atfp * zcorr * umask(ji,jj,1)309 END IF310 #endif348 IF ( .NOT.ln_dynspg_ts .OR. (ln_dynspg_ts.AND.(.NOT.ln_bt_fw)) ) THEN 349 IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part 350 zcorr = tabres(ji,jj) - un_b(ji,jj) 351 ub_b(ji,jj) = ub_b(ji,jj) + atfp * zcorr * umask(ji,jj,1) 352 END IF 353 ENDIF 311 354 un_b(ji,jj) = tabres(ji,jj) * umask(ji,jj,1) 312 355 ! … … 314 357 spgu(ji,jj) = 0.e0 315 358 DO jk=1,jpkm1 316 spgu(ji,jj) = spgu(ji,jj) + fse3u_b(ji,jj,jk) * ub(ji,jj,jk)317 END DO 318 spgu(ji,jj) = spgu(ji,jj) * hur_b(ji,jj)359 spgu(ji,jj) = spgu(ji,jj) + e3u_b(ji,jj,jk) * ub(ji,jj,jk) 360 END DO 361 spgu(ji,jj) = spgu(ji,jj) * r1_hu_b(ji,jj) 319 362 ! 320 363 zcorr = ub_b(ji,jj) - spgu(ji,jj) … … 326 369 END DO 327 370 ENDIF 328 371 ! 329 372 END SUBROUTINE updateu2d 330 373 374 331 375 SUBROUTINE updatev2d( tabres, i1, i2, j1, j2, before ) 332 376 !!--------------------------------------------- 333 377 !! *** ROUTINE updatev2d *** 334 378 !!--------------------------------------------- 335 336 379 INTEGER, INTENT(in) :: i1, i2, j1, j2 337 380 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 338 381 LOGICAL, INTENT(in) :: before 339 382 !! 340 383 INTEGER :: ji, jj, jk 341 384 REAL(wp) :: zrhox 342 385 REAL(wp) :: zcorr 343 386 !!--------------------------------------------- 387 ! 344 388 IF (before) THEN 345 389 zrhox = Agrif_Rhox() 346 390 DO jj=j1,j2 347 391 DO ji=i1,i2 348 tabres(ji,jj) = vn_b(ji,jj) * hv(ji,jj) * e1v(ji,jj) 349 END DO 350 END DO 351 tabres = zrhox * tabres 352 ELSE 353 DO jj=j1,j2 354 DO ji=i1,i2 355 tabres(ji,jj) = tabres(ji,jj) * hvr(ji,jj) / e1v(ji,jj) 392 tabres(ji,jj) = zrhox * vn_b(ji,jj) * hv_n(ji,jj) * e1v(ji,jj) 393 END DO 394 END DO 395 ELSE 396 DO jj=j1,j2 397 DO ji=i1,i2 398 tabres(ji,jj) = tabres(ji,jj) * r1_hv_n(ji,jj) * r1_e1v(ji,jj) 356 399 ! 357 400 ! Update "now" 3d velocities: 358 401 spgv(ji,jj) = 0.e0 359 402 DO jk=1,jpkm1 360 spgv(ji,jj) = spgv(ji,jj) + fse3v_n(ji,jj,jk) * vn(ji,jj,jk)361 END DO 362 spgv(ji,jj) = spgv(ji,jj) * hvr(ji,jj)403 spgv(ji,jj) = spgv(ji,jj) + e3v_n(ji,jj,jk) * vn(ji,jj,jk) 404 END DO 405 spgv(ji,jj) = spgv(ji,jj) * r1_hv_n(ji,jj) 363 406 ! 364 407 zcorr = tabres(ji,jj) - spgv(ji,jj) … … 368 411 ! 369 412 ! Update barotropic velocities: 370 #if defined key_dynspg_ts 371 IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part372 zcorr = tabres(ji,jj) - vn_b(ji,jj)373 vb_b(ji,jj) = vb_b(ji,jj) + atfp * zcorr * vmask(ji,jj,1)374 END IF375 #endif413 IF ( .NOT.ln_dynspg_ts .OR. (ln_dynspg_ts.AND.(.NOT.ln_bt_fw)) ) THEN 414 IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN ! Add asselin part 415 zcorr = tabres(ji,jj) - vn_b(ji,jj) 416 vb_b(ji,jj) = vb_b(ji,jj) + atfp * zcorr * vmask(ji,jj,1) 417 END IF 418 ENDIF 376 419 vn_b(ji,jj) = tabres(ji,jj) * vmask(ji,jj,1) 377 420 ! … … 379 422 spgv(ji,jj) = 0.e0 380 423 DO jk=1,jpkm1 381 spgv(ji,jj) = spgv(ji,jj) + fse3v_b(ji,jj,jk) * vb(ji,jj,jk)382 END DO 383 spgv(ji,jj) = spgv(ji,jj) * hvr_b(ji,jj)424 spgv(ji,jj) = spgv(ji,jj) + e3v_b(ji,jj,jk) * vb(ji,jj,jk) 425 END DO 426 spgv(ji,jj) = spgv(ji,jj) * r1_hv_b(ji,jj) 384 427 ! 385 428 zcorr = vb_b(ji,jj) - spgv(ji,jj) … … 391 434 END DO 392 435 ENDIF 393 436 ! 394 437 END SUBROUTINE updatev2d 395 438 439 396 440 SUBROUTINE updateSSH( tabres, i1, i2, j1, j2, before ) 397 441 !!--------------------------------------------- 398 442 !! *** ROUTINE updateSSH *** 399 443 !!--------------------------------------------- 400 # include "domzgr_substitute.h90"401 402 444 INTEGER, INTENT(in) :: i1, i2, j1, j2 403 445 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 404 446 LOGICAL, INTENT(in) :: before 405 447 !! 406 448 INTEGER :: ji, jj 407 449 !!--------------------------------------------- 450 ! 408 451 IF (before) THEN 409 452 DO jj=j1,j2 … … 413 456 END DO 414 457 ELSE 415 416 #if ! defined key_dynspg_ts 417 IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN 458 IF( .NOT.ln_dynspg_ts .OR. ( ln_dynspg_ts .AND. .NOT.ln_bt_fw ) ) THEN 459 IF (.NOT.(lk_agrif_fstep.AND.(neuler==0))) THEN 460 DO jj=j1,j2 461 DO ji=i1,i2 462 sshb(ji,jj) = sshb(ji,jj) & 463 & + atfp * ( tabres(ji,jj) - sshn(ji,jj) ) * tmask(ji,jj,1) 464 END DO 465 END DO 466 ENDIF 467 ENDIF 468 ! 469 DO jj=j1,j2 470 DO ji=i1,i2 471 sshn(ji,jj) = tabres(ji,jj) * tmask(ji,jj,1) 472 END DO 473 END DO 474 ENDIF 475 ! 476 END SUBROUTINE updateSSH 477 478 479 SUBROUTINE updateub2b( tabres, i1, i2, j1, j2, before ) 480 !!--------------------------------------------- 481 !! *** ROUTINE updateub2b *** 482 !!--------------------------------------------- 483 INTEGER, INTENT(in) :: i1, i2, j1, j2 484 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 485 LOGICAL, INTENT(in) :: before 486 !! 487 INTEGER :: ji, jj 488 REAL(wp) :: zrhoy 489 !!--------------------------------------------- 490 ! 491 IF (before) THEN 492 zrhoy = Agrif_Rhoy() 493 DO jj=j1,j2 494 DO ji=i1,i2 495 tabres(ji,jj) = ub2_i_b(ji,jj) * e2u(ji,jj) 496 END DO 497 END DO 498 tabres = zrhoy * tabres 499 ELSE 500 DO jj=j1,j2 501 DO ji=i1,i2 502 ub2_b(ji,jj) = tabres(ji,jj) / e2u(ji,jj) 503 END DO 504 END DO 505 ENDIF 506 ! 507 END SUBROUTINE updateub2b 508 509 510 SUBROUTINE updatevb2b( tabres, i1, i2, j1, j2, before ) 511 !!--------------------------------------------- 512 !! *** ROUTINE updatevb2b *** 513 !!--------------------------------------------- 514 INTEGER, INTENT(in) :: i1, i2, j1, j2 515 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 516 LOGICAL, INTENT(in) :: before 517 !! 518 INTEGER :: ji, jj 519 REAL(wp) :: zrhox 520 !!--------------------------------------------- 521 ! 522 IF (before) THEN 523 zrhox = Agrif_Rhox() 524 DO jj=j1,j2 525 DO ji=i1,i2 526 tabres(ji,jj) = vb2_i_b(ji,jj) * e1v(ji,jj) 527 END DO 528 END DO 529 tabres = zrhox * tabres 530 ELSE 531 DO jj=j1,j2 532 DO ji=i1,i2 533 vb2_b(ji,jj) = tabres(ji,jj) / e1v(ji,jj) 534 END DO 535 END DO 536 ENDIF 537 ! 538 END SUBROUTINE updatevb2b 539 540 541 SUBROUTINE update_scales( tabres, i1, i2, j1, j2, k1, k2, n1,n2, before ) 542 ! currently not used 543 !!--------------------------------------------- 544 !! *** ROUTINE updateT *** 545 !!--------------------------------------------- 546 INTEGER, INTENT(in) :: i1,i2,j1,j2,k1,k2,n1,n2 547 REAL(wp),DIMENSION(i1:i2,j1:j2,k1:k2,n1:n2), INTENT(inout) :: tabres 548 LOGICAL, iNTENT(in) :: before 549 ! 550 INTEGER :: ji,jj,jk 551 REAL(wp) :: ztemp 552 !!--------------------------------------------- 553 554 IF (before) THEN 555 DO jk=k1,k2 418 556 DO jj=j1,j2 419 557 DO ji=i1,i2 420 sshb(ji,jj) = sshb(ji,jj) & 421 & + atfp * ( tabres(ji,jj) - sshn(ji,jj) ) * tmask(ji,jj,1) 422 END DO 423 END DO 424 ENDIF 425 #endif 426 DO jj=j1,j2 427 DO ji=i1,i2 428 sshn(ji,jj) = tabres(ji,jj) * tmask(ji,jj,1) 429 END DO 430 END DO 431 ENDIF 432 433 END SUBROUTINE updateSSH 434 435 SUBROUTINE updateub2b( tabres, i1, i2, j1, j2, before ) 436 !!--------------------------------------------- 437 !! *** ROUTINE updateub2b *** 438 !!--------------------------------------------- 439 440 INTEGER, INTENT(in) :: i1, i2, j1, j2 441 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 442 LOGICAL, INTENT(in) :: before 443 444 INTEGER :: ji, jj 445 REAL(wp) :: zrhoy 446 447 IF (before) THEN 448 zrhoy = Agrif_Rhoy() 449 DO jj=j1,j2 450 DO ji=i1,i2 451 tabres(ji,jj) = ub2_i_b(ji,jj) * e2u(ji,jj) 452 END DO 453 END DO 454 tabres = zrhoy * tabres 455 ELSE 456 DO jj=j1,j2 457 DO ji=i1,i2 458 ub2_b(ji,jj) = tabres(ji,jj) / e2u(ji,jj) 459 END DO 460 END DO 461 ENDIF 462 463 END SUBROUTINE updateub2b 464 465 SUBROUTINE updatevb2b( tabres, i1, i2, j1, j2, before ) 466 !!--------------------------------------------- 467 !! *** ROUTINE updatevb2b *** 468 !!--------------------------------------------- 469 470 INTEGER, INTENT(in) :: i1, i2, j1, j2 471 REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) :: tabres 472 LOGICAL, INTENT(in) :: before 473 474 INTEGER :: ji, jj 475 REAL(wp) :: zrhox 476 477 IF (before) THEN 478 zrhox = Agrif_Rhox() 479 DO jj=j1,j2 480 DO ji=i1,i2 481 tabres(ji,jj) = vb2_i_b(ji,jj) * e1v(ji,jj) 482 END DO 483 END DO 484 tabres = zrhox * tabres 485 ELSE 486 DO jj=j1,j2 487 DO ji=i1,i2 488 vb2_b(ji,jj) = tabres(ji,jj) / e1v(ji,jj) 489 END DO 490 END DO 491 ENDIF 492 493 END SUBROUTINE updatevb2b 558 tabres(ji,jj,jk,1) = e1t(ji,jj)*e2t(ji,jj)*tmask(ji,jj,jk) 559 tabres(ji,jj,jk,2) = e1t(ji,jj)*tmask(ji,jj,jk) 560 tabres(ji,jj,jk,3) = e2t(ji,jj)*tmask(ji,jj,jk) 561 END DO 562 END DO 563 END DO 564 tabres(:,:,:,1)=tabres(:,:,:,1)*Agrif_Rhox()*Agrif_Rhoy() 565 tabres(:,:,:,2)=tabres(:,:,:,2)*Agrif_Rhox() 566 tabres(:,:,:,3)=tabres(:,:,:,3)*Agrif_Rhoy() 567 ELSE 568 DO jk=k1,k2 569 DO jj=j1,j2 570 DO ji=i1,i2 571 IF( tabres(ji,jj,jk,1) .NE. 0. ) THEN 572 print *,'VAL = ',ji,jj,jk,tabres(ji,jj,jk,1),e1t(ji,jj)*e2t(ji,jj)*tmask(ji,jj,jk) 573 print *,'VAL2 = ',ji,jj,jk,tabres(ji,jj,jk,2),e1t(ji,jj)*tmask(ji,jj,jk) 574 print *,'VAL3 = ',ji,jj,jk,tabres(ji,jj,jk,3),e2t(ji,jj)*tmask(ji,jj,jk) 575 ztemp = sqrt(tabres(ji,jj,jk,1)/(tabres(ji,jj,jk,2)*tabres(ji,jj,jk,3))) 576 print *,'CORR = ',ztemp-1. 577 print *,'NEW VALS = ',tabres(ji,jj,jk,2)*ztemp,tabres(ji,jj,jk,3)*ztemp, & 578 tabres(ji,jj,jk,2)*ztemp*tabres(ji,jj,jk,3)*ztemp 579 e1t(ji,jj) = tabres(ji,jj,jk,2)*ztemp 580 e2t(ji,jj) = tabres(ji,jj,jk,3)*ztemp 581 END IF 582 END DO 583 END DO 584 END DO 585 ENDIF 586 ! 587 END SUBROUTINE update_scales 588 589 # if defined key_zdftke 590 591 SUBROUTINE updateEN( ptab, i1, i2, j1, j2, k1, k2, before ) 592 !!--------------------------------------------- 593 !! *** ROUTINE updateen *** 594 !!--------------------------------------------- 595 INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2 596 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 597 LOGICAL, INTENT(in) :: before 598 !!--------------------------------------------- 599 ! 600 IF (before) THEN 601 ptab (i1:i2,j1:j2,k1:k2) = en(i1:i2,j1:j2,k1:k2) 602 ELSE 603 en(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 604 ENDIF 605 ! 606 END SUBROUTINE updateEN 607 608 609 SUBROUTINE updateAVT( ptab, i1, i2, j1, j2, k1, k2, before ) 610 !!--------------------------------------------- 611 !! *** ROUTINE updateavt *** 612 !!--------------------------------------------- 613 INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2 614 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 615 LOGICAL, INTENT(in) :: before 616 !!--------------------------------------------- 617 ! 618 IF (before) THEN 619 ptab (i1:i2,j1:j2,k1:k2) = avt_k(i1:i2,j1:j2,k1:k2) 620 ELSE 621 avt_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 622 ENDIF 623 ! 624 END SUBROUTINE updateAVT 625 626 627 SUBROUTINE updateAVM( ptab, i1, i2, j1, j2, k1, k2, before ) 628 !!--------------------------------------------- 629 !! *** ROUTINE updateavm *** 630 !!--------------------------------------------- 631 INTEGER, INTENT(in) :: i1, i2, j1, j2, k1, k2 632 REAL(wp), DIMENSION(i1:i2,j1:j2,k1:k2), INTENT(inout) :: ptab 633 LOGICAL, INTENT(in) :: before 634 !!--------------------------------------------- 635 ! 636 IF (before) THEN 637 ptab (i1:i2,j1:j2,k1:k2) = avm_k(i1:i2,j1:j2,k1:k2) 638 ELSE 639 avm_k(i1:i2,j1:j2,k1:k2) = ptab (i1:i2,j1:j2,k1:k2) 640 ENDIF 641 ! 642 END SUBROUTINE updateAVM 643 644 # endif /* key_zdftke */ 494 645 495 646 #else
Note: See TracChangeset
for help on using the changeset viewer.