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.
Changeset 2528 for trunk/NEMOGCM/NEMO/LIM_SRC_3/limthd_sal.F90 – NEMO

Ignore:
Timestamp:
2010-12-27T18:33:53+01:00 (13 years ago)
Author:
rblod
Message:

Update NEMOGCM from branch nemo_v3_3_beta

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/LIM_SRC_3/limthd_sal.F90

    r2477 r2528  
    11MODULE limthd_sal 
    2    !!---------------------------------------------------------------------- 
    3    !!   'key_lim3'                                      LIM3 sea-ice model 
    4    !!---------------------------------------------------------------------- 
    52   !!====================================================================== 
    63   !!                       ***  MODULE limthd_sal *** 
    7    !!                   computation salinity variations in 
    8    !!                               the ice 
     4   !! LIM-3 sea-ice :  computation of salinity variations in the ice 
    95   !!====================================================================== 
     6   !! History :   -   ! 2003-05 (M. Vancoppenolle) UCL-ASTR first coding for LIM3-1D 
     7   !!            3.0  ! 2005-12 (M. Vancoppenolle) adapted to the 3-D version 
     8   !!--------------------------------------------------------------------- 
    109#if defined key_lim3 
    1110   !!---------------------------------------------------------------------- 
     11   !!   'key_lim3'                                      LIM-3 sea-ice model 
     12   !!---------------------------------------------------------------------- 
    1213   !!   lim_thd_sal : salinity variations in the ice 
    13    !! * Modules used 
     14   !!---------------------------------------------------------------------- 
    1415   USE par_oce          ! ocean parameters 
    1516   USE phycst           ! physical constants (ocean directory) 
    1617   USE sbc_oce          ! Surface boundary condition: ocean fields 
    17    USE thd_ice 
    18    USE ice 
    19    USE in_out_manager 
    20    USE limvar 
    21    USE par_ice 
     18   USE ice              ! LIM: sea-ice variables 
     19   USE par_ice          ! LIM: sea-ice parameters 
     20   USE thd_ice          ! LIM: sea-ice thermodynamics 
     21   USE limvar           ! LIM: sea-ice variables 
     22   USE in_out_manager   ! I/O manager 
    2223 
    2324   IMPLICIT NONE 
    2425   PRIVATE 
    2526 
    26    !! * Routine accessibility 
    27    PUBLIC lim_thd_sal        ! called by lim_thd 
    28    PUBLIC lim_thd_sal_init   ! called by lim_thd 
    29  
    30    !! * Module variables 
    31    REAL(wp)  ::           &  ! constant values 
    32       epsi20 = 1e-20   ,  & 
    33       epsi13 = 1e-13   ,  & 
    34       zzero  = 0.e0    ,  & 
    35       zone   = 1.e0 
    36  
    37    !!---------------------------------------------------------------------- 
    38    !!   LIM 3.0,  UCL-ASTR-LOCEAN-IPSL (2008) 
     27   PUBLIC   lim_thd_sal        ! called by limthd module 
     28   PUBLIC   lim_thd_sal_init   ! called by iceini module 
     29 
     30   !!---------------------------------------------------------------------- 
     31   !! NEMO/LIM3 3.3 , UCL - NEMO Consortium (2010) 
    3932   !! $Id$ 
    40    !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
    41    !!---------------------------------------------------------------------- 
    42  
     33   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     34   !!---------------------------------------------------------------------- 
    4335CONTAINS 
    4436 
    45    SUBROUTINE lim_thd_sal(kideb,kiut) 
     37   SUBROUTINE lim_thd_sal( kideb, kiut ) 
    4638      !!------------------------------------------------------------------- 
    47       !!                ***  ROUTINE lim_thd_sal  ***        
    48       !! ** Purpose : 
    49       !!        This routine computes new salinities in the ice 
     39      !!                ***  ROUTINE lim_thd_sal  ***     
     40      !!    
     41      !! ** Purpose :  computes new salinities in the ice 
    5042      !! 
    5143      !! ** Method  :  4 possibilities 
     
    5446      !!               -> num_sal = 3 -> S = S(z)   [multiyear ice] 
    5547      !!               -> num_sal = 4 -> S = S(h)   [Cox and Weeks 74] 
    56       !!            
    57       !! ** Steps 
    58       !! 
    59       !! ** Arguments 
    60       !! 
    61       !! ** Inputs / Outputs 
    62       !! 
    63       !! ** External 
    64       !! 
    65       !! ** References 
    66       !! 
    67       !! ** History  :  
    68       !! 
    69       !! "Je ne suis pour l'instant qu'a 80% de ma condition, mais c'est  
    70       !!  les 30% qui restent qui seront les plus difficiles" 
    71       !!                                           E. Mpenza 
    72       !! 
    73       !!------------------------------------------------------------------- 
    74       !! History : 
    75       !!   ori  !  03-05 M. Vancoppenolle UCL-ASTR first coding for LIM-1D 
    76       !!   3.0  !  05-12 Routine rewritten for the 3-D version 
    7748      !!--------------------------------------------------------------------- 
    78       !! 
    79       !! * Local variables 
    80       INTEGER, INTENT(in) :: & 
    81          kideb, kiut             !: thickness category index 
    82  
    83       INTEGER ::             & 
    84          ji, jk ,            &   !: geographic and layer index  
    85          zji, zjj 
    86  
    87       REAL(wp) ::            & 
    88          zsold,              &   !: old salinity 
    89          zeps=1.0e-06   ,    &   !: very small 
    90          iflush         ,    &   !: flushing (1) or not (0) 
    91          iaccrbo        ,    &   !: bottom accretion (1) or not (0) 
    92          igravdr        ,    &   !: gravity drainage or not 
    93          isnowic        ,    &   !: gravity drainage or not 
    94          i_ice_switch   ,    &   !: ice thickness above a certain treshold or not 
    95          ztmelts        ,    &   !: freezing point of sea ice 
    96          zaaa           ,    &   !: dummy factor 
    97          zbbb           ,    &   !: dummy factor 
    98          zccc           ,    &   !: dummy factor 
    99          zdiscrim                !: dummy factor 
    100  
    101       REAL(wp), DIMENSION(jpij) ::          & 
    102          ze_init        ,    &   !initial total enthalpy 
    103          zhiold         ,    & 
    104          zsiold 
    105  
     49      INTEGER, INTENT(in) ::  kideb, kiut   ! thickness category index 
     50      ! 
     51      INTEGER  ::   ji, jk     ! dummy loop indices  
     52      INTEGER  ::   zji, zjj   ! local integers 
     53      REAL(wp) ::   zsold, zeps, iflush, iaccrbo, igravdr, isnowic, i_ice_switch,  ztmelts   ! local scalars 
     54      REAL(wp) ::   zaaa, zbbb, zccc, zdiscrim   ! local scalars 
     55      REAL(wp), DIMENSION(jpij) ::   ze_init, zhiold, zsiold   ! 1D workspace 
    10656      !!--------------------------------------------------------------------- 
    10757 
     58      zeps=1.0e-06_wp 
     59 
    10860      !------------------------------------------------------------------------------| 
    10961      ! 1) Constant salinity, constant in time                                       | 
    11062      !------------------------------------------------------------------------------| 
    11163 
    112       IF (num_sal.eq.1) THEN 
    113  
    114          !         WRITE(numout,*) 
    115          !         WRITE(numout,*) 'lim_thd_sal : Ice salinity computation module ', & 
    116          !         num_sal 
    117          !         WRITE(numout,*) '~~~~~~~~~~~~' 
    118  
     64      IF( num_sal == 1 ) THEN 
    11965         DO jk = 1, nlay_i 
    12066            DO ji = kideb, kiut 
     
    12268            END DO ! ji 
    12369         END DO ! jk 
    124  
     70         ! 
    12571         DO ji = kideb, kiut 
    12672            sm_i_b(ji)      =  bulk_sal  
    12773         END DO ! ji 
    128  
    129       ENDIF ! num_sal .EQ. 1 
     74         ! 
     75      ENDIF 
    13076 
    13177      !------------------------------------------------------------------------------| 
     
    174120            ! isnowic : 1 if snow ice formation 
    175121            i_ice_switch = 1.0 - MAX ( 0.0 , SIGN ( 1.0 , - ht_i_b(ji) + 1.0e-2 ) ) 
    176             isnowic      = 1.0 - MAX ( 0.0 , SIGN ( 1.0 , - dh_snowice(ji) ) ) * & 
    177                i_ice_switch 
     122            isnowic      = 1.0 - MAX ( 0.0 , SIGN ( 1.0 , - dh_snowice(ji) ) ) * i_ice_switch 
    178123 
    179124            !--------------------- 
     
    182127 
    183128            ! drainage by gravity drainage 
    184             dsm_i_gd_1d(ji) = - igravdr *                                     &  
    185                MAX( sm_i_b(ji) - sal_G , 0.0 ) /             & 
    186                time_G * rdt_ice  
     129            dsm_i_gd_1d(ji) = - igravdr * MAX( sm_i_b(ji) - sal_G , 0._wp ) / time_G * rdt_ice  
    187130 
    188131            ! drainage by flushing   
    189             dsm_i_fl_1d(ji)  = - iflush *                                     & 
    190                MAX( sm_i_b(ji) - sal_F , 0.0 ) /             &  
    191                time_F * rdt_ice 
     132            dsm_i_fl_1d(ji)  = - iflush * MAX( sm_i_b(ji) - sal_F , 0._wp ) / time_F * rdt_ice 
    192133 
    193134            !----------------- 
     
    199140            ! to conserve energy 
    200141            zsiold(ji) = sm_i_b(ji) 
    201             sm_i_b(ji) = sm_i_b(ji)                                           & 
    202                + dsm_i_fl_1d(ji) + dsm_i_gd_1d(ji)  !                 & 
     142            sm_i_b(ji) = sm_i_b(ji) + dsm_i_fl_1d(ji) + dsm_i_gd_1d(ji) 
    203143 
    204144            ! if no ice, salinity eq 0.1 
    205             i_ice_switch  = 1.0 - MAX ( 0.0, SIGN (1.0 , - ht_i_b(ji) ) ) 
    206             sm_i_b(ji)    = i_ice_switch*sm_i_b(ji) + s_i_min * ( 1.0 -       & 
    207                i_ice_switch ) 
     145            i_ice_switch = 1._wp - MAX ( 0._wp, SIGN( 1._wp , - ht_i_b(ji) ) ) 
     146            sm_i_b(ji)   = i_ice_switch*sm_i_b(ji) + s_i_min * ( 1._wp - i_ice_switch ) 
    208147         END DO ! ji 
    209148 
    210149         ! Salinity profile 
    211          CALL lim_var_salprof1d(kideb,kiut) 
     150         CALL lim_var_salprof1d( kideb, kiut ) 
    212151 
    213152         !---------------------------- 
     
    217156         DO ji = kideb, kiut 
    218157            ! iflush  : 1 if summer  
    219             iflush       =  MAX( 0.0 , SIGN ( 1.0 , t_su_b(ji) - rtt ) )  
     158            iflush  =  MAX( 0._wp , SIGN ( 1._wp , t_su_b(ji) - rtt ) )  
    220159            ! igravdr : 1 if t_su lt t_bo 
    221             igravdr      =  MAX( 0.0 , SIGN ( 1.0 , t_bo_b(ji) - t_su_b(ji) ) )  
     160            igravdr =  MAX( 0._wp , SIGN ( 1._wp , t_bo_b(ji) - t_su_b(ji) ) )  
    222161            ! iaccrbo : 1 if bottom accretion 
    223             iaccrbo      =  MAX( 0.0 , SIGN ( 1.0 , dh_i_bott(ji) ) ) 
    224  
    225             fhbri_1d(ji) = 0.0 
     162            iaccrbo =  MAX( 0._wp , SIGN ( 1._wp , dh_i_bott(ji) ) ) 
     163            ! 
     164            fhbri_1d(ji) = 0._wp 
    226165         END DO ! ji 
    227166 
     
    230169         !---------------------------- 
    231170         DO ji = kideb, kiut 
    232             i_ice_switch  = 1.0 - MAX ( 0.0, SIGN (1.0 , - ht_i_b(ji) ) ) 
    233             fsbri_1d(ji) = fsbri_1d(ji) -  & 
    234                i_ice_switch * rhoic * a_i_b(ji) * ht_i_b(ji) *  & 
    235                ( MAX(dsm_i_gd_1d(ji) + dsm_i_fl_1d(ji), & 
    236                sm_i_b(ji) - zsiold(ji) ) ) / rdt_ice 
    237             IF ( num_sal .EQ. 4 ) fsbri_1d(ji) = 0.0 
    238  
     171            i_ice_switch = 1._wp - MAX ( 0._wp, SIGN( 1._wp , - ht_i_b(ji) ) ) 
     172            fsbri_1d(ji) = fsbri_1d(ji) - i_ice_switch * rhoic * a_i_b(ji) * ht_i_b(ji)         & 
     173               &         * ( MAX(dsm_i_gd_1d(ji) + dsm_i_fl_1d(ji), sm_i_b(ji) - zsiold(ji) ) ) / rdt_ice 
     174            IF( num_sal == 4 ) fsbri_1d(ji) = 0._wp 
    239175         END DO ! ji 
    240176 
     
    244180         !-------------------- 
    245181         DO jk = 1, nlay_i 
    246  
    247182            DO ji = kideb, kiut 
    248  
    249183               ztmelts    =  -tmut*s_i_b(ji,jk) + rtt 
    250184               !Conversion q(S,T) -> T (second order equation) 
    251185               zaaa         =  cpic 
    252                zbbb         =  ( rcp - cpic ) * ( ztmelts - rtt ) + & 
    253                   q_i_b(ji,jk) / rhoic - lfus 
     186               zbbb         =  ( rcp - cpic ) * ( ztmelts - rtt ) + q_i_b(ji,jk) / rhoic - lfus 
    254187               zccc         =  lfus * ( ztmelts - rtt ) 
    255188               zdiscrim     =  SQRT( MAX(zbbb*zbbb - 4.0*zaaa*zccc,0.0) ) 
    256                t_i_b(ji,jk) =  rtt - ( zbbb + zdiscrim ) / &  
    257                   ( 2.0 *zaaa ) 
     189               t_i_b(ji,jk) =  rtt - ( zbbb + zdiscrim ) / ( 2.0 *zaaa ) 
    258190            END DO !ji 
    259  
    260191         END DO !jk 
    261  
     192         ! 
    262193      ENDIF ! num_sal .EQ. 2 
    263194 
     
    266197      !------------------------------------------------------------------------------| 
    267198 
    268       IF ( num_sal .EQ. 3 ) THEN 
     199      IF( num_sal .EQ. 3 ) THEN 
    269200 
    270201         WRITE(numout,*) 
     
    320251            zji                 = MOD( npb(ji) - 1, jpi ) + 1 
    321252            zjj                 = ( npb(ji) - 1 ) / jpi + 1 
    322             fseqv_1d(ji) = fseqv_1d(ji)              + &  
    323                ( sss_m(zji,zjj) - bulk_sal    ) * &  
    324                rhoic * a_i_b(ji) * & 
    325                MAX( dh_i_bott(ji) , 0.0 ) / rdt_ice 
     253            fseqv_1d(ji) = fseqv_1d(ji) + ( sss_m(zji,zjj) - bulk_sal    )               & 
     254               &                        * rhoic * a_i_b(ji) * MAX( dh_i_bott(ji) , 0.0 ) / rdt_ice 
    326255         END DO 
    327256      ELSE 
     
    329258            zji                 = MOD( npb(ji) - 1, jpi ) + 1 
    330259            zjj                 = ( npb(ji) - 1 ) / jpi + 1 
    331             fseqv_1d(ji) = fseqv_1d(ji)              + &  
    332                ( sss_m(zji,zjj) - s_i_new(ji) ) * &  
    333                rhoic * a_i_b(ji) * & 
    334                MAX( dh_i_bott(ji) , 0.0 ) / rdt_ice 
     260            fseqv_1d(ji) = fseqv_1d(ji) + ( sss_m(zji,zjj) - s_i_new(ji) )               & 
     261               &                        * rhoic * a_i_b(ji) * MAX( dh_i_bott(ji) , 0.0 ) / rdt_ice 
    335262         END DO ! ji 
    336263      ENDIF 
    337  
    338       !-- End of salinity computations 
     264      ! 
    339265   END SUBROUTINE lim_thd_sal 
    340    !============================================================================== 
     266 
    341267 
    342268   SUBROUTINE lim_thd_sal_init 
     
    346272      !! ** Purpose :   initialization of ice salinity parameters 
    347273      !! 
    348       !! ** Method  : Read the namicesal namelist and check the parameter 
    349       !!       values called at the first timestep (nit000) 
     274      !! ** Method  :   Read the namicesal namelist and check the parameter 
     275      !!              values called at the first timestep (nit000) 
    350276      !! 
    351277      !! ** input   :   Namelist namicesal 
    352       !! 
    353       !! history : 
    354       !!   3.0  !  July 2005 M. Vancoppenolle  Original code 
    355278      !!------------------------------------------------------------------- 
    356       NAMELIST/namicesal/ num_sal, bulk_sal, sal_G, time_G, sal_F, time_F, & 
    357          s_i_max, s_i_min, s_i_0, s_i_1 
     279      NAMELIST/namicesal/ num_sal, bulk_sal, sal_G, time_G, sal_F, time_F,   & 
     280         &                s_i_max, s_i_min, s_i_0, s_i_1 
    358281      !!------------------------------------------------------------------- 
    359  
    360       ! Read Namelist namicesal 
    361       REWIND ( numnam_ice ) 
    362       READ   ( numnam_ice  , namicesal ) 
    363       IF(lwp) THEN 
     282      ! 
     283      REWIND( numnam_ice )                   ! Read Namelist namicesal 
     284      READ  ( numnam_ice  , namicesal ) 
     285      ! 
     286      IF(lwp) THEN                           ! control print 
    364287         WRITE(numout,*) 
    365288         WRITE(numout,*) 'lim_thd_sal_init : Ice parameters for salinity ' 
     
    376299         WRITE(numout,*) ' 2nd salinity for salinity profile  : ', s_i_1 
    377300      ENDIF 
    378  
     301      ! 
    379302   END SUBROUTINE lim_thd_sal_init 
    380303 
    381304#else 
    382305   !!---------------------------------------------------------------------- 
    383    !!   Default option         Empty Module                No sea-ice model 
    384    !!---------------------------------------------------------------------- 
    385 CONTAINS 
    386    SUBROUTINE lim_thd_sal        ! Empty routine 
    387    END SUBROUTINE lim_thd_sal 
     306   !!   Default option         Dummy Module          No LIM-3 sea-ice model 
     307   !!---------------------------------------------------------------------- 
    388308#endif 
    389309   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.