123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- MODULE limdmp_2
- !!======================================================================
- !! *** MODULE limdmp_2 ***
- !! LIM-2 ice model : restoring Ice thickness and Fraction leads
- !!======================================================================
- !! History : 2.0 ! 2004-04 (S. Theetten) Original code
- !! 3.3 ! 2010-06 (J.-M. Molines) use of fldread
- !!----------------------------------------------------------------------
- #if defined key_lim2
- !!----------------------------------------------------------------------
- !! 'key_lim2' LIM 2.0 sea-ice model
- !!----------------------------------------------------------------------
- !! lim_dmp_2 : ice model damping
- !!----------------------------------------------------------------------
- USE ice_2 ! ice variables
- USE sbc_oce, ONLY : nn_fsbc ! for fldread
- USE dom_oce ! for mi0; mi1 etc ...
- USE fldread ! read input fields
- USE in_out_manager ! I/O manager
- USE lib_mpp ! MPP library
- USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)
- IMPLICIT NONE
- PRIVATE
- PUBLIC lim_dmp_2 ! called by sbc_ice_lim2
- INTEGER , PARAMETER :: jp_hicif = 1 , jp_frld = 2
- REAL(wp) , ALLOCATABLE, DIMENSION(:,:,:) :: resto_ice ! restoring coeff. on ICE [s-1]
- TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_icedmp ! structure of ice damping input
-
- !! * Substitution
- # include "vectopt_loop_substitute.h90"
- !!----------------------------------------------------------------------
- !! NEMO/LIM 3.3 , UCL-NEMO-consortium (2010)
- !! $Id: limdmp_2.F90 4624 2014-04-28 12:09:03Z acc $
- !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
- !!----------------------------------------------------------------------
- CONTAINS
- SUBROUTINE lim_dmp_2( kt )
- !!-------------------------------------------------------------------
- !! *** ROUTINE lim_dmp_2 ***
- !!
- !! ** purpose : restore ice thickness and lead fraction
- !!
- !! ** method : restore ice thickness and lead fraction using a restoring
- !! coefficient defined by the user in lim_dmp_init
- !!
- !! ** Action : - update hicif and frld
- !!
- !!---------------------------------------------------------------------
- INTEGER, INTENT(in) :: kt ! ocean time-step
- !
- INTEGER :: ji, jj ! dummy loop indices
- REAL(wp) :: zfrld, zhice ! local scalars
- !!---------------------------------------------------------------------
- !
- IF( kt == nit000 ) THEN
- IF(lwp) WRITE(numout,*)
- IF(lwp) WRITE(numout,*) 'lim_dmp_2 : Ice thickness and ice concentration restoring'
- IF(lwp) WRITE(numout,*) '~~~~~~~~~~'
- !
- ! ice_resto_init create resto_ice (in 1/s) for restoring ice parameters near open boundaries.
- ! Double check this routine to verify if it corresponds to your config
- CALL lim_dmp_init
- ENDIF
- !
- IF( ln_limdmp ) THEN ! ice restoring in this case
- !
- CALL fld_read( kt, nn_fsbc, sf_icedmp )
- !
- !CDIR COLLAPSE
- hicif(:,:) = MAX( 0._wp, & ! h >= 0 avoid spurious out of physical range
- & hicif(:,:) - rdt_ice * resto_ice(:,:,1) * ( hicif(:,:) - sf_icedmp(jp_hicif)%fnow(:,:,1) ) )
- !CDIR COLLAPSE
- frld (:,:) = MAX( 0._wp, MIN( 1._wp, & ! 0<= frld<=1 values which blow the run up
- & frld (:,:) - rdt_ice * resto_ice(:,:,1) * ( frld (:,:) - sf_icedmp(jp_frld )%fnow(:,:,1) ) ) )
- !
- ENDIF
- !
- END SUBROUTINE lim_dmp_2
- SUBROUTINE lim_dmp_init
- !!----------------------------------------------------------------------
- !! *** ROUTINE lim_dmp_init ***
- !!
- !! ** Purpose : set the coefficient for the ice thickness and lead fraction restoring
- !!
- !! ** Method : restoring is used to mimic ice open boundaries.
- !! the restoring coef. (a 2D array) has to be defined by the user.
- !! here is given as an example a restoring along north and south boundaries
- !!
- !! ** Action : define resto_ice(:,:,1)
- !!----------------------------------------------------------------------
- INTEGER :: ji, jj, jk ! dummy loop indices
- INTEGER :: irelax, ierror ! error flag for allocation
- INTEGER :: ios ! Local integer output status for namelist read
- !
- REAL(wp) :: zdmpmax, zdmpmin, zfactor, zreltim ! temporary scalar
- !
- CHARACTER(len=100) :: cn_dir ! Root directory for location of ssr files
- TYPE(FLD_N), DIMENSION (2) :: sl_icedmp ! informations about the icedmp field to be read
- TYPE(FLD_N) :: sn_hicif !
- TYPE(FLD_N) :: sn_frld !
- NAMELIST/namice_dmp/ cn_dir, ln_limdmp, sn_hicif, sn_frld
- !!----------------------------------------------------------------------
- !
- ! 1) initialize fld read structure for input data
- ! --------------------------------------------
-
- REWIND( numnam_ice_ref ) ! Namelist namice_dmp in reference namelist : Ice restoring
- READ ( numnam_ice_ref, namice_dmp, IOSTAT = ios, ERR = 901)
- 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namice_dmp in reference namelist', lwp )
- REWIND( numnam_ice_cfg ) ! Namelist namice_dmp in configuration namelist : Ice restoring
- READ ( numnam_ice_cfg, namice_dmp, IOSTAT = ios, ERR = 902 )
- 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namice_dmp in configuration namelist', lwp )
- IF(lwm) WRITE ( numoni, namice_dmp )
- !
- IF ( lwp ) THEN !* control print
- WRITE (numout,*)' lim_dmp_init : lim_dmp initialization '
- WRITE (numout,*)' Namelist namicedmp read '
- WRITE (numout,*)' Ice restoring (T) or not (F) ln_limdmp =', ln_limdmp
- WRITE (numout,*)
- WRITE (numout,*)' CAUTION : here hard coded ice restoring along northern and southern boundaries'
- WRITE (numout,*)' adapt the lim_dmp_init routine to your needs'
- ENDIF
- ! 2) initialise resto_ice ==> config dependant !
- ! -------------------- ++++++++++++++++
- !
- IF( ln_limdmp ) THEN !* ice restoring is used, follow initialization
- !
- sl_icedmp ( jp_hicif ) = sn_hicif
- sl_icedmp ( jp_frld ) = sn_frld
- ALLOCATE ( sf_icedmp (2) , resto_ice(jpi,jpj,1), STAT=ierror )
- IF( ierror > 0 ) THEN
- CALL ctl_stop( 'lim_dmp_init: unable to allocate sf_icedmp structure or resto_ice array' ) ; RETURN
- ENDIF
- ALLOCATE( sf_icedmp(jp_hicif)%fnow(jpi,jpj,1) , sf_icedmp(jp_hicif)%fdta(jpi,jpj,1,2) )
- ALLOCATE( sf_icedmp(jp_frld )%fnow(jpi,jpj,1) , sf_icedmp(jp_frld )%fdta(jpi,jpj,1,2) )
- ! ! fill sf_icedmp with sn_icedmp and control print
- CALL fld_fill( sf_icedmp, sl_icedmp, cn_dir, 'lim_dmp_init', 'Ice restoring input data', 'namicedmp' )
-
- resto_ice(:,:,:) = 0._wp
- ! Re-calculate the North and South boundary restoring term
- ! because those boundaries may change with the prescribed zoom area.
- !
- irelax = 16 ! width of buffer zone with respect to close boundary
- zdmpmax = 10._wp ! max restoring time scale (days) (low restoring)
- zdmpmin = rdt_ice / 86400._wp ! min restoring time scale (days) (high restoring)
- ! ! days / grid-point
- zfactor = ( zdmpmax - zdmpmin ) / REAL( irelax, wp )
- ! South boundary restoring term
- ! REM: if there is no ice in the model and in the data,
- ! no restoring even with non zero resto_ice
- DO jj = mj0(jpjzoom - 1 + 1), mj1(jpjzoom -1 + irelax)
- zreltim = zdmpmin + zfactor * ( mjg(jj) - jpjzoom + 1 )
- resto_ice(:,jj,:) = 1._wp / ( zreltim * 86400._wp )
- END DO
- ! North boundary restoring term
- DO jj = mj0(jpjzoom -1 + jpjglo - irelax), mj1(jpjzoom - 1 + jpjglo)
- zreltim = zdmpmin + zfactor * (jpjglo - ( mjg(jj) - jpjzoom + 1 ))
- resto_ice(:,jj,:) = 1.e0 / ( zreltim * 86400 )
- END DO
- ENDIF
- !
- END SUBROUTINE lim_dmp_init
-
- #else
- !!----------------------------------------------------------------------
- !! Default option Empty Module No ice damping
- !!----------------------------------------------------------------------
- CONTAINS
- SUBROUTINE lim_dmp_2( kt ) ! Dummy routine
- WRITE(*,*) 'lim_dmp_2: You should not see this print! error? ', kt
- END SUBROUTINE lim_dmp_2
- #endif
- !!======================================================================
- END MODULE limdmp_2
|