Changeset 15048 for NEMO/trunk/src/OCE/DIA
- Timestamp:
- 2021-06-23T18:02:14+02:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk/src/OCE/DIA/diahsb.F90
r15004 r15048 83 83 REAL(wp) :: z_wn_trd_t , z_wn_trd_s ! - - 84 84 REAL(wp) :: z_ssh_hc , z_ssh_sc ! - - 85 REAL(wp), DIMENSION(jpi,jpj) :: z2d0, z2d1 ! 2D workspace 86 REAL(wp), DIMENSION(jpi,jpj,jpkm1) :: zwrk ! 3D workspace 85 REAL(wp), DIMENSION(jpi,jpj,13) :: ztmp 86 REAL(wp), DIMENSION(jpi,jpj,jpkm1,4) :: ztmpk 87 REAL(wp), DIMENSION(17) :: zbg 87 88 !!--------------------------------------------------------------------------- 88 89 IF( ln_timing ) CALL timing_start('dia_hsb') 89 90 ! 91 ztmp (:,:,:) = 0._wp ! should be better coded 92 ztmpk(:,:,:,:) = 0._wp ! should be better coded 93 ! 90 94 ts(:,:,:,1,Kmm) = ts(:,:,:,1,Kmm) * tmask(:,:,:) ; ts(:,:,:,1,Kbb) = ts(:,:,:,1,Kbb) * tmask(:,:,:) ; 91 95 ts(:,:,:,2,Kmm) = ts(:,:,:,2,Kmm) * tmask(:,:,:) ; ts(:,:,:,2,Kbb) = ts(:,:,:,2,Kbb) * tmask(:,:,:) ; 96 ! 92 97 ! ------------------------- ! 93 98 ! 1 - Trends due to forcing ! 94 99 ! ------------------------- ! 95 z_frc_trd_v = r1_rho0 * glob_sum( 'diahsb', - ( emp(:,:) - rnf(:,:) - fwfisf_cav(:,:) - fwfisf_par(:,:) ) * surf(:,:) ) ! volume fluxes 96 z_frc_trd_t = glob_sum( 'diahsb', sbc_tsc(:,:,jp_tem) * surf(:,:) ) ! heat fluxes 97 z_frc_trd_s = glob_sum( 'diahsb', sbc_tsc(:,:,jp_sal) * surf(:,:) ) ! salt fluxes 98 ! ! Add runoff heat & salt input 99 IF( ln_rnf ) z_frc_trd_t = z_frc_trd_t + glob_sum( 'diahsb', rnf_tsc(:,:,jp_tem) * surf(:,:) ) 100 IF( ln_rnf_sal) z_frc_trd_s = z_frc_trd_s + glob_sum( 'diahsb', rnf_tsc(:,:,jp_sal) * surf(:,:) ) 101 ! ! Add ice shelf heat & salt input 102 IF( ln_isf ) z_frc_trd_t = z_frc_trd_t & 103 & + glob_sum( 'diahsb', ( risf_cav_tsc(:,:,jp_tem) + risf_par_tsc(:,:,jp_tem) ) * surf(:,:) ) 104 ! ! Add penetrative solar radiation 105 IF( ln_traqsr ) z_frc_trd_t = z_frc_trd_t + r1_rho0_rcp * glob_sum( 'diahsb', qsr (:,:) * surf(:,:) ) 106 ! ! Add geothermal heat flux 107 IF( ln_trabbc ) z_frc_trd_t = z_frc_trd_t + glob_sum( 'diahsb', qgh_trd0(:,:) * surf(:,:) ) 108 ! 109 IF( ln_linssh ) THEN 100 ! prepare trends 101 ztmp(:,:,1) = - r1_rho0 * ( emp(:,:) - rnf(:,:) - fwfisf_cav(:,:) - fwfisf_par(:,:) ) * surf(:,:) ! volume 102 ztmp(:,:,2) = sbc_tsc(:,:,jp_tem) * surf(:,:) ! heat 103 ztmp(:,:,3) = sbc_tsc(:,:,jp_sal) * surf(:,:) ! salt 104 IF( ln_rnf ) ztmp(:,:,4) = rnf_tsc(:,:,jp_tem) * surf(:,:) ! runoff temp 105 IF( ln_rnf_sal ) ztmp(:,:,5) = rnf_tsc(:,:,jp_sal) * surf(:,:) ! runoff salt 106 IF( ln_isf ) ztmp(:,:,6) = ( risf_cav_tsc(:,:,jp_tem) + risf_par_tsc(:,:,jp_tem) ) * surf(:,:) ! isf temp 107 IF( ln_traqsr ) ztmp(:,:,7) = r1_rho0_rcp * qsr(:,:) * surf(:,:) ! penetrative solar radiation 108 IF( ln_trabbc ) ztmp(:,:,8) = qgh_trd0(:,:) * surf(:,:) ! geothermal heat 109 ! 110 IF( ln_linssh ) THEN ! Advection flux through fixed surface (z=0) 110 111 IF( ln_isfcav ) THEN 111 112 DO ji=1,jpi 112 113 DO jj=1,jpj 113 z 2d0(ji,jj) =surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_tem,Kbb)114 z 2d1(ji,jj) =surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_sal,Kbb)114 ztmp(ji,jj,9 ) = - surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_tem,Kbb) 115 ztmp(ji,jj,10) = - surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_sal,Kbb) 115 116 END DO 116 117 END DO 117 118 ELSE 118 z 2d0(:,:) =surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_tem,Kbb)119 z 2d1(:,:) =surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_sal,Kbb)119 ztmp(:,:,9 ) = - surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_tem,Kbb) 120 ztmp(:,:,10) = - surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_sal,Kbb) 120 121 END IF 121 z_wn_trd_t = - glob_sum( 'diahsb', z2d0 ) 122 z_wn_trd_s = - glob_sum( 'diahsb', z2d1 ) 123 ENDIF 124 122 ENDIF 123 124 ! global sum 125 zbg(1:10) = glob_sum_vec( 'dia_hsb', ztmp(:,:,1:10) ) 126 127 ! adding up 128 z_frc_trd_v = zbg(1) ! volume fluxes 129 z_frc_trd_t = zbg(2) ! heat fluxes 130 z_frc_trd_s = zbg(3) ! salt fluxes 131 IF( ln_rnf ) z_frc_trd_t = z_frc_trd_t + zbg(4) ! runoff heat 132 IF( ln_rnf_sal) z_frc_trd_s = z_frc_trd_s + zbg(5) ! runoff salt 133 IF( ln_isf ) z_frc_trd_t = z_frc_trd_t + zbg(6) ! isf heat 134 IF( ln_traqsr ) z_frc_trd_t = z_frc_trd_t + zbg(7) ! penetrative solar flux 135 IF( ln_trabbc ) z_frc_trd_t = z_frc_trd_t + zbg(8) ! geothermal heat 136 ! 125 137 frc_v = frc_v + z_frc_trd_v * rn_Dt 126 138 frc_t = frc_t + z_frc_trd_t * rn_Dt … … 128 140 ! ! Advection flux through fixed surface (z=0) 129 141 IF( ln_linssh ) THEN 142 z_wn_trd_t = zbg(9) 143 z_wn_trd_s = zbg(10) 144 ! 130 145 frc_wn_t = frc_wn_t + z_wn_trd_t * rn_Dt 131 146 frc_wn_s = frc_wn_s + z_wn_trd_s * rn_Dt 132 147 ENDIF 133 148 134 ! ------------------------ !135 ! 2 - Content variations !136 ! ------------------------ !149 ! --------------------------------- ! 150 ! 2 - Content variations with ssh ! 151 ! --------------------------------- ! 137 152 ! glob_sum_full is needed because you keep the full interior domain to compute the sum (iscpl) 138 153 ! 139 154 ! ! volume variation (calculated with ssh) 140 z diff_v1 = glob_sum_full( 'diahsb', surf(:,:)*ssh(:,:,Kmm) - surf_ini(:,:)*ssh_ini(:,:))155 ztmp(:,:,11) = surf(:,:)*ssh(:,:,Kmm) - surf_ini(:,:)*ssh_ini(:,:) 141 156 142 157 ! ! heat & salt content variation (associated with ssh) … … 145 160 DO ji = 1, jpi 146 161 DO jj = 1, jpj 147 z 2d0(ji,jj) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_tem,Kmm) * ssh(ji,jj,Kmm) - ssh_hc_loc_ini(ji,jj) )148 z 2d1(ji,jj) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_sal,Kmm) * ssh(ji,jj,Kmm) - ssh_sc_loc_ini(ji,jj) )162 ztmp(ji,jj,12) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_tem,Kmm) * ssh(ji,jj,Kmm) - ssh_hc_loc_ini(ji,jj) ) 163 ztmp(ji,jj,13) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_sal,Kmm) * ssh(ji,jj,Kmm) - ssh_sc_loc_ini(ji,jj) ) 149 164 END DO 150 165 END DO 151 166 ELSE ! no under ice-shelf seas 152 z 2d0(:,:) = surf(:,:) * ( ts(:,:,1,jp_tem,Kmm) * ssh(:,:,Kmm) - ssh_hc_loc_ini(:,:) )153 z 2d1(:,:) = surf(:,:) * ( ts(:,:,1,jp_sal,Kmm) * ssh(:,:,Kmm) - ssh_sc_loc_ini(:,:) )167 ztmp(:,:,12) = surf(:,:) * ( ts(:,:,1,jp_tem,Kmm) * ssh(:,:,Kmm) - ssh_hc_loc_ini(:,:) ) 168 ztmp(:,:,13) = surf(:,:) * ( ts(:,:,1,jp_sal,Kmm) * ssh(:,:,Kmm) - ssh_sc_loc_ini(:,:) ) 154 169 END IF 155 z_ssh_hc = glob_sum_full( 'diahsb', z2d0 ) 156 z_ssh_sc = glob_sum_full( 'diahsb', z2d1 ) 157 ENDIF 158 ! 159 DO jk = 1, jpkm1 ! volume variation (calculated with scale factors) 160 zwrk(:,:,jk) = surf (:,:) * e3t (:,:,jk,Kmm)*tmask (:,:,jk) & 161 & - surf_ini(:,:) * e3t_ini(:,:,jk )*tmask_ini(:,:,jk) 170 ENDIF 171 172 ! global sum 173 zbg(11:13) = glob_sum_full_vec( 'dia_hsb', ztmp(:,:,11:13) ) 174 175 zdiff_v1 = zbg(11) 176 ! ! heat & salt content variation (associated with ssh) 177 IF( ln_linssh ) THEN ! linear free surface case 178 z_ssh_hc = zbg(12) 179 z_ssh_sc = zbg(13) 180 ENDIF 181 ! 182 ! --------------------------------- ! 183 ! 3 - Content variations with e3t ! 184 ! --------------------------------- ! 185 ! glob_sum_full is needed because you keep the full interior domain to compute the sum (iscpl) 186 ! 187 DO jk = 1, jpkm1 ! volume 188 ztmpk(:,:,jk,1) = surf (:,:) * e3t (:,:,jk,Kmm)*tmask (:,:,jk) & 189 & - surf_ini(:,:) * e3t_ini(:,:,jk )*tmask_ini(:,:,jk) 162 190 END DO 163 zdiff_v2 = glob_sum_full( 'diahsb', zwrk(:,:,:) ) ! glob_sum_full needed as tmask and tmask_ini could be different 164 DO jk = 1, jpkm1 ! heat content variation 165 zwrk(:,:,jk) = ( surf (:,:) * e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_tem,Kmm) & 166 & - surf_ini(:,:) * hc_loc_ini(:,:,jk) ) 191 DO jk = 1, jpkm1 ! heat 192 ztmpk(:,:,jk,2) = ( surf (:,:) * e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_tem,Kmm) & 193 & - surf_ini(:,:) * hc_loc_ini(:,:,jk) ) 167 194 END DO 168 zdiff_hc = glob_sum_full( 'diahsb', zwrk(:,:,:) ) 169 DO jk = 1, jpkm1 ! salt content variation 170 zwrk(:,:,jk) = ( surf (:,:) * e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_sal,Kmm) & 171 & - surf_ini(:,:) * sc_loc_ini(:,:,jk) ) 195 DO jk = 1, jpkm1 ! salt 196 ztmpk(:,:,jk,3) = ( surf (:,:) * e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_sal,Kmm) & 197 & - surf_ini(:,:) * sc_loc_ini(:,:,jk) ) 172 198 END DO 173 zdiff_sc = glob_sum_full( 'diahsb', zwrk(:,:,:) ) 199 DO jk = 1, jpkm1 ! total ocean volume 200 ztmpk(:,:,jk,4) = surf(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) 201 END DO 202 203 ! global sum 204 zbg(14:17) = glob_sum_full_vec( 'dia_hsb', ztmpk(:,:,:,1:4) ) 205 206 zdiff_v2 = zbg(14) ! glob_sum_full needed as tmask and tmask_ini could be different 207 zdiff_hc = zbg(15) 208 zdiff_sc = zbg(16) 209 zvol_tot = zbg(17) 174 210 175 211 ! ------------------------ ! 176 ! 3- Drifts !212 ! 4 - Drifts ! 177 213 ! ------------------------ ! 178 214 zdiff_v1 = zdiff_v1 - frc_v … … 186 222 zerr_sc1 = z_ssh_sc - frc_wn_s 187 223 ENDIF 188 189 ! ----------------------- !190 ! 4 - Diagnostics writing !191 ! ----------------------- !192 DO jk = 1, jpkm1 ! total ocean volume (calculated with scale factors)193 zwrk(:,:,jk) = surf(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk)194 END DO195 zvol_tot = glob_sum( 'diahsb', zwrk(:,:,:) )196 224 197 225 !!gm to be added ?
Note: See TracChangeset
for help on using the changeset viewer.