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 3938 for branches/2013/dev_r3406_CNRS_LIM3/NEMOGCM/NEMO/LIM_SRC_3/limthd_lac.F90 – NEMO

Ignore:
Timestamp:
2013-06-26T09:54:16+02:00 (11 years ago)
Author:
flavoni
Message:

dev_r3406_CNRS_LIM3: update LIM3, see ticket #1116

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_r3406_CNRS_LIM3/NEMOGCM/NEMO/LIM_SRC_3/limthd_lac.F90

    r3294 r3938  
    2929   USE lib_mpp          ! MPP library 
    3030   USE wrk_nemo         ! work arrays 
     31   USE lib_fortran      ! to use key_nosignedzero 
    3132 
    3233   IMPLICIT NONE 
     
    159160                  !Energy of melting q(S,T) [J.m-3] 
    160161                  e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl) / & 
    161                      MAX( area(ji,jj) * v_i(ji,jj,jl) ,  epsi10 ) * & 
    162                      nlay_i 
     162                     MAX( area(ji,jj) * v_i(ji,jj,jl) ,  epsi10 ) * REAL( nlay_i ) 
    163163                  zindb      = 1.0-MAX(0.0,SIGN(1.0,-v_i(ji,jj,jl))) !0 if no ice and 1 if yes 
    164164                  e_i(ji,jj,jk,jl) = e_i(ji,jj,jk,jl)*unit_fac*zindb 
     
    185185 
    186186      ! Default new ice thickness  
    187       DO jj = 1, jpj 
    188          DO ji = 1, jpi 
    189             hicol(ji,jj) = hiccrit(1) 
    190          END DO 
    191       END DO 
     187      hicol(:,:) = hiccrit(1) 
    192188 
    193189      IF (fraz_swi.eq.1.0) THEN 
     
    335331         CALL tab_2d_1d( nbpac, zvrel_ac  (1:nbpac)     , zvrel ,              & 
    336332            jpi, jpj, npac(1:nbpac) ) 
     333         CALL tab_2d_1d( nbpac, rdmicif_1d  (1:nbpac)   , rdmicif, jpi, jpj, npac(1:nbpac) ) !martin 
    337334 
    338335         !------------------------------------------------------------------------------! 
     
    410407            zdh_frazb(ji) = zfrazb*zv_newice(ji) 
    411408            zv_newice(ji) = ( 1.0 - zfrazb ) * zv_newice(ji) 
     409            ! 
     410!clem@mv            rdmicif_1d(ji) = rdmicif_1d(ji) + zv_newice(ji) * rhoic  !martin 
    412411         END DO 
    413412 
     
    415414         ! Salt flux due to new ice growth 
    416415         !--------------------------------- 
    417          IF ( ( num_sal .EQ. 4 ) ) THEN  
    418             DO ji = 1, nbpac 
    419                zji            = MOD( npac(ji) - 1, jpi ) + 1 
    420                zjj            = ( npac(ji) - 1 ) / jpi + 1 
    421                fseqv_1d(ji)   = fseqv_1d(ji) +                                     & 
    422                   ( sss_m(zji,zjj) - bulk_sal      ) * rhoic *       & 
    423                   zv_newice(ji) / rdt_ice 
    424             END DO 
    425          ELSE 
    426             DO ji = 1, nbpac 
    427                zji            = MOD( npac(ji) - 1, jpi ) + 1 
    428                zjj            = ( npac(ji) - 1 ) / jpi + 1 
    429                fseqv_1d(ji)   = fseqv_1d(ji) +                                     & 
    430                   ( sss_m(zji,zjj) - zs_newice(ji) ) * rhoic *       & 
    431                   zv_newice(ji) / rdt_ice 
    432             END DO ! ji 
    433          ENDIF 
     416!clem@mv         IF ( ( num_sal .EQ. 4 ) ) THEN  
     417!clem@mv            DO ji = 1, nbpac 
     418!clem@mv               ! IOVINO 
     419!clem@mv               fseqv_1d(ji)   = fseqv_1d(ji) - bulk_sal * rhoic *  & 
     420!clem@mv                  zv_newice(ji) / rdt_ice 
     421!clem@mv            END DO 
     422!clem@mv         ELSE 
     423!clem@mv            DO ji = 1, nbpac 
     424!clem@mv               ! IOVINO 
     425!clem@mv               fseqv_1d(ji)   = fseqv_1d(ji)  - zs_newice(ji) * rhoic *   & 
     426!clem@mv                  zv_newice(ji) / rdt_ice 
     427!clem@mv            END DO ! ji 
     428!clem@mv         ENDIF 
    434429 
    435430         !------------------------------------ 
     
    460455            zjj                  = ( npac(ji) - 1 ) / jpi + 1 
    461456            diag_lat_gr(zji,zjj) = zv_newice(ji) / rdt_ice 
    462          END DO !ji 
     457          END DO !ji 
    463458 
    464459         !------------------------------------------------------------------------------! 
     
    480475         DO ji = 1, nbpac 
    481476            ! vectorize 
    482             IF ( za_newice(ji) .GT. ( 1.0 - zat_i_ac(ji) ) ) THEN 
    483                zda_res(ji)    = za_newice(ji) - (1.0 - zat_i_ac(ji) ) 
     477            IF ( za_newice(ji) .GT. ( amax - zat_i_ac(ji) ) ) THEN 
     478               zda_res(ji)    = za_newice(ji) - ( amax - zat_i_ac(ji) ) 
    484479               zdv_res(ji)    = zda_res(ji) * zh_newice(ji)  
    485480               za_newice(ji)  = za_newice(ji) - zda_res(ji) 
    486481               zv_newice(ji)  = zv_newice(ji) - zdv_res(ji) 
    487             ELSE 
     482           ELSE 
    488483               zda_res(ji) = 0.0 
    489484               zdv_res(ji) = 0.0 
     
    512507         DO ji = 1, nbpac 
    513508            jl = zcatac(ji)                                                           ! categroy in which new ice is put 
    514             zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp , -za_old(ji,jl) ) )             ! zindb=1 if ice =0 otherwise 
     509            zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp , -za_old(ji,jl) + epsi10 ) )             ! zindb=1 if ice =0 otherwise 
    515510            zhice_old(ji,jl) = zv_old(ji,jl) / MAX( za_old(ji,jl) , epsi10 ) * zindb  ! old ice thickness 
    516511            zdhex    (ji) = MAX( 0._wp , zh_newice(ji) - zhice_old(ji,jl) )           ! difference in thickness 
    517             zswinew  (ji) = MAX( 0._wp , SIGN( 1._wp , - za_old(ji,jl) + epsi11 ) )   ! ice totally new in jl category 
     512            zswinew  (ji) = MAX( 0._wp , SIGN( 1._wp , - za_old(ji,jl) + epsi10 ) )   ! ice totally new in jl category 
    518513         END DO 
    519514 
     
    522517               jl = zcatac(ji) 
    523518               zqold   = ze_i_ac(ji,jk,jl) ! [ J.m-3 ] 
    524                zalphai = MIN( zhice_old(ji,jl) *   jk       / nlay_i , zh_newice(ji) )   & 
    525                   &    - MIN( zhice_old(ji,jl) * ( jk - 1 ) / nlay_i , zh_newice(ji) ) 
     519               zalphai = MIN( zhice_old(ji,jl) * REAL( jk )     / REAL( nlay_i ), zh_newice(ji) )   & 
     520                  &    - MIN( zhice_old(ji,jl) * REAL( jk - 1 ) / REAL( nlay_i ), zh_newice(ji) ) 
    526521               ze_i_ac(ji,jk,jl) = zswinew(ji) * ze_newice(ji)                                     & 
    527                   + ( 1.0 - zswinew(ji) ) * ( za_old(ji,jl)  * zqold * zhice_old(ji,jl) / nlay_i   & 
     522                  + ( 1.0 - zswinew(ji) ) * ( za_old(ji,jl)  * zqold * zhice_old(ji,jl) / REAL( nlay_i )  & 
    528523                  + za_newice(ji)  * ze_newice(ji) * zalphai                                       & 
    529                   + za_newice(ji)  * ze_newice(ji) * zdhex(ji) / nlay_i ) / ( ( zv_i_ac(ji,jl) ) / nlay_i ) 
     524                  + za_newice(ji)  * ze_newice(ji) * zdhex(ji) / REAL( nlay_i ) ) / ( ( zv_i_ac(ji,jl) ) / REAL( nlay_i ) ) 
    530525            END DO 
    531526         END DO 
     
    563558         DO jl = ice_cat_bounds(jm,1), ice_cat_bounds(jm,2) 
    564559            DO ji = 1, nbpac 
    565                zindb =  1._wp - MAX( 0._wp , SIGN( 1._wp , - za_i_ac(ji,jl ) ) )       ! zindb=1 if ice =0 otherwise 
     560               zindb =  1._wp - MAX( 0._wp , SIGN( 1._wp , - za_i_ac(ji,jl ) + epsi10 ) )       ! zindb=1 if ice =0 otherwise 
    566561               zhice_old(ji,jl) = zv_i_ac(ji,jl) / MAX( za_i_ac(ji,jl) , epsi10 ) * zindb 
    567562               zdhicbot (ji,jl) = zdv_res(ji)    / MAX( za_i_ac(ji,jl) , epsi10 ) * zindb    & 
     
    575570            DO jk = 1, nlay_i 
    576571               DO ji = 1, nbpac 
    577                   zthick0(ji,jk,jl) =  zhice_old(ji,jl) / nlay_i 
     572                  zthick0(ji,jk,jl) =  zhice_old(ji,jl) / REAL( nlay_i ) 
    578573                  zqm0   (ji,jk,jl) =  ze_i_ac(ji,jk,jl) * zthick0(ji,jk,jl) 
    579574               END DO 
     
    594589               DO layer = 1, nlay_i + 1 
    595590                  DO ji = 1, nbpac 
    596                      zindb =  1._wp -  MAX( 0._wp , SIGN( 1._wp , - za_i_ac(ji,jl) ) )  
     591                     zindb =  1._wp -  MAX( 0._wp , SIGN( 1._wp , - za_i_ac(ji,jl) + epsi10 ) )  
    597592                     ! Redistributing energy on the new grid 
    598                      zweight = MAX (  MIN( zhice_old(ji,jl) * layer , zdummy(ji,jl) * jk )   & 
    599                         &    - MAX( zhice_old(ji,jl) * ( layer - 1 ) , zdummy(ji,jl) * ( jk - 1 ) ) , 0._wp )   & 
    600                         &    /( MAX(nlay_i * zthick0(ji,layer,jl),epsi10) ) * zindb 
     593                     zweight = MAX (  MIN( zhice_old(ji,jl) * REAL( layer ), zdummy(ji,jl) * REAL( jk ) )   & 
     594                        &    - MAX( zhice_old(ji,jl) * REAL( layer - 1 ) , zdummy(ji,jl) * REAL( jk - 1 ) ) , 0._wp )   & 
     595                        &    /( MAX(REAL(nlay_i) * zthick0(ji,layer,jl),epsi10) ) * zindb 
    601596                     ze_i_ac(ji,jk,jl) =  ze_i_ac(ji,jk,jl) + zweight * zqm0(ji,layer,jl)   
    602597                  END DO ! ji 
     
    608603            DO jk = 1, nlay_i 
    609604               DO ji = 1, nbpac 
    610                   zindb =  1._wp -  MAX( 0._wp , SIGN( 1._wp , - zv_i_ac(ji,jl) ) )  
     605                  zindb =  1._wp -  MAX( 0._wp , SIGN( 1._wp , - zv_i_ac(ji,jl) + epsi10 ) )  
    611606                  ze_i_ac(ji,jk,jl) = ze_i_ac(ji,jk,jl)   & 
    612                      &              / MAX( zv_i_ac(ji,jl) , epsi10) * za_i_ac(ji,jl) * nlay_i * zindb 
     607                     &              / MAX( zv_i_ac(ji,jl) , epsi10) * za_i_ac(ji,jl) * REAL( nlay_i ) * zindb 
    613608               END DO 
    614609            END DO 
     
    620615         DO jl = 1, jpl 
    621616            DO ji = 1, nbpac 
    622                zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp , - za_i_ac(ji,jl) ) )  ! 0 if no ice and 1 if yes 
     617               zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp , - za_i_ac(ji,jl) + epsi10 ) )  ! 0 if no ice and 1 if yes 
    623618               zoa_i_ac(ji,jl)  = za_old(ji,jl) * zoa_i_ac(ji,jl) / MAX( za_i_ac(ji,jl) , epsi10 ) * zindb    
    624619            END DO  
     
    631626            DO jl = 1, jpl 
    632627               DO ji = 1, nbpac 
    633                   zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp , - zv_i_ac(ji,jl) ) )  ! 0 if no ice and 1 if yes 
     628                  zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp , - zv_i_ac(ji,jl) + epsi10 ) )  ! 0 if no ice and 1 if yes 
    634629                  zdv   = zv_i_ac(ji,jl) - zv_old(ji,jl) 
    635630                  zsmv_i_ac(ji,jl) = ( zsmv_i_ac(ji,jl) + zdv * zs_newice(ji) ) * zindb 
     
    637632            END DO    
    638633         ENDIF 
     634 
     635         !-------------------------------- 
     636         ! Update mass/salt fluxes (clem) 
     637         !-------------------------------- 
     638         DO jl = 1, jpl 
     639            DO ji = 1, nbpac 
     640               zindb = 1._wp - MAX( 0._wp , SIGN( 1._wp , - zv_i_ac(ji,jl) + epsi10 ) )  ! 0 if no ice and 1 if yes 
     641               zdv   = zv_i_ac(ji,jl) - zv_old(ji,jl) 
     642               rdmicif_1d(ji) = rdmicif_1d(ji) + zdv * rhoic !* zindb 
     643               fseqv_1d(ji)   =   fseqv_1d(ji) - zdv * rhoic * zs_newice(ji) / rdt_ice * zindb 
     644           END DO 
     645         END DO 
    639646 
    640647         !------------------------------------------------------------------------------! 
     
    652659         END DO 
    653660         CALL tab_1d_2d( nbpac, fseqv , npac(1:nbpac), fseqv_1d  (1:nbpac) , jpi, jpj ) 
     661         CALL tab_1d_2d( nbpac, rdmicif , npac(1:nbpac), rdmicif_1d  (1:nbpac) , jpi, jpj ) 
    654662         ! 
    655663      ENDIF ! nbpac > 0 
     
    660668      DO jl = 1, jpl 
    661669         DO jk = 1, nlay_i          ! heat content in 10^9 Joules 
    662             e_i(:,:,jk,jl) = e_i(:,:,jk,jl) * area(:,:) * v_i(:,:,jl) / nlay_i  / unit_fac  
     670            e_i(:,:,jk,jl) = e_i(:,:,jk,jl) * area(:,:) * v_i(:,:,jl) / REAL( nlay_i )  / unit_fac  
    663671         END DO 
    664672      END DO 
Note: See TracChangeset for help on using the changeset viewer.