Changeset 5260 for branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/SBC/sbcfwb.F90
- Timestamp:
- 2015-05-12T12:37:15+02:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/SBC/sbcfwb.F90
r4347 r5260 8 8 !! 3.0 ! 2006-08 (G. Madec) Surface module 9 9 !! 3.2 ! 2009-07 (C. Talandier) emp mean s spread over erp area 10 !! 3.6 ! 2014-11 (P. Mathiot ) add ice shelf melting 10 11 !!---------------------------------------------------------------------- 11 12 … … 19 20 USE phycst ! physical constants 20 21 USE sbcrnf ! ocean runoffs 22 USE sbcisf ! ice shelf melting contribution 21 23 USE sbcssr ! SS damping terms 22 24 USE in_out_manager ! I/O manager … … 57 59 !! =1 global mean of emp set to zero at each nn_fsbc time step 58 60 !! =2 annual global mean corrected from previous year 61 !! =3 global mean of emp set to zero at each nn_fsbc time step 62 !! & spread out over erp area depending its sign 59 63 !! Note: if sea ice is embedded it is taken into account when computing the budget 60 64 !!---------------------------------------------------------------------- … … 81 85 IF( kn_fwb == 1 ) WRITE(numout,*) ' instantaneously set to zero' 82 86 IF( kn_fwb == 2 ) WRITE(numout,*) ' adjusted from previous year budget' 83 ENDIF 84 ! 85 area = glob_sum( e1e2t(:,:) ) ! interior global domain surface 86 ! 87 #if ! defined key_lim2 && ! defined key_lim3 && ! defined key_cice 87 IF( kn_fwb == 3 ) WRITE(numout,*) ' fwf set to zero and spread out over erp area' 88 ENDIF 89 ! 90 IF( kn_fwb == 3 .AND. nn_sssr /= 2 ) CALL ctl_stop( 'sbc_fwb: nn_fwb = 3 requires nn_sssr = 2, we stop ' ) 91 IF( kn_fwb == 3 .AND. ln_isfcav ) CALL ctl_stop( 'sbc_fwb: nn_fwb = 3 with ln_isfcav = .TRUE. not working, we stop ' ) 92 ! 93 area = glob_sum( e1e2t(:,:) * tmask(:,:,1)) ! interior global domain surface 94 ! isf cavities are excluded because it can feedback to the melting with generation of inhibition of plumes 95 ! and in case of no melt, it can generate HSSW. 96 ! 97 #if ! defined key_lim2 && ! defined key_lim3 && ! defined key_cice 88 98 snwice_mass_b(:,:) = 0.e0 ! no sea-ice model is being used : no snow+ice mass 89 99 snwice_mass (:,:) = 0.e0 … … 98 108 ! 99 109 IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN 100 z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) - snwice_fmass(:,:) ) ) / area ! sum over the global domain110 z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) + rdivisf * fwfisf(:,:) - snwice_fmass(:,:) ) ) / area ! sum over the global domain 101 111 zcoef = z_fwf * rcp 102 emp(:,:) = emp(:,:) - z_fwf 103 qns(:,:) = qns(:,:) + zcoef * sst_m(:,:) ! account for change to the heat budget due to fw correction112 emp(:,:) = emp(:,:) - z_fwf * tmask(:,:,1) 113 qns(:,:) = qns(:,:) + zcoef * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction 104 114 ENDIF 105 115 ! … … 132 142 IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN ! correct the freshwater fluxes 133 143 zcoef = fwfold * rcp 134 emp(:,:) = emp(:,:) + fwfold 135 qns(:,:) = qns(:,:) - zcoef * sst_m(:,:) ! account for change to the heat budget due to fw correction144 emp(:,:) = emp(:,:) + fwfold * tmask(:,:,1) 145 qns(:,:) = qns(:,:) - zcoef * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction 136 146 ENDIF 137 147 ! … … 142 152 ENDIF 143 153 ! 154 CASE ( 3 ) !== global fwf set to zero and spread out over erp area ==! 155 ! 156 IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN 157 ztmsk_pos(:,:) = tmask_i(:,:) ! Select <0 and >0 area of erp 158 WHERE( erp < 0._wp ) ztmsk_pos = 0._wp 159 ztmsk_neg(:,:) = tmask_i(:,:) - ztmsk_pos(:,:) 160 ! 161 zsurf_neg = glob_sum( e1e2t(:,:)*ztmsk_neg(:,:) ) ! Area filled by <0 and >0 erp 162 zsurf_pos = glob_sum( e1e2t(:,:)*ztmsk_pos(:,:) ) 163 ! ! fwf global mean (excluding ocean to ice/snow exchanges) 164 z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) + rdivisf * fwfisf(:,:) - snwice_fmass(:,:) ) ) / area 165 ! 166 IF( z_fwf < 0._wp ) THEN ! spread out over >0 erp area to increase evaporation 167 zsurf_tospread = zsurf_pos 168 ztmsk_tospread(:,:) = ztmsk_pos(:,:) 169 ELSE ! spread out over <0 erp area to increase precipitation 170 zsurf_tospread = zsurf_neg 171 ztmsk_tospread(:,:) = ztmsk_neg(:,:) 172 ENDIF 173 ! 174 zsum_fwf = glob_sum( e1e2t(:,:) * z_fwf ) ! fwf global mean over <0 or >0 erp area 175 !!gm : zsum_fwf = z_fwf * area ??? it is right? I think so.... 176 z_fwf_nsrf = zsum_fwf / ( zsurf_tospread + rsmall ) 177 ! ! weight to respect erp field 2D structure 178 zsum_erp = glob_sum( ztmsk_tospread(:,:) * erp(:,:) * e1e2t(:,:) ) 179 z_wgt(:,:) = ztmsk_tospread(:,:) * erp(:,:) / ( zsum_erp + rsmall ) 180 ! ! final correction term to apply 181 zerp_cor(:,:) = -1. * z_fwf_nsrf * zsurf_tospread * z_wgt(:,:) 182 ! 183 !!gm ===>>>> lbc_lnk should be useless as all the computation is done over the whole domain ! 184 CALL lbc_lnk( zerp_cor, 'T', 1. ) 185 ! 186 emp(:,:) = emp(:,:) + zerp_cor(:,:) 187 qns(:,:) = qns(:,:) - zerp_cor(:,:) * rcp * sst_m(:,:) ! account for change to the heat budget due to fw correction 188 erp(:,:) = erp(:,:) + zerp_cor(:,:) 189 ! 190 IF( nprint == 1 .AND. lwp ) THEN ! control print 191 IF( z_fwf < 0._wp ) THEN 192 WRITE(numout,*)' z_fwf < 0' 193 WRITE(numout,*)' SUM(erp+) = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2t(:,:) )*1.e-9,' Sv' 194 ELSE 195 WRITE(numout,*)' z_fwf >= 0' 196 WRITE(numout,*)' SUM(erp-) = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2t(:,:) )*1.e-9,' Sv' 197 ENDIF 198 WRITE(numout,*)' SUM(empG) = ', SUM( z_fwf*e1e2t(:,:) )*1.e-9,' Sv' 199 WRITE(numout,*)' z_fwf = ', z_fwf ,' Kg/m2/s' 200 WRITE(numout,*)' z_fwf_nsrf = ', z_fwf_nsrf ,' Kg/m2/s' 201 WRITE(numout,*)' MIN(zerp_cor) = ', MINVAL(zerp_cor) 202 WRITE(numout,*)' MAX(zerp_cor) = ', MAXVAL(zerp_cor) 203 ENDIF 204 ENDIF 205 ! 144 206 CASE DEFAULT !== you should never be there ==! 145 CALL ctl_stop( 'sbc_fwb : wrong nn_fwb value for the FreshWater Budget correction, choose either 1 or 2' )207 CALL ctl_stop( 'sbc_fwb : wrong nn_fwb value for the FreshWater Budget correction, choose either 1, 2 or 3' ) 146 208 ! 147 209 END SELECT
Note: See TracChangeset
for help on using the changeset viewer.