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.
trcdta.F90 in trunk/NEMO/TOP_SRC – NEMO

source: trunk/NEMO/TOP_SRC/trcdta.F90 @ 336

Last change on this file since 336 was 335, checked in by opalod, 19 years ago

nemo_v1_update_023 : CE + RB + CT : new evolution of modules

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.9 KB
Line 
1MODULE trcdta
2   !!======================================================================
3   !!                     ***  MODULE  dtatem  ***
4   !! Ocean data  :  read passive tracer data from monthly atlas data
5   !!=====================================================================
6   !!  TOP 1.0,  LOCEAN-IPSL (2005)
7   !!----------------------------------------------------------------------
8
9#if  defined key_passivetrc && defined key_trc_dta
10   !!----------------------------------------------------------------------
11   !!   'key_trc_dta'                           3D tracer data field
12   !!----------------------------------------------------------------------
13   !!   dta_trc      : read ocean passive tracer data
14   !!----------------------------------------------------------------------
15   !! * Modules used
16   USE oce_trc
17   USE trc
18   USE par_sms
19   USE lib_print
20
21   IMPLICIT NONE
22   PRIVATE
23
24   !! * Routine accessibility
25   PUBLIC dta_trc   ! called by trcdtr.F90 and trcdmp.F90
26
27   !! * Shared module variables
28   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk,jptra) ::   &  !:
29      trdta             !: temperature data at given time-step
30
31   !! * Module variables
32   REAL(wp), DIMENSION(jpi,jpj,jpk,jptra,2) ::   &
33      tracdta            ! temperature data at two consecutive times
34   INTEGER , DIMENSION(jptra) :: &
35      nlectr  ,   &    !!: switch for reading once
36      ntrc1   ,   &    !!: ????
37      ntrc2            !!: ????
38
39   !! * Substitutions
40#  include "passivetrc_substitute.h90"
41
42   !!----------------------------------------------------------------------
43   !!   OPA 9.0 , LODYC-IPSL  (2003)
44   !!----------------------------------------------------------------------
45
46CONTAINS
47
48   !!----------------------------------------------------------------------
49   !!   Default case                                            NetCDF file
50   !!----------------------------------------------------------------------
51   
52   SUBROUTINE dta_trc( kt )
53      !!----------------------------------------------------------------------
54      !!                   ***  ROUTINE dta_trc  ***
55      !!
56      !! ** Purpose :   Reads passive tracer data (Levitus monthly data)
57      !!
58      !! ** Method  :   Read on unit numtr the interpolated tracer concentra-
59      !!      tion onto the global grid. Data begin at january.
60      !!      The value is centered at the middle of month.
61      !!      In the opa model, kt=1 agree with january 1.
62      !!      At each time step, a linear interpolation is applied between
63      !!      two monthly values.
64      !!
65      !! History :
66      !!   8.2  !  02-04  (O. Aumont)  Original code
67      !!   9.0  !  04-03  (C. Ethe)   
68      !!   9.0  !  05-03  (O. Aumont and A. El Moussaoui) F90
69      !!----------------------------------------------------------------------
70      !! * Modules used
71      USE ioipsl
72
73      !! * Arguments
74      !! * Arguments
75      INTEGER, INTENT( in ) ::   kt     ! ocean time-step
76
77      !! * Local declarations
78      INTEGER :: ji, jj, jn, jl 
79      INTEGER, PARAMETER ::  &
80         jpmois  = 12        ! number of months
81
82      INTEGER ::   &
83         imois, iman, i15, itime, ik, &  ! temporary integers
84         ipi, ipj, ipk                              !    "        "
85      INTEGER :: istep(jpmois)
86      CHARACTER (len=39) :: clname(jptra)
87      REAL(wp), DIMENSION (jpi,jpj) ::  zlon, zlat
88      REAL(wp), DIMENSION (jpk) ::  zlev
89      REAL(wp) :: zdate0, zxy, zl
90      !!----------------------------------------------------------------------
91
92      DO jn = 1, jptra
93
94         IF( lutini(jn) ) THEN
95
96            IF ( kt == nit000 ) THEN
97               !! 3D tracer data
98               IF(lwp)WRITE(numout,*)
99               IF(lwp)WRITE(numout,*) ' trcdta: reading tracer' 
100               IF(lwp)WRITE(numout,*) ' data file ', jn
101               IF(lwp)WRITE(numout,*)
102               nlectr(jn) = 0
103            ENDIF
104            ! Initialization
105            iman = jpmois
106            i15  = nday/16
107            imois = nmonth + i15 -1
108            IF( imois == 0 ) imois = iman
109            itime = jpmois
110            ipi = jpiglo
111            ipj = jpjglo
112
113            ! First call kt=nit000
114            ! --------------------
115
116            IF ( kt == nit000 .AND. nlectr(jn) == 0 ) THEN
117               ntrc1(jn) = 0
118               IF(lwp) THEN
119                  WRITE(numout,*)
120                  WRITE(numout,*) ' Tracer monthly fields' 
121                  WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~'
122                  WRITE(numout,*) ' NetCDF FORMAT'
123                  WRITE(numout,*)
124               ENDIF
125
126               ! open file
127
128               clname(jn) = 'LEVITUS_'//ctrcnm(jn)
129               CALL flinopen(TRIM(clname(jn)),mig(1),nlci,mjg(1),nlcj,    &
130                  .FALSE.,ipi,ipj,ipk,zlon,zlat,zlev,itime,    &
131                  istep,zdate0,rdt,numtr(jn)               )
132
133               ! title, dimensions and tests
134               IF( itime /= jpmois ) THEN
135                  IF(lwp) THEN
136                     WRITE(numout,*) ' '
137                     WRITE(numout,*) 'problem with time coordinates'
138                     WRITE(numout,*) ' itime ',itime,' jpmois ',jpmois
139                  ENDIF
140                  STOP 'trc_dta'
141               ENDIF
142
143               IF( ipi /= jpidta .OR. ipj /= jpjdta .OR. ipk /= jpk ) THEN
144                  IF(lwp) THEN
145                     WRITE(numout,*) ' '
146                     WRITE(numout,*) 'problem with dimensions'
147                     WRITE(numout,*) ' ipi ',ipi,' jpidta ',jpidta
148                     WRITE(numout,*) ' ipj ',ipj,' jpjdta ',jpjdta
149                     WRITE(numout,*) ' ipk ',ipk,' jpk ',jpk
150                  ENDIF
151                  STOP 'trc_dta'
152               ENDIF
153               IF(lwp)WRITE(numout,*) itime,istep,zdate0,rdt,numtr(jn)
154               trdta(:,:,:,jn) = 0.
155
156            ENDIF
157
158
159            ! Read montly file
160            IF( ( kt == nit000 .AND. nlectr(jn) == 0)   & 
161               .OR. imois /= ntrc1(jn) ) THEN
162               nlectr(jn) = 1
163
164               ! Calendar computation
165
166               ! ntrc1 number of the first file record used in the simulation
167               ! ntrc2 number of the last  file record
168
169               ntrc1(jn) = imois
170               ntrc2(jn) = ntrc1(jn) + 1
171               ntrc1(jn) = MOD( ntrc1(jn), iman )
172               IF ( ntrc1(jn) == 0 ) ntrc1(jn) = iman
173               ntrc2(jn) = MOD( ntrc2(jn), iman )
174               IF ( ntrc2(jn) == 0 ) ntrc2(jn) = iman
175               IF(lwp) WRITE(numout,*) 'first record file used ntrc1 ', ntrc1(jn) 
176               IF(lwp) WRITE(numout,*) 'last  record file used ntrc2 ', ntrc2(jn)
177
178               ! Read montly passive tracer data Levitus
179
180               CALL flinget( numtr(jn),ctrcnm(jn),jpidta,jpjdta,jpk,    &
181                  jpmois,ntrc1(jn),ntrc1(jn),mig(1),nlci,mjg(1),nlcj,  &
182                  tracdta(1:nlci,1:nlcj,1:jpk,jn,1)                  )
183
184               CALL flinget( numtr(jn),ctrcnm(jn),jpidta,jpjdta,jpk,     &
185                  jpmois,ntrc2(jn),ntrc2(jn),mig(1),nlci,mjg(1),nlcj,   &
186                  tracdta(1:nlci,1:nlcj,1:jpk,jn,2)                  )
187
188               IF(lwp) THEN
189                  WRITE(numout,*)
190                  WRITE(numout,*) ' read tracer data ', ctrcnm(jn),' ok'
191                  WRITE(numout,*)
192               ENDIF
193
194               ! Apply Mask
195               DO jl = 1, 2
196                  tracdta(:,:,:  ,jn,jl) = tracdta(:,:,:,jn,jl) * tmask(:,:,:) 
197                  tracdta(:,:,jpk,jn,jl) = 0.
198                  IF( lk_zps ) THEN                ! z-coord. with partial steps
199                     DO jj = 1, jpj                ! interpolation of temperature at the last level
200                        DO ji = 1, jpi
201                           ik = mbathy(ji,jj) - 1
202                           IF( ik > 2 ) THEN
203                              zl = ( gdept(ik) - fsdept(ji,jj,ik) ) / ( gdept(ik) - gdept(ik-1) )
204                              tracdta(ji,jj,ik,jn,jl) = (1.-zl) * tracdta(ji,jj,ik,jn,jl) + zl * tracdta(ji,jj,ik-1,jn,jl)
205                           ENDIF
206                        END DO
207                     END DO
208                  ENDIF
209
210               END DO
211
212            ENDIF
213
214            IF(lwp) THEN
215               WRITE(numout,*) ctrcnm(jn), 'Levitus month ', ntrc1(jn),   &
216                  ntrc2(jn)
217               WRITE(numout,*)
218               WRITE(numout,*) ' Levitus month = ', ntrc1(jn),   &
219                  '  level = 1'
220               CALL prihre( tracdta(1,1,1,jn,1), jpi, jpj, 1, jpi, 20, 1   &
221                  ,jpj, 20, 1., numout )
222               WRITE(numout,*) ' Levitus month = ', ntrc1(jn),    &
223                  '  level = ',jpk/2
224               CALL prihre( tracdta(1,1,jpk/2,jn,1), jpi, jpj, 1, jpi,    &
225                  20, 1, jpj, 20, 1., numout )
226               WRITE(numout,*) ' Levitus month = ',ntrc1(jn)     &
227                  ,'  level = ',jpkm1
228               CALL prihre( tracdta(1,1,jpkm1,jn,1), jpi, jpj, 1, jpi,     &
229                  20, 1, jpj, 20, 1., numout )
230            ENDIF
231
232            ! At every time step compute temperature data
233
234            zxy = FLOAT( nday + 15 - 30 * i15 ) / 30.
235            trdta(:,:,:,jn)=  ( 1. - zxy ) * tracdta(:,:,:,jn,1)    &
236               +       zxy   * tracdta(:,:,:,jn,2) 
237
238            IF( jn == jpno3) trdta(:,:,:,jn) = trdta(:,:,:,jn) * 7.6E-6
239            IF( jn == jpdic) trdta(:,:,:,jn) = trdta(:,:,:,jn) * 1.E-6
240            IF( jn == jptal) trdta(:,:,:,jn) = trdta(:,:,:,jn) * 1.E-6
241            IF( jn == jpoxy) trdta(:,:,:,jn) = trdta(:,:,:,jn) * 44.6E-6
242            IF( jn == jpsil) trdta(:,:,:,jn) = trdta(:,:,:,jn) * 1.E-6
243
244
245         ENDIF
246
247      END DO
248
249   END SUBROUTINE dta_trc
250
251#else
252
253   !!----------------------------------------------------------------------
254   !!   Default case                        NO 3D passive tracer data field
255   !!----------------------------------------------------------------------
256CONTAINS
257   SUBROUTINE dta_trc( kt )        ! Empty routine
258      WRITE(*,*) 'dta_trc: You should not have seen this print! error?', kt
259   END SUBROUTINE dta_trc
260
261#endif
262
263END MODULE trcdta
Note: See TracBrowser for help on using the repository browser.