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 phycst ! physical constants USE daymod ! calendar #if defined key_orca_lev10 USE lbclnk ! ocean lateral boundary conditions (or mpp link) #endif 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 :: & numsdt, & !: logical unit for data salinity #if defined key_pomme_r025 nsal1, nsal2 , & ! first and second record used nlecsa = 0 ! flag for first read #else nsal1, nsal2 ! first and second record used #endif 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) !! $Id$ !! 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 iom !! * Arguments INTEGER, INTENT(in) :: kt ! ocean time step !! * Local declarations INTEGER :: ji, jj, jk, jl, jkk ! dummy loop indicies INTEGER :: & imois, iman, i15, ik ! temporary integers # if defined key_tradmp INTEGER :: & il0, il1, ii0, ii1, ij0, ij1 ! temporary integers # endif REAL(wp) :: zxy, zl #if defined key_orca_lev10 REAL(wp), DIMENSION(jpi,jpj,jpkdta,2) :: zsal INTEGER :: ikr, ikw, ikt, jjk REAL(wp) :: zfac #endif CHARACTER (len=38) :: & cl_sdata = 'data_1m_salinity_nomask ' REAL(wp), DIMENSION(jpk,2) :: & zsaldta ! auxiliary array for interpolation !!---------------------------------------------------------------------- ! 0. Initialization ! ----------------- #if defined key_pomme_r025 ! DRAKKAR : we use input file with 1 month only iman = 1 #else iman = INT( raamo ) #endif !!! better but change the results i15 = INT( 2*FLOAT( nday ) / ( FLOAT( nobis(nmonth) ) + 0.5 ) ) i15 = nday / 16 imois = nmonth + i15 - 1 IF( imois == 0 ) imois = iman ! 1. First call kt=nit000 ! ----------------------- IF( kt == nit000 ) THEN nsal1 = 0 ! initializations IF(lwp) WRITE(numout,*) ' dta_sal : monthly salinity data in NetCDF file' CALL iom_open ( cl_sdata, numsdt ) ENDIF ! 2. Read monthly file ! ------------------- #if defined key_pomme_r025 ! IF( kt == nit000 .OR. imois /= nsal1 ) THEN ! In standard ORCA025, no damping is done. We read Levitus only for initial condition IF( kt == nit000 .AND. nlecsa == 0 ) THEN nlecsa = 1 #else IF( kt == nit000 .OR. imois /= nsal1 ) THEN #endif ! 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 #if defined key_orca_lev10 if (ln_zps) stop zsal(:,:,:,:) = 0. CALL iom_get (numsdt,jpdom_data,'vosaline',zsal(:,:,:,1),nsal1) CALL iom_get (numsdt,jpdom_data,'vosaline',zsal(:,:,:,2),nsal2) #else CALL iom_get (numsdt,jpdom_data,'vosaline',saldta(:,:,:,1),nsal1) CALL iom_get (numsdt,jpdom_data,'vosaline',saldta(:,:,:,2),nsal2) #endif 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) #if defined key_orca_lev10 zsal (ji,jj,13:13,:) = zsal (ji,jj,13:13,:) - 0.15 zsal (ji,jj,14:15,:) = zsal (ji,jj,14:15,:) - 0.25 zsal (ji,jj,16:17,:) = zsal (ji,jj,16:17,:) - 0.30 zsal (ji,jj,18:25,:) = zsal (ji,jj,18:25,:) - 0.35 #else saldta(ji,jj,13:13,:) = saldta(ji,jj,13:13,:) - 0.15 saldta(ji,jj,14:15,:) = saldta(ji,jj,14:15,:) - 0.25 saldta(ji,jj,16:17,:) = saldta(ji,jj,16:17,:) - 0.30 saldta(ji,jj,18:25,:) = saldta(ji,jj,18:25,:) - 0.35 #endif 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 #if defined key_orca_lev10 zsal ( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) = & & zsal ( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : ) #else saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) = & & saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : ) #endif ij0 = 101 ; ij1 = 101 #if defined key_orca_lev10 zsal ( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) = & & zsal ( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : ) #else saldta( mi0(ii0):mi1(ii1), mj0(ij0):mj1(ij1) , : , : ) = & & saldta( mi0(il0):mi1(il1) , mj0(ij0):mj1(ij1) , : , : ) #endif 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) #if defined key_orca_lev10 zsal (ji,jj,:,:) = zsal (jl,jj,:,:) #else saldta(ji,jj,:,:) = saldta(jl,jj,:,:) #endif 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) #if defined key_orca_lev10 zsal (ji,jj,:,:) = zsal (jl,jj,:,:) #else saldta(ji,jj,:,:) = saldta(jl,jj,:,:) #endif END DO END DO ij0 = 87 ; ij1 = 87 DO jj = mj0(ij0), mj1(ij1) DO ji = mi0(ii0), mi1(ii1) #if defined key_orca_lev10 zsal (ji,jj,:,:) = zsal (jl,jj,:,:) #else saldta(ji,jj,:,:) = saldta(jl,jj,:,:) #endif END DO END DO END DO ENDIF ENDIF #endif #if defined key_orca_lev10 ! interpolate from 31 to 301 level the zsal field result in saldta DO jl = 1, 2 DO jjk = 1, 5 saldta(:,:,jjk,jl) = zsal(:,:,1,jl) ENDDO DO jk = 1, jpk - 20, 10 ikr = INT( jk / 10 ) + 1 ikw = (ikr-1) * 10 + 1 ikt = ikw + 5 DO jjk = ikt , ikt + 9 zfac = ( gdept_0(jjk) - gdepw_0(ikt) ) / ( gdepw_0(ikt+10) - gdepw_0(ikt) ) saldta(:,:,jjk,jl) = zsal(:,:,ikr,jl) + ( zsal(:,:,ikr+1,jl) - zsal(:,:,ikr,jl) ) * zfac END DO END DO DO jjk = jpk-5, jpk saldta(:,:,jjk,jl) = zsal(:,:,jpkdta-1,jl) END DO ! fill the overlap areas CALL lbc_lnk (saldta(:,:,:,jl),'Z',-999.,'no0') END DO #endif IF( ln_sco ) THEN DO jl = 1, 2 DO jj = 1, jpj ! interpolation of salinites DO ji = 1, jpi DO jk = 1, jpk zl=fsdept(ji,jj,jk) IF(zl < gdept_0(1)) zsaldta(jk,jl) = saldta(ji,jj,1,jl) IF(zl > gdept_0(jpk)) zsaldta(jk,jl) = saldta(ji,jj,jpkm1,jl) DO jkk = 1, jpkm1 IF((zl-gdept_0(jkk))*(zl-gdept_0(jkk+1)).le.0.0) THEN zsaldta(jk,jl) = saldta(ji,jj,jkk,jl) & & + (zl-gdept_0(jkk))/(gdept_0(jkk+1)-gdept_0(jkk)) & & *(saldta(ji,jj,jkk+1,jl) - saldta(ji,jj,jkk,jl)) ENDIF END DO END DO DO jk = 1, jpkm1 saldta(ji,jj,jk,jl) = zsaldta(jk,jl) END DO saldta(ji,jj,jpk,jl) = 0.0 END DO END DO END DO IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) ' Levitus salinity data interpolated to s-coordinate' IF(lwp) WRITE(numout,*) ELSE ! ! Mask DO jl = 1, 2 saldta(:,:,:,jl) = saldta(:,:,:,jl)*tmask(:,:,:) saldta(:,:,jpk,jl) = 0. 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 zl = ( gdept_0(ik) - fsdept(ji,jj,ik) ) / ( gdept_0(ik) - gdept_0(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 ENDIF 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 #if ! defined key_pomme_r025 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) #if defined key_pomme_r025 ENDIF #endif ! Close the file ! -------------- IF( kt == nitend ) CALL iom_close (numsdt) 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