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 tags/start/NEMO/OPA_SRC/DTA – NEMO

source: tags/start/NEMO/OPA_SRC/DTA/dtasal.F90 @ 328

Last change on this file since 328 was 3, checked in by opalod, 20 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.9 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 in_out_manager  ! I/O manager
16   USE daymod          ! calendar
17
18   IMPLICIT NONE
19   PRIVATE
20
21   !! * Routine accessibility
22   PUBLIC dta_sal   ! called by step.F90 and inidta.F90
23   
24   !! * Shared module variables
25   LOGICAL , PUBLIC, PARAMETER ::   lk_dtasal = .TRUE.    ! salinity data flag
26   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   &
27      s_dta       ! salinity data at given time-step
28
29   !! * Module variables
30   INTEGER ::   &
31      nlecsa = 0,   &  ! switch for the first read
32      nsal1     ,   &  ! first record used
33      nsal2            ! second record used
34   REAL(wp), DIMENSION(jpi,jpj,jpk,2) ::   &
35      saldta    ! salinity data at two consecutive times
36
37   !! * Substitutions
38#  include "domzgr_substitute.h90"
39   !!----------------------------------------------------------------------
40   !!   OPA 9.0 , LODYC-IPSL  (2003)
41   !!----------------------------------------------------------------------
42
43CONTAINS
44
45# if defined key_fdir
46   !!----------------------------------------------------------------------
47   !!   'key_fdir'                                       direct access file
48   !!----------------------------------------------------------------------
49#     include "dtasal_fdir.h90"
50# else
51   !!----------------------------------------------------------------------
52   !!   Default option:                                         NetCDF file
53   !!----------------------------------------------------------------------
54
55   SUBROUTINE dta_sal( kt )
56      !!----------------------------------------------------------------------
57      !!                   ***  ROUTINE dta_sal  ***
58      !!       
59      !! ** Purpose :   Reads monthly salinity data
60      !!             
61      !! ** Method  : - Read on unit numsdt the monthly salinity data interpo-
62      !!     lated onto the model grid.
63      !!              - At each time step, a linear interpolation is applied
64      !!     between two monthly values.
65      !!
66      !! History :
67      !!        !  91-03  ()  Original code
68      !!        !  92-07  (M. Imbard)
69      !!   9.0  !  02-06  (G. Madec)  F90: Free form and module
70      !!----------------------------------------------------------------------
71      !! * Modules used
72      USE ioipsl
73
74      !! * Arguments
75      INTEGER, INTENT(in) ::   kt             ! ocean time step
76
77      !! * Local declarations
78      CHARACTER (len=32) ::   clname
79
80      INTEGER, PARAMETER ::   jpmois = 12, jpf = 1
81      INTEGER ::   ji, jj, jk, jl    ! dummy loop indicies
82      INTEGER ::   &
83         imois, iman, ik, i15,  &  ! temporary integers
84         ipi, ipj, ipk, itime      !    "          "
85      INTEGER, DIMENSION(jpmois) ::   istep
86      REAL(wp) ::   &
87         zxy, zl, zdate0
88      REAL(wp), DIMENSION(jpi,jpj) ::   zlon, zlat
89      REAL(wp), DIMENSION(jpk) ::   zlev
90      !!----------------------------------------------------------------------
91
92
93      ! 0. Initialization
94      ! -----------------
95
96      iman  = jpmois
97      i15   = nday / 16
98
99      imois = nmonth + i15 - 1
100      IF( imois == 0 ) imois = iman
101
102      itime = jpmois
103      ipi=jpiglo
104      ipj=jpjglo
105      ipk = jpk
106
107      ! 1. First call kt=nit000
108      ! -----------------------
109
110      IF( kt == nit000 .AND. nlecsa == 0 ) THEN
111         nsal1 = 0
112         IF(lwp) THEN
113            WRITE(numout,*)
114            WRITE(numout,*) ' dta_sal : monthly salinity data in NetCDF file'
115            WRITE(numout,*) ' ~~~~~~~'
116            WRITE(numout,*)
117         ENDIF
118
119         ! open file
120         
121         clname = 'data_1m_salinity_nomask'
122         CALL flinopen(TRIM(clname),mig(1),nlci,mjg(1),nlcj,.FALSE.   &
123              ,ipi,ipj,ipk,zlon,zlat,zlev,itime,istep,zdate0,rdt,numsdt)
124
125         ! title, dimensions and tests
126
127         IF( itime /= jpmois ) THEN
128            IF(lwp) THEN
129               WRITE(numout,*)
130               WRITE(numout,*) 'problem with time coordinates'
131               WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois
132            ENDIF
133            STOP 'dtasal_monthly.h90'
134         ENDIF
135         IF( ipi /= jpidta .AND. ipj /= jpjdta .AND. ipk /= jpk ) THEN
136            IF(lwp) THEN
137               WRITE(numout,*)
138               WRITE(numout,*) 'problem with dimensions'
139               WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
140               WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
141               WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk
142            ENDIF
143            STOP 'dtasal_monthly.h90'
144         ENDIF
145         IF(lwp)WRITE(numout,*) itime,istep,zdate0,rdt,numsdt
146
147      ENDIF
148
149
150      ! 2. Read monthly file
151      ! -------------------
152
153      IF( ( kt == nit000 .AND. nlecsa == 0) .OR. imois /= nsal1 ) THEN
154         nlecsa = 1
155         
156         ! 2.1 Calendar computation
157         
158         nsal1 = imois        ! first file record used
159         nsal2 = nsal1 + 1    ! last  file record used
160         nsal1 = MOD( nsal1, iman )
161         IF( nsal1 == 0 ) nsal1 = iman
162         nsal2 = MOD( nsal2, iman )
163         IF( nsal2 == 0 ) nsal2 = iman
164         IF(lwp) WRITE(numout,*) 'first record file used nsal1 ', nsal1
165         IF(lwp) WRITE(numout,*) 'last  record file used nsal2 ', nsal2
166         
167         ! 2.3 Read monthly salinity data Levitus
168
169         CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal1,   &
170           nsal1,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,1))
171
172         CALL flinget(numsdt,'vosaline',jpidta,jpjdta,jpk,jpmois,nsal2,   &
173           nsal2,mig(1),nlci,mjg(1),nlcj,saldta(1:nlci,1:nlcj,1:jpk,2))
174
175         
176         IF(lwp) THEN
177            WRITE(numout,*)
178            WRITE(numout,*) ' read Levitus salinity ok'
179            WRITE(numout,*)
180         ENDIF
181         
182#  if defined key_tradmp
183         IF( cp_cfg == "orca"  .AND. jp_cfg == 2 ) THEN
184
185            !                                        ! =======================
186            !                                        !  ORCA_R2 configuration
187            !                                        ! =======================
188         
189            DO jj = mj0(101), mj1(109)                      ! Reduced salinity in the Alboran Sea
190               DO ji = mi0(141), mi1(155)
191                  DO jk = 13, 13
192                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.15
193                  END DO
194                  DO jk = 14, 15
195                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.25
196                  END DO
197                  DO jk = 16, 17
198                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.30
199                  END DO
200                  DO jk = 18, 25
201                     saldta(ji,jj,jk,:) = saldta(ji,jj,jk,:) - 0.35
202                  END DO
203               END DO
204            END DO
205            IF( n_cla == 1 ) THEN 
206               !                                         ! New salinity profile at Gibraltar
207               saldta( mi0(139):mi1(139) , mj0(101):mj1(101) , : , : ) =   &
208                  &                                    saldta( mi0(138):mi1(138) , mj0(101):mj1(101) , : , : )
209               saldta( mi0(139):mi1(139) , mj0(102):mj1(102) , : , : ) =   &
210                  &                                    saldta( mi0(138):mi1(138) , mj0(102):mj1(102) , : , : )
211               DO jl = mi0(138), mi1(138)                ! New temperature profile at Gibraltar
212                  DO jj = mj0(101), mj1(102)
213                     DO ji = mi0(139), mi1(139)
214                        saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
215                     END DO
216                  END DO
217               END DO
218
219               DO jl = mi0(164), mi1(164)                ! New salinity profile at Bab el Mandeb
220                  DO jj = mj0(88), mj1(88)
221                     DO ji = mi0(161), mi1(163)
222                        saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
223                     END DO
224                  END DO
225                  DO jj = mj0(87), mj1(87)
226                     DO ji = mi0(161), mi1(163)
227                        saldta(ji,jj,:,:) = saldta(jl,jj,:,:)
228                     END DO
229                  END DO
230               END DO
231
232            ENDIF
233
234         ENDIF
235#endif
236         
237         !                                     ! Mask
238         DO jl = 1, 2
239            saldta(:,:,:,jl) = saldta(:,:,:,jl)*tmask(:,:,:)
240            saldta(:,:,jpk,jl) = 0.
241            IF( lk_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(ik) - fsdept(ji,jj,ik) ) / ( gdept(ik) - gdept(ik-1) )
247                        saldta(ji,jj,ik,jl) = (1.-zl) * saldta(ji,jj,ik,jl) +zl * saldta(ji,jj,ik-1,jl) 
248                     ENDIF
249                  END DO
250               END DO
251            ENDIF
252         END DO
253         
254
255         IF(lwp) THEN
256            WRITE(numout,*)' salinity Levitus month ',nsal1,nsal2
257            WRITE(numout,*)
258            WRITE(numout,*) ' Levitus mounth = ',nsal1,'  level = 1'
259            CALL prihre(saldta(1,1,1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
260            WRITE(numout,*) ' Levitus mounth = ',nsal1,'  level = ',jpk/2
261            CALL prihre(saldta(1,1,jpk/2,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
262            WRITE(numout,*) ' Levitus mounth = ',nsal1,'  level = ',jpkm1
263            CALL prihre(saldta(1,1,jpkm1,1),jpi,jpj,1,jpi,20,1,jpj,20,1.,numout)
264         ENDIF
265      ENDIF
266     
267 
268      ! 3. At every time step compute salinity data
269      ! -------------------------------------------
270
271      zxy = FLOAT(nday + 15 - 30*i15)/30.
272      s_dta(:,:,:) = ( 1.- zxy ) * saldta(:,:,:,1) + zxy * saldta(:,:,:,2)
273
274   END SUBROUTINE dta_sal
275
276# endif
277
278#else
279   !!----------------------------------------------------------------------
280   !!   Default option:                                    NO salinity data
281   !!----------------------------------------------------------------------
282   LOGICAL, PUBLIC, PARAMETER ::   lk_dtasal = .FALSE.   ! salinity data flag
283CONTAINS
284   SUBROUTINE dta_sal( kt )        ! Empty routine
285      WRITE(*,*) kt
286   END SUBROUTINE dta_sal
287#endif
288   !!======================================================================
289END MODULE dtasal
Note: See TracBrowser for help on using the repository browser.