Changeset 12576
- Timestamp:
- 2020-03-20T12:39:37+01:00 (5 years ago)
- Location:
- NEMO/branches/UKMO/NEMO_4.0.1_icesheet_and_river_coupling
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/UKMO/NEMO_4.0.1_icesheet_and_river_coupling/cfgs/SHARED/field_def_nemo-oce.xml
r11536 r12576 264 264 265 265 <!-- * variable related to ice shelf forcing * --> 266 <field id="berg_calve" long_name="Iceberg calving" unit="kg/m2/s" /> 266 267 <field id="fwfisf" long_name="Ice shelf melting" unit="kg/m2/s" /> 267 268 <field id="fwfisf3d" long_name="Ice shelf melting" unit="kg/m2/s" grid_ref="grid_T_3D" /> -
NEMO/branches/UKMO/NEMO_4.0.1_icesheet_and_river_coupling/cfgs/SHARED/namelist_ref
r11715 r12576 290 290 ! ! -> file cplmask.nc with the float variable called cplmask (jpi,jpj,nn_cplmodel) 291 291 nn_cats_cpl = 5 ! Number of sea ice categories over which coupling is to be carried out (if not 1) 292 nn_coupled_iceshelf_fluxes = 0 ! =0 : total freshwater input from iceberg calving and ice shelf basal melting 293 ! taken from climatologies used (no action in coupling routines). 294 ! =1 : use rate of change of mass of Greenland and Antarctic icesheets to set the 295 ! combined magnitude of the iceberg calving and iceshelf melting freshwater fluxes. 296 ! =2 : specify constant freshwater inputs in this namelist to set the combined 297 ! magnitude of iceberg calving and iceshelf melting freshwater fluxes. 298 ln_iceshelf_init_atmos = .true. ! If true force ocean to initialise icesheet masses from atmospheric values rather than 299 ! from values in ocean restart file. 300 rn_greenland_total_fw_flux = 0.0 ! Constant total rate of freshwater input (kg/s) for Greenland (if nn_coupled_iceshelf_fluxes=2) 301 rn_greenland_calving_fraction = 0.5 ! Set fraction of total freshwater flux for iceberg calving - remainder goes to iceshelf melting. 302 rn_antarctica_total_fw_flux = 0.0 ! Constant total rate of freshwater input (kg/s) for Antarctica (if nn_coupled_iceshelf_fluxes=2) 303 rn_antarctica_calving_fraction = 0.5 ! Set fraction of total freshwater flux for iceberg calving - remainder goes to iceshelf melting. 304 rn_iceshelf_fluxes_tolerance = 1e-6 ! Fractional threshold for detecting differences in icesheet masses (must be positive definite). 292 305 293 306 !_____________!__________________________!____________!_____________!______________________!________! -
NEMO/branches/UKMO/NEMO_4.0.1_icesheet_and_river_coupling/src/OCE/ICB/icbclv.F90
r11715 r12576 26 26 USE icb_oce ! iceberg parameters 27 27 28 USE sbc_oce ! for icesheet freshwater input variables 29 USE in_out_manager 30 USE iom 31 28 32 IMPLICIT NONE 29 33 PRIVATE … … 49 53 ! 50 54 REAL(wp) :: zcalving_used, zdist, zfact 55 REAL(wp) :: zgreenland_calving_sum, zantarctica_calving_sum 51 56 INTEGER :: jn, ji, jj ! loop counters 52 57 INTEGER :: imx ! temporary integer for max berg class … … 63 68 ! Heat in units of W/m2, and mask (just in case) 64 69 berg_grid%calving_hflx(:,:) = src_calving_hflx(:,:) * tmask_i(:,:) * tmask(:,:,1) 70 71 IF( lk_oasis) THEN 72 ! nn_coupled_iceshelf_fluxes uninitialised unless lk_oasis=true 73 IF( nn_coupled_iceshelf_fluxes .gt. 0 ) THEN 74 ll_write = ((MOD( kt, sn_cfctl%ptimincr ) == 0) .OR. ( kt == nitend )) .AND. lwp 75 ! Adjust total calving rates so that sum of iceberg calving and iceshelf melting in the northern 76 ! and southern hemispheres equals rate of increase of mass of greenland and antarctic ice sheets 77 ! to preserve total freshwater conservation in coupled models without an active ice sheet model. 78 79 zgreenland_calving_sum = SUM( berg_grid%calving(:,:) * greenland_icesheet_mask(:,:) ) 80 IF( lk_mpp ) CALL mpp_sum( zgreenland_calving_sum ) 81 WHERE( greenland_icesheet_mask(:,:) == 1.0 ) & 82 & berg_grid%calving(:,:) = berg_grid%calving(:,:) * greenland_icesheet_mass_rate_of_change * rn_greenland_calving_fraction & 83 & / ( zgreenland_calving_sum + 1.0e-10_wp ) 84 85 ! check 86 IF(ll_write) WRITE(numout, *) 'Greenland iceberg calving climatology (kg/s) : ',zgreenland_calving_sum 87 zgreenland_calving_sum = SUM( berg_grid%calving(:,:) * greenland_icesheet_mask(:,:) ) 88 IF( lk_mpp ) CALL mpp_sum( zgreenland_calving_sum ) 89 IF(ll_write) WRITE(numout, *) 'Greenland iceberg calving adjusted value (kg/s) : ',zgreenland_calving_sum 90 91 zantarctica_calving_sum = SUM( berg_grid%calving(:,:) * antarctica_icesheet_mask(:,:) ) 92 IF( lk_mpp ) CALL mpp_sum( zantarctica_calving_sum ) 93 WHERE( antarctica_icesheet_mask(:,:) == 1.0 ) & 94 berg_grid%calving(:,:) = berg_grid%calving(:,:) * antarctica_icesheet_mass_rate_of_change * rn_antarctica_calving_fraction & 95 & / ( zantarctica_calving_sum + 1.0e-10_wp ) 96 97 ! check 98 IF(ll_write) WRITE(numout, *) 'Antarctica iceberg calving climatology (kg/s) : ',zantarctica_calving_sum 99 zantarctica_calving_sum = SUM( berg_grid%calving(:,:) * antarctica_icesheet_mask(:,:) ) 100 IF( lk_mpp ) CALL mpp_sum( zantarctica_calving_sum ) 101 IF(ll_write) WRITE(numout, *) 'Antarctica iceberg calving adjusted value (kg/s) : ',zantarctica_calving_sum 102 103 ENDIF 104 ENDIF 105 106 CALL iom_put( 'berg_calve', berg_grid%calving(:,:) ) 107 65 108 66 109 IF( ll_first_call .AND. .NOT. l_restarted_bergs ) THEN ! This is a hack to simplify initialization -
NEMO/branches/UKMO/NEMO_4.0.1_icesheet_and_river_coupling/src/OCE/IOM/restart.F90
r11715 r12576 29 29 USE diurnal_bulk 30 30 USE lib_mpp ! distribued memory computing library 31 USE sbc_oce ! for icesheet freshwater input variables 31 32 32 33 IMPLICIT NONE … … 161 162 CALL iom_rstput( kt, nitrst, numrow, 'sshn' , sshn, ldxios = lwxios ) 162 163 CALL iom_rstput( kt, nitrst, numrow, 'rhop' , rhop, ldxios = lwxios ) 164 165 IF( lk_oasis) THEN 166 ! nn_coupled_iceshelf_fluxes uninitialised unless lk_oasis=true 167 IF( nn_coupled_iceshelf_fluxes .eq. 1 ) THEN 168 CALL iom_rstput( kt, nitrst, numrow, 'greenland_icesheet_mass', greenland_icesheet_mass ) 169 CALL iom_rstput( kt, nitrst, numrow, 'greenland_icesheet_timelapsed', greenland_icesheet_timelapsed ) 170 CALL iom_rstput( kt, nitrst, numrow, 'greenland_icesheet_mass_roc', greenland_icesheet_mass_rate_of_change ) 171 CALL iom_rstput( kt, nitrst, numrow, 'antarctica_icesheet_mass', antarctica_icesheet_mass ) 172 CALL iom_rstput( kt, nitrst, numrow, 'antarctica_icesheet_timelapsed', antarctica_icesheet_timelapsed ) 173 CALL iom_rstput( kt, nitrst, numrow, 'antarctica_icesheet_mass_roc', antarctica_icesheet_mass_rate_of_change ) 174 ENDIF 175 ENDIF 163 176 ! extra variable needed for the ice sheet coupling 164 177 IF ( ln_iscpl ) THEN … … 295 308 ENDIF 296 309 ! 310 IF( iom_varid( numror, 'greenland_icesheet_mass', ldstop = .FALSE. ) > 0 ) THEN 311 CALL iom_get( numror, 'greenland_icesheet_mass', greenland_icesheet_mass ) 312 CALL iom_get( numror, 'greenland_icesheet_timelapsed', greenland_icesheet_timelapsed ) 313 CALL iom_get( numror, 'greenland_icesheet_mass_roc', greenland_icesheet_mass_rate_of_change ) 314 ELSE 315 greenland_icesheet_mass = 0.0 316 greenland_icesheet_mass_rate_of_change = 0.0 317 greenland_icesheet_timelapsed = 0.0 318 ENDIF 319 IF( iom_varid( numror, 'antarctica_icesheet_mass', ldstop = .FALSE. ) > 0 ) THEN 320 CALL iom_get( numror, 'antarctica_icesheet_mass', antarctica_icesheet_mass ) 321 CALL iom_get( numror, 'antarctica_icesheet_timelapsed', antarctica_icesheet_timelapsed ) 322 CALL iom_get( numror, 'antarctica_icesheet_mass_roc', antarctica_icesheet_mass_rate_of_change ) 323 ELSE 324 antarctica_icesheet_mass = 0.0 325 antarctica_icesheet_mass_rate_of_change = 0.0 326 antarctica_icesheet_timelapsed = 0.0 327 ENDIF 328 ! 297 329 IF( neuler == 0 ) THEN ! Euler restart (neuler=0) 298 330 tsb (:,:,:,:) = tsn (:,:,:,:) ! all before fields set to now values -
NEMO/branches/UKMO/NEMO_4.0.1_icesheet_and_river_coupling/src/OCE/SBC/sbc_oce.F90
r11715 r12576 136 136 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: atm_co2 !: atmospheric pCO2 [ppm] 137 137 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xcplmask !: coupling mask for ln_mixcpl (warning: allocated in sbccpl) 138 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: greenland_icesheet_mass_array, greenland_icesheet_mask 139 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: antarctica_icesheet_mass_array, antarctica_icesheet_mask 138 140 139 141 !!---------------------------------------------------------------------- … … 149 151 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: frq_m !: mean (nn_fsbc time-step) fraction of solar net radiation absorbed in the 1st T level [-] 150 152 153 !!---------------------------------------------------------------------- 154 !! Surface scalars of total ice sheet mass for Greenland and Antarctica, 155 !! passed from atmosphere to be converted to dvol and hence a freshwater 156 !! flux by using old values. New values are saved in the dump, to become 157 !! old values next coupling timestep. Freshwater fluxes split between 158 !! sub iceshelf melting and iceberg calving, scalled to flux per second 159 !!---------------------------------------------------------------------- 160 161 REAL(wp), PUBLIC :: greenland_icesheet_mass, greenland_icesheet_mass_rate_of_change, greenland_icesheet_timelapsed 162 REAL(wp), PUBLIC :: antarctica_icesheet_mass, antarctica_icesheet_mass_rate_of_change, antarctica_icesheet_timelapsed 163 164 ! sbccpl namelist parameters associated with icesheet freshwater input code. Included here rather than in sbccpl.F90 to 165 ! avoid circular dependencies. 166 INTEGER, PUBLIC :: nn_coupled_iceshelf_fluxes ! =0 : total freshwater input from iceberg calving and ice shelf basal melting 167 ! taken from climatologies used (no action in coupling routines). 168 ! =1 : use rate of change of mass of Greenland and Antarctic icesheets to set the 169 ! combined magnitude of the iceberg calving and iceshelf melting freshwater fluxes. 170 ! =2 : specify constant freshwater inputs in this namelist to set the combined 171 ! magnitude of iceberg calving and iceshelf melting freshwater fluxes. 172 LOGICAL, PUBLIC :: ln_iceshelf_init_atmos ! If true force ocean to initialise iceshelf masses from atmospheric values rather 173 ! than values in ocean restart (applicable if nn_coupled_iceshelf_fluxes=1). 174 REAL(wp), PUBLIC :: rn_greenland_total_fw_flux ! Constant total rate of freshwater input (kg/s) for Greenland (if nn_coupled_iceshelf_fluxes=2) 175 REAL(wp), PUBLIC :: rn_greenland_calving_fraction ! Set fraction of total freshwater flux for iceberg calving - remainder goes to iceshelf melting. 176 REAL(wp), PUBLIC :: rn_antarctica_total_fw_flux ! Constant total rate of freshwater input (kg/s) for Antarctica (if nn_coupled_iceshelf_fluxes=2) 177 REAL(wp), PUBLIC :: rn_antarctica_calving_fraction ! Set fraction of total freshwater flux for iceberg calving - remainder goes to iceshelf melting. 178 REAL(wp), PUBLIC :: rn_iceshelf_fluxes_tolerance ! Absolute tolerance for detecting differences in icesheet masses. 179 151 180 !! * Substitutions 152 181 # include "vectopt_loop_substitute.h90" … … 182 211 & ssu_m (jpi,jpj) , sst_m(jpi,jpj) , frq_m(jpi,jpj) , & 183 212 & ssv_m (jpi,jpj) , sss_m(jpi,jpj) , ssh_m(jpi,jpj) , STAT=ierr(4) ) 213 ! 214 ALLOCATE( greenland_icesheet_mass_array(jpi,jpj) , antarctica_icesheet_mass_array(jpi,jpj) ) 215 ALLOCATE( greenland_icesheet_mask(jpi,jpj) , antarctica_icesheet_mask(jpi,jpj) ) 184 216 ! 185 217 ALLOCATE( e3t_m(jpi,jpj) , STAT=ierr(5) ) -
NEMO/branches/UKMO/NEMO_4.0.1_icesheet_and_river_coupling/src/OCE/SBC/sbccpl.F90
r11715 r12576 116 116 INTEGER, PARAMETER :: jpr_tauwy = 56 ! y component of the ocean stress from waves 117 117 INTEGER, PARAMETER :: jpr_ts_ice = 57 ! Sea ice surface temp 118 119 INTEGER, PARAMETER :: jprcv = 57 ! total number of fields received 118 INTEGER, PARAMETER :: jpr_grnm = 58 ! Greenland ice mass 119 INTEGER, PARAMETER :: jpr_antm = 59 ! Antarctic ice mass 120 121 INTEGER, PARAMETER :: jprcv = 59 ! total number of fields received 120 122 121 123 INTEGER, PARAMETER :: jps_fice = 1 ! ice fraction sent to the atmosphere … … 174 176 TYPE(FLD_C) :: sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_tauw, sn_rcv_dqnsdt, sn_rcv_qsr, & 175 177 & sn_rcv_qns , sn_rcv_emp , sn_rcv_rnf, sn_rcv_ts_ice 176 TYPE(FLD_C) :: sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2, sn_rcv_mslp, sn_rcv_icb, sn_rcv_isf 178 TYPE(FLD_C) :: sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2, sn_rcv_mslp, sn_rcv_icb, sn_rcv_isf, & 179 sn_rcv_grnm, sn_rcv_antm 177 180 ! Send to waves 178 181 TYPE(FLD_C) :: sn_snd_ifrac, sn_snd_crtw, sn_snd_wlev … … 256 259 & sn_rcv_iceflx, sn_rcv_co2 , nn_cplmodel , ln_usecplmask, sn_rcv_mslp , & 257 260 & sn_rcv_icb , sn_rcv_isf , sn_rcv_wfreq , sn_rcv_tauw, nn_cats_cpl , & 258 & sn_rcv_ts_ice 261 & sn_rcv_ts_ice, sn_rcv_grnm , sn_rcv_antm , nn_coupled_iceshelf_fluxes, & 262 & rn_greenland_calving_fraction, rn_antarctica_calving_fraction, & 263 & rn_iceshelf_fluxes_tolerance 259 264 260 265 !!--------------------------------------------------------------------- … … 292 297 WRITE(numout,*)' runoffs = ', TRIM(sn_rcv_rnf%cldes ), ' (', TRIM(sn_rcv_rnf%clcat ), ')' 293 298 WRITE(numout,*)' calving = ', TRIM(sn_rcv_cal%cldes ), ' (', TRIM(sn_rcv_cal%clcat ), ')' 299 WRITE(numout,*)' Greenland ice mass = ', TRIM(sn_rcv_grnm%cldes ), ' (', TRIM(sn_rcv_grnm%clcat ), ')' 300 WRITE(numout,*)' Antarctica ice mass = ', TRIM(sn_rcv_antm%cldes ), ' (', TRIM(sn_rcv_antm%clcat ), ')' 294 301 WRITE(numout,*)' iceberg = ', TRIM(sn_rcv_icb%cldes ), ' (', TRIM(sn_rcv_icb%clcat ), ')' 295 302 WRITE(numout,*)' ice shelf = ', TRIM(sn_rcv_isf%cldes ), ' (', TRIM(sn_rcv_isf%clcat ), ')' … … 330 337 WRITE(numout,*)' ln_usecplmask = ', ln_usecplmask 331 338 WRITE(numout,*)' nn_cats_cpl = ', nn_cats_cpl 339 WRITE(numout,*)' nn_coupled_iceshelf_fluxes = ', nn_coupled_iceshelf_fluxes 340 WRITE(numout,*)' ln_iceshelf_init_atmos = ', ln_iceshelf_init_atmos 341 WRITE(numout,*)' rn_greenland_total_fw_flux = ', rn_greenland_total_fw_flux 342 WRITE(numout,*)' rn_antarctica_total_fw_flux = ', rn_antarctica_total_fw_flux 343 WRITE(numout,*)' rn_greenland_calving_fraction = ', rn_greenland_calving_fraction 344 WRITE(numout,*)' rn_antarctica_calving_fraction = ', rn_antarctica_calving_fraction 345 WRITE(numout,*)' rn_iceshelf_fluxes_tolerance = ', rn_iceshelf_fluxes_tolerance 332 346 ENDIF 333 347 … … 471 485 ! 472 486 srcv(jpr_cal)%clname = 'OCalving' ; IF( TRIM( sn_rcv_cal%cldes) == 'coupled' ) srcv(jpr_cal)%laction = .TRUE. 487 srcv(jpr_grnm )%clname = 'OGrnmass' ; IF( TRIM( sn_rcv_grnm%cldes ) == 'coupled' ) srcv(jpr_grnm)%laction = .TRUE. 488 srcv(jpr_antm )%clname = 'OAntmass' ; IF( TRIM( sn_rcv_antm%cldes ) == 'coupled' ) srcv(jpr_antm)%laction = .TRUE. 473 489 srcv(jpr_isf)%clname = 'OIcshelf' ; IF( TRIM( sn_rcv_isf%cldes) == 'coupled' ) srcv(jpr_isf)%laction = .TRUE. 474 490 srcv(jpr_icb)%clname = 'OIceberg' ; IF( TRIM( sn_rcv_icb%cldes) == 'coupled' ) srcv(jpr_icb)%laction = .TRUE. … … 1045 1061 & CALL ctl_stop( 'sbc_cpl_init: diurnal cycle reconstruction (ln_dm2dc) needs daily couping for solar radiation' ) 1046 1062 IF( ln_dm2dc .AND. ln_cpl ) ncpl_qsr_freq = 86400 / ncpl_qsr_freq 1063 1064 IF( nn_coupled_iceshelf_fluxes .gt. 0 ) THEN 1065 ! Crude masks to separate the Antarctic and Greenland icesheets. Obviously something 1066 ! more complicated could be done if required. 1067 greenland_icesheet_mask = 0.0 1068 WHERE( gphit >= 0.0 ) greenland_icesheet_mask = 1.0 1069 antarctica_icesheet_mask = 0.0 1070 WHERE( gphit < 0.0 ) antarctica_icesheet_mask = 1.0 1071 1072 ! initialise other variables 1073 greenland_icesheet_mass_array(:,:) = 0.0 1074 antarctica_icesheet_mass_array(:,:) = 0.0 1075 1076 IF( .not. ln_rstart ) THEN 1077 greenland_icesheet_mass = 0.0 1078 greenland_icesheet_mass_rate_of_change = 0.0 1079 greenland_icesheet_timelapsed = 0.0 1080 antarctica_icesheet_mass = 0.0 1081 antarctica_icesheet_mass_rate_of_change = 0.0 1082 antarctica_icesheet_timelapsed = 0.0 1083 ENDIF 1084 1085 ENDIF 1047 1086 ! 1048 1087 END SUBROUTINE sbc_cpl_init … … 1103 1142 INTEGER :: ji, jj, jn ! dummy loop indices 1104 1143 INTEGER :: isec ! number of seconds since nit000 (assuming rdt did not change since nit000) 1105 REAL(wp) :: zcumulneg, zcumulpos ! temporary scalars 1144 REAL(wp) :: zcumulneg, zcumulpos ! temporary scalars 1145 REAL(wp) :: zgreenland_icesheet_mass_in, zantarctica_icesheet_mass_in 1146 REAL(wp) :: zgreenland_icesheet_mass_b, zantarctica_icesheet_mass_b 1147 REAL(wp) :: zmask_sum, zepsilon 1106 1148 REAL(wp) :: zcoef ! temporary scalar 1107 1149 REAL(wp) :: zrhoa = 1.22 ! Air density kg/m3 … … 1445 1487 IF( srcv(jpr_fice )%laction ) fr_i(:,:) = frcv(jpr_fice )%z3(:,:,1) 1446 1488 ! 1489 ENDIF 1490 1491 ! ! land ice masses : Greenland 1492 zepsilon = rn_iceshelf_fluxes_tolerance 1493 1494 IF( srcv(jpr_grnm)%laction .AND. nn_coupled_iceshelf_fluxes == 1 ) THEN 1495 1496 ! This is a zero dimensional, single value field. 1497 zgreenland_icesheet_mass_in = frcv(jpr_grnm)%z3(1,1,1) 1498 1499 greenland_icesheet_timelapsed = greenland_icesheet_timelapsed + rdt 1500 1501 IF( ln_iceshelf_init_atmos .AND. kt == 1 ) THEN 1502 ! On the first timestep (of an NRUN) force the ocean to ignore the icesheet masses in the ocean restart 1503 ! and take them from the atmosphere to avoid problems with using inconsistent ocean and atmosphere restarts. 1504 zgreenland_icesheet_mass_b = zgreenland_icesheet_mass_in 1505 greenland_icesheet_mass = zgreenland_icesheet_mass_in 1506 ENDIF 1507 1508 IF( ABS( zgreenland_icesheet_mass_in - greenland_icesheet_mass ) > zepsilon ) THEN 1509 zgreenland_icesheet_mass_b = greenland_icesheet_mass 1510 1511 ! Only update the mass if it has increased. 1512 IF ( (zgreenland_icesheet_mass_in - greenland_icesheet_mass) > 0.0 ) THEN 1513 greenland_icesheet_mass = zgreenland_icesheet_mass_in 1514 ENDIF 1515 1516 IF( zgreenland_icesheet_mass_b /= 0.0 ) & 1517 & greenland_icesheet_mass_rate_of_change = ( greenland_icesheet_mass - zgreenland_icesheet_mass_b ) / greenland_icesheet_timelapsed 1518 greenland_icesheet_timelapsed = 0.0_wp 1519 ENDIF 1520 IF(lwp .AND. ll_wrtstp) THEN 1521 WRITE(numout,*) 'Greenland icesheet mass (kg) read in is ', zgreenland_icesheet_mass_in 1522 WRITE(numout,*) 'Greenland icesheet mass (kg) used is ', greenland_icesheet_mass 1523 WRITE(numout,*) 'Greenland icesheet mass rate of change (kg/s) is ', greenland_icesheet_mass_rate_of_change 1524 WRITE(numout,*) 'Greenland icesheet seconds lapsed since last change is ', greenland_icesheet_timelapsed 1525 IF(lflush) CALL flush(numout) 1526 ENDIF 1527 ELSE IF ( nn_coupled_iceshelf_fluxes == 2 ) THEN 1528 greenland_icesheet_mass_rate_of_change = rn_greenland_total_fw_flux 1529 ENDIF 1530 1531 ! ! land ice masses : Antarctica 1532 IF( srcv(jpr_antm)%laction .AND. nn_coupled_iceshelf_fluxes == 1 ) THEN 1533 1534 ! This is a zero dimensional, single value field. 1535 zantarctica_icesheet_mass_in = frcv(jpr_antm)%z3(1,1,1) 1536 1537 antarctica_icesheet_timelapsed = antarctica_icesheet_timelapsed + rdt 1538 1539 IF( ln_iceshelf_init_atmos .AND. kt == 1 ) THEN 1540 ! On the first timestep (of an NRUN) force the ocean to ignore the icesheet masses in the ocean restart 1541 ! and take them from the atmosphere to avoid problems with using inconsistent ocean and atmosphere restarts. 1542 zantarctica_icesheet_mass_b = zantarctica_icesheet_mass_in 1543 antarctica_icesheet_mass = zantarctica_icesheet_mass_in 1544 ENDIF 1545 1546 IF( ABS( zantarctica_icesheet_mass_in - antarctica_icesheet_mass ) > zepsilon ) THEN 1547 zantarctica_icesheet_mass_b = antarctica_icesheet_mass 1548 1549 ! Only update the mass if it has increased. 1550 IF ( (zantarctica_icesheet_mass_in - antarctica_icesheet_mass) > 0.0 ) THEN 1551 antarctica_icesheet_mass = zantarctica_icesheet_mass_in 1552 END IF 1553 1554 IF( zantarctica_icesheet_mass_b /= 0.0 ) & 1555 & antarctica_icesheet_mass_rate_of_change = ( antarctica_icesheet_mass - zantarctica_icesheet_mass_b ) / antarctica_icesheet_timelapsed 1556 antarctica_icesheet_timelapsed = 0.0_wp 1557 ENDIF 1558 IF(lwp .AND. ll_wrtstp) THEN 1559 WRITE(numout,*) 'Antarctica icesheet mass (kg) read in is ', zantarctica_icesheet_mass_in 1560 WRITE(numout,*) 'Antarctica icesheet mass (kg) used is ', antarctica_icesheet_mass 1561 WRITE(numout,*) 'Antarctica icesheet mass rate of change (kg/s) is ', antarctica_icesheet_mass_rate_of_change 1562 WRITE(numout,*) 'Antarctica icesheet seconds lapsed since last change is ', antarctica_icesheet_timelapsed 1563 IF(lflush) CALL flush(numout) 1564 ENDIF 1565 ELSE IF ( nn_coupled_iceshelf_fluxes == 2 ) THEN 1566 antarctica_icesheet_mass_rate_of_change = rn_antarctica_total_fw_flux 1447 1567 ENDIF 1448 1568 ! -
NEMO/branches/UKMO/NEMO_4.0.1_icesheet_and_river_coupling/src/OCE/SBC/sbcisf.F90
r11715 r12576 92 92 INTEGER :: ji, jj, jk ! loop index 93 93 INTEGER :: ikt, ikb ! local integers 94 REAL(wp) :: zgreenland_fwfisf_sum, zantarctica_fwfisf_sum 94 95 REAL(wp), DIMENSION(jpi,jpj) :: zt_frz, zdep ! freezing temperature (zt_frz) at depth (zdep) 95 96 REAL(wp), DIMENSION(:,:) , ALLOCATABLE :: zqhcisf2d … … 127 128 fwfisf(:,:) = - sf_rnfisf(1)%fnow(:,:,1) ! fresh water flux from the isf (fwfisf <0 mean melting) 128 129 ENDIF 130 131 IF( lk_oasis) THEN 132 ! nn_coupled_iceshelf_fluxes uninitialised unless lk_oasis=true 133 IF( nn_coupled_iceshelf_fluxes .gt. 0 ) THEN 134 135 ! Adjust total iceshelf melt rates so that sum of iceberg calving and iceshelf melting in the northern 136 ! and southern hemispheres equals rate of increase of mass of greenland and antarctic ice sheets 137 ! to preserve total freshwater conservation in coupled models without an active ice sheet model. 138 139 ! All related global sums must be done bit reproducibly 140 zgreenland_fwfisf_sum = glob_sum( fwfisf(:,:) * e1t(:,:) * e2t(:,:) * greenland_icesheet_mask(:,:) ) 141 142 ! use ABS function because we need to preserve the sign of fwfisf 143 WHERE( greenland_icesheet_mask(:,:) == 1.0 ) & 144 & fwfisf(:,:) = fwfisf(:,:) * ABS( greenland_icesheet_mass_rate_of_change * (1.0-rn_greenland_calving_fraction) & 145 & / ( zgreenland_fwfisf_sum + 1.0e-10_wp ) ) 146 147 ! check 148 IF(lwp .AND. ll_wrtstp) WRITE(numout, *) 'Greenland iceshelf melting climatology (kg/s) : ',zgreenland_fwfisf_sum 149 150 zgreenland_fwfisf_sum = glob_sum( fwfisf(:,:) * e1t(:,:) * e2t(:,:) * greenland_icesheet_mask(:,:) ) 151 152 IF(lwp .AND. ll_wrtstp) WRITE(numout, *) 'Greenland iceshelf melting adjusted value (kg/s) : ',zgreenland_fwfisf_sum 153 154 zantarctica_fwfisf_sum = glob_sum( fwfisf(:,:) * e1t(:,:) * e2t(:,:) * antarctica_icesheet_mask(:,:) ) 155 156 ! use ABS function because we need to preserve the sign of fwfisf 157 WHERE( antarctica_icesheet_mask(:,:) == 1.0 ) & 158 & fwfisf(:,:) = fwfisf(:,:) * ABS( antarctica_icesheet_mass_rate_of_change * (1.0-rn_antarctica_calving_fraction) & 159 & / ( zantarctica_fwfisf_sum + 1.0e-10_wp ) ) 160 161 ! check 162 IF(lwp .AND. ll_wrtstp) WRITE(numout, *) 'Antarctica iceshelf melting climatology (kg/s) : ',zantarctica_fwfisf_sum 163 164 zantarctica_fwfisf_sum = glob_sum( fwfisf(:,:) * e1t(:,:) * e2t(:,:) * antarctica_icesheet_mask(:,:) ) 165 166 IF(lwp .AND. ll_wrtstp) WRITE(numout, *) 'Antarctica iceshelf melting adjusted value (kg/s) : ',zantarctica_fwfisf_sum 167 168 ENDIF 169 ENDIF 170 129 171 qisf(:,:) = fwfisf(:,:) * rLfusisf ! heat flux 130 172 stbl(:,:) = soce … … 137 179 fwfisf(:,:) = -sf_fwfisf(1)%fnow(:,:,1) ! fwf 138 180 ENDIF 181 182 IF( lk_oasis) THEN 183 ! nn_coupled_iceshelf_fluxes uninitialised unless lk_oasis=true 184 IF( nn_coupled_iceshelf_fluxes .gt. 0 ) THEN 185 186 ! Adjust total iceshelf melt rates so that sum of iceberg calving and iceshelf melting in the northern 187 ! and southern hemispheres equals rate of increase of mass of greenland and antarctic ice sheets 188 ! to preserve total freshwater conservation in coupled models without an active ice sheet model. 189 190 ! All related global sums must be done bit reproducibly 191 zgreenland_fwfisf_sum = glob_sum( fwfisf(:,:) * e1t(:,:) * e2t(:,:) * greenland_icesheet_mask(:,:) ) 192 193 ! use ABS function because we need to preserve the sign of fwfisf 194 WHERE( greenland_icesheet_mask(:,:) == 1.0 ) & 195 & fwfisf(:,:) = fwfisf(:,:) * ABS( greenland_icesheet_mass_rate_of_change * (1.0-rn_greenland_calving_fraction) & 196 & / ( zgreenland_fwfisf_sum + 1.0e-10_wp ) ) 197 198 ! check 199 IF(lwp .AND. ll_wrtstp) WRITE(numout, *) 'Greenland iceshelf melting climatology (kg/s) : ',zgreenland_fwfisf_sum 200 201 zgreenland_fwfisf_sum = glob_sum( fwfisf(:,:) * e1t(:,:) * e2t(:,:) * greenland_icesheet_mask(:,:) ) 202 203 IF(lwp .AND. ll_wrtstp) WRITE(numout, *) 'Greenland iceshelf melting adjusted value (kg/s) : ',zgreenland_fwfisf_sum 204 205 zantarctica_fwfisf_sum = glob_sum( fwfisf(:,:) * e1t(:,:) * e2t(:,:) * antarctica_icesheet_mask(:,:) ) 206 207 ! use ABS function because we need to preserve the sign of fwfisf 208 WHERE( antarctica_icesheet_mask(:,:) == 1.0 ) & 209 & fwfisf(:,:) = fwfisf(:,:) * ABS( antarctica_icesheet_mass_rate_of_change * (1.0-rn_antarctica_calving_fraction) & 210 & / ( zantarctica_fwfisf_sum + 1.0e-10_wp ) ) 211 212 ! check 213 IF(lwp .AND. ll_wrtstp) WRITE(numout, *) 'Antarctica iceshelf melting climatology (kg/s) : ',zantarctica_fwfisf_sum 214 215 zantarctica_fwfisf_sum = glob_sum( fwfisf(:,:) * e1t(:,:) * e2t(:,:) * antarctica_icesheet_mask(:,:) ) 216 217 IF(lwp .AND. ll_wrtstp) WRITE(numout, *) 'Antarctica iceshelf melting adjusted value (kg/s) : ',zantarctica_fwfisf_sum 218 219 ENDIF 220 ENDIF 221 139 222 qisf(:,:) = fwfisf(:,:) * rLfusisf ! heat flux 140 223 stbl(:,:) = soce
Note: See TracChangeset
for help on using the changeset viewer.