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_2.F90 in trunk/NEMO/LIM_SRC_2 – NEMO

source: trunk/NEMO/LIM_SRC_2/limdia_2.F90 @ 1463

Last change on this file since 1463 was 1156, checked in by rblod, 16 years ago

Update Id and licence information, see ticket #210

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