MODULE dtasst !!====================================================================== !! *** MODULE dtasst *** !! Data : Sea Surface Temperature (SST) !! BUG initialisation nyearsst !!!!!!bug !!====================================================================== !!---------------------------------------------------------------------- !! dta_sst : Reynolds sst data !!---------------------------------------------------------------------- !! * Modules used USE oce ! ocean dynamics and tracers USE dom_oce ! ocean space and time domain USE in_out_manager ! I/O manager USE ocfzpt ! ??? USE daymod ! calendar IMPLICIT NONE PRIVATE !! * Shared routine PUBLIC dta_sst !! * Shared module variables #if defined key_dtasst LOGICAL , PUBLIC, PARAMETER :: lk_dtasst = .TRUE. !: sst data flag #else LOGICAL , PUBLIC, PARAMETER :: lk_dtasst = .FALSE. !: sst data flag #endif REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: & !: sst !: surface temperature REAL(wp), PUBLIC, DIMENSION(jpi,jpj,2) :: & !: rclice !: climatological ice index (0/1) (2 months) !!---------------------------------------------------------------------- !! OPA 9.0 , LOCEAN-IPSL (2005) !! $Header$ !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt !!---------------------------------------------------------------------- CONTAINS #if defined key_dtasst !!---------------------------------------------------------------------- !! 'key_dtasst' SST data !!---------------------------------------------------------------------- SUBROUTINE dta_sst( kt ) !!--------------------------------------------------------------------- !! *** ROUTINE dta_sst *** !! !! ** Purpose : Read Reynolds weekly mean sea surface temperature !! data and update it at each time step. !! !! ** Method : - Read a specific REYNOLDS daily sst in Celcius. !! - Compute a climatological ice cover rclice (0 or 1) !! !! ** Action : - sst (Celcius) !! - rclice, ice/ocean mask (0 or 1) !! !! History : !! ! 90-03 (O. Marti and Ph Dandin) Original code !! ! 92-07 (M. Imbard) !! ! 96-11 (E. Guilyardi) Daily AGCM input files !! ! 00-04 (M. Imbard) NetCDF FORMAT !! ! 00-10 (J.-P. Boulanger) passage ORCA a TDH !! ! 01-10 (A. Lazar) Reynolds default !! 8.5 ! 02-06 (G. Madec) F90: Free form and module !! ! 02-11 (C. Levy) MPP/MPI NetCDF read !!---------------------------------------------------------------------- !! * Modules used USE ioipsl !! * Arguments INTEGER :: kt !! * Local save INTEGER, SAVE :: & ndaysst, & ! new day for Reynolds sst nyearsst ! new year for Reynolds sst !! * Local declarations INTEGER :: ji, jj INTEGER :: iprint INTEGER :: iy, iday, idy INTEGER :: istep(366) INTEGER :: ipi, ipj, ipk REAL(wp) :: zdate0, zdt, ztgel REAL(wp) :: zlon(jpi,jpj), zlat(jpi,jpj), zlev(jpk) CHARACTER (len=45) :: & clname ! filename for daily SST !!---------------------------------------------------------------------- clname = 'sst_1d.nc' #if defined key_agrif if ( .NOT. Agrif_Root() ) then clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname) endif #endif IF( kt == nit000 ) THEN IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'dta_sst : DAILY sea surface temperature data' IF(lwp) WRITE(numout,*) '~~~~~~~ read in file: ', clname sst(:,:) = 0.e0 ! required for extra halos in mpp ENDIF ! 0. initialization ! ----------------- ipi = jpiglo ipj = jpjglo ipk = jpk IF( nleapy == 0 ) THEN idy=365 ELSEIF( nleapy == 1 ) THEN IF( MOD( nyear, 4 ) == 0 ) THEN idy=366 ELSE idy=365 ENDIF ELSEIF( nleapy == 30 ) THEN IF(lwp) WRITE(numout,*) 'dtasst : nleapy = 30 is not compatible' IF(lwp) WRITE(numout,*) ' with existing files' IF(lwp) WRITE(numout,*) 'WE STOP' STOP 1234 ENDIF ! 2. Open files if nyearsst ! ------------------------- IF( nyearsst /= nyear ) THEN nyearsst = nyear iprint = 1 ! 2.1 Define file name and record ! Close/open file if new year IF( nyearsst /= 0 ) CALL flinclo(numsst) iy = nyear IF(lwp) WRITE (numout,*) iy IF(lwp) WRITE (numout,*) 'open sst file = ', clname CALL FLUSH(numout) CALL flinopen( clname, mig(1), nlci, mjg(1), nlcj, .FALSE., ipi, ipj & , ipk, zlon, zlat, zlev, idy, istep, zdate0, zdt, numsst ) IF( ipi /= jpidta .OR. ipj /= jpjdta ) THEN IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'problem with dimensions' IF(lwp) WRITE(numout,*) ' ipi ', ipi, ' jpidta ', jpidta IF(lwp) WRITE(numout,*) ' ipj ', ipj, ' jpjdta ', jpjdta nstop = nstop + 1 ENDIF IF(lwp) WRITE(numout,*) idy, istep, zdate0, zdt ELSE iprint = 0 ENDIF ! 3. Read SST if new day ! ------------------------- ! Read daily SST IF( ndaysst /= nday ) THEN ndaysst = nday iday = nday_year CALL flinget( numsst, 'sst', jpidta, jpjdta, 1, idy, iday, & iday, mig(1), nlci, mjg(1), nlcj, sst(1:nlci,1:nlcj) ) IF ( kt == nit000 .AND. lwp ) THEN WRITE(numout,*) ' ' WRITE(numout,*) ' read daily sea surface temperature ok' WRITE(numout,*) ' ' WRITE(numout,*) ' Surface temp day: ', ndastp CALL prihre(sst(1,1),jpi,jpj,1,jpi,20,1,jpj,10,1.,numout) ENDIF ENDIF ! 2. At every time step compute temperature data ! ---------------------------------------------- DO jj = 1, jpj DO ji = 1, jpi ztgel = fzptn(ji,jj) rclice(ji,jj,1) = tmask(ji,jj,1) IF( sst(ji,jj) >= ztgel ) rclice(ji,jj,1) = 0.e0 rclice(ji,jj,2) = rclice(ji,jj,1) END DO END DO IF( kt == nit000 .AND. lwp ) THEN WRITE(numout,*) WRITE(numout,*) 'Computed Ice cover rclice' WRITE(numout,*) WRITE(numout,*) 'Ice cover : ' CALL prihre( rclice(1,1,1), jpi, jpj, 1, jpi, 20, 1, jpj, 10, 1., numout ) ENDIF ! Close the file ! -------------- IF( kt == nitend ) CALL flinclo(numsst) CALL FLUSH(numout) END SUBROUTINE dta_sst #else !!---------------------------------------------------------------------- !! Default option : NO SST data !!---------------------------------------------------------------------- SUBROUTINE dta_sst( kt ) !!--------------------------------------------------------------------- !! *** ROUTINE dta_sst *** !! !! ** Purpose : sea surface temperature data and update it !! at each time step. ??? !! !! ** Method : - sst = tn !! - rclice = 1. IF tn =< ztgel !! !! History : !! ! 91-03 () Original code !! 8.5 ! 02-06 (G. Madec) F90: Free form and module !!---------------------------------------------------------------------- !! * Arguments INTEGER, INTENT( in ) :: kt ! ocean timestep !! * Local declarations INTEGER :: ji, jj !!--------------------------------------------------------------------- IF( kt == nit000 ) THEN IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'dta_sst : No SST data' IF(lwp) WRITE(numout,*) '~~~~~~~' ENDIF ! 1. Update at each time step ! --------------------------- sst (:,:) = tn (:,:,1) rclice(:,:,1) = tmask(:,:,1) DO jj = 1, jpj DO ji = 1, jpi IF( tn(ji,jj,1) >= fzptn(ji,jj) ) rclice(ji,jj,1) = 0.e0 END DO END DO rclice(:,:,2) = rclice(:,:,1) END SUBROUTINE dta_sst #endif !!====================================================================== END MODULE dtasst