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

Changeset 1534


Ignore:
Timestamp:
2009-07-24T12:35:25+02:00 (15 years ago)
Author:
cetlod
Message:

Improve the coupling interface for the carbon cycle, see ticket:488

Location:
trunk/NEMO
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/SBC/sbc_oce.F90

    r1244 r1534  
    5454!!$   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   calving       !: calving 
    5555   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   fr_i      !: ice fraction  (between 0 to 1)               - 
     56#if defined key_cpl_carbon_cycle 
     57   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   atm_co2   !: atmospheric pCO2                             [ppm] 
     58#endif 
    5659 
    5760   !!---------------------------------------------------------------------- 
  • trunk/NEMO/OPA_SRC/SBC/sbccpl.F90

    r1523 r1534  
    66   !! History :  2.0  !  06-2007  (R. Redler, N. Keenlyside, W. Park) Original code split into flxmod & taumod 
    77   !!            3.0  !  02-2008  (G. Madec, C Talandier)  surface module 
    8    !!            3.1  !  02-2009  (G. Madec, S. Masson, E. Maisonave, A. Caubel) generic coupled interface 
     8   !!            3.1  !  02-2009  (S. Masson, E. Maisonave, A. Caubel) generic coupled interface 
    99   !!---------------------------------------------------------------------- 
    1010#if defined key_oasis3 || defined key_oasis4 
     
    2727#endif 
    2828#if defined key_lim2 
    29    USE ice_2, ONLY : hicif, hsnif          ! Ice and Snow thickness 
     29   USE par_ice_2       ! ice parameters 
     30   USE ice_2           ! ice variables 
    3031#endif 
    3132   USE cpl_oasis3      ! OASIS3 coupling 
     
    4142   USE mod_prism_proto ! OASIS3 prism module: PRISM_* variables... 
    4243   USE phycst, ONLY : xlsn, rhosn 
     44#if defined key_cpl_carbon_cycle 
     45   USE p4zflx, ONLY : oce_co2 
     46#endif 
    4347   IMPLICIT NONE 
    4448   PRIVATE 
     
    7882   INTEGER, PARAMETER ::   jpr_rnf    = 28            !  
    7983   INTEGER, PARAMETER ::   jpr_cal    = 29            !  
     84#if ! defined key_cpl_carbon_cycle 
    8085   INTEGER, PARAMETER ::   jprcv      = 29            ! total number of fields recieved 
    81     
     86#else 
     87   INTEGER, PARAMETER ::   jpr_co2    = 30 
     88   INTEGER, PARAMETER ::   jprcv      = 30            ! total number of fields recieved 
     89#endif    
    8290   INTEGER, PARAMETER ::   jps_fice   =  1            ! ice fraction  
    8391   INTEGER, PARAMETER ::   jps_toce   =  2            ! ocean temperature 
     
    94102   INTEGER, PARAMETER ::   jps_ivy1   = 13            ! 
    95103   INTEGER, PARAMETER ::   jps_ivz1   = 14            ! 
     104#if ! defined key_cpl_carbon_cycle 
    96105   INTEGER, PARAMETER ::   jpsnd      = 14            ! total number of fields sended 
    97     
     106#else 
     107   INTEGER, PARAMETER ::   jps_co2    = 15 
     108   INTEGER, PARAMETER ::   jpsnd      = 15            ! total number of fields sended 
     109#endif    
    98110   !                                                         !!** namelist namsbc_cpl ** 
    99111   ! Send to the atmosphere                                   ! 
     
    105117   CHARACTER(len=100) ::   cn_snd_crt_orient  = 'local grid'  ! 'eastward-northward' or 'local grid' 
    106118   CHARACTER(len=100) ::   cn_snd_crt_grid    = 'T'           ! always at 'T' point 
    107     
     119#if defined key_cpl_carbon_cycle  
     120   CHARACTER(len=100) ::   cn_snd_co2         = 'none'        ! 'none' or 'coupled' 
     121#endif 
    108122   ! Recieved from the atmosphere                             ! 
    109123   CHARACTER(len=100) ::   cn_rcv_tau_nature  = 'oce only'    ! 'oce only' 'oce and ice' or 'mixed oce-ice' 
     
    118132   CHARACTER(len=100) ::   cn_rcv_rnf         = 'coupled'     ! 'coupled' 'climato' or 'mixed' 
    119133   CHARACTER(len=100) ::   cn_rcv_cal         = 'none'        ! 'none' or 'coupled' 
     134#if defined key_cpl_carbon_cycle  
     135   CHARACTER(len=100) ::   cn_rcv_co2         = 'none'        ! 'none' or 'coupled' 
     136#endif 
    120137 
    121138!!   CHARACTER(len=100), PUBLIC ::   cn_rcv_rnf   !: ???             ==>>  !!gm   treat this case in a different maner 
     
    160177         cn_rcv_tau_nature, cn_rcv_tau_refere , cn_rcv_tau_orient, cn_rcv_tau_grid ,                 & 
    161178         cn_rcv_dqnsdt    , cn_rcv_qsr        , cn_rcv_qns       , cn_rcv_emp      , cn_rcv_rnf , cn_rcv_cal 
     179#if defined key_cpl_carbon_cycle  
     180      NAMELIST/namsbc_cpl_co2/  cn_snd_co2, cn_rcv_co2 
     181#endif 
    162182      !!--------------------------------------------------------------------- 
    163183 
     
    195215      ENDIF 
    196216 
     217#if defined key_cpl_carbon_cycle  
     218      REWIND( numnam )                    ! ... read namlist namsbc_cpl_co2 
     219      READ  ( numnam, namsbc_cpl_co2 ) 
     220      IF(lwp) THEN                        ! control print 
     221         WRITE(numout,*) 
     222         WRITE(numout,*)'sbc_cpl_init : namsbc_cpl_co2 namelist ' 
     223         WRITE(numout,*)'~~~~~~~~~~~~' 
     224         WRITE(numout,*)'   received fields' 
     225         WRITE(numout,*)'       atm co2                            cn_rcv_co2         = ', cn_rcv_co2 
     226         WRITE(numout,*)'   sent fields' 
     227         WRITE(numout,*)'      oce co2 flux                        cn_snd_co2         = ', cn_snd_co2 
     228          WRITE(numout,*) 
     229      ENDIF 
     230#endif 
    197231      ! save current & stress in an array and suppress possible blank in the name 
    198232      cn_snd_crt(1) = TRIM( cn_snd_crt_nature )   ;   cn_snd_crt(2) = TRIM( cn_snd_crt_refere ) 
     
    372406      !                                                      !      10m wind module      !    
    373407      !                                                      ! ------------------------- ! 
    374       srcv(jpr_w10m  )%clname = 'O_Wind10'   ;   IF( TRIM(cn_rcv_w10m) == 'coupled' )   srcv(jpr_w10m)%laction = .TRUE.      
     408      srcv(jpr_w10m)%clname = 'O_Wind10'   ;   IF( TRIM(cn_rcv_w10m) == 'coupled' )   srcv(jpr_w10m)%laction = .TRUE.      
     409 
     410#if defined key_cpl_carbon_cycle 
     411      !                                                      ! ------------------------- ! 
     412      !                                                      !      Atmospheric CO2      ! 
     413      !                                                      ! ------------------------- ! 
     414      srcv(jpr_co2 )%clname = 'O_AtmCO2'   ;   IF( TRIM(cn_rcv_co2) == 'coupled' )    srcv(jpr_co2 )%laction = .TRUE. 
     415#endif 
    375416      
    376417      ! ================================ ! 
     
    450491      END SELECT 
    451492 
     493#if defined key_cpl_carbon_cycle 
     494      !                                                      ! ------------------------- ! 
     495      !                                                      !          CO2 flux         ! 
     496      !                                                      ! ------------------------- ! 
     497      ssnd(jps_co2)%clname = 'O_CO2FLX' ;  IF( TRIM(cn_snd_co2) == 'coupled' )    ssnd(jps_co2 )%laction = .TRUE. 
     498#endif 
     499      ! 
    452500      ! ================================ ! 
    453501      !   initialisation of the coupler  ! 
     
    632680         ! it not, we call sbc_tau2wnd in sbc_cpl_rcv (or later, after the ice???) 
    633681         ! 
     682#if defined  key_cpl_carbon_cycle 
     683         !                                                              ! atmosph. CO2 (ppm) 
     684         IF( srcv(jpr_co2)%laction )   atm_co2(:,:) = frcv(:,:,jpr_co2) 
     685#endif 
     686 
    634687      ENDIF 
    635688      ! 
     
    10701123      IF( ssnd(jps_hsnw)%laction )   CALL cpl_prism_snd( jps_hsnw, isec, hsnif(:,:) * fr_i(:,:), info ) 
    10711124      ! 
    1072       !                                                      ! ------------------------- ! 
     1125#if defined key_cpl_carbon_cycle 
     1126      !                                                      ! ------------------------- ! 
     1127      !                                                      !  CO2 flux from PISCES     !  
     1128      !                                                      ! ------------------------- ! 
     1129      IF( ssnd(jps_co2)%laction )   CALL cpl_prism_snd( jps_co2, isec, oce_co2 , info ) 
     1130      ! 
     1131#endif 
    10731132      IF( ssnd(jps_ocx1)%laction ) THEN                      !      Surface current      ! 
    10741133         !                                                   ! ------------------------- ! 
     
    11971256         IF( ssnd(jps_ivy1)%laction )   CALL cpl_prism_snd( jps_ivy1, isec, zity1, info )   ! ice   y current 1st grid 
    11981257         IF( ssnd(jps_ivz1)%laction )   CALL cpl_prism_snd( jps_ivz1, isec, zitz1, info )   ! ice   z current 1st grid 
    1199          ! 
     1258         !  
    12001259      ENDIF 
    12011260   ! 
     
    12391298      REAL(wp), INTENT(in   ), DIMENSION(:,:  ), OPTIONAL ::   psst    ! sea surface temperature      [Celcius] 
    12401299      REAL(wp), INTENT(in   ), DIMENSION(:,:,:), OPTIONAL ::   pist    ! ice surface temperature      [Kelvin] 
    1241       WRITE(*,*) 'sbc_cpl_snd: You should not have seen this print! error?', p_frld(1,1,1), palbi(1,1,1), psst (1,1), pist (1,1,1) 
     1300      WRITE(*,*) 'sbc_cpl_snd: You should not have seen this print! error?', p_frld(1,1,1) 
    12421301      ! stupid definition to avoid warning message when compiling... 
    12431302      pqns_tot(:,:) = 0. ; pqns_ice(:,:,:) = 0. ; pdqns_ice(:,:,:) = 0. 
  • trunk/NEMO/TOP_SRC/PISCES/p4zflx.F90

    r1457 r1534  
    2424   USE p4zche 
    2525   USE iom 
    26  
     26#if defined key_cpl_carbon_cycle 
     27   USE sbc_oce , ONLY :  atm_co2 
     28#endif 
    2729   USE lib_mpp 
    2830 
     
    3537      atcox  = 0.20946 ,    &  !: 
    3638      atcco2 = 278.            !: 
    37   
    38    REAL(wp) :: &           
    39       xconv  = 0.01/3600.,  &  ! coefficients for conversion        
    40       tco2flx                 !: Total flux of carbon per year 
     39 
     40   REAL(wp) :: & 
     41      xconv  = 0.01/3600     !: coefficients for conversion  
     42 
     43#if defined key_cpl_carbon_cycle 
     44   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::  & 
     45      oce_co2            !: ocean carbon flux 
     46   REAL(wp) :: & 
     47      t_atm_co2_flx,  &  !: Total atmospheric carbon flux per year 
     48      t_oce_co2_flx      !: Total ocean carbon flux per year 
     49#endif 
    4150 
    4251   !!* Substitution 
     
    6372      REAL(wp) ::   zfld, zflu, zfld16, zflu16, zfact 
    6473      REAL(wp) ::   zph, zah2, zbot, zdic, zalk, zsch_o2, zalka, zsch_co2 
    65       REAL(wp), DIMENSION(jpi,jpj) ::   zkgco2, zkgo2, zh2co3, ztco2flx 
     74      REAL(wp), DIMENSION(jpi,jpj) ::   zkgco2, zkgo2, zh2co3 
    6675#if defined key_trc_diaadd && defined key_iomput 
    6776      REAL(wp), DIMENSION(jpi,jpj) ::  zcflx, zoflx, zkg, zdelc 
     
    146155      END DO 
    147156 
    148 #if ! defined key_iomput 
    149157      DO jj = 1, jpj 
    150158         DO ji = 1, jpi 
    151  
    152159            ! Compute CO2 flux for the sea and air 
     160#if ! defined key_cpl_carbon_cycle 
    153161            zfld = atcco2 * tmask(ji,jj,1) * chemc(ji,jj,1) * zkgco2(ji,jj) 
    154162            zflu = zh2co3(ji,jj) * tmask(ji,jj,1) * zkgco2(ji,jj) 
     163#else 
     164            zfld = atm_co2(ji,jj) * tmask(ji,jj,1) * chemc(ji,jj,1) * zkgco2(ji,jj) 
     165            zflu = zh2co3(ji,jj) * tmask(ji,jj,1) * zkgco2(ji,jj) 
     166            ! compute flux of carbon 
     167            oce_co2(ji,jj) = ( zfld - zflu ) * rfact & 
     168               &             * e1t(ji,jj) * e2t(ji,jj) * tmask(ji,jj,1) * 1000. 
     169#endif 
    155170            tra(ji,jj,1,jpdic) = tra(ji,jj,1,jpdic) + ( zfld - zflu ) / fse3t(ji,jj,1) 
    156  
    157             ! compute flux of carbon 
    158             ztco2flx(ji,jj) = ( zfld - zflu ) * rfact & 
    159                &             * e1t(ji,jj) * e2t(ji,jj) * tmask(ji,jj,1) * 1000. 
    160171 
    161172            ! Compute O2 flux  
     
    164175            tra(ji,jj,1,jpoxy) = tra(ji,jj,1,jpoxy) + ( zfld16 - zflu16 ) / fse3t(ji,jj,1) 
    165176 
    166 # if defined key_trc_diaadd  
     177#if defined key_trc_diaadd  
    167178            ! Save diagnostics 
    168             trc2d(ji,jj,jp_pcs0_2d    ) = ( zfld - zflu ) * 1000.  * tmask(ji,jj,1) 
     179#  if ! defined key_iomput 
     180            trc2d(ji,jj,jp_pcs0_2d    ) = ( zfld - zflu )     * 1000. * tmask(ji,jj,1) 
    169181            trc2d(ji,jj,jp_pcs0_2d + 1) = ( zfld16 - zflu16 ) * 1000. * tmask(ji,jj,1) 
    170182            trc2d(ji,jj,jp_pcs0_2d + 2) = zkgco2(ji,jj) * tmask(ji,jj,1) 
    171183            trc2d(ji,jj,jp_pcs0_2d + 3) = atcco2 - zh2co3(ji,jj) / ( chemc(ji,jj,1) + rtrn ) * tmask(ji,jj,1) 
    172 # endif 
    173          END DO 
    174       END DO 
    175       ! 
    176 #else 
    177       DO jj = 1, jpj 
    178          DO ji = 1, jpi 
    179             ! Compute CO2 flux for the sea and air 
    180             zfld = atcco2 * tmask(ji,jj,1) * chemc(ji,jj,1) * zkgco2(ji,jj) 
    181             zflu = zh2co3(ji,jj) * tmask(ji,jj,1) * zkgco2(ji,jj) 
    182             tra(ji,jj,1,jpdic) = tra(ji,jj,1,jpdic) + ( zfld - zflu ) / fse3t(ji,jj,1) 
    183  
    184             ! compute flux of carbon 
    185             ztco2flx(ji,jj) = ( zfld - zflu ) * rfact & 
    186                &             * e1t(ji,jj) * e2t(ji,jj) * tmask(ji,jj,1) * 1000. 
    187  
    188             ! Compute O2 flux  
    189             zfld16 = atcox * chemc(ji,jj,2) *tmask(ji,jj,1) * zkgo2(ji,jj) 
    190             zflu16 = trn(ji,jj,1,jpoxy) * tmask(ji,jj,1) * zkgo2(ji,jj) 
    191             tra(ji,jj,1,jpoxy) = tra(ji,jj,1,jpoxy) + ( zfld16 - zflu16 ) / fse3t(ji,jj,1) 
    192 # if defined key_trc_diaadd  
    193             ! Save diagnostics 
     184#  else 
    194185            zcflx(ji,jj) = ( zfld - zflu ) * 1000.  * tmask(ji,jj,1) 
    195186            zoflx(ji,jj) = ( zfld16 - zflu16 ) * 1000. * tmask(ji,jj,1) 
    196187            zkg  (ji,jj) = zkgco2(ji,jj) * tmask(ji,jj,1) 
    197188            zdelc(ji,jj) = atcco2 - zh2co3(ji,jj) / ( chemc(ji,jj,1) + rtrn ) * tmask(ji,jj,1) 
    198 # endif 
     189#  endif 
     190#endif 
    199191         END DO 
    200192      END DO 
    201 #endif 
    202  
     193 
     194#if defined key_cpl_carbon_cycle 
    203195      ! Total Flux of Carbon 
    204       DO jj = 1, jpj 
     196      DO jj = 1, jpj  
    205197        DO ji = 1, jpi 
    206            tco2flx = tco2flx + ztco2flx(ji,jj) * tmask_i(ji,jj) 
     198           t_atm_co2_flx = t_atm_co2_flx + atm_co2(ji,jj) * tmask_i(ji,jj) 
     199           t_oce_co2_flx = t_oce_co2_flx + oce_co2(ji,jj) * tmask_i(ji,jj) 
    207200        END DO 
    208201      END DO 
    209202 
    210203      IF( MOD( kt, nspyr ) == 0 ) THEN 
    211         IF( lk_mpp ) CALL mpp_sum( tco2flx )   ! sum over the global domain 
    212  
     204        IF( lk_mpp ) THEN 
     205          CALL mpp_sum( t_atm_co2_flx )   ! sum over the global domain 
     206          CALL mpp_sum( t_oce_co2_flx )   ! sum over the global domain 
     207        ENDIF 
    213208        WRITE(numout,*) ' Atmospheric pCO2    :' 
    214         WRITE(numout,*) '-------------------- : ',kt,'  ',atcco2 
     209        WRITE(numout,*) '-------------------- : ',kt,'  ',t_atm_co2_flx 
    215210        WRITE(numout,*) '(ppm)' 
    216211        WRITE(numout,*) 'Total Flux of Carbon :' 
    217         WRITE(numout,*) '-------------------- : ',tco2flx * 12. / 1e15 
     212        WRITE(numout,*) '-------------------- : ',t_oce_co2_flx * 12. / 1e15 
    218213        WRITE(numout,*) '(GtC/an)' 
    219         tco2flx = 0. 
     214        t_atm_co2_flx = 0. 
     215        t_oce_co2_flx = 0. 
    220216      ENDIF 
     217#endif 
    221218 
    222219      IF(ln_ctl)   THEN  ! print mean trends (used for debugging) 
     
    260257      ENDIF 
    261258 
    262       ! Initialization of total Flux of Carbon 
    263       tco2flx = 0. 
     259#if defined key_cpl_carbon_cycle 
     260      ! Initialization of Flux of Carbon 
     261      oce_co2(:,:) = 0. 
     262      t_atm_co2_flx = 0. 
     263      t_oce_co2_flx = 0. 
     264#endif 
    264265 
    265266   END SUBROUTINE p4z_flx_init 
Note: See TracChangeset for help on using the changeset viewer.