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.
limdia.F90 in trunk/NEMO/LIM_SRC – NEMO

source: trunk/NEMO/LIM_SRC/limdia.F90 @ 98

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

CT : BUGFIX064 : correction of the unit file number for the ice.evolu output ice file

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.5 KB
Line 
1MODULE limdia
2   !!======================================================================
3   !!                       ***  MODULE limdia   ***
4   !!                      diagnostics of ice model
5   !!======================================================================
6#if defined key_ice_lim
7   !!----------------------------------------------------------------------
8   !!   'key_ice_lim' :                                   LIM sea-ice model
9   !!----------------------------------------------------------------------
10   !!   lim_dia      : computation of the time evolution of keys var.
11   !!   lim_dia_init : initialization and namelist read
12   !!----------------------------------------------------------------------
13   !! * Modules used
14   USE phycst          !
15   USE par_ice         ! ice parameters
16   USE ice_oce         ! ice variables
17   USE daymod          !
18   USE dom_ice         !
19   USE ice             !
20   USE iceini          !
21   USE limistate       !
22   USE in_out_manager  ! I/O manager
23
24   IMPLICIT NONE
25   PRIVATE
26
27   !! * Routine accessibility
28   PUBLIC lim_dia       ! called by ice_step
29
30   !! * Shared module variables
31   INTEGER, PUBLIC  ::  &  !:
32      ntmoy   = 1 ,     &  !: instantaneous values of ice evolution or averaging ntmoy
33      ninfo   = 1          !: frequency of ouputs on file ice_evolu in case of averaging
34
35   !! * Module variables
36   INTEGER, PARAMETER ::   &  ! Parameters for outputs to files "evolu"
37      jpinfmx = 100         ,    &  ! maximum number of key variables
38      jpchinf = 5           ,    &  ! ???
39      jpchsep = jpchinf + 2         ! ???
40
41   INTEGER ::   &
42      nfrinf  = 4 ,     &  ! number of variables written in one line
43      nferme ,          &  ! last time step at which the var. are written on file
44      nvinfo ,          &  ! number of total variables
45      nbvt   ,          &  ! number of time variables
46      naveg                ! number of step for accumulation before averaging
47
48   CHARACTER(len=8) ::   &
49      fmtinf  = '1PE13.5 ' ! format of the output values 
50   CHARACTER(len=30) ::   &
51      fmtw  ,           &  ! formats
52      fmtr  ,           &  ! ???
53      fmtitr               ! ???
54   CHARACTER(len=jpchsep), DIMENSION(jpinfmx) ::   &
55      titvar               ! title of key variables
56 
57   REAL(wp) ::   &
58      epsi06 = 1.e-06      ! ???
59   REAL(wp), DIMENSION(jpinfmx) ::  &
60      vinfom               ! temporary working space
61   REAL(wp), DIMENSION(jpi,jpj) ::   &
62      aire                 ! masked grid cell area
63
64   !! * Substitutions
65#  include "vectopt_loop_substitute.h90"
66   !!----------------------------------------------------------------------
67   !!   LIM 2.0 , UCL-LODYC-IPSL  (2003)
68   !!----------------------------------------------------------------------
69
70CONTAINS
71
72   SUBROUTINE lim_dia
73      !!--------------------------------------------------------------------
74      !!                  ***  ROUTINE lim_dia  ***
75      !!   
76      !! ** Purpose : Computation and outputs on file ice.evolu
77      !!      the temporal evolution of some key variables
78      !!
79      !! History :
80      !!   8.0  !  97-06  (Louvain-La-Neuve)  Original code
81      !!   8.5  !  02-09  (C. Ethe , G. Madec )  F90: Free form and module
82      !!-------------------------------------------------------------------
83      !! * Local variables
84       INTEGER  ::   jv,ji, jj   ! dummy loop indices
85       INTEGER  ::   nv          ! indice of variable
86       REAL(wp), DIMENSION(jpinfmx) ::  & 
87          vinfor           ! temporary working space
88       REAL(wp) ::    &
89          zarea    ,    &  ! sea ice area
90          zldarea  ,    &  ! leads area
91          zextent15,    &  ! sea ice extent (15%)
92          zextent85,    &  ! sea ice extent (85%)
93          zicevol  ,    &  ! sea ice volume
94          zsnwvol  ,    &  ! snow volume over sea ice
95          zicespd          ! sea ice velocity
96       !!-------------------------------------------------------------------
97
98       IF( numit == nstart )   CALL lim_dia_init   ! initialisation of ice_evolu file     
99
100       ! computation of key variables at each time step   
101
102       nv = 1 
103       vinfor(nv) = REAL( numit )
104       nv = nv + 1
105       vinfor(nv) = nyear
106 
107       DO jv = nbvt + 1, nvinfo
108          vinfor(jv) = 0.e0
109       END DO
110
111       zextent15 = 0.e0
112       zextent85 = 0.e0
113       ! variables in northern Hemis
114       DO jj = njeq, jpjm1
115          DO ji = fs_2, fs_jpim1   ! vector opt.
116             IF( tms(ji,jj) == 1 ) THEN
117                zarea = ( 1.0 - frld(ji,jj) ) * aire(ji,jj)
118                IF (frld(ji,jj) <= 0.15 ) zextent15 = aire(ji,jj)   
119                IF (frld(ji,jj) <= 0.85 ) zextent85 = aire(ji,jj)   
120                zldarea = zarea   / MAX( ( 1 - frld(ji,jj) ) , epsi06 )
121                zicevol = zarea   * hicif(ji,jj)
122                zsnwvol = zarea   * hsnif(ji,jj)
123                zicespd = zicevol * ( u_ice(ji,jj) * u_ice(ji,jj)   &
124                   &                + v_ice(ji,jj) * v_ice(ji,jj) )
125                vinfor(nv+ 1) = vinfor(nv+ 1) + zarea
126                vinfor(nv+ 3) = vinfor(nv+ 3) + zextent15
127                vinfor(nv+ 5) = vinfor(nv+ 5) + zextent85
128                vinfor(nv+ 7) = vinfor(nv+ 7) + zldarea
129                vinfor(nv+ 9) = vinfor(nv+ 9) + zicevol
130                vinfor(nv+11) = vinfor(nv+11) + zsnwvol
131                vinfor(nv+13) = vinfor(nv+13) + zicespd
132             ENDIF
133          END DO
134       END DO
135       vinfor(nv+13) = SQRT( vinfor(nv+13) / MAX( vinfor(nv+9) , epsi06 ) )
136
137
138      ! variables in southern Hemis
139       nv = nv + 1
140       DO jj = 2, njeqm1
141          DO ji = fs_2, fs_jpim1   ! vector opt.
142             IF( tms(ji,jj) == 1 ) THEN
143                zarea = ( 1.0 - frld(ji,jj) ) * aire(ji,jj)
144                IF (frld(ji,jj) <= 0.15 ) zextent15 = aire(ji,jj)   
145                IF (frld(ji,jj) <= 0.85 ) zextent85 = aire(ji,jj)   
146                zldarea = zarea   / MAX( ( 1 - frld(ji,jj) ) , epsi06 )
147                zicevol = zarea   * hicif(ji,jj)
148                zsnwvol = zarea   * hsnif(ji,jj)
149                zicespd = zicevol * ( u_ice(ji,jj) * u_ice(ji,jj)   &
150                   &                + v_ice(ji,jj) * v_ice(ji,jj) )
151                vinfor(nv+ 1) = vinfor(nv+ 1) + zarea
152                vinfor(nv+ 3) = vinfor(nv+ 3) + zextent15
153                vinfor(nv+ 5) = vinfor(nv+ 5) + zextent85
154                vinfor(nv+ 7) = vinfor(nv+ 7) + zldarea
155                vinfor(nv+ 9) = vinfor(nv+ 9) + zicevol
156                vinfor(nv+11) = vinfor(nv+11) + zsnwvol
157                vinfor(nv+13) = vinfor(nv+13) + zicespd
158             ENDIF
159          END DO
160       END DO
161       vinfor(nv+13) = SQRT( vinfor(nv+13) / MAX( vinfor(nv+9) , epsi06 ) )   
162
163       !  Accumulation before averaging
164       DO jv = 1, nvinfo
165          vinfom(jv) = vinfom(jv) + vinfor(jv)
166       END DO
167       naveg = naveg + 1 
168   
169       ! oututs on file ice_evolu   
170       IF( MOD( numit , ninfo ) == 0 ) THEN
171          WRITE(numevo_ice,fmtw) ( titvar(jv), vinfom(jv)/naveg, jv = 1, nvinfo )
172          naveg = 0
173          DO jv = 1, nvinfo
174             vinfom(jv) = 0.e0
175          END DO
176       ENDIF
177 
178    END SUBROUTINE lim_dia
179 
180
181    SUBROUTINE lim_dia_init
182       !!-------------------------------------------------------------------
183       !!                  ***  ROUTINE lim_dia_init  ***
184       !!             
185       !! ** Purpose : Preparation of the file ice_evolu for the output of
186       !!      the temporal evolution of key variables
187       !!
188       !! ** input   : Namelist namicedia
189       !!
190       !! history :
191       !!  8.5  ! 03-08 (C. Ethe) original code
192       !!-------------------------------------------------------------------
193       NAMELIST/namicedia/fmtinf, nfrinf, ninfo, ntmoy
194
195       INTEGER  ::   jv   ,     &  ! dummy loop indice
196          &          ntot ,     &
197          &          ndeb ,     &
198          &          irecl
199
200       INTEGER  ::   nv            ! indice of variable
201
202       REAL(wp) ::   zxx0, zxx1    ! temporary scalars
203
204       CHARACTER(len=jpchinf) ::   titinf
205       !!-------------------------------------------------------------------
206
207       ! Read Namelist namicedia
208       REWIND ( numnam_ice )
209       READ   ( numnam_ice  , namicedia )
210       IF(lwp) THEN
211          WRITE(numout,*)
212          WRITE(numout,*) 'lim_dia_init : ice parameters for ice diagnostics '
213          WRITE(numout,*) '~~~~~~~~~~~~'
214          WRITE(numout,*) '   format of the output values                                 fmtinf = ', fmtinf
215          WRITE(numout,*) '   number of variables written in one line                     nfrinf = ', nfrinf 
216          WRITE(numout,*) '   Instantaneous values of ice evolution or averaging          ntmoy  = ', ntmoy
217          WRITE(numout,*) '   frequency of ouputs on file ice_evolu in case of averaging  ninfo  = ', ninfo
218       ENDIF
219
220       ! masked grid cell area
221       aire(:,:) = area(:,:) * tms(:,:)
222
223       ! Titles of ice key variables :
224       nv = 1
225       titvar(nv) = 'NoIt'  ! iteration number
226       nv = nv + 1
227       titvar(nv) = 'T yr'  ! time step in years
228       nv = nv + 1
229
230       nbvt = nv - 1
231
232       titvar(nv) = 'AEFN' ! sea ice area in the northern Hemisp.(10^12 km2)
233       nv = nv + 1
234       titvar(nv) = 'AEFS' ! sea ice area in the southern Hemisp.(10^12 km2)
235       nv = nv + 1
236       titvar(nv) = 'A15N'  ! sea ice extent (15%) in the northern Hemisp.(10^12 km2)
237       nv = nv + 1
238       titvar(nv) = 'A15S'  ! sea ice extent (15%) in the southern Hemisp.(10^12 km2)
239       nv = nv + 1
240       titvar(nv) = 'A85N'  ! sea ice extent (85%) in the northern Hemisp.(10^12 km2)
241       nv = nv + 1
242       titvar(nv) = 'A85S'  ! sea ice extent (85%) in the southern Hemisp.(10^12 km2)
243       nv = nv + 1
244       titvar(nv) = 'ALEN'  ! leads area in the northern Hemisp.(10^12 km2)
245       nv = nv + 1
246       titvar(nv) = 'ALES'  ! leads area in the southern Hemisp.(10^12 km2)
247       nv = nv + 1
248       titvar(nv) = 'VOLN'  ! sea ice volume in the northern Hemisp.(10^3 km3)
249       nv = nv + 1
250       titvar(nv) = 'VOLS'  ! sea ice volume in the southern Hemisp.(10^3 km3)
251       nv = nv + 1
252       titvar(nv) = 'VONN'  ! snow volume over sea ice in the northern Hemisp.(10^3 km3)
253       nv = nv + 1
254       titvar(nv) = 'VONS'  ! snow volume over sea ice in the southern Hemisp.(10^3 km3)
255       nv = nv + 1
256       titvar(nv) = 'ECGN'  ! mean sea ice velocity in the northern Hemisp.(m/s)
257       nv = nv + 1
258       titvar(nv) = 'ECGS'  ! mean sea ice velocity in the southern Hemisp.(m/s)
259
260       nvinfo = nv
261
262       ! Definition et Ecriture de l'entete : nombre d'enregistrements
263       ndeb   = ( nstart - 1 ) / ninfo
264       IF( nstart == 1 ) ndeb = -1
265
266       nferme = ( nstart - 1 + nitrun) / ninfo
267       ntot   = nferme - ndeb
268       ndeb   = ninfo * ( 1 + ndeb )
269       nferme = ninfo * nferme
270
271       ! definition of formats
272       WRITE( fmtw  , '(A,I3,A2,I1,A)' )  '(', nfrinf, '(A', jpchsep, ','//fmtinf//'))'
273       WRITE( fmtr  , '(A,I3,A,I1,A)'  )  '(', nfrinf, '(', jpchsep, 'X,'//fmtinf//'))'
274       WRITE( fmtitr, '(A,I3,A,I1,A)'  )  '(', nvinfo, 'A', jpchinf, ')'
275
276       ! opening  "ice_evolu" file
277       irecl = ( jpchinf + 1 ) * nvinfo 
278       OPEN( numevo_ice, file='ice.evolu', status='unknown', RECL = irecl)
279       OPEN( numevo_ice, file='ice.evolu', status='unknown')
280
281       !- ecriture de 2 lignes d''entete :
282       WRITE(numevo_ice,1000) fmtr, fmtw, fmtitr, nvinfo, ntot, 0, nfrinf
283       zxx0 = 0.001 * REAL( ninfo )
284       zxx1 = 0.001 * REAL( ndeb  )
285       WRITE(numevo_ice,1111) REAL(jpchinf), 0., zxx1, zxx0, 0., 0., 0
286
287       !- ecriture de 2 lignes de titre :
288       WRITE(numevo_ice,'(A,I8,A,I8,A,I5)')                                      &
289          'Evolution chronologique - Experience '//cexper   &
290          //'   de', ndeb, ' a', nferme, ' pas', ninfo
291       WRITE(numevo_ice,fmtitr) ( titvar(jv), jv = 1, nvinfo )
292
293
294       !--preparation de "titvar" pour l''ecriture parmi les valeurs numeriques :
295       DO  jv = 2 , nvinfo
296          titinf     = titvar(jv)(:jpchinf)
297          titvar(jv) = '  '//titinf
298       END DO
299
300       !--Initialisation of the arrays for the accumulation
301       DO  jv = 1, nvinfo
302          vinfom(jv) = 0.
303       END DO
304       naveg = 0
305
3061000   FORMAT( 3(A20),4(1x,I6) )
3071111   FORMAT( 3(F7.1,1X,F7.3,1X),I3,A ) 
308
309    END SUBROUTINE lim_dia_init
310
311#else
312   !!----------------------------------------------------------------------
313   !!   Default option :                               NO LIM sea-ice model
314   !!----------------------------------------------------------------------
315CONTAINS
316   SUBROUTINE lim_dia         ! Empty routine
317   END SUBROUTINE lim_dia
318#endif
319
320   !!======================================================================
321END MODULE limdia
Note: See TracBrowser for help on using the repository browser.