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 2612 for branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/LIM_SRC_3/limthd_sal.F90 – NEMO

Ignore:
Timestamp:
2011-02-25T11:43:45+01:00 (13 years ago)
Author:
gm
Message:

dynamic mem: #785 ; LIM-3 case: changes required for compilation (continuation)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/LIM_SRC_3/limthd_sal.F90

    r2528 r2612  
    66   !! History :   -   ! 2003-05 (M. Vancoppenolle) UCL-ASTR first coding for LIM3-1D 
    77   !!            3.0  ! 2005-12 (M. Vancoppenolle) adapted to the 3-D version 
     8   !!            4.0  ! 2011-02 (G. Madec) dynamical allocation 
    89   !!--------------------------------------------------------------------- 
    910#if defined key_lim3 
     
    1617   USE phycst           ! physical constants (ocean directory) 
    1718   USE sbc_oce          ! Surface boundary condition: ocean fields 
    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 
     19   USE ice              ! LIM variables 
     20   USE par_ice          ! LIM parameters 
     21   USE thd_ice          ! LIM thermodynamics 
     22   USE limvar           ! LIM variables 
     23   USE wrk_nemo         ! workspace manager 
    2224   USE in_out_manager   ! I/O manager 
    2325 
     
    2931 
    3032   !!---------------------------------------------------------------------- 
    31    !! NEMO/LIM3 3.3 , UCL - NEMO Consortium (2010) 
     33   !! NEMO/LIM3 4.0 , UCL - NEMO Consortium (2011) 
    3234   !! $Id$ 
    3335   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    5153      INTEGER  ::   ji, jk     ! dummy loop indices  
    5254      INTEGER  ::   zji, zjj   ! local integers 
    53       REAL(wp) ::   zsold, zeps, iflush, iaccrbo, igravdr, isnowic, i_ice_switch,  ztmelts   ! local scalars 
     55      REAL(wp) ::   zsold, iflush, iaccrbo, igravdr, isnowic, i_ice_switch,  ztmelts   ! local scalars 
    5456      REAL(wp) ::   zaaa, zbbb, zccc, zdiscrim   ! local scalars 
    55       REAL(wp), DIMENSION(jpij) ::   ze_init, zhiold, zsiold   ! 1D workspace 
     57      ! 
     58      REAL(wp), POINTER, DIMENSION(:) ::   ze_init, zhiold, zsiold 
    5659      !!--------------------------------------------------------------------- 
    5760 
    58       zeps=1.0e-06_wp 
     61      IF(  .NOT. wrk_use(1, 1,2,3)  ) THEN 
     62         CALL ctl_stop('lim_thd_dh : requestead workspace arrays unavailable.')   ;   RETURN 
     63      END IF 
     64      ! Set-up pointers to sub-arrays of workspace arrays 
     65      ze_init =>  wrk_1d_1 (1:jpij) 
     66      zhiold  =>  wrk_1d_2 (1:jpij) 
     67      zsiold  =>  wrk_1d_3 (1:jpij) 
    5968 
    6069      !------------------------------------------------------------------------------| 
    6170      ! 1) Constant salinity, constant in time                                       | 
    6271      !------------------------------------------------------------------------------| 
    63  
     72!!gm comment: if num_sal = 1 s_i_b and sm_i_b can be set to bulk_sal one for all in the initialisation phase !! 
    6473      IF( num_sal == 1 ) THEN 
     74         ! 
    6575         DO jk = 1, nlay_i 
    6676            DO ji = kideb, kiut 
     
    7989      !------------------------------------------------------------------------------| 
    8090 
    81       IF ( ( num_sal .EQ. 2 ) .OR. ( num_sal .EQ. 4 ) ) THEN 
    82  
    83          !         WRITE(numout,*) 
    84          !         WRITE(numout,*) 'lim_thd_sal : Ice salinity computation module ', & 
    85          !         num_sal 
    86          !         WRITE(numout,*) '~~~~~~~~~~~' 
    87          !         WRITE(numout,*) 
     91      IF(  num_sal == 2  .OR.  num_sal == 4  ) THEN 
    8892 
    8993         !--------------------------------- 
     
    9195         !--------------------------------- 
    9296         DO ji = kideb, kiut 
    93             zhiold(ji)   =  ht_i_b(ji) - dh_i_bott(ji) - dh_snowice(ji) -     & 
    94                dh_i_surf(ji) 
    95          END DO ! ji 
     97            zhiold(ji) = ht_i_b(ji) - dh_i_bott(ji) - dh_snowice(ji) - dh_i_surf(ji) 
     98         END DO 
    9699 
    97100         !--------------------- 
    98101         ! Global heat content 
    99102         !--------------------- 
    100  
    101          ze_init(:)  =  0.0 
     103         ze_init(:)  =  0._wp 
    102104         DO jk = 1, nlay_i 
    103105            DO ji = kideb, kiut 
    104106               ze_init(ji) = ze_init(ji) + q_i_b(ji,jk) * ht_i_b(ji) / nlay_i 
    105             END DO ! ji 
    106          END DO ! jk 
    107  
    108          DO ji = kideb, kiut 
    109  
    110             !---------- 
     107            END DO 
     108         END DO 
     109 
     110         DO ji = kideb, kiut 
     111            ! 
    111112            ! Switches  
    112113            !---------- 
    113  
    114             ! iflush  : 1 if summer  
    115             iflush       =  MAX( 0.0 , SIGN ( 1.0 , t_su_b(ji) - rtt ) )  
    116             ! igravdr : 1 if t_su lt t_bo 
    117             igravdr      =  MAX( 0.0 , SIGN ( 1.0 , t_bo_b(ji) - t_su_b(ji) ) ) 
    118             ! iaccrbo : 1 if bottom accretion 
    119             iaccrbo      =  MAX( 0.0 , SIGN ( 1.0 , dh_i_bott(ji) ) ) 
    120             ! isnowic : 1 if snow ice formation 
    121             i_ice_switch = 1.0 - MAX ( 0.0 , SIGN ( 1.0 , - ht_i_b(ji) + 1.0e-2 ) ) 
    122             isnowic      = 1.0 - MAX ( 0.0 , SIGN ( 1.0 , - dh_snowice(ji) ) ) * i_ice_switch 
     114            iflush       =         MAX( 0._wp , SIGN( 1.0 , t_su_b(ji) - rtt )        )    ! =1 if summer  
     115            igravdr      =         MAX( 0._wp , SIGN( 1.0 , t_bo_b(ji) - t_su_b(ji) ) )    ! =1 if t_su < t_bo 
     116            iaccrbo      =         MAX( 0._wp , SIGN( 1.0 , dh_i_bott(ji) )           )    ! =1 if bottom accretion 
     117            i_ice_switch = 1._wp - MAX ( 0._wp , SIGN( 1._wp , - ht_i_b(ji) + 1.e-2 ) ) 
     118            isnowic      = 1._wp - MAX ( 0._wp , SIGN( 1._wp , - dh_snowice(ji) ) ) * i_ice_switch   ! =1 if snow ice formation 
    123119 
    124120            !--------------------- 
    125121            ! Salinity tendencies 
    126122            !--------------------- 
    127  
    128             ! drainage by gravity drainage 
     123            !                                   ! drainage by gravity drainage 
    129124            dsm_i_gd_1d(ji) = - igravdr * MAX( sm_i_b(ji) - sal_G , 0._wp ) / time_G * rdt_ice  
    130  
    131             ! drainage by flushing   
    132             dsm_i_fl_1d(ji)  = - iflush * MAX( sm_i_b(ji) - sal_F , 0._wp ) / time_F * rdt_ice 
     125            !                                   ! drainage by flushing   
     126            dsm_i_fl_1d(ji) = - iflush * MAX( sm_i_b(ji) - sal_F , 0._wp ) / time_F * rdt_ice 
    133127 
    134128            !----------------- 
    135129            ! Update salinity    
    136130            !----------------- 
    137  
    138131            ! only drainage terms ( gravity drainage and flushing ) 
    139             ! snow ice / bottom sources are added in lim_thd_ent 
    140             ! to conserve energy 
     132            ! snow ice / bottom sources are added in lim_thd_ent to conserve energy 
    141133            zsiold(ji) = sm_i_b(ji) 
    142134            sm_i_b(ji) = sm_i_b(ji) + dsm_i_fl_1d(ji) + dsm_i_gd_1d(ji) 
    143135 
    144             ! if no ice, salinity eq 0.1 
     136            ! if no ice, salinity = 0.1 
    145137            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 ) 
     138            sm_i_b(ji)   = i_ice_switch * sm_i_b(ji) + s_i_min * ( 1._wp - i_ice_switch ) 
    147139         END DO ! ji 
    148140 
     
    155147 
    156148         DO ji = kideb, kiut 
     149!!gm useless 
    157150            ! iflush  : 1 if summer  
    158151            iflush  =  MAX( 0._wp , SIGN ( 1._wp , t_su_b(ji) - rtt ) )  
     
    161154            ! iaccrbo : 1 if bottom accretion 
    162155            iaccrbo =  MAX( 0._wp , SIGN ( 1._wp , dh_i_bott(ji) ) ) 
     156!!gm end useless 
    163157            ! 
    164158            fhbri_1d(ji) = 0._wp 
     
    186180               zbbb         =  ( rcp - cpic ) * ( ztmelts - rtt ) + q_i_b(ji,jk) / rhoic - lfus 
    187181               zccc         =  lfus * ( ztmelts - rtt ) 
    188                zdiscrim     =  SQRT( MAX(zbbb*zbbb - 4.0*zaaa*zccc,0.0) ) 
     182               zdiscrim     =  SQRT(  MAX( zbbb*zbbb - 4.0*zaaa*zccc, 0._wp ) ) 
    189183               t_i_b(ji,jk) =  rtt - ( zbbb + zdiscrim ) / ( 2.0 *zaaa ) 
    190             END DO !ji 
    191          END DO !jk 
     184            END DO 
     185         END DO 
    192186         ! 
    193187      ENDIF ! num_sal .EQ. 2 
     
    197191      !------------------------------------------------------------------------------| 
    198192 
    199       IF( num_sal .EQ. 3 ) THEN 
    200  
    201          WRITE(numout,*) 
    202          WRITE(numout,*) 'lim_thd_sal : Ice salinity computation module ', & 
    203             num_sal 
    204          WRITE(numout,*) '~~~~~~~~~~~~' 
    205  
    206          CALL lim_var_salprof1d(kideb,kiut) 
    207  
    208       ENDIF ! num_sal .EQ. 3 
     193      IF( num_sal == 3 )   CALL lim_var_salprof1d( kideb, kiut ) 
    209194 
    210195      !------------------------------------------------------------------------------| 
     
    212197      !------------------------------------------------------------------------------| 
    213198 
    214       ! Cox and Weeks, 1974 
    215       IF (num_sal.eq.5) THEN 
    216  
    217          WRITE(numout,*) 
    218          WRITE(numout,*) 'lim_thd_sal : Ice salinity computation module ', & 
    219             num_sal 
    220          WRITE(numout,*) '~~~~~~~~~~~~' 
    221  
    222          DO ji = kideb, kiut 
    223  
     199      IF( num_sal == 5 ) THEN      ! Cox and Weeks, 1974 
     200         ! 
     201         DO ji = kideb, kiut 
    224202            zsold = sm_i_b(ji) 
    225  
    226             IF (ht_i_b(ji).lt.0.4) THEN 
    227                sm_i_b(ji)    = 14.24 - 19.39*ht_i_b(ji)  
     203            IF( ht_i_b(ji) < 0.4 ) THEN 
     204               sm_i_b(ji) = 14.24 - 19.39 * ht_i_b(ji)  
    228205            ELSE 
    229                sm_i_b(ji)    =  7.88 - 1.59*ht_i_b(ji) 
    230                sm_i_b(ji)    = MIN(sm_i_b(ji),zsold 
     206               sm_i_b(ji) =  7.88 - 1.59 * ht_i_b(ji) 
     207               sm_i_b(ji) = MIN( sm_i_b(ji) , zsold  
    231208            ENDIF 
    232  
    233             IF ( ht_i_b(ji) .GT. 3.06918239 ) THEN  
    234                sm_i_b(ji)     = 3.0 
     209            IF( ht_i_b(ji) > 3.06918239 ) THEN  
     210               sm_i_b(ji) = 3._wp 
    235211            ENDIF 
    236  
    237212            DO jk = 1, nlay_i 
    238213               s_i_b(ji,jk)   = sm_i_b(ji) 
    239214            END DO 
    240  
    241          END DO ! ji 
    242  
     215         END DO 
     216         ! 
    243217      ENDIF ! num_sal 
    244218 
     
    247221      !------------------------------------------------------------------------------| 
    248222 
    249       IF ( num_sal .EQ. 4 ) THEN 
    250          DO ji = kideb, kiut 
    251             zji                 = MOD( npb(ji) - 1, jpi ) + 1 
    252             zjj                 = ( npb(ji) - 1 ) / jpi + 1 
     223      IF ( num_sal == 4 ) THEN 
     224         DO ji = kideb, kiut 
     225            zji = MOD( npb(ji) - 1 , jpi ) + 1 
     226            zjj =    ( npb(ji) - 1 ) / jpi + 1 
    253227            fseqv_1d(ji) = fseqv_1d(ji) + ( sss_m(zji,zjj) - bulk_sal    )               & 
    254228               &                        * rhoic * a_i_b(ji) * MAX( dh_i_bott(ji) , 0.0 ) / rdt_ice 
     
    256230      ELSE 
    257231         DO ji = kideb, kiut 
    258             zji                 = MOD( npb(ji) - 1, jpi ) + 1 
    259             zjj                 = ( npb(ji) - 1 ) / jpi + 1 
     232            zji = MOD( npb(ji) - 1 , jpi ) + 1 
     233            zjj =    ( npb(ji) - 1 ) / jpi + 1 
    260234            fseqv_1d(ji) = fseqv_1d(ji) + ( sss_m(zji,zjj) - s_i_new(ji) )               & 
    261235               &                        * rhoic * a_i_b(ji) * MAX( dh_i_bott(ji) , 0.0 ) / rdt_ice 
    262          END DO ! ji 
     236         END DO 
    263237      ENDIF 
     238      ! 
     239      IF( .NOT. wrk_release(1, 1,2,3) )   CALL ctl_stop( 'lim_thd_lac : failed to release workspace arrays.' ) 
    264240      ! 
    265241   END SUBROUTINE lim_thd_sal 
Note: See TracChangeset for help on using the changeset viewer.