New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
dtasal.F90 in branches/DEV_r1784_3DF/NEMO/OPA_SRC/DTA – NEMO

source: branches/DEV_r1784_3DF/NEMO/OPA_SRC/DTA/dtasal.F90 @ 2125

Last change on this file since 2125 was 2125, checked in by cbricaud, 14 years ago

modification: don't allocate fdta arrays when time-interpollation is not used

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 11.2 KB
Line 
1MODULE dtasal
2   !!======================================================================
3   !!                     ***  MODULE  dtasal  ***
4   !! Ocean data  :  read ocean salinity data from monthly atlas data
5   !!=====================================================================
6#if defined key_dtasal   ||   defined key_esopa
7   !!----------------------------------------------------------------------
8   !!   'key_dtasal'                                          salinity data
9   !!----------------------------------------------------------------------
10   !!   dta_sal      : read ocean salinity data
11   !!----------------------------------------------------------------------
12   !! * Modules used
13   USE oce             ! ocean dynamics and tracers
14   USE dom_oce         ! ocean space and time domain
15   USE fldread         ! read input fields
16   USE in_out_manager  ! I/O manager
17   USE phycst          ! physical constants
18#if defined key_orca_lev10
19   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
20#endif
21
22   IMPLICIT NONE
23   PRIVATE
24
25   !! * Routine accessibility
26   PUBLIC dta_sal   ! called by step.F90 and inidta.F90
27   
28   !! * Shared module variables
29   LOGICAL , PUBLIC, PARAMETER ::   lk_dtasal = .TRUE.    !: salinity data flag
30   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   s_dta    !: salinity data at given time-step
31
32   !! * Module variables
33   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_sal       ! structure of input SST (file informations, fields read)
34
35   !! * Substitutions
36#  include "domzgr_substitute.h90"
37   !!----------------------------------------------------------------------
38   !!   OPA 9.0 , LOCEAN-IPSL (2005)
39   !! $Id$
40   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
41   !!----------------------------------------------------------------------
42
43CONTAINS
44
45   !!----------------------------------------------------------------------
46   !!   Default option:                                         NetCDF file
47   !!----------------------------------------------------------------------
48
49   SUBROUTINE dta_sal( kt )
50      !!----------------------------------------------------------------------
51      !!                   ***  ROUTINE dta_sal  ***
52      !!       
53      !! ** Purpose :   Reads monthly salinity data
54      !!             
55      !! ** Method  : - Read on unit numsdt the monthly salinity data interpo-
56      !!     lated onto the model grid.
57      !!              - At each time step, a linear interpolation is applied
58      !!     between two monthly values.
59      !!
60      !! History :
61      !!        !  91-03  ()  Original code
62      !!        !  92-07  (M. Imbard)
63      !!   9.0  !  02-06  (G. Madec)  F90: Free form and module
64      !!----------------------------------------------------------------------
65     
66      !! * Arguments
67      INTEGER, INTENT(in) ::   kt             ! ocean time step
68     
69      !! * Local declarations
70     
71      INTEGER ::   ji, jj, jk, jl, jkk   ! dummy loop indicies
72      INTEGER ::   &
73           imois, iman, i15, ik           ! temporary integers
74      INTEGER            :: ierror
75#if defined key_tradmp
76      INTEGER ::   &
77          il0, il1, ii0, ii1, ij0, ij1   ! temporary integers         
78#endif
79      REAL(wp) ::   zxy, zl
80#if defined key_orca_lev10
81      INTEGER   :: ikr, ikw, ikt, jjk
82      REAL(wp)  :: zfac
83#endif
84      REAL(wp), DIMENSION(jpk) ::   &
85          zsaldta            ! auxiliary array for interpolation
86      CHARACTER(len=100) :: cn_dir          ! Root directory for location of ssr files
87      TYPE(FLD_N)        :: sn_sal
88      LOGICAL , SAVE     :: linit_sal = .FALSE.
89      !!----------------------------------------------------------------------
90      NAMELIST/namdta_sal/cn_dir,sn_sal
91     
92      ! 1. Initialization
93      ! -----------------------
94     
95      IF( kt == nit000 .AND. ( .NOT. linit_sal ) ) THEN
96       
97         !                         ! set file information
98         cn_dir = './'             ! directory in which the model is executed
99         ! ... default values (NB: frequency positive => hours, negative => months)
100         !            !   file    ! frequency !  variable  ! time intep !  clim   ! 'yearly' or ! weights  ! rotation   !
101         !            !   name    !  (hours)  !   name     !   (T/F)    !  (T/F)  !  'monthly'  ! filename ! pairs      !
102         sn_sal = FLD_N( 'salinity',  -1.  ,  'vosaline',  .false.   , .true.  ,  'monthly'  , ''       , ''         )
103
104         REWIND ( numnam )         ! ... read in namlist namdta_sal
105         READ( numnam, namdta_sal ) 
106
107         IF(lwp) THEN              ! control print
108            WRITE(numout,*)
109            WRITE(numout,*) 'dta_sal : Salinity Climatology '
110            WRITE(numout,*) '~~~~~~~ '
111         ENDIF
112         ALLOCATE( sf_sal(1), STAT=ierror )
113         IF( ierror > 0 ) THEN
114             CALL ctl_stop( 'dta_sal: unable to allocate sf_sal structure' )   ;   RETURN
115         ENDIF
116
117#if defined key_orca_lev10
118         ALLOCATE( sf_sal(1)%fnow(jpi,jpj,jpkdta)   )
119         IF( sn_sal%ln_tint ) ALLOCATE( sf_sal(1)%fdta(jpi,jpj,jpkdta,2) )
120#else
121         ALLOCATE( sf_sal(1)%fnow(jpi,jpj,jpk)   )
122         IF( sn_sal%ln_tint ) ALLOCATE( sf_sal(1)%fdta(jpi,jpj,jpk,2) )
123#endif
124         ! fill sf_sal with sn_sal and control print
125         CALL fld_fill( sf_sal, (/ sn_sal /), cn_dir, 'dta_sal', 'Salinity data', 'namdta_sal' )
126         linit_sal = .TRUE.       
127      ENDIF
128     
129     
130      ! 2. Read monthly file
131      ! -------------------
132     
133      CALL fld_read( kt, 1, sf_sal )
134
135      IF( lwp .AND. kt==nn_it000 ) THEN
136         WRITE(numout,*)
137         WRITE(numout,*) ' read Levitus salinity ok'
138         WRITE(numout,*)
139      ENDIF
140
141#if defined key_tradmp
142      IF( cp_cfg == "orca"  .AND. jp_cfg == 2 ) THEN
143   
144         !                                        ! =======================
145         !                                        !  ORCA_R2 configuration
146         !                                        ! =======================
147         ij0 = 101   ;   ij1 = 109
148         ii0 = 141   ;   ii1 = 155   
149         DO jj = mj0(ij0), mj1(ij1)                  ! Reduced salinity in the Alboran Sea
150            DO ji = mi0(ii0), mi1(ii1)
151               sf_sal(1)%fnow(ji,jj,13:13) = sf_sal(1)%fnow(ji,jj,13:13) - 0.15
152               sf_sal(1)%fnow(ji,jj,14:15) = sf_sal(1)%fnow(ji,jj,14:15) - 0.25
153               sf_sal(1)%fnow(ji,jj,16:17) = sf_sal(1)%fnow(ji,jj,16:17) - 0.30
154               sf_sal(1)%fnow(ji,jj,18:25) = sf_sal(1)%fnow(ji,jj,18:25) - 0.35
155            END DO
156         END DO
157
158         IF( n_cla == 1 ) THEN 
159            !                                         ! New salinity profile at Gibraltar
160            il0 = 138   ;   il1 = 138   
161            ij0 = 101   ;   ij1 = 102
162            ii0 = 139   ;   ii1 = 139   
163            DO jl = mi0(il0), mi1(il1)
164               DO jj = mj0(ij0), mj1(ij1)
165                  DO ji = mi0(ii0), mi1(ii1)
166                        sf_sal(1)%fnow(ji,jj,:) = sf_sal(1)%fnow(jl,jj,:)
167                  END DO
168               END DO
169            END DO
170            !                                         ! New salinity profile at Bab el Mandeb
171            il0 = 164   ;   il1 = 164   
172            ij0 =  87   ;   ij1 =  88
173            ii0 = 161   ;   ii1 = 163   
174            DO jl = mi0(il0), mi1(il1)
175               DO jj = mj0(ij0), mj1(ij1)
176                  DO ji = mi0(ii0), mi1(ii1)
177                     sf_sal(1)%fnow(ji,jj,:) = sf_sal(1)%fnow(jl,jj,:)
178                  END DO
179               END DO
180            END DO
181            !
182         ENDIF
183            !
184      ENDIF
185#endif   
186       
187#if defined key_orca_lev10
188      DO jjk = 1, 5
189         s_dta(:,:,jjk) = sf_sal(1)%fnow(:,:,1)
190      ENDDO
191      DO jk = 1, jpk-20,10
192         ikr =  INT(jk/10) + 1
193         ikw =  (ikr-1) *10 + 1
194         ikt =  ikw + 5
195         DO jjk=ikt,ikt+9
196            zfac = ( gdept_0(jjk   ) - gdepw_0(ikt) ) / ( gdepw_0(ikt+10) - gdepw_0(ikt) )
197            s_dta(:,:,jjk) = sf_sal(1)%fnow(:,:,ikr) + ( sf_sal(1)%fnow(:,:,ikr+1) - sf_sal(1)%fnow(:,:,ikr) ) * zfac
198         END DO
199      END DO
200      DO jjk = jpk-5, jpk
201         s_dta(:,:,jjk) = sf_sal(1)%fnow(:,:,jpkdta-1)
202      END DO
203      ! fill the overlap areas
204      CALL lbc_lnk (s_dta(:,:,:),'Z',-999.,'no0')       
205#else
206      s_dta(:,:,:)=sf_sal(1)%fnow(:,:,:)
207#endif
208       
209      IF( ln_sco ) THEN
210         DO jj = 1, jpj                  ! interpolation of salinites
211            DO ji = 1, jpi
212               DO jk = 1, jpk
213                  zl=fsdept_0(ji,jj,jk)
214                  IF(zl < gdept_0(1)  ) zsaldta(jk) =  s_dta(ji,jj,1    ) 
215                  IF(zl > gdept_0(jpk)) zsaldta(jk) =  s_dta(ji,jj,jpkm1) 
216                  DO jkk = 1, jpkm1
217                     IF((zl-gdept_0(jkk))*(zl-gdept_0(jkk+1)).le.0.0) THEN
218                          zsaldta(jk) = s_dta(ji,jj,jkk)                                 &
219                                     &           + (zl-gdept_0(jkk))/(gdept_0(jkk+1)-gdept_0(jkk))      &
220                                     &                              *(s_dta(ji,jj,jkk+1) - s_dta(ji,jj,jkk))
221                     ENDIF
222                  END DO
223               END DO
224               DO jk = 1, jpkm1
225                  s_dta(ji,jj,jk) = zsaldta(jk) 
226               END DO
227               s_dta(ji,jj,jpk) = 0.0 
228            END DO
229         END DO
230           
231         IF( lwp .AND. kt==nn_it000 ) THEN
232            WRITE(numout,*)
233            WRITE(numout,*) ' Levitus salinity data interpolated to s-coordinate'
234            WRITE(numout,*)
235         ENDIF
236
237      ELSE
238         !                                  ! Mask
239         s_dta(:,:,:) = s_dta(:,:,:) * tmask(:,:,:)
240         s_dta(:,:,jpk) = 0. 
241         IF( ln_zps ) THEN               ! z-coord. partial steps
242            DO jj = 1, jpj               ! interpolation of salinity at the last ocean level (i.e. the partial step)
243               DO ji = 1, jpi
244                  ik = mbathy(ji,jj) - 1
245                  IF( ik > 2 ) THEN
246                     zl = ( gdept_0(ik) - fsdept_0(ji,jj,ik) ) / ( gdept_0(ik) - gdept_0(ik-1) )
247                     s_dta(ji,jj,ik) = (1.-zl) * s_dta(ji,jj,ik) + zl * s_dta(ji,jj,ik-1)
248                  ENDIF
249               END DO
250            END DO
251         ENDIF
252      ENDIF
253       
254      IF( lwp .AND. kt==nn_it000 ) THEN
255         WRITE(numout,*)' salinity Levitus '
256         WRITE(numout,*)
257         WRITE(numout,*)'  level = 1'
258         CALL prihre(s_dta(:,:,1),    jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
259         WRITE(numout,*)'  level = ',jpk/2
260         CALL prihre(s_dta(:,:,jpk/2),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)           
261         WRITE(numout,*) '  level = ',jpkm1
262         CALL prihre(s_dta(:,:,jpkm1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
263      ENDIF
264
265   END SUBROUTINE dta_sal
266
267#else
268   !!----------------------------------------------------------------------
269   !!   Default option:                                    NO salinity data
270   !!----------------------------------------------------------------------
271   LOGICAL , PUBLIC, PARAMETER ::   lk_dtasal = .FALSE.   !: salinity data flag
272CONTAINS
273   SUBROUTINE dta_sal( kt )        ! Empty routine
274      WRITE(*,*) 'dta_sal: You should not have seen this print! error?', kt
275   END SUBROUTINE dta_sal
276#endif
277   !!======================================================================
278END MODULE dtasal
Note: See TracBrowser for help on using the repository browser.