Changeset 3450 for LMDZ6/trunk


Ignore:
Timestamp:
Jan 25, 2019, 7:51:34 PM (6 years ago)
Author:
oboucher
Message:

Various additions for the interactive CO2 cycle

Location:
LMDZ6/trunk/libf/phylmd
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/physiq_mod.F90

    r3435 r3450  
    244244    USE indice_sol_mod
    245245    USE phytrac_mod, ONLY : phytrac
    246     USE carbon_cycle_mod, ONLY : infocfields_init
     246    USE carbon_cycle_mod, ONLY : infocfields_init, RCO2_glo, carbon_cycle_rad
    247247
    248248#ifdef CPP_RRTM
     
    39673967          RCFC11 = RCFC11_act
    39683968          RCFC12 = RCFC12_act
     3969          !
     3970          !--interactive CO2 in ppm from carbon cycle
     3971          IF (carbon_cycle_rad.AND..NOT.debut) THEN
     3972            RCO2=RCO2_glo
     3973          ENDIF
    39693974          !
    39703975          IF (prt_level .GE.10) THEN
    39713976             print *,' ->radlwsw, number 1 '
    39723977          ENDIF
    3973 
    39743978          !
    39753979          CALL radlwsw &
  • LMDZ6/trunk/libf/phylmd/phytrac_mod.F90

    r3418 r3450  
    405405       !Config Key  = convscav
    406406       !Config Desc = Convective scavenging switch: 0=off, 1=on.
    407        !Config Def  = .false.
     407       !Config Def  = .FALSE.
    408408       !Config Help =
    409409       !
    410410!$OMP MASTER
    411        convscav_omp=.false.
     411       convscav_omp=.FALSE.
    412412       call getin('convscav', convscav_omp)
    413413       iflag_vdf_trac_omp=1
     
    479479       CASE('co2i')
    480480          source(:,:)=0.
     481          lessivage  = .FALSE.
     482          aerosol(:) = .FALSE.
     483          pbl_flg(:) = 1
     484          iflag_the_trac= 1
     485          iflag_vdf_trac= 1
     486          iflag_con_trac= 1
    481487#ifdef CPP_StratAer
    482488       CASE('coag')
     
    506512             CASE('lmdz')
    507513                IF (convscav.and.aerosol(it)) THEN
    508                    flag_cvltr(it)=.true.
     514                   flag_cvltr(it)=.TRUE.
    509515                   ccntrAA(it) =ccntrAA_in    !--a modifier par JYG a lire depuis fichier
    510516                   ccntrENV(it)=ccntrENV_in
    511517                   coefcoli(it)=coefcoli_in
    512518                ELSE
    513                    flag_cvltr(it)=.false.
     519                   flag_cvltr(it)=.FALSE.
    514520                ENDIF
    515521
    516522             CASE('repr')
    517                  flag_cvltr(it)=.false.
     523                 flag_cvltr(it)=.FALSE.
    518524
    519525             CASE('inca')
    520526!                IF ((it.EQ.id_Rn222) .OR. ((it.GE.id_SO2) .AND. (it.LE.id_NH3)) ) THEN
    521527!                   !--gas-phase species
    522 !                   flag_cvltr(it)=.false.
     528!                   flag_cvltr(it)=.FALSE.
    523529!
    524530!                ELSEIF ( (it.GE.id_CIDUSTM) .AND. (it.LE.id_AIN) ) THEN
    525531!                   !--insoluble aerosol species
    526 !                   flag_cvltr(it)=.true.
     532!                   flag_cvltr(it)=.TRUE.
    527533!                   ccntrAA(it)=0.7
    528534!                   ccntrENV(it)=0.7
     
    530536!                ELSEIF ( (it.EQ.id_Pb210) .OR. ((it.GE.id_CSSSM) .AND. (it.LE.id_SSN))) THEN
    531537!                   !--soluble aerosol species
    532 !                   flag_cvltr(it)=.true.
     538!                   flag_cvltr(it)=.TRUE.
    533539!                   ccntrAA(it)=0.9
    534540!                   ccntrENV(it)=0.9
     
    540546                !--test OB
    541547                !--for now we do not scavenge in cvltr
    542                 flag_cvltr(it)=.false.
     548                flag_cvltr(it)=.FALSE.
    543549
    544550             CASE('co2i')
    545551                !--co2 tracers are not scavenged
    546                 flag_cvltr(it)=.false.
     552                flag_cvltr(it)=.FALSE.
    547553
    548554#ifdef CPP_StratAer
    549555             CASE('coag')
    550556                IF (convscav.and.aerosol(it)) THEN
    551                    flag_cvltr(it)=.true.
     557                   flag_cvltr(it)=.TRUE.
    552558                   ccntrAA(it) =ccntrAA_in   
    553559                   ccntrENV(it)=ccntrENV_in
    554560                   coefcoli(it)=coefcoli_in
    555561                ELSE
    556                    flag_cvltr(it)=.false.
     562                   flag_cvltr(it)=.FALSE.
    557563                ENDIF
    558564#endif
     
    562568          !
    563569       ELSE ! iflag_con .ne. 3
    564           flag_cvltr(:) = .false.
     570          flag_cvltr(:) = .FALSE.
    565571       ENDIF
    566572       !
     
    593599       ENDIF
    594600       !
    595     END IF ! of IF (debutphy)
     601    ENDIF ! of IF (debutphy)
    596602    !############################################ END INITIALIZATION #######
    597603
     
    637643       !   -- CO2 interactif --
    638644       !   -- source is updated with FF and BB emissions
    639        !   -- OB => PC need to add net flux from ocean and orchidee
     645       !   -- and net fluxes from ocean and orchidee
    640646       !   -- sign convention : positive into the atmosphere
     647
    641648       CALL tracco2i(pdtphys, debutphy, &
    642649            xlat, xlon, pphis, pphi, &
     
    754761#endif
    755762
    756     END IF ! convection
     763    ENDIF ! convection
    757764
    758765    !======================================================================
     
    792799       END DO ! it
    793800
    794     END IF ! Thermiques
     801    ENDIF ! Thermiques
    795802
    796803    !======================================================================
     
    878885       CALL abort_physic('iflag_vdf_trac', 'cas non prevu',1)
    879886       !
    880     END IF ! couche limite
     887    ENDIF ! couche limite
    881888
    882889    !======================================================================
     
    968975                      zdz(i,k)=(paprs(i,k)-paprs(i,k+1))/zrho(i,k)/RG
    969976                      !
    970                    END DO
    971                 END DO
     977                   ENDDO
     978                ENDDO
    972979
    973980                DO k=klev-1, 1, -1
     
    10141021                      !                                (1.-1./(frac_impa(i,k)*frac_nucl(i,k)))
    10151022                      !--------------
    1016                    END DO
    1017                 END DO
    1018              END IF
    1019           END DO
     1023                   ENDDO
     1024                ENDDO
     1025             ENDIF
     1026          ENDDO
    10201027          ! *********   end modified old version
    10211028
     
    10531060                      ! ----------------------------------------------------------------------
    10541061                      tr_seri(i,k,it)=tr_seri(i,k,it)*frac_impa(i,k)*frac_nucl(i,k)
    1055                    END DO
    1056                 END DO
    1057              END IF
    1058           END DO
     1062                   ENDDO
     1063                ENDDO
     1064             ENDIF
     1065          ENDDO
    10591066
    10601067          ! *********   end old version
    10611068       ENDIF  !  iflag_lscav . EQ. 1, 2, 3 or 4
    10621069       !
    1063     END IF !  lessivage
     1070    ENDIF !  lessivage
    10641071
    10651072
  • LMDZ6/trunk/libf/phylmd/tracco2i_mod.F90

    r3435 r3450  
    1111    USE dimphy
    1212    USE infotrac_phy
    13     USE geometry_mod, ONLY : cell_area
    14     USE carbon_cycle_mod, ONLY : nbcf_in, fields_in, cfname_in, fco2_ocn_day, fco2_ff, fco2_bb
     13    USE geometry_mod, ONLY: cell_area
     14    USE carbon_cycle_mod, ONLY: id_CO2, nbcf_in, fields_in, cfname_in, fco2_ocn_day, fco2_ff, fco2_bb
     15    USE carbon_cycle_mod, ONLY: carbon_cycle_tr, carbon_cycle_rad, RCO2_glo, RCO2_tot
    1516    USE mod_grid_phy_lmdz
    16     USE mod_phys_lmdz_mpi_data, ONLY : is_mpi_root
     17    USE mod_phys_lmdz_mpi_data, ONLY: is_mpi_root
    1718    USE mod_phys_lmdz_para, ONLY: gather, bcast, scatter
    1819    USE phys_cal_mod
     20    USE phys_state_var_mod, ONLY: pctsrf
     21    USE indice_sol_mod, ONLY: nbsrf, is_ter, is_lic, is_oce, is_sic
    1922
    2023    IMPLICIT NONE
     
    4548!----------------
    4649
    47     INTEGER, PARAMETER :: id_CO2=1              !--temporaire OB -- to be changed
    4850    INTEGER                        :: it, k, i, nb
    4951    REAL, DIMENSION(klon,klev)     :: m_air     ! mass of air in every grid box [kg]
     
    5355    REAL, DIMENSION(klon_glo,klev) :: m_air_glo ! variable temporaire sur la grille global
    5456
    55 
    56     INTEGER, SAVE :: mth_pre=0
    57 !$OMP THREADPRIVATE(mth_pre)
    58     REAL, SAVE :: RCO2_glo
    59 !$OMP THREADPRIVATE(RCO2_glo)
     57    INTEGER, SAVE :: mth_pre=0, day_pre=0
     58!$OMP THREADPRIVATE(mth_pre, day_pre)
    6059
    6160    IF (is_mpi_root) THEN
     
    6867    IF (debutphy) THEN
    6968      IF (MAXVAL(tr_seri(:,:,id_CO2)).LT.1.e-15) THEN
    70         tr_seri(:,:,id_CO2)=280.e-6/RMD*RMCO2
     69        !!tr_seri(:,:,id_CO2)=280.e-6/RMD*RMCO2
     70        tr_seri(:,:,id_CO2)=400.e-6/RMD*RMCO2 !--initialised to 400 ppm for a test
    7171      ENDIF
    7272    ENDIF
     
    8585
    8686!--retrieving land and ocean CO2 flux
    87 !--fCO2_nep comes in unit of g CO2 m-2 dt_stomate-1
    88 !--this needs to be changed in ORCHIDEE
    8987    co2land(:)=0.0
    9088    co2ocean(:)=0.0
    9189    DO nb=1, nbcf_in
    92       IF (cfname_in(nb) == "fCO2_nep" )   co2land(:)=fields_in(:,nb)*RMCO2/RMC/86400./1000.
    93       !!IF (cfname_in(nb) == "fCO2_fgco2" ) co2ocean(:)=fco2_ocn_day(:) !--for now
     90!--fCO2_nep comes in unit of kg C m-2 s-1
     91!--converting to kg CO2 m-2 s-1
     92      IF (cfname_in(nb) == "fCO2_nep" )   co2land(:)=fields_in(:,nb)*RMCO2/RMC*pctsrf(:,is_ter)
     93!--fCO2_fgco2 comes in unit of mol C02 m-2 s-1
     94!--converting to kg CO2 m-2 s-1 + change sign
     95      IF (cfname_in(nb) == "fCO2_fgco2" ) co2ocean(:)=-1.*fco2_ocn_day(:)*RMCO2/1.e3*(pctsrf(:,is_oce)+pctsrf(:,is_sic))
    9496    ENDDO
    9597
     
    99101
    100102!--computing global mean CO2 for radiation
    101 !--every timestep for now but enough every month
     103!--every timestep for now but enough every day
    102104!    IF (debutphy.OR.mth_cur.NE.mth_pre) THEN
     105!    IF (debutphy.OR.day_cur.NE.day_pre) THEN
    103106      CALL gather(tr_seri(:,:,id_CO2),co2_glo)
    104107      CALL gather(m_air,m_air_glo)
    105108!$OMP MASTER
    106 !--conversion from kg CO2/kg air into ppm
     109!--compute a global mean CO2 value and print its value in ppm
    107110       IF (is_mpi_root) THEN
    108          RCO2_glo=SUM(co2_glo*m_air_glo)/SUM(m_air_glo)*1.e6*RMD/RMCO2
     111         RCO2_tot=SUM(co2_glo*m_air_glo)  !--unit kg CO2
     112         RCO2_glo=RCO2_tot/SUM(m_air_glo) !--unit kg CO2 / kg air
     113         PRINT *,'tracco2i: global CO2 in ppm =', RCO2_glo*1.e6*RMD/RMCO2
     114         PRINT *,'tracco2i: total CO2 in kg =', RCO2_tot
    109115       ENDIF
    110        PRINT *,'toto in tracco2i: global CO2 in ppm =', RCO2_glo
    111116!$OMP END MASTER
    112117       CALL bcast(RCO2_glo)
    113118       mth_pre=mth_cur
     119       day_pre=day_cur
     120!--if not carbon_cycle_tr, then we reinitialize the CO2 each day to its global mean value
     121       IF (.NOT.carbon_cycle_tr) THEN
     122         tr_seri(:,:,id_CO2)=RCO2_glo
     123       ENDIF
    114124!    ENDIF
    115125
Note: See TracChangeset for help on using the changeset viewer.