source: branches/NERC/dev_r5518_GO6_CO2_cmip/NEMOGCM/NEMO/LIM_SRC_2/limdmp_2.F90 @ 9309

Last change on this file since 9309 was 6486, checked in by davestorkey, 5 years ago

Remove SVN keywords from UKMO/dev_r5518_GO6_package branch.

File size: 9.0 KB
Line 
1MODULE limdmp_2
2   !!======================================================================
3   !!                       ***  MODULE limdmp_2   ***
4   !!  LIM-2 ice model : restoring Ice thickness and Fraction leads
5   !!======================================================================
6   !! History :   2.0  !  2004-04 (S. Theetten) Original code
7   !!             3.3  !  2010-06 (J.-M. Molines) use of fldread
8   !!----------------------------------------------------------------------
9#if defined key_lim2
10   !!----------------------------------------------------------------------
11   !!   'key_lim2'                                    LIM 2.0 sea-ice model
12   !!----------------------------------------------------------------------
13   !!   lim_dmp_2     : ice model damping
14   !!----------------------------------------------------------------------
15   USE ice_2          ! ice variables
16   USE sbc_oce, ONLY : nn_fsbc ! for fldread
17   USE dom_oce        ! for mi0; mi1 etc ...
18   USE fldread        ! read input fields
19   USE in_out_manager ! I/O manager
20   USE lib_mpp        ! MPP library
21   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
22
23   IMPLICIT NONE
24   PRIVATE
25
26   PUBLIC   lim_dmp_2     ! called by sbc_ice_lim2
27
28   INTEGER  , PARAMETER :: jp_hicif = 1 , jp_frld = 2
29   REAL(wp) , ALLOCATABLE, DIMENSION(:,:,:) ::   resto_ice   ! restoring coeff. on ICE   [s-1]
30   TYPE(FLD), ALLOCATABLE, DIMENSION(:)     ::   sf_icedmp   ! structure of ice damping input
31   
32   !! * Substitution
33#  include "vectopt_loop_substitute.h90"
34   !!----------------------------------------------------------------------
35   !! NEMO/LIM 3.3 , UCL-NEMO-consortium (2010)
36   !! $Id$
37   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
38   !!----------------------------------------------------------------------
39CONTAINS
40
41   SUBROUTINE lim_dmp_2( kt )
42      !!-------------------------------------------------------------------
43      !!                   ***  ROUTINE lim_dmp_2  ***
44      !!
45      !! ** purpose :   restore ice thickness and lead fraction
46      !!
47      !! ** method  :   restore ice thickness and lead fraction using a restoring
48      !!              coefficient defined by the user in lim_dmp_init
49      !!
50      !! ** Action  : - update hicif and frld 
51      !!
52      !!---------------------------------------------------------------------
53      INTEGER, INTENT(in) ::   kt   ! ocean time-step
54      !
55      INTEGER  ::   ji, jj         ! dummy loop indices
56      REAL(wp) ::   zfrld, zhice   ! local scalars
57      !!---------------------------------------------------------------------
58      !
59      IF( kt == nit000 ) THEN
60         IF(lwp) WRITE(numout,*)
61         IF(lwp) WRITE(numout,*) 'lim_dmp_2 : Ice thickness and ice concentration restoring'
62         IF(lwp) WRITE(numout,*) '~~~~~~~~~~'
63         !
64         ! ice_resto_init create resto_ice (in 1/s) for restoring ice parameters near open boundaries.
65         ! Double check this routine to verify if it corresponds to your config
66         CALL lim_dmp_init
67      ENDIF
68      !
69      IF( ln_limdmp ) THEN   ! ice restoring in this case
70         !
71         CALL fld_read( kt, nn_fsbc, sf_icedmp )
72         !
73!CDIR COLLAPSE
74         hicif(:,:) = MAX( 0._wp,                     &        ! h >= 0         avoid spurious out of physical range
75            &         hicif(:,:) - rdt_ice * resto_ice(:,:,1) * ( hicif(:,:) - sf_icedmp(jp_hicif)%fnow(:,:,1) )  ) 
76!CDIR COLLAPSE
77         frld (:,:) = MAX( 0._wp, MIN( 1._wp,         &        ! 0<= frld<=1    values which blow the run up
78            &         frld (:,:) - rdt_ice * resto_ice(:,:,1) * ( frld (:,:) - sf_icedmp(jp_frld )%fnow(:,:,1) )  )  )
79         !
80      ENDIF
81      !
82   END SUBROUTINE lim_dmp_2
83
84
85   SUBROUTINE lim_dmp_init
86      !!----------------------------------------------------------------------
87      !!                   ***  ROUTINE lim_dmp_init  ***
88      !!
89      !! ** Purpose :   set the coefficient for the ice thickness and lead fraction restoring
90      !!
91      !! ** Method  :   restoring is used to mimic ice open boundaries.
92      !!              the restoring coef. (a 2D array) has to be defined by the user.
93      !!              here is given as an example a restoring along north and south boundaries
94      !!     
95      !! ** Action  :   define resto_ice(:,:,1)
96      !!----------------------------------------------------------------------
97      INTEGER  :: ji, jj, jk       ! dummy loop indices
98      INTEGER  :: irelax, ierror   ! error flag for allocation
99      INTEGER  ::   ios            ! Local integer output status for namelist read
100      !
101      REAL(wp) :: zdmpmax, zdmpmin, zfactor, zreltim ! temporary scalar
102      !
103      CHARACTER(len=100)           ::   cn_dir       ! Root directory for location of ssr files
104      TYPE(FLD_N), DIMENSION (2)   ::   sl_icedmp    ! informations about the icedmp  field to be read
105      TYPE(FLD_N)                  ::   sn_hicif     !
106      TYPE(FLD_N)                  ::   sn_frld      !
107      NAMELIST/namice_dmp/ cn_dir, ln_limdmp, sn_hicif, sn_frld
108      !!----------------------------------------------------------------------
109      !
110      ! 1)  initialize fld read structure for input data
111      !     --------------------------------------------
112                 
113      REWIND( numnam_ice_ref )              ! Namelist namice_dmp in reference namelist : Ice restoring
114      READ  ( numnam_ice_ref, namice_dmp, IOSTAT = ios, ERR = 901)
115901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namice_dmp in reference namelist', lwp )
116
117      REWIND( numnam_ice_cfg )              ! Namelist  namice_dmp in configuration namelist : Ice restoring
118      READ  ( numnam_ice_cfg, namice_dmp, IOSTAT = ios, ERR = 902 )
119902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namice_dmp in configuration namelist', lwp )
120      IF(lwm) WRITE ( numoni, namice_dmp )
121      !
122      IF ( lwp ) THEN                     !* control print
123         WRITE (numout,*)'     lim_dmp_init : lim_dmp initialization ' 
124         WRITE (numout,*)'       Namelist namicedmp read '
125         WRITE (numout,*)'         Ice restoring (T) or not (F) ln_limdmp =', ln_limdmp 
126         WRITE (numout,*)
127         WRITE (numout,*)'     CAUTION : here hard coded ice restoring along northern and southern boundaries'
128         WRITE (numout,*)'               adapt the lim_dmp_init routine to your needs'
129      ENDIF
130
131      ! 2)  initialise resto_ice    ==>  config dependant !
132      !     --------------------         ++++++++++++++++
133      !
134      IF( ln_limdmp ) THEN                !* ice restoring is used, follow initialization
135         !
136         sl_icedmp ( jp_hicif ) = sn_hicif
137         sl_icedmp ( jp_frld  ) = sn_frld
138         ALLOCATE ( sf_icedmp (2) , resto_ice(jpi,jpj,1), STAT=ierror )
139         IF( ierror > 0 ) THEN
140            CALL ctl_stop( 'lim_dmp_init: unable to allocate sf_icedmp structure or resto_ice array' )   ;   RETURN
141         ENDIF
142         ALLOCATE( sf_icedmp(jp_hicif)%fnow(jpi,jpj,1) , sf_icedmp(jp_hicif)%fdta(jpi,jpj,1,2) )
143         ALLOCATE( sf_icedmp(jp_frld )%fnow(jpi,jpj,1) , sf_icedmp(jp_frld )%fdta(jpi,jpj,1,2) )
144         !                         ! fill sf_icedmp with sn_icedmp and control print
145         CALL fld_fill( sf_icedmp, sl_icedmp, cn_dir, 'lim_dmp_init', 'Ice  restoring input data', 'namicedmp' )
146     
147         resto_ice(:,:,:) = 0._wp
148         !      Re-calculate the North and South boundary restoring term
149         !      because those boundaries may change with the prescribed zoom area.
150         !
151         irelax  = 16                     ! width of buffer zone with respect to close boundary
152         zdmpmax = 10._wp                 ! max restoring time scale  (days) (low restoring)
153         zdmpmin = rdt_ice / 86400._wp    ! min restoring time scale  (days) (high restoring)
154         !                                ! days / grid-point
155         zfactor = ( zdmpmax - zdmpmin ) / REAL( irelax, wp )
156
157         !    South boundary restoring term
158         ! REM: if there is no ice in the model and in the data,
159         !      no restoring even with non zero resto_ice
160         DO jj = mj0(jpjzoom - 1 + 1), mj1(jpjzoom -1 + irelax)
161            zreltim = zdmpmin + zfactor * ( mjg(jj) - jpjzoom + 1 )
162            resto_ice(:,jj,:) = 1._wp / ( zreltim * 86400._wp )
163         END DO
164
165         ! North boundary restoring term
166         DO jj =  mj0(jpjzoom -1 + jpjglo - irelax), mj1(jpjzoom - 1 + jpjglo)
167            zreltim = zdmpmin + zfactor * (jpjglo - ( mjg(jj) - jpjzoom + 1 ))
168            resto_ice(:,jj,:) = 1.e0 / ( zreltim * 86400 )
169         END DO
170      ENDIF
171      !
172   END SUBROUTINE lim_dmp_init
173   
174#else
175   !!----------------------------------------------------------------------
176   !!   Default option         Empty Module                  No ice damping
177   !!----------------------------------------------------------------------
178CONTAINS
179   SUBROUTINE lim_dmp_2( kt )        ! Dummy routine
180      WRITE(*,*) 'lim_dmp_2: You should not see this print! error? ', kt
181   END SUBROUTINE lim_dmp_2
182#endif
183
184   !!======================================================================
185END MODULE limdmp_2
Note: See TracBrowser for help on using the repository browser.