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 6853 for branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/LIM_SRC_3/limvar.F90 – NEMO

Ignore:
Timestamp:
2016-08-08T11:02:18+02:00 (8 years ago)
Author:
clem
Message:

correct bugs on LIM3 rheology and outputs. Make sure the ice thickness distribution (used in initialization and bdy boundary conditions) is a gaussian.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2016/dev_v3_6_STABLE_r6506_AGRIF_LIM3/NEMOGCM/NEMO/LIM_SRC_3/limvar.F90

    r6746 r6853  
    636636      INTEGER  :: ji, jk, jl             ! dummy loop indices 
    637637      INTEGER  :: ijpij, i_fill, jl0   
    638       REAL(wp) :: zarg, zV, zconv, zdh 
     638      REAL(wp) :: zarg, zV, zconv, zdh, zdv 
    639639      REAL(wp), DIMENSION(:),   INTENT(in)    ::   zhti, zhts, zai    ! input ice/snow variables 
    640640      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   zht_i, zht_s, za_i ! output ice/snow variables 
    641641      INTEGER , POINTER, DIMENSION(:)         ::   itest 
    642642  
    643       CALL wrk_alloc( 4, itest ) 
     643      Call wrk_alloc( 4, itest ) 
    644644      !-------------------------------------------------------------------- 
    645645      ! initialisation of variables 
     
    657657         IF( zhti(ji) > 0._wp ) THEN 
    658658 
    659          ! initialisation of tests 
    660          itest(:)  = 0 
     659            ! find which category (jl0) the input ice thickness falls into 
     660            jl0 = jpl 
     661            DO jl = 1, jpl 
     662               IF ( ( zhti(ji) >= hi_max(jl-1) ) .AND. ( zhti(ji) < hi_max(jl) ) ) THEN 
     663                  jl0 = jl 
     664                  CYCLE 
     665               ENDIF 
     666            END DO 
     667 
     668            ! initialisation of tests 
     669            itest(:)  = 0 
    661670          
    662          i_fill = jpl + 1                                             !==================================== 
    663          DO WHILE ( ( SUM( itest(:) ) /= 4 ) .AND. ( i_fill >= 2 ) )  ! iterative loop on i_fill categories   
    664             ! iteration                                               !==================================== 
    665             i_fill = i_fill - 1 
     671            i_fill = jpl + 1                                             !==================================== 
     672            DO WHILE ( ( SUM( itest(:) ) /= 4 ) .AND. ( i_fill >= 2 ) )  ! iterative loop on i_fill categories 
     673               ! iteration                                               !==================================== 
     674               i_fill = i_fill - 1 
     675                
     676               ! initialisation of ice variables for each try 
     677               zht_i(ji,1:jpl) = 0._wp 
     678               za_i (ji,1:jpl) = 0._wp 
     679               itest(:)        = 0            
     680                
     681               ! *** case very thin ice: fill only category 1 
     682               IF ( i_fill == 1 ) THEN 
     683                  zht_i(ji,1) = zhti(ji) 
     684                  za_i (ji,1) = zai (ji) 
     685                   
     686               ! *** case ice is thicker: fill categories >1 
     687               ELSE 
     688 
     689                  ! Fill ice thicknesses in the (i_fill-1) cat by hmean  
     690                  DO jl = 1, i_fill - 1 
     691                     zht_i(ji,jl) = hi_mean(jl) 
     692                  END DO 
     693                   
     694                  ! Concentrations in the (i_fill-1) categories  
     695                  za_i(ji,jl0) = zai(ji) / SQRT(REAL(jpl)) 
     696                  DO jl = 1, i_fill - 1 
     697                     IF ( jl /= jl0 ) THEN 
     698                        zarg        = ( zht_i(ji,jl) - zhti(ji) ) / ( zhti(ji) * 0.5_wp ) 
     699                        za_i(ji,jl) =   za_i (ji,jl0) * EXP(-zarg**2) 
     700                     ENDIF 
     701                  END DO 
     702                   
     703                  ! Concentration in the last (i_fill) category 
     704                  za_i(ji,i_fill) = zai(ji) - SUM( za_i(ji,1:i_fill-1) ) 
     705                   
     706                  ! Ice thickness in the last (i_fill) category 
     707                  zV = SUM( za_i(ji,1:i_fill-1) * zht_i(ji,1:i_fill-1) ) 
     708                  zht_i(ji,i_fill) = ( zhti(ji) * zai(ji) - zV ) / MAX( za_i(ji,i_fill), epsi10 )  
     709                   
     710                  ! clem: correction if concentration of upper cat is greater than lower cat 
     711                  !       (it should be a gaussian around jl0 but sometimes it is not) 
     712                  IF ( jl0 /= jpl ) THEN 
     713                     DO jl = jpl, jl0+1, -1 
     714                        IF ( za_i(ji,jl) > za_i(ji,jl-1) ) THEN 
     715                           zdv = zht_i(ji,jl) * za_i(ji,jl) 
     716                           zht_i(ji,jl    ) = 0._wp 
     717                           za_i (ji,jl    ) = 0._wp 
     718                           za_i (ji,1:jl-1) = za_i(ji,1:jl-1) + zdv / MAX( REAL(jl-1) * zhti(ji), epsi10 ) 
     719                        END IF 
     720                     ENDDO 
     721                  ENDIF 
     722                
     723               ENDIF ! case ice is thick or thin 
     724                
     725               !--------------------- 
     726               ! Compatibility tests 
     727               !---------------------  
     728               ! Test 1: area conservation 
     729               zconv = ABS( zai(ji) - SUM( za_i(ji,1:jpl) ) ) 
     730               IF ( zconv < epsi06 ) itest(1) = 1 
    666731             
    667             ! initialisation of ice variables for each try 
    668             zht_i(ji,1:jpl) = 0._wp 
    669             za_i (ji,1:jpl) = 0._wp 
    670              
    671             ! *** case very thin ice: fill only category 1 
    672             IF ( i_fill == 1 ) THEN 
    673                zht_i(ji,1) = zhti(ji) 
    674                za_i (ji,1) = zai (ji) 
    675  
    676             ! *** case ice is thicker: fill categories >1 
    677             ELSE 
    678  
    679                ! Fill ice thicknesses except the last one (i_fill) by hmean  
    680                DO jl = 1, i_fill - 1 
    681                   zht_i(ji,jl) = hi_mean(jl) 
    682                END DO 
     732               ! Test 2: volume conservation 
     733               zconv = ABS( zhti(ji)*zai(ji) - SUM( za_i(ji,1:jpl)*zht_i(ji,1:jpl) ) ) 
     734               IF ( zconv < epsi06 ) itest(2) = 1 
    683735                
    684                ! find which category (jl0) the input ice thickness falls into 
    685                jl0 = i_fill 
     736               ! Test 3: thickness of the last category is in-bounds ? 
     737               IF ( zht_i(ji,i_fill) >= hi_max(i_fill-1) ) itest(3) = 1 
     738                
     739               ! Test 4: positivity of ice concentrations 
     740               itest(4) = 1 
    686741               DO jl = 1, i_fill 
    687                   IF ( ( zhti(ji) >= hi_max(jl-1) ) .AND. ( zhti(ji) < hi_max(jl) ) ) THEN 
    688                      jl0 = jl 
    689            CYCLE 
    690                   ENDIF 
    691                END DO 
    692                 
    693                ! Concentrations in the (i_fill-1) categories  
    694                za_i(ji,jl0) = zai(ji) / SQRT(REAL(jpl)) 
    695                DO jl = 1, i_fill - 1 
    696                   IF ( jl == jl0 ) CYCLE 
    697                   zarg        = ( zht_i(ji,jl) - zhti(ji) ) / ( zhti(ji) * 0.5_wp ) 
    698                   za_i(ji,jl) =   za_i (ji,jl0) * EXP(-zarg**2) 
    699                END DO 
    700                 
    701                ! Concentration in the last (i_fill) category 
    702                za_i(ji,i_fill) = zai(ji) - SUM( za_i(ji,1:i_fill-1) ) 
    703                 
    704                ! Ice thickness in the last (i_fill) category 
    705                zV = SUM( za_i(ji,1:i_fill-1) * zht_i(ji,1:i_fill-1) ) 
    706                zht_i(ji,i_fill) = ( zhti(ji) * zai(ji) - zV ) / za_i(ji,i_fill)  
    707                 
    708             ENDIF ! case ice is thick or thin 
    709              
    710             !--------------------- 
    711             ! Compatibility tests 
    712             !---------------------  
    713             ! Test 1: area conservation 
    714             zconv = ABS( zai(ji) - SUM( za_i(ji,1:jpl) ) ) 
    715             IF ( zconv < epsi06 ) itest(1) = 1 
    716              
    717             ! Test 2: volume conservation 
    718             zconv = ABS( zhti(ji)*zai(ji) - SUM( za_i(ji,1:jpl)*zht_i(ji,1:jpl) ) ) 
    719             IF ( zconv < epsi06 ) itest(2) = 1 
    720              
    721             ! Test 3: thickness of the last category is in-bounds ? 
    722             IF ( zht_i(ji,i_fill) >= hi_max(i_fill-1) ) itest(3) = 1 
    723              
    724             ! Test 4: positivity of ice concentrations 
    725             itest(4) = 1 
    726             DO jl = 1, i_fill 
    727                IF ( za_i(ji,jl) < 0._wp ) itest(4) = 0 
    728             END DO             
    729                                                            !============================ 
    730          END DO                                            ! end iteration on categories 
    731                                                            !============================ 
     742                  IF ( za_i(ji,jl) < 0._wp ) itest(4) = 0 
     743               END DO 
     744               !                                         !============================ 
     745            END DO                                       ! end iteration on categories 
     746               !                                         !============================ 
    732747         ENDIF ! if zhti > 0 
    733748      END DO ! i loop 
    734  
     749       
    735750      ! ------------------------------------------------ 
    736751      ! Adding Snow in each category where za_i is not 0 
Note: See TracChangeset for help on using the changeset viewer.