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 7280 for branches/2016/dev_CNRS_2016/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90 – NEMO

Ignore:
Timestamp:
2016-11-21T11:40:00+01:00 (7 years ago)
Author:
flavoni
Message:

merge CNRS2016 with aerobulk branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2016/dev_CNRS_2016/NEMOGCM/NEMO/LIM_SRC_3/limistate.F90

    r7278 r7280  
    55   !!====================================================================== 
    66   !! History :  2.0  ! 2004-01 (C. Ethe, G. Madec)  Original code 
    7    !!            4.0  ! 2011-02 (G. Madec) dynamical allocation 
     7   !!            3.0  ! 2011-02 (G. Madec) dynamical allocation 
    88   !!             -   ! 2014    (C. Rousset) add N/S initializations 
    99   !!---------------------------------------------------------------------- 
     
    2525   USE dom_ice          ! sea-ice domain 
    2626   USE limvar           ! lim_var_salprof 
     27   ! 
    2728   USE in_out_manager   ! I/O manager 
    2829   USE lib_mpp          ! MPP library 
     
    3738   PUBLIC   lim_istate      ! routine called by lim_init.F90 
    3839 
    39    !                          !!** init namelist (namiceini) ** 
     40   !                           !!** init namelist (namiceini) ** 
    4041   REAL(wp) ::   rn_thres_sst   ! threshold water temperature for initial sea ice 
    4142   REAL(wp) ::   rn_hts_ini_n   ! initial snow thickness in the north 
     
    5758   INTEGER , PARAMETER ::   jp_tmi = 5           ! index of ice temp at T-point 
    5859   INTEGER , PARAMETER ::   jp_smi = 6           ! index of ice sali at T-point 
    59    TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   si    ! structure of input fields (file informations, fields read) 
     60   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   si  ! structure of input fields (file informations, fields read) 
    6061 
    6162   LOGICAL  ::  ln_iceini        ! initialization or not 
     
    7475      !! ** Purpose :   defined the sea-ice initial state 
    7576      !! 
    76       !! ** Method  :    
    77       !!                This routine will put some ice where ocean 
     77      !! ** Method  :   This routine will put some ice where ocean 
    7878      !!                is at the freezing point, then fill in ice  
    7979      !!                state variables using prescribed initial  
    8080      !!                values in the namelist             
    8181      !! 
    82       !! ** Steps   :    
    83       !!                1) Read namelist 
     82      !! ** Steps   :   1) Read namelist 
    8483      !!                2) Basal temperature; ice and hemisphere masks 
    8584      !!                3) Fill in the ice thickness distribution using gaussian 
     
    9695      !!   4.0  !  09-11  (M. Vancoppenolle)   Enhanced version for ice cats 
    9796      !!-------------------------------------------------------------------- 
    98  
    99       !! * Local variables 
    100       INTEGER    :: ji, jj, jk, jl             ! dummy loop indices 
    101       REAL(wp)   :: ztmelts, zdh 
    102       INTEGER    :: i_hemis, i_fill, jl0   
     97      INTEGER  :: ji, jj, jk, jl   ! dummy loop indices 
     98      REAL(wp) :: ztmelts, zdh 
     99      INTEGER  :: i_hemis, i_fill, jl0   
    103100      REAL(wp)   :: ztest_1, ztest_2, ztest_3, ztest_4, ztests, zsigma, zarg, zA, zV, zA_cons, zV_cons, zconv  
    104101      REAL(wp), POINTER, DIMENSION(:,:)   :: zswitch    ! ice indicator 
     
    108105      !-------------------------------------------------------------------- 
    109106 
    110       CALL wrk_alloc( jpi, jpj, jpl, zh_i_ini,  za_i_ini,  zv_i_ini ) 
    111       CALL wrk_alloc( jpi, jpj,      zht_i_ini, zat_i_ini, zvt_i_ini, zts_u_ini, zht_s_ini, zsm_i_ini, ztm_i_ini ) 
    112       CALL wrk_alloc( jpi, jpj,      zswitch ) 
     107      CALL wrk_alloc( jpi,jpj,jpl,  zh_i_ini,  za_i_ini,  zv_i_ini ) 
     108      CALL wrk_alloc( jpi,jpj,       zht_i_ini, zat_i_ini, zvt_i_ini, zts_u_ini, zht_s_ini, zsm_i_ini, ztm_i_ini ) 
     109      CALL wrk_alloc( jpi,jpj,       zswitch ) 
    113110 
    114111      IF(lwp) WRITE(numout,*) 
    115       IF(lwp) WRITE(numout,*) 'lim_istate : Ice initialization ' 
    116       IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' 
     112      IF(lwp) WRITE(numout,*) 'lim_istate : sea-ice initialization ' 
     113      IF(lwp) WRITE(numout,*) '~~~~~~~~~~ ' 
    117114 
    118115      !-------------------------------------------------------------------- 
    119116      ! 1) Read namelist 
    120117      !-------------------------------------------------------------------- 
    121  
     118      ! 
    122119      CALL lim_istate_init     !  reading the initials parameters of the ice 
    123120 
     
    134131 
    135132      IF( ln_iceini ) THEN 
    136  
     133         ! 
    137134         !-------------------------------------------------------------------- 
    138135         ! 2) Basal temperature, ice mask and hemispheric index 
    139136         !-------------------------------------------------------------------- 
    140  
     137         ! 
    141138         DO jj = 1, jpj                                       ! ice if sst <= t-freez + ttest 
    142139            DO ji = 1, jpi 
     
    153150         !-------------------------------------------------------------------- 
    154151         IF( ln_iceini_file )THEN 
    155  
     152            ! 
    156153            zht_i_ini(:,:)  = si(jp_hti)%fnow(:,:,1) 
    157154            zht_s_ini(:,:)  = si(jp_hts)%fnow(:,:,1) 
     
    160157            ztm_i_ini(:,:)  = si(jp_tmi)%fnow(:,:,1) 
    161158            zsm_i_ini(:,:)  = si(jp_smi)%fnow(:,:,1) 
    162  
     159            ! 
    163160         ELSE ! ln_iceini_file = F 
    164  
     161            ! 
    165162            !----------------------------- 
    166163            ! 3.1) Hemisphere-dependent arrays 
     
    186183               END DO 
    187184            END DO 
    188  
     185            ! 
    189186         ENDIF ! ln_iceini_file 
    190187 
     
    200197         za_i_ini(:,:,:) = 0._wp 
    201198         zv_i_ini(:,:,:) = 0._wp 
    202  
     199         ! 
    203200         DO jj = 1, jpj 
    204201            DO ji = 1, jpi 
    205  
     202               ! 
    206203               IF( zat_i_ini(ji,jj) > 0._wp .AND. zht_i_ini(ji,jj) > 0._wp )THEN 
    207  
    208                   ztest_1 = 0 ; ztest_2 = 0 ; ztest_3 = 0 ; ztest_4 = 0 
     204                  ! 
     205                  ztest_1 = 0   ;   ztest_2 = 0   ;   ztest_3 = 0   ;  ztest_4 = 0 
    209206!                  ztests  = 0  
    210  
     207                  ! 
    211208                  DO i_fill = jpl, 1, -1 
    212  
    213 !                     IF( ztests .NE. 4 ) THEN 
    214                      IF ( ( ztest_1 + ztest_2 + ztest_3 + ztest_4 ) .NE. 4 ) THEN 
     209                     ! 
     210!                     IF( ztests /= 4 ) THEN 
     211                     IF ( ( ztest_1 + ztest_2 + ztest_3 + ztest_4 ) /= 4 ) THEN 
    215212                        !---------------------------- 
    216213                        ! fill the i_fill categories 
     
    223220                           za_i_ini(ji,jj,2:jpl)   = 0._wp 
    224221                        ELSE 
    225  
     222                           ! 
    226223                           ! *** >1 categores to fill 
    227224                           !--- Ice thicknesses in the i_fill - 1 first categories 
     
    229226                              zh_i_ini(ji,jj,jl) = hi_mean(jl) 
    230227                           END DO 
    231                 
     228                           ! 
    232229                           !--- jl0: most likely index where cc will be maximum 
    233230                           DO jl = 1, jpl 
     
    238235                           END DO 
    239236                           jl0 = MIN(jl0, i_fill) 
    240                 
     237                           ! 
    241238                           !--- Concentrations 
    242239                           za_i_ini(ji,jj,jl0) = zat_i_ini(ji,jj) / SQRT(REAL(jpl)) 
    243240                           DO jl = 1, i_fill - 1 
    244                               IF( jl .NE. jl0 )THEN 
     241                              IF( jl /= jl0 )THEN 
    245242                                 zsigma             = 0.5 * zht_i_ini(ji,jj) 
    246243                                 zarg               = ( zh_i_ini(ji,jj,jl) - zht_i_ini(ji,jj) ) / zsigma 
     
    248245                              ENDIF 
    249246                           END DO 
    250                 
     247                           ! 
    251248                           zA = 0. ! sum of the areas in the jpl categories  
    252249                           DO jl = 1, i_fill - 1 
     
    254251                           END DO 
    255252                           za_i_ini(ji,jj,i_fill)   = zat_i_ini(ji,jj) - zA ! ice conc in the last category 
    256                            IF ( i_fill .LT. jpl ) za_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
    257           
     253                           IF ( i_fill < jpl ) za_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
     254                           ! 
    258255                           !--- Ice thickness in the last category 
    259256                           zV = 0. ! sum of the volumes of the N-1 categories 
     
    262259                           END DO 
    263260                           zh_i_ini(ji,jj,i_fill) = ( zvt_i_ini(ji,jj) - zV ) / za_i_ini(ji,jj,i_fill)  
    264                            IF ( i_fill .LT. jpl ) zh_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
    265  
     261                           IF ( i_fill < jpl ) zh_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
     262                           ! 
    266263                           !--- volumes 
    267264                           zv_i_ini(ji,jj,:) = za_i_ini(ji,jj,:) * zh_i_ini(ji,jj,:) 
    268                            IF ( i_fill .LT. jpl ) zv_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
    269  
     265                           IF ( i_fill < jpl ) zv_i_ini(ji,jj,i_fill+1:jpl) = 0._wp 
     266                           ! 
    270267                        ENDIF ! i_fill 
    271  
     268                        ! 
    272269                        !--------------------- 
    273270                        ! Compatibility tests 
     
    275272                        ! Test 1: area conservation 
    276273                        zA_cons = SUM(za_i_ini(ji,jj,:)) ; zconv = ABS(zat_i_ini(ji,jj) - zA_cons ) 
    277                         IF ( zconv .LT. 1.0e-6 ) THEN 
    278                            ztest_1 = 1 
    279                         ELSE  
    280                           ztest_1 = 0 
     274                        IF( zconv < 1.0e-6 ) THEN   ;   ztest_1 = 1. 
     275                        ELSE                        ;   ztest_1 = 0. 
    281276                        ENDIF 
    282  
     277                        ! 
    283278                        ! Test 2: volume conservation 
    284279                        zV_cons = SUM(zv_i_ini(ji,jj,:)) 
    285                         zconv = ABS(zvt_i_ini(ji,jj) - zV_cons) 
    286  
    287                         IF( zconv .LT. 1.0e-6 ) THEN 
    288                            ztest_2 = 1 
    289                         ELSE 
    290                            ztest_2 = 0 
     280                        zconv   = ABS(zvt_i_ini(ji,jj) - zV_cons) 
     281                        IF( zconv < 1.0e-6 ) THEN   ;   ztest_2 = 1. 
     282                        ELSE                        ;   ztest_2 = 0. 
    291283                        ENDIF 
    292  
     284                        ! 
    293285                        ! Test 3: thickness of the last category is in-bounds ? 
    294                         IF ( zh_i_ini(ji,jj,i_fill) > hi_max(i_fill-1) ) THEN 
    295                            ztest_3 = 1 
    296                         ELSE 
    297                            ztest_3 = 0 
     286                        IF( zh_i_ini(ji,jj,i_fill) > hi_max(i_fill-1) ) THEN   ;   ztest_3 = 1. 
     287                        ELSE                                                   ;   ztest_3 = 0. 
    298288                        ENDIF 
    299  
     289                        ! 
    300290                        ! Test 4: positivity of ice concentrations 
    301291                        ztest_4 = 1 
    302292                        DO jl = 1, jpl 
    303                            IF ( za_i_ini(ji,jj,jl) .LT. 0._wp ) THEN  
    304                               ztest_4 = 0 
    305                            ENDIF 
     293                           IF( za_i_ini(ji,jj,jl) < 0._wp )   ztest_4 = 0 
    306294                        END DO 
    307  
     295                        ! 
    308296                     ENDIF ! ztest_1 + ztest_2 + ztest_3 + ztest_4 
    309   
     297                     ! 
    310298                     ztests = ztest_1 + ztest_2 + ztest_3 + ztest_4 
    311  
     299                     ! 
    312300                  END DO ! i_fill 
    313  
     301                  ! 
    314302                  IF(lwp) THEN  
    315                      WRITE(numout,*) ' ztests : ', ztests 
    316                      IF( ztests .NE. 4 )THEN 
     303                     IF( ztests /= 4 ) THEN 
    317304                        WRITE(numout,*) 
    318305                        WRITE(numout,*) ' !!!! ALERT                  !!! ' 
    319306                        WRITE(numout,*) ' !!!! Something is wrong in the LIM3 initialization procedure ' 
    320307                        WRITE(numout,*) 
    321                         WRITE(numout,*) ' *** ztests is not equal to 4 ' 
     308                        WRITE(numout,*) ' *** ztests is not equal to 4 :   ztests : ', ztests 
    322309                        WRITE(numout,*) ' *** ztest_i (i=1,4) = ', ztest_1, ztest_2, ztest_3, ztest_4 
    323310                        WRITE(numout,*) ' zat_i_ini : ', zat_i_ini(ji,jj) 
    324311                        WRITE(numout,*) ' zht_i_ini : ', zht_i_ini(ji,jj) 
    325                      ENDIF ! ztests .NE. 4 
     312                     ENDIF ! ztests /= 4 
    326313                  ENDIF 
    327        
     314                  ! 
    328315               ENDIF !  zat_i_ini(ji,jj) > 0._wp .AND. zhm_i_ini(ji,jj) > 0._wp 
    329  
    330             ENDDO    
    331          ENDDO    
     316               ! 
     317            END DO    
     318         END DO    
    332319 
    333320         !--------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.