MODULE dtatem !!====================================================================== !! *** MODULE dtatem *** !! Ocean data : read ocean temperature data from monthly atlas data !!===================================================================== #if defined key_dtatem || defined key_esopa !!---------------------------------------------------------------------- !! 'key_dtatem' 3D temperature data field !!---------------------------------------------------------------------- !! dta_tem : read ocean temperature data !!---l------------------------------------------------------------------- !! * 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_tem ! called by step.F90 and inidta.F90 !! * Shared module variables LOGICAL , PUBLIC, PARAMETER :: lk_dtatem = .TRUE. !: temperature data flag REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: t_dta !: temperature data at given time-step !! * Module variables TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_tem ! 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 case NetCDF file !!---------------------------------------------------------------------- SUBROUTINE dta_tem( kt ) !!---------------------------------------------------------------------- !! *** ROUTINE dta_tem *** !! !! ** Purpose : Reads monthly temperature data !! !! ** Method : Read on unit numtdt the interpolated temperature !! 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. !! Read on unit numtdt !! !! ** Action : define t_dta array at time-step kt !! !! History : !! ! 91-03 () Original code !! ! 92-07 (M. Imbard) !! ! 99-10 (M.A. Foujols, M. Imbard) NetCDF FORMAT !! 8.5 ! 02-09 (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) :: ztemdta ! auxiliary array for interpolation CHARACTER(len=100) :: cn_dir ! Root directory for location of ssr files TYPE(FLD_N) :: sn_tem LOGICAL , SAVE :: linit_tem = .FALSE. !!---------------------------------------------------------------------- NAMELIST/namdta_tem/cn_dir,sn_tem ! 1. Initialization ! ----------------------- IF( kt == nit000 .AND. (.NOT. linit_tem ) ) 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_tem = FLD_N( 'temperature', -1. , 'votemper', .false. , .true. , 'yearly' , '' , '' ) REWIND( numnam ) ! ... read in namlist namdta_tem READ( numnam, namdta_tem ) IF(lwp) THEN ! control print WRITE(numout,*) WRITE(numout,*) 'dta_tem : Temperature Climatology ' WRITE(numout,*) '~~~~~~~ ' ENDIF ALLOCATE( sf_tem(1), STAT=ierror ) IF( ierror > 0 ) THEN CALL ctl_stop( 'dta_tem: unable to allocate sf_tem structure' ) ; RETURN ENDIF #if defined key_orca_lev10 ALLOCATE( sf_tem(1)%fnow(jpi,jpj,jpkdta) ) IF( sn_tem%ln_tint ) ALLOCATE( sf_tem(1)%fdta(jpi,jpj,jpkdta,2) ) #else ALLOCATE( sf_tem(1)%fnow(jpi,jpj,jpk) ) IF( sn_tem%ln_tint ) ALLOCATE( sf_tem(1)%fdta(jpi,jpj,jpk,2) ) #endif ! fill sf_tem with sn_tem and control print CALL fld_fill( sf_tem, (/ sn_tem /), cn_dir, 'dta_tem', 'Temperature data', 'namdta_tem' ) linit_tem = .TRUE. ! ENDIF ! 2. Read monthly file ! ------------------- CALL fld_read( kt, 1, sf_tem ) IF( lwp .AND. kt == nit000 )THEN WRITE(numout,*) WRITE(numout,*) ' read Levitus temperature 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 temperature in the Alboran Sea DO ji = mi0(ii0), mi1(ii1) sf_tem(1)%fnow(ji,jj, 13:13 ) = sf_tem(1)%fnow(ji,jj, 13:13 ) - 0.20 sf_tem(1)%fnow(ji,jj, 14:15 ) = sf_tem(1)%fnow(ji,jj, 14:15 ) - 0.35 sf_tem(1)%fnow(ji,jj, 16:25 ) = sf_tem(1)%fnow(ji,jj, 16:25 ) - 0.40 END DO END DO IF( n_cla == 1 ) THEN ! ! New temperature 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_tem(1)%fnow(ji,jj,:) = sf_tem(1)%fnow(jl,jj,:) END DO END DO END DO ! ! New temperature 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_tem(1)%fnow(ji,jj,:) = sf_tem(1)%fnow(jl,jj,:) END DO END DO END DO ! ELSE ! ! Reduced temperature at Red Sea ij0 = 87 ; ij1 = 96 ii0 = 148 ; ii1 = 160 sf_tem(1)%fnow( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 4:10 ) = 7.0 sf_tem(1)%fnow( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 11:13 ) = 6.5 sf_tem(1)%fnow( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 14:20 ) = 6.0 ENDIF ! ENDIF #endif #if defined key_orca_lev10 DO jjk = 1, 5 t_dta(:,:,jjk) = sf_tem(1)%fnow(:,:,1) END DO DO jk = 1, jpk-20,10 ik = jk+5 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) ) t_dta(:,:,jjk) = sf_tem(1)%fnow(:,:,ikr) + ( sf_tem(1)%fnow(:,:,ikr+1) - sf_tem(1)%fnow(:,:,ikr) ) * zfac END DO END DO DO jjk = jpk-5, jpk t_dta(:,:,jjk) = sf_tem(1)%fnow(:,:,jpkdta-1) END DO ! fill the overlap areas CALL lbc_lnk (t_dta(:,:,:),'Z',-999.,'no0') #else t_dta(:,:,:) = sf_tem(1)%fnow(:,:,:) #endif IF( ln_sco ) THEN DO jj = 1, jpj ! interpolation of temperatures DO ji = 1, jpi DO jk = 1, jpk zl=fsdept_0(ji,jj,jk) IF(zl < gdept_0(1)) ztemdta(jk) = t_dta(ji,jj,1) IF(zl > gdept_0(jpk)) ztemdta(jk) = t_dta(ji,jj,jpkm1) DO jkk = 1, jpkm1 IF((zl-gdept_0(jkk))*(zl-gdept_0(jkk+1)).le.0.0) THEN ztemdta(jk) = t_dta(ji,jj,jkk) & & + (zl-gdept_0(jkk))/(gdept_0(jkk+1)-gdept_0(jkk)) & & * (t_dta(ji,jj,jkk+1) - t_dta(ji,jj,jkk)) ENDIF END DO END DO DO jk = 1, jpkm1 t_dta(ji,jj,jk) = ztemdta(jk) END DO t_dta(ji,jj,jpk) = 0.0 END DO END DO IF( lwp .AND. kt == nit000 )THEN WRITE(numout,*) WRITE(numout,*) ' Levitus temperature data interpolated to s-coordinate' WRITE(numout,*) ENDIF ELSE ! ! Mask t_dta(:,:,: ) = t_dta(:,:,:) * tmask(:,:,:) t_dta(:,:,jpk) = 0. IF( ln_zps ) THEN ! z-coord. with partial steps DO jj = 1, jpj ! interpolation of temperature at the last level 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) ) t_dta(ji,jj,ik) = (1.-zl) * t_dta(ji,jj,ik) + zl * t_dta(ji,jj,ik-1) ENDIF END DO END DO ENDIF ENDIF IF( lwp .AND. kt == nit000 ) THEN WRITE(numout,*) ' temperature Levitus ' WRITE(numout,*) WRITE(numout,*)' level = 1' CALL prihre( t_dta(:,:,1 ), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) WRITE(numout,*)' level = ', jpk/2 CALL prihre( t_dta(:,:,jpk/2), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) WRITE(numout,*)' level = ', jpkm1 CALL prihre( t_dta(:,:,jpkm1), jpi, jpj, 1, jpi, 20, 1, jpj, 20, 1., numout ) ENDIF END SUBROUTINE dta_tem #else !!---------------------------------------------------------------------- !! Default case NO 3D temperature data field !!---------------------------------------------------------------------- LOGICAL , PUBLIC, PARAMETER :: lk_dtatem = .FALSE. !: temperature data flag CONTAINS SUBROUTINE dta_tem( kt ) ! Empty routine WRITE(*,*) 'dta_tem: You should not have seen this print! error?', kt END SUBROUTINE dta_tem #endif !!====================================================================== END MODULE dtatem