- Timestamp:
- 2012-04-30T10:27:44+02:00 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2012/dev_r3337_NOCS10_ICB/NEMOGCM/NEMO/OPA_SRC/ICB/icbdia.F90
r3361 r3370 3 3 !!====================================================================== 4 4 !! *** MODULE icbdia *** 5 !! Ocean physics: initialise variables for iceberg budgets and diagnostics5 !! Icebergs: initialise variables for iceberg budgets and diagnostics 6 6 !!====================================================================== 7 !! History : 3.3 .1 ! 2010-01 (Martin&Adcroft) Original code8 !! - 9 !! - 10 !! - 11 !! - 12 !! - 13 !! - 7 !! History : 3.3 ! 2010-01 (Martin, Adcroft) Original code 8 !! - ! 2011-03 (Madec) Part conversion to NEMO form 9 !! - ! Removal of mapping from another grid 10 !! - ! 2011-04 (Alderson) Split into separate modules 11 !! - ! 2011-05 (Alderson) Budgets are now all here with lots 12 !! - ! of silly routines to call to get values in 13 !! - ! from the right points in the code 14 14 !!---------------------------------------------------------------------- 15 15 !!---------------------------------------------------------------------- … … 17 17 !! icb_budget_init : initialise iceberg budgeting 18 18 !!---------------------------------------------------------------------- 19 USE par_oce ! nemoparameters19 USE par_oce ! ocean parameters 20 20 USE dom_oce ! ocean domain 21 21 USE in_out_manager ! nemo IO 22 USE lib_mpp 23 USE iom 24 25 USE icb_oce ! define iceberg arrays 22 USE lib_mpp ! MPP library 23 USE iom ! I/O library 24 USE icb_oce ! iceberg variables 26 25 USE icbutl ! iceberg utility routines 27 26 … … 29 28 PRIVATE 30 29 31 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: berg_melt=>NULL() ! Melting+erosion rate of icebergs (kg/s/m^2) 32 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: buoy_melt=>NULL() ! Buoyancy component of melting rate (kg/s/m^2) 33 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: eros_melt=>NULL() ! Erosion component of melting rate (kg/s/m^2) 34 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: conv_melt=>NULL() ! Convective component of melting rate (kg/s/m^2) 35 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: bits_src=>NULL() ! Mass flux from berg erosion into bergy bits (kg/s/m^2) 36 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: bits_melt=>NULL() ! Melting rate of bergy bits (kg/s/m^2) 37 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: bits_mass=>NULL() ! Mass distribution of bergy bits (kg/s/m^2) 38 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: virtual_area=>NULL() ! Virtual surface coverage by icebergs (m^2) 39 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: berg_mass=>NULL() ! Mass distribution (kg/m^2) 40 REAL(wp), DIMENSION(:,:,:), POINTER, PUBLIC :: real_calving=>NULL() ! Calving rate into iceberg class at calving locations (kg/s) 41 REAL(wp), DIMENSION(:,:) , POINTER, PRIVATE :: tmpc=>NULL() ! Temporary work space 42 REAL(wp), DIMENSION(:) , POINTER, PRIVATE :: rsumbuf=>NULL() ! Temporary work space to reduce mpp exchanges 43 INTEGER , DIMENSION(:) , POINTER, PRIVATE :: nsumbuf=>NULL() ! Temporary work space to reduce mpp exchanges 44 45 REAL(wp) , PRIVATE :: berg_melt_net 46 REAL(wp) , PRIVATE :: bits_src_net 47 REAL(wp) , PRIVATE :: bits_melt_net 48 REAL(wp) , PRIVATE :: bits_mass_start, bits_mass_end 49 REAL(wp) , PRIVATE :: floating_heat_start, floating_heat_end 50 REAL(wp) , PRIVATE :: floating_mass_start, floating_mass_end 51 REAL(wp) , PRIVATE :: bergs_mass_start, bergs_mass_end 52 REAL(wp) , PRIVATE :: stored_start, stored_heat_start 53 REAL(wp) , PRIVATE :: stored_end , stored_heat_end 54 REAL(wp) , PRIVATE :: calving_src_net, calving_out_net 55 REAL(wp) , PRIVATE :: calving_src_heat_net, calving_out_heat_net 56 REAL(wp) , PRIVATE :: calving_src_heat_used_net 57 REAL(wp) , PRIVATE :: calving_rcv_net, calving_ret_net, calving_used_net 58 REAL(wp) , PRIVATE :: heat_to_bergs_net, heat_to_ocean_net, melt_net 59 REAL(wp) , PRIVATE :: calving_to_bergs_net 60 61 INTEGER , PRIVATE :: nbergs_start, nbergs_end, nbergs_calved 62 INTEGER , PRIVATE :: nbergs_melted 63 INTEGER , PRIVATE :: nspeeding_tickets 64 INTEGER , DIMENSION(nclasses) , PRIVATE :: nbergs_calved_by_class 65 66 PUBLIC icb_budget_end ! routine called in icbrun.F90 module 67 PUBLIC icb_budget_init ! routine called in icbini.F90 module 68 PUBLIC icb_budget ! routine called in icbrun.F90 module 69 PUBLIC icb_budget_step ! routine called in icbrun.F90 module 70 PUBLIC icb_budget_put ! routine called in icbrun.F90 module 71 PUBLIC melt_budget ! routine called in icbthm.F90 module 72 PUBLIC size_budget ! routine called in icbthm.F90 module 73 PUBLIC speed_budget ! routine called in icbdyn.F90 module 74 PUBLIC calving_budget ! routine called in icbclv.F90 module 75 PUBLIC incoming_budget ! routine called in icbclv.F90 module 76 30 PUBLIC icb_budget_end ! routine called in icbrun.F90 module 31 PUBLIC icb_budget_init ! routine called in icbini.F90 module 32 PUBLIC icb_budget ! routine called in icbrun.F90 module 33 PUBLIC icb_budget_step ! routine called in icbrun.F90 module 34 PUBLIC icb_budget_put ! routine called in icbrun.F90 module 35 PUBLIC melt_budget ! routine called in icbthm.F90 module 36 PUBLIC size_budget ! routine called in icbthm.F90 module 37 PUBLIC speed_budget ! routine called in icbdyn.F90 module 38 PUBLIC calving_budget ! routine called in icbclv.F90 module 39 PUBLIC incoming_budget ! routine called in icbclv.F90 module 40 41 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: berg_melt => NULL() ! Melting+erosion rate of icebergs [kg/s/m2] 42 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: buoy_melt => NULL() ! Buoyancy component of melting rate [kg/s/m2] 43 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: eros_melt => NULL() ! Erosion component of melting rate [kg/s/m2] 44 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: conv_melt => NULL() ! Convective component of melting rate [kg/s/m2] 45 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: bits_src => NULL() ! Mass flux from berg erosion into bergy bits [kg/s/m2] 46 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: bits_melt => NULL() ! Melting rate of bergy bits [kg/s/m2] 47 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: bits_mass => NULL() ! Mass distribution of bergy bits [kg/s/m2] 48 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: virtual_area => NULL() ! Virtual surface coverage by icebergs [m2] 49 REAL(wp), DIMENSION(:,:) , POINTER, PUBLIC :: berg_mass => NULL() ! Mass distribution [kg/m2] 50 REAL(wp), DIMENSION(:,:,:), POINTER, PUBLIC :: real_calving => NULL() ! Calving rate into iceberg class at 51 ! ! calving locations [kg/s] 52 53 REAL(wp), DIMENSION(:,:) , POINTER :: tmpc => NULL() ! Temporary work space 54 REAL(wp), DIMENSION(:) , POINTER :: rsumbuf => NULL() ! Temporary work space to reduce mpp exchanges 55 INTEGER , DIMENSION(:) , POINTER :: nsumbuf => NULL() ! Temporary work space to reduce mpp exchanges 56 57 REAL(wp) :: berg_melt_net 58 REAL(wp) :: bits_src_net 59 REAL(wp) :: bits_melt_net 60 REAL(wp) :: bits_mass_start , bits_mass_end 61 REAL(wp) :: floating_heat_start , floating_heat_end 62 REAL(wp) :: floating_mass_start , floating_mass_end 63 REAL(wp) :: bergs_mass_start , bergs_mass_end 64 REAL(wp) :: stored_start , stored_heat_start 65 REAL(wp) :: stored_end , stored_heat_end 66 REAL(wp) :: calving_src_net , calving_out_net 67 REAL(wp) :: calving_src_heat_net, calving_out_heat_net 68 REAL(wp) :: calving_src_heat_used_net 69 REAL(wp) :: calving_rcv_net , calving_ret_net , calving_used_net 70 REAL(wp) :: heat_to_bergs_net, heat_to_ocean_net, melt_net 71 REAL(wp) :: calving_to_bergs_net 72 73 INTEGER :: nbergs_start, nbergs_end, nbergs_calved 74 INTEGER :: nbergs_melted 75 INTEGER :: nspeeding_tickets 76 INTEGER , DIMENSION(nclasses) :: nbergs_calved_by_class 77 78 !!---------------------------------------------------------------------- 79 !! NEMO/OPA 3.3 , NEMO Consortium (2011) 80 !! $Id:$ 81 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 82 !!---------------------------------------------------------------------- 77 83 CONTAINS 78 84 79 !!-------------------------------------------------------------------------80 81 85 SUBROUTINE icb_budget_end 82 83 IF( .NOT. ln_bergdia ) RETURN 86 !!---------------------------------------------------------------------- 87 ! 88 IF( .NOT. ln_bergdia ) RETURN 84 89 DEALLOCATE( berg_melt ) 85 90 DEALLOCATE( buoy_melt ) … … 97 102 DEALLOCATE( nsumbuf ) 98 103 ENDIF 99 104 ! 100 105 END SUBROUTINE icb_budget_end 101 106 … … 103 108 104 109 SUBROUTINE icb_budget_init( ) 105 110 !!---------------------------------------------------------------------- 111 !!---------------------------------------------------------------------- 112 ! 106 113 IF( .NOT. ln_bergdia ) RETURN 107 ALLOCATE( berg_melt (jpi,jpj) ) ; berg_melt (:,:)= 0._wp108 ALLOCATE( buoy_melt (jpi,jpj) ) ; buoy_melt (:,:)= 0._wp109 ALLOCATE( eros_melt (jpi,jpj) ) ; eros_melt (:,:)= 0._wp110 ALLOCATE( conv_melt (jpi,jpj) ) ; conv_melt (:,:)= 0._wp111 ALLOCATE( bits_src (jpi,jpj) ) ; bits_src (:,:) = 0._wp112 ALLOCATE( bits_melt (jpi,jpj) ) ; bits_melt (:,:) = 0._wp113 ALLOCATE( bits_mass (jpi,jpj) ) ; bits_mass (:,:) = 0._wp114 ALLOCATE( virtual_area (jpi,jpj) ) ; virtual_area (:,:)= 0._wp115 ALLOCATE( berg_mass (jpi,jpj) ) ; berg_mass (:,:)= 0._wp116 ALLOCATE( real_calving (jpi,jpj,nclasses) ) ; real_calving (:,:,:)=0.117 ALLOCATE( tmpc(jpi,jpj) ) ; tmpc (:,:)=0.114 ALLOCATE( berg_melt (jpi,jpj) ) ; berg_melt (:,:) = 0._wp 115 ALLOCATE( buoy_melt (jpi,jpj) ) ; buoy_melt (:,:) = 0._wp 116 ALLOCATE( eros_melt (jpi,jpj) ) ; eros_melt (:,:) = 0._wp 117 ALLOCATE( conv_melt (jpi,jpj) ) ; conv_melt (:,:) = 0._wp 118 ALLOCATE( bits_src (jpi,jpj) ) ; bits_src (:,:) = 0._wp 119 ALLOCATE( bits_melt (jpi,jpj) ) ; bits_melt (:,:) = 0._wp 120 ALLOCATE( bits_mass (jpi,jpj) ) ; bits_mass (:,:) = 0._wp 121 ALLOCATE( virtual_area (jpi,jpj) ) ; virtual_area(:,:) = 0._wp 122 ALLOCATE( berg_mass (jpi,jpj) ) ; berg_mass (:,:) = 0._wp 123 ALLOCATE( real_calving (jpi,jpj,nclasses) ) ; real_calving(:,:,:) = 0._wp 124 ALLOCATE( tmpc(jpi,jpj) ) ; tmpc (:,:) = 0._wp 118 125 119 126 nbergs_start = 0 … … 167 174 bits_mass_start = rsumbuf(3) 168 175 ENDIF 169 176 ! 170 177 END SUBROUTINE icb_budget_init 171 178 172 !!-------------------------------------------------------------------------173 179 174 180 SUBROUTINE icb_budget( ld_budge ) 175 ! Arguments 176 LOGICAL, INTENT(in) :: ld_budge 177 ! Local variables 178 INTEGER :: ik 179 REAL(wp) :: zunused_calving, ztmpsum, zgrdd_berg_mass, zgrdd_bits_mass 180 181 IF( .NOT. ln_bergdia ) RETURN 182 183 zunused_calving = SUM( berg_grid%calving(:,:) ) 184 ztmpsum = SUM( berg_grid%floating_melt(:,:) * e1e2t(:,:) * tmask_i(:,:) ) 185 melt_net = melt_net + ztmpsum * berg_dt 186 calving_out_net = calving_out_net + ( zunused_calving + ztmpsum ) * berg_dt 187 ztmpsum = SUM( berg_melt(:,:) * e1e2t(:,:) * tmask_i(:,:) ) 188 berg_melt_net = berg_melt_net + ztmpsum * berg_dt 189 ztmpsum = SUM( bits_src(:,:) * e1e2t(:,:) * tmask_i(:,:) ) 190 bits_src_net = bits_src_net + ztmpsum * berg_dt 191 ztmpsum = SUM( bits_melt(:,:) * e1e2t(:,:) * tmask_i(:,:) ) 192 bits_melt_net = bits_melt_net + ztmpsum * berg_dt 193 ztmpsum = SUM( src_calving(:,:) * tmask_i(:,:) ) 194 calving_ret_net = calving_ret_net + ztmpsum * berg_dt 195 ztmpsum = SUM( berg_grid%calving_hflx(:,:) * e1e2t(:,:) * tmask_i(:,:) ) 196 calving_out_heat_net = calving_out_heat_net + ztmpsum * berg_dt ! Units of J 181 !!---------------------------------------------------------------------- 182 !!---------------------------------------------------------------------- 183 LOGICAL, INTENT(in) :: ld_budge 184 ! 185 INTEGER :: ik 186 REAL(wp) :: zunused_calving, ztmpsum, zgrdd_berg_mass, zgrdd_bits_mass 187 !!---------------------------------------------------------------------- 188 ! 189 IF( .NOT. ln_bergdia ) RETURN 190 191 zunused_calving = SUM( berg_grid%calving(:,:) ) 192 ztmpsum = SUM( berg_grid%floating_melt(:,:) * e1e2t(:,:) * tmask_i(:,:) ) 193 melt_net = melt_net + ztmpsum * berg_dt 194 calving_out_net = calving_out_net + ( zunused_calving + ztmpsum ) * berg_dt 195 ztmpsum = SUM( berg_melt(:,:) * e1e2t(:,:) * tmask_i(:,:) ) 196 berg_melt_net = berg_melt_net + ztmpsum * berg_dt 197 ztmpsum = SUM( bits_src(:,:) * e1e2t(:,:) * tmask_i(:,:) ) 198 bits_src_net = bits_src_net + ztmpsum * berg_dt 199 ztmpsum = SUM( bits_melt(:,:) * e1e2t(:,:) * tmask_i(:,:) ) 200 bits_melt_net = bits_melt_net + ztmpsum * berg_dt 201 ztmpsum = SUM( src_calving(:,:) * tmask_i(:,:) ) 202 calving_ret_net = calving_ret_net + ztmpsum * berg_dt 203 ztmpsum = SUM( berg_grid%calving_hflx(:,:) * e1e2t(:,:) * tmask_i(:,:) ) 204 calving_out_heat_net = calving_out_heat_net + ztmpsum * berg_dt ! Units of J 197 205 198 206 IF( ld_budge ) THEN 199 stored_end 200 stored_heat_end 201 floating_mass_end 202 bergs_mass_end 203 bits_mass_end 204 floating_heat_end 205 206 nbergs_end 207 zgrdd_berg_mass 208 zgrdd_bits_mass 207 stored_end = SUM( berg_grid%stored_ice(:,:,:) ) 208 stored_heat_end = SUM( berg_grid%stored_heat(:,:) ) 209 floating_mass_end = sum_mass( first_berg ) 210 bergs_mass_end = sum_mass( first_berg,justbergs=.true. ) 211 bits_mass_end = sum_mass( first_berg,justbits=.true. ) 212 floating_heat_end = sum_heat( first_berg ) 213 214 nbergs_end = count_bergs() 215 zgrdd_berg_mass = SUM( berg_mass (:,:)*e1e2t(:,:)*tmask_i(:,:) ) 216 zgrdd_bits_mass = SUM( bits_mass(:,:)*e1e2t(:,:)*tmask_i(:,:) ) 209 217 210 218 IF( lk_mpp ) THEN … … 263 271 nsumbuf(3) = nbergs_melted 264 272 nsumbuf(4) = nspeeding_tickets 265 DO ik = 1, nclasses273 DO ik = 1, nclasses 266 274 nsumbuf(4+ik) = nbergs_calved_by_class(ik) 267 END DO275 END DO 268 276 269 277 CALL mpp_sum( nsumbuf(1:nclasses+4), nclasses+4 ) … … 355 363 bits_src_net = 0._wp 356 364 ENDIF 357 365 ! 358 366 END SUBROUTINE icb_budget 359 367 360 !!-------------------------------------------------------------------------361 368 362 369 SUBROUTINE icb_budget_step 370 !!---------------------------------------------------------------------- 363 371 !! things to reset at the beginning of each timestep 364 372 !! this probably screws up fields going to diawri, so needs to be looked at - sga 365 373 !!---------------------------------------------------------------------- 374 ! 366 375 IF( .NOT. ln_bergdia ) RETURN 367 376 berg_melt (:,:) = 0._wp … … 375 384 virtual_area (:,:) = 0._wp 376 385 real_calving (:,:,:) = 0._wp 377 386 ! 378 387 END SUBROUTINE icb_budget_step 379 388 380 !!-------------------------------------------------------------------------381 389 382 390 SUBROUTINE icb_budget_put 383 384 IF( .NOT. ln_bergdia ) RETURN 385 CALL iom_put( "berg_melt" , berg_melt (:,:) ) ! 'Melt rate of icebergs' , 'kg/m2/s' 386 CALL iom_put( "berg_buoy_melt" , buoy_melt (:,:) ) ! 'Buoyancy component of iceberg melt rate' , 'kg/m2/s' 387 CALL iom_put( "berg_eros_melt" , eros_melt (:,:) ) ! 'Erosion component of iceberg melt rate' , 'kg/m2/s' 388 CALL iom_put( "berg_conv_melt" , conv_melt (:,:) ) ! 'Convective component of iceberg melt rate', 'kg/m2/s' 389 CALL iom_put( "berg_virtual_area" , virtual_area (:,:) ) ! 'Virtual coverage by icebergs' , 'm2' 390 CALL iom_put( "bits_src" , bits_src (:,:) ) ! 'Mass source of bergy bits' , 'kg/m2/s' 391 CALL iom_put( "bits_melt" , bits_melt (:,:) ) ! 'Melt rate of bergy bits' , 'kg/m2/s' 392 CALL iom_put( "bits_mass" , bits_mass (:,:) ) ! 'Bergy bit density field' , 'kg/m2' 393 CALL iom_put( "berg_mass" , berg_mass (:,:) ) ! 'Iceberg density field' , 'kg/m2' 394 CALL iom_put( "berg_real_calving" , real_calving (:,:,:) ) ! 'Calving into iceberg class' , 'kg/s' 395 391 !!---------------------------------------------------------------------- 392 !!---------------------------------------------------------------------- 393 ! 394 IF( .NOT. ln_bergdia ) RETURN !!gm useless iom will control whether it is output or not 395 ! 396 CALL iom_put( "berg_melt" , berg_melt (:,:) ) ! Melt rate of icebergs [kg/m2/s] 397 CALL iom_put( "berg_buoy_melt" , buoy_melt (:,:) ) ! Buoyancy component of iceberg melt rate [kg/m2/s] 398 CALL iom_put( "berg_eros_melt" , eros_melt (:,:) ) ! Erosion component of iceberg melt rate [kg/m2/s] 399 CALL iom_put( "berg_conv_melt" , conv_melt (:,:) ) ! Convective component of iceberg melt rate [kg/m2/s] 400 CALL iom_put( "berg_virtual_area", virtual_area(:,:) ) ! Virtual coverage by icebergs [m2] 401 CALL iom_put( "bits_src" , bits_src (:,:) ) ! Mass source of bergy bits [kg/m2/s] 402 CALL iom_put( "bits_melt" , bits_melt (:,:) ) ! Melt rate of bergy bits [kg/m2/s] 403 CALL iom_put( "bits_mass" , bits_mass (:,:) ) ! Bergy bit density field [kg/m2] 404 CALL iom_put( "berg_mass" , berg_mass (:,:) ) ! Iceberg density field [kg/m2] 405 CALL iom_put( "berg_real_calving", real_calving(:,:,:) ) ! Calving into iceberg class [kg/s] 406 ! 396 407 END SUBROUTINE icb_budget_put 397 408 398 !!-------------------------------------------------------------------------399 409 400 410 SUBROUTINE calving_budget( ki, kj, kn, pcalved, pheated ) 411 !!---------------------------------------------------------------------- 412 !!---------------------------------------------------------------------- 401 413 INTEGER, INTENT(in) :: ki, kj, kn 402 414 REAL(wp), INTENT(in) :: pcalved 403 415 REAL(wp), INTENT(in) :: pheated 404 416 !!---------------------------------------------------------------------- 417 ! 405 418 IF( .NOT. ln_bergdia ) RETURN 406 419 real_calving(ki,kj,kn) = real_calving(ki,kj,kn) + pcalved / berg_dt … … 409 422 calving_to_bergs_net = calving_to_bergs_net + pcalved 410 423 heat_to_bergs_net = heat_to_bergs_net + pheated 411 424 ! 412 425 END SUBROUTINE calving_budget 413 426 414 !!-------------------------------------------------------------------------415 427 416 428 SUBROUTINE incoming_budget( kt, pcalving_used, pheat_used ) 429 !!---------------------------------------------------------------------- 430 !!---------------------------------------------------------------------- 417 431 INTEGER , INTENT(in) :: kt 418 432 REAL(wp), INTENT(in) :: pcalving_used 419 433 REAL(wp), DIMENSION(:,:), INTENT(in) :: pheat_used 420 434 !!---------------------------------------------------------------------- 435 ! 421 436 IF( .NOT. ln_bergdia ) RETURN 422 437 ! 423 438 IF( kt == nit000 ) THEN 424 439 stored_start = SUM( berg_grid%stored_ice(:,:,:) ) 425 440 IF( lk_mpp ) CALL mpp_sum( stored_start ) 426 441 WRITE(numicb,'(a,es13.6,a)') 'accumulate_calving: initial stored mass=',stored_start,' kg' 427 442 ! 428 443 stored_heat_start = SUM( berg_grid%stored_heat(:,:) ) 429 444 IF( lk_mpp ) CALL mpp_sum( stored_heat_start ) 430 445 WRITE(numicb,'(a,es13.6,a)') 'accumulate_calving: initial stored heat=',stored_heat_start,' J' 431 446 ENDIF 432 447 ! 433 448 calving_rcv_net = calving_rcv_net + SUM( berg_grid%calving(:,:) ) * berg_dt 434 449 calving_src_net = calving_rcv_net 435 450 calving_src_heat_net = calving_src_heat_net + & 436 451 & SUM( berg_grid%calving_hflx(:,:) * e1e2t(:,:) ) * berg_dt ! Units of J 437 452 calving_used_net = calving_used_net + pcalving_used * berg_dt 438 453 calving_src_heat_used_net = calving_src_heat_used_net + SUM( pheat_used(:,:) ) 439 454 ! 440 455 END SUBROUTINE incoming_budget 441 456 442 !!-------------------------------------------------------------------------443 457 444 458 SUBROUTINE size_budget(ki, kj, pWn, pLn, pAbits, & 445 459 & pmass_scale, pMnew, pnMbits, pz1_e1e2) 446 INTEGER, INTENT(in) :: ki, kj 447 REAL(wp), INTENT(in) :: pWn, pLn, pAbits, pmass_scale, pMnew, pnMbits, pz1_e1e2 448 460 !!---------------------------------------------------------------------- 461 !!---------------------------------------------------------------------- 462 INTEGER, INTENT(in) :: ki, kj 463 REAL(wp), INTENT(in) :: pWn, pLn, pAbits, pmass_scale, pMnew, pnMbits, pz1_e1e2 464 !!---------------------------------------------------------------------- 465 ! 449 466 IF( .NOT. ln_bergdia ) RETURN 450 467 virtual_area(ki,kj) = virtual_area(ki,kj) + ( pWn * pLn + pAbits ) * pmass_scale ! m^2 451 468 berg_mass(ki,kj) = berg_mass(ki,kj) + pMnew * pz1_e1e2 ! kg/m2 452 469 bits_mass(ki,kj) = bits_mass(ki,kj) + pnMbits * pz1_e1e2 ! kg/m2 453 470 ! 454 471 END SUBROUTINE size_budget 455 472 456 !!-------------------------------------------------------------------------457 473 458 474 SUBROUTINE speed_budget() 459 475 !!---------------------------------------------------------------------- 476 !!---------------------------------------------------------------------- 477 ! 460 478 IF( .NOT. ln_bergdia ) RETURN 461 479 nspeeding_tickets = nspeeding_tickets + 1 462 480 ! 463 481 END SUBROUTINE speed_budget 464 482 465 !!-------------------------------------------------------------------------466 483 467 484 SUBROUTINE melt_budget(ki, kj, pmnew, pheat, pmass_scale, & 468 485 & pdM, pdMbitsE, pdMbitsM, pdMb, pdMe, & 469 & pdMv, pz1_dt_e1e2) 470 471 INTEGER :: ki, kj 472 REAL(wp), INTENT(in) :: pmnew, pheat, pmass_scale 473 REAL(wp), INTENT(in) :: pdM, pdMbitsE, pdMbitsM, pdMb, pdMe, pdMv, pz1_dt_e1e2 474 486 & pdMv, pz1_dt_e1e2 ) 487 !!---------------------------------------------------------------------- 488 !!---------------------------------------------------------------------- 489 INTEGER , INTENT(in) :: ki, kj 490 REAL(wp), INTENT(in) :: pmnew, pheat, pmass_scale 491 REAL(wp), INTENT(in) :: pdM, pdMbitsE, pdMbitsM, pdMb, pdMe, pdMv, pz1_dt_e1e2 492 !!---------------------------------------------------------------------- 493 ! 475 494 IF( .NOT. ln_bergdia ) RETURN 476 495 … … 483 502 heat_to_ocean_net = heat_to_ocean_net + pheat * pmass_scale * berg_dt ! J 484 503 IF( pmnew <= 0._wp ) nbergs_melted = nbergs_melted + 1 ! Delete the berg if completely melted 485 504 ! 486 505 END SUBROUTINE melt_budget 487 506 488 !!-------------------------------------------------------------------------489 507 490 508 SUBROUTINE report_state( cd_budgetstr, cd_budgetunits, cd_startstr, pstartval, cd_endstr, & 491 509 & pendval, cd_delstr, kbergs ) 492 ! Arguments 510 !!---------------------------------------------------------------------- 511 !!---------------------------------------------------------------------- 493 512 CHARACTER*(*), INTENT(in) :: cd_budgetstr, cd_budgetunits, cd_startstr, cd_endstr, cd_delstr 494 513 REAL(wp), INTENT(in) :: pstartval, pendval 495 514 INTEGER, INTENT(in), OPTIONAL :: kbergs 496 515 !!---------------------------------------------------------------------- 516 ! 497 517 IF ( PRESENT(kbergs) ) THEN 498 518 WRITE(numicb,100) cd_budgetstr // ' state:', & … … 510 530 END SUBROUTINE report_state 511 531 512 !!-------------------------------------------------------------------------513 532 514 533 SUBROUTINE report_consistant( cd_budgetstr, cd_budgetunits, cd_startstr, pstartval, cd_endstr, pendval) 515 ! Arguments 534 !!---------------------------------------------------------------------- 535 !!---------------------------------------------------------------------- 516 536 CHARACTER*(*), INTENT(in) :: cd_budgetstr, cd_budgetunits, cd_startstr, cd_endstr 517 537 REAL(wp), INTENT(in) :: pstartval, pendval 518 538 !!---------------------------------------------------------------------- 539 ! 519 540 WRITE(numicb,200) cd_budgetstr // ' check:', & 520 541 cd_startstr, pstartval, cd_budgetunits, & … … 524 545 END SUBROUTINE report_consistant 525 546 526 !!-------------------------------------------------------------------------527 547 528 548 SUBROUTINE report_budget( cd_budgetstr, cd_budgetunits, cd_instr, pinval, cd_outstr, & 529 549 & poutval, cd_delstr, pstartval, pendval) 530 ! Arguments 550 !!---------------------------------------------------------------------- 551 !!---------------------------------------------------------------------- 531 552 CHARACTER*(*), INTENT(in) :: cd_budgetstr, cd_budgetunits, cd_instr, cd_outstr, cd_delstr 532 553 REAL(wp), INTENT(in) :: pinval, poutval, pstartval, pendval 533 ! Local variables554 ! 534 555 REAL(wp) :: zval 535 556 !!---------------------------------------------------------------------- 557 ! 536 558 zval = ( ( pendval - pstartval ) - ( pinval - poutval ) ) / & 537 559 & MAX( 1.e-30, MAX( abs( pendval - pstartval ) , ABS( pinval - poutval ) ) ) 538 560 539 561 WRITE(numicb,200) cd_budgetstr // ' budget:', & 540 cd_instr // ' in', pinval, cd_budgetunits, & 541 cd_outstr // ' out', poutval, cd_budgetunits, & 542 'Delta ' // cd_delstr, pinval-poutval, cd_budgetunits, & 543 'error', zval, 'nd' 544 200 FORMAT(a19,3(a18,"=",es14.7,x,a2,:,","),a8,"=",es10.3,x,a2) 562 & cd_instr // ' in', pinval, cd_budgetunits, & 563 & cd_outstr // ' out', poutval, cd_budgetunits, & 564 & 'Delta ' // cd_delstr, pinval-poutval, cd_budgetunits, & 565 & 'error', zval, 'nd' 566 200 FORMAT(a19,3(a18,"=",es14.7,x,a2,:,","),a8,"=",es10.3,x,a2) 567 ! 545 568 END SUBROUTINE report_budget 546 569 547 !!-------------------------------------------------------------------------548 570 549 571 SUBROUTINE report_istate( cd_budgetstr, cd_startstr, pstartval, cd_endstr, pendval, cd_delstr) 550 ! Arguments 572 !!---------------------------------------------------------------------- 573 !!---------------------------------------------------------------------- 551 574 CHARACTER*(*), INTENT(in) :: cd_budgetstr, cd_startstr, cd_endstr, cd_delstr 552 575 INTEGER, INTENT(in) :: pstartval, pendval 553 576 ! 554 577 WRITE(numicb,100) cd_budgetstr // ' state:', & 555 cd_startstr // ' start', pstartval, & 556 cd_endstr // ' end', pendval, & 557 cd_delstr // 'Delta', pendval-pstartval 558 100 FORMAT(a19,3(a18,"=",i14,x,:,",")) 578 & cd_startstr // ' start', pstartval, & 579 & cd_endstr // ' end', pendval, & 580 & cd_delstr // 'Delta', pendval-pstartval 581 100 FORMAT(a19,3(a18,"=",i14,x,:,",")) 582 ! 559 583 END SUBROUTINE report_istate 560 584 561 !!-------------------------------------------------------------------------562 585 563 586 SUBROUTINE report_ibudget( cd_budgetstr, cd_instr, pinval, cd_outstr, poutval, & 564 587 & cd_delstr, pstartval, pendval) 565 ! Arguments 588 !!---------------------------------------------------------------------- 589 !!---------------------------------------------------------------------- 566 590 CHARACTER*(*), INTENT(in) :: cd_budgetstr, cd_instr, cd_outstr, cd_delstr 567 591 INTEGER, INTENT(in) :: pinval, poutval, pstartval, pendval 568 592 !!---------------------------------------------------------------------- 593 ! 569 594 WRITE(numicb,200) cd_budgetstr // ' budget:', & 570 595 cd_instr // ' in', pinval, & … … 574 599 200 FORMAT(a19,10(a18,"=",i14,x,:,",")) 575 600 END SUBROUTINE report_ibudget 576 !!------------------------------------------------------------------------- 577 601 602 !!====================================================================== 578 603 END MODULE icbdia
Note: See TracChangeset
for help on using the changeset viewer.