[821] | 1 | MODULE limdmp_2 |
---|
[420] | 2 | !!====================================================================== |
---|
[821] | 3 | !! *** MODULE limdmp_2 *** |
---|
[2528] | 4 | !! LIM-2 ice model : restoring Ice thickness and Fraction leads |
---|
[420] | 5 | !!====================================================================== |
---|
[2528] | 6 | !! History : 2.0 ! 2004-04 (S. Theetten) Original code |
---|
| 7 | !! 3.3 ! 2010-06 (J.-M. Molines) use of fldread |
---|
[420] | 8 | !!---------------------------------------------------------------------- |
---|
[2528] | 9 | #if defined key_lim2 |
---|
[420] | 10 | !!---------------------------------------------------------------------- |
---|
[2528] | 11 | !! 'key_lim2' LIM 2.0 sea-ice model |
---|
[508] | 12 | !!---------------------------------------------------------------------- |
---|
[3635] | 13 | !! lim_dmp_2 : ice model damping |
---|
[420] | 14 | !!---------------------------------------------------------------------- |
---|
[3635] | 15 | USE ice_2 ! ice variables |
---|
[2528] | 16 | USE sbc_oce, ONLY : nn_fsbc ! for fldread |
---|
[3635] | 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 |
---|
[3625] | 21 | USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) |
---|
[2715] | 22 | |
---|
[420] | 23 | IMPLICIT NONE |
---|
| 24 | PRIVATE |
---|
| 25 | |
---|
[2528] | 26 | PUBLIC lim_dmp_2 ! called by sbc_ice_lim2 |
---|
| 27 | |
---|
[3635] | 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 |
---|
[420] | 31 | |
---|
| 32 | !! * Substitution |
---|
| 33 | # include "vectopt_loop_substitute.h90" |
---|
| 34 | !!---------------------------------------------------------------------- |
---|
[2528] | 35 | !! NEMO/LIM 3.3 , UCL-NEMO-consortium (2010) |
---|
[1156] | 36 | !! $Id$ |
---|
[2528] | 37 | !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) |
---|
[420] | 38 | !!---------------------------------------------------------------------- |
---|
| 39 | CONTAINS |
---|
| 40 | |
---|
[2528] | 41 | SUBROUTINE lim_dmp_2( kt ) |
---|
[420] | 42 | !!------------------------------------------------------------------- |
---|
[2528] | 43 | !! *** ROUTINE lim_dmp_2 *** |
---|
[420] | 44 | !! |
---|
[3635] | 45 | !! ** purpose : restore ice thickness and lead fraction |
---|
[420] | 46 | !! |
---|
[3635] | 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 | !! |
---|
[420] | 52 | !!--------------------------------------------------------------------- |
---|
[2528] | 53 | INTEGER, INTENT(in) :: kt ! ocean time-step |
---|
[508] | 54 | ! |
---|
[2528] | 55 | INTEGER :: ji, jj ! dummy loop indices |
---|
| 56 | REAL(wp) :: zfrld, zhice ! local scalars |
---|
[420] | 57 | !!--------------------------------------------------------------------- |
---|
[508] | 58 | ! |
---|
[3635] | 59 | IF( kt == nit000 ) THEN |
---|
[2528] | 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 |
---|
[508] | 68 | ! |
---|
[2528] | 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 |
---|
[3635] | 77 | frld (:,:) = MAX( 0._wp, MIN( 1._wp, & ! 0<= frld<=1 values which blow the run up |
---|
[2528] | 78 | & frld (:,:) - rdt_ice * resto_ice(:,:,1) * ( frld (:,:) - sf_icedmp(jp_frld )%fnow(:,:,1) ) ) ) |
---|
| 79 | ! |
---|
| 80 | ENDIF |
---|
| 81 | ! |
---|
[821] | 82 | END SUBROUTINE lim_dmp_2 |
---|
[420] | 83 | |
---|
| 84 | |
---|
[2528] | 85 | SUBROUTINE lim_dmp_init |
---|
[420] | 86 | !!---------------------------------------------------------------------- |
---|
[2528] | 87 | !! *** ROUTINE lim_dmp_init *** |
---|
[420] | 88 | !! |
---|
[3635] | 89 | !! ** Purpose : set the coefficient for the ice thickness and lead fraction restoring |
---|
[420] | 90 | !! |
---|
[3635] | 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 |
---|
[420] | 94 | !! |
---|
[2528] | 95 | !! ** Action : define resto_ice(:,:,1) |
---|
[420] | 96 | !!---------------------------------------------------------------------- |
---|
[2528] | 97 | INTEGER :: ji, jj, jk ! dummy loop indices |
---|
| 98 | INTEGER :: irelax, ierror ! error flag for allocation |
---|
[4147] | 99 | INTEGER :: ios ! Local integer output status for namelist read |
---|
[508] | 100 | ! |
---|
[2528] | 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 |
---|
[420] | 108 | !!---------------------------------------------------------------------- |
---|
[2528] | 109 | ! |
---|
| 110 | ! 1) initialize fld read structure for input data |
---|
| 111 | ! -------------------------------------------- |
---|
[4147] | 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) |
---|
| 115 | 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namice_dmp in reference namelist', lwp ) |
---|
[420] | 116 | |
---|
[4147] | 117 | REWIND( numnam_ice_cfg ) ! Namelist namice_dmp in configuration namelist : Ice restoring |
---|
| 118 | READ ( numnam_ice_cfg, namice_dmp, IOSTAT = ios, ERR = 902 ) |
---|
| 119 | 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namice_dmp in configuration namelist', lwp ) |
---|
[4624] | 120 | IF(lwm) WRITE ( numoni, namice_dmp ) |
---|
[2528] | 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' |
---|
[420] | 129 | ENDIF |
---|
| 130 | |
---|
[2528] | 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. |
---|
[508] | 150 | ! |
---|
[2528] | 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 ) |
---|
[420] | 156 | |
---|
[2528] | 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 |
---|
[674] | 164 | |
---|
[2528] | 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 |
---|
[420] | 170 | ENDIF |
---|
[508] | 171 | ! |
---|
[2528] | 172 | END SUBROUTINE lim_dmp_init |
---|
| 173 | |
---|
[420] | 174 | #else |
---|
| 175 | !!---------------------------------------------------------------------- |
---|
| 176 | !! Default option Empty Module No ice damping |
---|
| 177 | !!---------------------------------------------------------------------- |
---|
| 178 | CONTAINS |
---|
[821] | 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 |
---|
[420] | 182 | #endif |
---|
| 183 | |
---|
| 184 | !!====================================================================== |
---|
[821] | 185 | END MODULE limdmp_2 |
---|