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 6453 for branches/CNRS/dev_r6270_PISCES_QUOTA/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zflx.F90 – NEMO

Ignore:
Timestamp:
2016-04-08T10:10:11+02:00 (8 years ago)
Author:
aumont
Message:

New developments of PISCES (QUOTA, ligands, lability, ...)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/CNRS/dev_r6270_PISCES_QUOTA/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zflx.F90

    r6204 r6453  
    1010   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90 
    1111   !!                  !  2011-02  (J. Simeon, J. Orr) Include total atm P correction  
    12    !!---------------------------------------------------------------------- 
    13 #if defined key_pisces 
    14    !!---------------------------------------------------------------------- 
    15    !!   'key_pisces'                                       PISCES bio-model 
     12   !!             3.6  !  2015-05  (O. Aumont) PISCES quota 
     13   !!---------------------------------------------------------------------- 
     14#if defined key_pisces || defined key_pisces_quota 
     15   !!---------------------------------------------------------------------- 
     16   !!   'key_pisces*'                                      PISCES bio-model 
    1617   !!---------------------------------------------------------------------- 
    1718   !!   p4z_flx       :   CALCULATES GAS EXCHANGE AND CHEMISTRY AT SEA SURFACE 
     
    5253   REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:)  ::  patm      ! atmospheric pressure at kt                 [N/m2] 
    5354   TYPE(FLD), ALLOCATABLE,       DIMENSION(:)    ::  sf_patm   ! structure of input fields (file informations, fields read) 
    54  
     55   LOGICAL, PUBLIC ::   ln_presatmco2  !: accounting for spatial atm CO2 in the compuation of carbon flux (T) or not (F) 
     56   TYPE(FLD), ALLOCATABLE,       DIMENSION(:)    ::  sf_atmco2   ! structure of input fields (file informations, fields read) 
    5557 
    5658   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: oce_co2   !: ocean carbon flux  
     
    8486      ! 
    8587      INTEGER  ::   ji, jj, jm, iind, iindm1 
    86       REAL(wp) ::   ztc, ztc2, ztc3, zws, zkgwan 
     88      REAL(wp) ::   ztc, ztc2, ztc3, ztc4, zws, zkgwan 
    8789      REAL(wp) ::   zfld, zflu, zfld16, zflu16, zfact 
    88       REAL(wp) ::   zph, zah2, zbot, zdic, zalk, zsch_o2, zalka, zsch_co2 
     90      REAL(wp) ::   zvapsw, zsal, zfco2, zxc2, xCO2approx, ztkel, zfugcoeff 
     91      REAL(wp) ::   zph, zdic, zsch_o2, zsch_co2 
    8992      REAL(wp) ::   zyr_dec, zdco2dt 
    9093      CHARACTER (len=25) :: charout 
    91       REAL(wp), POINTER, DIMENSION(:,:) :: zkgco2, zkgo2, zh2co3, zoflx, zw2d  
     94      REAL(wp), POINTER, DIMENSION(:,:) :: zkgco2, zkgo2, zh2co3, zoflx, zw2d 
    9295      !!--------------------------------------------------------------------- 
    9396      ! 
     
    103106      IF( kt /= nit000 .AND. knt == 1 ) CALL p4z_patm( kt )    ! Get sea-level pressure (E&K [1981] climatology) for use in flux calcs 
    104107 
    105       IF( ln_co2int ) THEN  
     108      IF( ln_co2int .AND. .NOT.ln_presatmco2 ) THEN 
    106109         ! Linear temporal interpolation  of atmospheric pco2.  atcco2.txt has annual values. 
    107110         ! Caveats: First column of .txt must be in years, decimal  years preferably.  
     
    121124#endif 
    122125 
    123       DO jm = 1, 10 
    124 !CDIR NOVERRCHK 
    125          DO jj = 1, jpj 
    126 !CDIR NOVERRCHK 
    127             DO ji = 1, jpi 
    128  
    129                ! DUMMY VARIABLES FOR DIC, H+, AND BORATE 
    130                zbot  = borat(ji,jj,1) 
    131                zfact = rhop(ji,jj,1) / 1000. + rtrn 
    132                zdic  = trb(ji,jj,1,jpdic) / zfact 
    133                zph   = MAX( hi(ji,jj,1), 1.e-10 ) / zfact 
    134                zalka = trb(ji,jj,1,jptal) / zfact 
    135  
    136                ! CALCULATE [ALK]([CO3--], [HCO3-]) 
    137                zalk  = zalka - (  akw3(ji,jj,1) / zph - zph + zbot / ( 1.+ zph / akb3(ji,jj,1) )  ) 
    138  
    139                ! CALCULATE [H+] AND [H2CO3] 
    140                zah2   = SQRT(  (zdic-zalk)**2 + 4.* ( zalk * ak23(ji,jj,1)   & 
    141                   &                                        / ak13(ji,jj,1) ) * ( 2.* zdic - zalk )  ) 
    142                zah2   = 0.5 * ak13(ji,jj,1) / zalk * ( ( zdic - zalk ) + zah2 ) 
    143                zh2co3(ji,jj) = ( 2.* zdic - zalk ) / ( 2.+ ak13(ji,jj,1) / zah2 ) * zfact 
    144                hi(ji,jj,1)   = zah2 * zfact 
    145             END DO 
     126      DO jj = 1, jpj 
     127         DO ji = 1, jpi 
     128            ! DUMMY VARIABLES FOR DIC, H+, AND BORATE 
     129            zfact = rhop(ji,jj,1) / 1000. + rtrn 
     130            zdic  = trb(ji,jj,1,jpdic) / zfact 
     131            zph   = MAX( hi(ji,jj,1), 1.e-10 ) / zfact 
     132            ! CALCULATE [H2CO3] 
     133            zh2co3(ji,jj) = zdic/(1. + ak13(ji,jj,1)/zph + ak13(ji,jj,1)*ak23(ji,jj,1)/zph**2)*zfact 
    146134         END DO 
    147135      END DO 
    148  
    149136 
    150137      ! -------------- 
     
    162149            ztc2 = ztc * ztc 
    163150            ztc3 = ztc * ztc2  
     151            ztc4 = ztc2 * ztc2 
    164152            ! Compute the schmidt Number both O2 and CO2 
    165             zsch_co2 = 2073.1 - 125.62 * ztc + 3.6276 * ztc2 - 0.043126 * ztc3 
    166             zsch_o2  = 1953.4 - 128.0  * ztc + 3.9918 * ztc2 - 0.050091 * ztc3 
     153            zsch_co2 = 2116.8 - 136.25 * ztc + 4.7353 * ztc2 - 0.092307 * ztc3 + 0.0007555 * ztc4 
     154            zsch_o2  = 1920.4 - 135.6  * ztc + 5.2122 * ztc2 - 0.109390 * ztc3 + 0.0009377 * ztc4 
    167155            !  wind speed  
    168156            zws  = wndm(ji,jj) * wndm(ji,jj) 
    169157            ! Compute the piston velocity for O2 and CO2 
    170             zkgwan = 0.3 * zws  + 2.5 * ( 0.5246 + 0.016256 * ztc + 0.00049946  * ztc2 ) 
     158            zkgwan = 0.251 * zws 
    171159            zkgwan = zkgwan * xconv * ( 1.- fr_i(ji,jj) ) * tmask(ji,jj,1) 
    172160# if defined key_degrad 
     
    181169      DO jj = 1, jpj 
    182170         DO ji = 1, jpi 
     171            ztkel = tsn(ji,jj,1,jp_tem) + 273.15 
     172            zsal  = tsn(ji,jj,1,jp_sal) + ( 1.- tmask(ji,jj,1) ) * 35. 
     173            zvapsw = exp(24.4543 - 67.4509*(100.0/ztkel) - 4.8489*log(ztkel/100) - 0.000544*zsal) 
     174            xCO2approx = satmco2(ji,jj) * ( patm(ji,jj) - zvapsw ) * 1.E-6 
     175            zxc2 = (1.0 - xCO2approx)**2 
     176            zfugcoeff = exp(patm(ji,jj) * (chemc(ji,jj,2) + 2.0 * zxc2 * chemc(ji,jj,3) )   & 
     177            &           / (82.05736 * ztkel)) 
     178            zfco2 = satmco2(ji,jj) * ( patm(ji,jj) - zvapsw ) * zfugcoeff 
    183179            ! Compute CO2 flux for the sea and air 
    184             zfld = satmco2(ji,jj) * patm(ji,jj) * tmask(ji,jj,1) * chemc(ji,jj,1) * zkgco2(ji,jj)   ! (mol/L) * (m/s) 
     180            zfld = zfco2 * tmask(ji,jj,1) * chemc(ji,jj,1) * zkgco2(ji,jj)   ! (mol/L) * (m/s) 
    185181            zflu = zh2co3(ji,jj) * tmask(ji,jj,1) * zkgco2(ji,jj)                                   ! (mol/L) (m/s) ? 
    186182            oce_co2(ji,jj) = ( zfld - zflu ) * rfact2 * e1e2t(ji,jj) * tmask(ji,jj,1) * 1000. 
    187183            ! compute the trend 
    188184            tra(ji,jj,1,jpdic) = tra(ji,jj,1,jpdic) + ( zfld - zflu ) * rfact2 / fse3t(ji,jj,1) 
    189  
    190185            ! Compute O2 flux  
    191             zfld16 = atcox * patm(ji,jj) * chemc(ji,jj,2) * tmask(ji,jj,1) * zkgo2(ji,jj)          ! (mol/L) * (m/s) 
     186            zfld16 = patm(ji,jj) * chemo2(ji,jj,1) * tmask(ji,jj,1) * zkgo2(ji,jj)          ! (mol/L) * (m/s) 
    192187            zflu16 = trb(ji,jj,1,jpoxy) * tmask(ji,jj,1) * zkgo2(ji,jj) 
    193188            zoflx(ji,jj) = zfld16 - zflu16 
     
    198193      t_oce_co2_flx     = glob_sum( oce_co2(:,:) )                    !  Total Flux of Carbon 
    199194      t_oce_co2_flx_cum = t_oce_co2_flx_cum + t_oce_co2_flx       !  Cumulative Total Flux of Carbon 
    200 !      t_atm_co2_flx     = glob_sum( satmco2(:,:) * e1e2t(:,:) )       ! Total atmospheric pCO2 
    201       t_atm_co2_flx     =  atcco2      ! Total atmospheric pCO2 
    202   
     195      t_atm_co2_flx = glob_sum( satmco2(:,:) * e1e2t(:,:) )         ! Total atmospheric pCO2 
     196 
    203197      IF(ln_ctl)   THEN  ! print mean trends (used for debugging) 
    204198         WRITE(charout, FMT="('flx ')") 
     
    208202 
    209203      IF( lk_iomput .AND. knt == nrdttrc ) THEN 
    210          CALL wrk_alloc( jpi, jpj, zw2d )   
     204         CALL wrk_alloc( jpi, jpj, zw2d ) 
    211205         IF( iom_use( "Cflx"  ) )  THEN 
    212206            zw2d(:,:) = oce_co2(:,:) / e1e2t(:,:) * rfact2r 
    213             CALL iom_put( "Cflx"     , zw2d )  
     207            CALL iom_put( "Cflx"     , zw2d ) 
    214208         ENDIF 
    215209         IF( iom_use( "Oflx"  ) )  THEN 
     
    222216         ENDIF 
    223217         IF( iom_use( "Dpco2" ) ) THEN 
    224            zw2d(:,:) = ( satmco2(:,:) * patm(:,:) - zh2co3(:,:) / ( chemc(:,:,1) + rtrn ) ) * tmask(:,:,1) 
     218           zw2d(:,:) = oce_co2(:,:) / e1e2t(:,:) / 1000. * rfact2r * tmask(:,:,1) / ( zkgco2(:,:) * chemc(:,:,1) + rtrn ) 
    225219           CALL iom_put( "Dpco2" ,  zw2d ) 
    226220         ENDIF 
    227221         IF( iom_use( "Dpo2" ) )  THEN 
    228            zw2d(:,:) = ( atcox * patm(:,:) - trb(:,:,1,jpoxy) / ( chemc(:,:,2) + rtrn ) ) * tmask(:,:,1) 
     222           zw2d(:,:) = ( patm(:,:) - trb(:,:,1,jpoxy) / ( chemo2(:,:,1) + rtrn ) ) * atcox * tmask(:,:,1) 
    229223           CALL iom_put( "Dpo2"  , zw2d ) 
    230224         ENDIF 
     
    235229      ELSE 
    236230         IF( ln_diatrc ) THEN 
    237             trc2d(:,:,jp_pcs0_2d    ) = oce_co2(:,:) / e1e2t(:,:) * rfact2r  
     231            trc2d(:,:,jp_pcs0_2d    ) = oce_co2(:,:) / e1e2t(:,:) * rfact2r 
     232            trc2d(:,:,jp_pcs0_2d + 1) = zoflx(:,:) * 1000 * tmask(:,:,1) 
     233            trc2d(:,:,jp_pcs0_2d + 2) = zkgco2(:,:) * tmask(:,:,1) 
     234            trc2d(:,:,jp_pcs0_2d + 3) = ( satmco2(:,:) * patm(:,:) - zh2co3(:,:) / ( chemc(:,:,1) + rtrn ) ) * tmask(:,:,1) 
     235         ENDIF 
     236      ENDIF 
     237 
     238      IF( ln_diatrc ) THEN 
     239         IF( lk_iomput .AND. knt == nrdttrc ) THEN 
     240            CALL iom_put( "Cflx" , oce_co2(:,:) / e1e2t(:,:) / rfact )  
     241            CALL iom_put( "Oflx" , zoflx(:,:) * 1000 * tmask(:,:,1)  ) 
     242            CALL iom_put( "Kg"   , zkgco2(:,:) * tmask(:,:,1) ) 
     243            CALL iom_put( "Dpco2", ( satmco2(:,:) * patm(:,:) - zh2co3(:,:) / ( chemc(:,:,1) + rtrn ) ) * tmask(:,:,1) ) 
     244            CALL iom_put( "Dpo2" , ( atcox * patm(:,:) - trb(:,:,1,jpoxy) * atcox / ( chemo2(:,:,1) + rtrn ) ) * tmask(:,:,1) ) 
     245         ELSE 
     246            trc2d(:,:,jp_pcs0_2d    ) = oce_co2(:,:) / e1e2t(:,:) / rfact  
    238247            trc2d(:,:,jp_pcs0_2d + 1) = zoflx(:,:) * 1000 * tmask(:,:,1)  
    239248            trc2d(:,:,jp_pcs0_2d + 2) = zkgco2(:,:) * tmask(:,:,1)  
     
    281290         WRITE(numout,*) ' ' 
    282291      ENDIF 
    283       IF( .NOT.ln_co2int ) THEN 
     292      IF( .NOT.ln_co2int .AND. .NOT.ln_presatmco2 ) THEN 
    284293         IF(lwp) THEN                         ! control print 
    285294            WRITE(numout,*) '    Constant Atmospheric pCO2 value  atcco2    =', atcco2 
     
    287296         ENDIF 
    288297         satmco2(:,:)  = atcco2      ! Initialisation of atmospheric pco2 
    289       ELSE 
     298      ELSEIF(ln_co2int .AND. .NOT.ln_presatmco2) THEN 
    290299         IF(lwp)  THEN 
    291300            WRITE(numout,*) '    Atmospheric pCO2 value  from file clname      =', TRIM( clname ) 
     
    309318         END DO 
    310319         CLOSE(numco2) 
     320      ELSEIF(.NOT.ln_co2int .AND. ln_presatmco2) THEN 
     321         IF(lwp)  THEN 
     322            WRITE(numout,*) '    Spatialized Atmospheric pCO2 from an external file' 
     323            WRITE(numout,*) ' ' 
     324         ENDIF 
     325      ELSE 
     326         IF(lwp)  THEN 
     327            WRITE(numout,*) '    Spatialized Atmospheric pCO2 from an external file' 
     328            WRITE(numout,*) ' ' 
     329         ENDIF 
    311330      ENDIF 
    312331      ! 
    313332      oce_co2(:,:)  = 0._wp                ! Initialization of Flux of Carbon 
     333      t_atm_co2_flx = 0._wp 
    314334      t_oce_co2_flx = 0._wp 
    315       t_atm_co2_flx = 0._wp 
    316335      ! 
    317336      CALL p4z_patm( nit000 ) 
     
    335354      CHARACTER(len=100) ::  cn_dir   ! Root directory for location of ssr files 
    336355      TYPE(FLD_N)        ::  sn_patm  ! informations about the fields to be read 
    337       !! 
    338       NAMELIST/nampisatm/ ln_presatm, sn_patm, cn_dir 
    339  
     356      TYPE(FLD_N)        ::  sn_atmco2 ! informations about the fields to be read 
     357      !! 
     358      NAMELIST/nampisatm/ ln_presatm, ln_presatmco2, sn_patm, sn_atmco2, cn_dir 
    340359      !                                         ! ----------------------- ! 
    341360      IF( kt == nit000 ) THEN                   ! First call kt=nittrc000 ! 
     
    355374            WRITE(numout,*) '   Namelist nampisatm : Atmospheric Pressure as external forcing' 
    356375            WRITE(numout,*) '      constant atmopsheric pressure (F) or from a file (T)  ln_presatm = ', ln_presatm 
     376            WRITE(numout,*) '      spatial atmopsheric CO2 for flux calcs  ln_presatmco2 = ', ln_presatmco2 
    357377            WRITE(numout,*) 
    358378         ENDIF 
     
    367387         ENDIF 
    368388         !                                          
    369          IF( .NOT.ln_presatm )   patm(:,:) = 1.e0    ! Initialize patm if no reading from a file 
     389         IF( ln_presatmco2 ) THEN 
     390            ALLOCATE( sf_atmco2(1), STAT=ierr )           !* allocate and fill sf_atmco2 (forcing structure) with sn_atmco2 
     391            IF( ierr > 0 )   CALL ctl_stop( 'STOP', 'p4z_flx: unable to allocate sf_atmco2 structure' ) 
     392            ! 
     393            CALL fld_fill( sf_atmco2, (/ sn_atmco2 /), cn_dir, 'p4z_flx', 'Atmospheric co2 partial pressure ', 'nampisatm' ) 
     394                                   ALLOCATE( sf_atmco2(1)%fnow(jpi,jpj,1)   ) 
     395            IF( sn_atmco2%ln_tint )  ALLOCATE( sf_atmco2(1)%fdta(jpi,jpj,1,2) ) 
     396         ENDIF 
    370397         ! 
    371398      ENDIF 
     
    374401         CALL fld_read( kt, 1, sf_patm )               !* input Patm provided at kt + 1/2 
    375402         patm(:,:) = sf_patm(1)%fnow(:,:,1)                        ! atmospheric pressure 
     403      ELSE 
     404         patm(:,:) = 1.e0    ! Initialize patm if no reading from a file 
     405      ENDIF 
     406      ! 
     407      IF( ln_presatmco2 ) THEN 
     408         CALL fld_read( kt, 1, sf_atmco2 )               !* input atmco2 provided at kt + 1/2 
     409         satmco2(:,:) = sf_atmco2(1)%fnow(:,:,1)                        ! atmospheric pressure 
     410      ELSE 
     411         satmco2(:,:) = atcco2    ! Initialize atmco2 if no reading from a file 
     412      ENDIF 
     413      ! 
     414      IF(lwp) THEN                                 !* control print 
     415         WRITE(numout,*) ' Min-Max atmospheric CO2 = ', MINVAL(satmco2(:,:)),MAXVAL(satmco2(:,:)) 
    376416      ENDIF 
    377417      ! 
     
    400440 
    401441   !!====================================================================== 
    402 END MODULE p4zflx 
     442END MODULE  p4zflx 
Note: See TracChangeset for help on using the changeset viewer.