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 8500 for branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/iceadv.F90 – NEMO

Ignore:
Timestamp:
2017-09-06T12:01:34+02:00 (7 years ago)
Author:
clem
Message:

changes in style - part3 - move output into proper files and correct a bug in debug mode

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r8183_ICEMODEL/NEMOGCM/NEMO/LIM_SRC_3/iceadv.F90

    r8486 r8500  
    2929   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    3030   USE timing         ! Timing 
     31   USE iom            ! 
    3132 
    3233   IMPLICIT NONE 
     
    6869      ! 
    6970      REAL(wp) ::    zvi_b, zsmv_b, zei_b, zfs_b, zfw_b, zft_b 
    70       REAL(wp) ::    zdv, zda 
     71      REAL(wp) ::    zdv 
    7172      REAL(wp), DIMENSION(jpi,jpj)           ::   zatold, zeiold, zesold, zsmvold  
    7273      REAL(wp), DIMENSION(jpi,jpj,jpl)       ::   zhimax, zviold, zvsold 
     
    8081      ! MV MP 2016 
    8182      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   ::   z0ap , z0vp 
    82       REAL(wp) ::   za_old 
    8383      ! END MV MP 2016 
    8484      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   z0ei 
     
    111111      !--- Thickness correction init. --- ! 
    112112      zatold(:,:) = at_i 
    113       DO jl = 1, jpl 
    114          DO jj = 1, jpj 
    115             DO ji = 1, jpi 
    116                rswitch          = MAX( 0._wp , SIGN( 1._wp, a_i(ji,jj,jl) - epsi20 ) ) 
    117                ht_i  (ji,jj,jl) = v_i (ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi20 ) * rswitch 
    118                ht_s  (ji,jj,jl) = v_s (ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi20 ) * rswitch 
    119             END DO 
    120          END DO 
    121       END DO 
     113      WHERE( a_i(:,:,:) >= epsi20 ) 
     114         ht_i(:,:,:) = v_i(:,:,:) / a_i(:,:,:) 
     115         ht_s(:,:,:) = v_s(:,:,:) / a_i(:,:,:) 
     116      ELSEWHERE 
     117         ht_i(:,:,:) = 0._wp 
     118         ht_s(:,:,:) = 0._wp          
     119      END WHERE 
     120          
    122121      ! --- Record max of the surrounding ice thicknesses for correction in case advection creates ice too thick --- ! 
    123122      zhimax(:,:,:) = ht_i(:,:,:) + ht_s(:,:,:) 
     
    126125            DO ji = 2, jpim1 
    127126!!gm use of MAXVAL here is very probably less efficient than expending the 9 values 
    128                zhimax(ji,jj,jl) = MAXVAL( ht_i(ji-1:ji+1,jj-1:jj+1,jl) + ht_s(ji-1:ji+1,jj-1:jj+1,jl) ) 
     127               zhimax(ji,jj,jl) = MAX( epsi20, MAXVAL( ht_i(ji-1:ji+1,jj-1:jj+1,jl) + ht_s(ji-1:ji+1,jj-1:jj+1,jl) ) ) 
    129128            END DO 
    130129         END DO 
     
    399398         END DO 
    400399      END DO 
    401        
    402       IF( nn_limdyn == 2) THEN 
     400      IF( iom_use('icetrp') )   CALL iom_put( "icetrp" , diag_trp_vi * rday  )         ! ice volume transport 
     401      IF( iom_use('snwtrp') )   CALL iom_put( "snwtrp" , diag_trp_vs * rday  )         ! snw volume transport 
     402      IF( iom_use('saltrp') )   CALL iom_put( "saltrp" , diag_trp_smv * rday * rhoic ) ! salt content transport 
     403      IF( iom_use('deitrp') )   CALL iom_put( "deitrp" , diag_trp_ei         )         ! advected ice enthalpy (W/m2) 
     404      IF( iom_use('destrp') )   CALL iom_put( "destrp" , diag_trp_es         )         ! advected snw enthalpy (W/m2) 
     405       
     406      IF( nn_limdyn == 2 ) THEN 
    403407         ! 
    404408         CALL ice_var_zapsmall      !--- zap small areas ---! 
     
    407411            DO jj = 1, jpj 
    408412               DO ji = 1, jpi 
    409                   !  
    410413                  IF ( v_i(ji,jj,jl) > 0._wp ) THEN 
    411414                     ! 
    412                      rswitch          = MAX( 0._wp , SIGN( 1._wp, a_i(ji,jj,jl) - epsi20 ) ) 
    413                      ht_i  (ji,jj,jl) = v_i (ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi20 ) * rswitch 
    414                      ht_s  (ji,jj,jl) = v_s (ji,jj,jl) / MAX( a_i(ji,jj,jl) , epsi20 ) * rswitch 
    415                      ! 
    416                      zdv  = v_i(ji,jj,jl) + v_s(ji,jj,jl) - zviold(ji,jj,jl) - zvsold(ji,jj,jl)   
     415                     ht_i  (ji,jj,jl) = v_i (ji,jj,jl) / a_i(ji,jj,jl) 
     416                     ht_s  (ji,jj,jl) = v_s (ji,jj,jl) / a_i(ji,jj,jl) 
     417                     zdv = v_i(ji,jj,jl) + v_s(ji,jj,jl) - zviold(ji,jj,jl) - zvsold(ji,jj,jl)   
    417418                     ! 
    418419                     IF ( ( zdv >  0.0 .AND. (ht_i(ji,jj,jl)+ht_s(ji,jj,jl)) > zhimax(ji,jj,jl) .AND. zatold(ji,jj) < 0.80 ) .OR. & 
    419420                        & ( zdv <= 0.0 .AND. (ht_i(ji,jj,jl)+ht_s(ji,jj,jl)) > zhimax(ji,jj,jl) ) ) THEN 
    420                         ! 
    421                         rswitch        = MAX( 0._wp, SIGN( 1._wp, zhimax(ji,jj,jl) - epsi20 ) ) 
    422                         a_i(ji,jj,jl)  = rswitch * ( v_i(ji,jj,jl) + v_s(ji,jj,jl) ) / MAX( zhimax(ji,jj,jl), epsi20 ) 
    423                         ! 
    424                         ! small correction due to *rswitch for a_i 
    425                         v_i  (ji,jj,jl)        = rswitch * v_i  (ji,jj,jl) 
    426                         v_s  (ji,jj,jl)        = rswitch * v_s  (ji,jj,jl) 
    427                         smv_i(ji,jj,jl)        = rswitch * smv_i(ji,jj,jl) 
    428                         e_s(ji,jj,1,jl)        = rswitch * e_s(ji,jj,1,jl) 
    429                         e_i(ji,jj,1:nlay_i,jl) = rswitch * e_i(ji,jj,1:nlay_i,jl) 
    430  
    431                         ! MV MP 2016 
    432                         IF ( nn_pnd_scheme > 0 ) THEN 
    433                            a_ip (ji,jj,jl)        = rswitch * a_ip (ji,jj,jl) 
    434                            v_ip (ji,jj,jl)        = rswitch * v_ip (ji,jj,jl) 
    435                         ENDIF 
    436                         ! END MV MP 2016 
    437                         ! 
     421                        a_i (ji,jj,jl) = ( v_i(ji,jj,jl) + v_s(ji,jj,jl) ) / zhimax(ji,jj,jl) 
     422                        ht_i(ji,jj,jl) =   v_i(ji,jj,jl) / a_i(ji,jj,jl) 
    438423                     ENDIF 
    439424                     ! 
    440425                  ENDIF 
    441                   ! 
    442426               END DO 
    443427            END DO 
    444428         END DO 
    445           
    446          DO jj = 1, jpj             !--- bound ht_i to hi_max (99 m). 
    447             DO ji = 1, jpi 
    448                ! MV MP 2016 
    449                za_old = a_i(ji,jj,jpl) 
    450                ! END MV MP 2016 
    451                rswitch         = MAX( 0._wp , SIGN( 1._wp, ht_i(ji,jj,jpl) - epsi20 ) ) 
    452                ht_i(ji,jj,jpl) = MIN( ht_i(ji,jj,jpl) , hi_max(jpl) ) 
    453                a_i (ji,jj,jpl) = v_i(ji,jj,jpl) / MAX( ht_i(ji,jj,jpl) , epsi20 ) * rswitch 
    454                ! MV MP 2016 
    455                IF ( nn_pnd_scheme > 0 ) THEN 
    456                   ! correct pond fraction to avoid a_ip > a_i 
    457                   a_ip(ji,jj,jpl) = a_ip(ji,jj,jpl) * a_i(ji,jj,jpl) / MAX( za_old , epsi20 ) * rswitch 
    458                ENDIF 
    459                ! END MP 2016 
    460             END DO 
    461          END DO 
     429                   
     430         WHERE( ht_i(:,:,jpl) > hi_max(jpl) )             !--- bound ht_i to hi_max (99 m) 
     431            ht_i(:,:,jpl) = hi_max(jpl) 
     432            a_i (:,:,jpl) = v_i(:,:,jpl) / hi_max(jpl) 
     433         END WHERE 
     434 
     435         IF ( nn_pnd_scheme > 0 ) THEN                    !--- correct pond fraction to avoid a_ip > a_i 
     436            WHERE( a_ip(:,:,:) > a_i(:,:,:) )   a_ip(:,:,:) = a_i(:,:,:) 
     437         ENDIF 
    462438         ! 
    463439      ENDIF 
     
    467443      !------------------------------------------------------------ 
    468444      ! 
    469 !!gm remplace the test by, l_piling a logical compute one for all in icestp.F90 (and its declaration in ice.F90 
    470 !!gm      IF ( nn_limdyn == 1 .OR. ( ( nn_monocat == 2 ) .AND. ( jpl == 1 ) ) ) THEN ! simple conservative piling, comparable with LIM2 
    471       IF( l_piling ) THEN 
     445      IF( l_piling ) THEN ! simple conservative piling, comparable with 1-cat models 
    472446         at_i(:,:) = SUM( a_i(:,:,:), dim=3 ) 
    473447         DO jl = 1, jpl 
    474             DO jj = 1, jpj 
    475                DO ji = 1, jpi 
    476                   rswitch = MAX( 0._wp, SIGN( 1._wp, at_i(ji,jj) - epsi20 ) ) 
    477                   zda     = rswitch * MIN( rn_amax_2d(ji,jj) - at_i(ji,jj), 0._wp ) * a_i(ji,jj,jl) / MAX( at_i(ji,jj), epsi20 ) 
    478                   a_i(ji,jj,jl) = a_i(ji,jj,jl) + zda 
    479                END DO 
    480             END DO 
    481          END DO 
    482 !!gm better and faster coding? 
    483 !         DO jl = 1, jpl 
    484 !            WHERE( at_i(:,:) > epsi20 ) 
    485 !               a_i(:,:,jl) = a_i(:,:,jl) * (  1._wp + MIN( rn_amax_2d(:,:) - at_i(:,:) , 0._wp ) / at_i(:,:)  ) 
    486 !            END WHERE 
    487 !         END DO 
    488 !!gm end 
     448            WHERE( at_i(:,:) > epsi20 ) 
     449               a_i(:,:,jl) = a_i(:,:,jl) * (  1._wp + MIN( rn_amax_2d(:,:) - at_i(:,:) , 0._wp ) / at_i(:,:)  ) 
     450            END WHERE 
     451         END DO 
    489452      ENDIF 
    490453       
Note: See TracChangeset for help on using the changeset viewer.