Changeset 14072 for NEMO/trunk/src/ICE/icedia.F90
- Timestamp:
- 2020-12-04T08:48:38+01:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk/src/ICE/icedia.F90
r13970 r14072 2 2 !!====================================================================== 3 3 !! *** MODULE icedia *** 4 !! Sea-Ice: global budgets 4 !! Sea-Ice: global budgets 5 5 !!====================================================================== 6 6 !! History : 3.4 ! 2012-10 (C. Rousset) original code … … 37 37 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: vol_loc_ini, sal_loc_ini, tem_loc_ini ! initial volume, salt and heat contents 38 38 REAL(wp) :: frc_sal, frc_voltop, frc_volbot, frc_temtop, frc_tembot ! global forcing trends 39 39 40 40 !!---------------------------------------------------------------------- 41 41 !! NEMO/ICE 4.0 , NEMO Consortium (2018) … … 59 59 !!--------------------------------------------------------------------------- 60 60 !! *** ROUTINE ice_dia *** 61 !! 62 !! ** Purpose: Compute the sea-ice global heat content, salt content 61 !! 62 !! ** Purpose: Compute the sea-ice global heat content, salt content 63 63 !! and volume conservation 64 64 !!--------------------------------------------------------------------------- 65 INTEGER, INTENT(in) :: kt ! ocean time step 65 INTEGER, INTENT(in) :: kt ! ocean time step 66 66 !! 67 67 REAL(wp) :: zbg_ivol, zbg_item, zbg_area, zbg_isal 68 68 REAL(wp) :: zbg_svol, zbg_stem 69 69 REAL(wp) :: z_frc_voltop, z_frc_temtop, z_frc_sal 70 REAL(wp) :: z_frc_volbot, z_frc_tembot 71 REAL(wp) :: zdiff_vol, zdiff_sal, zdiff_tem 70 REAL(wp) :: z_frc_volbot, z_frc_tembot 71 REAL(wp) :: zdiff_vol, zdiff_sal, zdiff_tem 72 72 !!--------------------------------------------------------------------------- 73 73 IF( ln_timing ) CALL timing_start('ice_dia') … … 82 82 z1_e1e2 = 1._wp / glob_sum( 'icedia', e1e2t(:,:) ) 83 83 ENDIF 84 84 85 85 ! ----------------------- ! 86 86 ! 1 - Contents ! … … 96 96 zbg_stem = glob_sum( 'icedia', et_s(:,:) * e1e2t(:,:) ) * 1.e-20 ! heat content (1.e20 J) 97 97 98 CALL iom_put( 'ibgvol_tot' , zbg_ivol ) 99 CALL iom_put( 'sbgvol_tot' , zbg_svol ) 100 CALL iom_put( 'ibgarea_tot' , zbg_area ) 101 CALL iom_put( 'ibgsalt_tot' , zbg_isal ) 102 CALL iom_put( 'ibgheat_tot' , zbg_item ) 103 CALL iom_put( 'sbgheat_tot' , zbg_stem ) 104 98 CALL iom_put( 'ibgvol_tot' , zbg_ivol ) 99 CALL iom_put( 'sbgvol_tot' , zbg_svol ) 100 CALL iom_put( 'ibgarea_tot' , zbg_area ) 101 CALL iom_put( 'ibgsalt_tot' , zbg_isal ) 102 CALL iom_put( 'ibgheat_tot' , zbg_item ) 103 CALL iom_put( 'sbgheat_tot' , zbg_stem ) 104 105 105 ENDIF 106 106 … … 109 109 ! ---------------------------! 110 110 ! they must be kept outside an IF(iom_use) because of the call to dia_rst below 111 z_frc_volbot = r1_rho0 * glob_sum( 'icedia', -( wfx_ice(:,:) + wfx_snw(:,:) + wfx_err_sub(:,:) ) * e1e2t(:,:) ) * 1.e-9 ! freshwater flux ice/snow-ocean 111 z_frc_volbot = r1_rho0 * glob_sum( 'icedia', -( wfx_ice(:,:) + wfx_snw(:,:) + wfx_err_sub(:,:) ) * e1e2t(:,:) ) * 1.e-9 ! freshwater flux ice/snow-ocean 112 112 z_frc_voltop = r1_rho0 * glob_sum( 'icedia', -( wfx_sub(:,:) + wfx_spr(:,:) ) * e1e2t(:,:) ) * 1.e-9 ! freshwater flux ice/snow-atm 113 113 z_frc_sal = r1_rho0 * glob_sum( 'icedia', - sfx(:,:) * e1e2t(:,:) ) * 1.e-9 ! salt fluxes ice/snow-ocean … … 121 121 frc_tembot = frc_tembot + z_frc_tembot * rDt_ice ! 1.e20 J 122 122 123 CALL iom_put( 'ibgfrcvoltop' , frc_voltop ) ! vol forcing ice/snw-atm (km3 equivalent ocean water) 124 CALL iom_put( 'ibgfrcvolbot' , frc_volbot ) ! vol forcing ice/snw-ocean (km3 equivalent ocean water) 125 CALL iom_put( 'ibgfrcsal' , frc_sal ) ! sal - forcing (psu*km3 equivalent ocean water) 126 CALL iom_put( 'ibgfrctemtop' , frc_temtop ) ! heat on top of ice/snw/ocean (1.e20 J) 127 CALL iom_put( 'ibgfrctembot' , frc_tembot ) ! heat on top of ocean(below ice) (1.e20 J) 123 CALL iom_put( 'ibgfrcvoltop' , frc_voltop ) ! vol forcing ice/snw-atm (km3 equivalent ocean water) 124 CALL iom_put( 'ibgfrcvolbot' , frc_volbot ) ! vol forcing ice/snw-ocean (km3 equivalent ocean water) 125 CALL iom_put( 'ibgfrcsal' , frc_sal ) ! sal - forcing (psu*km3 equivalent ocean water) 126 CALL iom_put( 'ibgfrctemtop' , frc_temtop ) ! heat on top of ice/snw/ocean (1.e20 J) 127 CALL iom_put( 'ibgfrctembot' , frc_tembot ) ! heat on top of ocean(below ice) (1.e20 J) 128 128 129 129 IF( iom_use('ibgfrchfxtop') .OR. iom_use('ibgfrchfxbot') ) THEN 130 130 CALL iom_put( 'ibgfrchfxtop' , frc_temtop * z1_e1e2 * 1.e-20 * kt*rn_Dt ) ! heat on top of ice/snw/ocean (W/m2) 131 CALL iom_put( 'ibgfrchfxbot' , frc_tembot * z1_e1e2 * 1.e-20 * kt*rn_Dt ) ! heat on top of ocean(below ice) (W/m2) 132 ENDIF 133 131 CALL iom_put( 'ibgfrchfxbot' , frc_tembot * z1_e1e2 * 1.e-20 * kt*rn_Dt ) ! heat on top of ocean(below ice) (W/m2) 132 ENDIF 133 134 134 ! ---------------------------------- ! 135 135 ! 3 - Content variations and drifts ! 136 136 ! ---------------------------------- ! 137 137 IF( iom_use('ibgvolume') .OR. iom_use('ibgsaltco') .OR. iom_use('ibgheatco') .OR. iom_use('ibgheatfx') ) THEN 138 139 zdiff_vol = r1_rho0 * glob_sum( 'icedia', ( rhoi*vt_i(:,:) + rhos*vt_s(:,:) - vol_loc_ini(:,:) ) * e1e2t(:,:) ) * 1.e-9 ! freshwater trend (km3) 138 139 zdiff_vol = r1_rho0 * glob_sum( 'icedia', ( rhoi*vt_i(:,:) + rhos*vt_s(:,:) - vol_loc_ini(:,:) ) * e1e2t(:,:) ) * 1.e-9 ! freshwater trend (km3) 140 140 zdiff_sal = r1_rho0 * glob_sum( 'icedia', ( rhoi*st_i(:,:) - sal_loc_ini(:,:) ) * e1e2t(:,:) ) * 1.e-9 ! salt content trend (km3*pss) 141 141 zdiff_tem = glob_sum( 'icedia', ( et_i(:,:) + et_s(:,:) - tem_loc_ini(:,:) ) * e1e2t(:,:) ) * 1.e-20 ! heat content trend (1.e20 J) 142 142 ! + SUM( qevap_ice * a_i_b, dim=3 ) !! clem: I think this term should not be there (but needs a check) 143 143 144 144 zdiff_vol = zdiff_vol - ( frc_voltop + frc_volbot ) 145 145 zdiff_sal = zdiff_sal - frc_sal 146 146 zdiff_tem = zdiff_tem - ( frc_tembot - frc_temtop ) 147 148 CALL iom_put( 'ibgvolume' , zdiff_vol ) ! ice/snow volume drift (km3 equivalent ocean water) 147 148 CALL iom_put( 'ibgvolume' , zdiff_vol ) ! ice/snow volume drift (km3 equivalent ocean water) 149 149 CALL iom_put( 'ibgsaltco' , zdiff_sal ) ! ice salt content drift (psu*km3 equivalent ocean water) 150 150 CALL iom_put( 'ibgheatco' , zdiff_tem ) ! ice/snow heat content drift (1.e20 J) 151 151 ! 152 152 ENDIF 153 153 154 154 IF( lrst_ice ) CALL ice_dia_rst( 'WRITE', kt_ice ) 155 155 ! … … 162 162 !!--------------------------------------------------------------------------- 163 163 !! *** ROUTINE ice_dia_init *** 164 !! 164 !! 165 165 !! ** Purpose: Initialization for the heat salt volume budgets 166 !! 166 !! 167 167 !! ** Method : Compute initial heat content, salt content and volume 168 168 !! … … 173 173 INTEGER :: ios, ierror ! local integer 174 174 !! 175 NAMELIST/namdia/ ln_icediachk, rn_icechk_cel, rn_icechk_glo, ln_icediahsb, ln_icectl, iiceprt, jiceprt 175 NAMELIST/namdia/ ln_icediachk, rn_icechk_cel, rn_icechk_glo, ln_icediahsb, ln_icectl, iiceprt, jiceprt 176 176 !!---------------------------------------------------------------------- 177 177 ! … … 194 194 WRITE(numout,*) ' chosen grid point position (iiceprt,jiceprt) = (', iiceprt,',', jiceprt,')' 195 195 ENDIF 196 ! 196 ! 197 197 IF( ln_icediahsb ) THEN 198 198 IF( ice_dia_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'ice_dia_init : unable to allocate arrays' ) ! allocate tke arrays … … 206 206 !!--------------------------------------------------------------------- 207 207 !! *** ROUTINE icedia_rst *** 208 !! 208 !! 209 209 !! ** Purpose : Read or write DIA file in restart file 210 210 !! … … 218 218 !!---------------------------------------------------------------------- 219 219 ! 220 IF( TRIM(cdrw) == 'READ' ) THEN ! Read/initialise 220 IF( TRIM(cdrw) == 'READ' ) THEN ! Read/initialise 221 221 IF( ln_rstart ) THEN !* Read the restart file 222 222 ! … … 238 238 IF(lwp) WRITE(numout,*) '~~~~~~~' 239 239 ! set trends to 0 240 frc_voltop = 0._wp 241 frc_volbot = 0._wp 242 frc_temtop = 0._wp 243 frc_tembot = 0._wp 244 frc_sal = 0._wp 240 frc_voltop = 0._wp 241 frc_volbot = 0._wp 242 frc_temtop = 0._wp 243 frc_tembot = 0._wp 244 frc_sal = 0._wp 245 245 ! record initial ice volume, salt and temp 246 246 vol_loc_ini(:,:) = rhoi * vt_i(:,:) + rhos * vt_s(:,:) ! ice/snow volume (kg/m2) … … 260 260 ! 261 261 ! Write in numriw (if iter == nitrst) 262 ! ------------------ 262 ! ------------------ 263 263 CALL iom_rstput( iter, nitrst, numriw, 'frc_voltop' , frc_voltop ) 264 264 CALL iom_rstput( iter, nitrst, numriw, 'frc_volbot' , frc_volbot ) … … 273 273 ! 274 274 END SUBROUTINE ice_dia_rst 275 275 276 276 #else 277 277 !!----------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.