Ignore:
Timestamp:
Apr 20, 2023, 9:57:22 AM (15 months ago)
Author:
tlurton
Message:

Strataer: a bug correction in strataer_mod.F90, and an implementation of injection duration for SAI case.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/StratAer/traccoag_mod.F90

    r4293 r4513  
    2323    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
    2424    USE mod_phys_lmdz_para, only: gather, scatter
    25     USE phys_cal_mod, ONLY : year_len, year_cur,mth_cur, day_cur, hour
     25    USE phys_cal_mod, ONLY : year_len, mth_len, year_cur, mth_cur, day_cur, hour
    2626    USE sulfate_aer_mod
    2727    USE phys_local_var_mod, ONLY: stratomask
     
    7878    REAL                                   :: theta_min, theta_max ! for SAI computation between two latitudes
    7979    REAL                                   :: dlat_loc
     80    INTEGER                                :: injdur_sai          ! injection duration for SAI case [days]
     81    INTEGER                                :: yr, is_bissext
    8082
    8183    IF (is_mpi_root) THEN
     
    229231    CASE(2) ! stratospheric aerosol injections (SAI)
    230232!
    231       DO i=1,klon
    232 !       SAI standard scenario with continuous emission from 1 grid point at the equator
    233 !       SAI emission on single month
    234 !       SAI continuous emission o
     233     ! Computing duration of SAI in days...
     234     ! ... starting from 0...
     235     injdur_sai = 0
     236     ! ... then adding whole years from first to (n-1)th...
     237     DO yr = year_emit_sai_start, year_emit_sai_end-1
     238       ! (n % 4 == 0) and (n % 100 != 0 or n % 400 == 0)
     239       is_bissext = (MOD(yr,4)==0) .AND. (MOD(yr,100) /= 0 .OR. MOD(yr,400) == 0)
     240       injdur_sai = injdur_sai+365+is_bissext
     241     ENDDO
     242     ! ... then subtracting part of the first year where no injection yet...
     243     is_bissext = (MOD(year_emit_sai_start,4)==0) .AND. (MOD(year_emit_sai_start,100) /= 0 .OR. MOD(year_emit_sai_start,400) == 0)
     244     SELECT CASE(mth_emit_sai_start)
     245     CASE(2)
     246        injdur_sai = injdur_sai-31
     247     CASE(3)
     248        injdur_sai = injdur_sai-31-28-is_bissext
     249     CASE(4)
     250        injdur_sai = injdur_sai-31-28-is_bissext-31
     251     CASE(5)
     252        injdur_sai = injdur_sai-31-28-is_bissext-31-30
     253     CASE(6)
     254        injdur_sai = injdur_sai-31-28-is_bissext-31-30-31
     255     CASE(7)
     256        injdur_sai = injdur_sai-31-28-is_bissext-31-30-31-30
     257     CASE(8)
     258        injdur_sai = injdur_sai-31-28-is_bissext-31-30-31-30-31
     259     CASE(9)
     260        injdur_sai = injdur_sai-31-28-is_bissext-31-30-31-30-31-31
     261     CASE(10)
     262        injdur_sai = injdur_sai-31-28-is_bissext-31-30-31-30-31-31-30
     263     CASE(11)
     264        injdur_sai = injdur_sai-31-28-is_bissext-31-30-31-30-31-31-30-31
     265     CASE(12)
     266        injdur_sai = injdur_sai-31-28-is_bissext-31-30-31-30-31-31-30-31-30
     267     END SELECT
     268     injdur_sai = injdur_sai-day_emit_sai_start+1
     269     ! ... then adding part of the n-th year
     270     is_bissext = (MOD(year_emit_sai_end,4)==0) .AND. (MOD(year_emit_sai_end,100) /= 0 .OR. MOD(year_emit_sai_end,400) == 0)
     271     SELECT CASE(mth_emit_sai_end)
     272     CASE(2)
     273        injdur_sai = injdur_sai+31
     274     CASE(3)
     275        injdur_sai = injdur_sai+31+28+is_bissext
     276     CASE(4)
     277        injdur_sai = injdur_sai+31+28+is_bissext+31
     278     CASE(5)
     279        injdur_sai = injdur_sai+31+28+is_bissext+31+30
     280     CASE(6)
     281        injdur_sai = injdur_sai+31+28+is_bissext+31+30+31
     282     CASE(7)
     283        injdur_sai = injdur_sai+31+28+is_bissext+31+30+31+30
     284     CASE(8)
     285        injdur_sai = injdur_sai+31+28+is_bissext+31+30+31+30+31
     286     CASE(9)
     287        injdur_sai = injdur_sai+31+28+is_bissext+31+30+31+30+31+31
     288     CASE(10)
     289        injdur_sai = injdur_sai+31+28+is_bissext+31+30+31+30+31+31+30
     290     CASE(11)
     291        injdur_sai = injdur_sai+31+28+is_bissext+31+30+31+30+31+31+30+31
     292     CASE(12)
     293        injdur_sai = injdur_sai+31+28+is_bissext+31+30+31+30+31+31+30+31+30
     294     END SELECT
     295     injdur_sai = injdur_sai+day_emit_sai_end
     296     ! A security: are SAI dates of injection consistent?
     297     IF (injdur_sai <= 0) THEN
     298        CALL abort_physic('traccoag_mod', 'Pb in SAI dates of injection.',1)
     299     ENDIF
     300     ! Injection in itself
     301     IF (( year_emit_sai_start <= year_cur ) &
     302        .AND. ( year_cur <= year_emit_sai_end ) &
     303        .AND. ( mth_emit_sai_start <= mth_cur .OR. year_emit_sai_start < year_cur ) &
     304        .AND. ( mth_cur <= mth_emit_sai_end .OR. year_cur < year_emit_sai_end ) &
     305        .AND. ( day_emit_sai_start <= day_cur .OR. mth_emit_sai_start < mth_cur .OR. year_emit_sai_start < year_cur ) &
     306        .AND. ( day_cur <= day_emit_sai_end .OR. mth_cur < mth_emit_sai_end .OR. year_cur < year_emit_sai_end )) THEN
     307
     308     DO i=1,klon
    235309        dlat_loc=180./RPI/2.*(boundslat(i,1)-boundslat(i,3)) ! dlat = half difference of boundary latitudes
    236310        IF  ( xlat(i).GE.xlat_sai-dlat_loc .AND. xlat(i).LT.xlat_sai+dlat_loc .AND. &
     
    280354          DO k=1, klev
    281355            ! stretch emission over whole year (360d)
    282             emission=m_aer_emiss_sai*(mSO2mol/mSatom)/m_air_gridbox(i,k)*f_lay_emiss(k)/FLOAT(year_len)/86400. 
     356            emission=m_aer_emiss_sai*(mSO2mol/mSatom)/m_air_gridbox(i,k)*f_lay_emiss(k)/FLOAT(injdur_sai)/86400. 
    283357            tr_seri(i,k,id_SO2_strat)=tr_seri(i,k,id_SO2_strat)+emission*pdtphys
    284358            budg_emi_so2(i)=budg_emi_so2(i)+emission*zdm(k)*mSatom/mSO2mol
     
    295369        ENDIF ! emission grid cell
    296370      ENDDO ! klon loop
     371
     372     ENDIF ! Condition over injection dates
    297373
    298374    CASE(3) ! --- SAI injection over a single band of longitude and between
Note: See TracChangeset for help on using the changeset viewer.