- Timestamp:
- 2017-04-23T09:30:41+02:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/DIA/dia25h.F90
r7753 r7953 8 8 USE oce ! ocean dynamics and tracers variables 9 9 USE dom_oce ! ocean space and time domain 10 USE zdf_oce ! ocean vertical physics 11 USE zdfgls, ONLY: mxln 10 12 USE in_out_manager ! I/O units 11 13 USE iom ! I/0 library 12 USE wrk_nemo ! working arrays 13 #if defined key_zdftke 14 USE zdf_oce, ONLY: en 15 #endif 16 USE zdf_oce, ONLY: avt, avm 17 #if defined key_zdfgls 18 USE zdf_oce, ONLY: en 19 USE zdfgls, ONLY: mxln 20 #endif 14 USE wrk_nemo ! work arrays 21 15 22 16 IMPLICIT NONE 23 17 PRIVATE 24 18 25 LOGICAL , PUBLIC :: ln_dia25h !: 25h mean output26 19 PUBLIC dia_25h_init ! routine called by nemogcm.F90 27 20 PUBLIC dia_25h ! routine called by diawri.F90 28 21 29 !! * variables for calculating 25-hourly means 30 REAL(wp),SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: tn_25h , sn_25h 31 REAL(wp),SAVE, ALLOCATABLE, DIMENSION(:,:) :: sshn_25h 32 REAL(wp),SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: un_25h , vn_25h , wn_25h 33 REAL(wp),SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: avt_25h , avm_25h 34 #if defined key_zdfgls || key_zdftke 35 REAL(wp),SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: en_25h 36 #endif 37 #if defined key_zdfgls 38 REAL(wp),SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: rmxln_25h 39 #endif 40 INTEGER, SAVE :: cnt_25h ! Counter for 25 hour means 41 42 22 LOGICAL, PUBLIC :: ln_dia25h !: 25h mean output 23 24 ! variables for calculating 25-hourly means 25 INTEGER , SAVE :: cnt_25h ! Counter for 25 hour means 26 REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: tn_25h , sn_25h 27 REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:) :: sshn_25h 28 REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: un_25h , vn_25h , wn_25h 29 REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: avt_25h , avm_25h 30 REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: en_25h , rmxln_25h 43 31 44 32 !!---------------------------------------------------------------------- … … 56 44 !! 57 45 !! ** Method : Read namelist 58 !! History59 !! 3.6 ! 08-14 (E. O'Dea) Routine to initialize dia_25h60 46 !!--------------------------------------------------------------------------- 61 !!62 47 INTEGER :: ios ! Local integer output status for namelist read 63 48 INTEGER :: ierror ! Local integer for memory allocation … … 79 64 WRITE(numout,*) 'dia_25h_init : Output 25 hour mean diagnostics' 80 65 WRITE(numout,*) '~~~~~~~~~~~~' 81 WRITE(numout,*) ' Namelist nam_dia25h : set 25h outputs '82 WRITE(numout,*) ' Switch for 25h diagnostics (T) or not (F) ln_dia25h = ', ln_dia25h66 WRITE(numout,*) ' Namelist nam_dia25h : set 25h outputs ' 67 WRITE(numout,*) ' Switch for 25h diagnostics (T) or not (F) ln_dia25h = ', ln_dia25h 83 68 ENDIF 84 69 IF( .NOT. ln_dia25h ) RETURN … … 86 71 ! 1 - Allocate memory ! 87 72 ! ------------------- ! 88 ALLOCATE( tn_25h(jpi,jpj,jpk), STAT=ierror ) 73 ! ! ocean arrays 74 ALLOCATE( tn_25h (jpi,jpj,jpk), sn_25h (jpi,jpj,jpk), sshn_25h(jpi,jpj) , & 75 & un_25h (jpi,jpj,jpk), vn_25h (jpi,jpj,jpk), wn_25h(jpi,jpj,jpk), & 76 & avt_25h(jpi,jpj,jpk), avm_25h(jpi,jpj,jpk), STAT=ierror ) 89 77 IF( ierror > 0 ) THEN 90 CALL ctl_stop( 'dia_25h: unable to allocate tn_25h' ) ; RETURN 91 ENDIF 92 ALLOCATE( sn_25h(jpi,jpj,jpk), STAT=ierror ) 93 IF( ierror > 0 ) THEN 94 CALL ctl_stop( 'dia_25h: unable to allocate sn_25h' ) ; RETURN 95 ENDIF 96 ALLOCATE( un_25h(jpi,jpj,jpk), STAT=ierror ) 97 IF( ierror > 0 ) THEN 98 CALL ctl_stop( 'dia_25h: unable to allocate un_25h' ) ; RETURN 99 ENDIF 100 ALLOCATE( vn_25h(jpi,jpj,jpk), STAT=ierror ) 101 IF( ierror > 0 ) THEN 102 CALL ctl_stop( 'dia_25h: unable to allocate vn_25h' ) ; RETURN 103 ENDIF 104 ALLOCATE( wn_25h(jpi,jpj,jpk), STAT=ierror ) 105 IF( ierror > 0 ) THEN 106 CALL ctl_stop( 'dia_25h: unable to allocate wn_25h' ) ; RETURN 107 ENDIF 108 ALLOCATE( avt_25h(jpi,jpj,jpk), STAT=ierror ) 109 IF( ierror > 0 ) THEN 110 CALL ctl_stop( 'dia_25h: unable to allocate avt_25h' ) ; RETURN 111 ENDIF 112 ALLOCATE( avm_25h(jpi,jpj,jpk), STAT=ierror ) 113 IF( ierror > 0 ) THEN 114 CALL ctl_stop( 'dia_25h: unable to allocate avm_25h' ) ; RETURN 115 ENDIF 116 # if defined key_zdfgls || defined key_zdftke 117 ALLOCATE( en_25h(jpi,jpj,jpk), STAT=ierror ) 118 IF( ierror > 0 ) THEN 119 CALL ctl_stop( 'dia_25h: unable to allocate en_25h' ) ; RETURN 120 ENDIF 121 #endif 122 # if defined key_zdfgls 123 ALLOCATE( rmxln_25h(jpi,jpj,jpk), STAT=ierror ) 124 IF( ierror > 0 ) THEN 125 CALL ctl_stop( 'dia_25h: unable to allocate rmxln_25h' ) ; RETURN 126 ENDIF 127 #endif 128 ALLOCATE( sshn_25h(jpi,jpj), STAT=ierror ) 129 IF( ierror > 0 ) THEN 130 CALL ctl_stop( 'dia_25h: unable to allocate sshn_25h' ) ; RETURN 78 CALL ctl_stop( 'dia_25h: unable to allocate ocean arrays' ) ; RETURN 79 ENDIF 80 IF( ln_zdftke ) THEN ! TKE physics 81 ALLOCATE( en_25h(jpi,jpj,jpk), STAT=ierror ) 82 IF( ierror > 0 ) THEN 83 CALL ctl_stop( 'dia_25h: unable to allocate en_25h' ) ; RETURN 84 ENDIF 85 ENDIF 86 IF( ln_zdfgls ) THEN ! GLS physics 87 ALLOCATE( en_25h(jpi,jpj,jpk), rmxln_25h(jpi,jpj,jpk), STAT=ierror ) 88 IF( ierror > 0 ) THEN 89 CALL ctl_stop( 'dia_25h: unable to allocate en_25h and rmxln_25h' ) ; RETURN 90 ENDIF 131 91 ENDIF 132 92 ! ------------------------- ! … … 142 102 avt_25h(:,:,:) = avt(:,:,:) 143 103 avm_25h(:,:,:) = avm(:,:,:) 144 # if defined key_zdfgls || defined key_zdftke 104 IF( ln_zdftke ) THEN 145 105 en_25h(:,:,:) = en(:,:,:) 146 #endif 147 # if defined key_zdfgls 106 ENDIF 107 IF( ln_zdfgls ) THEN 108 en_25h(:,:,:) = en(:,:,:) 148 109 rmxln_25h(:,:,:) = mxln(:,:,:) 149 #endif 110 ENDIF 150 111 #if defined key_lim3 || defined key_lim2 151 112 CALL ctl_stop('STOP', 'dia_25h not setup yet to do tidemean ice') 152 113 #endif 153 154 ! -------------------------- ! 155 ! 3 - Return to dia_wri ! 156 ! -------------------------- ! 157 158 114 ! 159 115 END SUBROUTINE dia_25h_init 160 116 … … 164 120 !! *** ROUTINE dia_25h *** 165 121 !! 166 !!167 !!--------------------------------------------------------------------168 !!169 122 !! ** Purpose : Write diagnostics with M2/S2 tide removed 170 123 !! 171 !! ** Method : 172 !! 25hr mean outputs for shelf seas 124 !! ** Method : 25hr mean outputs for shelf seas 125 !!---------------------------------------------------------------------- 126 INTEGER, INTENT(in) :: kt ! ocean time-step index 173 127 !! 174 !! History :175 !! ?.0 ! 07-04 (A. Hines) New routine, developed from dia_wri_foam176 !! 3.4 ! 02-13 (J. Siddorn) Routine taken from old dia_wri_foam177 !! 3.6 ! 08-14 (E. O'Dea) adapted for VN3.6178 !!----------------------------------------------------------------------179 !! * Modules used180 181 IMPLICIT NONE182 183 !! * Arguments184 INTEGER, INTENT( in ) :: kt ! ocean time-step index185 186 187 !! * Local declarations188 128 INTEGER :: ji, jj, jk 189 129 INTEGER :: iyear0, nimonth0,iday0 ! start year,imonth,day 190 130 LOGICAL :: ll_print = .FALSE. ! =T print and flush numout 191 REAL(wp) :: zsto, zout, zmax, zjulian, zmdi ! temporary reals 192 INTEGER :: i_steps ! no of timesteps per hour 193 REAL(wp), DIMENSION(jpi,jpj ) :: zw2d, un_dm, vn_dm ! temporary workspace 194 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zw3d ! temporary workspace 195 REAL(wp), DIMENSION(jpi,jpj,3) :: zwtmb ! temporary workspace 196 INTEGER :: iyear0, nimonth0,iday0 ! start year,imonth,day 197 131 REAL(wp) :: zsto, zout, zmax, zjulian, zmdi ! local scalars 132 INTEGER :: i_steps ! no of timesteps per hour 133 REAL(wp), DIMENSION(jpi,jpj ) :: zw2d, un_dm, vn_dm ! workspace 134 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zw3d ! workspace 135 REAL(wp), DIMENSION(jpi,jpj,3) :: zwtmb ! workspace 198 136 !!---------------------------------------------------------------------- 199 137 … … 207 145 ENDIF 208 146 209 #if defined key_lim3 || defined key_lim2210 CALL ctl_stop('STOP', 'dia_wri_tide not setup yet to do tidemean ice')211 #endif212 213 147 ! local variable for debugging 214 148 ll_print = ll_print .AND. lwp 215 149 216 ! Sum of 25 hourly instantaneous values to give a 25h mean from 24hours 217 ! every day 218 IF( MOD( kt, i_steps ) == 0 .and. kt .ne. nn_it000 ) THEN 150 ! Sum of 25 hourly instantaneous values to give a 25h mean from 24hours every day 151 IF( MOD( kt, i_steps ) == 0 .AND. kt /= nn_it000 ) THEN 219 152 220 153 IF (lwp) THEN … … 231 164 avt_25h(:,:,:) = avt_25h(:,:,:) + avt(:,:,:) 232 165 avm_25h(:,:,:) = avm_25h(:,:,:) + avm(:,:,:) 233 # if defined key_zdfgls || defined key_zdftke 234 en_25h(:,:,:) = en_25h(:,:,:) + en(:,:,:) 235 #endif 236 # if defined key_zdfgls 237 rmxln_25h(:,:,:) = rmxln_25h(:,:,:) + mxln(:,:,:) 238 #endif 166 IF( ln_zdftke ) THEN 167 en_25h(:,:,:) = en_25h(:,:,:) + en(:,:,:) 168 ENDIF 169 IF( ln_zdfgls ) THEN 170 en_25h(:,:,:) = en_25h(:,:,:) + en(:,:,:) 171 rmxln_25h(:,:,:) = rmxln_25h(:,:,:) + mxln(:,:,:) 172 ENDIF 239 173 cnt_25h = cnt_25h + 1 240 174 ! 241 175 IF (lwp) THEN 242 176 WRITE(numout,*) 'dia_tide : Summed the following number of hourly values so far',cnt_25h 243 177 ENDIF 244 178 ! 245 179 ENDIF ! MOD( kt, i_steps ) == 0 246 180 247 248 IF( cnt_25h .EQ. 25 .AND. MOD( kt, i_steps*24) == 0 .AND. kt .NE.nn_it000 ) THEN249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 # if defined key_zdfgls || defined key_zdftke 181 ! Write data for 25 hour mean output streams 182 IF( cnt_25h == 25 .AND. MOD( kt, i_steps*24) == 0 .AND. kt /= nn_it000 ) THEN 183 ! 184 IF(lwp) THEN 185 WRITE(numout,*) 'dia_wri_tide : Writing 25 hour mean tide diagnostics at timestep', kt 186 WRITE(numout,*) '~~~~~~~~~~~~ ' 187 ENDIF 188 ! 189 tn_25h(:,:,:) = tn_25h(:,:,:) / 25.0_wp 190 sn_25h(:,:,:) = sn_25h(:,:,:) / 25.0_wp 191 sshn_25h(:,:) = sshn_25h(:,:) / 25.0_wp 192 un_25h(:,:,:) = un_25h(:,:,:) / 25.0_wp 193 vn_25h(:,:,:) = vn_25h(:,:,:) / 25.0_wp 194 wn_25h(:,:,:) = wn_25h(:,:,:) / 25.0_wp 195 avt_25h(:,:,:) = avt_25h(:,:,:) / 25.0_wp 196 avm_25h(:,:,:) = avm_25h(:,:,:) / 25.0_wp 197 IF( ln_zdftke ) THEN 264 198 en_25h(:,:,:) = en_25h(:,:,:) / 25.0_wp 265 #endif 266 # if defined key_zdfgls 199 ENDIF 200 IF( ln_zdfgls ) THEN 201 en_25h(:,:,:) = en_25h(:,:,:) / 25.0_wp 267 202 rmxln_25h(:,:,:) = rmxln_25h(:,:,:) / 25.0_wp 268 #endif 269 270 IF (lwp) WRITE(numout,*) 'dia_wri_tide : Mean calculated by dividing 25 hour sums and writing output' 271 zmdi=1.e+20 !missing data indicator for masking 272 ! write tracers (instantaneous) 273 zw3d(:,:,:) = tn_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 274 CALL iom_put("temper25h", zw3d) ! potential temperature 275 zw3d(:,:,:) = sn_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 276 CALL iom_put( "salin25h", zw3d ) ! salinity 277 zw2d(:,:) = sshn_25h(:,:)*tmask(:,:,1) + zmdi*(1.0-tmask(:,:,1)) 278 CALL iom_put( "ssh25h", zw2d ) ! sea surface 279 280 281 ! Write velocities (instantaneous) 282 zw3d(:,:,:) = un_25h(:,:,:)*umask(:,:,:) + zmdi*(1.0-umask(:,:,:)) 283 CALL iom_put("vozocrtx25h", zw3d) ! i-current 284 zw3d(:,:,:) = vn_25h(:,:,:)*vmask(:,:,:) + zmdi*(1.0-vmask(:,:,:)) 285 CALL iom_put("vomecrty25h", zw3d ) ! j-current 286 287 zw3d(:,:,:) = wn_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 288 CALL iom_put("vomecrtz25h", zw3d ) ! k-current 289 zw3d(:,:,:) = avt_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 290 CALL iom_put("avt25h", zw3d ) ! diffusivity 291 zw3d(:,:,:) = avm_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 292 CALL iom_put("avm25h", zw3d) ! viscosity 293 #if defined key_zdftke || defined key_zdfgls 203 ENDIF 204 ! 205 IF(lwp) WRITE(numout,*) 'dia_wri_tide : Mean calculated by dividing 25 hour sums and writing output' 206 zmdi=1.e+20 !missing data indicator for masking 207 ! write tracers (instantaneous) 208 zw3d(:,:,:) = tn_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 209 CALL iom_put("temper25h", zw3d) ! potential temperature 210 zw3d(:,:,:) = sn_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 211 CALL iom_put( "salin25h", zw3d ) ! salinity 212 zw2d(:,:) = sshn_25h(:,:)*tmask(:,:,1) + zmdi*(1.0-tmask(:,:,1)) 213 CALL iom_put( "ssh25h", zw2d ) ! sea surface 214 ! Write velocities (instantaneous) 215 zw3d(:,:,:) = un_25h(:,:,:)*umask(:,:,:) + zmdi*(1.0-umask(:,:,:)) 216 CALL iom_put("vozocrtx25h", zw3d) ! i-current 217 zw3d(:,:,:) = vn_25h(:,:,:)*vmask(:,:,:) + zmdi*(1.0-vmask(:,:,:)) 218 CALL iom_put("vomecrty25h", zw3d ) ! j-current 219 zw3d(:,:,:) = wn_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 220 CALL iom_put("vomecrtz25h", zw3d ) ! k-current 221 ! Write vertical physics 222 zw3d(:,:,:) = avt_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 223 CALL iom_put("avt25h", zw3d ) ! diffusivity 224 zw3d(:,:,:) = avm_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 225 CALL iom_put("avm25h", zw3d) ! viscosity 226 IF( ln_zdftke ) THEN 294 227 zw3d(:,:,:) = en_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 295 228 CALL iom_put("tke25h", zw3d) ! tke 296 #endif 297 #if defined key_zdfgls 229 ENDIF 230 IF( ln_zdfgls ) THEN 231 zw3d(:,:,:) = en_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 232 CALL iom_put("tke25h", zw3d) ! tke 298 233 zw3d(:,:,:) = rmxln_25h(:,:,:)*tmask(:,:,:) + zmdi*(1.0-tmask(:,:,:)) 299 234 CALL iom_put( "mxln25h",zw3d) 300 #endif 301 302 303 304 305 306 307 308 309 310 311 # if defined key_zdfgls || defined key_zdftke 235 ENDIF 236 ! 237 ! After the write reset the values to cnt=1 and sum values equal current value 238 tn_25h(:,:,:) = tsn(:,:,:,jp_tem) 239 sn_25h(:,:,:) = tsn(:,:,:,jp_sal) 240 sshn_25h(:,:) = sshn (:,:) 241 un_25h(:,:,:) = un(:,:,:) 242 vn_25h(:,:,:) = vn(:,:,:) 243 wn_25h(:,:,:) = wn(:,:,:) 244 avt_25h(:,:,:) = avt(:,:,:) 245 avm_25h(:,:,:) = avm(:,:,:) 246 IF( ln_zdftke ) THEN 312 247 en_25h(:,:,:) = en(:,:,:) 313 #endif 314 # if defined key_zdfgls 248 ENDIF 249 IF( ln_zdfgls ) THEN 250 en_25h(:,:,:) = en(:,:,:) 315 251 rmxln_25h(:,:,:) = mxln(:,:,:) 316 #endif 317 318 319 252 ENDIF 253 cnt_25h = 1 254 IF (lwp) WRITE(numout,*) 'dia_wri_tide : After 25hr mean write, reset sum to current value and cnt_25h to one for overlapping average',cnt_25h 255 ! 320 256 ENDIF ! cnt_25h .EQ. 25 .AND. MOD( kt, i_steps * 24) == 0 .AND. kt .NE. nn_it000 321 322 257 ! 323 258 END SUBROUTINE dia_25h 324 259
Note: See TracChangeset
for help on using the changeset viewer.