Ignore:
Timestamp:
Oct 11, 2016, 5:28:09 PM (8 years ago)
Author:
Laurent Fairhead
Message:

Bug correction on the ozone reading:
When read_climoz = 1 or 2, values for ozone are read from a file with 360 daily values
so that a special calendar is used to read in the proper values when using a 365/366
day calendar in the model. Problem was the same special calendar was used to define
when the ozone was supposed to be updated resulting in an update that became
desynchronised with the actual change of days in the simulation. (is this making sense?)
Took advantage of this correction to rewrite the ozone update mechanism
LF

File:
1 edited

Legend:

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

    r2657 r2661  
    10161016    ! ascending order
    10171017
    1018     integer, save:: co3i = 0
    1019     !     time index in NetCDF file of current ozone fields
    1020     !$OMP THREADPRIVATE(co3i)
    1021 
    10221018    integer ro3i
    10231019    !     required time index in NetCDF file for the ozone fields, between 1
     
    19131909    ! Prescrire l'ozone et calculer l'albedo sur l'ocean.
    19141910    !
    1915     if (read_climoz >= 1) then
    1916        ! Ozone from a file
    1917        ! Update required ozone index:
    1918        ro3i = int((days_elapsed + jh_cur - jh_1jan) / year_len * 360.) + 1
    1919        if (ro3i == 361) ro3i = 360
    1920        ! (This should never occur, except perhaps because of roundup
    1921        ! error. See documentation.)
    1922        if (ro3i /= co3i) then
    1923           ! Update ozone field:
    1924           if (read_climoz == 1) then
    1925              call regr_pr_av(ncid_climoz, (/"tro3"/), julien=ro3i, &
    1926                   press_in_edg=press_climoz, paprs=paprs, v3=wo)
    1927           else
    1928              ! read_climoz == 2
    1929              call regr_pr_av(ncid_climoz, (/"tro3         ", &
    1930                   "tro3_daylight"/), julien=ro3i, press_in_edg=press_climoz, &
    1931                   paprs=paprs, v3=wo)
    1932           end if
    1933           ! Convert from mole fraction of ozone to column density of ozone in a
    1934           ! cell, in kDU:
    1935           forall (l = 1: read_climoz) wo(:, :, l) = wo(:, :, l) * rmo3 / rmd &
    1936                * zmasse / dobson_u / 1e3
    1937           ! (By regridding ozone values for LMDZ only once every 360th of
    1938           ! year, we have already neglected the variation of pressure in one
    1939           ! 360th of year. So do not recompute "wo" at each time step even if
    1940           ! "zmasse" changes a little.)
    1941           co3i = ro3i
    1942        end if
    1943     ELSEIF (MOD(itap-1,lmt_pas) == 0) THEN
     1911    ! Update ozone if day change
     1912    IF (MOD(itap-1,lmt_pas) == 0) THEN
     1913      IF (read_climoz == 0) THEN
    19441914       ! Once per day, update ozone from Royer:
    1945 
    1946        IF (solarlong0<-999.) then
    1947           ! Generic case with evolvoing season
    1948           zzz=real(days_elapsed+1)
    1949        ELSE IF (abs(solarlong0-1000.)<1.e-4) then
    1950           ! Particular case with annual mean insolation
    1951           zzz=real(90) ! could be revisited
    1952 !          IF (read_climoz/=-1) THEN
    1953 !             abort_message ='read_climoz=-1 is recommended when ' &
    1954 !                  // 'solarlong0=1000.'
    1955 !             CALL abort_physic (modname,abort_message,1)
    1956 !          ENDIF
    1957        ELSE
     1915        IF (solarlong0<-999.) then
     1916           ! Generic case with evolvoing season
     1917           zzz=real(days_elapsed+1)
     1918        ELSE IF (abs(solarlong0-1000.)<1.e-4) then
     1919           ! Particular case with annual mean insolation
     1920           zzz=real(90) ! could be revisited
     1921           IF (read_climoz/=-1) THEN
     1922              abort_message ='read_climoz=-1 is recommended when ' &
     1923                   // 'solarlong0=1000.'
     1924              CALL abort_physic (modname,abort_message,1)
     1925           ENDIF
     1926        ELSE
    19581927          ! Case where the season is imposed with solarlong0
    19591928          zzz=real(90) ! could be revisited
    1960        ENDIF
    1961        wo(:,:,1)=ozonecm(latitude_deg, paprs,read_climoz,rjour=zzz)
     1929        ENDIF
     1930
     1931        wo(:,:,1)=ozonecm(latitude_deg, paprs,read_climoz,rjour=zzz)
     1932      ELSE
     1933        ro3i = int((days_elapsed + jh_cur - jh_1jan) / year_len * 360.) + 1   
     1934        if (ro3i == 361) ro3i = 360
     1935        if (read_climoz == 1) then
     1936           call regr_pr_av(ncid_climoz, (/"tro3"/), julien=ro3i, &
     1937                press_in_edg=press_climoz, paprs=paprs, v3=wo)
     1938        else
     1939           ! read_climoz == 2
     1940           call regr_pr_av(ncid_climoz, (/"tro3         ", &
     1941                "tro3_daylight"/), julien=ro3i, press_in_edg=press_climoz, &
     1942                paprs=paprs, v3=wo)
     1943        end if
     1944        ! Convert from mole fraction of ozone to column density of ozone in a
     1945        ! cell, in kDU:
     1946        forall (l = 1: read_climoz) wo(:, :, l) = wo(:, :, l) * rmo3 / rmd &
     1947             * zmasse / dobson_u / 1e3
     1948        ! (By regridding ozone values for LMDZ only once every 360th of
     1949        ! year, we have already neglected the variation of pressure in one
     1950        ! 360th of year. So do not recompute "wo" at each time step even if
     1951        ! "zmasse" changes a little.)
     1952     
     1953      ENDIF
    19621954    ENDIF
    19631955    !
Note: See TracChangeset for help on using the changeset viewer.