MODULE sbcssm !!====================================================================== !! *** MODULE sbcssm *** !! Surface module : provide time-mean ocean surface variables !!====================================================================== !! History : 9.0 ! 06-07 (G. Madec) Original code !!---------------------------------------------------------------------- !!---------------------------------------------------------------------- !! sbc_ssm : calculate sea surface mean currents, temperature, !! and salinity over nn_fsbc time-step !!---------------------------------------------------------------------- USE oce ! ocean dynamics and tracers USE dom_oce ! ocean space and time domain USE daymod ! calendar USE sbc_oce ! Surface boundary condition: ocean fields USE prtctl ! Print control (prt_ctl routine) USE restart ! ocean restart USE iom USE in_out_manager ! I/O manager IMPLICIT NONE PRIVATE PUBLIC sbc_ssm ! routine called by step.F90 !! * Substitutions # include "domzgr_substitute.h90" !!---------------------------------------------------------------------- !! OPA 9.0 , LOCEAN-IPSL (2006) !! $Header: $ !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE sbc_ssm( kt ) !!--------------------------------------------------------------------- !! *** ROUTINE sbc_oce *** !! !! ** Purpose : provide ocean surface variable to sea-surface boundary !! condition computation !! !! ** Method : compute mean surface velocity (2 components at U and !! V-points) [m/s], temperature [Celcius] and salinity [psu] over !! the periode (kt - nn_fsbc) to kt !!--------------------------------------------------------------------- INTEGER, INTENT(in) :: kt ! ocean time step ! REAL(wp) :: zcoef ! temporary scalar REAL(wp) :: zf_sbc ! read sbc frequency !!--------------------------------------------------------------------- ! ! ---------------------------------------- ! IF( nn_fsbc == 1 ) THEN ! Instantaneous surface fields ! ! ! ---------------------------------------- ! IF( kt == nit000 ) THEN IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'sbc_ssm : sea surface mean fields, nn_fsbc=1 : instantaneous values' IF(lwp) WRITE(numout,*) '~~~~~~~ ' ENDIF ! ssu_m(:,:) = un(:,:,1) ssv_m(:,:) = vn(:,:,1) sst_m(:,:) = tn(:,:,1) sss_m(:,:) = sn(:,:,1) ! ELSE ! ! ---------------------------------------- ! IF( kt == nit000) THEN ! Initialisation: 1st time-step ! ! ! ---------------------------------------- ! IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'sbc_ssm : sea surface mean fields' ! IF( ln_rstart .AND. iom_varid( numror, 'nn_fsbc' ) > 0 ) THEN CALL iom_get( numror , 'nn_fsbc', zf_sbc ) ! sbc frequency of previous run CALL iom_get( numror, jpdom_local, 'ssu_m' , ssu_m ) ! sea surface mean velocity (T-point) CALL iom_get( numror, jpdom_local, 'ssv_m' , ssv_m ) ! " " velocity (V-point) CALL iom_get( numror, jpdom_local, 'sst_m' , sst_m ) ! " " temperature (T-point) CALL iom_get( numror, jpdom_local, 'sss_m' , sss_m ) ! " " salinity (T-point) ! IF( zf_sbc /= REAL( nn_fsbc, wp ) ) THEN ! nn_fsbc has changed between 2 runs IF(lwp) WRITE(numout,*) '~~~~~~~ restart with a change in the frequency of mean ', & & 'from ', zf_sbc, ' to ', nn_fsbc zcoef = REAL( nn_fsbc - 1, wp ) / zf_sbc ssu_m(:,:) = zcoef * ssu_m(:,:) ssv_m(:,:) = zcoef * ssv_m(:,:) sst_m(:,:) = zcoef * sst_m(:,:) sss_m(:,:) = zcoef * sss_m(:,:) ELSE IF(lwp) WRITE(numout,*) '~~~~~~~ mean fields read in the ocean restart file' ENDIF ELSE IF(lwp) WRITE(numout,*) '~~~~~~~ mean fields initialised to instantaneous values' zcoef = REAL( nn_fsbc - 1, wp ) ssu_m(:,:) = zcoef * un(:,:,1) ssv_m(:,:) = zcoef * vn(:,:,1) sst_m(:,:) = zcoef * tn(:,:,1) sss_m(:,:) = zcoef * sn(:,:,1) ENDIF ! ! ---------------------------------------- ! ELSEIF( MOD( kt, nn_fsbc ) == 0 ) THEN ! Initialisation: New mean computation ! ! ! ---------------------------------------- ! ssu_m(:,:) = 0.e0 ! reset to zero ocean mean sbc fields ssv_m(:,:) = 0.e0 sst_m(:,:) = 0.e0 sss_m(:,:) = 0.e0 ENDIF ! ! ---------------------------------------- ! ! ! Cumulate at each time step ! ! ! ---------------------------------------- ! ssu_m(:,:) = ssu_m(:,:) + un(:,:,1) ssv_m(:,:) = ssv_m(:,:) + vn(:,:,1) sst_m(:,:) = sst_m(:,:) + tn(:,:,1) sss_m(:,:) = sss_m(:,:) + sn(:,:,1) ! ! ---------------------------------------- ! IF( MOD( kt - 1 , nn_fsbc ) == 0 ) THEN ! Mean value at each nn_fsbc time-step ! ! ! ---------------------------------------- ! zcoef = 1. / REAL( nn_fsbc, wp ) sst_m(:,:) = sst_m(:,:) * zcoef ! mean SST [Celcius] sss_m(:,:) = sss_m(:,:) * zcoef ! mean SSS [psu] ssu_m(:,:) = ssu_m(:,:) * zcoef ! mean suface current [m/s] ssv_m(:,:) = ssv_m(:,:) * zcoef ! ! ENDIF ! ! ---------------------------------------- ! IF( lrst_oce ) THEN ! Write in the ocean restart file ! ! ! ---------------------------------------- ! IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'sbc_ssm : sea surface mean fields written in ocean restart file ', & & 'at it= ', kt,' date= ', ndastp IF(lwp) WRITE(numout,*) '~~~~~~~' zf_sbc = REAL( nn_fsbc, wp ) CALL iom_rstput( kt, nitrst, numrow, 'nn_fsbc', zf_sbc ) ! sbc frequency CALL iom_rstput( kt, nitrst, numrow, 'ssu_m' , ssu_m ) ! sea surface mean fields CALL iom_rstput( kt, nitrst, numrow, 'ssv_m' , ssv_m ) CALL iom_rstput( kt, nitrst, numrow, 'sst_m' , sst_m ) CALL iom_rstput( kt, nitrst, numrow, 'sss_m' , sss_m ) ! ENDIF ! ENDIF ! END SUBROUTINE sbc_ssm !!====================================================================== END MODULE sbcssm