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/NEMOGCM/NEMO/LIM_SRC_2 – NEMO

source: trunk/NEMOGCM/NEMO/LIM_SRC_2/limdia_2.F90 @ 6140

Last change on this file since 6140 was 4624, checked in by acc, 10 years ago

#1305. Fix slow start-up problems on some systems by introducing and using lwm logical to restrict output of merged namelists to the first (or only) processor. lwm is true only on the first processor regardless of ln_ctl. Small changes to all flavours of nemogcm.F90 are also required to write namctl and namcfg after the call to mynode which now opens output.namelist.dyn and writes nammpp.

  • Property svn:keywords set to Id
File size: 13.4 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   !!----------------------------------------------------------------------
[821]14   !!   lim_dia_2      : computation of the time evolution of keys var.
15   !!   lim_dia_init_2 : initialization and namelist read
[3]16   !!----------------------------------------------------------------------
[1715]17   USE dom_oce         ! ocean space and time domain
[77]18   USE phycst          !
[821]19   USE par_ice_2       ! ice parameters
[888]20   USE sbc_oce         ! surface boundary condition variables
[821]21   USE dom_ice_2       !
22   USE ice_2           !
23   USE limistate_2     !
[77]24   USE in_out_manager  ! I/O manager
[2715]25   USE lib_mpp         ! MPP library
[3625]26   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
[3]27
28   IMPLICIT NONE
29   PRIVATE
30
[4325]31   PUBLIC               lim_dia_2          ! called by sbc_ice_lim_2
32   PUBLIC               lim_dia_init_2     ! called by sbc_ice_lim_2
[2715]33
[4147]34   INTEGER, PUBLIC ::   ntmoy  ,   &  !: instantaneous values of ice evolution or averaging ntmoy
35      &                 ninfo         !: frequency of ouputs on file ice_evolu in case of averaging
[3]36
[77]37   INTEGER, PARAMETER ::   &  ! Parameters for outputs to files "evolu"
38      jpinfmx = 100         ,    &  ! maximum number of key variables
39      jpchinf = 5           ,    &  ! ???
40      jpchsep = jpchinf + 2         ! ???
41
42   INTEGER ::   &
[4147]43      nfrinf ,          &  ! number of variables written in one line
[3]44      nferme ,          &  ! last time step at which the var. are written on file
45      nvinfo ,          &  ! number of total variables
46      nbvt   ,          &  ! number of time variables
47      naveg                ! number of step for accumulation before averaging
48
[4147]49   CHARACTER(len= 8) ::   fmtinf   ! format of the output values 
[508]50   CHARACTER(len=30) ::   fmtw  ,           &  ! formats
51      &                   fmtr  ,           &  ! ???
52      &                   fmtitr               ! ???
53   CHARACTER(len=jpchsep), DIMENSION(jpinfmx) ::   titvar               ! title of key variables
[77]54 
[508]55   REAL(wp)                     ::   epsi06 = 1.e-06      ! ???
56   REAL(wp), DIMENSION(jpinfmx) ::   vinfom               ! temporary working space
[2715]57   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   aire                 ! masked grid cell area
[3]58
59   !! * Substitutions
60#  include "vectopt_loop_substitute.h90"
61   !!----------------------------------------------------------------------
[2528]62   !! NEMO/LIM2 3.3 , UCL - NEMO Consortium (2010)
[1156]63   !! $Id$
[2528]64   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
[3]65   !!----------------------------------------------------------------------
66CONTAINS
67
[821]68   SUBROUTINE lim_dia_2( kt )
[3]69      !!--------------------------------------------------------------------
[821]70      !!                  ***  ROUTINE lim_dia_2  ***
[3]71      !!   
72      !! ** Purpose : Computation and outputs on file ice.evolu
73      !!      the temporal evolution of some key variables
[508]74      !!-------------------------------------------------------------------
75      INTEGER, INTENT(in) ::   kt     ! number of iteration
[3]76      !!
[508]77      INTEGER  ::   jv,ji, jj   ! dummy loop indices
78      INTEGER  ::   nv          ! indice of variable
79      REAL(wp) ::   zarea    , zldarea  ,    &  ! sea-ice and leads area
80         &          zextent15, zextent85,    &  ! sea-ice extent (15% and 85%)
81         &          zicevol  , zsnwvol  ,    &  ! sea-ice and snow volume volume
82         &          zicespd                     ! sea-ice velocity
83      REAL(wp), DIMENSION(jpinfmx) ::   vinfor  ! temporary working space
[3]84      !!-------------------------------------------------------------------
85
[508]86      ! computation of key variables at each time step   
[3]87
[508]88      nv = 1 
[888]89      vinfor(nv) = REAL( kt + nn_fsbc - 1 )
[508]90      nv = nv + 1
91      vinfor(nv) = nyear
[3]92 
[508]93      DO jv = nbvt + 1, nvinfo
94         vinfor(jv) = 0.e0
95      END DO
[3]96
[508]97      zextent15 = 0.e0
98      zextent85 = 0.e0
99      ! variables in northern Hemis
100      DO jj = njeq, jpjm1
101         DO ji = fs_2, fs_jpim1   ! vector opt.
102            IF( tms(ji,jj) == 1 ) THEN
103               zarea = ( 1.0 - frld(ji,jj) ) * aire(ji,jj)
104               IF (frld(ji,jj) <= 0.15 ) zextent15 = aire(ji,jj)   
105               IF (frld(ji,jj) <= 0.85 ) zextent85 = aire(ji,jj)   
106               zldarea = zarea   / MAX( ( 1 - frld(ji,jj) ) , epsi06 )
107               zicevol = zarea   * hicif(ji,jj)
108               zsnwvol = zarea   * hsnif(ji,jj)
[1470]109               zicespd = zicevol * ( u_ice(ji,jj) * u_ice(ji,jj) + v_ice(ji,jj) * v_ice(ji,jj) )
[508]110               vinfor(nv+ 1) = vinfor(nv+ 1) + zarea
111               vinfor(nv+ 3) = vinfor(nv+ 3) + zextent15
112               vinfor(nv+ 5) = vinfor(nv+ 5) + zextent85
113               vinfor(nv+ 7) = vinfor(nv+ 7) + zldarea
114               vinfor(nv+ 9) = vinfor(nv+ 9) + zicevol
115               vinfor(nv+11) = vinfor(nv+11) + zsnwvol
116               vinfor(nv+13) = vinfor(nv+13) + zicespd
117            ENDIF
118         END DO
119      END DO
120      vinfor(nv+13) = SQRT( vinfor(nv+13) / MAX( vinfor(nv+9) , epsi06 ) )
[3]121
122
123      ! variables in southern Hemis
124       nv = nv + 1
[77]125       DO jj = 2, njeqm1
[12]126          DO ji = fs_2, fs_jpim1   ! vector opt.
[3]127             IF( tms(ji,jj) == 1 ) THEN
[12]128                zarea = ( 1.0 - frld(ji,jj) ) * aire(ji,jj)
129                IF (frld(ji,jj) <= 0.15 ) zextent15 = aire(ji,jj)   
130                IF (frld(ji,jj) <= 0.85 ) zextent85 = aire(ji,jj)   
131                zldarea = zarea   / MAX( ( 1 - frld(ji,jj) ) , epsi06 )
132                zicevol = zarea   * hicif(ji,jj)
133                zsnwvol = zarea   * hsnif(ji,jj)
[1470]134                zicespd = zicevol * ( u_ice(ji,jj) * u_ice(ji,jj) + v_ice(ji,jj) * v_ice(ji,jj) )
[12]135                vinfor(nv+ 1) = vinfor(nv+ 1) + zarea
136                vinfor(nv+ 3) = vinfor(nv+ 3) + zextent15
137                vinfor(nv+ 5) = vinfor(nv+ 5) + zextent85
138                vinfor(nv+ 7) = vinfor(nv+ 7) + zldarea
139                vinfor(nv+ 9) = vinfor(nv+ 9) + zicevol
140                vinfor(nv+11) = vinfor(nv+11) + zsnwvol
141                vinfor(nv+13) = vinfor(nv+13) + zicespd
[3]142             ENDIF
143          END DO
144       END DO
[12]145       vinfor(nv+13) = SQRT( vinfor(nv+13) / MAX( vinfor(nv+9) , epsi06 ) )   
[3]146
147       !  Accumulation before averaging
[12]148       DO jv = 1, nvinfo
[3]149          vinfom(jv) = vinfom(jv) + vinfor(jv)
150       END DO
151       naveg = naveg + 1 
152   
153       ! oututs on file ice_evolu   
[888]154       IF( MOD( kt + nn_fsbc - 1, ninfo ) == 0 ) THEN
[98]155          WRITE(numevo_ice,fmtw) ( titvar(jv), vinfom(jv)/naveg, jv = 1, nvinfo )
[3]156          naveg = 0
[12]157          DO jv = 1, nvinfo
[77]158             vinfom(jv) = 0.e0
[3]159          END DO
160       ENDIF
[508]161       !
[821]162    END SUBROUTINE lim_dia_2
[3]163 
164
[821]165    SUBROUTINE lim_dia_init_2
[3]166       !!-------------------------------------------------------------------
[821]167       !!                  ***  ROUTINE lim_dia_init_2  ***
[3]168       !!             
169       !! ** Purpose : Preparation of the file ice_evolu for the output of
170       !!      the temporal evolution of key variables
171       !!
172       !! ** input   : Namelist namicedia
173       !!-------------------------------------------------------------------
[508]174       CHARACTER(len=jpchinf) ::   titinf
[2715]175       INTEGER  ::   jv   ! dummy loop indice
176       INTEGER  ::   ntot , ndeb, nv, ierr   ! local integer
[4147]177       INTEGER  ::   ios                     ! Local integer output status for namelist read
[2715]178       REAL(wp) ::   zxx0, zxx1              ! local scalars
[3]179
[508]180       NAMELIST/namicedia/fmtinf, nfrinf, ninfo, ntmoy
[3]181       !!-------------------------------------------------------------------
[4147]182                   
183       REWIND( numnam_ice_ref )              ! Namelist namicedia in reference namelist : Ice diagnostics in ice_evolu
184       READ  ( numnam_ice_ref, namicedia, IOSTAT = ios, ERR = 901)
185901    IF( ios /= 0 ) CALL ctl_nam ( ios , 'namicedia in reference namelist', lwp )
[3]186
[4147]187       REWIND( numnam_ice_cfg )              ! Namelist namicedia in configuration namelist : Ice diagnostics in ice_evolu
188       READ  ( numnam_ice_cfg, namicedia, IOSTAT = ios, ERR = 902 )
189902    IF( ios /= 0 ) CALL ctl_nam ( ios , 'namicedia in configuration namelist', lwp )
[4624]190       IF(lwm) WRITE ( numoni, namicedia )
[508]191       
[2715]192       IF(lwp) THEN                             ! control print
[3]193          WRITE(numout,*)
[821]194          WRITE(numout,*) 'lim_dia_init_2 : ice parameters for ice diagnostics '
195          WRITE(numout,*) '~~~~~~~~~~~~~~'
[3]196          WRITE(numout,*) '   format of the output values                                 fmtinf = ', fmtinf
197          WRITE(numout,*) '   number of variables written in one line                     nfrinf = ', nfrinf 
198          WRITE(numout,*) '   Instantaneous values of ice evolution or averaging          ntmoy  = ', ntmoy
199          WRITE(numout,*) '   frequency of ouputs on file ice_evolu in case of averaging  ninfo  = ', ninfo
200       ENDIF
201
[2715]202       ALLOCATE( aire(jpi,jpj) , STAT=ierr )    ! masked grid cell area
203       IF( lk_mpp    )   CALL mpp_sum( ierr )
204       IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'lim_dia_init_2 : unable to allocate standard arrays' )
[77]205       aire(:,:) = area(:,:) * tms(:,:)
206
[2715]207       nv = 1                                   ! Titles of ice key variables
[3]208       titvar(nv) = 'NoIt'  ! iteration number
209       nv = nv + 1
210       titvar(nv) = 'T yr'  ! time step in years
211       nbvt = nv - 1
[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
[4338]244       CALL ctl_opn( numevo_ice, 'ice_evolu', 'UNKNOWN', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp )
[3]245
246       !- ecriture de 2 lignes d''entete :
247       WRITE(numevo_ice,1000) fmtr, fmtw, fmtitr, nvinfo, ntot, 0, nfrinf
[77]248       zxx0 = 0.001 * REAL( ninfo )
249       zxx1 = 0.001 * REAL( ndeb  )
250       WRITE(numevo_ice,1111) REAL(jpchinf), 0., zxx1, zxx0, 0., 0., 0
[3]251
252       !- ecriture de 2 lignes de titre :
[508]253       WRITE(numevo_ice,'(A,I8,A,I8,A,I5)')                 &
[3]254          'Evolution chronologique - Experience '//cexper   &
255          //'   de', ndeb, ' a', nferme, ' pas', ninfo
256       WRITE(numevo_ice,fmtitr) ( titvar(jv), jv = 1, nvinfo )
257
258
259       !--preparation de "titvar" pour l''ecriture parmi les valeurs numeriques :
260       DO  jv = 2 , nvinfo
[77]261          titinf     = titvar(jv)(:jpchinf)
[3]262          titvar(jv) = '  '//titinf
263       END DO
264
265       !--Initialisation of the arrays for the accumulation
266       DO  jv = 1, nvinfo
267          vinfom(jv) = 0.
268       END DO
269       naveg = 0
270
2711000   FORMAT( 3(A20),4(1x,I6) )
2721111   FORMAT( 3(F7.1,1X,F7.3,1X),I3,A ) 
[508]273      !
[821]274    END SUBROUTINE lim_dia_init_2
[3]275
276#else
277   !!----------------------------------------------------------------------
[821]278   !!   Default option :                           NO LIM 2.0 sea-ice model
[3]279   !!----------------------------------------------------------------------
280CONTAINS
[821]281   SUBROUTINE lim_dia_2         ! Empty routine
282   END SUBROUTINE lim_dia_2
[3]283#endif
284
285   !!======================================================================
[821]286END MODULE limdia_2
Note: See TracBrowser for help on using the repository browser.