Ignore:
Timestamp:
Mar 10, 2017, 5:46:08 PM (8 years ago)
Author:
dcugnet
Message:

Fix and cleaning/improvements over the previous commit:

  • Old style climoz files are handled without trouble.
  • New style climoz (monthly with 14 records or daily) are handled

with the same read_climoz key values (1 or 2).

  • Daily files reading activation is done using the same key

used in ce0l to create them: ok_daily_climoz=y. This key is now
put to FALSE by default (old style 360 days files are not considered
as daily).

File:
1 edited

Legend:

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

    r2819 r2820  
    22MODULE regr_pr_time_av_m
    33
     4  USE print_control_mod, ONLY: lunout
    45  USE write_field_phy
    56  USE mod_phys_lmdz_transfert_para, ONLY: bcast
     
    117118  CHARACTER(LEN=80)  :: sub
    118119  CHARACTER(LEN=320) :: msg
    119   INTEGER :: vID, ncerr, n_var, nlev_in, ndim, i, ibot, itop, itrp, itrp0
    120   LOGICAL :: ltrop                            !--- Need to adjust tropopause
     120  INTEGER :: vID, ncerr, n_var, nlev_in,ntim_in, ndim, i, ibot, itop, itrp,itrp0
     121  LOGICAL :: lAdjTro                          !--- Need to adjust tropopause
    121122  REAL    :: y_frac                           !--- Elapsed year fraction
    122123  REAL    :: alpha, beta, al                  !--- For strectching/interpolation
     
    137138!-------------------------------------------------------------------------------
    138139  sub="regr_pr_time_av"
    139   nlev_in=SIZE(pint_in)-1
     140  nlev_in=SIZE(pint_in)-1; ntim_in=SIZE(time_in)
    140141  CALL assert(SIZE(v3,1)==klon,                 TRIM(sub)//" v3 klon")
    141142  CALL assert(SIZE(v3,2)==nbp_lev,              TRIM(sub)//" v3 nbp_lev")
     
    145146  IF(PRESENT(ptrop_ou)) CALL assert(SIZE(ptrop_ou)==klon,TRIM(sub)//" ptrop_ou klon")
    146147  IF(PRESENT(pcen_in))  CALL assert(SIZE(pcen_in)==nlev_in,TRIM(sub)//" pcen_in")
    147   ltrop=PRESENT(lat_in).AND.PRESENT(pcen_in).AND.PRESENT(ptrop_ou)
     148  lAdjTro=PRESENT(ptrop_ou)
     149  IF(lAdjTro.AND.(.NOT.PRESENT(lat_in).OR..NOT.PRESENT(pcen_in))) &
     150  CALL abort_physic(sub, 'Missing lat_in and/or pcen_in (adjust_tropopause=T)', 1)
    148151
    149152  !$OMP MASTER
     
    155158      lPrTrop=NF90_INQ_VARID(fID,"tropopause_air_pressure",vID)==NF90_NOERR
    156159      lO3Trop=NF90_INQ_VARID(fID,"tro3_at_tropopause"     ,vID)==NF90_NOERR
    157       linterp=PRESENT(time_in)
    158       IF(linterp) linterp=SIZE(time_in,1)==14
     160      linterp=PRESENT(time_in); IF(linterp) linterp=ntim_in==14
    159161      IF(linterp) THEN
    160162        ALLOCATE(v1m(nbp_lon,nbp_lat,nlev_in,n_var))
     
    165167      END IF
    166168      !--- INITIAL INDEX: LOCATE A LAYER WELL ABOVE TROPOPAUSE (50hPa)
    167       IF(PRESENT(pcen_in)) THEN
    168         itrp0=locate(pcen_in,prtrop)
    169       ELSE
    170         itrp0=locate(SQRT(pint_in(1:nlev_in)*pint_in(2:nlev_in+1)),prtrop)
    171       END IF
    172       IF(lPrSurf) WRITE(*,*)' >> Using GROUND PRESSURE from input O3 forcing file.'
    173       IF(linterp) WRITE(*,*)' >> Monthly O3 files => ONLINE TIME INTERPOLATION.'
    174       WRITE(*,*)' >> o3 forcing file tropopause location uses:'
    175       IF(lPrTrop) THEN;      WRITE(*,*)'    PRESSURE AT TROPOPAUSE from file.'
    176       ELSE IF(lO3Trop) THEN; WRITE(*,*)'    O3 CONCENTRATION AT TROPOPAUSE from file.'
    177       ELSE;                  WRITE(*,*)'    PARAMETRIZATION of O3 concentration at tropopause.'
     169      IF(lAdjTro) itrp0=locate(pcen_in,prtrop)
     170      IF(lPrSurf) WRITE(lunout,*)TRIM(sub)//': Using GROUND PRESSURE from input O3 forcing file.'
     171      IF(linterp) WRITE(lunout,*)TRIM(sub)//': Monthly O3 files => ONLINE TIME INTERPOLATION.'
     172      IF(lAdjTro) THEN
     173        WRITE(lunout,*)TRIM(sub)//': o3 forcing file tropopause location uses:'
     174        IF(lPrTrop) THEN
     175          WRITE(lunout,*)'    PRESSURE AT TROPOPAUSE from file.'
     176        ELSE IF(lO3Trop) THEN
     177          WRITE(lunout,*)'    O3 CONCENTRATION AT TROPOPAUSE from file.'
     178        ELSE
     179          WRITE(lunout,*)'    PARAMETRIZED O3 concentration at tropopause.'
     180        END IF
    178181      END IF
    179182    END IF
    180183
    181184    !=== UPDATE (ALWAYS FOR DAILY FILES, EACH MONTH FOR MONTHLY FILES)
    182     IF(.NOT.linterp.OR.(linterp.AND.(lfirst.OR.julien>=time_in(irec+1)))) &
    183       CALL update_fields()
     185    CALL update_fields()
     186
    184187
    185188    !=== TIME INTERPOLATION FOR MONTHLY INPUT FILES
    186189    IF(linterp) THEN
    187       WRITE(*,'(3(a,f7.3))')'  >> Interpolating O3 at julian day ',julien,     &
    188       &' from forcing fields at times ',time_in(irec),' and ', time_in(irec+1)
     190      WRITE(lunout,'(3(a,f7.3))')TRIM(sub)//': Interpolating O3 at julian day '&
     191      &,julien,' from fields at times ',time_in(irec),' and ', time_in(irec+1)
    189192      al=(time_in(irec+1)-julien)/(time_in(irec+1)-time_in(irec))
    190193      v1=al*v1m+(1.-al)*v1p
     
    195198  END IF
    196199  !$OMP END MASTER
     200  IF(lfirst) THEN
     201    lfirst=.FALSE. ;     CALL bcast(lfirst) ; CALL bcast(lPrSurf)
     202    CALL bcast(lPrTrop); CALL bcast(lO3Trop); CALL bcast(linterp)
     203    IF(lAdjTro) CALL bcast(itrp0)
     204  END IF
    197205  CALL scatter2d(v1,v2)
    198   CALL bcast(itrp0)
    199206  !--- No "ps" in input file => assumed to be equal to current LMDZ ground press
    200207  IF(lPrSurf) THEN; CALL scatter2d(ps1,ps2); ELSE; ps2=Pint_ou(:,1); END IF
     
    203210
    204211  !--- REGRID IN PRESSURE ; 3rd index inverted because "paprs" is decreasing
    205   IF(.NOT.ltrop) THEN
     212  IF(.NOT.lAdjTro) THEN
    206213    DO i=1,klon
    207214      CALL regr_conserv(1,v2(i,:,:) , Pint_in , Pint_ou(i,nbp_lev+1:1:-1),    &
     
    245252!-------------------------------------------------------------------------------
    246253  IF(.NOT.linterp) THEN                 !=== DAILY FILES: NO TIME INTERPOLATION
    247     WRITE(*,*)' >> Updating Ozone forcing field: read from file.'
    248     irec=INT(julien)+1                  !--- irec is just the julian day number
     254    WRITE(lunout,*)TRIM(sub)//': Updating Ozone forcing field: read from file.'
     255    irec=MIN(INT(julien)+1,ntim_in)     !--- irec is just the julian day number
     256    !--- MIN -> Security in the unlikely case of roundup errors.
    249257    CALL get_3Dfields(v1)               !--- Read ozone field(s)
    250     IF(ltrop) THEN                      !--- Additional files for fields strain
     258    IF(lAdjTro) THEN                    !--- Additional files for fields strain
    251259      IF(lPrSurf) CALL get_2Dfield(ps1,"ps")
    252260      IF(lPrTrop) CALL get_2Dfield(pt1,"tropopause_air_pressure")
     
    254262    END IF
    255263  ELSE                                  !=== MONTHLY FILES: GET 2 NEAREST RECS
    256     WRITE(*,*)' >> Refreshing adjacent Ozone forcing fields.'
     264    IF(.NOT.lfirst.AND.julien<time_in(irec+1)) RETURN
     265    WRITE(lunout,*)TRIM(sub)//': Refreshing adjacent Ozone forcing fields.'
    257266    IF(lfirst) THEN                     !=== READ EARLIEST TIME FIELDS
    258267      irec=locate(time_in,julien)       !--- Need to locate surrounding times
    259268      CALL get_3Dfields(v1m)            !--- Read ozone field(s)
    260       IF(ltrop) THEN                    !--- Additional files for fields strain
     269      IF(lAdjTro) THEN                  !--- Additional files for fields strain
    261270        IF(lPrSurf) CALL get_2Dfield(psm,"ps")
    262271        IF(lPrTrop) CALL get_2Dfield(ptm,"tropopause_air_pressure")
     
    265274    ELSE                                !=== SHIFT FIELDS
    266275      v1m=v1p                           !--- Ozone fields
    267       IF(ltrop) THEN                    !--- Additional files for fields strain
     276      IF(lAdjTro) THEN                  !--- Additional files for fields strain
    268277        IF(lPrSurf) psm=psp             !--- Surface pressure
    269278        IF(lPrTrop) ptm=ptp             !--- Tropopause pressure
     
    273282    irec=irec+1
    274283    CALL get_3Dfields(v1p)              !--- Read ozone field(s)
    275     IF(ltrop) THEN                      !--- Additional files for fields strain
     284    IF(lAdjTro) THEN                    !--- Additional files for fields strain
    276285      IF(lPrSurf) CALL get_2Dfield(psp,"ps")
    277286      IF(lPrTrop) CALL get_2Dfield(ptp,"tropopause_air_pressure")
     
    280289    IF(lfirst) irec=irec-1
    281290  END IF
    282   lfirst=.FALSE.
    283   CALL bcast(lfirst)
    284291
    285292END SUBROUTINE update_fields
Note: See TracChangeset for help on using the changeset viewer.