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 15075 – NEMO

Changeset 15075


Ignore:
Timestamp:
2021-07-02T17:15:57+02:00 (3 years ago)
Author:
aumont
Message:

major update of the sediment module

Location:
NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src
Files:
5 added
23 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/OFF/nemogcm.F90

    r14448 r15075  
    123123      !  
    124124      DO WHILE ( istp <= nitend .AND. nstop == 0 )    !==  OFF time-stepping  ==! 
    125  
    126125         IF( ln_timing ) THEN 
    127126            zstptiming = MPI_Wtime() 
     
    153152         Naa  = Nrhs 
    154153         ! 
    155 #if ! defined key_qco 
     154# if ! defined key_qco 
    156155         IF( .NOT.ln_linssh )   CALL dta_dyn_sf_interp( istp, Nnn )  ! calculate now grid parameters 
    157 #endif   
     156# endif   
    158157 
    159158#else 
    160159                                CALL dta_dyn_sed( istp,      Nnn      )       ! Interpolation of the dynamical fields 
    161  
     160                                CALL trc_stp    ( istp, Nbb, Nnn, Nrhs, Naa ) ! time-stepping 
     161        ! Swap time levels 
     162         Nrhs = Nbb 
     163         Nbb  = Nnn 
     164         Nnn  = Naa 
     165         Naa  = Nrhs 
    162166#endif 
    163167         CALL stp_ctl    ( istp )             ! Time loop: control and print 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zbc.F90

    r14786 r15075  
    2424   LOGICAL , PUBLIC ::   ln_ironsed   !: boolean for Fe input from sediments 
    2525   LOGICAL , PUBLIC ::   ln_hydrofe   !: boolean for Fe input from hydrothermal vents 
     26   LOGICAL , PUBLIC ::   ln_dust_inp  !: boolean for Fe input from hydrothermal vents 
    2627   REAL(wp), PUBLIC ::   sedfeinput   !: Coastal release of Iron 
    2728   REAL(wp), PUBLIC ::   icefeinput   !: Iron concentration in sea ice 
     
    9798 
    9899         zwdust = 0.03 / ( wdust / rday ) / ( 250. * rday ) 
    99          DO_3D( 1, 1, 1, 1, 2, jpkm1 ) 
    100             zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) ) 
    101             ! 
    102             tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zdustdep * mfrac / mMass_Fe  
    103             tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zdustdep * 1.e-3 / mMass_P 
    104             tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) + zdustdep * 0.269 / mMass_Si 
    105          END_3D 
     100 
     101         ! Atmospheric input of Iron dissolves in the water column 
     102         IF ( ln_trc_sbc(jpfer) ) THEN 
     103            DO_3D( 1, 1, 1, 1, 2, jpkm1 ) 
     104               zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) ) 
     105               ! 
     106               tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zdustdep * mfrac / mMass_Fe  
     107            END_3D 
     108 
     109            IF( lk_iomput ) THEN 
     110                ! surface downward dust depo of iron 
     111                jl = n_trc_indsbc(jpfer) 
     112                CALL iom_put( "Irondep", ( rf_trsfac(jl) * sf_trcsbc(jl)%fnow(:,:,1) / rn_sbc_time ) * 1.e+3 * tmask(:,:,1) ) 
     113 
     114            ENDIF 
     115 
     116         ENDIF 
     117 
     118         ! Atmospheric input of PO4 dissolves in the water column 
     119         IF ( ln_trc_sbc(jppo4) ) THEN 
     120            DO_3D( 1, 1, 1, 1, 2, jpkm1 ) 
     121               zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) ) 
     122               ! 
     123               tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zdustdep * 1.e-3 / mMass_P 
     124            END_3D 
     125         ENDIF 
     126 
     127         ! Atmospheric input of Si dissolves in the water column 
     128         IF ( ln_trc_sbc(jpsil) ) THEN 
     129            DO_3D( 1, 1, 1, 1, 2, jpkm1 ) 
     130               zdustdep = dust(ji,jj) * zwdust * rfact * EXP( -gdept(ji,jj,jk,Kmm) /( 250. * wdust ) ) 
     131               ! 
     132               tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) + zdustdep * 0.269 / mMass_Si 
     133            END_3D 
     134         ENDIF 
     135 
    106136         ! 
    107137         IF( lk_iomput ) THEN 
    108              ! surface downward dust depo of iron 
    109              jl = n_trc_indsbc(jpfer) 
    110              CALL iom_put( "Irondep", ( rf_trsfac(jl) * sf_trcsbc(jl)%fnow(:,:,1) / rn_sbc_time ) * 1.e+3 * tmask(:,:,1) ) 
    111  
    112138             ! dust concentration at surface 
    113139             CALL iom_put( "pdust"  , dust(:,:) / ( wdust / rday ) * tmask(:,:,1) ) ! dust concentration at surface 
     
    225251      !! 
    226252      NAMELIST/nampisbc/cn_dir, sn_dust, sn_ironsed, sn_hydrofe, & 
    227         &                ln_ironsed, ln_ironice, ln_hydrofe,    & 
    228         &                sedfeinput, distcoast, icefeinput, wdust, mfrac,  & 
     253        &                ln_ironsed, ln_ironice, ln_hydrofe, ln_dust_inp,   & 
     254        &                sedfeinput, distcoast, icefeinput, wdust, mfrac,   & 
    229255        &                hratio, lgw_rath 
    230256      !!---------------------------------------------------------------------- 
     
    267293      END IF 
    268294 
    269       ll_bc    = ( ln_trcbc .AND. lltrcbc )  .OR. ln_hydrofe .OR. ln_ironsed .OR. ln_ironice 
    270       ll_dust  =  ln_trc_sbc(jpfer)    
     295      ll_bc    = ( ln_trcbc .AND. lltrcbc )  .OR. ln_hydrofe .OR. ln_ironsed .OR. ln_ironice .OR. ln_dust_inp 
     296      ll_dust  =  ln_dust_inp 
    271297      ll_ndepo =  ln_trc_sbc(jpno3) .OR. ln_trc_sbc(jpnh4)    
    272298      ll_river =  ln_trc_cbc(jpno3)   
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zrem.F90

    r14963 r15075  
    104104            zdepmin = MIN( 1., zdep / gdept(ji,jj,jk,Kmm) ) 
    105105            zdepbac (ji,jj,jk) = zdepmin**0.683 * ztempbac(ji,jj) 
    106             zdepeff(ji,jj,jk) = zdepeff(ji,jj,jk) * zdepmin**0.3 
     106!            zdepeff(ji,jj,jk) = zdepeff(ji,jj,jk) * zdepmin**0.3 
     107            zdepeff(ji,jj,jk) = zdepeff(ji,jj,jk) * zdepmin**0.6 
    107108         ENDIF 
    108109      END_3D 
     
    187188         ! is treated here. The GGE of bacteria supposed to be equal to  
    188189         ! 0.33. This is hard-coded.  
    189          tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zbactfer*0.12 
    190          tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zbactfer*0.10 
     190         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zbactfer*0.1 
     191         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zbactfer*0.08 
    191192         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zbactfer*0.02 
    192          zfebact(ji,jj,jk)   = zbactfer * 0.12 
     193         zfebact(ji,jj,jk)   = zbactfer * 0.1 
    193194         blim(ji,jj,jk)      = xlimbacl(ji,jj,jk)  * zdepbac(ji,jj,jk) / 1.e-6 
    194195      END_3D 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/par_sed.F90

    r14385 r15075  
    2020      jp_sal   =>   jp_sal     !: indice of salintity 
    2121 
    22    INTEGER, PUBLIC, PARAMETER :: jpdta = 17 
     22   INTEGER, PARAMETER :: jpdta = 18 
    2323 
    2424   ! Vertical sediment geometry 
    25    INTEGER, PUBLIC  :: jpksed  = 11  
    26    INTEGER, PUBLIC  :: jpksedm1  
     25   INTEGER, PUBLIC   ::      & 
     26      jpksed   = 11 ,        & 
     27      jpksedm1 = 10 
    2728 
    2829   ! sediment tracer species 
    29    INTEGER, PUBLIC, PARAMETER ::    & 
     30   INTEGER, PARAMETER ::    & 
    3031      jpsol =  8,           &  !: number of solid component 
    31       jpwat = 10,           &   !: number of pore water component 
     32      jpwat = 11,           &   !: number of pore water component 
     33      jpads = 2 ,           &   !! number adsorbed species 
    3234      jpwatp1 = jpwat +1,   & 
    3335      jpsol1 = jpsol - 1 
     
    3537    
    3638   ! pore water components        
    37    INTEGER, PUBLIC, PARAMETER :: & 
    38       jwsil  = 1,        & !: silic acid 
    39       jwoxy  = 2,        & !: oxygen 
    40       jwdic  = 3,        & !: dissolved inorganic carbon 
    41       jwno3  = 4,        & !: nitrate 
    42       jwpo4  = 5,        & !: phosphate 
    43       jwalk  = 6,        & !: alkalinity 
    44       jwnh4  = 7,        & !: Ammonium 
    45       jwh2s  = 8,        & !: Sulfate 
    46       jwso4  = 9,        & !: H2S 
    47       jwfe2  = 10          !: Fe2+ 
     39   INTEGER, PARAMETER :: & 
     40      jwoxy  = 1,        & !: oxygen 
     41      jwno3  = 2,        & !: nitrate 
     42      jwpo4  = 3,        & !: phosphate 
     43      jwnh4  = 4,        & !: Ammonium 
     44      jwh2s  = 5,        & !: Sulfate 
     45      jwso4  = 6,        & !: H2S 
     46      jwfe2  = 7,        & !: Fe2+ 
     47      jwalk  = 8,        & !: Alkalinity 
     48      jwlgw  = 9,        & !: Alkalinity 
     49      jwdic  = 10,       & !: DIC 
     50      jwsil  = 11          !: Silicate 
    4851 
    4952   ! solid components        
    50    INTEGER, PUBLIC, PARAMETER ::  & 
    51       jsopal  = 1,        & !: opal sediment 
    52       jsclay  = 2,        & !: clay 
     53   INTEGER, PARAMETER ::  & 
     54      jsfeo   = 1,        & !: iron hydroxides 
     55      jsfes   = 2,        & !: FeS 
    5356      jspoc   = 3,        & !: organic carbon 
    54       jscal   = 4,        & !: calcite 
    55       jspos   = 5,        & !: semi-ref POC 
    56       jspor   = 6,        & !: refractory POC 
    57       jsfeo   = 7,        & !: iron hydroxides 
    58       jsfes   = 8           !: FeS 
     57      jspos   = 4,        & !: semi-ref POC 
     58      jspor   = 5,        & !: refractory POC 
     59      jscal   = 6,        & !: Calcite 
     60      jsopal  = 7,        & !: Opal 
     61      jsclay  = 8           !: clay 
    5962 
    60    INTEGER, PUBLIC, PARAMETER ::  & 
     63   INTEGER, PARAMETER ::  & 
    6164      jptrased   = jpsol + jpwat , & 
    62       jpdia3dsed = 4             , & 
    63       jpdia2dsed = 20  
     65      jpvode     = jptrased - 11 , & 
     66      jpdia3dsed = 3             , & 
     67      jpdia2dsed = 21  
    6468 
    6569END MODULE par_sed 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sed.F90

    r14385 r15075  
    77   !!        !  06-12  (C. Ethe)  Orignal 
    88   !!---------------------------------------------------------------------- 
     9   USE par_sed 
    910   USE oce_sed 
    1011   USE in_out_manager 
     
    2728   REAL(wp), PUBLIC               ::  reac_fe2            !: reactivity of Fe2+ in  [l.mol-1.s-1] 
    2829   REAL(wp), PUBLIC               ::  reac_feh2s          !: reactivity of Fe2+ in  [l.mol-1.s-1] 
    29    REAL(wp), PUBLIC               ::  reac_fes            !: reactivity of Fe with H2S in  [l.mol-1.s-1] 
    3030   REAL(wp), PUBLIC               ::  reac_feso           !: reactivity of FeS with O2 in  [l.mol-1.s-1] 
     31   REAL(wp), PUBLIC               ::  reac_fesp           !: precipitation of FeS  [mol.l-1.s-1] 
     32   REAL(wp), PUBLIC               ::  reac_fesd           !: Dissolution  of FeS  [s-1] 
    3133   REAL(wp), PUBLIC               ::  reac_cal            !: reactivity of cal in  [l.mol-1.s-1] 
    3234   REAL(wp), PUBLIC               ::  adsnh4              !: adsorption coefficient of NH4 
     35   REAL(wp), PUBLIC               ::  adsfe2              !: adsorption coefficient of Fe2 
    3336   REAL(wp), PUBLIC               ::  ratligc             !: C/L ratio in POC 
    3437   REAL(wp), PUBLIC               ::  so2ut  
     
    3740   REAL(wp), PUBLIC               ::  srDnit  
    3841   REAL(wp), PUBLIC               ::  dtsed               !: sedimentation time step 
    39    REAL(wp), PUBLIC               ::  dtsed2              !: sedimentation time step 
    4042   INTEGER , PUBLIC               ::  nitsed000 
    4143   INTEGER , PUBLIC               ::  nitsedend 
    42    INTEGER, PUBLIC                ::  nrseddt 
    43    REAL    , PUBLIC               ::  sedmask 
    4444   REAL(wp), PUBLIC               ::  denssol                !: density of solid material 
    4545   LOGICAL , PUBLIC               ::  lrst_sed       !: logical to control the trc restart write 
     
    5757 
    5858   ! 
    59    REAL(wp), PUBLIC, DIMENSION(:,:,:), ALLOCATABLE ::  pwcp       !: pore water sediment data at given time-step 
    60    REAL(wp), PUBLIC, DIMENSION(:,:,:), ALLOCATABLE ::  pwcp0      !: pore water sediment data at initial time 
    61    REAL(wp), PUBLIC, DIMENSION(:,:,:), ALLOCATABLE ::  solcp      !: solid sediment data at given time-step 
    62    REAL(wp), PUBLIC, DIMENSION(:,:,:), ALLOCATABLE ::  solcp0     !: solid sediment data at initial time 
    63    REAL(wp), PUBLIC, DIMENSION(:,:,:), ALLOCATABLE ::  diff 
     59   REAL(wp), PUBLIC, DIMENSION(:,:,:),  ALLOCATABLE ::  pwcp, pwcpa 
     60   REAL(wp), PUBLIC, DIMENSION(:,:,:),  ALLOCATABLE ::  solcp, solcpa 
     61   REAL(wp), PUBLIC, DIMENSION(:,:,:),  ALLOCATABLE ::  Jacobian 
     62   REAL(wp), PUBLIC, DIMENSION(:,:,:),  ALLOCATABLE ::  diff 
    6463 
    6564   !! * Shared module variables 
     
    7069   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  fromsed    !: 
    7170   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  tosed      !: 
     71   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  rearatpom  !:  
     72   ! 
    7273   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  temp       !: temperature 
    7374   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  salt       !: salinity 
     
    7576   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  fecratio   !: Fe/C ratio in falling particles to the sediments 
    7677   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  dzdep      !: total thickness of solid material rained [cm] in each cell 
    77    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  zkbot      !: Total water column depth 
    78    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  wacc      !: total thickness of solid material rained [cm] in each cell 
     78   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  zkbot      !: total thickness of solid material rained [cm] in each cell 
     79   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  wacc, wacc1 !: total thickness of solid material rained [cm] in each cell 
    7980   ! 
    8081   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  hipor      !: [h+] in mol/kg*densSW  
     
    8384   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  volw3d     !:  ??? 
    8485   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  vols3d     !:  ??? 
     86   REAL(wp), PUBLIC, DIMENSION(:,:,:), ALLOCATABLE ::  volc 
     87 
    8588 
    8689   !! Chemistry 
    87    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  densSW 
    88    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  borats 
     90   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  densSW  
     91   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  borats  
    8992   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  calcon2 
    90    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  akbs 
    91    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak1s 
    92    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak2s 
    93    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  akws 
    94    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak12s 
    95    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak1ps 
    96    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak2ps 
    97    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak3ps 
    98    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak12ps 
     93   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  akbs   
     94   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak1s  
     95   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak2s    
     96   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  akws   
     97   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak12s   
     98   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak1ps  
     99   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak2ps   
     100   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak3ps  
     101   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak12ps  
    99102   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  ak123ps 
    100    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  aksis 
    101    REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  aksps 
     103   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  aksis  
     104   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  aknh3 
     105   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  aksps  
     106   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  akh2s 
    102107   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  sieqs 
    103108   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  aks3s 
     
    112117   INTEGER , PUBLIC, SAVE                          ::  jpoce, indoce !: Ocean points ( number/indices ) 
    113118   INTEGER , PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  iarroce       !: Computation of 1D array of sediments points 
     119   INTEGER , PUBLIC, DIMENSION(:, : ), ALLOCATABLE ::  jarr       !: Computation of 1D array of sediments points 
     120   INTEGER , PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  jsvode, isvode   !: Computation of 1D array of sediments points 
     121 
    114122   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  epkbot        !: ocean bottom layer thickness 
    115123   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  gdepbot       !: Depth of the sediment 
     
    122130   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  db            !: bioturbation ceofficient 
    123131   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  irrig        !: bioturbation ceofficient 
    124    REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE :: sedligand 
    125    REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE :: saturco3 
     132   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  radsnh4, radsfe2 
     133   REAL(wp), PUBLIC, DIMENSION(:,:  ), ALLOCATABLE ::  saturco3 
     134   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  rdtsed        !:  sediment model time-step 
     135   REAL(wp), PUBLIC, DIMENSION(:    ), ALLOCATABLE ::  stepros  
    126136   REAL(wp)  ::   dens               !: density of solid material 
    127137   !! Inputs / Outputs 
     
    133143   CHARACTER( len = 20 ), DIMENSION(jpdia2dsed) ::  seddia2d, seddia2u 
    134144   ! 
    135    REAL(wp), PUBLIC, DIMENSION(:,:,:,:), ALLOCATABLE ::  trcsedi 
    136    REAL(wp), PUBLIC, DIMENSION(:,:,:,:), ALLOCATABLE ::  flxsedi3d 
    137    REAL(wp), PUBLIC, DIMENSION(:,:,:  ), ALLOCATABLE ::  flxsedi2d 
    138145 
    139146   INTEGER, PUBLIC ::  numsed = 27    ! units 
     
    149156      !!------------------------------------------------------------------- 
    150157      ! 
    151       ALLOCATE( trc_data(jpi,jpj,jpdta), trcsedi  (jpi,jpj,jpksed,jptrased) ,  & 
    152          &      epkbot(jpi,jpj), gdepbot(jpi,jpj), dz(jpksed), por(jpksed)  ,  & 
    153          &      por1(jpksed), volw(jpksed), vols(jpksed), mol_wgt(jpsol)    ,  & 
    154          &      flxsedi2d(jpi,jpj,jpdia2dsed), flxsedi3d(jpi,jpj,jpksed,jpdia3dsed),  STAT=sed_alloc ) 
     158      ALLOCATE( trc_data(jpi,jpj,jpdta)                                   ,   & 
     159         &      epkbot(jpi,jpj), gdepbot(jpi,jpj)        ,   & 
     160         &      dz(jpksed)  , por(jpksed) , por1(jpksed)                  ,   & 
     161         &      volw(jpksed), vols(jpksed), rdtsed(jpksed)  ,   & 
     162         &      mol_wgt(jpsol),                                           STAT=sed_alloc ) 
    155163 
    156164      IF( sed_alloc /= 0 )   CALL ctl_stop( 'STOP', 'sed_alloc: failed to allocate arrays' ) 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedadv.F90

    r14385 r15075  
    5151      INTEGER :: jn, ntimes, nztime, ikwneg 
    5252       
    53       REAL(wp), DIMENSION(jpksed,jpsol) :: zsolcpno 
     53      REAL(wp), DIMENSION(jpoce,jpksed,jpsol+jpads) :: zsolcp 
     54      REAL(wp), DIMENSION(jpksed,jpsol+jpads) :: zsolcpno 
    5455      REAL(wp), DIMENSION(jpksed)       :: zfilled, zfull, zfromup, zempty 
    5556      REAL(wp), DIMENSION(jpoce,jpksed) :: zgap, zwb 
    56       REAL(wp), DIMENSION(jpoce,jpsol) :: zrainrf 
     57      REAL(wp), DIMENSION(jpoce,jpsol+jpads) :: zrainrf 
    5758      REAL(wp), DIMENSION(:  ), ALLOCATABLE :: zraipush 
    5859 
    59       REAL(wp) :: zkwnup, zkwnlo, zfrac,  zfromce, zrest, sumtot, zsumtot1 
     60      REAL(wp) :: zkwnup, zkwnlo, zfrac,  zfromce, zrest 
    6061 
    6162      !------------------------------------------------------------------------ 
     
    8485      ENDIF 
    8586 
     87      ! Allocation of the temporary arrays 
     88      ! ---------------------------------- 
     89      zsolcp(:,:,:) = 0._wp 
     90      DO js = 1, jpsol 
     91         zsolcp(:,:,js) = solcp(:,:,js) 
     92      END DO 
     93      DO jk = 2, jpksed 
     94         zsolcp(:,jk,jpsol+1) = pwcp(:,jk,jwnh4) * adsnh4  
     95         zsolcp(:,jk,jpsol+2) = pwcp(:,jk,jwfe2) * adsfe2 
     96      END DO 
     97 
    8698      ! Initialization of data for mass balance calculation 
    8799      !--------------------------------------------------- 
     
    97109      zgap(:,:) = 0. 
    98110      DO js = 1, jpsol 
    99          DO jk = 1, jpksed 
    100             DO ji = 1, jpoce 
    101                zgap(ji,jk) = zgap(ji,jk) + solcp(ji,jk,js) 
    102             END DO 
    103          ENDDO 
     111         zgap(:,:) = zgap(:,:) + zsolcp(:,:,js) 
    104112      ENDDO 
    105  
    106       zgap(1:jpoce,1:jpksed) = 1. - zgap(1:jpoce,1:jpksed)    
     113      zgap(:,:) = 1. - zgap(:,:) 
    107114 
    108115      ! Initiate burial rates 
     
    111118      DO jk = 2, jpksed 
    112119         zfrac =  dtsed / ( denssol * por1(jk) )      
     120         zwb(:,jk) = zfrac * raintg(:) 
     121      ENDDO 
     122      zwb(:,2) = zwb(:,2) - zgap(:,2) * dz(2) 
     123 
     124      DO jk = 3, jpksed 
     125         zfrac = por1(jk-1) / por1(jk) 
     126         zwb(:,jk) = zwb(:,jk-1) * zfrac - zgap(:,jk) * dz(jk) 
     127      ENDDO 
     128 
     129      zrainrf(:,:) = 0. 
     130      DO js = 1, jpsol 
    113131         DO ji = 1, jpoce 
    114             zwb(ji,jk) = zfrac * raintg(ji) 
     132            IF( raintg(ji) /= 0. )  zrainrf(ji,js) = rainrg(ji,js) / raintg(ji) 
    115133         END DO 
    116134      ENDDO 
    117  
    118  
    119       DO ji = 1, jpoce 
    120          zwb(ji,2) = zwb(ji,2) - zgap(ji,2) * dz(2) 
    121       ENDDO 
    122  
    123       DO jk = 3, jpksed 
    124          zfrac = por1(jk-1) / por1(jk) 
    125          DO ji = 1, jpoce 
    126             zwb(ji,jk) = zwb(ji,jk-1) * zfrac - zgap(ji,jk) * dz(jk) 
    127          END DO 
    128       ENDDO 
    129  
    130       zrainrf(:,:) = 0. 
    131       DO ji = 1, jpoce 
    132          IF( raintg(ji) /= 0. )  & 
    133             &   zrainrf(ji,:) = rainrg(ji,:) / raintg(ji) 
    134       ENDDO 
    135  
    136135 
    137136      ! Computation of full and empty solid fraction in each layer 
     
    147146         DO js = 1, jpsol 
    148147            DO jk = 2, jpksed 
    149                zfilled(jk) = zfilled(jk) + solcp(ji,jk,js) 
    150             ENDDO 
     148               zfilled(jk) = zfilled(jk) + zsolcp(ji,jk,js) 
     149            END DO 
    151150         ENDDO 
    152151          
    153          DO js = 1, jpsol 
     152         DO js = 1, jpsol + jpads 
    154153            DO jk = 2, jpksed 
    155                zsolcpno(jk,js) = solcp(ji,jk,js) / zfilled(jk) 
    156             ENDDO 
     154               zsolcpno(jk,js) = zsolcp(ji,jk,js) / zfilled(jk) 
     155            END DO 
    157156         ENDDO 
    158157 
     
    168167            zempty(jpksed) = 1. - zfull(jpksed) 
    169168            DO jk = jpksedm1, 2, -1 
    170                zfull (jk) = zfilled(jk) 
    171                zfull (jk) = zfull(jk) - zempty(jk+1) * dvolsp(jk) 
     169               zfull (jk) = zfilled(jk) - zempty(jk+1) * dvolsp(jk) 
    172170               zempty(jk) = 1. - zfull(jk) 
    173171            ENDDO 
     
    176174            !-------------------------------------- 
    177175            ! push entire sediment column downward to account rest of rain 
    178             DO js = 1, jpsol 
     176            DO js = 1, jpsol + jpads 
    179177               DO jk = jpksed, 3, -1 
    180                   solcp(ji,jk,js) = zfull(jk) * zsolcpno(jk,js) + zempty(jk) * zsolcpno(jk-1,js) 
    181                ENDDO 
    182  
    183                solcp(ji,2,js) = zfull(2) * zsolcpno(2,js) + zempty(2) * zrainrf(ji,js) 
     178                  zsolcp(ji,jk,js) = zfull(jk) * zsolcpno(jk,js) + zempty(jk) * zsolcpno(jk-1,js) 
     179               ENDDO 
     180 
     181               zsolcp(ji,2,js) = zfull(2) * zsolcpno(2,js) + zempty(2) * zrainrf(ji,js) 
    184182 
    185183               DO jk = 2, jpksed 
    186                   zsolcpno(jk,js) = solcp(ji,jk,js) 
     184                  zsolcpno(jk,js) = zsolcp(ji,jk,js) 
    187185               END DO 
    188186            ENDDO 
     
    196194                  zfromup(jk) = zwb(ji,jpksed) * ckpor(jk) / dz(jk) 
    197195               ENDDO 
    198                DO js = 1, jpsol 
     196               DO js = 1, jpsol + jpads 
    199197                  zfromce = 1. - zfromup(2) 
    200                   solcp(ji,2,js) = zfromce * zsolcpno(2,js) + zfromup(2) * zrainrf(ji,js) 
     198                  zsolcp(ji,2,js) = zfromce * zsolcpno(2,js) + zfromup(2) * zrainrf(ji,js) 
    201199                  DO jk = 3, jpksed 
    202200                     zfromce = 1. - zfromup(jk) 
    203                      solcp(ji,jk,js) = zfromce * zsolcpno(jk,js) + zfromup(jk) * zsolcpno(jk-1,js) 
     201                     zsolcp(ji,jk,js) = zfromce * zsolcpno(jk,js) + zfromup(jk) * zsolcpno(jk-1,js) 
    204202                  ENDDO 
    205203                  fromsed(ji,js) = 0. 
     
    226224 
    227225               DO jn = 1, ntimes 
    228                   DO js = 1, jpsol 
     226                  DO js = 1, jpsol + jpads 
    229227                     DO jk = 2, jpksed 
    230                         zsolcpno(jk,js) = solcp(ji,jk,js) 
     228                        zsolcpno(jk,js) = zsolcp(ji,jk,js) 
    231229                     END DO 
    232230                  ENDDO 
     
    237235                  ENDDO 
    238236 
    239                   DO js = 1, jpsol 
     237                  DO js = 1, jpsol + jpads 
    240238                     zfromce = 1. - zfromup(2) 
    241                      solcp(ji,2,js) = zfromce * zsolcpno(2,js) + zfromup(2) * zrainrf(ji,js) 
     239                     zsolcp(ji,2,js) = zfromce * zsolcpno(2,js) + zfromup(2) * zrainrf(ji,js) 
    242240                     DO jk = 3, jpksed 
    243241                        zfromce = 1. - zfromup(jk) 
    244                         solcp(ji,jk,js) = zfromce * zsolcpno(jk,js) + zfromup(jk) * zsolcpno(jk-1,js) 
     242                        zsolcp(ji,jk,js) = zfromce * zsolcpno(jk,js) + zfromup(jk) * zsolcpno(jk-1,js) 
    245243                     ENDDO 
    246244                     fromsed(ji,js) = 0. 
     
    257255            zempty(2) = 1. - zfull(2) 
    258256            DO jk = 3, jpksed 
    259                zfull (jk) = zfilled(jk) 
    260                zfull (jk) = zfull (jk) - zempty(jk-1) * dvolsm(jk) 
     257               zfull (jk) = zfilled(jk) - zempty(jk-1) * dvolsm(jk) 
    261258               zempty(jk) = 1. - zfull(jk) 
    262259            ENDDO 
    263260 
    264261            ! fill boxes with weight fraction from underlying box 
    265             DO js = 1, jpsol 
     262            DO js = 1, jpsol + jpads 
    266263               DO jk = 2, jpksedm1 
    267                   solcp(ji,jk,js) = zfull(jk) * zsolcpno(jk,js) + zempty(jk) * zsolcpno(jk+1,js) 
     264                  zsolcp(ji,jk,js) = zfull(jk) * zsolcpno(jk,js) + zempty(jk) * zsolcpno(jk+1,js) 
    268265               END DO 
    269                solcp(ji,jpksed,js) = zsolcpno(jpksed,js) * zfull(jpksed) 
     266               zsolcp(ji,jpksed,js) = zsolcpno(jpksed,js) * zfull(jpksed) 
    270267               tosed  (ji,js) = 0. 
    271268               fromsed(ji,js) = 0. 
    272269            ENDDO 
    273270            ! for the last layer, one make go up clay  
    274             solcp(ji,jpksed,jsclay) = solcp(ji,jpksed,jsclay) + zempty(jpksed) * 1. 
     271            zsolcp(ji,jpksed,jsclay) = zsolcp(ji,jpksed,jsclay) + zempty(jpksed) * 1. 
    275272            fromsed(ji,jsclay) = zempty(jpksed) * 1. * por1clay 
    276273         ELSE  ! rain > 0 and rain < total reaction loss 
    277  
    278274 
    279275            DO jk = 2, jpksed 
     
    295291            !-------------------------------------------------------------       
    296292            IF( ikwneg == 2 ) THEN ! advection is reversed in the first sediment layer 
    297  
    298293               zkwnup = dtsed * raintg(ji) / ( denssol * por1(ikwneg) * dz(ikwneg) ) 
    299294               zkwnlo = ABS( zwb(ji,ikwneg) ) / dz(ikwneg) 
     
    304299                  zempty(jk) = 1. - zfull(jk) 
    305300               ENDDO 
    306                DO js = 1, jpsol 
    307                   solcp(ji,2,js) = zfull(2) * zsolcpno(2,js)+ zkwnlo * zsolcpno(3,js) & 
     301               DO js = 1, jpsol + jpads 
     302                  zsolcp(ji,2,js) = zfull(2) * zsolcpno(2,js)+ zkwnlo * zsolcpno(3,js) & 
    308303                     &                                      + zkwnup * zrainrf(ji,js) 
    309304                  DO jk = 3, jpksedm1 
    310                      solcp(ji,jk,js) = zfull(jk) * zsolcpno(jk,js) + zempty(jk) * zsolcpno(jk+1,js) 
    311                   ENDDO 
    312                   solcp(ji,jpksed,js) = zfull(jpksed) * zsolcpno(jpksed,js) 
     305                     zsolcp(ji,jk,js) = zfull(jk) * zsolcpno(jk,js) + zempty(jk) * zsolcpno(jk+1,js) 
     306                  ENDDO 
     307                  zsolcp(ji,jpksed,js) = zfull(jpksed) * zsolcpno(jpksed,js) 
    313308                  tosed(ji,js)   = 0. 
    314309                  fromsed(ji,js) = 0. 
    315310               ENDDO 
    316                solcp(ji,jpksed,jsclay) =  solcp(ji,jpksed,jsclay) + zempty(jpksed) * 1. 
    317                !! C. Heinze  fromsed(ji,jsclay) = zempty(jpksed) * 1. * denssol * por1(jpksed) / mol_wgt(jsclay) 
     311               zsolcp(ji,jpksed,jsclay) =  zsolcp(ji,jpksed,jsclay) + zempty(jpksed) * 1. 
    318312               fromsed(ji,jsclay) = zempty(jpksed) * 1. * por1clay 
    319313                
     
    328322                  zempty(jk) = 1. - zfull(jk)  
    329323               ENDDO 
    330                DO  js = 1, jpsol 
    331                   solcp(ji,2,js) = zfull(2) * zsolcpno(2,js) + zempty(2) * zrainrf(ji,js) 
    332                ENDDO 
    333                DO  js = 1, jpsol 
     324               DO  js = 1, jpsol + jpads 
     325                  zsolcp(ji,2,js) = zfull(2) * zsolcpno(2,js) + zempty(2) * zrainrf(ji,js) 
     326               ENDDO 
     327               DO  js = 1, jpsol + jpads 
    334328                  DO jk = jpksedm1, 3, -1 
    335                      solcp(ji,jk,js) = zfull(jk) * zsolcpno(jk,js) + zempty(jk) * zsolcpno(jk-1,js) 
    336                   ENDDO 
    337                   solcp(ji,jpksed,js) = zfull(jpksed) * zsolcpno(jpksed,js) & 
     329                     zsolcp(ji,jk,js) = zfull(jk) * zsolcpno(jk,js) + zempty(jk) * zsolcpno(jk-1,js) 
     330                  ENDDO 
     331                  zsolcp(ji,jpksed,js) = zfull(jpksed) * zsolcpno(jpksed,js) & 
    338332                     &                       + zkwnup * zsolcpno(jpksedm1,js) 
    339333                  tosed(ji,js)   = 0. 
    340334                  fromsed(ji,js) = 0. 
    341335               ENDDO 
    342                solcp(ji,jpksed,jsclay) = solcp(ji,jpksed,jsclay) + zkwnlo * 1. 
    343                ! Heinze  fromsed(ji,jsclay) = zkwnlo * 1. * denssol * por1(jpksed) / mol_wgt(jsclay) 
     336               zsolcp(ji,jpksed,jsclay) = zsolcp(ji,jpksed,jsclay) + zkwnlo * 1. 
    344337               fromsed(ji,jsclay) = zkwnlo * 1.* por1clay 
    345338            ELSE IF( ikwneg > 2 .AND. ikwneg < jpksed-1 ) THEN 
     
    356349                     zempty(jk)    = 1. - zfull(jk)  
    357350                  ENDDO 
    358                   DO js = 1, jpsol 
    359                      solcp(ji,2,js) = zfull(2) * zsolcpno(2,js) + zempty(2) * zrainrf(ji,js) 
    360                   ENDDO 
    361                   DO js = 1, jpsol 
     351                  DO js = 1, jpsol + jpads 
     352                     zsolcp(ji,2,js) = zfull(2) * zsolcpno(2,js) + zempty(2) * zrainrf(ji,js) 
     353                  ENDDO 
     354                  DO js = 1, jpsol + jpads 
    362355                     DO jk = ikwneg-1, 3, -1 
    363                         solcp(ji,jk,js) = zfull(jk) * zsolcpno(jk,js) + zempty(jk) * zsolcpno(jk-1,js) 
     356                        zsolcp(ji,jk,js) = zfull(jk) * zsolcpno(jk,js) + zempty(jk) * zsolcpno(jk-1,js) 
    364357                     ENDDO 
    365358                  ENDDO 
    366359               ELSE ! ikw = 3 
    367  
    368360 
    369361                  zfull (2) = zfilled(2) - zkwnup * dvolsm(3) 
    370362                  zempty(2) = 1. - zfull(2) 
    371                   DO js = 1, jpsol 
    372                      solcp(ji,2,js) = zfull(2) * zsolcpno(2,js) + zempty(2) * zrainrf(ji,js) 
     363                  DO js = 1, jpsol + jpads 
     364                     zsolcp(ji,2,js) = zfull(2) * zsolcpno(2,js) + zempty(2) * zrainrf(ji,js) 
    373365                  ENDDO 
    374366               ENDIF 
     
    382374                     zempty(jk) = 1. - zfull(jk) 
    383375                  ENDDO 
    384                   DO js = 1, jpsol 
     376                  DO js = 1, jpsol + jpads 
    385377                     DO jk = ikwneg+1, jpksedm1 
    386                         solcp(ji,jk,js) = zfull(jk) * zsolcpno(jk,js) + zempty(jk) * zsolcpno(jk+1,js)  
     378                        zsolcp(ji,jk,js) = zfull(jk) * zsolcpno(jk,js) + zempty(jk) * zsolcpno(jk+1,js) 
    387379                     ENDDO 
    388                      solcp(ji,jpksed,js) = zfull(jpksed) * zsolcpno(jpksed,js) 
    389                   ENDDO 
    390                   solcp(ji,jpksed,jsclay) = solcp(ji,jpksed,jsclay) + zempty(jpksed) * 1. 
     380                     zsolcp(ji,jpksed,js) = zfull(jpksed) * zsolcpno(jpksed,js) 
     381                  ENDDO 
     382                  zsolcp(ji,jpksed,jsclay) = zsolcp(ji,jpksed,jsclay) + zempty(jpksed) * 1. 
    391383               ELSE 
    392384 
    393385                  zfull (jpksed) = zfilled(jpksed) - zkwnlo * dvolsm(jpksed) 
    394386                  zempty(jpksed) = 1. - zfull(jpksed)                 
    395                   DO js = 1, jpsol 
    396                      solcp(ji,jpksed,js) = zfull(jpksed) * zsolcpno(jpksed,js) 
    397                   ENDDO 
    398                   solcp(ji,jpksed,jsclay) = solcp(ji,jpksed,jsclay) + zempty(jpksed) * 1. 
     387                  DO js = 1, jpsol + jpads 
     388                     zsolcp(ji,jpksed,js) = zfull(jpksed) * zsolcpno(jpksed,js) 
     389                  ENDDO 
     390                  zsolcp(ji,jpksed,jsclay) = zsolcp(ji,jpksed,jsclay) + zempty(jpksed) * 1. 
    399391               ENDIF ! jpksedm1 
    400392                
    401393               ! ikwneg = jpksedm1  ; ikwneg+1 = jpksed ; ikwneg-1 = jpksed - 2 
    402                DO js = 1, jpsol 
    403                   solcp(ji,ikwneg,js) = zfull(ikwneg) * zsolcpno(ikwneg  ,js) & 
     394               DO js = 1, jpsol + jpads 
     395                  zsolcp(ji,ikwneg,js) = zfull(ikwneg) * zsolcpno(ikwneg  ,js) & 
    404396                     &                +  zkwnup        * zsolcpno(ikwneg-1,js) & 
    405397                     &                +  zkwnlo        * zsolcpno(ikwneg+1,js)    
     
    407399                  fromsed(ji,js)   = 0. 
    408400               ENDDO 
    409                ! Heinze  fromsed(ji,jsclay) = zempty * 1. * denssol * por1(jpksed) / mol_wgt(jsclay) 
    410401               fromsed(ji,jsclay) = zempty(jpksed) * 1. * por1clay 
    411402 
     
    413404         ENDIF  ! zwb > 0 
    414405      ENDDO  ! ji = 1, jpoce 
     406 
     407      DO js = 1, jpsol 
     408         solcp(:,:,js) = zsolcp(:,:,js) 
     409      END DO 
     410      DO jk = 2, jpksed 
     411         pwcp(:,jk,jwnh4) = (pwcp(:,jk,jwnh4) + zsolcp(:,jk,jpsol+1) * por1(jk) / por(jk) ) * radsnh4(jk) 
     412         pwcp(:,jk,jwfe2) = (pwcp(:,jk,jwfe2) + zsolcp(:,jk,jpsol+2) * por1(jk) / por(jk) ) * radsfe2(jk) 
     413      END DO 
    415414 
    416415      rainrm(:,:) = 0. 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedarr.F90

    r14786 r15075  
    1010   !!---------------------------------------------------------------------- 
    1111   !! * Modules used 
    12    USE par_oce 
    1312   USE par_sed 
    14    USE in_out_manager, ONLY : ln_timing 
    15    USE timing 
     13   USE dom_oce 
     14   USE sed 
    1615 
    1716   IMPLICIT NONE 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedbtb.F90

    r10222 r15075  
    66   !! * Modules used 
    77   USE sed     ! sediment global variable 
     8   USE sed_oce 
    89   USE sedmat  ! linear system of equations 
     10   USE sedinorg 
     11   USE sedorg 
     12   USE sedini 
    913   USE lib_mpp         ! distribued memory computing library 
    1014 
     
    3135      !!        !  06-04 (C. Ethe)  Re-organization 
    3236      !!---------------------------------------------------------------------- 
    33       !!* Arguments 
    34       INTEGER, INTENT(in) ::  kt              ! time step 
    35  
     37      !! * Arguments 
     38      INTEGER, INTENT(in)  :: kt   ! time step 
    3639      ! * local variables 
    3740      INTEGER :: ji, jk, js 
    38       REAL(wp), DIMENSION(jpoce,jpksedm1,jpsol) ::  zsol  !   solution 
     41      REAL(wp), DIMENSION(jpoce,jpksedm1,jpsol+2) ::  zsol, zrearat  !   solution 
     42      REAL(wp) :: zsolid1, zsolid2, zsolid3, zsumtot, zlimo2 
    3943      !------------------------------------------------------------------------ 
    4044 
     
    4246 
    4347      IF( kt == nitsed000 ) THEN 
    44          IF (lwp) WRITE(numsed,*) ' sed_btb : Bioturbation  ' 
     48         IF (lwp) WRITE(numsed,*) ' sed_btb : bioturbation of solid and adsorbed species  ' 
    4549         IF (lwp) WRITE(numsed,*) ' ' 
    4650      ENDIF 
     51 
    4752 
    4853      ! Initializations 
    4954      !---------------- 
    5055      zsol(:,:,:) = 0. 
     56      zrearat = 0. 
     57 
     58      ! Remineralization rates of the different POC pools 
     59      zrearat(:,:,jspoc) = -reac_pocl 
     60      zrearat(:,:,jspos) = -reac_pocs 
     61      zrearat(:,:,jspor) = -reac_pocr 
    5162 
    5263      ! right hand side of coefficient matrix 
     
    5465      DO js = 1, jpsol 
    5566         DO jk = 1, jpksedm1 
    56             DO ji = 1, jpoce 
    57                zsol(ji,jk,js) = solcp(ji,jk+1,js) 
    58             ENDDO 
    59          ENDDO 
    60       ENDDO 
     67            zsol(:,jk,js) = solcp(:,jk+1,js) 
     68         END DO 
     69      END DO 
    6170 
    62       CALL sed_mat( jpsol, jpoce, jpksedm1, zsol, dtsed / 2.0 ) 
     71      DO jk = 1, jpksedm1 
     72         zsol(:,jk,jpsol+1) = pwcp(:,jk+1,jwnh4) * adsnh4  
     73         zsol(:,jk,jpsol+2) = pwcp(:,jk+1,jwfe2) * adsfe2  
     74      END DO 
    6375 
     76      CALL sed_mat_btb( jpksedm1, jpsol+2, zsol, zrearat(:,:,:), dtsed ) 
    6477 
    6578      ! store solution of the tridiagonal system 
     
    6780      DO js = 1, jpsol 
    6881         DO jk = 1, jpksedm1 
    69             DO ji = 1, jpoce 
    70                solcp(ji,jk+1,js) = zsol(ji,jk,js) 
    71             ENDDO 
    72          ENDDO 
     82            solcp(:,jk+1,js) = zsol(:,jk,js) 
     83         END DO 
    7384      ENDDO 
     85 
     86      ! NH4 
     87      DO jk = 1, jpksedm1 
     88         pwcp(:,jk+1,jwnh4) = (pwcp(:,jk+1,jwnh4) + zsol(:,jk,jpsol+1) * por1(jk+1) / por(jk+1) ) * radsnh4(jk+1) 
     89      END DO  
     90 
     91      ! Fe2 
     92      DO jk = 1, jpksedm1 
     93         pwcp(:,jk+1,jwfe2) = (pwcp(:,jk+1,jwfe2) + zsol(:,jk,jpsol+2) * por1(jk+1) / por(jk+1) ) * radsfe2(jk+1) 
     94      END DO 
     95 
     96      DO ji = 1, jpoce 
     97 
     98         zsumtot = 0. 
     99         DO jk = 2, jpksed 
     100            zsolid1 = volc(ji,jk,jspoc) * solcp(ji,jk,jspoc) 
     101            zsolid2 = volc(ji,jk,jspos) * solcp(ji,jk,jspos) 
     102            zsolid3 = volc(ji,jk,jspor) * solcp(ji,jk,jspor) 
     103            rearatpom(ji,jk)  = ( reac_pocl * zsolid1 + reac_pocs * zsolid2 + reac_pocr * zsolid3 ) * dtsed 
     104            zsumtot = zsumtot + rearatpom(ji,jk) / dtsed * volw3d(ji,jk) * 1.e-3 * 86400. * 365. * 1E3 
     105         END DO 
     106 
     107         !    4/ Computation of the bioturbation coefficient 
     108         !       This parameterization is taken from Archer et al. (2002) 
     109         ! -------------------------------------------------------------- 
     110         zlimo2   = pwcp(ji,1,jwoxy) / (pwcp(ji,1,jwoxy) + 20.E-6) 
     111         db(ji,:) = dbiot * zsumtot**0.85 * zlimo2 / (365.0 * 86400.0) 
     112 
     113         ! ------------------------------------------------------ 
     114         !    Vertical variations of the bioturbation coefficient 
     115         ! ------------------------------------------------------ 
     116         IF (ln_btbz) THEN 
     117            DO jk = 1, jpksed 
     118               IF (profsedw(jk) < 2.0 * dbtbzsc) THEN 
     119                  db(ji,jk) = db(ji,jk) * exp( -(profsedw(jk) / dbtbzsc)**2 ) 
     120               ELSE 
     121                  db(ji,jk) = 0. 
     122               ENDIF 
     123            END DO 
     124         ELSE 
     125            DO jk = 1, jpksed 
     126               IF (profsedw(jk) > dbtbzsc) THEN 
     127                  db(ji,jk) = 0.0 
     128               ENDIF 
     129            END DO 
     130         ENDIF 
     131 
     132         ! Computation of the bioirrigation factor (from Archer, MUDS model) 
     133         irrig(ji,:) = 0.0 
     134         IF (ln_irrig) THEN 
     135            DO jk = 1, jpksed 
     136               irrig(ji,jk) = ( 7.63752 - 7.4465 * exp( -0.89603 * zsumtot ) ) * zlimo2 
     137               irrig(ji,jk) = irrig(ji,jk) * exp( -(profsedw(jk) / xirrzsc) ) 
     138            END DO 
     139         ENDIF 
     140      END DO 
     141  
     142      ! CALL inorganic and organic slow redow/chemistry processes 
     143      ! --------------------------------------------------------- 
     144      CALL sed_inorg( kt ) 
     145      CALL sed_org( kt ) 
    74146 
    75147      IF( ln_timing )  CALL timing_stop('sed_btb') 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedchem.F90

    r14086 r15075  
    66   !!====================================================================== 
    77   !!   modules used 
    8    USE par_sed 
    98   USE sed     ! sediment global variable 
    109   USE sedarr 
     
    2423   REAL(wp), PARAMETER :: pp_rdel_ah_target = 1.E-4_wp 
    2524 
    26    !! * Substitutions 
    27 #  include "do_loop_substitute.h90" 
    2825   !! * Module variables 
    2926   REAL(wp) :: & 
     
    5552   REAL(wp) :: devk19  = -26.57 
    5653   REAL(wp) :: devk110  = -29.48 
     54   REAL(wp) :: devk120 = -14.8 
     55   REAL(wp) :: devk130 = -26.43 
    5756   ! 
    5857   REAL(wp) :: devk20  = 0.1271 
     
    6766   REAL(wp) :: devk29  = 0.2020 
    6867   REAL(wp) :: devk210  = 0.1622 
     68   REAL(wp) :: devk220 = 0.0020 
     69   REAL(wp) :: devk230 = 0.0889 
    6970   ! 
    7071   REAL(wp) :: devk30  = 0. 
     
    7980   REAL(wp) :: devk39  = -3.042e-3 
    8081   REAL(wp) :: devk310  = -2.6080e-3 
     82   REAL(wp) :: devk320 = -0.4E-3 
     83   REAL(wp) :: devk330 = -0.905E-3 
    8184   ! 
    8285   REAL(wp) :: devk40  = -3.08E-3 
     
    9194   REAL(wp) :: devk49  = -4.08e-3 
    9295   REAL(wp) :: devk410  = -2.84e-3 
     96   REAL(wp) :: devk420 = 2.89E-3 
     97   REAL(wp) :: devk430 = -5.03E-3 
    9398   ! 
    9499   REAL(wp) :: devk50  = 0.0877E-3 
     
    103108   REAL(wp) :: devk59  = 0.0714e-3 
    104109   REAL(wp) :: devk510  = 0.0 
     110   REAL(wp) :: devk520 = 0.054E-3 
     111   REAL(wp) :: devk530 = 0.0814E-3 
     112 
     113   !! * Substitutions 
     114#  include "do_loop_substitute.h90" 
    105115 
    106116   !! $Id$ 
     
    180190         ztc     = temp(ji) 
    181191         ztc2    = ztc * ztc 
    182          ! zqtt    = ztkel * 0.01 
    183192         zsal    = salt(ji) 
    184193         zsal15  = SQRT( zsal ) * zsal 
     
    232241            p_alkcb  = pwcp(ji,jk,jwalk) / densSW(ji) 
    233242            p_dictot = pwcp(ji,jk,jwdic) / densSW(ji)  
    234             p_bortot = borats(ji) / densSW(ji) 
     243            p_bortot = borats(ji) 
    235244            IF (p_alkcb <= 0.) THEN 
    236245                p_hini(ji,jk) = 1.e-3 
     
    283292   DO jk = 1, jpksed 
    284293      p_alknw_inf(:,jk) =  -pwcp(:,jk,jwpo4) / densSW(:) 
    285       p_alknw_sup(:,jk) =   (2. * pwcp(:,jk,jwdic) + 2. * pwcp(:,jk,jwpo4) + pwcp(:,jk,jwsil)     & 
    286    &                        + borats(:) ) / densSW(:) 
     294      p_alknw_sup(:,jk) =   (2. * pwcp(:,jk,jwdic) + 2. * pwcp(:,jk,jwpo4) + pwcp(:,jk,jwsil) )    & 
     295   &                        / densSW(:) + borats(:)  
    287296   END DO 
    288297 
     
    313322   REAL(wp)  ::  znumer_so4, zdnumer_so4, zdenom_so4, zalk_so4, zdalk_so4 
    314323   REAL(wp)  ::  znumer_flu, zdnumer_flu, zdenom_flu, zalk_flu, zdalk_flu 
     324   REAL(wp)  ::  znumer_h2s, zdnumer_h2s, zdenom_h2s, zalk_h2s, zdalk_h2s 
     325   REAL(wp)  ::  znumer_nh3, zdnumer_nh3, zdenom_nh3, zalk_nh3, zdalk_nh3 
    315326   REAL(wp)  ::  zalk_wat, zdalk_wat 
    316    REAL(wp)  ::  zfact, p_alktot, zdic, zbot, zpt, zst, zft, zsit 
     327   REAL(wp)  ::  zfact, p_alktot, zdic, zbot, zpt, zst, zft, zsit, zh2s, znh3 
    317328   LOGICAL   ::  l_exitnow 
    318329   REAL(wp), PARAMETER :: pz_exp_threshold = 1.0 
     
    363374 
    364375            p_alktot = pwcp(ji,jk,jwalk) / densSW(ji) 
    365             zdic  = pwcp(ji,jk,jwdic) / densSW(ji) 
    366             zbot  = borats(ji) / densSW(ji) 
    367             zpt = pwcp(ji,jk,jwpo4) / densSW(ji) 
     376            zdic = pwcp(ji,jk,jwdic) / densSW(ji) 
     377            zbot = borats(ji) 
     378            zpt  = pwcp(ji,jk,jwpo4) / densSW(ji) 
    368379            zsit = pwcp(ji,jk,jwsil) / densSW(ji) 
    369             zst = sulfats(ji) 
    370             zft = fluorids(ji) 
     380            zst  = pwcp(ji,jk,jwso4) / densSW(ji) 
     381            zft  = fluorids(ji) 
     382            zh2s = pwcp(ji,jk,jwh2s) / densSW(ji) 
     383            znh3 = pwcp(ji,jk,jwnh4) / densSW(ji) 
    371384            aphscale = 1. + sulfats(ji)/aks3s(ji) 
    372385            zh = zhi(ji,jk) 
     
    383396 
    384397            ! B(OH)3 - B(OH)4 : n=1, m=0 
    385             znumer_bor = akbs(ji) 
    386             zdenom_bor = akbs(ji) + zh 
    387             zalk_bor   = zbot * (znumer_bor/zdenom_bor) 
     398            znumer_bor  = akbs(ji) 
     399            zdenom_bor  = akbs(ji) + zh 
     400            zalk_bor    = zbot * (znumer_bor/zdenom_bor) 
    388401            zdnumer_bor = akbs(ji) 
    389402            zdalk_bor   = -zbot*(zdnumer_bor/zdenom_bor**2) 
     
    410423            zdalk_sil   = -zsit * (zdnumer_sil/zdenom_sil**2) 
    411424 
     425            ! H2S - HS : n=1i, m=1 
     426            znumer_h2s  = akh2s(ji) 
     427            zdenom_h2s  = akh2s(ji) + zh 
     428            zalk_h2s    = zh2s * (znumer_h2s/zdenom_h2s) 
     429            zdnumer_h2s = akh2s(ji) 
     430            zdalk_h2s   = -zh2s * (zdnumer_h2s/zdenom_h2s**2) 
     431 
     432            ! NH4 - NH3 : n=1i, m=1 
     433            znumer_nh3  = aknh3(ji) 
     434            zdenom_nh3  = aknh3(ji) + zh 
     435            zalk_nh3    = znh3 * (znumer_nh3/zdenom_nh3) 
     436            zdnumer_nh3 = aknh3(ji) 
     437            zdalk_nh3   = -znh3 * (zdnumer_nh3/zdenom_nh3**2) 
     438 
    412439            ! HSO4 - SO4 : n=1, m=1 
    413440            aphscale = 1.0 + zst/aks3s(ji) 
     
    432459            zeqn = zalk_dic + zalk_bor + zalk_po4 + zalk_sil   & 
    433460            &      + zalk_so4 + zalk_flu                       & 
    434             &      + zalk_wat - p_alktot 
     461            &      + zalk_wat + zalk_h2s + zalk_nh3 - p_alktot 
    435462 
    436463            zalka = p_alktot - (zalk_bor + zalk_po4 + zalk_sil   & 
    437             &       + zalk_so4 + zalk_flu + zalk_wat) 
     464            &       + zalk_so4 + zalk_flu + zalk_wat + zalk_h2s + zalk_nh3) 
    438465 
    439466            zdeqndh = zdalk_dic + zdalk_bor + zdalk_po4 + zdalk_sil & 
    440             &         + zdalk_so4 + zdalk_flu + zdalk_wat 
     467            &         + zdalk_so4 + zdalk_flu + zdalk_wat + zdalk_h2s + zdalk_nh3 
    441468 
    442469            ! Adapt bracketing interval 
     
    565592      REAL(wp) ::   zckb , zck1 , zck2  , zckw  , zak1 , zak2  , zakb , zaksp0, zakw 
    566593      REAL(wp) ::   zck1p, zck2p, zck3p, zcksi, zak1p, zak2p, zak3p, zaksi 
    567       REAL(wp) ::   zst  , zft  , zcks  , zckf  , zaksp1 
     594      REAL(wp) ::   zst  , zft  , zcks  , zckhs, zckf  , zaksp1, zcknh3 
    568595      REAL(wp) ::   total2free, free2SWS, total2SWS, SWS2total 
    569596      !!--------------------------------------------------------------------- 
     
    630657         &         + LOG(1.0 - 0.001005 * zsal)) 
    631658 
     659         ! DISSOCIATION CONSTANT FOR H2S on free H scale  
     660         zckhs   = EXP(-13275.3 * ztr + 225.838 - 34.6435 * zlogt       & 
     661         &         + 0.3449 * zsqrt - 0.0274 * zsal ) 
     662 
     663         ! DISSOCIATION CONSTANT FOR NH3 on free H scale  
     664         zcknh3   = EXP(-6285.33 * ztr - 0.25444  + 0.0001635 * ztkel   & 
     665         &         + (0.46532 - 123.7184 * ztr) * zsqrt                 & 
     666         &         + (-0.01992 + 3.17556 * ztr) * zsal ) 
     667 
    632668         ! DISSOCIATION CONSTANT FOR FLUORIDES on free H scale (Dickson and Riley 79) 
    633669         zckf    = EXP( 1590.2*ztr - 12.641 + 1.525*zisqrt   & 
     
    751787         aksis(ji) = zaksi * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 ) 
    752788 
     789         zbuf1  =     - ( devk120 + devk220 * ztc + devk320 * ztc * ztc ) 
     790         zbuf2  = 0.5 * ( devk420 + devk520 * ztc ) 
     791         akh2s(ji) = zckhs * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 ) 
     792 
     793         zbuf1  =     - ( devk130 + devk230 * ztc + devk330 * ztc * ztc ) 
     794         zbuf2  = 0.5 * ( devk430 + devk530 * ztc ) 
     795         aknh3(ji) = zcknh3 * EXP( zbuf1 * zcpexp + zbuf2 * zcpexp2 ) 
     796 
    753797         ! Convert to total scale 
    754798         ak1s(ji)  = ak1s(ji)  * SWS2total 
     
    761805         aksis(ji) = aksis(ji) * SWS2total 
    762806         akf3s(ji) = akf3s(ji) / total2free 
     807         akh2s(ji) = akh2s(ji) * SWS2total 
     808         aknh3(ji) = aknh3(ji) * SWS2total 
    763809 
    764810         ! APPARENT SOLUBILITY PRODUCT K'SP OF CALCITE 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/seddiff.F90

    r14385 r15075  
    4242      !! Arguments 
    4343      INTEGER, INTENT(in) ::   kt, knt       ! number of iteration 
    44       ! --- local variables 
    45       INTEGER :: ji, jk, jw   ! dummy looop indices 
     44!       
    4645 
    47       REAL(wp), DIMENSION(jpoce,jpksed) :: zrearat1, zrearat2   ! reaction rate in pore water 
    48       !! 
    49       !!---------------------------------------------------------------------- 
    50  
    51       IF( ln_timing )  CALL timing_start('sed_diff') 
    52 ! 
    53       IF( kt == nitsed000 .AND. knt == 1 ) THEN 
    54          IF (lwp) THEN 
    55             WRITE(numsed,*) ' sed_diff : pore-water diffusion ' 
    56             WRITE(numsed,*) ' ' 
    57          ENDIF 
    58       ENDIF 
    59  
    60      ! Initializations 
    61      !---------------------- 
    62       zrearat1(:,:) = 0. 
    63       zrearat2(:,:) = 0. 
    64  
    65       ! -------------------------------------- 
    66       ! Solves solute diffusion in pore waters 
    67       ! -------------------------------------- 
    68  
    69       ! Solves tridiagonal system 
    70       DO jw = 1, jpwat 
    71          CALL sed_mat( jw, jpoce, jpksed, zrearat1, zrearat2, pwcp(:,:,jw), dtsed2 / 2.0 ) 
    72       END DO 
    73  
    74       CALL sed_mat( jwdic, jpoce, jpksed, zrearat1, zrearat2, sedligand(:,:), dtsed2 / 2.0 ) 
    75  
    76       IF( ln_timing )  CALL timing_stop('sed_diff') 
    77 !       
    7846   END SUBROUTINE sed_diff 
    7947 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/seddsr.F90

    r14385 r15075  
    1919   !! * Module variables 
    2020 
    21    REAL(wp) :: zadsnh4 
    2221   REAL(wp), DIMENSION(jpsol), PUBLIC      :: dens_mol_wgt  ! molecular density  
    23    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zvolc    ! temp. variables 
    24  
    2522 
    2623   !! $Id$ 
    2724CONTAINS 
    2825    
    29    SUBROUTINE sed_dsr( kt, knt )  
     26   SUBROUTINE sed_dsr( ji )  
    3027      !!---------------------------------------------------------------------- 
    3128      !!                   ***  ROUTINE sed_dsr  *** 
     
    4946      !!---------------------------------------------------------------------- 
    5047      !! Arguments 
    51       INTEGER, INTENT(in) ::   kt, knt      ! number of iteration 
     48      INTEGER, INTENT(in) ::   ji ! number of iteration 
    5249      ! --- local variables 
    53       INTEGER :: ji, jk, js, jw, jn   ! dummy looop indices 
    54  
    55       REAL(wp), DIMENSION(jpoce,jpksed) :: zrearat1, zrearat2, zrearat3    ! reaction rate in pore water 
    56       REAL(wp), DIMENSION(jpoce,jpksed) :: zundsat    ! undersaturation ; indice jpwatp1 is for calcite    
    57       REAL(wp), DIMENSION(jpoce,jpksed) :: zlimo2, zlimno3, zlimso4, zlimfeo    ! undersaturation ; indice jpwatp1 is for calcite    
    58       REAL(wp), DIMENSION(jpoce)        :: zsumtot 
    59       REAL(wp)  ::  zsolid1, zsolid2, zsolid3, zvolw, zreasat 
    60       REAL(wp)  ::  zgamma, zbeta, zlimtmp 
     50      INTEGER :: jk, js, jw, jn   ! dummy looop indices 
     51 
     52      REAL(wp), DIMENSION(jpksed) ::zlimo2, zlimno3, zlimso4, zlimfeo    ! undersaturation ; indice jpwatp1 is for calcite    
     53      REAL(wp)  ::  zreasat 
    6154      !! 
    6255      !!---------------------------------------------------------------------- 
     
    6457      IF( ln_timing )  CALL timing_start('sed_dsr') 
    6558! 
    66       IF( kt == nitsed000 .AND. knt == 1 ) THEN 
    67          IF (lwp) THEN 
    68             WRITE(numsed,*) ' sed_dsr : Dissolution reaction ' 
    69             WRITE(numsed,*) ' ' 
    70          ENDIF 
    71       ENDIF 
    72  
    7359     ! Initializations 
    7460     !---------------------- 
    7561       
    76       zrearat1(:,:)   = 0.    ;   zundsat(:,:)  = 0. 
    77       zlimo2 (:,:)    = 0.    ;   zlimno3(:,:)  = 0. ; zrearat2(:,:) = 0. 
    78       zlimso4(:,:)    = 0.    ;   zrearat3(:,:) = 0. 
    79       zsumtot(:)      = rtrn 
     62      zlimo2 (:)    = 0.    ;   zlimno3(:)  = 0. 
     63      zlimso4(:)    = 0. 
    8064   
    81       ALLOCATE( zvolc(jpoce, jpksed, jpsol) ) 
    82       zvolc(:,:,:)    = 0. 
    83       zadsnh4 = 1.0 / ( 1.0 + adsnh4 ) 
    84  
    85       ! Conversion of volume units 
    86       !---------------------------- 
    87       DO js = 1, jpsol 
    88          DO jk = 1, jpksed 
    89             DO ji = 1, jpoce 
    90                zvolc(ji,jk,js) = ( vols3d(ji,jk) * dens_mol_wgt(js) ) /  & 
    91                   &              ( volw3d(ji,jk) * 1.e-3 ) 
    92             ENDDO 
    93          ENDDO 
    94       ENDDO 
    95  
    9665      !---------------------------------------------------------- 
    9766      ! 5.  Beginning of solid reaction 
    9867      !--------------------------------------------------------- 
    9968       
    100       ! Definition of reaction rates [rearat]=sans dim  
    101       ! For jk=1 no reaction (pure water without solid) for each solid compo 
    102       zrearat1(:,:) = 0. 
    103       zrearat2(:,:) = 0. 
    104       zrearat3(:,:) = 0. 
    105  
    106       zundsat(:,:) = MAX( pwcp(:,:,jwoxy) - rtrn, 0. ) 
    107  
    108       DO jk = 2, jpksed 
    109          DO ji = 1, jpoce 
    110             zsolid1 = zvolc(ji,jk,jspoc)  * solcp(ji,jk,jspoc) 
    111             zsolid2 = zvolc(ji,jk,jspos)  * solcp(ji,jk,jspos) 
    112             zsolid3 = zvolc(ji,jk,jspor)  * solcp(ji,jk,jspor) 
    113             zrearat1(ji,jk)  = ( reac_pocl * dtsed2 * zsolid1 ) / ( 1. + reac_pocl * dtsed2 ) 
    114             zrearat2(ji,jk)  = ( reac_pocs * dtsed2 * zsolid2 ) / ( 1. + reac_pocs * dtsed2 ) 
    115             zrearat3(ji,jk)  = ( reac_pocr * dtsed2 * zsolid3 ) / ( 1. + reac_pocr * dtsed2 ) 
    116             solcp(ji,jk,jspoc) = solcp(ji,jk,jspoc) - zrearat1(ji,jk) / zvolc(ji,jk,jspoc) 
    117             solcp(ji,jk,jspos) = solcp(ji,jk,jspos) - zrearat2(ji,jk) / zvolc(ji,jk,jspos) 
    118             solcp(ji,jk,jspor) = solcp(ji,jk,jspor) - zrearat3(ji,jk) / zvolc(ji,jk,jspor) 
    119             zreasat = zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) 
    120  
    121             ! For DIC 
    122             pwcp(ji,jk,jwdic)  = pwcp(ji,jk,jwdic) + zreasat 
    123             zsumtot(ji) = zsumtot(ji) + zreasat / dtsed2 * volw3d(ji,jk) * 1.e-3 * 86400. * 365. * 1E3 
    124  
    125             ! For alkalinity 
    126             pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + zreasat * ( srno3 - 2.* spo4r ) 
    127  
    128             ! For Phosphate (in mol/l) 
    129             pwcp(ji,jk,jwpo4)  = pwcp(ji,jk,jwpo4) + zreasat * spo4r 
    130  
    131             ! For iron (in mol/l) 
    132             pwcp(ji,jk,jwfe2)  = pwcp(ji,jk,jwfe2) + fecratio(ji) * zreasat 
    133  
    134             ! Ammonium 
    135             pwcp(ji,jk,jwnh4)  = pwcp(ji,jk,jwnh4) + zreasat * srno3 * zadsnh4 
    136  
    137             ! Ligands 
    138             sedligand(ji,jk)   = sedligand(ji,jk) + ratligc * zreasat 
    139  
    140          ENDDO 
    141       ENDDO 
    142  
    143       ! left hand side of coefficient matrix 
    144       DO jk = 2, jpksed 
    145          DO ji = 1, jpoce 
    146             zreasat = zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) 
    147             zbeta   = xksedo2 - pwcp(ji,jk,jwoxy) + so2ut * zreasat 
    148             zgamma = - xksedo2 * pwcp(ji,jk,jwoxy) 
    149             zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / 2.0 
    150             zlimo2(ji,jk) = zundsat(ji,jk) / ( zundsat(ji,jk) + xksedo2 ) 
    151  
    152             ! Oxygen 
    153             pwcp(ji,jk,jwoxy)  = zundsat(ji,jk) + MIN( pwcp(ji,jk,jwoxy), rtrn ) 
    154             zreasat = zreasat * zlimo2(ji,jk) 
    155  
    156             ! Ligands 
    157             sedligand(ji,jk)   = sedligand(ji,jk) - reac_ligc * sedligand(ji,jk) 
    158          ENDDO 
     69      ! Computes the SMS of the species which do not affect the remin 
     70      ! processes (Alkalinity, PO4, NH4, and the release of Fe from  
     71      ! biogenic Fe 
     72      ! In the following, all loops start from jpk = 2 as reactions  
     73      ! only occur in the sediment 
     74      ! -------------------------------------------------------------- 
     75      DO jk = 2, jpksed 
     76         zreasat = rearatpom(ji,jk) 
     77         ! For alkalinity 
     78         pwcpa(ji,jk,jwalk)  = pwcpa(ji,jk,jwalk) + zreasat * ( srno3 - 2.* spo4r ) 
     79         ! For Phosphate (in mol/l) 
     80         pwcpa(ji,jk,jwpo4)  = pwcpa(ji,jk,jwpo4) + zreasat * spo4r 
     81 
     82         ! For iron (in mol/l) 
     83         pwcpa(ji,jk,jwfe2)  = pwcpa(ji,jk,jwfe2) + fecratio(ji) * zreasat * radsfe2(jk) 
     84      ENDDO 
     85 
     86      ! Computes SMS of oxygen 
     87      DO jk = 2, jpksed 
     88         zlimo2(jk) = pwcp(ji,jk,jwoxy) / ( pwcp(ji,jk,jwoxy) + xksedo2 ) 
     89         zreasat = rearatpom(ji,jk) * zlimo2(jk) 
     90         ! Acid Silicic  
     91         pwcpa(ji,jk,jwoxy)  = pwcpa(ji,jk,jwoxy) - so2ut * zreasat 
     92      ENDDO 
     93 
     94      !-------------------------------------------------------------------- 
     95      ! Denitrification 
     96      !-------------------------------------------------------------------- 
     97      DO jk = 2, jpksed 
     98         zlimno3(jk) = ( 1.0 - zlimo2(jk) ) * pwcp(ji,jk,jwno3) / ( pwcp(ji,jk,jwno3) + xksedno3 )  
     99         zreasat = rearatpom(ji,jk) * zlimno3(jk) 
     100         ! For nitrates 
     101         pwcpa(ji,jk,jwno3) = pwcpa(ji,jk,jwno3) - zreasat * srDnit 
     102         ! For alkalinity 
     103         pwcpa(ji,jk,jwalk) = pwcpa(ji,jk,jwalk) + zreasat * srDnit 
     104      ENDDO 
     105 
     106 
     107      !-------------------------------------------------------------------- 
     108      ! Begining POC iron reduction 
     109      !-------------------------------------------------------------------- 
     110 
     111      DO jk = 2, jpksed 
     112         zlimfeo(jk) = ( 1.0 - zlimno3(jk) - zlimo2(jk) ) * solcp(ji,jk,jsfeo) / ( solcp(ji,jk,jsfeo) + xksedfeo ) 
     113         zreasat = rearatpom(ji,jk) * zlimfeo(jk) 
     114         ! For FEOH 
     115         solcpa(ji,jk,jsfeo) = solcpa(ji,jk,jsfeo) - 4.0 * zreasat / volc(ji,jk,jsfeo) 
     116         ! For PO4 
     117         pwcpa(ji,jk,jwpo4)  = pwcpa(ji,jk,jwpo4) + zreasat * 4.0 * redfep 
     118         ! For alkalinity 
     119         pwcpa(ji,jk,jwalk)  = pwcpa(ji,jk,jwalk) + 8.0 * zreasat 
     120         ! Iron 
     121         pwcpa(ji,jk,jwfe2)  = pwcpa(ji,jk,jwfe2) + zreasat * 4.0 * radsfe2(jk) 
    159122      ENDDO 
    160123 
    161124      !-------------------------------------------------------------------- 
    162125      ! Begining POC denitrification and NO3- diffusion 
    163       ! (indice n°5 for couple POC/NO3- ie solcp(:,:,jspoc)/pwcp(:,:,jwno3)) 
    164       !-------------------------------------------------------------------- 
    165  
    166       zundsat(:,:) = MAX(0., pwcp(:,:,jwno3) - rtrn) 
    167  
    168       DO jk = 2, jpksed 
    169          DO ji = 1, jpoce 
    170             zlimtmp = ( 1.0 - zlimo2(ji,jk) ) 
    171             zreasat = zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) 
    172             zbeta   = xksedno3 - pwcp(ji,jk,jwno3) + srDnit * zreasat * zlimtmp 
    173             zgamma  = - xksedno3 * pwcp(ji,jk,jwno3) 
    174             zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / 2.0 
    175             zlimno3(ji,jk) = zlimtmp * zundsat(ji,jk) / ( zundsat(ji,jk) + xksedno3 ) 
    176  
    177             ! For nitrates 
    178             pwcp(ji,jk,jwno3) = zundsat(ji,jk) + MIN(pwcp(ji,jk,jwno3), rtrn) 
    179             zreasat = zreasat * zlimno3(ji,jk) 
    180  
    181             ! For alkalinity 
    182             pwcp(ji,jk,jwalk) = pwcp(ji,jk,jwalk) + zreasat * srDnit 
    183          ENDDO 
    184       ENDDO 
    185  
    186       !-------------------------------------------------------------------- 
    187       ! Begining POC iron reduction 
    188       ! (indice n�5 for couple POFe(OH)3 ie solcp(:,:,jspoc)/pwcp(:,:,jsfeo)) 
    189       !-------------------------------------------------------------------- 
    190  
    191       zundsat(:,:) = MAX(0., solcp(:,:,jsfeo) - rtrn) 
    192  
    193       DO jk = 2, jpksed 
    194          DO ji = 1, jpoce 
    195             zlimtmp = 1.0 - zlimo2(ji,jk) - zlimno3(ji,jk) 
    196             zreasat = ( zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) ) / zvolc(ji,jk,jsfeo) 
    197             zbeta   = xksedfeo - solcp(ji,jk,jsfeo) + 4.0 * zreasat * zlimtmp 
    198             zgamma  = -xksedfeo * solcp(ji,jk,jsfeo) 
    199             zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / 2.0 
    200             zlimfeo(ji,jk) = zlimtmp * zundsat(ji,jk) / ( zundsat(ji,jk) + xksedfeo ) 
    201             zreasat = ( zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) ) * zlimfeo(ji,jk) 
    202  
    203             ! For FEOH 
    204             solcp(ji,jk,jsfeo) = zundsat(ji,jk) + MIN(solcp(ji,jk,jsfeo), rtrn) 
    205  
    206             ! For Phosphate (in mol/l) 
    207             pwcp(ji,jk,jwpo4)  = pwcp(ji,jk,jwpo4) + zreasat * 4.0 * redfep 
    208  
    209             ! For alkalinity 
    210             pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + 8.0 * zreasat 
    211  
    212             ! Iron 
    213             pwcp(ji,jk,jwfe2)  = pwcp(ji,jk,jwfe2) + zreasat * 4.0 
    214          ENDDO 
    215       ENDDO 
    216  
    217 !      !-------------------------------------------------------------------- 
    218 !      ! Begining POC denitrification and NO3- diffusion 
    219 !      ! (indice n�5 for couple POC/NO3- ie solcp(:,:,jspoc)/pwcp(:,:,jwno3)) 
    220 !      !-------------------------------------------------------------------- 
    221 ! 
    222       zundsat(:,:) = MAX(0., pwcp(:,:,jwso4) - rtrn) 
    223  
    224       DO jk = 2, jpksed 
    225          DO ji = 1, jpoce 
    226             zlimtmp = 1.0 - zlimo2(ji,jk) - zlimno3(ji,jk) - zlimfeo(ji,jk) 
    227             zreasat = zrearat1(ji,jk) + zrearat2(ji,jk) + zrearat3(ji,jk) 
    228             zbeta   = xksedso4 - pwcp(ji,jk,jwso4) + 0.5 * zreasat * zlimtmp 
    229             zgamma = - xksedso4 * pwcp(ji,jk,jwso4) 
    230             zundsat(ji,jk) = ( - zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / 2.0 
    231             zlimso4(ji,jk) = zlimtmp * zundsat(ji,jk) / ( zundsat(ji,jk) + xksedso4 ) 
    232  
    233             ! For sulfur 
    234             pwcp(ji,jk,jwso4)  =  zundsat(ji,jk) + MIN(pwcp(ji,jk,jwso4), rtrn) 
    235             zreasat = zreasat * zlimso4(ji,jk) 
    236             pwcp(ji,jk,jwh2s)  = pwcp(ji,jk,jwh2s) + 0.5 * zreasat 
    237  
    238             ! For alkalinity 
    239             pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + zreasat 
    240          ENDDO 
    241       ENDDO 
    242  
    243       ! Oxydation of the reduced products. Here only ammonium and ODU is accounted for 
    244       ! There are two options here: A simple time splitting scheme and a modified  
    245      ! Patankar scheme 
    246       ! ------------------------------------------------------------------------------ 
    247       call sed_dsr_redoxb 
    248  
    249       ! --------------------------------------------------------------  
    250       !    4/ Computation of the bioturbation coefficient 
    251       !       This parameterization is taken from Archer et al. (2002) 
    252       ! -------------------------------------------------------------- 
    253  
    254       DO ji = 1, jpoce 
    255          db(ji,:) = dbiot * zsumtot(ji) * pwcp(ji,1,jwoxy) / (pwcp(ji,1,jwoxy) + 20.E-6) 
    256       END DO 
    257  
    258       ! ------------------------------------------------------ 
    259       !    Vertical variations of the bioturbation coefficient 
    260       ! ------------------------------------------------------ 
    261       IF (ln_btbz) THEN 
    262          DO ji = 1, jpoce 
    263             db(ji,:) = db(ji,:) * exp( -(profsedw(:) / dbtbzsc)**2 ) / (365.0 * 86400.0) 
    264          END DO 
    265       ELSE 
    266          DO jk = 1, jpksed 
    267             IF (profsedw(jk) > dbtbzsc) THEN 
    268                 db(:,jk) = 0.0 
    269             ENDIF 
    270          END DO 
    271       ENDIF 
    272  
    273       IF (ln_irrig) THEN 
    274          DO jk = 1, jpksed 
    275             DO ji = 1, jpoce 
    276                irrig(ji,jk) = ( 7.63752 - 7.4465 * exp( -0.89603 * zsumtot(ji) ) ) * pwcp(ji,1,jwoxy)  & 
    277                &             / (pwcp(ji,1,jwoxy) + 20.E-6)  
    278                irrig(ji,jk) = irrig(ji,jk) * exp( -(profsedw(jk) / xirrzsc) ) 
    279             END DO 
    280          END DO 
    281       ELSE 
    282          irrig(:,:) = 0.0 
    283       ENDIF 
    284  
    285       DEALLOCATE( zvolc ) 
     126      !-------------------------------------------------------------------- 
     127 
     128      DO jk = 2, jpksed 
     129         zlimso4(jk) = ( 1.0 - zlimno3(jk) - zlimo2(jk) - zlimfeo(jk) ) * pwcp(ji,jk,jwso4) / ( pwcp(ji,jk,jwso4) + xksedso4 ) 
     130         zreasat = rearatpom(ji,jk) * zlimso4(jk) 
     131         ! For sulfur 
     132         pwcpa(ji,jk,jwso4)  =  pwcpa(ji,jk,jwso4) - 0.5 * zreasat  
     133         pwcpa(ji,jk,jwh2s)  = pwcpa(ji,jk,jwh2s) + 0.5 * zreasat 
     134         ! For alkalinity 
     135         pwcpa(ji,jk,jwalk)  = pwcpa(ji,jk,jwalk) + zreasat 
     136      ENDDO 
     137 
     138      ! Secondary redox reactions 
     139      ! ------------------------- 
     140 
     141      call sed_dsr_redoxb( ji ) 
    286142 
    287143      IF( ln_timing )  CALL timing_stop('sed_dsr') 
     
    289145   END SUBROUTINE sed_dsr 
    290146 
    291    SUBROUTINE sed_dsr_redoxb 
     147   SUBROUTINE sed_dsr_redoxb(ji) 
    292148      !!---------------------------------------------------------------------- 
    293149      !!                   ***  ROUTINE sed_dsr_redox  *** 
     
    295151      !!  ** Purpose :  computes secondary redox reactions 
    296152      !! 
    297       !!  ** Methode :  It uses Strand splitter algorithm proposed by  
    298       !!                Nguyen et al. (2009) and modified by Wang et al. (2018) 
    299       !!                Basically, each equation is solved analytically when  
    300       !!                feasible, otherwise numerically at t+1/2. Then  
    301       !!                the last equation is solved at t+1. The other equations 
    302       !!                are then solved at t+1 starting in the reverse order. 
    303       !!                Ideally, it's better to start from the fastest reaction 
    304       !!                to the slowest and then reverse the order to finish up 
    305       !!                with the fastest one. But random order works well also. 
    306       !!                The scheme is second order, positive and mass  
    307       !!                conserving. It works well for stiff systems. 
    308       !!  
    309153      !!   History : 
    310154      !!        !  18-08 (O. Aumont)  Original code 
     
    312156      !! Arguments 
    313157      ! --- local variables 
    314       INTEGER   ::  ji, jk, jn, jw   ! dummy looop indices 
    315  
    316       REAL, DIMENSION(6)  :: zsedtrn, zsedtra 
    317       REAL(wp)  ::  zalpha, zbeta, zgamma, zdelta, zepsi, zsedfer 
     158      INTEGER, INTENT(IN) :: ji 
     159      INTEGER   ::  jni, jnj, jk   ! dummy looop indices 
     160 
     161      REAL(wp)  ::  zalpha, zexcess, zh2seq, zsedfer, zreasat 
    318162      !! 
    319163      !!---------------------------------------------------------------------- 
     
    321165      IF( ln_timing )  CALL timing_start('sed_dsr_redoxb') 
    322166 
    323       DO ji = 1, jpoce 
    324          DO jk = 2, jpksed 
    325             zsedtrn(1)  = pwcp(ji,jk,jwoxy) 
    326             zsedtrn(2)  = MAX(0., pwcp(ji,jk,jwh2s) ) 
    327             zsedtrn(3)  = pwcp(ji,jk,jwnh4) 
    328             zsedtrn(4)  = MAX(0., pwcp(ji,jk,jwfe2) - sedligand(ji,jk) ) 
    329             zsedfer     = MIN(0., pwcp(ji,jk,jwfe2) - sedligand(ji,jk) ) 
    330             zsedtrn(5)  = solcp(ji,jk,jsfeo) * zvolc(ji,jk,jsfeo) 
    331             zsedtrn(6)  = solcp(ji,jk,jsfes) * zvolc(ji,jk,jsfes) 
    332             zsedtra(:)  = MAX(0., zsedtrn(:) - rtrn ) 
    333  
    334             ! First pass of the scheme. At the end, it is 1st order  
    335             ! ----------------------------------------------------- 
    336             ! Fe + O2 
    337             zalpha = zsedtra(1) - 0.25 * zsedtra(4) 
    338             zbeta  = zsedtra(4) + zsedtra(5)  
    339             zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(4) 
    340             zdelta = pwcp(ji,jk,jwpo4) - redfep * zsedtra(4) 
    341             IF ( zalpha == 0. ) THEN 
    342                zsedtra(4) = zsedtra(4) / ( 1.0 + 0.25 * zsedtra(4) * reac_fe2 * dtsed2 / 2.0 ) 
    343             ELSE 
    344                zsedtra(4) = ( zsedtra(4) * zalpha ) / ( 0.25 * zsedtra(4)    & 
    345                &            * ( exp( reac_fe2 * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    346                &            + zalpha * exp( reac_fe2 * zalpha * dtsed2 / 2. ) ) 
    347             ENDIF 
    348             zsedtra(1) = zalpha + 0.25 * zsedtra(4) 
    349             zsedtra(5) = zbeta  - zsedtra(4) 
    350             pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(4) 
    351             pwcp(ji,jk,jwpo4) = zdelta + redfep * zsedtra(4) 
    352             ! H2S + O2 
    353             zalpha = zsedtra(1) - 2.0 * zsedtra(2) 
    354             zbeta  = pwcp(ji,jk,jwso4) + zsedtra(2) 
    355             zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(2) 
    356             IF ( zalpha == 0. ) THEN 
    357                zsedtra(2) = zsedtra(2) / ( 1.0 + 2.0 * zsedtra(2) * reac_h2s * dtsed2 / 2.0 ) 
    358             ELSE 
    359                zsedtra(2) = ( zsedtra(2) * zalpha ) / ( 2.0 * zsedtra(2) * ( exp( reac_h2s * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    360                &            + zalpha * exp( reac_h2s * zalpha * dtsed2 / 2. ) ) 
    361             ENDIF 
    362             zsedtra(1) = zalpha + 2.0 * zsedtra(2) 
    363             pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(2) 
    364             pwcp(ji,jk,jwso4) = zbeta - zsedtra(2) 
    365             ! NH4 + O2 
    366             zalpha = zsedtra(1) - 2.0 * zsedtra(3) / zadsnh4  
    367             zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(3) /zadsnh4  
    368             IF ( zalpha == 0. ) THEN 
    369                zsedtra(3) = zsedtra(3) / ( 1.0 + 2.0 * zsedtra(3) * reac_nh4 / zadsnh4 * dtsed2 / 2.0 ) 
    370             ELSE 
    371                zsedtra(3) = ( zsedtra(3) * zalpha * zadsnh4 ) / ( 2.0 * zsedtra(3) * ( exp( reac_nh4 * zadsnh4 * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    372                &            + zalpha * zadsnh4 * exp( reac_nh4 * zadsnh4 * zalpha * dtsed2 /2. ) ) 
    373             ENDIF 
    374             zsedtra(1) = zalpha + 2.0 * zsedtra(3) / zadsnh4  
    375             pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(3) / zadsnh4  
    376             ! FeS - O2 
    377             zalpha = zsedtra(1) - 2.0 * zsedtra(6) 
    378             zbeta  = zsedtra(4) + zsedtra(6) 
    379             zgamma = pwcp(ji,jk,jwso4) + zsedtra(6) 
    380             IF ( zalpha == 0. ) THEN 
    381                zsedtra(6) = zsedtra(6) / ( 1.0 + 2.0 * zsedtra(6) * reac_feso * dtsed2 / 2.0 ) 
    382             ELSE 
    383                zsedtra(6) = ( zsedtra(6) * zalpha ) / ( 2.0 * zsedtra(6) * ( exp( reac_feso * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    384                &            + zalpha * exp( reac_feso * zalpha * dtsed2 /2. ) ) 
    385             ENDIF 
    386             zsedtra(1) = zalpha + 2.0 * zsedtra(6) 
    387             zsedtra(4) = zbeta  - zsedtra(6) 
    388             pwcp(ji,jk,jwso4) = zgamma - zsedtra(6) 
    389 !            ! Fe - H2S 
    390             zalpha = zsedtra(2) - zsedtra(4) 
    391             zbeta  = zsedtra(4) + zsedtra(6) 
    392             zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(4) 
    393             IF ( zalpha == 0. ) THEN 
    394                zsedtra(4) = zsedtra(4) / ( 1.0 + zsedtra(4) * reac_fes * dtsed2 / 2.0 ) 
    395             ELSE 
    396                zsedtra(4) = ( zsedtra(4) * zalpha ) / ( zsedtra(4) * ( exp( reac_fes * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    397                &            + zalpha * exp( reac_fes * zalpha * dtsed2 /2. ) ) 
    398             ENDIF 
    399             zsedtra(2) = zalpha + zsedtra(4) 
    400             zsedtra(6) = zbeta  - zsedtra(4) 
    401             pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(4) 
    402             ! FEOH + H2S 
    403             zalpha = zsedtra(5) - 2.0 * zsedtra(2) 
    404             zbeta  = zsedtra(5) + zsedtra(4) 
    405             zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(4) 
    406             zdelta = pwcp(ji,jk,jwso4) + zsedtra(2) 
    407             zepsi  = pwcp(ji,jk,jwpo4) + redfep * zsedtra(5) 
    408             IF ( zalpha == 0. ) THEN 
    409                zsedtra(2) = zsedtra(2) / ( 1.0 + 2.0 * zsedtra(2) * reac_feh2s * dtsed2 ) 
    410             ELSE 
    411                zsedtra(2) = ( zsedtra(2) * zalpha ) / ( 2.0 * zsedtra(2) * ( exp( reac_feh2s * zalpha * dtsed2 ) - 1.0 )  & 
    412                &            + zalpha * exp( reac_feh2s * zalpha * dtsed2 ) ) 
    413             ENDIF 
    414             zsedtra(5) = zalpha + 2.0 * zsedtra(2) 
    415             zsedtra(4) = zbeta  - zsedtra(5) 
    416             pwcp(ji,jk,jwso4) = zdelta - zsedtra(2) 
    417             pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(4) 
    418             pwcp(ji,jk,jwpo4) = zepsi - redfep * zsedtra(5) 
    419            ! Fe - H2S 
    420             zalpha = zsedtra(2) - zsedtra(4) 
    421             zbeta  = zsedtra(4) + zsedtra(6) 
    422             zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(4) 
    423             IF ( zalpha == 0. ) THEN 
    424                zsedtra(4) = zsedtra(4) / ( 1.0 + zsedtra(4) * reac_fes * dtsed2 / 2.0 ) 
    425             ELSE 
    426                zsedtra(4) = ( zsedtra(4) * zalpha ) / ( zsedtra(4) * ( exp( reac_fes * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    427                &            + zalpha * exp( reac_fes * zalpha * dtsed2 /2. ) ) 
    428             ENDIF 
    429             zsedtra(2) = zalpha + zsedtra(4) 
    430             zsedtra(6) = zbeta  - zsedtra(4) 
    431             pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(4) 
    432             ! FeS - O2 
    433             zalpha = zsedtra(1) - 2.0 * zsedtra(6) 
    434             zbeta  = zsedtra(4) + zsedtra(6) 
    435             zgamma = pwcp(ji,jk,jwso4) + zsedtra(6) 
    436             IF (zalpha == 0.) THEN 
    437                zsedtra(6) = zsedtra(6) / ( 1.0 + 2.0 * zsedtra(6) * reac_feso * dtsed2 / 2. ) 
    438             ELSE 
    439                zsedtra(6) = ( zsedtra(6) * zalpha ) / ( 2.0 * zsedtra(6) * ( exp( reac_feso * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    440                &            + zalpha * exp( reac_feso * zalpha * dtsed2 /2. ) ) 
    441             ENDIF 
    442             zsedtra(1) = zalpha + 2.0 * zsedtra(6) 
    443             zsedtra(4) = zbeta  - zsedtra(6) 
    444             pwcp(ji,jk,jwso4) = zgamma - zsedtra(6) 
    445  
    446             ! NH4 + O2 
    447             zalpha = zsedtra(1) - 2.0 * zsedtra(3) / zadsnh4  
    448             zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(3) / zadsnh4  
    449             IF ( zalpha == 0. ) THEN 
    450                zsedtra(3) = zsedtra(3) / ( 1.0 + 2.0 * zsedtra(3) * reac_nh4 / zadsnh4 * dtsed2 / 2.0 ) 
    451             ELSE 
    452                zsedtra(3) = ( zsedtra(3) * zalpha * zadsnh4 ) / ( 2.0 * zsedtra(3) * ( exp( reac_nh4 * zadsnh4 * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    453                &            + zalpha * zadsnh4 * exp( reac_nh4 * zadsnh4 * zalpha * dtsed2 /2. ) ) 
    454             ENDIF 
    455             zsedtra(1) = zalpha + 2.0 * zsedtra(3) / zadsnh4  
    456             pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(3) / zadsnh4  
    457             ! H2S + O2 
    458             zalpha = zsedtra(1) - 2.0 * zsedtra(2) 
    459             zbeta  = pwcp(ji,jk,jwso4) + zsedtra(2) 
    460             zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(2) 
    461             IF ( zalpha == 0. ) THEN 
    462                zsedtra(2) = zsedtra(2) / ( 1.0 + 2.0 * zsedtra(2) * reac_h2s * dtsed2 / 2.0 ) 
    463             ELSE 
    464                zsedtra(2) = ( zsedtra(2) * zalpha ) / ( 2.0 * zsedtra(2) * ( exp( reac_h2s * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    465                &            + zalpha * exp( reac_h2s * zalpha * dtsed2 / 2. ) ) 
    466             ENDIF 
    467             zsedtra(1) = zalpha + 2.0 * zsedtra(2) 
    468             pwcp(ji,jk,jwso4) = zbeta - zsedtra(2) 
    469             pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(2) 
    470  
    471             ! Fe + O2 
    472             zalpha = zsedtra(1) - 0.25 * zsedtra(4) 
    473             zbeta  = zsedtra(4) + zsedtra(5) 
    474             zgamma = pwcp(ji,jk,jwalk) - 2.0 * zsedtra(4) 
    475             zdelta = pwcp(ji,jk,jwpo4) - redfep * zsedtra(4) 
    476             IF ( zalpha == 0. ) THEN 
    477                zsedtra(4) = zsedtra(4) / ( 1.0 + 0.25 * zsedtra(4) * reac_fe2 * dtsed2 / 2.0 ) 
    478             ELSE 
    479                zsedtra(4) = ( zsedtra(4) * zalpha ) / ( 0.25 * zsedtra(4)     & 
    480                &            * ( exp( reac_fe2  * zalpha * dtsed2 / 2. ) - 1.0 )  & 
    481                &            + zalpha * exp( reac_fe2 * zalpha * dtsed2 / 2. ) ) 
    482             ENDIF 
    483             zsedtra(1) = zalpha + 0.25 * zsedtra(4) 
    484             zsedtra(5) = zbeta  - zsedtra(4) 
    485             pwcp(ji,jk,jwpo4) = zdelta + redfep * zsedtra(4) 
    486             pwcp(ji,jk,jwalk) = zgamma + 2.0 * zsedtra(4) 
    487  
    488             ! Update the concentrations after the secondary reactions  
    489             zsedtra(:) = zsedtra(:) + MIN( zsedtrn(:), rtrn ) 
    490             pwcp(ji,jk,jwoxy)  = zsedtra(1) 
    491             pwcp(ji,jk,jwh2s)  = zsedtra(2) 
    492             pwcp(ji,jk,jwnh4)  = zsedtra(3) 
    493             pwcp(ji,jk,jwfe2)  = zsedtra(4) + sedligand(ji,jk) + zsedfer 
    494             pwcp(ji,jk,jwno3)  = pwcp(ji,jk,jwno3)  + ( zsedtrn(3) - pwcp(ji,jk,jwnh4) ) 
    495             solcp(ji,jk,jsfeo) = zsedtra(5) / zvolc(ji,jk,jsfeo) 
    496             solcp(ji,jk,jsfes) = zsedtra(6) / zvolc(ji,jk,jsfes) 
    497          END DO 
    498       END DO 
     167      DO jk = 2, jpksed 
     168         zalpha = ( pwcp(ji,jk,jwfe2) - pwcp(ji,jk,jwlgw) ) * 1E9 
     169         zsedfer = ( zalpha + SQRT( zalpha**2 + 1.E-10 ) ) /2.0 * 1E-9 
     170 
     171         ! First pass of the scheme. At the end, it is 1st order  
     172         ! ----------------------------------------------------- 
     173         ! Fe (both adsorbed and solute) + O2 
     174         zreasat = reac_fe2 * dtsed * zsedfer / radsfe2(jk) * pwcp(ji,jk,jwoxy) 
     175         pwcpa(ji,jk,jwfe2) = pwcpa(ji,jk,jwfe2) - zreasat * radsfe2(jk) 
     176         pwcpa(ji,jk,jwoxy) = pwcpa(ji,jk,jwoxy) - 0.25 * zreasat  
     177         pwcpa(ji,jk,jwpo4) = pwcpa(ji,jk,jwpo4) - redfep * zreasat  
     178         pwcpa(ji,jk,jwalk) = pwcpa(ji,jk,jwalk) - 2.0 * zreasat 
     179         solcpa(ji,jk,jsfeo) = solcpa(ji,jk,jsfeo) + zreasat / volc(ji,jk,jsfeo) 
     180 
     181         ! H2S + O2 
     182         zreasat = reac_h2s * dtsed * pwcp(ji,jk,jwoxy) * pwcp(ji,jk,jwh2s) 
     183         pwcpa(ji,jk,jwh2s) = pwcpa(ji,jk,jwh2s) - zreasat 
     184         pwcpa(ji,jk,jwoxy) = pwcpa(ji,jk,jwoxy) - 2.0 * zreasat 
     185         pwcpa(ji,jk,jwso4) = pwcpa(ji,jk,jwso4) + zreasat 
     186         pwcpa(ji,jk,jwalk) = pwcpa(ji,jk,jwalk) - 2.0 * zreasat 
     187 
     188         ! NH4 + O2 
     189         zreasat = reac_nh4 * dtsed * pwcp(ji,jk,jwnh4) / radsnh4(jk) * pwcp(ji,jk,jwoxy) 
     190         pwcpa(ji,jk,jwnh4) = pwcpa(ji,jk,jwnh4) - zreasat * radsnh4(jk)  
     191         pwcpa(ji,jk,jwoxy) = pwcpa(ji,jk,jwoxy) - 2.0 * zreasat  
     192         pwcpa(ji,jk,jwno3) = pwcpa(ji,jk,jwno3) + zreasat 
     193         pwcpa(ji,jk,jwalk) = pwcpa(ji,jk,jwalk) - 2.0 * zreasat 
     194 
     195         ! FeS - O2 
     196         zreasat = reac_feso * dtsed * solcp(ji,jk,jsfes) * volc(ji,jk,jsfes) * pwcp(ji,jk,jwoxy)  
     197         solcpa(ji,jk,jsfes) = solcpa(ji,jk,jsfes) - zreasat / volc(ji,jk,jsfes) 
     198         pwcpa(ji,jk,jwoxy) = pwcpa(ji,jk,jwoxy) - 2.0 * zreasat 
     199         pwcpa(ji,jk,jwfe2) = pwcpa(ji,jk,jwfe2) + zreasat * radsfe2(jk) 
     200         pwcpa(ji,jk,jwso4) = pwcpa(ji,jk,jwso4) + zreasat 
     201 
     202         ! FEOH + H2S 
     203         zreasat = reac_feh2s * dtsed * solcp(ji,jk,jsfeo) * volc(ji,jk,jsfeo) * pwcp(ji,jk,jwh2s)  
     204         solcpa(ji,jk,jsfeo) = solcpa(ji,jk,jsfeo) - 8.0 * zreasat / volc(ji,jk,jsfeo) 
     205         pwcpa(ji,jk,jwh2s) = pwcpa(ji,jk,jwh2s) - zreasat 
     206         pwcpa(ji,jk,jwfe2) = pwcpa(ji,jk,jwfe2) + 8.0 * zreasat * radsfe2(jk)  
     207         pwcpa(ji,jk,jwalk) = pwcpa(ji,jk,jwalk) + 14.0 * zreasat  
     208         pwcpa(ji,jk,jwso4) = pwcpa(ji,jk,jwso4) + zreasat 
     209         pwcpa(ji,jk,jwpo4) = pwcpa(ji,jk,jwpo4) + 8.0 * redfep * zreasat 
     210 
     211         ! Fe + H2S 
     212         zh2seq     = MAX(rtrn, 2.1E-3 * hipor(ji,jk)) 
     213         zexcess = pwcp(ji,jk,jwh2s) * zsedfer / zh2seq - 1.0 
     214         IF ( zexcess >= 0.0 ) THEN 
     215            zreasat = reac_fesp * zexcess * dtsed 
     216            pwcpa (ji,jk,jwfe2) = pwcpa(ji,jk,jwfe2) - zreasat * radsfe2(jk) 
     217            solcpa(ji,jk,jsfes) = solcpa(ji,jk,jsfes) + zreasat / volc(ji,jk,jsfes) 
     218            pwcpa(ji,jk,jwh2s)  = pwcpa(ji,jk,jwh2s) - zreasat 
     219         ELSE 
     220            zreasat = reac_fesd * zexcess * dtsed * solcp(ji,jk,jsfes) * volc(ji,jk,jsfes) 
     221            pwcpa (ji,jk,jwfe2) = pwcpa(ji,jk,jwfe2) - zreasat * radsfe2(jk) 
     222            solcpa(ji,jk,jsfes) = solcpa(ji,jk,jsfes) + zreasat / volc(ji,jk,jsfes) 
     223            pwcpa(ji,jk,jwh2s)  = pwcpa(ji,jk,jwh2s) - zreasat 
     224         ENDIF 
     225         ! For alkalinity 
     226         pwcpa(ji,jk,jwalk)  = pwcpa(ji,jk,jwalk) - zreasat * 2.0 
     227     END DO 
    499228 
    500229      IF( ln_timing )  CALL timing_stop('sed_dsr_redoxb') 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/seddta.F90

    r14385 r15075  
    2525#  include "do_loop_substitute.h90" 
    2626#  include "domzgr_substitute.h90" 
    27    !! $Id$ 
     27 
    2828CONTAINS 
    2929 
     
    4646 
    4747      !! Arguments 
    48       INTEGER, INTENT(in) ::  kt         ! time-step 
    49       INTEGER, INTENT(in) ::  Kbb, Kmm  ! time level indices 
     48      INTEGER, INTENT( in ) ::   kt    ! time-step 
     49      INTEGER, INTENT( in ) ::   Kbb, Kmm ! time level indices 
    5050 
    5151      !! * Local declarations 
     
    5555      REAL(wp), DIMENSION(jpi,jpj) :: zwsbio4, zwsbio3, zddust 
    5656      REAL(wp) :: zf0, zf1, zf2, zkapp, zratio, zdep 
     57      REAL(wp) :: zzf0, zf0s, zf0b, zzf1, zf1s, zf1b, zzf2, zf2s, zf2b 
    5758 
    5859      !---------------------------------------------------------------------- 
     
    7879         dtsed = rDt_trc 
    7980         rsecday = 60.* 60. * 24. 
    80 !         conv2   = 1.0e+3 / ( 1.0e+4 * rsecday * 30. ) 
    8181         conv2 = 1.0e+3 /  1.0e+4  
    8282      ENDIF 
     
    114114         ikt = mbkt(ji,jj) 
    115115         IF ( tmask(ji,jj,ikt) == 1 ) THEN 
    116             trc_data(ji,jj,1)   = tr(ji,jj,ikt,jpsil,Kbb) 
    117             trc_data(ji,jj,2)   = tr(ji,jj,ikt,jpoxy,Kbb) 
    118             trc_data(ji,jj,3)   = tr(ji,jj,ikt,jpdic,Kbb) 
    119             trc_data(ji,jj,4)   = tr(ji,jj,ikt,jpno3,Kbb) / 7.625 
    120             trc_data(ji,jj,5)   = tr(ji,jj,ikt,jppo4,Kbb) / 122. 
    121             trc_data(ji,jj,6)   = tr(ji,jj,ikt,jptal,Kbb) 
    122             trc_data(ji,jj,7)   = tr(ji,jj,ikt,jpnh4,Kbb) / 7.625 
    123             trc_data(ji,jj,8)   = 0.0 
    124             trc_data(ji,jj,9)   = 28.0E-3 
    125             trc_data(ji,jj,10)  = tr(ji,jj,ikt,jpfer,Kbb) 
    126             trc_data(ji,jj,11 ) = MIN(tr(ji,jj,ikt,jpgsi,Kbb), 1E-4) * zwsbio4(ji,jj) * 1E3 
    127             trc_data(ji,jj,12 ) = MIN(tr(ji,jj,ikt,jppoc,Kbb), 1E-4) * zwsbio3(ji,jj) * 1E3 
    128             trc_data(ji,jj,13 ) = MIN(tr(ji,jj,ikt,jpgoc,Kbb), 1E-4) * zwsbio4(ji,jj) * 1E3 
    129             trc_data(ji,jj,14)  = MIN(tr(ji,jj,ikt,jpcal,Kbb), 1E-4) * zwsbio4(ji,jj) * 1E3 
    130             trc_data(ji,jj,15)  = ts(ji,jj,ikt,jp_tem,Kmm) 
    131             trc_data(ji,jj,16)  = ts(ji,jj,ikt,jp_sal,Kmm) 
    132             trc_data(ji,jj,17 ) = ( tr(ji,jj,ikt,jpsfe,Kbb) * zwsbio3(ji,jj) + tr(ji,jj,ikt,jpbfe,Kbb)  & 
    133             &                     * zwsbio4(ji,jj)  ) * 1E3 / ( trc_data(ji,jj,12 ) + trc_data(ji,jj,13 ) + rtrn ) 
    134             trc_data(ji,jj,17 ) = MIN(1E-3, trc_data(ji,jj,17 ) ) 
     116            trc_data(ji,jj,jwsil)   = tr(ji,jj,ikt,jpsil,Kbb) 
     117            trc_data(ji,jj,jwoxy)   = tr(ji,jj,ikt,jpoxy,Kbb) 
     118            trc_data(ji,jj,jwdic)   = tr(ji,jj,ikt,jpdic,Kbb) 
     119            trc_data(ji,jj,jwno3)   = tr(ji,jj,ikt,jpno3,Kbb) / 7.625 
     120            trc_data(ji,jj,jwpo4)   = tr(ji,jj,ikt,jppo4,Kbb) / 122. 
     121            trc_data(ji,jj,jwalk)   = tr(ji,jj,ikt,jptal,Kbb) 
     122            trc_data(ji,jj,jwnh4)   = tr(ji,jj,ikt,jpnh4,Kbb) / 7.625 
     123            trc_data(ji,jj,jwh2s)   = 0.0 
     124            trc_data(ji,jj,jwso4)   = 0.14 * ts(ji,jj,ikt,jp_sal,Kmm) / 1.80655 / 96.062 
     125            trc_data(ji,jj,jwfe2)   = tr(ji,jj,ikt,jpfer,Kbb) 
     126            trc_data(ji,jj,jwlgw)   = 1E-9 
     127            trc_data(ji,jj,12 ) = MIN(tr(ji,jj,ikt,jpgsi,Kbb), 1E-4) * zwsbio4(ji,jj) * 1E3 
     128            trc_data(ji,jj,13 ) = MIN(tr(ji,jj,ikt,jppoc,Kbb), 1E-4) * zwsbio3(ji,jj) * 1E3 
     129            trc_data(ji,jj,14 ) = MIN(tr(ji,jj,ikt,jpgoc,Kbb), 1E-4) * zwsbio4(ji,jj) * 1E3 
     130            trc_data(ji,jj,15)  = MIN(tr(ji,jj,ikt,jpcal,Kbb), 1E-4) * zwsbio4(ji,jj) * 1E3 
     131            trc_data(ji,jj,16)  = ts(ji,jj,ikt,jp_tem,Kmm) 
     132            trc_data(ji,jj,17)  = ts(ji,jj,ikt,jp_sal,Kmm) 
     133            trc_data(ji,jj,18 ) = ( tr(ji,jj,ikt,jpsfe,Kbb) * zwsbio3(ji,jj) + tr(ji,jj,ikt,jpbfe,Kbb)  & 
     134            &                     * zwsbio4(ji,jj)  ) * 1E3 / ( trc_data(ji,jj,13 ) + trc_data(ji,jj,14 ) + rtrn ) 
     135            trc_data(ji,jj,18 ) = MIN(1E-3, trc_data(ji,jj,18 ) ) 
    135136         ENDIF 
    136137      END_2D 
     
    141142         CALL pack_arr ( jpoce,  pwcp_dta(1:jpoce,jw), trc_data(1:jpi,1:jpj,jw), iarroce(1:jpoce) ) 
    142143      END DO 
     144 
    143145      !  Solid components :  
    144146      !----------------------- 
    145147      !  Sinking fluxes for OPAL in mol.m-2.s-1 ; conversion in mol.cm-2.s-1 
    146       CALL pack_arr ( jpoce, rainrm_dta(1:jpoce,jsopal), trc_data(1:jpi,1:jpj,11), iarroce(1:jpoce) )  
     148      CALL pack_arr ( jpoce, rainrm_dta(1:jpoce,jsopal), trc_data(1:jpi,1:jpj,12), iarroce(1:jpoce) )  
    147149      rainrm_dta(1:jpoce,jsopal) = rainrm_dta(1:jpoce,jsopal) * 1e-4 
    148150      !  Sinking fluxes for POC in mol.m-2.s-1 ; conversion in mol.cm-2.s-1 
    149       CALL pack_arr ( jpoce, zdtap(1:jpoce), trc_data(1:jpi,1:jpj,12) , iarroce(1:jpoce) )       
    150       CALL pack_arr ( jpoce, zdtag(1:jpoce), trc_data(1:jpi,1:jpj,13) , iarroce(1:jpoce) ) 
     151      CALL pack_arr ( jpoce, zdtap(1:jpoce), trc_data(1:jpi,1:jpj,13) , iarroce(1:jpoce) )       
     152      CALL pack_arr ( jpoce, zdtag(1:jpoce), trc_data(1:jpi,1:jpj,14) , iarroce(1:jpoce) ) 
    151153      DO ji = 1, jpoce 
    152 !        zkapp  = MIN( (1.0 - 0.02 ) * reac_poc, 3731.0 * max(100.0, zkbot(ji) )**(-1.011) / ( 365.0 * 24.0 * 3600.0 ) ) 
    153 !        zkapp   = MIN( 0.98 * reac_poc, 100.0 * max(100.0, zkbot(ji) )**(-0.6) / ( 365.0 * 24.0 * 3600.0 ) ) 
    154 !        zratio = ( ( 1.0 - 0.02 ) * reac_poc + 0.02 * reac_poc * 0. - zkapp) / ( ( 0.02 - 1.0 ) * reac_poc / 100. - 0.02 * reac_poc * 0. + zkapp ) 
    155 !        zf1    = ( 0.02 * (reac_poc - reac_poc * 0.) + zkapp - reac_poc ) / ( reac_poc / 100. - reac_poc ) 
    156 !        zf1    = MIN(0.98, MAX(0., zf1 ) ) 
    157          zf1    = 0.48 
    158          zf2    = 0.02 
    159          zf0    = 1.0 - zf2 - zf1 
    160          rainrm_dta(ji,jspoc) =   ( zdtap(ji) +  zdtag(ji) ) * 1e-4 * zf0 
    161          rainrm_dta(ji,jspos) =   ( zdtap(ji) +  zdtag(ji) ) * 1e-4 * zf1 
    162          rainrm_dta(ji,jspor) =   ( zdtap(ji) +  zdtag(ji) ) * 1e-4 * zf2 
     154         zzf2 = 2E-2 
     155         zzf1 = 0.5 
     156         zzf0 = 1.0 - zzf1 - zzf2 
     157         zf0s = zzf0 
     158         zf1s = zzf1 
     159         zf2s = 1.0 - zf1s - zf0s 
     160         zf0b = zzf0 
     161         zf1b = zzf1 
     162         zf2b = 1.0 - zf1b - zf0b 
     163         rainrm_dta(ji,jspoc) =   ( zdtap(ji) * zf0s +  zdtag(ji) * zf0b ) * 1e-4 
     164         rainrm_dta(ji,jspos) =   ( zdtap(ji) * zf1s +  zdtag(ji) * zf1b ) * 1e-4 
     165         rainrm_dta(ji,jspor) =   ( zdtap(ji) * zf2s +  zdtag(ji) * zf2b ) * 1e-4 
    163166      END DO 
    164167 
    165168      !  Sinking fluxes for Calcite in mol.m-2.s-1 ; conversion in mol.cm-2.s-1 
    166       CALL pack_arr ( jpoce,  rainrm_dta(1:jpoce,jscal), trc_data(1:jpi,1:jpj,14), iarroce(1:jpoce) ) 
     169      CALL pack_arr ( jpoce,  rainrm_dta(1:jpoce,jscal), trc_data(1:jpi,1:jpj,15), iarroce(1:jpoce) ) 
    167170      rainrm_dta(1:jpoce,jscal) = rainrm_dta(1:jpoce,jscal) * 1e-4 
    168       ! vector temperature [C] and salinity  
    169       CALL pack_arr ( jpoce,  temp(1:jpoce), trc_data(1:jpi,1:jpj,15), iarroce(1:jpoce) ) 
    170       CALL pack_arr ( jpoce,  salt(1:jpoce), trc_data(1:jpi,1:jpj,16), iarroce(1:jpoce) ) 
     171      ! vector temperature [°C] and salinity  
     172      CALL pack_arr ( jpoce,  temp(1:jpoce), trc_data(1:jpi,1:jpj,16), iarroce(1:jpoce) ) 
     173      CALL pack_arr ( jpoce,  salt(1:jpoce), trc_data(1:jpi,1:jpj,17), iarroce(1:jpoce) ) 
    171174       
    172175      ! Clay rain rate in [mol/(cm**2.s)]  
     
    187190 
    188191      ! Fe/C ratio in sinking particles that fall to the sediments 
    189       CALL pack_arr ( jpoce,  fecratio(1:jpoce), trc_data(1:jpi,1:jpj,17), iarroce(1:jpoce) ) 
    190  
    191       sedligand(:,1) = 1.E-9 
     192      CALL pack_arr ( jpoce,  fecratio(1:jpoce), trc_data(1:jpi,1:jpj,18), iarroce(1:jpoce) ) 
    192193 
    193194      ! sediment pore water at 1st layer (k=1) 
     
    217218      IF( lk_iomput ) THEN 
    218219          IF( iom_use("sflxclay" ) ) CALL iom_put( "sflxclay", zddust(:,:) * 1E3 / 1.E4 ) 
    219           IF( iom_use("sflxcal" ) )  CALL iom_put( "sflxcal", trc_data(:,:,14) / 1.E4 ) 
    220           IF( iom_use("sflxbsi" ) )  CALL iom_put( "sflxbsi", trc_data(:,:,11) / 1.E4 ) 
    221           IF( iom_use("sflxpoc" ) )  CALL iom_put( "sflxpoc", ( trc_data(:,:,12) + trc_data(:,:,13) ) / 1.E4 ) 
     220          IF( iom_use("sflxcal" ) )  CALL iom_put( "sflxcal", trc_data(:,:,15) / 1.E4 ) 
     221          IF( iom_use("sflxbsi" ) )  CALL iom_put( "sflxbsi", trc_data(:,:,12) / 1.E4 ) 
     222          IF( iom_use("sflxpoc" ) )  CALL iom_put( "sflxpoc", ( trc_data(:,:,13) + trc_data(:,:,14) ) / 1.E4 ) 
    222223      ENDIF 
    223224 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedini.F90

    r14385 r15075  
    66 
    77   !!---------------------------------------------------------------------- 
    8    !!   sed_init    : initialization, namelist read, and parameters control 
     8   !!   sed_ini    : initialization, namelist read, and parameters control 
    99   !!---------------------------------------------------------------------- 
    1010   !! * Modules used 
    11    USE par_trc        ! need jptra, number of passive tracers 
    12    USE par_sed 
    1311   USE sed     ! sediment global variable 
    1412   USE sed_oce 
     
    2422   PRIVATE 
    2523 
    26    !! * Substitutions 
    27 #  include "do_loop_substitute.h90" 
    2824   !! Module variables 
     25   REAL(wp), PUBLIC :: sedmask  
     26 
    2927   REAL(wp)    ::  & 
    3028      sedzmin = 0.3    ,  &  !: Minimum vertical spacing 
     
    5553      rcfe2    =   5.E8 ,  &  !: reactivity for O2/Fe2+ [l.mol-1.an-1] 
    5654      rcfeh2s  =   1.E4 ,  &  !: Reactivity for FEOH/H2S [l.mol-1.an-1] 
    57       rcfes    =   1.E5 ,  &  !: Reactivity for FE2+/H2S [l.mol-1.an-1] 
    5855      rcfeso   =   3.E5 ,  &  !: Reactivity for FES/O2 [l.mol-1.an-1] 
     56      rcfesp   =   5E-6 ,  &  !: Precipitation of FeS [mol/l-1.an-1] 
     57      rcfesd   =   1E-3 ,  &  !: Dissolution of FeS [an-1] 
    5958      xksedo2  =   5E-6 ,  &  !: half-sturation constant for oxic remin. 
    6059      xksedno3 =   5E-6 ,  &  !: half-saturation constant for denitrification 
     
    7372 
    7473   REAL(wp), DIMENSION(jpwat), PUBLIC  :: diff1 
    75    DATA diff1/4.59E-6, 1.104E-5, 4.81E-6 , 9.78E-6, 3.58E-6, 4.81E-6, 9.8E-6, 9.73E-6, 5.0E-6, 3.31E-6 / 
     74   DATA diff1/ 1.104E-5, 9.78E-6, 3.58E-6, 9.8E-6, 9.73E-6, 5.0E-6, 3.31E-6, 4.81E-6, 4.81E-6, 4.81E-6, 4.59E-6 / 
     75 
    7676 
    7777   REAL(wp), DIMENSION(jpwat), PUBLIC  :: diff2 
    78    DATA diff2/1.74E-7, 4.47E-7, 2.51E-7, 3.89E-7, 1.77E-7, 2.51E-7, 3.89E-7, 3.06E-7, 2.5E-7, 1.5E-7 / 
    79  
    80  
     78   DATA diff2/ 4.47E-7, 3.89E-7, 1.77E-7, 3.89E-7, 3.06E-7, 2.5E-7, 1.5E-7, 2.51E-7, 2.51E-7, 2.51E-7, 1.74E-7 / 
    8179 
    8280   !! *  Routine accessibility 
    83    PUBLIC sed_init          ! routine called by opa.F90 
    84  
     81   PUBLIC sed_ini          ! routine called by opa.F90 
     82 
     83   !! * Substitutions 
     84#  include "do_loop_substitute.h90" 
    8585   !! $Id$ 
    8686CONTAINS 
    8787 
    8888 
    89    SUBROUTINE sed_init 
     89   SUBROUTINE sed_ini 
    9090      !!---------------------------------------------------------------------- 
    91       !!                   ***  ROUTINE sed_init  *** 
     91      !!                   ***  ROUTINE sed_ini  *** 
    9292      !! 
    9393      !! ** Purpose :  Initialization of sediment module 
     
    104104      !!        !  06-07  (C. Ethe)  Re-organization 
    105105      !!---------------------------------------------------------------------- 
    106       INTEGER :: ji, jj, ikt, ierr 
     106      INTEGER :: ji, jj, js, jn, jk, ikt, ierr 
    107107      !!---------------------------------------------------------------------- 
    108  
    109108 
    110109      ! Reading namelist.sed variables 
     
    122121      ENDIF 
    123122 
    124       IF(lwp) WRITE(numsed,*) ' sed_init : Initialization of sediment module  ' 
     123      IF(lwp) WRITE(numsed,*) ' sed_ini : Initialization of sediment module  ' 
    125124      IF(lwp) WRITE(numsed,*) ' ' 
    126125 
    127126      ! Read sediment Namelist 
    128127      !------------------------- 
    129       CALL sed_init_nam 
     128      CALL sed_ini_nam 
    130129 
    131130      ! Allocate SEDIMENT arrays 
     
    137136      ! Determination of sediments number of points and allocate global variables 
    138137      epkbot(:,:) = 0. 
     138      gdepbot(:,:) = 0. 
    139139      DO_2D( 1, 1, 1, 1 ) 
    140140         ikt = mbkt(ji,jj)  
    141          IF( tmask(ji,jj,ikt) == 1 ) epkbot(ji,jj) = e3t_1d(ikt) 
    142          gdepbot(ji,jj) = gdepw_0(ji,jj,ikt) 
     141         IF( tmask(ji,jj,ikt) == 1 ) epkbot(ji,jj) = e3t_0(ji,jj,ikt) 
     142         gdepbot(ji,jj) = gdepw_0(ji,jj,ikt+1) 
    143143      END_2D 
    144144 
     
    154154 
    155155      ! Allocate memory size of global variables 
    156       ALLOCATE( pwcp (jpoce,jpksed,jpwat) )  ;  ALLOCATE( pwcp0 (jpoce,jpksed,jpwat) ) ;  ALLOCATE( pwcp_dta  (jpoce,jpwat) ) 
    157       ALLOCATE( solcp(jpoce,jpksed,jpsol) )  ;  ALLOCATE( solcp0(jpoce,jpksed,jpsol) ) ;  ALLOCATE( rainrm_dta(jpoce,jpsol) ) 
     156      ALLOCATE( pwcp (jpoce,jpksed,jpwat) )  ;  ALLOCATE( pwcp_dta  (jpoce,jpwat) ) 
     157      ALLOCATE( pwcpa(jpoce,jpksed,jpwat) )  ;  ALLOCATE( solcpa(jpoce,jpksed,jpsol) ) 
     158      ALLOCATE( solcp(jpoce,jpksed,jpsol) )  ;  ALLOCATE( rainrm_dta(jpoce,jpsol) ) 
    158159      ALLOCATE( rainrm(jpoce,jpsol) )        ;  ALLOCATE( rainrg(jpoce,jpsol) )        ;  ALLOCATE( raintg(jpoce) )  
    159160      ALLOCATE( dzdep(jpoce) )               ;  ALLOCATE( iarroce(jpoce) )             ;  ALLOCATE( dzkbot(jpoce) ) 
     
    162163      ALLOCATE( diff(jpoce,jpksed,jpwat ) )  ;  ALLOCATE( irrig(jpoce, jpksed) ) 
    163164      ALLOCATE( wacc(jpoce) )                ;  ALLOCATE( fecratio(jpoce) ) 
     165      ALLOCATE( densSW(jpoce) )   ;   ALLOCATE( saturco3(jpoce,jpksed) )  
    164166      ALLOCATE( hipor(jpoce,jpksed) )        ;  ALLOCATE( co3por(jpoce,jpksed) ) 
    165167      ALLOCATE( dz3d(jpoce,jpksed) )         ;  ALLOCATE( volw3d(jpoce,jpksed) )       ;  ALLOCATE( vols3d(jpoce,jpksed) ) 
    166       ALLOCATE( sedligand(jpoce, jpksed) )   ;  ALLOCATE( saturco3(jpoce,jpksed) )  ;  ALLOCATE( densSW(jpoce) ) 
     168      ALLOCATE( rearatpom(jpoce, jpksed) )   ;  ALLOCATE( volc(jpoce,jpksed,jpsol) ) 
     169      ALLOCATE( Jacobian(jpoce, jpvode*jpksed, jpvode*jpksed) ) 
     170      ALLOCATE( radsfe2(jpksed) )            ;  ALLOCATE( radsnh4(jpksed) ) 
     171      ALLOCATE( wacc1(jpoce) ) 
    167172 
    168173      ! Initialization of global variables 
    169       pwcp  (:,:,:) = 0.   ;  pwcp0  (:,:,:) = 0.  ; pwcp_dta  (:,:) = 0.   
    170       solcp (:,:,:) = 0.   ;  solcp0 (:,:,:) = 0.  ; rainrm_dta(:,:) = 0. 
    171       rainrm(:,:  ) = 0.   ;  rainrg (:,:  ) = 0.  ; raintg    (:  ) = 0.  
    172       dzdep (:    ) = 0.   ;  iarroce(:   )  = 0   ; dzkbot    (:  ) = 0. 
    173       temp  (:    ) = 0.   ;  salt   (:   )  = 0.  ; zkbot     (:  ) = 0. 
    174       db    (:,:  ) = 0.   ;  densSW (:   )  = 0.  
    175       hipor (:,:  ) = 0.   ;  co3por (:,: )  = 0.  ; irrig     (:,:) = 0.  
    176       dz3d  (:,:  ) = 0.   ;  volw3d (:,: )  = 0.  ; vols3d    (:,:) = 0.  
    177       fecratio(:)   = 1E-5  
    178       sedligand(:,:) = 0.6E-9 
     174      pwcp  (:,:,:) = 0.   ;  pwcp_dta  (:,:) = 0.   
     175      pwcpa (:,:,:) = 0.   ;  solcpa(:,:,:) = 0. 
     176      solcp (:,:,:) = 0.   ;  rainrm_dta(:,:) = 0. 
     177      rainrm(:,:  ) = 0.   ;  rainrg(:,:  ) = 0.  ; raintg    (:  ) = 0.  
     178      dzdep (:    ) = 0.   ;  iarroce(:   ) = 0   ; dzkbot    (:  ) = 0. 
     179      temp  (:    ) = 0.   ;  salt   (:   ) = 0.  ; zkbot     (:  ) = 0. 
     180      densSW (:   ) = 0.   ;  db     (:,:) = 0.  
     181      hipor (:,:  ) = 0.   ;  co3por (:,: ) = 0.  ; irrig     (:,:) = 0.  
     182      dz3d  (:,:  ) = 0.   ;  volw3d (:,: ) = 0.  ; vols3d    (:,:) = 0.  
     183      fecratio(:)   = 1E-5 ;  rearatpom(:,:) = 0.  
     184      radsfe2(:)    = 1.0  ;  radsnh4(:)    = 1.0 
    179185 
    180186      ! Chemical variables       
    181       ALLOCATE( akbs  (jpoce) )  ;  ALLOCATE( ak1s   (jpoce) )  ;  ALLOCATE( ak2s  (jpoce) ) ;  ALLOCATE( akws  (jpoce) ) 
    182       ALLOCATE( ak1ps (jpoce) )  ;  ALLOCATE( ak2ps  (jpoce) )  ;  ALLOCATE( ak3ps (jpoce) ) ;  ALLOCATE( aksis (jpoce) ) 
    183       ALLOCATE( aksps (jpoce) )  ;  ALLOCATE( ak12s  (jpoce) )  ;  ALLOCATE( ak12ps(jpoce) ) ;  ALLOCATE( ak123ps(jpoce) ) 
    184       ALLOCATE( borats(jpoce) )  ;  ALLOCATE( calcon2(jpoce) )  ;  ALLOCATE( sieqs (jpoce) ) 
     187      ALLOCATE( akbs  (jpoce) )  ;  ALLOCATE( ak1s   (jpoce) )  ;  ALLOCATE( ak2s  (jpoce) ) ;  ALLOCATE( akws  (jpoce) )      
     188      ALLOCATE( ak1ps (jpoce) )  ;  ALLOCATE( ak2ps  (jpoce) )  ;  ALLOCATE( ak3ps (jpoce) ) ;  ALLOCATE( aksis (jpoce) )     
     189      ALLOCATE( aksps (jpoce) )  ;  ALLOCATE( ak12s  (jpoce) )  ;  ALLOCATE( ak12ps(jpoce) ) ;  ALLOCATE( ak123ps(jpoce) )     
     190      ALLOCATE( borats(jpoce) )  ;  ALLOCATE( calcon2(jpoce) )  ;  ALLOCATE( sieqs (jpoce) )  
    185191      ALLOCATE( aks3s(jpoce) )   ;  ALLOCATE( akf3s(jpoce) )    ;  ALLOCATE( sulfats(jpoce) ) 
    186       ALLOCATE( fluorids(jpoce) ) 
     192      ALLOCATE( fluorids(jpoce) ) ; ALLOCATE( akh2s(jpoce) )    ;  ALLOCATE( aknh3(jpoce) ) 
    187193 
    188194      akbs  (:) = 0. ;   ak1s   (:) = 0. ;  ak2s  (:) = 0. ;   akws   (:) = 0. 
    189195      ak1ps (:) = 0. ;   ak2ps  (:) = 0. ;  ak3ps (:) = 0. ;   aksis  (:) = 0. 
    190196      aksps (:) = 0. ;   ak12s  (:) = 0. ;  ak12ps(:) = 0. ;   ak123ps(:) = 0. 
    191       borats(:) = 0. ;   calcon2(:) = 0. ;  sieqs (:) = 0. 
     197      borats(:) = 0. ;   calcon2(:) = 0. ;  sieqs (:) = 0. ;   akh2s  (:) = 0. 
    192198      aks3s(:)  = 0. ;   akf3s(:)   = 0. ;  sulfats(:) = 0. ;  fluorids(:) = 0. 
     199      aknh3(:)  = 0. 
    193200 
    194201      ! Mass balance calculation   
    195       ALLOCATE( fromsed(jpoce, jpsol) ) ; ALLOCATE( tosed(jpoce, jpsol) ) 
     202      ALLOCATE( fromsed(jpoce, jpsol+jpads) ) ; ALLOCATE( tosed(jpoce, jpsol+jpads) ) 
    196203 
    197204      fromsed(:,:) = 0.    ;   tosed(:,:) = 0. 
     
    199206      ! Initialization of sediment geometry 
    200207      !------------------------------------ 
    201       CALL sed_init_geom 
     208      CALL sed_ini_geom 
    202209 
    203210      ! Offline specific mode 
    204211      ! --------------------- 
    205212      ln_sediment_offline = .FALSE. 
     213 
     214      ! Vertical profile of of the adsorption factor for adsorbed species 
     215      ! ----------------------------------------------------------------- 
     216      radsfe2(:) = 1.0 / ( 1.0 + adsfe2 * por1(:) / por(:) ) 
     217      radsnh4(:) = 1.0 / ( 1.0 + adsnh4 * por1(:) / por(:) ) 
     218 
     219      ! Initialization of the array for non linear solving 
     220      ! -------------------------------------------------- 
     221 
     222      ALLOCATE( jarr(jpvode*jpksed,2) ) 
     223      ALLOCATE( jsvode(jpvode), isvode(jptrased) ) 
     224      jsvode(1) = jwoxy ; jsvode(2) = jwno3 ; jsvode(3) = jwnh4 
     225      jsvode(4) = jwh2s ; jsvode(5) = jwso4 ; jsvode(6) = jwfe2 
     226      jsvode(7) = jpwat+jsfeo ; jsvode(8) = jpwat+jsfes 
     227      isvode(jwoxy) = 1 ; isvode(jwno3) = 2 ; isvode(jwnh4) = 3 
     228      isvode(jwh2s) = 4 ; isvode(jwso4) = 5 ; isvode(jwfe2) = 6 
     229      isvode(jpwat+jsfeo) = 7 ; isvode(jpwat+jsfes) = 8 
     230      DO js = 1, jpvode 
     231         DO jk = 1, jpksed 
     232            jn = (jk-1) * jpvode + js 
     233            jarr(jn,1) = jk 
     234            jarr(jn,2) = jsvode(js) 
     235         END DO 
     236      END DO 
     237 
     238      ALLOCATE( stepros(jpoce) ) 
    206239 
    207240#if defined key_sed_off 
     
    219252      ENDIF 
    220253 
    221    END SUBROUTINE sed_init 
    222  
    223    SUBROUTINE sed_init_geom 
     254   END SUBROUTINE sed_ini 
     255 
     256   SUBROUTINE sed_ini_geom 
    224257      !!---------------------------------------------------------------------- 
    225       !!                   ***  ROUTINE sed_init_geom  *** 
     258      !!                   ***  ROUTINE sed_ini_geom  *** 
    226259      !! 
    227260      !! ** Purpose :  Initialization of sediment geometry 
     
    241274      !----------------------------------------------------------  
    242275 
    243       IF(lwp) WRITE(numsed,*) ' sed_init_geom : Initialization of sediment geometry ' 
     276      IF(lwp) WRITE(numsed,*) ' sed_ini_geom : Initialization of sediment geometry ' 
    244277      IF(lwp) WRITE(numsed,*) ' ' 
    245278 
     
    282315      zsur = - za0 - za1 * sedacr * LOG( COSH( (1-sedkth) / sedacr )  ) 
    283316 
     317      dz(1)       = 0.1 
    284318      profsedw(1) = 0.0 
    285       profsed(1) = -dz(1) / 2. 
     319      profsed(1)  = -dz(1) / 2. 
    286320      DO jk = 2, jpksed 
    287321         zw = REAL( jk , wp ) 
     
    289323         profsed(jk)  = ( zsur + za0 * zt + za1 * sedacr * LOG ( COSH( (zt-sedkth) / sedacr ) )  )  
    290324         profsedw(jk) = ( zsur + za0 * zw + za1 * sedacr * LOG ( COSH( (zw-sedkth) / sedacr ) )  ) 
    291       END DO 
    292  
    293       dz(1) = 0.1 
    294       DO jk = 2, jpksed 
    295325         dz(jk) = profsedw(jk) - profsedw(jk-1) 
    296326      END DO 
    297327 
    298       DO jk = 1, jpksed 
    299          DO ji = 1, jpoce 
    300             dz3d(ji,jk) = dz(jk) 
    301          END DO 
    302       ENDDO 
     328      DO ji = 1, jpoce 
     329         dz3d(ji,:) = dz(:) 
     330      END DO 
    303331 
    304332      !  Porosity profile [0] 
     
    371399      ! -------------------------------------------------------------- 
    372400      DO ji = 1, jpoce 
    373           ztmp1 = 0.117 / ( 1.0 + ( zkbot(ji) / 200.)**3 ) 
     401!          ztmp1 = 0.117 / ( 1.0 + ( zkbot(ji) / 200.)**3 ) 
     402          ztmp1 = 0. 
    374403          ztmp2 = 0.006 / ( 1.0 + ( zkbot(ji) / 4000.)**10 ) 
    375           wacc(ji) = (ztmp1 + ztmp2)/10.0 
    376           wacc(ji) = ztmp2 / 10.0 
     404          wacc(ji) = ztmp2+ztmp1  
    377405      END DO 
    378406 
     
    380408      ! Initialization of time step as function of porosity [cm**2/s] 
    381409      !------------------------------------------------------------------ 
    382    END SUBROUTINE sed_init_geom 
    383  
    384    SUBROUTINE sed_init_nam 
     410   END SUBROUTINE sed_ini_geom 
     411 
     412   SUBROUTINE sed_ini_nam 
    385413      !!---------------------------------------------------------------------- 
    386       !!                   ***  ROUTINE sed_init_nam  *** 
     414      !!                   ***  ROUTINE sed_ini_nam  *** 
    387415      !! 
    388416      !! ** Purpose :  Initialization of sediment geometry 
     
    393421      !!---------------------------------------------------------------------- 
    394422 
    395       CHARACTER(:), ALLOCATABLE ::   numnamsed_ref           !! Character buffer for reference namelist sediment 
    396       CHARACTER(:), ALLOCATABLE ::   numnamsed_cfg           !! Character buffer for configuration namelist sediment 
     423      INTEGER ::   numnamsed_ref = -1           !! Logical units for namelist sediment 
     424      INTEGER ::   numnamsed_cfg = -1           !! Logical units for namelist sediment 
    397425      INTEGER :: ios                 ! Local integer output status for namelist read 
    398426      CHARACTER(LEN=20)   ::   clname 
     
    409437      TYPE(PSED) , DIMENSION(jpdia2dsed) :: seddiag2d 
    410438 
    411       NAMELIST/nam_run/nrseddt,ln_sed_2way 
     439      NAMELIST/nam_run/ln_sed_2way 
    412440      NAMELIST/nam_geom/jpksed, sedzmin, sedhmax, sedkth, sedacr, porsurf, porinf, rhox 
    413441      NAMELIST/nam_trased/sedsol, sedwat 
     
    415443      NAMELIST/nam_inorg/rcopal, dcoef, rccal, ratligc, rcligc 
    416444      NAMELIST/nam_poc/redO2, redNo3, redPo4, redC, redfep, rcorgl, rcorgs,  & 
    417          &             rcorgr, rcnh4, rch2s, rcfe2, rcfeh2s, rcfes, rcfeso, & 
    418          &             xksedo2, xksedno3, xksedfeo, xksedso4 
    419       NAMELIST/nam_btb/dbiot, ln_btbz, dbtbzsc, adsnh4, ln_irrig, xirrzsc 
     445         &             rcorgr, rcnh4, rch2s, rcfe2, rcfeh2s, rcfeso, rcfesp, & 
     446         &             rcfesd, xksedo2, xksedno3, xksedfeo, xksedso4 
     447      NAMELIST/nam_btb/dbiot, ln_btbz, dbtbzsc, adsnh4, adsfe2, ln_irrig, xirrzsc 
    420448      NAMELIST/nam_rst/ln_rst_sed, cn_sedrst_indir, cn_sedrst_outdir, cn_sedrst_in, cn_sedrst_out 
    421449 
     
    423451      !------------------------------------------------------- 
    424452 
    425       IF(lwp) WRITE(numsed,*) ' sed_init_nam : Read namelists ' 
     453      IF(lwp) WRITE(numsed,*) ' sed_ini_nam : Read namelists ' 
    426454      IF(lwp) WRITE(numsed,*) ' ' 
    427455 
     
    437465      !--------------------------------- 
    438466      clname = 'namelist_sediment' 
    439       IF(lwp) WRITE(numsed,*) ' sed_init_nam : read SEDIMENT namelist' 
     467      IF(lwp) WRITE(numsed,*) ' sed_ini_nam : read SEDIMENT namelist' 
    440468      IF(lwp) WRITE(numsed,*) ' ~~~~~~~~~~~~~~' 
    441       CALL load_nml( numnamsed_ref, TRIM( clname )//'_ref', numout, lwm ) 
    442       CALL load_nml( numnamsed_cfg, TRIM( clname )//'_cfg', numout, lwm ) 
     469      CALL ctl_opn( numnamsed_ref, TRIM( clname )//'_ref', 'OLD'    , 'FORMATTED', 'SEQUENTIAL', -1, numout, .FALSE. ) 
     470      CALL ctl_opn( numnamsed_cfg, TRIM( clname )//'_cfg', 'OLD'    , 'FORMATTED', 'SEQUENTIAL', -1, numout, .FALSE. ) 
    443471 
    444472      nitsed000 = nittrc000 
    445473      nitsedend = nitend 
    446474      ! Namelist nam_run 
     475      REWIND( numnamsed_ref )              ! Namelist nam_run in reference namelist : Pisces variables 
    447476      READ  ( numnamsed_ref, nam_run, IOSTAT = ios, ERR = 901) 
    448477901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_run in reference namelist' ) 
    449478 
     479      REWIND( numnamsed_cfg )              ! Namelist nam_run in reference namelist : Pisces variables 
    450480      READ  ( numnamsed_cfg, nam_run, IOSTAT = ios, ERR = 902) 
    451481902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_run in configuration namelist' ) 
     
    453483      IF (lwp) THEN 
    454484         WRITE(numsed,*) ' namelist nam_run' 
    455          WRITE(numsed,*) ' Nb of iterations for fast species    nrseddt = ', nrseddt 
    456485         WRITE(numsed,*) ' 2-way coupling between PISCES and Sed ln_sed_2way = ', ln_sed_2way 
    457486      ENDIF 
     
    459488      IF ( ln_p5z .AND. ln_sed_2way ) CALL ctl_stop( '2 ways coupling with sediment cannot be activated with PISCES-QUOTA' ) 
    460489 
     490      REWIND( numnamsed_ref )              ! Namelist nam_geom in reference namelist : Pisces variables 
    461491      READ  ( numnamsed_ref, nam_geom, IOSTAT = ios, ERR = 903) 
    462492903   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_geom in reference namelist' ) 
    463493 
     494      REWIND( numnamsed_cfg )              ! Namelist nam_geom in reference namelist : Pisces variables 
    464495      READ  ( numnamsed_cfg, nam_geom, IOSTAT = ios, ERR = 904) 
    465496904   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_geom in configuration namelist' ) 
     
    480511      dtsed = rDt_trc 
    481512 
     513      REWIND( numnamsed_ref )              ! Namelist nam_trased in reference namelist : Pisces variables 
    482514      READ  ( numnamsed_ref, nam_trased, IOSTAT = ios, ERR = 905) 
    483515905   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_trased in reference namelist' ) 
    484516 
     517      REWIND( numnamsed_cfg )              ! Namelist nam_trased in reference namelist : Pisces variables 
    485518      READ  ( numnamsed_cfg, nam_trased, IOSTAT = ios, ERR = 906) 
    486519906   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_trased in configuration namelist' ) 
     
    511544      ENDIF 
    512545 
     546      REWIND( numnamsed_ref )              ! Namelist nam_diased in reference namelist : Pisces variables 
    513547      READ  ( numnamsed_ref, nam_diased, IOSTAT = ios, ERR = 907) 
    514548907   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_diased in reference namelist' ) 
    515549 
     550      REWIND( numnamsed_cfg )              ! Namelist nam_diased in reference namelist : Pisces variables 
    516551      READ  ( numnamsed_cfg, nam_diased, IOSTAT = ios, ERR = 908) 
    517552908   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_diased in configuration namelist' ) 
     
    551586      ! Inorganic chemistry parameters 
    552587      !---------------------------------- 
     588      REWIND( numnamsed_ref )              ! Namelist nam_inorg in reference namelist : Pisces variables 
    553589      READ  ( numnamsed_ref, nam_inorg, IOSTAT = ios, ERR = 909) 
    554590909   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_inorg in reference namelist' ) 
    555591 
     592      REWIND( numnamsed_cfg )              ! Namelist nam_inorg in reference namelist : Pisces variables 
    556593      READ  ( numnamsed_cfg, nam_inorg, IOSTAT = ios, ERR = 910) 
    557594910   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_inorg in configuration namelist' ) 
     
    575612      ! Additional parameter linked to POC/O2/No3/Po4 
    576613      !---------------------------------------------- 
     614      REWIND( numnamsed_ref )              ! Namelist nam_poc in reference namelist : Pisces variables 
    577615      READ  ( numnamsed_ref, nam_poc, IOSTAT = ios, ERR = 911) 
    578616911   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_poc in reference namelist' ) 
    579617 
     618      REWIND( numnamsed_cfg )              ! Namelist nam_poc in reference namelist : Pisces variables 
    580619      READ  ( numnamsed_cfg, nam_poc, IOSTAT = ios, ERR = 912) 
    581620912   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_poc in configuration namelist' ) 
     
    595634         WRITE(numsed,*) ' reactivity for Fe2+              rcfe2    = ', rcfe2 
    596635         WRITE(numsed,*) ' reactivity for FeOH/H2S          rcfeh2s  = ', rcfeh2s 
    597          WRITE(numsed,*) ' reactivity for Fe2+/H2S          rcfes    = ', rcfes 
    598636         WRITE(numsed,*) ' reactivity for FeS/O2            rcfeso   = ', rcfeso 
     637         WRITE(numsed,*) ' Precipitation of FeS             rcfesp   = ', rcfesp 
     638         WRITE(numsed,*) ' Dissolution of FeS               rcfesd   = ', rcfesd 
    599639         WRITE(numsed,*) ' Half-sat. cste for oxic remin    xksedo2  = ', xksedo2 
    600640         WRITE(numsed,*) ' Half-sat. cste for denit.        xksedno3 = ', xksedno3 
     
    617657      reac_fe2   = rcfe2  / ryear 
    618658      reac_feh2s = rcfeh2s/ ryear 
    619       reac_fes   = rcfes  / ryear 
    620659      reac_feso  = rcfeso / ryear 
     660      reac_fesp  = rcfesp / ryear 
     661      reac_fesd  = rcfesd / ryear 
     662 
    621663 
    622664      ! reactivity rc in  [l.mol-1.s-1]       
     
    625667      ! Bioturbation parameter 
    626668      !------------------------ 
     669      REWIND( numnamsed_ref )              ! Namelist nam_btb in reference namelist : Pisces variables 
    627670      READ  ( numnamsed_ref, nam_btb, IOSTAT = ios, ERR = 913) 
    628671913   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_btb in reference namelist' ) 
    629672 
     673      REWIND( numnamsed_cfg )              ! Namelist nam_btb in reference namelist : Pisces variables 
    630674      READ  ( numnamsed_cfg, nam_btb, IOSTAT = ios, ERR = 914) 
    631675914   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_btb in configuration namelist' ) 
     
    637681         WRITE(numsed,*) ' coefficient for btb attenuation   dbtbzsc  = ', dbtbzsc 
    638682         WRITE(numsed,*) ' Adsorption coefficient of NH4     adsnh4   = ', adsnh4 
     683         WRITE(numsed,*) ' Adsorption coefficient of Fe2     adsfe2   = ', adsfe2 
    639684         WRITE(numsed,*) ' Bioirrigation in sediment         ln_irrig = ', ln_irrig 
    640685         WRITE(numsed,*) ' coefficient for irrig attenuation xirrzsc  = ', xirrzsc 
     
    644689      ! Initial value (t=0) for sediment pore water and solid components 
    645690      !---------------------------------------------------------------- 
     691      REWIND( numnamsed_ref )              ! Namelist nam_rst in reference namelist : Pisces variables 
    646692      READ  ( numnamsed_ref, nam_rst, IOSTAT = ios, ERR = 915) 
    647693915   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_rst in reference namelist' ) 
    648694 
     695      REWIND( numnamsed_cfg )              ! Namelist nam_rst in reference namelist : Pisces variables 
    649696      READ  ( numnamsed_cfg, nam_rst, IOSTAT = ios, ERR = 916) 
    650697916   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_rst in configuration namelist' ) 
     
    655702         WRITE(numsed,*) ' ' 
    656703      ENDIF 
    657       nn_dtsed = 1 
    658  
    659  
    660    END SUBROUTINE sed_init_nam 
     704 
     705      CLOSE( numnamsed_cfg ) 
     706      CLOSE( numnamsed_ref ) 
     707 
     708   END SUBROUTINE sed_ini_nam 
    661709 
    662710END MODULE sedini 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedinitrc.F90

    r12377 r15075  
    5050      !!        !  06-07  (C. Ethe)  Re-organization 
    5151      !!---------------------------------------------------------------------- 
    52       INTEGER, INTENT(in)  ::  Kbb, Kmm      ! time level indices 
     52      INTEGER, INTENT(in) ::   Kbb, Kmm  ! time level indices 
     53 
    5354      INTEGER :: ji, jj, ikt 
    5455      !!---------------------------------------------------------------------- 
     
    8687      !!        !  06-07  (C. Ethe)  original 
    8788      !!---------------------------------------------------------------------- 
    88       INTEGER, INTENT(in)  ::  Kbb, Kmm      ! time level indices 
    8989  
     90      INTEGER, INTENT(in) ::   Kbb, Kmm  ! time level indices 
     91 
    9092      ! local variables 
    91       INTEGER :: & 
    92          ji, jk, zhipor 
     93      INTEGER :: ji, jk, zhipor 
    9394 
    9495      !-------------------------------------------------------------------- 
     
    134135      ! Initialization of chemical constants 
    135136      CALL sed_chem ( nitsed000 ) 
    136  
    137       ! Stores initial sediment data for mass balance calculation 
    138       pwcp0 (1:jpoce,1:jpksed,1:jpwat ) = pwcp (1:jpoce,1:jpksed,1:jpwat )  
    139       solcp0(1:jpoce,1:jpksed,1:jpsol ) = solcp(1:jpoce,1:jpksed,1:jpsol)  
    140137 
    141138      ! Conversion of [h+] in mol/Kg to get it in mol/l ( multiplication by density) 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedinorg.F90

    r14385 r15075  
    88   USE sed     ! sediment global variable 
    99   USE sed_oce 
    10    USE sedmat  ! linear system of equations 
    11    USE sedco3  ! carbonate ion and proton concentration  
    1210   USE sedini 
    13    USE seddsr 
    1411   USE lib_mpp         ! distribued memory computing library 
    1512   USE lib_fortran 
     
    2320CONTAINS 
    2421    
    25    SUBROUTINE sed_inorg( kt, knt )  
     22   SUBROUTINE sed_inorg( kt ) 
    2623      !!---------------------------------------------------------------------- 
    2724      !!                   ***  ROUTINE sed_inorg  *** 
     
    4643      !!---------------------------------------------------------------------- 
    4744      !! Arguments 
    48       INTEGER, INTENT(in) ::   kt, knt       ! number of iteration 
     45      INTEGER, INTENT(in)  :: kt   ! time step 
    4946      ! --- local variables 
    50       INTEGER :: ji, jk, js, jw         ! dummy looop indices 
    51       REAL(wp), DIMENSION(jpoce,jpksed) :: zrearat1, zrearat2    ! reaction rate in pore water 
    52       REAL(wp), DIMENSION(jpoce,jpksed) :: zundsat    ! undersaturation ; indice jpwatp1 is for calcite    
    53       REAL(wp), DIMENSION(jpoce) :: zco3eq 
    54       REAL(wp), DIMENSION(jpoce,jpksed,jpsol) :: zvolc    ! temp. variables 
    55       REAL(wp), DIMENSION(jpoce) :: zsieq 
    56       REAL(wp)  ::  zsolid1, zvolw, zreasat, zbeta, zgamma 
    57       REAL(wp)  ::  zsatur, zsatur2, znusil, zsolcpcl, zsolcpsi 
     47      INTEGER   ::  ji,jk          ! dummy looop indices 
     48      REAL(wp)  ::  zsieq 
     49      REAL(wp)  ::  zsolid1, zreasat 
     50      REAL(wp)  ::  zsatur, zsatur2, znusil, zsolcpcl, zsolcpsi, zexcess 
    5851      !! 
    5952      !!---------------------------------------------------------------------- 
    6053 
    6154      IF( ln_timing )  CALL timing_start('sed_inorg') 
     55 
     56      IF( kt == nitsed000 ) THEN 
     57         IF (lwp) WRITE(numsed,*) ' sed_inorg : Dissolution of CaCO3 and BSi  ' 
     58         IF (lwp) WRITE(numsed,*) ' ' 
     59      ENDIF 
    6260! 
    63       IF( kt == nitsed000 .AND. knt == 1 ) THEN 
    64          IF (lwp) THEN 
    65             WRITE(numsed,*) ' sed_inorg : Dissolution reaction ' 
    66             WRITE(numsed,*) ' ' 
    67          ENDIF 
    68 !         !  
    69       ENDIF 
     61      DO ji = 1, jpoce 
     62         ! ----------------------------------------------- 
     63         ! Computation of Si solubility 
     64         ! Param of Ridgwell et al. 2002 
     65         ! ----------------------------------------------- 
    7066 
    71      ! Initializations 
    72      !---------------------- 
    73        
    74       zrearat1(:,:) = 0.    ;   zundsat(:,:)  = 0.  
    75       zrearat2(:,:) = 0. 
    76       zco3eq(:)     = rtrn 
    77       zvolc(:,:,:)  = 0. 
    78  
    79       ! ----------------------------------------------- 
    80       ! Computation of Si solubility 
    81       ! Param of Ridgwell et al. 2002 
    82       ! ----------------------------------------------- 
    83  
    84       DO ji = 1, jpoce 
    8567         zsolcpcl = 0.0 
    8668         zsolcpsi = 0.0 
     
    9072         END DO 
    9173         zsolcpsi = MAX( zsolcpsi, rtrn ) 
    92          zsieq(ji) = sieqs(ji) * MAX(0.25, 1.0 - (0.045 * zsolcpcl / zsolcpsi )**0.58 ) 
    93          zsieq(ji) = MAX( rtrn, sieqs(ji) ) 
     74         zsieq = sieqs(ji) * MAX(0.25, 1.0 - (0.045 * zsolcpcl / zsolcpsi )**0.58 ) 
     75 
     76         !---------------------------------------------------------- 
     77         ! 5.  Beginning of  Pore Water diffusion and solid reaction 
     78         !--------------------------------------------------------- 
     79       
     80         !----------------------------------------------------------------------------- 
     81         ! For jk=2,jpksed, and for couple  
     82         !  1 : jwsil/jsopal  ( SI/Opal ) 
     83         !  2 : jsclay/jsclay ( clay/clay )  
     84         !  3 : jwoxy/jspoc   ( O2/POC ) 
     85         !  reaction rate is a function of solid=concentration in solid reactif in [mol/l]  
     86         !  and undersaturation in [mol/l]. 
     87         !  Solid weight fractions should be in ie [mol/l]) 
     88         !  second member and solution are in zundsat variable 
     89         !------------------------------------------------------------------------- 
     90         DO jk = 2, jpksed 
     91            zsolid1 = volc(ji,jk,jsopal) * solcp(ji,jk,jsopal) 
     92            zsatur = MAX(0., ( zsieq - pwcp(ji,jk,jwsil) ) / zsieq ) 
     93            zsatur2 = (1.0 + temp(ji) / 400.0 )**37 
     94            znusil = ( 0.225 * ( 1.0 + temp(ji) / 15.) * zsatur + 0.775 * zsatur2 * zsatur**9.25 ) 
     95            solcp(ji,jk,jsopal) = solcp(ji,jk,jsopal) - reac_sil * znusil * dtsed * solcp(ji,jk,jsopal) 
     96            pwcp(ji,jk,jwsil) = pwcp(ji,jk,jwsil) + reac_sil * znusil * dtsed * zsolid1 
     97         END DO 
    9498      END DO 
    95  
    96       DO js = 1, jpsol 
    97          DO jk = 1, jpksed 
    98             DO ji = 1, jpoce     
    99                zvolc(ji,jk,js) = ( vols3d(ji,jk) * dens_mol_wgt(js) ) /  & 
    100                   &              ( volw3d(ji,jk) * 1.e-3  )      
    101             ENDDO 
    102          ENDDO 
    103       ENDDO 
    104  
    105       !---------------------------------------------------------- 
    106       ! 5.  Beginning of  Pore Water diffusion and solid reaction 
    107       !--------------------------------------------------------- 
    108        
    109       !----------------------------------------------------------------------------- 
    110       ! For jk=2,jpksed, and for couple  
    111       !  1 : jwsil/jsopal  ( SI/Opal ) 
    112       !  2 : jsclay/jsclay ( clay/clay )  
    113       !  3 : jwoxy/jspoc   ( O2/POC ) 
    114       !  reaction rate is a function of solid=concentration in solid reactif in [mol/l]  
    115       !  and undersaturation in [mol/l]. 
    116       !  Solid weight fractions should be in ie [mol/l]) 
    117       !  second member and solution are in zundsat variable 
    118       !------------------------------------------------------------------------- 
    119  
    120       DO jk = 1, jpksed 
    121          DO ji = 1, jpoce 
    122             ! For Silicic Acid and clay 
    123             zundsat(ji,jk) = zsieq(ji) - pwcp(ji,jk,jwsil) 
    124          ENDDO 
    125       ENDDO 
    126        
    127       ! Definition of reaction rates [rearat]=sans dim  
    128       ! For jk=1 no reaction (pure water without solid) for each solid compo 
    129       DO ji = 1, jpoce 
    130          zrearat1(ji,:) = 0. 
    131          zrearat2(ji,:) = 0. 
    132       ENDDO 
    133  
    134       ! left hand side of coefficient matrix 
    135       DO jk = 2, jpksed 
    136          DO ji = 1, jpoce 
    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 
    148          ENDDO 
    149       ENDDO 
    15099 
    151100      !--------------------------------------------------------------- 
     
    154103 
    155104      ! computes co3por from the updated pwcp concentrations (note [co3por] = mol/l) 
    156  
    157       CALL sed_co3( kt ) 
    158  
    159105      ! *densSW(l)**2 converts aksps [mol2/kg sol2] into [mol2/l2] to get [undsat] in [mol/l] 
    160       DO jk = 1, jpksed 
    161          DO ji = 1, jpoce 
    162             zco3eq(ji)     = aksps(ji) * densSW(ji) * densSW(ji) / ( calcon2(ji) + rtrn ) 
    163             zco3eq(ji)     = MAX( rtrn, zco3eq(ji) )  
    164             zundsat(ji,jk) = ( zco3eq(ji) - co3por(ji,jk) ) / zco3eq(ji) 
    165             saturco3(ji,jk) = zundsat(ji,jk) 
    166          ENDDO 
    167       ENDDO 
    168  
    169       DO jk = 2, jpksed 
    170          DO ji = 1, jpoce 
    171             IF ( zundsat(ji,jk) > 0. ) THEN 
    172                zsolid1 = zvolc(ji,jk,jscal) * solcp(ji,jk,jscal) 
    173                zbeta = 1.0 - reac_cal * dtsed2 * zundsat(ji,jk) + reac_cal * dtsed2 * zsolid1 
    174                zgamma = -reac_cal * dtsed2 * zundsat(ji,jk) 
    175                zundsat(ji,jk) = ( -zbeta + SQRT( zbeta**2 - 4.0 * zgamma ) ) / ( 2.0 * reac_cal * dtsed2 ) 
    176                saturco3(ji,jk) = zundsat(ji,jk) 
    177                zreasat = reac_cal * dtsed2 * zundsat(ji,jk) * zsolid1 / ( 1. + reac_cal * dtsed2 * zundsat(ji,jk) ) 
    178                solcp(ji,jk,jscal) = solcp(ji,jk,jscal) - zreasat / zvolc(ji,jk,jscal) 
    179                ! For DIC 
    180                pwcp(ji,jk,jwdic)  = pwcp(ji,jk,jwdic) + zreasat 
    181                ! For alkalinity 
    182                pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + 2.0 * zreasat 
    183             ENDIF 
     106      DO ji = 1, jpoce 
     107         saturco3(ji,:) = 1.0 - co3por(ji,:) * calcon2(ji) / ( aksps(ji) * densSW(ji) * densSW(ji) + rtrn )  
     108         DO jk = 2, jpksed 
     109            zsolid1 = volc(ji,jk,jscal) * solcp(ji,jk,jscal) 
     110            zexcess = MAX( 0., saturco3(ji,jk) )  
     111            zreasat = reac_cal * dtsed * zexcess * zsolid1 
     112            solcp(ji,jk,jscal) = solcp(ji,jk,jscal) - zreasat / volc(ji,jk,jscal) 
     113            ! For DIC 
     114            pwcp(ji,jk,jwdic)  = pwcp(ji,jk,jwdic) + zreasat 
     115            ! For alkalinity 
     116            pwcp(ji,jk,jwalk)  = pwcp(ji,jk,jwalk) + 2.0 * zreasat 
    184117         END DO 
    185118      END DO 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedmat.F90

    r10222 r15075  
    1414   PRIVATE 
    1515 
    16    PUBLIC sed_mat  
    17  
    18    INTERFACE sed_mat 
    19       MODULE PROCEDURE sed_mat_dsr, sed_mat_btb 
    20    END INTERFACE 
    21  
    22    INTEGER, PARAMETER :: nmax = 30  
     16   PUBLIC sed_mat_dsr  
     17   PUBLIC sed_mat_dsrjac 
     18   PUBLIC sed_mat_dsri 
     19   PUBLIC sed_mat_btb 
     20 
     21   INTEGER, PARAMETER :: nmax = 60  
    2322 
    2423 
     
    2625 CONTAINS 
    2726 
    28     SUBROUTINE sed_mat_dsr( nvar, ndim, nlev, preac, psms, psol, dtsed_in ) 
     27    SUBROUTINE sed_mat_dsr( ji, nvar, dtsed_in ) 
    2928       !!--------------------------------------------------------------------- 
    3029       !!                  ***  ROUTINE sed_mat_dsr  *** 
     
    4948       !!---------------------------------------------------------------------- 
    5049       !! * Arguments 
    51        INTEGER , INTENT(in) ::  nvar  ! number of variable 
    52        INTEGER , INTENT(in) ::  ndim  ! number of points 
    53        INTEGER , INTENT(in) ::  nlev  ! number of sediment levels 
    54  
    55        REAL(wp), DIMENSION(ndim,nlev), INTENT(in   ) :: preac  ! reaction rates 
    56        REAL(wp), DIMENSION(ndim,nlev), INTENT(in   ) :: psms  ! reaction rates 
    57        REAL(wp), DIMENSION(ndim,nlev), INTENT(inout) :: psol   ! solution ( undersaturation values ) 
     50       INTEGER , INTENT(in) ::  ji, nvar  ! number of variable 
     51 
    5852       REAL(wp), INTENT(in) ::  dtsed_in 
    5953  
    6054       !---Local declarations 
    61        INTEGER  ::  ji, jk, jn 
    62        REAL(wp), DIMENSION(ndim,nlev) :: za, zb, zc, zr 
    63        REAL(wp), DIMENSION(ndim)      :: zbet 
    64        REAL(wp), DIMENSION(ndim,nmax) :: zgamm 
     55       INTEGER  ::  jk, jn 
     56       REAL(wp), DIMENSION(jpksed) :: za, zb, zc 
    6557 
    6658       REAL(wp) ::  aplus,aminus   
     
    7971       jn = nvar 
    8072       ! first sediment level           
    81        DO ji = 1, ndim 
    82           aplus  = ( ( volw3d(ji,1) / ( dz3d(ji,1) ) ) + & 
     73       aplus  = ( ( volw3d(ji,1) / ( dz3d(ji,1) ) ) + & 
    8374                        ( volw3d(ji,2) / ( dz3d(ji,2) ) ) ) / 2. 
    84           dxplus = ( dz3d(ji,1) + dz3d(ji,2) ) / 2. 
    85           rplus  = ( dtsed_in / ( volw3d(ji,1) ) ) * diff(ji,1,jn) * aplus / dxplus  
    86  
    87           za(ji,1) = 0. 
    88           zb(ji,1) = 1. + rplus 
    89           zc(ji,1) = -rplus 
    90        ENDDO 
     75       dxplus = ( dz3d(ji,1) + dz3d(ji,2) ) / 2. 
     76       rplus  = ( dtsed_in / ( volw3d(ji,1) ) ) * diff(ji,1,jn) * aplus / dxplus  
     77 
     78       za(1) = 0. 
     79       zb(1) = rplus 
     80       zc(1) = -rplus 
    9181  
    92        DO jk = 2, nlev - 1 
    93           DO ji = 1, ndim 
    94              aminus  = ( ( volw3d(ji,jk-1) / ( dz3d(ji,jk-1) ) ) + & 
    95              &        ( volw3d(ji,jk  ) / ( dz3d(ji,jk  ) ) ) ) / 2. 
    96              dxminus = ( dz3d(ji,jk-1) + dz3d(ji,jk) ) / 2. 
    97  
    98              aplus   = ( ( volw3d(ji,jk  ) / ( dz3d(ji,jk  ) ) ) + & 
    99              &        ( volw3d(ji,jk+1) / ( dz3d(ji,jk+1) ) ) ) / 2. 
    100              dxplus  = ( dz3d(ji,jk) + dz3d(ji,jk+1) ) / 2 
    101                 ! 
    102              rminus  = ( dtsed_in / volw3d(ji,jk) ) * diff(ji,jk-1,jn) * aminus / dxminus 
    103              rplus   = ( dtsed_in / volw3d(ji,jk) ) * diff(ji,jk,jn)   * aplus / dxplus 
    104                 !      
    105              za(ji,jk) = -rminus 
    106              zb(ji,jk) = 1. + rminus + rplus  
    107              zc(ji,jk) = -rplus 
    108           END DO 
     82       DO jk = 2, jpksed - 1 
     83          aminus  = ( ( volw3d(ji,jk-1) / ( dz3d(ji,jk-1) ) ) + & 
     84          &        ( volw3d(ji,jk  ) / ( dz3d(ji,jk  ) ) ) ) / 2. 
     85          dxminus = ( dz3d(ji,jk-1) + dz3d(ji,jk) ) / 2. 
     86 
     87          aplus   = ( ( volw3d(ji,jk  ) / ( dz3d(ji,jk  ) ) ) + & 
     88          &        ( volw3d(ji,jk+1) / ( dz3d(ji,jk+1) ) ) ) / 2. 
     89          dxplus  = ( dz3d(ji,jk) + dz3d(ji,jk+1) ) / 2 
     90          ! 
     91          rminus  = ( dtsed_in / volw3d(ji,jk) ) * diff(ji,jk-1,jn) * aminus / dxminus 
     92          rplus   = ( dtsed_in / volw3d(ji,jk) ) * diff(ji,jk,jn)   * aplus / dxplus 
     93          !      
     94          za(jk) = -rminus 
     95          zb(jk) = rminus + rplus  
     96          zc(jk) = -rplus 
    10997       END DO 
    11098 
    111        DO ji = 1, ndim 
    112           aminus  = ( ( volw3d(ji,nlev-1) / dz3d(ji,nlev-1)  ) + & 
    113           &        ( volw3d(ji,nlev)  / dz3d(ji,nlev) ) ) / 2. 
    114           dxminus = ( dz3d(ji,nlev-1) + dz3d(ji,nlev) ) / 2. 
    115           rminus  = ( dtsed_in / volw3d(ji,nlev) ) * diff(ji,nlev-1,jn) * aminus / dxminus 
    116           ! 
    117           za(ji,nlev) = -rminus 
    118           zb(ji,nlev) = 1. + rminus 
    119           zc(ji,nlev) = 0. 
    120        END DO 
    121  
     99       aminus  = ( ( volw3d(ji,jpksed-1) / dz3d(ji,jpksed-1)  ) + & 
     100       &        ( volw3d(ji,jpksed)  / dz3d(ji,jpksed) ) ) / 2. 
     101       dxminus = ( dz3d(ji,jpksed-1) + dz3d(ji,jpksed) ) / 2. 
     102       rminus  = ( dtsed_in / volw3d(ji,jpksed) ) * diff(ji,jpksed-1,jn) * aminus / dxminus 
     103       ! 
     104       za(jpksed) = -rminus 
     105       zb(jpksed) = rminus 
     106       zc(jpksed) = 0. 
    122107 
    123108       ! solves tridiagonal system of linear equations  
    124109       ! ----------------------------------------------- 
    125110 
    126        zr  (:,:) = psol(:,:) + psms(:,:) 
    127        zb  (:,:) = zb(:,:) + preac(:,:) 
    128        zbet(:  ) = zb(:,1) 
    129        psol(:,1) = zr(:,1) / zbet(:) 
    130  
    131           !  
    132        DO jk = 2, nlev 
    133           DO ji = 1, ndim 
    134              zgamm(ji,jk) =  zc(ji,jk-1) / zbet(ji) 
    135              zbet(ji)     =  zb(ji,jk) - za(ji,jk) * zgamm(ji,jk) 
    136              psol(ji,jk)  = ( zr(ji,jk) - za(ji,jk) * psol(ji,jk-1) ) / zbet(ji) 
     111       pwcpa(ji,1,jn) = pwcpa(ji,1,jn) - ( zc(1) * pwcp(ji,2,jn) + zb(1) * pwcp(ji,1,jn) )  
     112       DO jk = 2, jpksed - 1 
     113          pwcpa(ji,jk,jn) =  pwcpa(ji,jk,jn) - ( zc(jk) * pwcp(ji,jk+1,jn) + za(jk) * pwcp(ji,jk-1,jn)    & 
     114          &                  + zb(jk) * pwcp(ji,jk,jn) ) 
     115       ENDDO 
     116       pwcpa(ji,jpksed,jn) = pwcpa(ji,jpksed,jn) - ( za(jk) * pwcp(ji,jk-1,jn) + zb(jk) * pwcp(ji,jk,jn) ) 
     117 
     118       IF( ln_timing )  CALL timing_stop('sed_mat_dsr') 
     119 
     120    END SUBROUTINE sed_mat_dsr 
     121 
     122    SUBROUTINE sed_mat_dsrjac( ji, nvar, dtsed_in ) 
     123       !!--------------------------------------------------------------------- 
     124       !!                  ***  ROUTINE sed_mat_dsrjac  *** 
     125       !! 
     126       !! ** Purpose :  solves tridiagonal system of linear equations  
     127       !! 
     128       !! ** Method  :  
     129       !!        1 - computes left hand side of linear system of equations 
     130       !!            for dissolution reaction 
     131       !!         For mass balance in kbot+sediment : 
     132       !!              dz3d  (:,1) = dz(1) = 0.5 cm 
     133       !!              volw3d(:,1) = dzkbot ( see sedini.F90 )  
     134       !!              dz(2)       = 0.3 cm  
     135       !!              dz3d(:,2)   = 0.3 + dzdep   ( see seddsr.F90 )      
     136       !!              volw3d(:,2) and vols3d(l,2) are thickened ( see 
     137       !seddsr.F90 )  
     138       !! 
     139       !!         2 - forward/backward substitution.  
     140       !! 
     141       !!   History : 
     142       !!        !  04-10 (N. Emprin, M. Gehlen ) original 
     143       !!        !  06-04 (C. Ethe)  Module Re-organization 
     144       !!---------------------------------------------------------------------- 
     145       !! * Arguments 
     146       INTEGER , INTENT(in) ::  ji, nvar  ! number of variable 
     147 
     148       REAL(wp), INTENT(in) ::  dtsed_in 
     149 
     150       !---Local declarations 
     151       INTEGER  ::  jk, jn, jnn 
     152       REAL(wp), DIMENSION(jpksed) :: za, zb, zc 
     153 
     154       REAL(wp) ::  aplus,aminus 
     155       REAL(wp) ::  rplus,rminus 
     156       REAL(wp) ::  dxplus,dxminus 
     157 
     158       !---------------------------------------------------------------------- 
     159 
     160       IF( ln_timing )  CALL timing_start('sed_mat_dsrjac') 
     161 
     162       ! Computation left hand side of linear system of  
     163       ! equations for dissolution reaction 
     164       !--------------------------------------------- 
     165 
     166 
     167       jn = nvar 
     168       ! first sediment level           
     169       aplus  = ( ( volw3d(ji,1) / ( dz3d(ji,1) ) ) + & 
     170                        ( volw3d(ji,2) / ( dz3d(ji,2) ) ) ) / 2. 
     171       dxplus = ( dz3d(ji,1) + dz3d(ji,2) ) / 2. 
     172       rplus  = ( dtsed_in / ( volw3d(ji,1) ) ) * diff(ji,1,jn) * aplus / dxplus 
     173 
     174       za(1) = 0. 
     175       zb(1) = rplus 
     176       zc(1) = -rplus 
     177 
     178       DO jk = 2, jpksed - 1 
     179          aminus  = ( ( volw3d(ji,jk-1) / ( dz3d(ji,jk-1) ) ) + & 
     180          &        ( volw3d(ji,jk  ) / ( dz3d(ji,jk  ) ) ) ) / 2. 
     181          dxminus = ( dz3d(ji,jk-1) + dz3d(ji,jk) ) / 2. 
     182 
     183          aplus   = ( ( volw3d(ji,jk  ) / ( dz3d(ji,jk  ) ) ) + & 
     184          &        ( volw3d(ji,jk+1) / ( dz3d(ji,jk+1) ) ) ) / 2. 
     185          dxplus  = ( dz3d(ji,jk) + dz3d(ji,jk+1) ) / 2 
     186          ! 
     187          rminus  = ( dtsed_in / volw3d(ji,jk) ) * diff(ji,jk-1,jn) * aminus / dxminus 
     188          rplus   = ( dtsed_in / volw3d(ji,jk) ) * diff(ji,jk,jn)   * aplus / dxplus 
     189          !      
     190          za(jk) = -rminus 
     191          zb(jk) = rminus + rplus 
     192          zc(jk) = -rplus 
     193       END DO 
     194 
     195       aminus  = ( ( volw3d(ji,jpksed-1) / dz3d(ji,jpksed-1)  ) + & 
     196       &        ( volw3d(ji,jpksed)  / dz3d(ji,jpksed) ) ) / 2. 
     197       dxminus = ( dz3d(ji,jpksed-1) + dz3d(ji,jpksed) ) / 2. 
     198       rminus  = ( dtsed_in / volw3d(ji,jpksed) ) * diff(ji,jpksed-1,jn) * aminus / dxminus 
     199       ! 
     200       za(jpksed) = -rminus 
     201       zb(jpksed) = rminus 
     202       zc(jpksed) = 0. 
     203 
     204       ! solves tridiagonal system of linear equations  
     205 
     206       IF (isvode(jn) > 0) THEN 
     207          jnn = isvode(jn) 
     208          Jacobian(ji, jnn, jnn) = Jacobian(ji,jnn,jnn) - zb(1) 
     209          Jacobian(ji, jnn, jpvode + jnn) = Jacobian(ji, jnn, jpvode + jnn) -zc(1) 
     210          DO jk = 2, jpksed - 1 
     211             Jacobian(ji, (jk-1) * jpvode + jnn, (jk-2) * jpvode + jnn) = Jacobian(ji, (jk-1) * jpvode + jnn, (jk-2) * jpvode + jnn) - za(jk) 
     212             Jacobian(ji, (jk-1) * jpvode + jnn, (jk-1) * jpvode + jnn) = Jacobian(ji, (jk-1) * jpvode + jnn, (jk-1) * jpvode + jnn) - zb(jk) 
     213             Jacobian(ji, (jk-1) * jpvode + jnn, (jk) * jpvode + jnn)   = Jacobian(ji, (jk-1) * jpvode + jnn, (jk) * jpvode + jnn) - zc(jk) 
    137214          END DO 
    138        ENDDO 
    139           !  
    140        DO jk = nlev - 1, 1, -1 
    141           DO ji = 1,ndim 
    142              psol(ji,jk) = psol(ji,jk) - zgamm(ji,jk+1) * psol(ji,jk+1) 
    143           END DO 
    144        ENDDO 
    145  
    146        IF( ln_timing )  CALL timing_stop('sed_mat_dsr') 
    147  
    148  
    149     END SUBROUTINE sed_mat_dsr 
    150  
    151     SUBROUTINE sed_mat_btb( nvar, ndim, nlev, psol, dtsed_in ) 
     215          Jacobian(ji, (jpksed-1) * jpvode + jnn, (jpksed-2) * jpvode + jnn) = Jacobian(ji, (jpksed-1) * jpvode + jnn, (jpksed-2) * jpvode + jnn) - za(jpksed) 
     216          Jacobian(ji, (jpksed-1) * jpvode + jnn, (jpksed-1) * jpvode + jnn) = Jacobian(ji, (jpksed-1) * jpvode + jnn, (jpksed-1) * jpvode + jnn) - zb(jpksed) 
     217       ENDIF 
     218 
     219       IF( ln_timing )  CALL timing_stop('sed_mat_dsrjac') 
     220 
     221    END SUBROUTINE sed_mat_dsrjac 
     222 
     223 
     224  
     225 
     226    SUBROUTINE sed_mat_btb( nlev, nvar, psol, preac, dtsed_in ) 
    152227       !!--------------------------------------------------------------------- 
    153228       !!                  ***  ROUTINE sed_mat_btb  *** 
     
    167242       !! * Arguments 
    168243       INTEGER , INTENT(in) :: & 
    169           nvar , &  ! number of variables 
    170           ndim , &  ! number of points 
    171           nlev      ! number of sediment levels 
    172  
    173       REAL(wp), DIMENSION(ndim,nlev,nvar), INTENT(inout) :: & 
    174           psol      ! solution 
     244          nlev, nvar      ! number of sediment levels 
     245 
     246      REAL(wp), DIMENSION(jpoce,nlev,nvar), INTENT(inout) :: & 
     247          psol, preac 
    175248 
    176249      REAL(wp), INTENT(in) :: dtsed_in 
     
    181254 
    182255       REAL(wp) ::  & 
    183           aplus,aminus   ,  &  
     256          aplus,aminus   ,  & 
    184257          rplus,rminus   ,  & 
    185           dxplus,dxminus  
     258          dxplus,dxminus 
    186259 
    187260       REAL(wp), DIMENSION(nlev)      :: za, zb, zc 
    188        REAL(wp), DIMENSION(ndim,nlev) :: zr 
    189        REAL(wp), DIMENSION(nmax)      :: zgamm  
     261       REAL(wp), DIMENSION(jpoce,nlev) :: zr 
     262       REAL(wp), DIMENSION(nmax)      :: zgamm 
    190263       REAL(wp) ::  zbet 
    191264 
    192   
    193265       !---------------------------------------------------------------------- 
    194266 
     
    201273 
    202274       ! first sediment level           
    203       DO ji = 1, ndim 
     275      DO ji = 1, jpoce 
    204276         aplus  = ( ( vols(2) / dz(2) ) + ( vols(3) / dz(3) ) ) / 2. 
    205277         dxplus = ( dz(2) + dz(3) ) / 2. 
    206          rplus  = ( dtsed_in / vols(2) ) * db(ji,2) * aplus / dxplus  
     278         rplus  = ( dtsed_in / vols(2) ) * db(ji,2) * aplus / dxplus 
    207279 
    208280         za(1) = 0. 
    209          zb(1) = 1. + rplus 
     281         zb(1) = 1. + rplus  
    210282         zc(1) = -rplus 
    211283 
    212               
    213284         DO jk = 2, nlev - 1 
    214285            aminus  = ( ( vols(jk) / dz(jk) ) + ( vols(jk+1) / dz(jk+1) ) ) / 2. 
     
    221292            !      
    222293            za(jk) = -rminus 
    223             zb(jk) = 1. + rminus + rplus  
     294            zb(jk) = 1. + rminus + rplus 
    224295            zc(jk) = -rplus 
     296 
    225297         ENDDO 
    226   
     298 
    227299         aminus  = ( ( vols(nlev) / dz(nlev) ) + ( vols(nlev+1) / dz(nlev+1) ) ) / 2. 
    228300         dxminus = ( dz(nlev) + dz(nlev+1) ) / 2. 
     
    233305         zc(nlev) = 0. 
    234306 
    235  
    236307         ! solves tridiagonal system of linear equations  
    237308         ! -----------------------------------------------     
    238309         DO jn = 1, nvar 
    239            
    240310            DO jk = 1, nlev 
    241                zr  (ji,jk)    = psol(ji,jk,jn) 
     311               zr(ji,jk) = psol(ji,jk,jn) 
    242312            END DO 
    243             zbet          = zb(1) 
     313            zbet          = zb(1) - preac(ji,1,jn) * dtsed_in 
    244314            psol(ji,1,jn) = zr(ji,1) / zbet 
    245315            !  
    246316            DO jk = 2, nlev 
    247317               zgamm(jk) =  zc(jk-1) / zbet 
    248                zbet      =  zb(jk) - za(jk) * zgamm(jk) 
     318               zbet      =  zb(jk) - preac(ji,jk,jn) * dtsed_in - za(jk) * zgamm(jk) 
    249319               psol(ji,jk,jn) = ( zr(ji,jk) - za(jk) * psol(ji,jk-1,jn) ) / zbet 
    250320            ENDDO 
    251321            !  
    252322            DO jk = nlev - 1, 1, -1 
    253                 psol(ji,jk,jn) = psol(ji,jk,jn) - zgamm(jk+1) * psol(ji,jk+1,jn) 
     323               psol(ji,jk,jn) = psol(ji,jk,jn) - zgamm(jk+1) * psol(ji,jk+1,jn) 
    254324            ENDDO 
    255  
    256          ENDDO 
    257  
    258        END DO 
    259        ! 
    260        IF( ln_timing )  CALL timing_stop('sed_mat_btb') 
     325         END DO 
     326      END DO 
     327      ! 
     328      IF( ln_timing )  CALL timing_stop('sed_mat_btb') 
    261329 
    262330        
    263331    END SUBROUTINE sed_mat_btb 
    264332 
     333    SUBROUTINE sed_mat_dsri( nvar, preac, psms, dtsed_in ) 
     334       !!--------------------------------------------------------------------- 
     335       !!                  ***  ROUTINE sed_mat_dsr  *** 
     336       !! 
     337       !! ** Purpose :  solves tridiagonal system of linear equations  
     338       !! 
     339       !! ** Method  :  
     340       !!        1 - computes left hand side of linear system of equations 
     341       !!            for dissolution reaction 
     342       !!         For mass balance in kbot+sediment : 
     343       !!              dz3d  (:,1) = dz(1) = 0.5 cm 
     344       !!              volw3d(:,1) = dzkbot ( see sedini.F90 )  
     345       !!              dz(2)       = 0.3 cm  
     346       !!              dz3d(:,2)   = 0.3 + dzdep   ( see seddsr.F90 )      
     347       !!              volw3d(:,2) and vols3d(l,2) are thickened ( see 
     348       !seddsr.F90 )  
     349       !! 
     350       !!         2 - forward/backward substitution.  
     351       !! 
     352       !!   History : 
     353       !!        !  04-10 (N. Emprin, M. Gehlen ) original 
     354       !!        !  06-04 (C. Ethe)  Module Re-organization 
     355       !!---------------------------------------------------------------------- 
     356       !! * Arguments 
     357       INTEGER , INTENT(in) ::  nvar  ! number of variable 
     358 
     359       REAL(wp), DIMENSION(jpoce,jpksed), INTENT(in   ) :: preac  ! reaction rates 
     360       REAL(wp), DIMENSION(jpoce,jpksed), INTENT(in   ) :: psms  ! reaction rates 
     361       REAL(wp), INTENT(in) ::  dtsed_in 
     362 
     363       !---Local declarations 
     364       INTEGER  ::  ji, jk, jn 
     365       REAL(wp), DIMENSION(jpoce,jpksed) :: za, zb, zc, zr 
     366       REAL(wp), DIMENSION(jpoce)      :: zbet 
     367       REAL(wp), DIMENSION(jpoce,nmax) :: zgamm 
     368 
     369       REAL(wp) ::  aplus,aminus 
     370       REAL(wp) ::  rplus,rminus 
     371       REAL(wp) ::  dxplus,dxminus 
     372 
     373       !---------------------------------------------------------------------- 
     374 
     375       IF( ln_timing )  CALL timing_start('sed_mat_dsri') 
     376 
     377       ! Computation left hand side of linear system of  
     378       ! equations for dissolution reaction 
     379       !--------------------------------------------- 
     380 
     381 
     382       jn = nvar 
     383       ! first sediment level           
     384       DO ji = 1, jpoce 
     385          aplus  = ( ( volw3d(ji,1) / ( dz3d(ji,1) ) ) + & 
     386                        ( volw3d(ji,2) / ( dz3d(ji,2) ) ) ) / 2. 
     387          dxplus = ( dz3d(ji,1) + dz3d(ji,2) ) / 2. 
     388          rplus  = ( dtsed_in / ( volw3d(ji,1) ) ) * diff(ji,1,jn) * aplus / dxplus 
     389 
     390          za(ji,1) = 0. 
     391          zb(ji,1) = 1. + rplus 
     392          zc(ji,1) = -rplus 
     393       ENDDO 
     394 
     395       DO jk = 2, jpksed - 1 
     396          DO ji = 1, jpoce 
     397             aminus  = ( ( volw3d(ji,jk-1) / ( dz3d(ji,jk-1) ) ) + & 
     398             &        ( volw3d(ji,jk  ) / ( dz3d(ji,jk  ) ) ) ) / 2. 
     399             dxminus = ( dz3d(ji,jk-1) + dz3d(ji,jk) ) / 2. 
     400 
     401             aplus   = ( ( volw3d(ji,jk  ) / ( dz3d(ji,jk  ) ) ) + & 
     402             &        ( volw3d(ji,jk+1) / ( dz3d(ji,jk+1) ) ) ) / 2. 
     403             dxplus  = ( dz3d(ji,jk) + dz3d(ji,jk+1) ) / 2 
     404                ! 
     405             rminus  = ( dtsed_in / volw3d(ji,jk) ) * diff(ji,jk-1,jn) * aminus / dxminus 
     406             rplus   = ( dtsed_in / volw3d(ji,jk) ) * diff(ji,jk,jn)   * aplus /dxplus 
     407                !      
     408             za(ji,jk) = -rminus 
     409             zb(ji,jk) = 1. + rminus + rplus 
     410             zc(ji,jk) = -rplus 
     411          END DO 
     412       END DO 
     413 
     414       DO ji = 1, jpoce 
     415          aminus  = ( ( volw3d(ji,jpksed-1) / dz3d(ji,jpksed-1)  ) + & 
     416          &        ( volw3d(ji,jpksed)  / dz3d(ji,jpksed) ) ) / 2. 
     417          dxminus = ( dz3d(ji,jpksed-1) + dz3d(ji,jpksed) ) / 2. 
     418          rminus  = ( dtsed_in / volw3d(ji,jpksed) ) * diff(ji,jpksed-1,jn) * aminus/ dxminus 
     419          ! 
     420          za(ji,jpksed) = -rminus 
     421          zb(ji,jpksed) = 1. + rminus 
     422          zc(ji,jpksed) = 0. 
     423       END DO 
     424 
     425 
     426       ! solves tridiagonal system of linear equations  
     427       ! ----------------------------------------------- 
     428 
     429       zr  (:,:) = pwcp(:,:,jn) + psms(:,:) 
     430       zb  (:,:) = zb(:,:) - preac(:,:) 
     431       zbet(:  ) = zb(:,1) 
     432       pwcp(:,1,jn) = zr(:,1) / zbet(:) 
     433 
     434          !  
     435       DO jk = 2, jpksed 
     436          DO ji = 1, jpoce 
     437             zgamm(ji,jk) =  zc(ji,jk-1) / zbet(ji) 
     438             zbet(ji)     =  zb(ji,jk) - za(ji,jk) * zgamm(ji,jk) 
     439             pwcp(ji,jk,jn)  = ( zr(ji,jk) - za(ji,jk) * pwcp(ji,jk-1,jn) ) / zbet(ji) 
     440          END DO 
     441       ENDDO 
     442          !  
     443       DO jk = jpksed - 1, 1, -1 
     444          DO ji = 1, jpoce 
     445             pwcp(ji,jk,jn) = pwcp(ji,jk,jn) - zgamm(ji,jk+1) * pwcp(ji,jk+1,jn) 
     446          END DO 
     447       ENDDO 
     448 
     449       IF( ln_timing )  CALL timing_stop('sed_mat_dsri') 
     450 
     451 
     452    END SUBROUTINE sed_mat_dsri 
     453 
     454 
    265455 END MODULE sedmat 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedrst.F90

    r14239 r15075  
    4242      CHARACTER(LEN=50)   ::   clname   ! trc output restart file name 
    4343      CHARACTER(LEN=256)  ::   clpath   ! full path to ocean output restart file 
    44       CHARACTER(LEN=52)   ::   clpname   ! trc output restart file name including AGRIF 
    4544      !!---------------------------------------------------------------------- 
    4645      ! 
     
    6564 
    6665      IF( .NOT. ln_rst_list .AND. nn_stock == -1 )   RETURN   ! we will never do any restart 
    67  
    6866      ! to get better performances with NetCDF format: 
    69       ! we open and define the tracer restart file one tracer time step before writing the data (-> at nitrst - 1) 
    70       ! except if we write tracer restart files every tracer time step or if a tracer restart file was writen at nitend - 1 
    71       IF( kt == nitrst - 2*nn_dtsed .OR. nn_stock == nn_dtsed .OR. ( kt == nitend - nn_dtsed .AND. .NOT. lrst_sed ) ) THEN 
     67      ! we open and define the tracer restart file one tracer time step before writing the data (-> at nitrst - 2*nn_dttrc + 1) 
     68      ! except if we write tracer restart files every tracer time step or if a tracer restart file was writen at nitend - 2*nn_dttrc + 1 
     69      IF( kt == nitrst - 1 .OR. nn_stock == 1 .OR. ( kt == nitend - 1 .AND. .NOT. lrst_sed ) ) THEN 
    7270         ! beware of the format used to write kt (default is i8.8, that should be large enough) 
    7371         IF( nitrst > 1.0e9 ) THEN   ;   WRITE(clkt,*       ) nitrst 
     
    8179         IF(lwp) WRITE(numsed,*) & 
    8280             '             open sed restart.output NetCDF file: ',TRIM(clpath)//clname 
    83          IF(.NOT.lwxios) THEN 
    84             CALL iom_open( TRIM(clpath)//TRIM(clname), numrsw, ldwrt = .TRUE., kdlev = jpksed, cdcomp = 'SED' ) 
    85          ELSE 
    86 #if defined key_xios 
    87             cw_sedrst_cxt = "rstws_"//TRIM(ADJUSTL(clkt)) 
    88             IF( TRIM(Agrif_CFixed()) == '0' ) THEN 
    89                clpname = clname 
    90             ELSE 
    91                clpname = TRIM(Agrif_CFixed())//"_"//clname 
    92             ENDIF 
    93             numrsw = iom_xios_setid(TRIM(clpath)//TRIM(clpname)) 
    94             CALL iom_init( cw_sedrst_cxt, kdid = numrsw, ld_closedef = .FALSE. ) 
    95 #else 
    96             CALL ctl_stop( 'Can not use XIOS in trc_rst_opn' ) 
    97 #endif 
    98          ENDIF 
    99  
     81         CALL iom_open( TRIM(clpath)//TRIM(clname), numrsw, ldwrt = .TRUE., kdlev = jpksed ) 
    10082         lrst_sed = .TRUE. 
    10183      ENDIF 
     
    204186         &             zdta2(1:jpi,1:jpj,1:jpksed), iarroce(1:jpoce) ) 
    205187 
    206       cltra = "sedligand" 
    207       IF( iom_varid( numrsr, TRIM(cltra) , ldstop = .FALSE. ) > 0 ) THEN 
    208          CALL iom_get( numrsr, jpdom_auto, TRIM(cltra), zdta2(:,:,:) ) 
    209       ELSE 
    210          zdta2(:,:,:) = 0.0 
    211       ENDIF 
    212  
    213       CALL pack_arr( jpoce, sedligand(1:jpoce,1:jpksed), & 
    214          &             zdta2(1:jpi,1:jpj,1:jpksed), iarroce(1:jpoce) ) 
    215188      IF( ln_timing )  CALL timing_stop('sed_rst_read') 
    216189      
     
    247220      IF(lwp) WRITE(numsed,*) '~~~~~~~~~' 
    248221 
    249  
    250       trcsedi(:,:,:,:)   = 0.0 
    251       flxsedi3d(:,:,:,:) = 0.0 
    252222      zdta(:,:)          = 1.0 
    253223      zdta2(:,:,:)       = 0.0 
    254  
    255224          
    256225      !! 1. WRITE in nutwrs 
    257226      !! ------------------ 
    258 !     zinfo(1) = REAL( kt) 
    259       CALL iom_rstput( kt, nitrst, numrsw, 'kt', REAL( kt    , wp) ) 
     227      zinfo(1) = REAL( kt) 
     228      CALL iom_rstput( kt, nitrst, numrsw, 'kt', zinfo ) 
    260229 
    261230      ! Back to 2D geometry 
    262231      DO jn = 1, jpsol 
    263          CALL unpack_arr( jpoce, trcsedi(1:jpi,1:jpj,1:jpksed,jn) , iarroce(1:jpoce), & 
     232         CALL unpack_arr( jpoce, zdta2(1:jpi,1:jpj,1:jpksed) , iarroce(1:jpoce), & 
    264233         &                       solcp(1:jpoce,1:jpksed,jn ) ) 
     234         cltra = TRIM(sedtrcd(jn)) 
     235         CALL iom_rstput( kt, nitrst, numrsw, TRIM(cltra), zdta2(:,:,:) ) 
    265236      END DO 
    266237 
    267238      DO jn = 1, jpwat 
    268          CALL unpack_arr( jpoce, trcsedi(1:jpi,1:jpj,1:jpksed,jpsol+jn) , iarroce(1:jpoce), & 
     239         CALL unpack_arr( jpoce, zdta2(1:jpi,1:jpj,1:jpksed) , iarroce(1:jpoce), & 
    269240         &                       pwcp(1:jpoce,1:jpksed,jn  )  ) 
     241         cltra = TRIM(sedtrcd(jpsol+jn)) 
     242         CALL iom_rstput( kt, nitrst, numrsw, TRIM(cltra), zdta2(:,:,:) ) 
    270243      END DO 
    271244      ! pH 
     
    276249      ENDDO 
    277250 
    278       CALL unpack_arr( jpoce, flxsedi3d(1:jpi,1:jpj,1:jpksed,1)  , iarroce(1:jpoce), & 
     251      CALL unpack_arr( jpoce, zdta2(1:jpi,1:jpj,1:jpksed)  , iarroce(1:jpoce), & 
    279252      &                   zdta(1:jpoce,1:jpksed)  ) 
     253      cltra = TRIM(seddia3d(1)) 
     254      CALL iom_rstput( kt, nitrst, numrsw, TRIM(cltra), zdta2(:,:,:) ) 
    280255          
    281       CALL unpack_arr( jpoce, flxsedi3d(1:jpi,1:jpj,1:jpksed,2)  , iarroce(1:jpoce), & 
     256      CALL unpack_arr( jpoce, zdta2(1:jpi,1:jpj,1:jpksed)  , iarroce(1:jpoce), & 
    282257      &                   co3por(1:jpoce,1:jpksed)  ) 
     258      cltra = TRIM(seddia3d(2)) 
     259      CALL iom_rstput( kt, nitrst, numrsw, TRIM(cltra), zdta2(:,:,:) ) 
    283260 
    284261      ! prognostic variables 
    285262      ! -------------------- 
    286263 
    287       DO jn = 1, jptrased 
    288          cltra = TRIM(sedtrcd(jn)) 
    289          CALL iom_rstput( kt, nitrst, numrsw, TRIM(cltra), trcsedi(:,:,:,jn) ) 
    290       ENDDO 
    291  
    292       DO jn = 1, 2 
    293          cltra = TRIM(seddia3d(jn)) 
    294          CALL iom_rstput( kt, nitrst, numrsw, TRIM(cltra), flxsedi3d(:,:,:,jn) ) 
    295       ENDDO 
    296  
    297264      CALL unpack_arr( jpoce, zdta2(1:jpi,1:jpj,1:jpksed)  , iarroce(1:jpoce), & 
    298265      &                   db(1:jpoce,1:jpksed)  ) 
     
    307274      CALL iom_rstput( kt, nitrst, numrsw, TRIM(cltra), zdta2(:,:,:) ) 
    308275 
    309       CALL unpack_arr( jpoce, zdta2(1:jpi,1:jpj,1:jpksed)  , iarroce(1:jpoce), & 
    310       &                   sedligand(1:jpoce,1:jpksed)  ) 
    311  
    312       cltra = "sedligand" 
    313       CALL iom_rstput( kt, nitrst, numrsw, TRIM(cltra), zdta2(:,:,:) ) 
    314  
    315276      IF( kt == nitrst ) THEN 
    316           IF(.NOT.lwxios) THEN 
    317              CALL iom_close( numrsw )     ! close the restart file (only at last time step) 
    318           ELSE 
    319              CALL iom_context_finalize( cw_sedrst_cxt )  
    320              iom_file(numrsw)%nfid       = 0 
    321              numrsw = 0 
    322           ENDIF 
     277          CALL iom_close( numrsw )     ! close the restart file (only at last time step) 
    323278          IF( l_offline .AND. ln_rst_list ) THEN 
    324279             nrst_lst = nrst_lst + 1 
     
    351306      !!       In both those options, the  exact duration of the experiment 
    352307      !!       since the beginning (cumulated duration of all previous restart runs) 
    353       !!       is not stored in the restart and is assumed to be (nittrc000-1)*rn_Dt. 
     308      !!       is not stored in the restart and is assumed to be (nittrc000-1)*rdt. 
    354309      !!       This is valid is the time step has remained constant. 
    355310      !! 
     
    363318      REAL(wp) ::  zkt, zrdttrc1 
    364319      REAL(wp) ::  zndastp 
    365       CHARACTER(len = 82) :: clpname 
    366320 
    367321      ! Time domain : restart 
     
    375329 
    376330         IF( ln_rst_sed ) THEN 
    377             lxios_sini = .FALSE. 
    378331            CALL iom_open( TRIM(cn_sedrst_indir)//'/'//cn_sedrst_in, numrsr ) 
    379  
    380             IF( lrxios) THEN 
    381                 cr_sedrst_cxt = 'sed_rst' 
    382                 IF(lwp) WRITE(numout,*) 'Enable restart reading by XIOS for SED' 
    383 !               IF( TRIM(Agrif_CFixed()) == '0' ) THEN 
    384 !                  clpname = cn_sedrst_in 
    385 !               ELSE 
    386 !                  clpname = TRIM(Agrif_CFixed())//"_"//cn_sedrst_in    
    387 !               ENDIF 
    388                 CALL iom_init( cr_sedrst_cxt, kdid = numrsr, ld_closedef = .TRUE. ) 
    389             ENDIF 
    390332            CALL iom_get ( numrsr, 'kt', zkt )   ! last time-step of previous run 
     333 
    391334            IF(lwp) THEN 
    392335               WRITE(numsed,*) ' *** Info read in restart : ' 
     
    401344            ENDIF 
    402345            ! Control of date  
    403             IF( nittrc000  - NINT( zkt ) /= nn_dtsed .AND.  nn_rstsed /= 0 )                                  & 
     346            IF( nittrc000  - NINT( zkt ) /= 1 .AND.  nn_rstsed /= 0 )                                  & 
    404347               &   CALL ctl_stop( ' ===>>>> : problem with nittrc000 for the restart',                 & 
    405348               &                  ' verify the restart file or rerun with nn_rsttr = 0 (namelist)' ) 
     
    414357             ELSE 
    415358               ndastp = ndate0 - 1     ! ndate0 read in the namelist in dom_nam 
    416                adatrj = ( REAL( nittrc000-1, wp ) * rn_Dt ) / rday 
     359               adatrj = ( REAL( nittrc000-1, wp ) * rdt ) / rday 
    417360               ! note this is wrong if time step has changed during run 
    418361            ENDIF 
     
    435378            IF(lwp) WRITE(numsed,*) 'trc_wri : write the TOP restart file (NetCDF) at it= ', kt, ' date= ', ndastp 
    436379            IF(lwp) WRITE(numsed,*) '~~~~~~~' 
    437             IF( lwxios ) CALL iom_init_closedef(cw_sedrst_cxt) 
    438380         ENDIF 
    439381         CALL iom_rstput( kt, nitrst, numrsw, 'kt'     , REAL( kt    , wp) )   ! time-step 
    440382         CALL iom_rstput( kt, nitrst, numrsw, 'ndastp' , REAL( ndastp, wp) )   ! date 
    441          CALL iom_rstput( kt, nitrst, numrsw, 'adatrj' , adatrj )   ! number of elapsed days since 
    442          !                                                                                      ! the begining of the run [s] 
     383         CALL iom_rstput( kt, nitrst, numrsw, 'adatrj' , adatrj            )   ! number of elapsed days since 
     384         !                                                                     ! the begining of the run [s] 
    443385      ENDIF 
    444386 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedsfc.F90

    r13295 r15075  
    1313   !! * Substitutions 
    1414#  include "do_loop_substitute.h90" 
    15    !! $Id$ 
     15#  include "domzgr_substitute.h90" 
     16 
    1617CONTAINS 
    1718 
     
    2829      !!* Arguments 
    2930      INTEGER, INTENT(in) ::  kt              ! time step 
    30       INTEGER, INTENT(in) ::  Kbb             ! time index 
     31      INTEGER, INTENT(in) ::  Kbb             ! time level indices 
    3132 
    3233      ! * local variables 
     
    4647      CALL unpack_arr ( jpoce, trc_data(1:jpi,1:jpj,7), iarroce(1:jpoce), pwcp(1:jpoce,1,jwnh4) ) 
    4748      CALL unpack_arr ( jpoce, trc_data(1:jpi,1:jpj,8), iarroce(1:jpoce), pwcp(1:jpoce,1,jwfe2) ) 
     49      CALL unpack_arr ( jpoce, trc_data(1:jpi,1:jpj,9), iarroce(1:jpoce), pwcp(1:jpoce,1,jwlgw) ) 
    4850 
    4951 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedsol.F90

    r14385 r15075  
    1010   USE sed_oce 
    1111   USE sedini 
    12    USE seddiff 
     12   USE sedfunc 
    1313   USE seddsr 
    14    USE sedinorg 
     14   USE sedjac 
     15   USE sedbtb 
     16   USE sedco3 
     17   USE sedmat 
     18   USE TROS_F90 
    1519   USE lib_mpp         ! distribued memory computing library 
    1620   USE lib_fortran 
     
    2024 
    2125   PUBLIC sed_sol 
    22  
    23    !! * Module variables 
    2426 
    2527   !! $Id: sedsol.F90 5215 2015-04-15 16:11:56Z nicolasmartin $ 
     
    5355      INTEGER, INTENT(in) ::   kt 
    5456      ! --- local variables 
    55       INTEGER  :: ji, jk, js, jw, jnt   ! dummy looop indices 
    56       REAL(wp) :: zadsnh4 
     57      INTEGER  :: ji, jk, js, jw, jn, neq   ! dummy looop indices 
     58      REAL(wp), DIMENSION( jpvode * jpksed ) :: ZXIN 
     59      REAL(wp), DIMENSION(jpoce,jpksed) :: preac 
     60      INTEGER :: JINDEX, ITOL, IJAC, MLJAC, IMAX 
     61      INTEGER :: MUJAC,LE1, LJAC, LIWORK, LWORK 
     62      INTEGER :: IDID, NMAXSTP, ROSM 
     63      REAL(wp) :: X, XEND, H, STEPMIN 
     64      REAL(wp), DIMENSION(1) :: RTOL, ATOL 
     65      REAL(wp), POINTER :: WORK(:) 
     66      INTEGER , POINTER :: IWORK(:) 
     67      INTEGER, DIMENSION(3)   :: ISTAT 
     68      REAL(wp), DIMENSION(2)   :: RSTAT 
    5769      !! 
    5870      !!---------------------------------------------------------------------- 
     
    6779!         !  
    6880         dens_mol_wgt(1:jpsol) = denssol / mol_wgt(1:jpsol) 
     81         stepros(:) = dtsed 
    6982         !  
    7083      ENDIF 
    71  
    72       dtsed2 = dtsed / REAL( nrseddt, wp ) 
    7384 
    7485      ! 1. Change of geometry 
     
    8697      ! 2. Change of previous solid fractions (due to volum changes) for k=2 
    8798      !--------------------------------------------------------------------- 
    88  
    89       DO js = 1, jpsol 
    90          DO ji = 1, jpoce 
    91             solcp(ji,2,js) = solcp(ji,2,js) * dz(2) / dz3d(ji,2) 
    92          ENDDO 
     99      DO js = 1, jpsol 
     100         solcp(:,2,js) = solcp(:,2,js) * dz(2) / dz3d(:,2) 
    93101      END DO 
    94102 
     
    114122      !------------------------------------------------------------- 
    115123      DO jw = 1, jpwat 
    116          DO ji = 1, jpoce 
    117             pwcp(ji,1,jw) = pwcp(ji,1,jw) - & 
    118                &            pwcp(ji,2,jw) * dzdep(ji) * por(2) / ( dzkbot(ji) + rtrn ) 
    119          END DO 
    120       ENDDO 
    121  
    122       zadsnh4 = 1.0 / ( 1.0 + adsnh4 ) 
     124         pwcp(:,1,jw) = pwcp(:,1,jw) - pwcp(:,2,jw) * dzdep(:) * por(2) / dzkbot(:) 
     125      ENDDO 
    123126 
    124127      ! -------------------------------------------------- 
    125128      ! Computation of the diffusivities 
    126129      ! -------------------------------------------------- 
    127  
    128130      DO js = 1, jpwat 
    129131         DO jk = 1, jpksed 
    130             DO ji = 1, jpoce 
    131                diff(ji,jk,js) = ( diff1(js) + diff2(js) * temp(ji) ) / ( 1.0 - 2.0 * log( por(jk) ) ) 
    132             END DO 
     132            diff(:,jk,js) = ( diff1(js) + diff2(js) * temp(:) ) / ( 1.0 - 2.0 * log( por(jk) ) ) 
    133133         END DO 
    134134      END DO 
     
    136136      ! Impact of bioirrigation and adsorption on diffusion 
    137137      ! --------------------------------------------------- 
    138  
    139       diff(:,:,jwnh4) = diff(:,:,jwnh4) * ( 1.0 + irrig(:,:) ) * zadsnh4 
    140138      diff(:,:,jwsil) = diff(:,:,jwsil) * ( 1.0 + irrig(:,:) ) 
    141139      diff(:,:,jwoxy) = diff(:,:,jwoxy) * ( 1.0 + irrig(:,:) ) 
     
    146144      diff(:,:,jwh2s) = diff(:,:,jwh2s) * ( 1.0 + irrig(:,:) ) 
    147145      diff(:,:,jwso4) = diff(:,:,jwso4) * ( 1.0 + irrig(:,:) ) 
    148       diff(:,:,jwfe2) = diff(:,:,jwfe2) * ( 1.0 + 0.2 * irrig(:,:) ) 
    149  
    150       DO jnt = 1, nrseddt 
    151          CALL sed_diff( kt, jnt )         ! 1st pass in diffusion to get values at t+1/2 
    152          CALL sed_dsr  ( kt, jnt )        ! Redox reactions 
    153          CALL sed_inorg( kt, jnt )        ! Inorganic reactions (dissolution) 
    154          CALL sed_diff ( kt, jnt )        ! 2nd pass in diffusion to get values at t+1 
    155       END DO 
     146      diff(:,:,jwlgw) = diff(:,:,jwlgw) * ( 1.0 + irrig(:,:) ) 
     147      DO jk = 1, jpksed 
     148         diff(:,jk,jwfe2) = diff(:,jk,jwfe2) * ( 1.0 + 0.1 * irrig(:,jk) ) * radsfe2(jk) 
     149         diff(:,jk,jwnh4) = diff(:,jk,jwnh4) * ( 1.0 + irrig(:,jk) ) * radsnh4(jk) 
     150      END DO 
     151 
     152      ! Conversion of volume units 
     153      !---------------------------- 
     154      DO js = 1, jpsol 
     155         DO jk = 1, jpksed 
     156            volc(:,jk,js) = ( vols3d(:,jk) * dens_mol_wgt(js) ) /  & 
     157            &                 ( volw3d(:,jk) * 1.e-3 ) 
     158         ENDDO 
     159      ENDDO 
     160 
     161      ! Apply bioturbation and compute the impact of the slow SMS on species 
     162      CALL sed_btb( kt ) 
     163      ! Recompute pH after bioturbation and slow chemistry 
     164      CALL sed_co3( kt ) 
     165 
     166      ! The following part deals with the stiff ODEs 
     167      ! This is the expensive part of the code and should be carefully 
     168      ! chosen. We use the DVODE solver after many trials to find a cheap  
     169      ! way to solve the ODEs. This is not necessarily the most efficient  
     170      ! but this is the one that was not too much of a pain to code and that 
     171      ! was the most precise and quick. 
     172      ! The ones I tried : operator splitting (Strang), hybrid spectral methods 
     173      ! Brent, Powell's hybrid method, ... 
     174      ! --------------------------------------------------------------------- 
     175      ROSM = 2 
     176      NEQ  = jpvode * jpksed 
     177      XEND = dtsed  
     178      RTOL = 0.005 
     179      ATOL = 0.005 
     180      ITOL = 0 
     181      IJAC = 1 
     182      MLJAC = jpvode 
     183      MUJAC = jpvode 
     184      LE1  = 2*MLJAC+MUJAC+1 
     185      LJAC = MLJAC+MUJAC+1 
     186      LIWORK = NEQ + 2 
     187      LWORK = NEQ*(LJAC+LE1+8) + 5 
     188      ALLOCATE(WORK(LWORK), IWORK(LIWORK) ) 
     189      NMAXSTP = 0 
     190      STEPMIN = dtsed 
     191 
     192      DO ji = 1, jpoce 
     193         X    = 0.0 
     194         H    = stepros(ji) 
     195         WORK  = 0. 
     196         IWORK = 0 
     197         IWORK(2) = 6 
     198 
     199         ! Put all the species in one local array (nb of tracers * vertical 
     200         ! dimension 
     201         jindex = ji 
     202         DO jn = 1, NEQ 
     203            jk = jarr(jn,1) 
     204            js = jarr(jn,2) 
     205            IF (js <= jpwat) THEN 
     206               zxin(jn) = pwcp(ji,jk,js) * 1E6 
     207            ELSE 
     208               zxin(jn) = solcp(ji,jk,js-jpwat) * 1E6 
     209            ENDIF 
     210         END DO 
     211 
     212         ! Set options for VODE : banded matrix. SParse option is much more 
     213         ! expensive except if one computes the sparse Jacobian explicitly 
     214         ! To speed up the computation, one way is to reduce ATOL and RTOL 
     215         ! which may be a good option at the beginning of the simulations  
     216         ! during the spin up 
     217         ! ---------------------------------------------------------------- 
     218          CALL ROSK(ROSM, NEQ,JINDEX,X,zxin,XEND,H,  & 
     219          RTOL,ATOL,ITOL, sed_jac,IJAC,MLJAC,MUJAC,  & 
     220          WORK,LWORK,IWORK,LIWORK,IDID,ISTAT,RSTAT) 
     221 
     222         DO jn = 1, NEQ 
     223            jk = jarr(jn,1) 
     224            js = jarr(jn,2) 
     225            IF (js <= jpwat) THEN 
     226               pwcp(ji,jk,js) = zxin(jn) * 1E-6 
     227            ELSE 
     228               solcp(ji,jk,js-jpwat) = zxin(jn) * 1E-6 
     229            ENDIF 
     230         END DO 
     231         NMAXSTP = MAX(NMAXSTP,ISTAT(3)) 
     232         STEPMIN = MIN(STEPMIN, RSTAT(1) ) 
     233         stepros(ji) = RSTAT(1) 
     234      END DO 
     235 
     236      DEALLOCATE(WORK, IWORK) 
     237 
     238      preac(:,:) = 0. 
     239      CALL sed_mat_dsri( jwalk, preac, pwcpa(:,:,jwalk), dtsed ) 
     240      CALL sed_mat_dsri( jwpo4, preac, pwcpa(:,:,jwpo4), dtsed ) 
    156241 
    157242      !---------------------------------- 
     
    164249      !-------------------------------------------------------------------- 
    165250      DO jw = 1, jpwat 
    166          DO ji = 1, jpoce 
    167             pwcp(ji,1,jw) = pwcp(ji,1,jw) + & 
    168                &            pwcp(ji,2,jw) * dzdep(ji) * por(2) / dzkbot(ji) 
    169          END DO 
     251         pwcp(:,1,jw) = pwcp(:,1,jw) + pwcp(:,2,jw) * dzdep(:) * por(2) / dzkbot(:) 
    170252      ENDDO 
    171253 
     
    178260      !------------------------------------------------------------------------ 
    179261      DO js = 1, jpsol 
    180          DO ji = 1, jpoce 
    181             rainrg(ji,js) = raintg(ji) * solcp(ji,2,js) 
    182             rainrm(ji,js) = rainrg(ji,js) / mol_wgt(js) 
    183          END DO 
     262         rainrg(:,js) = raintg(:) * solcp(:,2,js) 
     263         rainrm(:,js) = rainrg(:,js) / mol_wgt(js) 
    184264      ENDDO 
    185265 
     
    187267      raintg(:) = 0. 
    188268      DO js = 1, jpsol 
    189          DO ji = 1, jpoce 
    190             raintg(ji) = raintg(ji) + rainrg(ji,js) 
    191          END DO 
     269         raintg(:) = raintg(:) + rainrg(:,js) 
    192270      ENDDO 
    193271 
     
    195273      !    3/ back to initial geometry 
    196274      !-------------------------------- 
    197       DO ji = 1, jpoce 
    198          dz3d  (ji,2) = dz(2) 
    199          volw3d(ji,2) = dz3d(ji,2) * por(2) 
    200          vols3d(ji,2) = dz3d(ji,2) * por1(2) 
    201       ENDDO 
     275      dz3d  (:,2) = dz(2) 
     276      volw3d(:,2) = dz3d(:,2) * por(2) 
     277      vols3d(:,2) = dz3d(:,2) * por1(2) 
    202278 
    203279      IF( ln_timing )  CALL timing_stop('sed_sol') 
     
    205281   END SUBROUTINE sed_sol 
    206282 
     283   SUBROUTINE JACFAC 
     284   
     285   END SUBROUTINE JACFAC 
     286 
    207287END MODULE sedsol 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedstp.F90

    r14385 r15075  
    99   USE sedco3   ! carbonate in sediment pore water 
    1010   USE sedsol   ! Organic reactions and diffusion 
    11    USE sedbtb   ! bioturbation 
    1211   USE sedadv   ! vertical advection 
    1312   USE sedsfc   ! sediment surface data 
    1413   USE sedrst   ! restart 
    1514   USE sedwri   ! outputs 
     15   USE sedini 
    1616   USE trcdmp_sed 
    1717   USE lib_mpp         ! distribued memory computing library 
     
    2323   !! * Routine accessibility 
    2424   PUBLIC sed_stp  ! called by step.F90 
     25 
     26   !! * Substitutions 
     27#  include "do_loop_substitute.h90" 
     28#  include "domzgr_substitute.h90" 
    2529 
    2630   !! $Id$ 
     
    4246      !!        !  06-04 (C. Ethe)  Re-organization 
    4347      !!---------------------------------------------------------------------- 
    44       INTEGER, INTENT(in) ::   kt                ! number of iteration 
    45       INTEGER, INTENT(in) ::   Kbb, Kmm, Krhs    ! time level indices 
     48      INTEGER, INTENT(in) ::   kt       ! number of iteration 
     49      INTEGER, INTENT(in) ::   Kbb, Kmm, Krhs  ! time level indices 
     50 
     51      INTEGER :: ji,jk,js,jn,jw,jkmax,jsmax 
    4652      !!---------------------------------------------------------------------- 
    4753      IF( ln_timing )           CALL timing_start('sed_stp') 
     
    5359 
    5460      dtsed  = rDt_trc 
    55 !      dtsed2 = dtsed 
    5661      IF (kt /= nitsed000) THEN 
    57          CALL sed_dta( kt, Kbb, Kmm )       ! Load  Data for bot. wat. Chem and fluxes 
     62         CALL sed_dta( kt, Kbb, Kmm )    ! Load  Data for bot. wat. Chem and fluxes 
    5863      ENDIF 
    5964 
     
    6368         ENDIF 
    6469 
    65          CALL sed_btb( kt )        ! 1st pass of bioturbation at t+1/2 
    6670         CALL sed_sol( kt )        ! Solute diffusion and reactions  
    67          CALL sed_btb( kt )        ! 2nd pass of bioturbation at t+1 
    6871         CALL sed_adv( kt )         ! advection 
    6972         CALL sed_co3( kt )         ! pH actualization for saving 
    70          IF (ln_sed_2way) CALL sed_sfc( kt, Kbb )         ! Give back new bottom wat chem to tracer model 
     73 
     74         IF (ln_sed_2way) CALL sed_sfc( kt, Kbb )   ! Give back new bottom wat chem to tracer model 
    7175      ENDIF 
    7276      CALL sed_wri( kt )         ! outputs 
    7377      IF( kt == nitsed000 ) THEN 
    7478          CALL iom_close( numrsr )       ! close input tracer restart file 
    75           IF(lrxios) CALL iom_context_finalize(      cr_sedrst_cxt  ) 
    76 !         IF(lwm) CALL FLUSH( numont )   ! flush namelist output 
     79!          IF(lwm) CALL FLUSH( numont )   ! flush namelist output 
    7780      ENDIF 
    7881      IF( lrst_sed )            CALL sed_rst_wri( kt )   ! restart file output 
    7982 
    80       IF( kt == nitsedend )  CLOSE( numsed ) 
     83      IF( kt == nitsedend )     CLOSE( numsed ) 
    8184 
    82       IF( ln_timing )   CALL timing_stop('sed_stp') 
     85      IF( ln_timing )           CALL timing_stop('sed_stp') 
    8386 
    8487   END SUBROUTINE sed_stp 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/SED/sedwri.F90

    r14385 r15075  
    44   !!         Sediment diagnostics :  write sediment output files 
    55   !!====================================================================== 
    6    USE par_sed 
    76   USE sed 
    87   USE sedarr 
    98   USE lib_mpp         ! distribued memory computing library 
    109   USE iom 
     10   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    1111 
    1212   IMPLICIT NONE 
     
    3838      CHARACTER(len = 20)  ::  cltra  
    3939      REAL(wp)  :: zrate 
    40       REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zdta, zflx 
     40      REAL(wp), DIMENSION(jpoce, jpksed)     :: zdta 
     41      REAL(wp), DIMENSION(jpoce, jptrased+1) :: zflx 
     42      REAL(wp), DIMENSION(jpi, jpj, jpksed, jptrased)   :: trcsedi 
     43      REAL(wp), DIMENSION(jpi, jpj, jpksed, jpdia3dsed) :: flxsedi3d 
     44      REAL(wp), DIMENSION(jpi, jpj, jpdia2dsed) :: flxsedi2d 
    4145 
    4246      !!------------------------------------------------------------------- 
     
    5458      IF (lwp) WRITE(numsed,*) ' ' 
    5559       
    56       ALLOCATE( zdta(jpoce,jpksed) )    ;   ALLOCATE( zflx(jpoce,jptrased+1) ) 
    57  
    5860      ! Initialize variables 
    5961      ! -------------------- 
     
    9092 
    9193      CALL unpack_arr( jpoce, flxsedi3d(1:jpi,1:jpj,1:jpksed,3)  , iarroce(1:jpoce), & 
    92          &                   sedligand(1:jpoce,1:jpksed)  ) 
    93  
    94       CALL unpack_arr( jpoce, flxsedi3d(1:jpi,1:jpj,1:jpksed,4)  , iarroce(1:jpoce), & 
    9594         &                   saturco3(1:jpoce,1:jpksed)  ) 
    9695 
     
    129128      CALL unpack_arr( jpoce, flxsedi2d(1:jpi,1:jpj,jpdia2dsed), iarroce(1:jpoce), zflx(1:jpoce,1) ) 
    130129 
     130      ! 
     131      CALL lbc_lnk( 'sedwri', trcsedi(:,:,:,:), 'T', 1._wp ) 
     132      CALL lbc_lnk( 'sedwri', flxsedi3d(:,:,:,:), 'T', 1._wp ) 
     133      CALL lbc_lnk( 'sedwri', flxsedi2d(:,:,:), 'T', 1._wp ) 
     134 
    131135      ! Start writing data 
    132136      ! --------------------- 
     
    146150      END DO 
    147151 
    148  
    149       DEALLOCATE( zdta )    ;   DEALLOCATE( zflx ) 
    150  
    151152      IF( ln_timing )  CALL timing_stop('sed_wri') 
    152153 
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/trcini_pisces.F90

    r14786 r15075  
    293293      ! Initialization of the sediment model 
    294294      IF( ln_sediment)   & 
    295         & CALL sed_init ! Initialization of the sediment model  
     295        & CALL sed_ini          ! Initialization of the sediment model  
    296296 
    297297      CALL p4z_sed_init          ! loss of organic matter in the sediments  
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/trcstp.F90

    r14086 r15075  
    102102      CALL trc_wri      ( kt,      Kmm            )       ! output of passive tracers with iom I/O manager 
    103103      CALL trc_sms      ( kt, Kbb, Kmm, Krhs      )       ! tracers: sinks and sources 
     104#if ! defined key_sed_off 
    104105      CALL trc_trp      ( kt, Kbb, Kmm, Krhs, Kaa )       ! transport of passive tracers 
     106#endif 
    105107           ! 
    106108           ! Note passive tracers have been time-filtered in trc_trp but the time level 
Note: See TracChangeset for help on using the changeset viewer.