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 14323 for NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/SED/sedinorg.F90 – NEMO

Ignore:
Timestamp:
2021-01-21T00:33:21+01:00 (3 years ago)
Author:
aumont
Message:

major update of the sediment model

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/SED/sedinorg.F90

    r12360 r14323  
    2323CONTAINS 
    2424    
    25    SUBROUTINE sed_inorg( kt )  
     25   SUBROUTINE sed_inorg( kt, knt )  
    2626      !!---------------------------------------------------------------------- 
    2727      !!                   ***  ROUTINE sed_inorg  *** 
     
    4646      !!---------------------------------------------------------------------- 
    4747      !! Arguments 
    48       INTEGER, INTENT(in) ::   kt       ! number of iteration 
     48      INTEGER, INTENT(in) ::   kt, knt       ! number of iteration 
    4949      ! --- local variables 
    5050      INTEGER :: ji, jk, js, jw         ! dummy looop indices 
     
    5454      REAL(wp), DIMENSION(jpoce,jpksed,jpsol) :: zvolc    ! temp. variables 
    5555      REAL(wp), DIMENSION(jpoce) :: zsieq 
    56       REAL(wp)  ::  zsolid1, zvolw, zreasat 
     56      REAL(wp)  ::  zsolid1, zvolw, zreasat, zbeta, zgamma 
    5757      REAL(wp)  ::  zsatur, zsatur2, znusil, zsolcpcl, zsolcpsi 
    5858      !! 
     
    6161      IF( ln_timing )  CALL timing_start('sed_inorg') 
    6262! 
    63       IF( kt == nitsed000 ) THEN 
     63      IF( kt == nitsed000 .AND. knt == 1 ) THEN 
    6464         IF (lwp) THEN 
    6565            WRITE(numsed,*) ' sed_inorg : Dissolution reaction ' 
     
    7373       
    7474      zrearat1(:,:) = 0.    ;   zundsat(:,:)  = 0.  
    75       zrearat2(:,:) = 0.    ;   zrearat2(:,:) = 0. 
     75      zrearat2(:,:) = 0. 
    7676      zco3eq(:)     = rtrn 
    7777      zvolc(:,:,:)  = 0. 
     
    8686         zsolcpsi = 0.0 
    8787         DO jk = 1, jpksed 
    88             zsolcpsi = zsolcpsi + solcp(ji,jk,jsopal) * dz(jk) 
    89             zsolcpcl = zsolcpcl + solcp(ji,jk,jsclay) * dz(jk) 
     88            zsolcpsi = zsolcpsi + solcp(ji,jk,jsopal) * vols3d(ji,jk) 
     89            zsolcpcl = zsolcpcl + solcp(ji,jk,jsclay) * vols3d(ji,jk) 
    9090         END DO 
    9191         zsolcpsi = MAX( zsolcpsi, rtrn ) 
     
    135135      DO jk = 2, jpksed 
    136136         DO ji = 1, jpoce 
    137             zsolid1 = zvolc(ji,jk,jsopal) * solcp(ji,jk,jsopal) 
    138             zsatur = MAX(0., zundsat(ji,jk) / zsieq(ji) ) 
    139             zsatur2 = (1.0 + temp(ji) / 400.0 )**37 
    140             znusil = ( 0.225 * ( 1.0 + temp(ji) / 15.) + 0.775 * zsatur2 * zsatur**2.25 ) / zsieq(ji) 
    141             zrearat1(ji,jk)  = ( reac_sil * znusil * dtsed * zsolid1 ) / & 
    142                &                ( 1. + reac_sil * znusil * dtsed * zundsat(ji,jk) ) 
    143          ENDDO 
    144       ENDDO 
    145  
    146       CALL sed_mat( jwsil, jpoce, jpksed, zrearat1, zrearat2, zundsat, dtsed ) 
    147  
    148       ! New solid concentration values (jk=2 to jksed) for each couple  
    149       DO jk = 2, jpksed 
    150          DO ji = 1, jpoce 
    151             zreasat = zrearat1(ji,jk) * zundsat(ji,jk) / ( zvolc(ji,jk,jsopal) ) 
    152             solcp(ji,jk,jsopal) = solcp(ji,jk,jsopal) - zreasat 
    153          ENDDO 
    154       ENDDO 
    155  
    156       ! New pore water concentrations     
    157       DO jk = 1, jpksed 
    158          DO ji = 1, jpoce 
    159             ! Acid Silicic  
    160             pwcp(ji,jk,jwsil)  = zsieq(ji) - zundsat(ji,jk) 
     137            IF ( zundsat(ji,jk) > 0. ) THEN 
     138               zsolid1 = zvolc(ji,jk,jsopal) * solcp(ji,jk,jsopal) 
     139               zsatur = zundsat(ji,jk) / zsieq(ji) 
     140               zsatur2 = (1.0 + temp(ji) / 400.0 )**37 
     141               znusil = ( 0.225 * ( 1.0 + temp(ji) / 15.) + 0.775 * zsatur2 * zsatur**8.25 ) / zsieq(ji) 
     142               zbeta = 1.0 - reac_sil * znusil * dtsed2 * zundsat(ji,jk) + reac_sil * znusil * dtsed2 * zsolid1 
     143               zgamma = - reac_sil * znusil * dtsed2 * zundsat(ji,jk) 
     144               zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / ( 2.0 * reac_sil * znusil * dtsed2 ) 
     145               solcp(ji,jk,jsopal ) = zsolid1 / ( 1. + reac_sil * znusil * dtsed2 * zundsat(ji,jk) ) / zvolc(ji,jk,jsopal) 
     146               pwcp(ji,jk,jwsil) = zsieq(ji) - zundsat(ji,jk)  
     147            ENDIF 
    161148         ENDDO 
    162149      ENDDO 
     
    175162            zco3eq(ji)     = aksps(ji) * densSW(ji) * densSW(ji) / ( calcon2(ji) + rtrn ) 
    176163            zco3eq(ji)     = MAX( rtrn, zco3eq(ji) )  
    177             zundsat(ji,jk) = MAX(0., zco3eq(ji) - co3por(ji,jk) ) 
     164            zundsat(ji,jk) = ( zco3eq(ji) - co3por(ji,jk) ) / zco3eq(ji) 
    178165         ENDDO 
    179166      ENDDO 
     
    181168      DO jk = 2, jpksed 
    182169         DO ji = 1, jpoce 
    183             zsolid1 = zvolc(ji,jk,jscal) * solcp(ji,jk,jscal) 
    184             zrearat1(ji,jk) = ( reac_cal * dtsed * zsolid1 / zco3eq(ji) ) / & 
    185                   &               ( 1. + reac_cal * dtsed * zundsat(ji,jk) / zco3eq(ji) ) 
     170            IF ( zundsat(ji,jk) > 0. ) THEN 
     171               zsolid1 = zvolc(ji,jk,jscal) * solcp(ji,jk,jscal) 
     172               zbeta = 1.0 - reac_cal * dtsed2 * zundsat(ji,jk) + reac_cal * dtsed2 * zsolid1 
     173               zgamma = -reac_cal * dtsed2 * zundsat(ji,jk) 
     174               zundsat(ji,jk) = ( -zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / ( 2.0 * reac_sil * znusil * dtsed2 ) 
     175               saturco3(ji,jk) = zundsat(ji,jk) 
     176               zreasat = reac_cal * dtsed2 * zundsat(ji,jk) * zsolid1 / ( 1. + reac_cal * dtsed2 * zundsat(ji,jk) ) 
     177               solcp(ji,jk,jscal) = solcp(ji,jk,jscal) - zreasat / zvolc(ji,jk,jscal) 
     178               ! For DIC 
     179               pwcp(ji,jk,jwdic)  = pwcp(ji,jk,jwdic) + zreasat 
     180               ! For alkalinity 
     181               pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + 2.0 * zreasat 
     182            ENDIF 
    186183         END DO 
    187184      END DO 
    188  
    189       ! solves tridiagonal system 
    190       CALL sed_mat( jwdic, jpoce, jpksed, zrearat1, zrearat2, zundsat, dtsed ) 
    191  
    192       ! New solid concentration values (jk=2 to jksed) for cacO3 
    193       DO jk = 2, jpksed 
    194          DO ji = 1, jpoce 
    195             zreasat = zrearat1(ji,jk) * zundsat(ji,jk) / zvolc(ji,jk,jscal) 
    196             solcp(ji,jk,jscal) = solcp(ji,jk,jscal) - zreasat 
    197          ENDDO 
    198       ENDDO 
    199  
    200       ! New dissolved concentrations 
    201       DO jk = 1, jpksed 
    202          DO ji = 1, jpoce 
    203             zreasat = zrearat1(ji,jk) * zundsat(ji,jk)     
    204             ! For DIC 
    205             pwcp(ji,jk,jwdic)  = pwcp(ji,jk,jwdic) + zreasat 
    206             ! For alkalinity 
    207             pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + 2.0 * zreasat  
    208          ENDDO 
    209       ENDDO 
    210  
    211       !------------------------------------------------- 
    212       ! Beginning DIC, Alkalinity  
    213       !------------------------------------------------- 
    214        
    215       DO jk = 1, jpksed 
    216          DO ji = 1, jpoce       
    217             zundsat(ji,jk)   = pwcp(ji,jk,jwdic) 
    218             zrearat1(ji,jk)  = 0. 
    219          ENDDO 
    220       ENDDO 
    221  
    222       ! solves tridiagonal system 
    223       CALL sed_mat( jwdic, jpoce, jpksed, zrearat1, zrearat2, zundsat, dtsed ) 
    224  
    225      ! New dissolved concentrations       
    226       DO jk = 1, jpksed 
    227          DO ji = 1, jpoce                       
    228             pwcp(ji,jk,jwdic) = zundsat(ji,jk) 
    229          ENDDO 
    230       ENDDO             
    231  
    232       !------------------------------------------------- 
    233       ! Beginning DIC, Alkalinity  
    234       !------------------------------------------------- 
    235  
    236       DO jk = 1, jpksed 
    237          DO ji = 1, jpoce 
    238             zundsat(ji,jk) = pwcp(ji,jk,jwalk) 
    239             zrearat1(ji,jk) = 0. 
    240          ENDDO 
    241       ENDDO 
    242 ! 
    243 !      ! solves tridiagonal system 
    244       CALL sed_mat( jwalk, jpoce, jpksed, zrearat1, zrearat2, zundsat, dtsed ) 
    245 ! 
    246 !      ! New dissolved concentrations       
    247       DO jk = 1, jpksed 
    248          DO ji = 1, jpoce 
    249             pwcp(ji,jk,jwalk) = zundsat(ji,jk) 
    250          ENDDO 
    251       ENDDO 
    252        
    253       !---------------------------------- 
    254       !   Back to initial geometry 
    255       !----------------------------- 
    256        
    257       !--------------------------------------------------------------------- 
    258       !   1/ Compensation for ajustement of the bottom water concentrations 
    259       !      (see note n° 1 about *por(2)) 
    260       !-------------------------------------------------------------------- 
    261       DO jw = 1, jpwat 
    262          DO ji = 1, jpoce 
    263             pwcp(ji,1,jw) = pwcp(ji,1,jw) + & 
    264                &            pwcp(ji,2,jw) * dzdep(ji) * por(2) / dzkbot(ji) 
    265          END DO 
    266       ENDDO 
    267        
    268       !----------------------------------------------------------------------- 
    269       !    2/ Det of new rainrg taking account of the new weight fraction obtained  
    270       !      in dz3d(2) after diffusion/reaction (react/diffu are also in dzdep!) 
    271       !      This new rain (rgntg rm) will be used in advection/burial routine 
    272       !------------------------------------------------------------------------ 
    273       DO js = 1, jpsol 
    274          DO ji = 1, jpoce 
    275             rainrg(ji,js) = raintg(ji) * solcp(ji,2,js) 
    276             rainrm(ji,js) = rainrg(ji,js) / mol_wgt(js) 
    277          END DO 
    278       ENDDO 
    279  
    280       !  New raintg 
    281       raintg(:) = 0. 
    282       DO js = 1, jpsol 
    283          DO ji = 1, jpoce 
    284             raintg(ji) = raintg(ji) + rainrg(ji,js) 
    285          END DO 
    286       ENDDO 
    287        
    288       !-------------------------------- 
    289       !    3/ back to initial geometry 
    290       !-------------------------------- 
    291       DO ji = 1, jpoce 
    292          dz3d  (ji,2) = dz(2) 
    293          volw3d(ji,2) = dz3d(ji,2) * por(2) 
    294          vols3d(ji,2) = dz3d(ji,2) * por1(2) 
    295       ENDDO 
    296185 
    297186      IF( ln_timing )  CALL timing_stop('sed_inorg') 
Note: See TracChangeset for help on using the changeset viewer.