- Timestamp:
- 2020-12-14T15:50:33+01:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/UKMO/NEMO_4.0.3_icb_speed_limit/src/OCE/ICB/icbdia.F90
r13587 r14167 83 83 REAL(wp) :: heat_to_bergs_net, heat_to_ocean_net, melt_net 84 84 REAL(wp) :: calving_to_bergs_net 85 REAL(wp) :: vel_factor_min 85 86 86 87 INTEGER :: nbergs_start, nbergs_end, nbergs_calved 87 88 INTEGER :: nbergs_melted 88 INTEGER :: nspeeding_tickets 89 INTEGER , DIMENSION(4) :: nspeeding_tickets 90 INTEGER :: icount_max 89 91 INTEGER , DIMENSION(nclasses) :: nbergs_calved_by_class 90 92 … … 124 126 nbergs_calved = 0 125 127 nbergs_calved_by_class(:) = 0 126 nspeeding_tickets = 0 128 nspeeding_tickets(:) = 0 129 icount_max = 0 130 vel_factor_min = 1._wp 127 131 stored_heat_end = 0._wp 128 132 floating_heat_end = 0._wp … … 157 161 IF( lk_mpp ) THEN 158 162 ALLOCATE( rsumbuf(23) ) ; rsumbuf(:) = 0._wp 159 ALLOCATE( nsumbuf( 4+nclasses) ) ; nsumbuf(:) = 0163 ALLOCATE( nsumbuf(7+nclasses) ) ; nsumbuf(:) = 0 160 164 rsumbuf(1) = floating_mass_start 161 165 rsumbuf(2) = bergs_mass_start … … 265 269 nsumbuf(2) = nbergs_calved 266 270 nsumbuf(3) = nbergs_melted 267 nsumbuf(4 ) = nspeeding_tickets271 nsumbuf(4:7) = nspeeding_tickets(:) 268 272 DO ik = 1, nclasses 269 nsumbuf( 4+ik) = nbergs_calved_by_class(ik)273 nsumbuf(7+ik) = nbergs_calved_by_class(ik) 270 274 END DO 271 CALL mpp_sum( 'icbdia', nsumbuf(1:nclasses+ 4), nclasses+4)275 CALL mpp_sum( 'icbdia', nsumbuf(1:nclasses+7), nclasses+7 ) 272 276 ! 273 277 nbergs_end = nsumbuf(1) 274 278 nbergs_calved = nsumbuf(2) 275 279 nbergs_melted = nsumbuf(3) 276 nspeeding_tickets = nsumbuf(4)280 nspeeding_tickets(:) = nsumbuf(4:7) 277 281 DO ik = 1,nclasses 278 nbergs_calved_by_class(ik)= nsumbuf( 4+ik)282 nbergs_calved_by_class(ik)= nsumbuf(7+ik) 279 283 END DO 280 284 ! 285 CALL mpp_min( 'icbdia', vel_factor_min, 1 ) 286 CALL mpp_max( 'icbdia', icount_max, 1 ) 281 287 ENDIF 282 288 ! … … 329 335 IF (nn_verbose_level > 0) THEN 330 336 WRITE( numicb, '("calved by class = ",i6,20(",",i6))') (nbergs_calved_by_class(ik),ik=1,nclasses) 331 IF( nspeeding_tickets > 0 ) WRITE( numicb, '("speeding tickets issued = ",i6)') nspeeding_tickets 337 WRITE( numicb, '("n speeding tickets by RK4 stage = ",i6,3(",",i6))') (nspeeding_tickets(ik),ik=1,4) 338 IF( SUM(nspeeding_tickets) > 0 ) THEN 339 WRITE( numicb, '("max number of iterations = ",i6)') icount_max 340 WRITE( numicb, '("min velocity reduction factor = ",f12.8)') vel_factor_min 341 ENDIF 332 342 ENDIF 333 343 ! … … 337 347 nbergs_calved = 0 338 348 nbergs_calved_by_class(:) = 0 339 nspeeding_tickets = 0 349 nspeeding_tickets(:) = 0 350 icount_max = 0 351 vel_factor_min = 1._wp 340 352 stored_heat_start = stored_heat_end 341 353 floating_heat_start = floating_heat_end … … 474 486 475 487 476 SUBROUTINE icb_dia_speed() 477 !!---------------------------------------------------------------------- 478 !!---------------------------------------------------------------------- 479 ! 480 IF( .NOT.ln_bergdia ) RETURN 481 nspeeding_tickets = nspeeding_tickets + 1 488 SUBROUTINE icb_dia_speed(pvel_factor, pn_count, pn_stage) 489 !!---------------------------------------------------------------------- 490 !!---------------------------------------------------------------------- 491 REAL(wp), INTENT(in) :: pvel_factor ! factor by which velocity reduced 492 INTEGER , INTENT(in) :: pn_count ! which velocity-limiting stage are we on 493 INTEGER , INTENT(in) :: pn_stage ! which stage of the RK4 calculation are we on 494 ! 495 IF( (.NOT.ln_bergdia) .OR. pn_stage .lt. 1 .OR. pn_stage .gt. 4 ) RETURN 496 nspeeding_tickets(pn_stage) = nspeeding_tickets(pn_stage) + 1 497 vel_factor_min = MIN(vel_factor_min,pvel_factor) ! keep track of minimum reduction factor 498 icount_max = MAX(icount_max,pn_count) ! keep track of maximum number of iterations 482 499 ! 483 500 END SUBROUTINE icb_dia_speed
Note: See TracChangeset
for help on using the changeset viewer.