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.
dianam.F90 in trunk/NEMO/OFF_SRC/DIA – NEMO

source: trunk/NEMO/OFF_SRC/DIA/dianam.F90 @ 1672

Last change on this file since 1672 was 1672, checked in by cetlod, 15 years ago

Improvment of dianam.F90 module in offline configuration, see ticket:564

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 11.9 KB
Line 
1MODULE dianam
2   !!======================================================================
3   !!                       ***  MODULE  dianam  ***
4   !! Ocean diagnostics:  Builds output file name
5   !!=====================================================================
6
7   !!----------------------------------------------------------------------
8   !!   dia_nam       : Builds output file name
9   !!----------------------------------------------------------------------
10   !! * Modules used
11   USE dom_oce         ! ocean space and time domain
12   USE phycst          ! physical constants
13   USE in_out_manager  ! I/O manager
14   USE daymod          ! calendar
15
16   IMPLICIT NONE
17   PRIVATE
18
19   !! * Routine accessibility
20   PUBLIC dia_nam   ! routine called by step.F90
21   !!----------------------------------------------------------------------
22   !!   OPA 9.0 , LOCEAN-IPSL (2005)
23   !! $Id$
24   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
25   !!----------------------------------------------------------------------
26
27CONTAINS
28
29   SUBROUTINE dia_nam( cdfnam, kfreq, cdsuff )
30      !!---------------------------------------------------------------------
31      !!                  ***  ROUTINE dia_nam  ***
32      !!                   
33      !! ** Purpose :   Builds output file name
34      !!
35      !! ** Method  :   File name is a function of date and output frequency
36      !!      cdfnam=<cexper>_<clave>_<idtbeg>_<idtend>_grid_<cdsuff>
37      !!      <clave> = averaging frequency (DA, MO, etc...)
38      !!      <idtbeg>,<idtend> date of beginning and end of run
39      !!
40      !! History :
41      !!        !  99-02  (E. Guilyardi)  Creation for 30 days/month
42      !!   8.5  !  02-06  (G. Madec)  F90: Free form and module
43      !!----------------------------------------------------------------------
44      !! * Arguments
45      CHARACTER (len=*), INTENT( out ) ::   cdfnam   ! file name
46      CHARACTER (len=*), INTENT( in  ) ::   cdsuff   ! ???
47      INTEGER,           INTENT( in  ) ::   kfreq    ! ???
48
49      !! * Local declarations
50      CHARACTER (len=2) ::   clave
51      CHARACTER (len=3) ::   clave1
52      CHARACTER (len=5) ::   clout
53      INTEGER :: jt                       ! dummy loop indices
54      INTEGER :: ig, ijjmm, iout          ! temporary integers
55      INTEGER :: iyear1, imonth1, iday1   !    "          "
56      INTEGER :: iyear2, imonth2, iday2   !    "          "
57      REAL(wp) ::  z5j, znbsec, zdate1, zdate2, zdrun, zdt   ! temporary scalars
58      !!----------------------------------------------------------------------
59
60      IF(lwp) WRITE(numout,*)
61      IF(lwp) WRITE(numout,*) ' dia_nam: building output file name'
62      IF(lwp) WRITE(numout,*) ' ~~~~~~~'
63      IF(lwp) WRITE(numout,*)
64
65      ! 0. Initialisation
66      ! -----------------
67
68      cdfnam = ''
69
70      !    number of seconds of the run
71
72      z5j = 5*rjjss
73      zdt = rdt
74      IF( nacc == 1 ) zdt = rdtmin
75      zdrun = FLOAT( nitend - nit000 ) * zdt
76
77      !  date of beginning of run
78
79      iyear1  = ndastp/10000
80      imonth1 = ndastp/100 - iyear1*100
81      iday1   = ndastp - imonth1*100 - iyear1*10000
82      IF( nleapy == 1) THEN
83         ijjmm=0
84         IF( MOD( iyear1, 4 ) == 0 ) THEN
85            DO jt = 1, imonth1-1
86               ijjmm = ijjmm + nbiss(jt)
87            END DO
88         ELSE
89            DO jt = 1, imonth1-1
90               ijjmm = ijjmm + nobis(jt)
91            END DO
92         ENDIF
93         ijjmm = ijjmm + (iyear1-1)/4
94         zdate1 = ( (iyear1-1)*365 + ijjmm +iday1-1 ) * rjjss   
95      ELSE IF( nleapy == 0 ) THEN
96         ijjmm = 0
97         DO jt = 1, imonth1-1
98            ijjmm = ijjmm + nobis(jt)
99         END DO
100         zdate1 = ( (iyear1-1)*raajj + ijjmm + iday1-1)* rjjss
101      ELSE
102         zdate1 = ( (iyear1-1)*nleapy*raamo + (imonth1-1)*nleapy + iday1-1)* rjjss
103      ENDIF
104
105      !  date of end of run (= date of beginning of next run)
106
107      zdate2 = zdate1 + zdrun
108      IF( nleapy == 1 ) THEN
109         iyear2 = zdate2/(365.25*rjjss)+1
110         ijjmm = INT(zdate2/rjjss)-365*(iyear2-1)-(iyear2-1)/4
111         IF( ijjmm < 0 ) THEN
112            iyear2 = iyear2-1
113            ijjmm = zdate2/rjjss-365.*(iyear2-1)-(iyear2-1)/4
114         ENDIF
115         IF( MOD( iyear2, 4 ) == 0 ) THEN
116            DO jt = 1, 12
117               ijjmm = ijjmm - nbiss(jt)
118               IF( ijjmm <= 0 ) go to 10
119            END DO
120            jt = 12
12110          CONTINUE
122            imonth2 = jt
123            ijjmm = 0
124            DO jt = 1, jt-1
125               ijjmm = ijjmm + nbiss(jt)
126            END DO
127         ELSE
128            DO jt = 1, 12
129               ijjmm = ijjmm - nobis(jt)
130               IF( ijjmm <= 0 ) go to 15
131            END DO
132            jt = 12
13315          CONTINUE
134            imonth2 = jt
135            ijjmm = 0
136            DO jt = 1, jt-1
137               ijjmm = ijjmm + nobis(jt)
138            END DO
139         ENDIF
140         iday2 = zdate2/rjjss-365.*(iyear2-1)-ijjmm+1-(iyear2-1)/4     
141      ELSE IF( nleapy == 0 ) THEN
142         iyear2 = zdate2/raass+1
143         ijjmm  = zdate2/rjjss-raajj*(iyear2-1)
144         DO jt = 1, 12
145            ijjmm = ijjmm - nobis(jt)
146            IF(ijjmm <= 0) go to 20
147         END DO
148         jt = 12
14920       CONTINUE
150         imonth2 = jt
151         ijjmm = 0
152         DO jt = 1, jt-1
153            ijjmm = ijjmm + nobis(jt)
154         END DO
155         iday2 = zdate2/rjjss-raajj*(iyear2-1)-ijjmm+1         
156      ELSE
157         zdate2 = zdate2 / rjjss
158         imonth2 = zdate2/FLOAT(nleapy)
159         iday2 = zdate2 - imonth2*FLOAT(nleapy) + 1.
160         iyear2 = imonth2/12
161         imonth2 = imonth2 - iyear2*12
162         imonth2 = imonth2 + 1
163         iyear2 = iyear2 + 1
164         IF( iday2 == 0 ) THEN
165            iday2 = nleapy
166            imonth2 = imonth2 - 1
167            IF( imonth2 == 0 ) THEN
168               imonth2 = 12
169               iyear2 = iyear2 - 1
170            ENDIF
171         ENDIF
172      ENDIF
173
174
175      ! 1. Define time averaging period <nn><type>
176      !    ---------------------------------------
177
178      iout = 0
179#if defined key_diainstant
180      clave = 'IN'
181      IF( iyear2 <= 99 ) THEN
182         WRITE(cdfnam,9001) iyear1,imonth1,iday1,iyear2,imonth2,iday2
183      ELSE IF( iyear2 <= 999 ) THEN
184         WRITE(cdfnam,9002) iyear1,imonth1,iday1,iyear2,imonth2,iday2
185      ELSE IF( iyear2 <= 9999 ) THEN
186         WRITE(cdfnam,9003) iyear1,imonth1,iday1,iyear2,imonth2,iday2
187      ELSE
188         WRITE(cdfnam,9004) iyear1,imonth1,iday1,iyear2,imonth2,iday2
189      ENDIF
190#else
191
192      znbsec=kfreq*zdt
193      ! daily output
194      IF( znbsec == rjjss ) THEN
195         clave = '1d'
196         IF( iyear2 <= 99 ) THEN
197            WRITE(cdfnam,9001) iyear1,imonth1,iday1,iyear2,imonth2,iday2
198         ELSE IF( iyear2 <= 999 ) THEN
199            WRITE(cdfnam,9002) iyear1,imonth1,iday1,iyear2,imonth2,iday2
200         ELSE IF( iyear2 <= 9999 ) THEN
201            WRITE(cdfnam,9003) iyear1,imonth1,iday1,iyear2,imonth2,iday2
202         ELSE
203            WRITE(cdfnam,9004) iyear1,imonth1,iday1,iyear2,imonth2,iday2
204         ENDIF
205         ! 5 day output
206      ELSE IF( znbsec == z5j ) THEN
207         clave='5d'
208         IF( iyear2 <= 99 ) THEN
209            WRITE(cdfnam,9001) iyear1,imonth1,iday1,iyear2,imonth2,iday2
210         ELSE IF( iyear2 <= 999 ) THEN
211            WRITE(cdfnam,9002) iyear1,imonth1,iday1,iyear2,imonth2,iday2
212         ELSE IF( iyear2 <= 9999 ) THEN
213            WRITE(cdfnam,9003) iyear1,imonth1,iday1,iyear2,imonth2,iday2
214         ELSE
215            WRITE(cdfnam,9004) iyear1,imonth1,iday1,iyear2,imonth2,iday2
216         ENDIF
217         ! monthly ouput
218      ELSE IF( (znbsec == rmoss .AND. nleapy > 1) .OR.   &
219               (znbsec >= 28*rjjss .AND. znbsec <= 31*rjjss .AND. nleapy <= 1) ) THEN
220         clave = '1m'
221         IF( iyear2 <= 99 ) THEN
222            WRITE(cdfnam,9001) iyear1,imonth1,iday1,iyear2,imonth2,iday2
223         ELSE IF( iyear2 <= 999 ) THEN
224            WRITE(cdfnam,9002) iyear1,imonth1,iday1,iyear2,imonth2,iday2
225         ELSE IF( iyear2 <= 9999 ) THEN
226            WRITE(cdfnam,9003) iyear1,imonth1,iday1,iyear2,imonth2,iday2
227         ELSE
228            WRITE(cdfnam,9004) iyear1,imonth1,iday1,iyear2,imonth2,iday2
229         ENDIF
230         ! annual output
231      ELSE IF( (znbsec == raass .AND. nleapy > 1) .OR.   &
232               (znbsec >= 365*rjjss .AND. znbsec <= 366*rjjss .AND. nleapy <= 1) ) THEN
233         clave = '1y'
234         IF( iyear2 <= 99 ) THEN
235            WRITE(cdfnam,9001) iyear1,imonth1,iday1,iyear2,imonth2,iday2
236         ELSE IF( iyear2 <= 999 ) THEN
237            WRITE(cdfnam,9002) iyear1,imonth1,iday1,iyear2,imonth2,iday2
238         ELSE IF( iyear2 <= 9999 ) THEN
239            WRITE(cdfnam,9003) iyear1,imonth1,iday1,iyear2,imonth2,iday2
240         ELSE
241            WRITE(cdfnam,9004) iyear1,imonth1,iday1,iyear2,imonth2,iday2
242         ENDIF
243      ELSE IF( (znbsec == 5.*raass .AND. nleapy > 1) .OR.   &
244               (znbsec >= 5.*365*rjjss .AND. znbsec <= 5.*366*rjjss .AND. nleapy <= 1) ) THEN
245         clave = '5y'
246         IF( iyear2 <= 99 ) THEN
247            WRITE(cdfnam,9001) iyear1,imonth1,iday1,iyear2,imonth2,iday2
248         ELSE IF( iyear2 <= 999 ) THEN
249            WRITE(cdfnam,9002) iyear1,imonth1,iday1,iyear2,imonth2,iday2
250         ELSE IF( iyear2 <= 9999 ) THEN
251            WRITE(cdfnam,9003) iyear1,imonth1,iday1,iyear2,imonth2,iday2
252         ELSE
253            WRITE(cdfnam,9004) iyear1,imonth1,iday1,iyear2,imonth2,iday2
254         ENDIF
255      ELSE IF( (znbsec == 10.*raass .AND. nleapy > 1) .OR.   &
256               (znbsec >= 10.*365*rjjss .AND. znbsec <= 10.*366*rjjss .AND. nleapy <= 1) ) THEN
257         clave1 = '10y'
258         iout = 1
259         IF( iyear2 <= 99 ) THEN
260            WRITE(cdfnam,9001) iyear1,imonth1,iday1,iyear2,imonth2,iday2
261         ELSE IF( iyear2 <= 999 ) THEN
262            WRITE(cdfnam,9002) iyear1,imonth1,iday1,iyear2,imonth2,iday2
263         ELSE IF( iyear2 <= 9999 ) THEN
264            WRITE(cdfnam,9003) iyear1,imonth1,iday1,iyear2,imonth2,iday2
265         ELSE
266            WRITE(cdfnam,9004) iyear1,imonth1,iday1,iyear2,imonth2,iday2
267         ENDIF
268      ELSE
269
270         ! others
271         iout = kfreq
272         ig = 0
273         clout = ''
274         IF( iout <= 9 ) THEN
275            ig = 1
276            WRITE(clout,'(i1.1)') iout
277         ELSE IF( iout <= 99 ) THEN
278            ig = 2
279            WRITE(clout,'(i2.2)') iout
280         ELSE IF( iout <= 999 ) THEN
281            ig = 3
282            WRITE(clout,'(i3.3)') iout
283         ELSE IF( iout <= 9999 ) THEN
284            ig = 4
285            WRITE(clout,'(i4.4)') iout
286         ELSE
287            ig = 5
288            WRITE(clout,'(i5.5)') iout
289         ENDIF
290         clave = 'CU'
291         IF( iyear2 <= 99 ) THEN
292            WRITE(cdfnam,9001) iyear1,imonth1,iday1,iyear2,imonth2,iday2
293         ELSE IF( iyear2 <= 999 ) THEN
294            WRITE(cdfnam,9002) iyear1,imonth1,iday1,iyear2,imonth2,iday2
295         ELSE IF( iyear2 <= 9999 ) THEN
296            WRITE(cdfnam,9003) iyear1,imonth1,iday1,iyear2,imonth2,iday2
297         ELSE
298            WRITE(cdfnam,9004) iyear1,imonth1,iday1,iyear2,imonth2,iday2
299         ENDIF
300      ENDIF
301#endif
302      IF( iout == 0 ) THEN
303         cdfnam = TRIM(cexper)//"_"//clave//TRIM(cdfnam)//TRIM(cdsuff)
304      ELSE IF( iout == 1 .AND. kfreq > 1 ) THEN
305         cdfnam = TRIM(cexper)//"_"//clave1//TRIM(cdfnam)//TRIM(cdsuff)
306      ELSE
307         cdfnam = TRIM(cexper)//"_"//clave//TRIM(clout)//TRIM(cdfnam)//TRIM(cdsuff)
308      ENDIF
309
310      IF(lwp) WRITE(numout,*) cdfnam     
311      IF(lwp) WRITE(numout,*)         
312
313      ! FORMATS
314
315 9001 FORMAT("_",I4.4,2I2.2,"_",I4.4,2I2.2,"_")
316 9002 FORMAT("_",I4.4,2I2.2,"_",I4.4,2I2.2,"_")
317 9003 FORMAT("_",I4.4,2I2.2,"_",I4.4,2I2.2,"_")
318 9004 FORMAT("_",I6.6,2I2.2,"_",I6.6,2I2.2,"_")
319 9011 FORMAT("_",I4.4,I2.2,"_",I4.4,I2.2,"_")
320 9012 FORMAT("_",I4.4,I2.2,"_",I4.4,I2.2,"_")
321 9013 FORMAT("_",I4.4,I2.2,"_",I4.4,I2.2,"_")
322 9014 FORMAT("_",I6.6,I2.2,"_",I6.6,I2.2,"_")
323 9021 FORMAT("_",I4.4,"_",I4.4,"_")
324 9022 FORMAT("_",I4.4,"_",I4.4,"_")
325 9023 FORMAT("_",I4.4,"_",I4.4,"_")
326 9024 FORMAT("_",I6.6,"_",I6.6,"_")
327
328   END SUBROUTINE dia_nam
329
330   !!======================================================================
331END MODULE dianam
Note: See TracBrowser for help on using the repository browser.