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 fldread ! read input fields USE in_out_manager ! I/O manager USE phycst ! physical constants #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 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_sal ! structure of input SST (file informations, fields read) !! * Substitutions # include "domzgr_substitute.h90" !!---------------------------------------------------------------------- !! NEMO/OPA 3.3 , NEMO Consortium (2010) !! $Id$ !! Software governed by the CeCILL licence (NEMOGCM/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 !!---------------------------------------------------------------------- INTEGER, INTENT(in) :: kt ! ocean time step INTEGER :: ji, jj, jk, jl, jkk ! dummy loop indicies INTEGER :: ik, ierror ! temporary integers #if defined key_tradmp INTEGER :: il0, il1, ii0, ii1, ij0, ij1 ! temporary integers #endif REAL(wp):: zl #if defined key_orca_lev10 INTEGER :: ikr, ikw, ikt, jjk REAL(wp):: zfac #endif REAL(wp), DIMENSION(jpk) :: zsaldta ! auxiliary array for interpolation CHARACTER(len=100) :: cn_dir ! Root directory for location of ssr files TYPE(FLD_N) :: sn_sal LOGICAL , SAVE :: linit_sal = .FALSE. !!---------------------------------------------------------------------- NAMELIST/namdta_sal/cn_dir,sn_sal ! 1. Initialization ! ----------------------- IF( kt == nit000 .AND. ( .NOT. linit_sal ) ) THEN ! ! set file information cn_dir = './' ! directory in which the model is executed ! ... default values (NB: frequency positive => hours, negative => months) ! ! file ! frequency ! variable ! time intep ! clim ! 'yearly' or ! weights ! rotation ! ! ! name ! (hours) ! name ! (T/F) ! (T/F) ! 'monthly' ! filename ! pairs ! sn_sal = FLD_N( 'salinity', -1. , 'vosaline', .false. , .true. , 'monthly' , '' , '' ) REWIND ( numnam ) ! ... read in namlist namdta_sal READ( numnam, namdta_sal ) IF(lwp) THEN ! control print WRITE(numout,*) WRITE(numout,*) 'dta_sal : Salinity Climatology ' WRITE(numout,*) '~~~~~~~ ' ENDIF ALLOCATE( sf_sal(1), STAT=ierror ) IF( ierror > 0 ) THEN CALL ctl_stop( 'dta_sal: unable to allocate sf_sal structure' ) ; RETURN ENDIF #if defined key_orca_lev10 ALLOCATE( sf_sal(1)%fnow(jpi,jpj,jpkdta) ) IF( sn_sal%ln_tint ) ALLOCATE( sf_sal(1)%fdta(jpi,jpj,jpkdta,2) ) #else ALLOCATE( sf_sal(1)%fnow(jpi,jpj,jpk) ) IF( sn_sal%ln_tint ) ALLOCATE( sf_sal(1)%fdta(jpi,jpj,jpk,2) ) #endif ! fill sf_sal with sn_sal and control print CALL fld_fill( sf_sal, (/ sn_sal /), cn_dir, 'dta_sal', 'Salinity data', 'namdta_sal' ) linit_sal = .TRUE. ENDIF ! 2. Read monthly file ! ------------------- CALL fld_read( kt, 1, sf_sal ) IF( lwp .AND. kt == nit000 ) 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) sf_sal(1)%fnow(ji,jj,13:13) = sf_sal(1)%fnow(ji,jj,13:13) - 0.15 sf_sal(1)%fnow(ji,jj,14:15) = sf_sal(1)%fnow(ji,jj,14:15) - 0.25 sf_sal(1)%fnow(ji,jj,16:17) = sf_sal(1)%fnow(ji,jj,16:17) - 0.30 sf_sal(1)%fnow(ji,jj,18:25) = sf_sal(1)%fnow(ji,jj,18:25) - 0.35 END DO END DO IF( n_cla == 1 ) THEN ! ! New salinity profile at Gibraltar il0 = 138 ; il1 = 138 ij0 = 101 ; ij1 = 102 ii0 = 139 ; ii1 = 139 DO jl = mi0(il0), mi1(il1) DO jj = mj0(ij0), mj1(ij1) DO ji = mi0(ii0), mi1(ii1) sf_sal(1)%fnow(ji,jj,:) = sf_sal(1)%fnow(jl,jj,:) END DO END DO END DO ! ! New salinity profile at Bab el Mandeb il0 = 164 ; il1 = 164 ij0 = 87 ; ij1 = 88 ii0 = 161 ; ii1 = 163 DO jl = mi0(il0), mi1(il1) DO jj = mj0(ij0), mj1(ij1) DO ji = mi0(ii0), mi1(ii1) sf_sal(1)%fnow(ji,jj,:) = sf_sal(1)%fnow(jl,jj,:) END DO END DO END DO ! ENDIF ! ENDIF #endif #if defined key_orca_lev10 DO jjk = 1, 5 s_dta(:,:,jjk) = sf_sal(1)%fnow(:,:,1) 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) ) s_dta(:,:,jjk) = sf_sal(1)%fnow(:,:,ikr) + ( sf_sal(1)%fnow(:,:,ikr+1) - sf_sal(1)%fnow(:,:,ikr) ) * zfac END DO END DO DO jjk = jpk-5, jpk s_dta(:,:,jjk) = sf_sal(1)%fnow(:,:,jpkdta-1) END DO ! fill the overlap areas CALL lbc_lnk (s_dta(:,:,:),'Z',-999.,'no0') #else s_dta(:,:,:)=sf_sal(1)%fnow(:,:,:) #endif IF( ln_sco ) THEN DO jj = 1, jpj ! interpolation of salinites DO ji = 1, jpi DO jk = 1, jpk zl=fsdept_0(ji,jj,jk) IF(zl < gdept_0(1) ) zsaldta(jk) = s_dta(ji,jj,1 ) IF(zl > gdept_0(jpk)) zsaldta(jk) = s_dta(ji,jj,jpkm1) DO jkk = 1, jpkm1 IF((zl-gdept_0(jkk))*(zl-gdept_0(jkk+1)).le.0.0) THEN zsaldta(jk) = s_dta(ji,jj,jkk) & & + (zl-gdept_0(jkk))/(gdept_0(jkk+1)-gdept_0(jkk)) & & *(s_dta(ji,jj,jkk+1) - s_dta(ji,jj,jkk)) ENDIF END DO END DO DO jk = 1, jpkm1 s_dta(ji,jj,jk) = zsaldta(jk) END DO s_dta(ji,jj,jpk) = 0.0 END DO END DO IF( lwp .AND. kt==nn_it000 ) THEN WRITE(numout,*) WRITE(numout,*) ' Levitus salinity data interpolated to s-coordinate' WRITE(numout,*) ENDIF ELSE ! ! Mask s_dta(:,:,:) = s_dta(:,:,:) * tmask(:,:,:) s_dta(:,:,jpk) = 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_0(ji,jj,ik) ) / ( gdept_0(ik) - gdept_0(ik-1) ) s_dta(ji,jj,ik) = (1.-zl) * s_dta(ji,jj,ik) + zl * s_dta(ji,jj,ik-1) ENDIF END DO END DO ENDIF ENDIF IF( lwp .AND. kt == nit000 ) THEN WRITE(numout,*)' salinity Levitus ' WRITE(numout,*) WRITE(numout,*)' level = 1' CALL prihre(s_dta(:,:,1), jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) WRITE(numout,*)' level = ',jpk/2 CALL prihre(s_dta(:,:,jpk/2),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) WRITE(numout,*) ' level = ',jpkm1 CALL prihre(s_dta(:,:,jpkm1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) ENDIF 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