!!---------------------------------------------------------------------- !! *** dtasal_monthly.h90 *** !!---------------------------------------------------------------------- !! OPA 9.0 , LODYC-IPSL (2003) !!---------------------------------------------------------------------- SUBROUTINE dta_sal( kt ) !!---------------------------------------------------------------------- !! *** ROUTINE dta_sal *** !! !! ** Purpose : Reads monthly salinity data !! !! ** Method : Read on unit numsdt the interpolated Levitus salinity onto !! onto the model grid. !! Data begin at january. !! The value is centered at the middle of month. !! In the opa model, kt=1 agree with january 1. !! 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 !!---------------------------------------------------------------------- !! * 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, jk, jl ! dummy loop indicies INTEGER :: & imois, iman, ik, i15, & ! temporary integers ipi, ipj, ipk, itime ! " " 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 = 'LEVITUS_1m_Salinity_Ice_nomask' 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 'dtasal_monthly.h90' ENDIF IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. 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 'dtasal_monthly.h90' 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 ! ! ======================= DO jj = mj0(101), mj1(109) ! Reduced salinity in the Alboran Sea DO ji = mi0(141), mi1(155) 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 saldta( mi0(139):mi1(139) , mj0(101):mj1(101) , : , : ) = & & saldta( mi0(138):mi1(138) , mj0(101):mj1(101) , : , : ) saldta( mi0(139):mi1(139) , mj0(102):mj1(102) , : , : ) = & & saldta( mi0(138):mi1(138) , mj0(102):mj1(102) , : , : ) DO jl = mi0(138), mi1(138) ! New temperature profile at Gibraltar DO jj = mj0(101), mj1(102) DO ji = mi0(139), mi1(139) saldta(ji,jj,:,:) = saldta(jl,jj,:,:) END DO END DO END DO DO jl = mi0(164), mi1(164) ! New salinity profile at Bab el Mandeb DO jj = mj0(88), mj1(88) DO ji = mi0(161), mi1(163) saldta(ji,jj,:,:) = saldta(jl,jj,:,:) END DO END DO DO jj = mj0(87), mj1(87) DO ji = mi0(161), mi1(163) 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 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