!!---------------------------------------------------------------------- !! *** dtasal_fdir *** !!---------------------------------------------------------------------- !! dta_sal : read monthly salinity data in direct access file !!---------------------------------------------------------------------- !! OPA 9.0 , LODYC-IPSL (2003) !!---------------------------------------------------------------------- SUBROUTINE dta_sal( kt ) !!---------------------------------------------------------------------- !! *** ROUTINE dta_sal *** !! !! ** Purpose : Reads monthly salinity data !! !! ** Method : Direct acces file case !! Read on unit numsdt the interpolated Levitus salinity onto !! the global grid. !! The value is centered at the middle of month. !! At each time step, a linear interpolation is applied between !! two monthly values. !! !! History : !! ! 91-03 () Original code !! ! 92-07 (M. Imbard) !! 8.5 ! 02-06 (G. Madec) F90: Free form and module !!---------------------------------------------------------------------- !! * Arguments INTEGER, INTENT(in) :: kt ! ocean time step !! * Local declarations INTEGER ,PARAMETER :: jpmois= 12 & ! number on month in file & ,jpf = 1 ! number of fields INTEGER :: ji,jj,jk,jl,ios, ik INTEGER :: imois,iman INTEGER :: iimlu,ijmlu,ikmlu,ilmlu,immlu INTEGER :: i15, ibloc, ilindta REAL(wp) :: zxy, zl CHARACTER (len=20) :: cltit !!---------------------------------------------------------------------- ! 0. Initialization ! ----------------- iman = jpmois i15 = nday/16 imois = nmonth + i15 - 1 IF( imois == 0 ) imois = iman ! 1. First call kt=nit000 ! ----------------------- IF( kt == nit000 .AND. nlecsa == 0 ) THEN ! open sal.dta file ibloc = 4096 ilindta = ibloc*((jpidta*jpjdta*jpbytda-1 )/ibloc+1) CALL ctlopn(numsdt,'data_1m_salinity_nomask','OLD', 'UNFORMATTED', 'DIRECT', & ilindta,numout,lwp,1) nsal1 = 0 IF(lwp) THEN WRITE(numout,*) WRITE(numout,*) 'dta_sal : read monthly salinity in direct acces file in unit= ', numsdt WRITE(numout,*) '~~~~~~~ ' WRITE(numout,*) ENDIF ! 1.2 Read first records ! title, dimensions and tests READ (numsdt,REC=1,IOSTAT=ios) cltit, iimlu, ijmlu, ikmlu, & ilmlu, immlu IF( ios /= 0 ) THEN IF(lwp) WRITE(numout,*) 'e r r o r read numsdt ',ios STOP 'dtasal' ELSE IF ( iimlu /= jpidta ) STOP 4050 IF ( ijmlu /= jpjdta ) STOP 4060 IF ( ikmlu /= jpk ) STOP 4070 IF ( ilmlu /= jpmois ) STOP 4080 IF ( immlu /= jpf ) STOP 4090 IF(lwp) WRITE(numout,*) 'nb of points in the 5 directions ' IF(lwp) WRITE(numout,*) iimlu, ijmlu, ikmlu, ilmlu, immlu ENDIF 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 read3d(numsdt,saldta(1,1,1,1),nsal1+1) CALL read3d(numsdt,saldta(1,1,1,2),nsal2+1) IF(lwp) THEN WRITE(numout,*) WRITE(numout,*) ' read Levitus salinity ok' WRITE(numout,*) ENDIF ! 2.4 Masks DO jl = 1, 2 saldta(:,:,:,jl) = saldta(:,:,:,jl)*tmask(:,:,:) saldta(:,:,jpk,jl) = 0. IF( lk_zps ) THEN ! z-coordinate with 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 mounth = ',nsal1,' level = 1' CALL prihre(saldta(1,1,1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) WRITE(numout,*) ' Levitus mounth = ',nsal1,' level = ',jpk/2 CALL prihre(saldta(1,1,jpk/2,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout) WRITE(numout,*) ' Levitus mounth = ',nsal1,' level = ',jpkm1 CALL prihre(saldta(1,1,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. sdta(:,:,:)= ( (1.-zxy)*saldta(:,:,:,1) + zxy*saldta(:,:,:,2) ) END SUBROUTINE dta_sal