MODULE diaar5 !!====================================================================== !! *** MODULE diaar5 *** !! AR5 diagnostics !!====================================================================== !! History : 3.2 ! 2009-11 (S. Masson) Original code !!---------------------------------------------------------------------- #if defined key_diaar5 !!---------------------------------------------------------------------- !! 'key_diaar5' : activate ar5 diagnotics !!---------------------------------------------------------------------- !! exa_mpl : liste of module subroutine (caution, never use the !! exa_mpl_init : name of the module for a routine) !! exa_mpl_stp : Please try to use 3 letter block for routine names !!---------------------------------------------------------------------- USE oce ! ocean dynamics and active tracers USE dom_oce ! ocean space and time domain USE eosbn2 ! equation of state (eos_bn2 routine) USE lib_mpp ! distribued memory computing library USE iom ! I/O manager library IMPLICIT NONE PRIVATE PUBLIC dia_ar5 ! routine called in step.F90 module LOGICAL, PUBLIC, PARAMETER :: lk_diaar5 = .TRUE. ! coupled flag REAL(wp) :: vol0 ! ocean volume (interior domain) REAL(wp) :: area_tot ! total ocean surface (interior domain) REAL(wp), DIMENSION(jpi,jpj ) :: area ! cell surface (interior domain) REAL(wp), DIMENSION(jpi,jpj ) :: thick0 ! ocean thickness (interior domain) REAL(wp), DIMENSION(jpi,jpj,jpk) :: sn0 ! initial salinity !! * Substitutions # include "domzgr_substitute.h90" !!---------------------------------------------------------------------- !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009) !! $Id$ !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE dia_ar5( kt ) !!---------------------------------------------------------------------- !! *** ROUTINE dia_ar5 *** !! !! ** Purpose : Brief description of the routine !! !! ** Method : description of the methodoloy used to achieve the !! objectives of the routine. Be as clear as possible! !! !! ** Action : - first action (share memory array/varible modified !! in this routine !! - second action ..... !! - ..... !! !! References : Author et al., Short_name_review, Year !! Give references if exist otherwise suppress these lines !!---------------------------------------------------------------------- INTEGER, INTENT( in ) :: kt ! ocean time-step index !! INTEGER :: ji, jj, jk ! dummy loop arguments REAL(wp) :: zvolssh, zvol, zssh_steric, zztmp, zarho, ztemp, zsal, zmass REAL(wp), DIMENSION(jpi,jpj ) :: zarea_ssh, zbotpres REAL(wp), DIMENSION(jpi,jpj,jpk) :: zrhd, zrhop !!-------------------------------------------------------------------- IF( kt == nit000 ) CALL dia_ar5_init ! Initialization (first time-step only) CALL iom_put( 'cellthc', fse3t(:,:,:) ) zarea_ssh(:,:) = area(:,:) * sshn(:,:) ! ! total volume of liquid seawater zvolssh = SUM( zarea_ssh(:,:) ) IF( lk_mpp ) CALL mpp_sum( zvolssh ) zvol = vol0 + zvolssh CALL iom_put( 'voltot', zvol ) CALL iom_put( 'sshtot', zvolssh / area_tot ) ! ! thermosteric ssh CALL eos( tn, sn0, zrhd ) ! now in situ density using initial salinity ! zbotpres(:,:) = 0.e0 ! no atmospheric surface pressure, levitating sea-ice DO jk = 1, jpkm1 zbotpres(:,:) = zbotpres(:,:) + fse3t(:,:,jk) * zrhd(:,:,jk) END DO IF( .NOT. lk_vvl ) zbotpres(:,:) = zbotpres(:,:) + sshn(:,:) * zrhd(:,:,1) ! zarho = SUM( area(:,:) * zbotpres(:,:) ) IF( lk_mpp ) CALL mpp_sum( zarho ) zssh_steric = - zarho / area_tot CALL iom_put( 'sshthster', zssh_steric ) ! ! steric sea surface height CALL eos( tn, sn, zrhd, zrhop ) ! now in situ and potential density zrhop(:,:,jpk) = 0.e0 CALL iom_put( 'rhop', zrhop ) ! zbotpres(:,:) = 0.e0 ! no atmospheric surface pressure, levitating sea-ice DO jk = 1, jpkm1 zbotpres(:,:) = zbotpres(:,:) + fse3t(:,:,jk) * zrhd(:,:,jk) END DO IF( .NOT. lk_vvl ) zbotpres(:,:) = zbotpres(:,:) + sshn(:,:) * zrhd(:,:,1) ! zarho = SUM( area(:,:) * zbotpres(:,:) ) IF( lk_mpp ) CALL mpp_sum( zarho ) zssh_steric = - zarho / area_tot CALL iom_put( 'sshsteric', zssh_steric ) ! ! ocean bottom pressure zztmp = rau0 * grav * 1.e-4 ! recover pressure from pressure anomaly and cover to dbar = 1.e4 Pa zbotpres(:,:) = zztmp * ( zbotpres(:,:) + sshn(:,:) + thick0(:,:) ) CALL iom_put( 'botpres', zbotpres ) ! ! Mean density anomalie, temperature and salinity ztemp = 0.e0 zsal = 0.e0 DO jk = 1, jpkm1 DO jj = 1, jpj DO ji = 1, jpi zztmp = area(ji,jj) * fse3t(ji,jj,jk) ztemp = ztemp + zztmp * tn (ji,jj,jk) zsal = zsal + zztmp * sn (ji,jj,jk) END DO END DO END DO IF( .NOT. lk_vvl ) THEN ztemp = ztemp + SUM( zarea_ssh(:,:) * tn (:,:,1) ) zsal = zsal + SUM( zarea_ssh(:,:) * sn (:,:,1) ) ENDIF IF( lk_mpp ) THEN CALL mpp_sum( ztemp ) CALL mpp_sum( zsal ) END IF ! zmass = rau0 * ( zarho + zvol ) ! total mass of liquid seawater ztemp = ztemp / zvol ! potential temperature in liquid seawater zsal = zsal / zvol ! Salinity of liquid seawater ! CALL iom_put( 'masstot', zmass ) CALL iom_put( 'temptot', ztemp ) CALL iom_put( 'saltot' , zsal ) ! END SUBROUTINE dia_ar5 SUBROUTINE dia_ar5_init !!---------------------------------------------------------------------- !! *** ROUTINE dia_ar5_init *** !! !! ** Purpose : initialization of .... !! !! ** Method : blah blah blah ... !! !! ** input : Namlist namexa !! !! ** Action : ... !!---------------------------------------------------------------------- INTEGER :: inum INTEGER :: ik INTEGER :: ji, jj, jk ! dummy loop indices REAL(wp) :: zztmp REAL(wp), DIMENSION(jpi,jpj,jpk, 2) :: zsaldta ! Jan/Dec levitus salinity !!---------------------------------------------------------------------- ! area(:,:) = e1t(:,:) * e2t(:,:) * tmask_i(:,:) area_tot = SUM( area(:,:) ) ; IF( lk_mpp ) CALL mpp_sum( area_tot ) vol0 = 0.e0 thick0(:,:) = 0.e0 DO jk = 1, jpkm1 vol0 = vol0 + SUM( area (:,:) * tmask(:,:,jk) ) * e3t_0(jk) thick0(:,:) = thick0(:,:) + tmask_i(:,:) * tmask(:,:,jk) * e3t_0(jk) END DO CALL iom_open ( 'data_1m_salinity_nomask', inum ) CALL iom_get ( inum, jpdom_data, 'vosaline', zsaldta(:,:,:,1), 1 ) CALL iom_get ( inum, jpdom_data, 'vosaline', zsaldta(:,:,:,2), 12 ) CALL iom_close( inum ) sn0(:,:,:) = 0.5 * ( zsaldta(:,:,:,1) + zsaldta(:,:,:,2) ) sn0(:,:,:) = sn0(:,:,:)*tmask(:,:,:) IF( ln_zps ) THEN ! z-coord. partial steps DO jj = 1, jpj ! interpolation of salinity at the last ocean level (i.e. the partial step) DO ji = 1, jpi ik = mbathy(ji,jj) - 1 IF( ik > 2 ) THEN zztmp = ( gdept_0(ik) - fsdept_0(ji,jj,ik) ) / ( gdept_0(ik) - gdept_0(ik-1) ) sn0(ji,jj,ik) = (1.-zztmp) * sn0(ji,jj,ik) + zztmp * sn0(ji,jj,ik-1) ENDIF END DO END DO ENDIF ! END SUBROUTINE dia_ar5_init #else !!---------------------------------------------------------------------- !! Default option : NO diaar5 !!---------------------------------------------------------------------- LOGICAL, PUBLIC, PARAMETER :: lk_diaar5 = .FALSE. ! coupled flag CONTAINS SUBROUTINE dia_ar5( kt ) ! Empty routine INTEGER, INTENT( in ) :: kt ! ocean time-step index WRITE(*,*) 'dia_ar5: You should not have seen this print! error?', kt END SUBROUTINE dia_ar5 #endif !!====================================================================== END MODULE diaar5