- Timestamp:
- 2016-07-01T18:02:45+02:00 (8 years ago)
- Location:
- branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/TRA
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/TRA/eosbn2_crs.F90
r5601 r6772 61 61 ! 62 62 PUBLIC eos_crs ! called by step, istate, tranpc and zpsgrd modules 63 PUBLIC bn2_crs ! called by step module64 63 PUBLIC eos_rab_crs ! called by ldfslp, zdfddm, trabbl 65 64 PUBLIC eos_init_crs ! called by istate module … … 392 391 DO ji = 1, jpi_crs 393 392 ! 394 zh = gdept_crs(ji,jj,jk) * r1_Z0 ! depth393 zh = fsdept_crs(ji,jj,jk) * r1_Z0 ! depth 395 394 zt = pts (ji,jj,jk,jp_tem) * r1_T0 ! temperature 396 395 zs = SQRT( ABS( pts(ji,jj,jk,jp_sal) + rdeltaS ) * r1_S0 ) ! square root salinity … … 450 449 zt = pts (ji,jj,jk,jp_tem) - 10._wp ! pot. temperature anomaly (t-T0) 451 450 zs = pts (ji,jj,jk,jp_sal) - 35._wp ! abs. salinity anomaly (s-S0) 452 zh = gdept_crs(ji,jj,jk) ! depth in meters at t-point451 zh = fsdept_crs(ji,jj,jk) ! depth in meters at t-point 453 452 ztm = tmask_crs(ji,jj,jk) ! land/sea bottom mask = surf. mask 454 453 ! … … 689 688 ! 690 689 END SUBROUTINE rab_crs_0d 691 692 693 SUBROUTINE bn2_crs( pts, pab, pn2 )694 !!----------------------------------------------------------------------695 !! *** ROUTINE bn2 ***696 !!697 !! ** Purpose : Compute the local Brunt-Vaisala frequency at the698 !! time-step of the input arguments699 !!700 !! ** Method : pn2 = grav * (alpha dk[T] + beta dk[S] ) / e3w701 !! where alpha and beta are given in pab, and computed on T-points.702 !! N.B. N^2 is set one for all to zero at jk=1 in istate module.703 !!704 !! ** Action : pn2 : square of the brunt-vaisala frequency at w-point705 !!706 !!----------------------------------------------------------------------707 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk,jpts), INTENT(in ) :: pts ! pot. temperature and salinity [Celcius,psu]708 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk,jpts), INTENT(in ) :: pab ! thermal/haline expansion coef. [Celcius-1,psu-1]709 REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk ), INTENT( out) :: pn2 ! Brunt-Vaisala frequency squared [1/s^2]710 !711 INTEGER :: ji, jj, jk ! dummy loop indices712 REAL(wp) :: zaw, zbw, zrw ! local scalars713 !!----------------------------------------------------------------------714 !715 pn2(:,:,:)=0._wp716 717 IF( nn_timing == 1 ) CALL timing_start('bn2')718 !719 DO jk = 2, jpkm1 ! interior points only (2=< jk =< jpkm1 )720 DO jj = 1, jpj_crs ! surface and bottom value set to zero one for all in istate.F90721 DO ji = 1, jpi_crs722 !zrw = ( gdepw_crs(ji,jj,jk ) - gdept_crs(ji,jj,jk) ) &723 ! & / ( gdept_crs(ji,jj,jk-1) - gdept_crs(ji,jj,jk) )724 zrw = gdepw_crs(ji,jj,jk ) - gdept_crs(ji,jj,jk)725 !?IF( gdept_crs(ji,jj,jk-1) - gdept_crs(ji,jj,jk) .NE. 0._wp )THEN726 IF( gdept_crs(ji,jj,jk-1) - gdept_crs(ji,jj,jk) .LT. 0._wp )THEN727 zrw = zrw / ( gdept_crs(ji,jj,jk-1) - gdept_crs(ji,jj,jk) )728 ELSE729 zrw = 0._wp730 ENDIF731 !732 zaw = pab(ji,jj,jk,jp_tem) * (1._wp - zrw) + pab(ji,jj,jk-1,jp_tem) * zrw733 zbw = pab(ji,jj,jk,jp_sal) * (1._wp - zrw) + pab(ji,jj,jk-1,jp_sal) * zrw734 !735 IF( e3w_max_crs(ji,jj,jk) .NE. 0._wp ) THEN736 pn2(ji,jj,jk) = grav * ( zaw * ( pts(ji,jj,jk-1,jp_tem) - pts(ji,jj,jk,jp_tem) ) &737 & - zbw * ( pts(ji,jj,jk-1,jp_sal) - pts(ji,jj,jk,jp_sal) ) ) &738 & * tmask_crs(ji,jj,jk) / e3w_max_crs(ji,jj,jk)739 ENDIF740 END DO741 END DO742 END DO743 !744 IF( nn_timing == 1 ) CALL timing_stop('bn2')745 !746 END SUBROUTINE bn2_crs747 690 748 691 SUBROUTINE eos_init_crs -
branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_tvd_crs.F90
r6101 r6772 91 91 !!---------------------------------------------------------------------- 92 92 ! 93 93 94 IF( nn_timing == 1 ) CALL timing_start('tra_adv_tvd') 94 95 ! … … 126 127 ! upstream tracer flux in the i and j direction 127 128 DO jk = 1, jpkm1 128 DO jj = 1, jpjm1129 DO ji = 1, fs_jpim1 ! vector opt.129 DO jj = 2, jpj_crs-1 130 DO ji = 2, jpi_crs-1 130 131 ! upstream scheme 131 132 zfp_ui = pun(ji,jj,jk) + ABS( pun(ji,jj,jk) ) … … 138 139 END DO 139 140 END DO 141 CALL crs_lbc_lnk( zwx, 'U', -1._wp ) 142 CALL crs_lbc_lnk( zwy, 'V', -1._wp ) 140 143 ! upstream tracer flux in the k direction 141 144 ! Surface value 142 145 IF( lk_vvl ) THEN ; zwz(:,:, 1 ) = 0.e0 ! volume variable 143 ELSE ; zwz(:,:, 1 ) = pwn(:,:,1) * ptb(:,:,1,jn) ! linear free surface146 ELSE ; zwz(:,:, 1 ) = pwn(:,:,1) !cbr * ptb(:,:,1,jn) ! linear free surface 144 147 ENDIF 145 148 ! Interior value 146 149 DO jk = 2, jpkm1 147 DO jj = 1, jpj148 DO ji = 1, jpi150 DO jj = 2, jpj_crs-1 151 DO ji = nldi_crs, nlei_crs 149 152 zfp_wk = pwn(ji,jj,jk) + ABS( pwn(ji,jj,jk) ) 150 153 zfm_wk = pwn(ji,jj,jk) - ABS( pwn(ji,jj,jk) ) … … 153 156 END DO 154 157 END DO 158 CALL crs_lbc_lnk( zwz, 'T', 1. ) 159 155 160 ! total advective trend 156 161 DO jk = 1, jpkm1 157 162 z2dtt = p2dt(jk) 158 DO jj = 2, jpj m1159 DO ji = fs_2, fs_jpim1 ! vector opt.163 DO jj = 2, jpj_crs-1 164 DO ji = 2, jpi_crs-1 160 165 zbtr = r1_bt_crs(ji,jj,jk) 161 166 ! total intermediate advective trends … … 163 168 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 164 169 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) 165 ! update and guess with monotonic sheme 170 166 171 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 167 172 zwi(ji,jj,jk) = ( ptb(ji,jj,jk,jn) + z2dtt * ztra ) * tmask_crs(ji,jj,jk) … … 169 174 END DO 170 175 END DO 176 171 177 ! ! Lateral boundary conditions on zwi (unchanged sign) 172 178 CALL crs_lbc_lnk( zwi, 'T', 1. ) … … 187 193 ! antidiffusive flux on i and j 188 194 DO jk = 1, jpkm1 189 DO jj = 1, jpjm1190 DO ji = 1, fs_jpim1 ! vector opt.195 DO jj = 2, jpj_crs-1 196 DO ji = 2, jpi_crs-1 191 197 zwx(ji,jj,jk) = 0.5 * pun(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji+1,jj,jk,jn) ) - zwx(ji,jj,jk) 192 198 zwy(ji,jj,jk) = 0.5 * pvn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj+1,jk,jn) ) - zwy(ji,jj,jk) … … 198 204 ! 199 205 DO jk = 2, jpkm1 ! Interior value 200 DO jj = 1, jpj201 DO ji = 1, jpi206 DO jj = 2, jpj_crs-1 207 DO ji = 2, jpi_crs-1 202 208 zwz(ji,jj,jk) = 0.5 * pwn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) ) - zwz(ji,jj,jk) 203 209 END DO 204 210 END DO 205 211 END DO 206 212 CALL crs_lbc_lnk( zwx, 'U', -1. ) ; CALL crs_lbc_lnk( zwy, 'V', -1. ) ! Lateral bondary conditions 207 213 CALL crs_lbc_lnk( zwz, 'W', 1. ) … … 214 220 ! ------------------------------------ 215 221 DO jk = 1, jpkm1 216 DO jj = 2, jpj m1217 DO ji = fs_2, fs_jpim1 ! vector opt.222 DO jj = 2, jpj_crs-1 223 DO ji = 2, jpi_crs-1 218 224 zbtr = r1_bt_crs(ji,jj,jk) 219 225 ! total advective trends … … 247 253 END DO 248 254 ! 255 249 256 CALL wrk_dealloc( jpi, jpj, jpk, zwi, zwz , zwx, zwy ) 250 257 IF( l_trd ) CALL wrk_dealloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz ) … … 302 309 ikm1 = MAX(jk-1,1) 303 310 z2dtt = p2dt(jk) 304 DO jj = 2, jpj m1305 DO ji = fs_2, fs_jpim1 ! vector opt.311 DO jj = 2, jpj_crs-1 312 DO ji = 2, jpi_crs-1 306 313 307 314 ! search maximum in neighbourhood … … 339 346 ! ---------------------------------------- 340 347 DO jk = 1, jpkm1 341 DO jj = 2, jpj m1342 DO ji = fs_2, fs_jpim1 ! vector opt.348 DO jj = 2, jpj_crs-1 349 DO ji = 2, jpi_crs-1 343 350 zau = MIN( 1.e0, zbetdo(ji,jj,jk), zbetup(ji+1,jj,jk) ) 344 351 zbu = MIN( 1.e0, zbetup(ji,jj,jk), zbetdo(ji+1,jj,jk) ) -
branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_iso_crs.F90
r6101 r6772 10 10 !! 3.3 ! 2010-09 (C. Ethe, G. Madec) Merge TRA-TRC 11 11 !!---------------------------------------------------------------------- 12 #if defined key_ldfslp || defined key_esopa12 #if ( defined key_ldfslp || defined key_esopa ) && defined key_crs 13 13 !!---------------------------------------------------------------------- 14 14 !! 'key_ldfslp' slope of the lateral diffusive direction … … 19 19 !! the isopycnal or geopotential s-coord. operator 20 20 !!---------------------------------------------------------------------- 21 ! USE oce ! ocean dynamics and active tracers22 ! USE dom_oce ! ocean space and time domain23 ! USE trc_oce ! share passive tracers/Ocean variables24 ! USE zdf_oce ! ocean vertical physics25 ! USE ldftra_oce ! ocean active tracers: lateral physics26 ! USE ldfslp ! iso-neutral slopes27 21 USE ldfslp_crs ! iso-neutral slopes 28 22 USE diaptr ! poleward transport diagnostics … … 35 29 USE wrk_nemo ! Memory Allocation 36 30 USE timing ! Timing 37 ! USE crs38 31 USE oce_trc 39 32 USE iom, ONLY : iom_put,iom_swap … … 113 106 REAL(wp) :: zztmp ! local scalar 114 107 #endif 108 REAL(wp) :: zmin,zmax 115 109 REAL(wp), POINTER, DIMENSION(:,: ) :: zdkt, zdk1t, z2d 116 110 REAL(wp), POINTER, DIMENSION(:,:,:) :: zdit, zdjt, ztfw , zftu, zftv … … 188 182 & + tmask_crs(ji,jj+1,jk+1) + tmask_crs(ji,jj,jk ), 1. ) 189 183 ! 190 zcof1 = - fsahtu(ji,jj,jk) * e2e3u_msk(ji,jj,jk) * uslp_crs(ji,jj,jk) * zmsku / MAX( 1._wp , e3u_max_crs(ji,jj,jk))191 zcof2 = - fsahtv(ji,jj,jk) * e1e3v_msk(ji,jj,jk) * vslp_crs(ji,jj,jk) * zmskv / MAX( 1._wp , e3v_max_crs(ji,jj,jk))184 zcof1 = - fsahtu(ji,jj,jk) * e2e3u_msk(ji,jj,jk) * uslp_crs(ji,jj,jk) * zmsku / MAX( 1._wp , fse3u_max_crs(ji,jj,jk)) 185 zcof2 = - fsahtv(ji,jj,jk) * e1e3v_msk(ji,jj,jk) * vslp_crs(ji,jj,jk) * zmskv / MAX( 1._wp , fse3v_max_crs(ji,jj,jk)) 192 186 ! 193 187 zftu(ji,jj,jk ) = ( zabe1 * zdit(ji,jj,jk) & … … 199 193 END DO 200 194 END DO 201 CALL iom_swap( "nemo_crs" )202 CALL iom_put( "zftu" , zftu )203 CALL iom_put( "zftv" , zftv )204 CALL iom_swap( "nemo" )205 195 206 196 ! II.4 Second derivative (divergence) and add to the general trend -
branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_lap_crs.F90
r6101 r6772 124 124 ikv = mbkv_crs(ji,jj) 125 125 IF( iku == jk ) THEN 126 zabe1 = fsahtu(ji,jj,iku) * umask_crs(ji,jj,iku) * e1ur(ji,jj) * e3u_crs(ji,jj,iku)126 zabe1 = fsahtu(ji,jj,iku) * umask_crs(ji,jj,iku) * e1ur(ji,jj) * fse3u_crs(ji,jj,iku) 127 127 ztu(ji,jj,jk) = zabe1 * pgu(ji,jj,jn) 128 128 ENDIF 129 129 IF( ikv == jk ) THEN 130 zabe2 = fsahtv(ji,jj,ikv) * vmask_crs(ji,jj,ikv) * e2vr(ji,jj) * e3v_crs(ji,jj,ikv)130 zabe2 = fsahtv(ji,jj,ikv) * vmask_crs(ji,jj,ikv) * e2vr(ji,jj) * fse3v_crs(ji,jj,ikv) 131 131 ztv(ji,jj,jk) = zabe2 * pgv(ji,jj,jn) 132 132 ENDIF -
branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/TRA/tranxt.F90
r5602 r6772 49 49 USE agrif_opa_interp 50 50 #endif 51 USE crs 51 52 52 53 IMPLICIT NONE … … 56 57 PUBLIC tra_nxt_fix ! to be used in trcnxt 57 58 PUBLIC tra_nxt_vvl ! to be used in trcnxt 59 PUBLIC tra_nxt_vvl_crs ! to be used in trcnxt 58 60 59 61 REAL(wp) :: rbcp ! Brown & Campana parameters for semi-implicit hpg … … 349 351 END SUBROUTINE tra_nxt_vvl 350 352 353 SUBROUTINE tra_nxt_vvl_crs( kt, kit000, p2dt, cdtype, ptb, ptn, pta, psbc_tc, psbc_tc_b, kjpt ) 354 !!---------------------------------------------------------------------- 355 !! *** ROUTINE tra_nxt_vvl *** 356 !! 357 !! ** Purpose : Time varying volume: apply the Asselin time filter 358 !! and swap the tracer fields. 359 !! 360 !! ** Method : - Apply a thickness weighted Asselin time filter on now fields. 361 !! - save in (ta,sa) a thickness weighted average over the three 362 !! time levels which will be used to compute rdn and thus the semi- 363 !! implicit hydrostatic pressure gradient (ln_dynhpg_imp = T) 364 !! - swap tracer fields to prepare the next time_step. 365 !! This can be summurized for tempearture as: 366 !! ztm = ( e3t_n*tn + rbcp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) ln_dynhpg_imp = T 367 !! /( e3t_n + rbcp*[ e3t_b - 2 e3t_n + e3t_a ] ) 368 !! ztm = 0 otherwise 369 !! tb = ( e3t_n*tn + atfp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) 370 !! /( e3t_n + atfp*[ e3t_b - 2 e3t_n + e3t_a ] ) 371 !! tn = ta 372 !! ta = zt (NB: reset to 0 after eos_bn2 call) 373 !! 374 !! ** Action : - (tb,sb) and (tn,sn) ready for the next time step 375 !! - (ta,sa) time averaged (t,s) (ln_dynhpg_imp = T) 376 !!---------------------------------------------------------------------- 377 INTEGER , INTENT(in ) :: kt ! ocean time-step index 378 INTEGER , INTENT(in ) :: kit000 ! first time step index 379 REAL(wp) , INTENT(in ), DIMENSION(jpk) :: p2dt ! time-step 380 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 381 INTEGER , INTENT(in ) :: kjpt ! number of tracers 382 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb ! before tracer fields 383 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptn ! now tracer fields 384 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta ! tracer trend 385 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,kjpt) :: psbc_tc ! surface tracer content 386 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,kjpt) :: psbc_tc_b ! before surface tracer content 387 388 !! 389 LOGICAL :: ll_tra_hpg, ll_traqsr, ll_rnf ! local logical 390 INTEGER :: ji, jj, jk, jn ! dummy loop indices 391 REAL(wp) :: zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d ! local scalar 392 REAL(wp) :: zfact2, ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d ! - - 393 !!---------------------------------------------------------------------- 394 !!---------------------------------------------------------------------- 395 ! 396 IF( kt == kit000 ) THEN 397 IF(lwp) WRITE(numout,*) 398 IF(lwp) WRITE(numout,*) 'tra_nxt_vvl : time stepping', cdtype 399 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 400 ENDIF 401 ! 402 IF( cdtype == 'TRA' ) THEN 403 ll_tra_hpg = ln_dynhpg_imp ! active tracers case and semi-implicit hpg 404 ll_traqsr = ln_traqsr ! active tracers case and solar penetration 405 ll_rnf = ln_rnf ! active tracers case and river runoffs 406 ELSE 407 ll_tra_hpg = .FALSE. ! passive tracers case or NO semi-implicit hpg 408 ll_traqsr = .FALSE. ! active tracers case and NO solar penetration 409 ll_rnf = .FALSE. ! passive tracers or NO river runoffs 410 ENDIF 411 ! 412 DO jn = 1, kjpt 413 DO jk = 1, jpkm1 414 zfact1 = atfp * p2dt(jk) 415 zfact2 = zfact1 / rau0 416 DO jj = 1, jpj 417 DO ji = 1, jpi 418 ze3t_b = fse3t_b_crs(ji,jj,jk) 419 ze3t_n = fse3t_n_crs(ji,jj,jk) 420 ze3t_a = fse3t_a_crs(ji,jj,jk) 421 ! ! tracer content at Before, now and after 422 ztc_b = ptb(ji,jj,jk,jn) * ze3t_b 423 ztc_n = ptn(ji,jj,jk,jn) * ze3t_n 424 ztc_a = pta(ji,jj,jk,jn) * ze3t_a 425 ! 426 ze3t_d = ze3t_a - 2. * ze3t_n + ze3t_b 427 ztc_d = ztc_a - 2. * ztc_n + ztc_b 428 ! 429 ze3t_f = ze3t_n + atfp * ze3t_d 430 ztc_f = ztc_n + atfp * ztc_d 431 ! 432 IF( jk == 1 ) THEN ! first level 433 ze3t_f = ze3t_f - zfact2 * ( emp_b_crs(ji,jj) - emp_crs(ji,jj) + rnf_crs(ji,jj) - rnf_b_crs(ji,jj) ) 434 ztc_f = ztc_f - zfact1 * ( psbc_tc(ji,jj,jn) - psbc_tc_b(ji,jj,jn) ) 435 ENDIF 436 !cbr as it is a subroutine dedicated to crs, TRA options are not necessary 437 !cbr IF( ll_traqsr .AND. jn == jp_tem .AND. jk <= nksr ) & ! solar penetration (temperature only) 438 !cbr & ztc_f = ztc_f - zfact1 * ( qsr_hc(ji,jj,jk) - qsr_hc_b(ji,jj,jk) ) 439 !cbr 440 !cbr IF( ll_rnf .AND. jk <= nk_rnf(ji,jj) ) & ! river runoffs 441 !cbr & ztc_f = ztc_f - zfact1 * ( rnf_tsc(ji,jj,jn) - rnf_tsc_b(ji,jj,jn) ) & 442 !cbr & * fse3t_n(ji,jj,jk) / h_rnf(ji,jj) 443 444 ze3t_f = 1.e0 / ze3t_f 445 ptb(ji,jj,jk,jn) = ztc_f * ze3t_f ! ptb <-- ptn filtered 446 ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn) ! ptn <-- pta 447 ! 448 IF( ll_tra_hpg ) THEN ! semi-implicit hpg (T & S only) 449 ze3t_d = 1.e0 / ( ze3t_n + rbcp * ze3t_d ) 450 pta(ji,jj,jk,jn) = ze3t_d * ( ztc_n + rbcp * ztc_d ) ! ta <-- Brown & Campana average 451 ENDIF 452 END DO 453 END DO 454 END DO 455 ! 456 END DO 457 ! 458 END SUBROUTINE tra_nxt_vvl_crs 459 460 351 461 !!====================================================================== 352 462 END MODULE tranxt -
branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf_imp_crs.F90
r5601 r6772 78 78 !! ** Action : - pta becomes the after tracer 79 79 !!--------------------------------------------------------------------- 80 USE ieee_arithmetic 80 81 ! 81 82 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 90 91 REAL(wp) :: zrhs, ze3tb, ze3tn, ze3ta ! local scalars 91 92 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwi, zwt,zwd,zws 93 REAL(wp) :: zmin,zmax 92 94 !!--------------------------------------------------------------------- 93 95 ! … … 135 137 END DO 136 138 ELSE IF( l_traldf_rot ) THEN ! standard isoneutral diff 137 138 DO jj = 2, jpj m1139 DO ji = fs_2, fs_jpim1 ! vector opt.139 DO jk = 2, jpkm1 140 DO jj = 2, jpj_crs-1 141 DO ji = 2, jpi_crs-1 140 142 zwt(ji,jj,jk) = zwt(ji,jj,jk) + fsahtw(ji,jj,jk) & 141 143 & * ( wslpi_crs(ji,jj,jk) * wslpi_crs(ji,jj,jk) & … … 148 150 #endif 149 151 DO jk = 1, jpkm1 150 DO jj = 2, jpjm1 151 DO ji = fs_2, fs_jpim1 ! vector opt. 152 ze3ta = ( 1. - r_vvl ) + r_vvl * e3t_crs(ji,jj,jk) ! after scale factor at T-point 153 ze3tn = r_vvl + ( 1. - r_vvl ) * e3t_crs(ji,jj,jk) ! now scale factor at T-point 152 DO jj = 2, jpj_crs-1 153 DO ji = 2, jpi_crs-1 154 155 #if defined key_vvl 156 ze3ta = ( 1. - r_vvl ) + r_vvl * fse3t_a_crs(ji,jj,jk) ! after scale factor at T-point 157 ze3tn = r_vvl + ( 1. - r_vvl ) * fse3t_n_crs(ji,jj,jk) ! now scale factor at T-point 158 #else 159 ze3ta = ( 1. - r_vvl ) + r_vvl * e3t_0_crs(ji,jj,jk) ! after scale factor at T-point 160 ze3tn = r_vvl + ( 1. - r_vvl ) * e3t_0_crs(ji,jj,jk) ! now scale factor at T-point 161 #endif 154 162 !cbr zwi(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk ) / ( ze3tn * e3w_1d(jk ) ) !cc 155 163 !cbr zws(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk+1) / ( ze3tn * e3w_1d(jk+1) ) !cc 156 zwi(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk ) / ( ze3tn * e3w_max_crs(ji,jj,jk) )157 zws(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk+1) / ( ze3tn * e3w_max_crs(ji,jj,jk+1) )164 zwi(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk ) / ( ze3tn * fse3w_max_crs(ji,jj,jk) ) 165 zws(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk+1) / ( ze3tn * fse3w_max_crs(ji,jj,jk+1) ) 158 166 zwd(ji,jj,jk) = ze3ta - zwi(ji,jj,jk) - zws(ji,jj,jk) 159 167 END DO … … 182 190 ! first recurrence: Tk = Dk - Ik Sk-1 / Tk-1 (increasing k) 183 191 ! done once for all passive tracers (so included in the IF instruction) 184 DO jj = 2, jpj m1185 DO ji = fs_2, fs_jpim1192 DO jj = 2, jpj_crs-1 193 DO ji = 2, jpi_crs-1 186 194 zwt(ji,jj,1) = zwd(ji,jj,1) 187 195 END DO 188 196 END DO 189 197 DO jk = 2, jpkm1 190 DO jj = 2, jpj m1191 DO ji = fs_2, fs_jpim1198 DO jj = 2, jpj_crs-1 199 DO ji = 2, jpi_crs-1 192 200 zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwt(ji,jj,jk-1) 193 201 END DO … … 198 206 ! 199 207 ! second recurrence: Zk = Yk - Ik / Tk-1 Zk-1 200 DO jj = 2, jpjm1 201 DO ji = fs_2, fs_jpim1 202 ze3tb = ( 1. - r_vvl ) + r_vvl * e3t_crs(ji,jj,1) 203 ze3tn = ( 1. - r_vvl ) + r_vvl * e3t_crs(ji,jj,1) 208 DO jj = 2, jpj_crs-1 209 DO ji = 2, jpi_crs-1 210 #if defined key_vvl 211 ze3tb = ( 1. - r_vvl ) + r_vvl * fse3t_b_crs(ji,jj,1) 212 ze3tn = ( 1. - r_vvl ) + r_vvl * fse3t_n_crs(ji,jj,1) 213 #else 214 ze3tb = ( 1. - r_vvl ) + r_vvl * e3t_0_crs(ji,jj,1) 215 ze3tn = ( 1. - r_vvl ) + r_vvl * e3t_0_crs(ji,jj,1) 216 #endif 204 217 pta(ji,jj,1,jn) = ze3tb * ptb(ji,jj,1,jn) + p2dt(1) * ze3tn * pta(ji,jj,1,jn) 205 218 END DO … … 207 220 208 221 DO jk = 2, jpkm1 209 DO jj = 2, jpjm1 210 DO ji = fs_2, fs_jpim1 211 ze3tb = ( 1. - r_vvl ) + r_vvl * e3t_crs(ji,jj,jk) 212 ze3tn = ( 1. - r_vvl ) + r_vvl * e3t_crs(ji,jj,jk) 222 DO jj = 2, jpj_crs-1 223 DO ji = 2, jpi_crs-1 224 #if defined key_vvl 225 ze3tb = ( 1. - r_vvl ) + r_vvl * fse3t_b_crs(ji,jj,jk) 226 ze3tn = ( 1. - r_vvl ) + r_vvl * fse3t_n_crs(ji,jj,jk) 227 #else 228 ze3tb = ( 1. - r_vvl ) + r_vvl * e3t_0_crs(ji,jj,jk) 229 ze3tn = ( 1. - r_vvl ) + r_vvl * e3t_0_crs(ji,jj,jk) 230 #endif 213 231 zrhs = ze3tb * ptb(ji,jj,jk,jn) + p2dt(jk) * ze3tn * pta(ji,jj,jk,jn) ! zrhs=right hand side 214 pta(ji,jj,jk,jn) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * pta(ji,jj,jk-1,jn) 215 232 pta(ji,jj,jk,jn) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * pta(ji,jj,jk-1,jn) 216 233 END DO 217 234 END DO … … 219 236 220 237 ! third recurrence: Xk = (Zk - Sk Xk+1 ) / Tk (result is the after tracer) 221 DO jj = 2, jpj m1222 DO ji = fs_2, fs_jpim1238 DO jj = 2, jpj_crs-1 239 DO ji = 2, jpi_crs-1 223 240 pta(ji,jj,jpkm1,jn) = pta(ji,jj,jpkm1,jn) / zwt(ji,jj,jpkm1) * tmask_crs(ji,jj,jpkm1) 224 241 END DO 225 242 END DO 226 243 DO jk = jpk-2, 1, -1 227 DO jj = 2, jpj m1228 DO ji = fs_2, fs_jpim1244 DO jj = 2, jpj_crs-1 245 DO ji = 2, jpi_crs-1 229 246 pta(ji,jj,jk,jn) = ( pta(ji,jj,jk,jn) - zws(ji,jj,jk) * pta(ji,jj,jk+1,jn) ) & 230 & / zwt(ji,jj,jk) * tmask_crs(ji,jj,jk) 231 232 END DO 233 END DO 234 END DO 235 247 & / zwt(ji,jj,jk) * tmask_crs(ji,jj,jk) 248 END DO 249 END DO 250 END DO 236 251 ! ! ================= ! 237 252 END DO ! end tracer loop ! -
branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/TRA/zpshde_crs.F90
r5601 r6772 96 96 INTEGER :: iku, ikv, ikum1, ikvm1 ! partial step level (ocean bottom level) at u- and v-points 97 97 REAL(wp) :: ze3wu, ze3wv, zmaxu, zmaxv ! temporary scalars 98 !cc REAL(wp), POINTER, DIMENSION(:,: ) :: zri, zrj, zhi, zhj99 !cc REAL(wp), POINTER, DIMENSION(:,:,:) :: zti, zte ! interpolated value of tracer100 98 REAL(wp), ALLOCATABLE, DIMENSION(:,: ) :: zri, zrj, zhi, zhj 101 99 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zti, zte ! interpolated value of tracer … … 105 103 IF( nn_timing == 1 ) CALL timing_start( 'zps_hde_crs') 106 104 ! 107 !! CALL wrk_alloc( jpi, jpj, zri, zrj, zhi, zhj )108 !! CALL wrk_alloc( jpi, jpj, kjpt, zti, zte )109 105 ALLOCATE( zri(jpi_crs,jpj_crs) , zrj(jpi_crs,jpj_crs), zte(jpi_crs ,jpj_crs ,kjpt), & 110 106 & zhi(jpi_crs,jpj_crs) , zhj(jpi_crs,jpj_crs), zti(jpi_crs ,jpj_crs ,kjpt)) … … 112 108 DO jn = 1, kjpt !== Interpolation of tracers at the last ocean level ==! 113 109 ! 114 # if defined key_vectopt_loop115 jj = 1116 DO ji = 1, jpij-jpi ! vector opt. (forced unrolled)117 # else118 110 DO jj = 1, jpjm1 119 111 DO ji = 1, jpim1 120 # endif 112 121 113 iku = mbku_crs(ji,jj) ; ikum1 = MAX( iku - 1 , 1 ) ! last and before last ocean level at u- & v-points 122 114 ikv = mbkv_crs(ji,jj) ; ikvm1 = MAX( ikv - 1 , 1 ) ! if level first is a p-step, ik.m1=1 123 ! ze3wu = e3w_crs(ji+1,jj ,iku) - e3w_crs(ji,jj,iku) 124 ! ze3wv = e3w_crs(ji ,jj+1,ikv) - e3w_crs(ji,jj,ikv) 125 ze3wu = e3w_max_crs(ji+1,jj ,iku) - e3w_max_crs(ji,jj,iku) 126 ze3wv = e3w_max_crs(ji ,jj+1,ikv) - e3w_max_crs(ji,jj,ikv) 115 ze3wu = e3w_max_0_crs(ji+1,jj ,iku) - e3w_max_0_crs(ji,jj,iku) 116 ze3wv = e3w_max_0_crs(ji ,jj+1,ikv) - e3w_max_0_crs(ji,jj,ikv) 127 117 ! 128 118 ! i- direction 129 119 IF( ze3wu >= 0._wp ) THEN ! case 1 130 zmaxu = ze3wu / e3w_max_crs(ji+1,jj,iku) 131 ! zmaxu = ze3wu / e3w_crs(ji+1,jj,iku) 120 #if defined key_vvl 121 zmaxu = ze3wu / e3w_max_n_crs(ji+1,jj,iku) 122 #else 123 zmaxu = ze3wu / e3w_max_0_crs(ji+1,jj,iku) 124 #endif 132 125 ! interpolated values of tracers 133 126 zti(ji,jj,jn) = pta(ji+1,jj,iku,jn) + zmaxu * ( pta(ji+1,jj,ikum1,jn) - pta(ji+1,jj,iku,jn) ) … … 135 128 pgtu(ji,jj,jn) = umask_crs(ji,jj,1) * ( zti(ji,jj,jn) - pta(ji,jj,iku,jn) ) 136 129 ELSE ! case 2 137 zmaxu = -ze3wu / e3w_max_crs(ji,jj,iku) 138 ! zmaxu = -ze3wu / e3w_crs(ji,jj,iku) 130 #if defined key_vvl 131 zmaxu = -ze3wu / e3w_max_n_crs(ji,jj,iku) 132 #else 133 zmaxu = -ze3wu / e3w_max_0_crs(ji,jj,iku) 134 #endif 139 135 ! interpolated values of tracers 140 136 zti(ji,jj,jn) = pta(ji,jj,iku,jn) + zmaxu * ( pta(ji,jj,ikum1,jn) - pta(ji,jj,iku,jn) ) … … 145 141 ! j- direction 146 142 IF( ze3wv >= 0._wp ) THEN ! case 1 147 zmaxv = ze3wv / e3w_max_crs(ji,jj+1,ikv) 148 ! zmaxv = ze3wv / e3w_crs(ji,jj+1,ikv) 143 #if defined key_vvl 144 zmaxv = ze3wv / e3w_max_n_crs(ji,jj+1,ikv) 145 #else 146 zmaxv = ze3wv / e3w_max_0_crs(ji,jj+1,ikv) 147 #endif 149 148 ! interpolated values of tracers 150 149 zte(ji,jj,jn) = pta(ji,jj+1,ikv,jn) + zmaxv * ( pta(ji,jj+1,ikvm1,jn) - pta(ji,jj+1,ikv,jn) ) … … 152 151 pgtv(ji,jj,jn) = vmask_crs(ji,jj,1) * ( zte(ji,jj,jn) - pta(ji,jj,ikv,jn) ) 153 152 ELSE ! case 2 154 zmaxv = -ze3wv / e3w_max_crs(ji,jj,ikv) 155 ! zmaxv = -ze3wv / e3w_crs(ji,jj,ikv) 153 #if defined key_vvl 154 zmaxv = -ze3wv / e3w_max_n_crs(ji,jj,ikv) 155 #else 156 zmaxv = -ze3wv / e3w_max_0_crs(ji,jj,ikv) 157 #endif 156 158 ! interpolated values of tracers 157 159 zte(ji,jj,jn) = pta(ji,jj,ikv,jn) + zmaxv * ( pta(ji,jj,ikvm1,jn) - pta(ji,jj,ikv,jn) ) … … 160 162 ENDIF 161 163 162 # if ! defined key_vectopt_loop163 164 END DO 164 # endif165 165 END DO 166 166 CALL crs_lbc_lnk( pgtu(:,:,jn), 'U', -1. ) ; CALL crs_lbc_lnk( pgtv(:,:,jn), 'V', -1. ) ! Lateral boundary cond. 167 167 ! 168 168 END DO 169 !WRITE(numout,*) ' test24 ', e3w_max_crs 169 170 170 ! horizontal derivative of density anomalies (rd) 171 171 IF( PRESENT( prd ) ) THEN ! depth of the partial step level 172 # if defined key_vectopt_loop173 jj = 1174 DO ji = 1, jpij-jpi ! vector opt. (forced unrolled)175 # else176 172 DO jj = 1, jpjm1 177 173 DO ji = 1, jpim1 178 # endif 174 179 175 iku = mbku_crs(ji,jj) 180 176 ikv = mbkv_crs(ji,jj) 181 !cc ze3wu = e3w_max_crs(ji+1,jj ,iku) - e3w_max_crs(ji,jj,iku) !gradiant horizontal pas de max 182 ze3wu = e3w_crs(ji+1,jj ,iku) - e3w_crs(ji,jj,iku) 183 !cc ze3wv = e3w_max_crs(ji ,jj+1,ikv) - e3w_max_crs(ji,jj,ikv) 184 ze3wv = e3w_crs(ji ,jj+1,ikv) - e3w_crs(ji,jj,ikv) 185 IF( ze3wu >= 0._wp ) THEN ; zhi(ji,jj) = gdept_crs(ji ,jj,iku) ! i-direction: case 1 186 ELSE ; zhi(ji,jj) = gdept_crs(ji+1,jj,iku) ! - - case 2 187 ENDIF 188 IF( ze3wv >= 0._wp ) THEN ; zhj(ji,jj) = gdept_crs(ji,jj ,ikv) ! j-direction: case 1 189 ELSE ; zhj(ji,jj) = gdept_crs(ji,jj+1,ikv) ! - - case 2 190 ENDIF 191 # if ! defined key_vectopt_loop 177 ze3wu = e3w_0_crs(ji+1,jj ,iku) - e3w_0_crs(ji,jj,iku) 178 ze3wv = e3w_0_crs(ji ,jj+1,ikv) - e3w_0_crs(ji,jj,ikv) 179 IF( ze3wu >= 0._wp ) THEN ; zhi(ji,jj) = fsdept_crs(ji ,jj,iku) ! i-direction: case 1 180 ELSE ; zhi(ji,jj) = fsdept_crs(ji+1,jj,iku) ! - - case 2 181 ENDIF 182 IF( ze3wv >= 0._wp ) THEN ; zhj(ji,jj) = fsdept_crs(ji,jj ,ikv) ! j-direction: case 1 183 ELSE ; zhj(ji,jj) = fsdept_crs(ji,jj+1,ikv) ! - - case 2 184 ENDIF 185 192 186 END DO 193 # endif194 187 END DO 195 188 CALL eos_crs( zti, zhi, zri ) 196 189 CALL eos_crs( zte, zhj, zrj ) 190 197 191 ! Gradient of density at the last level 198 # if defined key_vectopt_loop199 jj = 1200 DO ji = 1, jpij-jpi ! vector opt. (forced unrolled)201 # else202 192 DO jj = 1, jpjm1 203 193 DO ji = 1, jpim1 204 # endif205 194 iku = mbku_crs(ji,jj) 206 195 ikv = mbkv_crs(ji,jj) 207 ! ze3wu = e3w_max_crs(ji+1,jj ,iku) - e3w_max_crs(ji,jj,iku) gradient horizontal 208 ze3wu = e3w_crs(ji+1,jj ,iku) - e3w_crs(ji,jj,iku) 209 ! ze3wv = e3w_max_crs(ji ,jj+1,ikv) - e3w_max_crs(ji,jj,ikv) gradient horizontal 210 ze3wv = e3w_crs(ji ,jj+1,ikv) - e3w_crs(ji,jj,ikv) 196 ze3wu = e3w_0_crs(ji+1,jj ,iku) - e3w_0_crs(ji,jj,iku) 197 ze3wv = e3w_0_crs(ji ,jj+1,ikv) - e3w_0_crs(ji,jj,ikv) 211 198 IF( ze3wu >= 0._wp ) THEN ; pgru(ji,jj) = umask_crs(ji,jj,1) * ( zri(ji ,jj) - prd(ji,jj,iku) ) ! i: 1 212 199 ELSE ; pgru(ji,jj) = umask_crs(ji,jj,1) * ( prd(ji+1,jj,iku) - zri(ji,jj) ) ! i: 2 … … 215 202 ELSE ; pgrv(ji,jj) = vmask_crs(ji,jj,1) * ( prd(ji,jj+1,ikv) - zrj(ji,jj) ) ! j: 2 216 203 ENDIF 217 # if ! defined key_vectopt_loop 204 218 205 END DO 219 # endif220 206 END DO 221 222 207 223 208 CALL crs_lbc_lnk( pgru , 'U', -1. ) ; CALL crs_lbc_lnk( pgrv , 'V', -1. ) ! Lateral boundary conditions … … 225 210 END IF 226 211 ! 227 !!ccCALL wrk_dealloc( jpi, jpj, zri, zrj, zhi, zhj )228 !!ccCALL wrk_dealloc( jpi, jpj, kjpt, zti, zte )229 212 DEALLOCATE( zri , zrj, zte, zhi, zhj, zti) 230 213 !
Note: See TracChangeset
for help on using the changeset viewer.