MODULE dtasal !!====================================================================== !! *** MODULE dtasal *** !! Ocean data : read ocean salinity data from monthly atlas data !!===================================================================== #if defined key_dtasal || defined key_esopa !!---------------------------------------------------------------------- !! 'key_dtasal' salinity data !!---------------------------------------------------------------------- !! dta_sal : read ocean salinity 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 daymod ! calendar IMPLICIT NONE PRIVATE !! * Routine accessibility PUBLIC dta_sal ! called by step.F90 and inidta.F90 !! * Shared module variables LOGICAL , PUBLIC, PARAMETER :: lk_dtasal = .TRUE. !: salinity data flag REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: & !: s_dta !: salinity data at given time-step !! * Module variables INTEGER :: & nlecsa = 0, & ! switch for the first read nsal1 , & ! first record used nsal2 ! second record used REAL(wp), DIMENSION(jpi,jpj,jpk,2) :: & saldta ! salinity data at two consecutive times !! * Substitutions # include "domzgr_substitute.h90" !!---------------------------------------------------------------------- !! OPA 9.0 , LOCEAN-IPSL (2005) !! $Header$ !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt !!---------------------------------------------------------------------- CONTAINS !!---------------------------------------------------------------------- !! Default option: NetCDF file !!---------------------------------------------------------------------- SUBROUTINE dta_sal( kt ) !!---------------------------------------------------------------------- !! *** ROUTINE dta_sal *** !! !! ** Purpose : Reads monthly salinity data !! !! ** Method : - Read on unit numsdt the monthly salinity data interpo- !! lated onto the model grid. !! - At each time step, a linear interpolation is applied !! between two monthly values. !! !! History : !! ! 91-03 () Original code !! ! 92-07 (M. Imbard) !! 9.0 ! 02-06 (G. Madec) F90: Free form and module !!---------------------------------------------------------------------- !! * Modules used USE ioipsl !! * Arguments INTEGER, INTENT(in) :: kt ! ocean time step !! * Local declarations CHARACTER (len=32) :: clname INTEGER, PARAMETER :: jpmois = 12, jpf = 1 INTEGER :: ji, jj, jl ! dummy loop indicies INTEGER :: & imois, iman, ik, i15, & ! temporary integers ipi, ipj, ipk, itime ! " " # if defined key_tradmp INTEGER :: & jk, il0, il1, & ! temporary integers ii0, ii1, ij0, ij1 ! " " # endif INTEGER, DIMENSION(jpmois) :: istep REAL(wp) :: & zxy, zl, zdate0 REAL(wp), DIMENSION(jpi,jpj) :: zlon, zlat REAL(wp), DIMENSION(jpk) :: zlev !!---------------------------------------------------------------------- ! 0. Initialization ! ----------------- iman = jpmois i15 = nday / 16 imois = nmonth + i15 - 1 IF( imois == 0 ) imois = iman itime = jpmois ipi=jpiglo ipj=jpjglo ipk = jpk ! 1. First call kt=nit000 ! ----------------------- IF( kt == nit000 .AND. nlecsa == 0 ) THEN nsal1 = 0 IF(lwp) THEN WRITE(numout,*) WRITE(numout,*) ' dta_sal : monthly salinity data in NetCDF file' WRITE(numout,*) ' ~~~~~~~' WRITE(numout,*) ENDIF ! open file clname = 'data_1m_salinity_nomask' #if defined key_agrif if ( .NOT. Agrif_Root() ) then clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname) endif #endif CALL flinopen(TRIM(clname),mig(1),nlci,mjg(1),nlcj,.FALSE. & ,ipi,ipj,ipk,zlon,zlat,zlev,itime,istep,zdate0,rdt,numsdt) ! title, dimensions and tests IF( itime /= jpmois ) THEN IF(lwp) THEN WRITE(numout,*) WRITE(numout,*) 'problem with time coordinates' WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois ENDIF STOP 'dta_sal' ENDIF IF( ipi /= jpidta .OR. ipj /= jpjdta .OR. ipk /= jpk ) THEN IF(lwp) THEN WRITE(numout,*) WRITE(numout,*) 'problem with dimensions' WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk ENDIF STOP 'dta_sal' ENDIF IF(lwp)WRITE(numout,*) itime,istep,zdate0,rdt,numsdt ENDIF ! 2. Read monthly file ! ------------------- IF( ( kt == nit000 .AND. nlecsa == 0) .OR. imois /= nsal1 ) THEN nlecsa = 1 ! 2.1 Calendar computation nsal1 = imois ! first file record used nsal2 = nsal1 + 1 ! last file record used nsal1 = MOD( nsal1, iman ) IF( nsal1 == 0 ) nsal1 = iman nsal2 = MOD( nsal2, iman ) IF( nsal2 == 0 ) nsal2 = iman IF(lwp) WRITE(numout,*) 'first record file used nsal1 ', nsal1 IF(lwp) WRITE(numout,*) 'last record file used nsal2 ', nsal2 ! 2.3 Read monthly salinity data Levitus CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal1, & nsal1,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,1)) CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal2, & nsal2,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,2)) IF(lwp) THEN WRITE(numout,*) WRITE(numout,*) ' read Levitus salinity ok' WRITE(numout,*) ENDIF # if defined key_tradmp IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN ! ! ======================= ! ! ORCA_R2 configuration ! ! ======================= ij0 = 101 ; ij1 = 109 ii0 = 141 ; ii1 = 155 DO jj = mj0(ij0), mj1(ij1) ! Reduced salinity in the Alboran Sea DO ji = mi0(ii0), mi1(ii1) DO jk = 13, 13 saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.15 END DO DO jk = 14, 15 saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.25 END DO DO jk = 16, 17 saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.30 END DO DO jk = 18, 25 saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.35 END DO END DO END DO IF( n_cla == 1 ) THEN ! ! New salinity profile at Gibraltar il0 = 138 ; il1 = 138 ij0 = 101 ; ij1 = 101 ii0 = 139 ; ii1 = 139 saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) = & & saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : ) ij0 = 101 ; ij1 = 101 saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) = & & saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : ) il0 = 138 ; il1 = 138 ij0 = 101 ; ij1 = 102 ii0 = 139 ; ii1 = 139 DO jl = mi0(il0), mi1(il1) ! New salinity profile at Gibraltar DO jj = mj0(ij0), mj1(ij1) DO ji = mi0(ii0), mi1(ii1) saldta(ji,jj,:,:) = saldta(jl,jj,:,:) END DO END DO END DO il0 = 164 ; il1 = 164 ij0 = 88 ; ij1 = 88 ii0 = 161 ; ii1 = 163 DO jl = mi0(il0), mi1(il1) ! New salinity profile at Bab el Mandeb DO jj = mj0(ij0), mj1(ij1) DO ji = mi0(ii0), mi1(ii1) saldta(ji,jj,:,:) = saldta(jl,jj,:,:) END DO END DO ij0 = 87 ; ij1 = 87 DO jj = mj0(ij0), mj1(ij1) DO ji = mi0(ii0), mi1(ii1) saldta(ji,jj,:,:) = saldta(jl,jj,:,:) END DO END DO END DO ENDIF ENDIF #endif ! ! Mask DO jl = 1, 2 saldta(:,:,:,jl) = saldta(:,:,:,jl)*tmask(:,:,:) saldta(:,:,jpk,jl) = 0. IF( lk_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 zl = ( gdept(ik) - fsdept(ji,jj,ik) ) / ( gdept(ik) - gdept(ik-1) ) saldta(ji,jj,ik,jl) = (1.-zl) * saldta(ji,jj,ik,jl) +zl * saldta(ji,jj,ik-1,jl) ENDIF END DO END DO ENDIF END DO IF(lwp) THEN WRITE(numout,*)' salinity Levitus month ',nsal1,nsal2 WRITE(numout,*) WRITE(numout,*) ' Levitus month = ',nsal1,' level = 1' CALL prihre(saldta(:,:,1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) WRITE(numout,*) ' Levitus month = ',nsal1,' level = ',jpk/2 CALL prihre(saldta(:,:,jpk/2,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) WRITE(numout,*) ' Levitus month = ',nsal1,' level = ',jpkm1 CALL prihre(saldta(:,:,jpkm1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) ENDIF ENDIF ! 3. At every time step compute salinity data ! ------------------------------------------- zxy = FLOAT(nday + 15 - 30*i15)/30. s_dta(:,:,:) = ( 1.- zxy ) * saldta(:,:,:,1) + zxy * saldta(:,:,:,2) END SUBROUTINE dta_sal #else !!---------------------------------------------------------------------- !! Default option: NO salinity data !!---------------------------------------------------------------------- LOGICAL , PUBLIC, PARAMETER :: lk_dtasal = .FALSE. !: salinity data flag CONTAINS SUBROUTINE dta_sal( kt ) ! Empty routine WRITE(*,*) 'dta_sal: You should not have seen this print! error?', kt END SUBROUTINE dta_sal #endif !!====================================================================== END MODULE dtasal