Ignore:
Timestamp:
Nov 25, 2009, 3:02:45 PM (15 years ago)
Author:
Laurent Fairhead
Message:

Les nouvelles routines de lecture des aerosols posent probleme en multiproc. On revient aux routines
precedentes en incluant le traitement du calendrier realiste.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ4/branches/LMDZ4-dev/libf/phylmd/readaerosol.F90

    r1265 r1270  
    77CONTAINS
    88
    9 SUBROUTINE readaerosol(name_aero, type, iyr_in, klev_src, pt_ap, pt_b, pt_out, pt_psurf, pt_load, nbr_tsteps)
     9SUBROUTINE readaerosol(name_aero, type, iyr_in, klev_src, pt_ap, pt_b, pt_out, psurf, load)
    1010
    1111!****************************************************************************************
     
    3434  REAL, POINTER, DIMENSION(:)     :: pt_ap        ! Pointer for describing the vertical levels     
    3535  REAL, POINTER, DIMENSION(:)     :: pt_b         ! Pointer for describing the vertical levels     
    36   REAL, POINTER, DIMENSION(:,:,:) :: pt_out       ! The massvar distributions, DIMENSION(klon,klev_src, nbr_tsteps)
    37   REAL, POINTER, DIMENSION(:,:)   :: pt_psurf     ! The massvar distributions, DIMENSION(klon, nbr_tsteps)
    38   REAL, POINTER, DIMENSION(:,:)   :: pt_load      ! The massvar distributions, DIMENSION(klon, nbr_tsteps)
    39   INTEGER                         :: nbr_tsteps   ! number of timesteps in read file (12 or 14)
     36  REAL, POINTER, DIMENSION(:,:,:) :: pt_out       ! The massvar distributions, DIMENSION(klon, klev_src, 12)
     37  REAL, DIMENSION(klon,12), INTENT(OUT) :: psurf  ! Surface pression for 12 months
     38  REAL, DIMENSION(klon,12), INTENT(OUT) :: load   ! Aerosol mass load in each column for 12 months
    4039
    4140  ! Local variables
    42   CHARACTER(len=4)                  :: cyear
    43   REAL, POINTER, DIMENSION(:,:,:)   :: pt_2
    44   REAL, POINTER, DIMENSION(:,:)     :: psurf2, load2
    45   REAL                              :: p0           ! Reference pressure
    46   INTEGER                           :: iyr1, iyr2, klev_src2
    47   INTEGER                           :: it, k, i
    48   LOGICAL, PARAMETER                :: lonlyone=.FALSE.
     41  CHARACTER(len=4)                :: cyear
     42  REAL, POINTER, DIMENSION(:,:,:) :: pt_2
     43  REAL, DIMENSION(klon,12)        :: psurf2, load2
     44  REAL                            :: p0           ! Reference pressure
     45  INTEGER                         :: iyr1, iyr2, klev_src2
     46  INTEGER                         :: it, k, i
     47  LOGICAL, PARAMETER              :: lonlyone=.FALSE.
    4948
    5049!****************************************************************************************
     
    5756!****************************************************************************************
    5857     cyear='1980'
    59      ! get_aero_fromfile returns pt_out allocated and initialized with data for nbr_tsteps month
    60      ! pt_out has dimensions (klon, klev_src, nbr_tsteps)
    61      CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, pt_psurf, pt_load, nbr_tsteps)
     58     ! get_aero_fromfile returns pt_out allocated and initialized with data for 12 month
     59     ! pt_out has dimensions (klon, klev_src, 12)
     60     CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
    6261     
    6362
     
    6665!****************************************************************************************     
    6766     cyear='.nat'
    68      ! get_aero_fromfile returns pt_out allocated and initialized with data for nbr_tsteps month
    69      ! pt_out has dimensions (klon, klev_src, nbr_tsteps)
    70      CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, pt_psurf, pt_load, nbr_tsteps)
    71 
    72   ELSE IF (type == 'annuel') THEN
    73 ! Read and return data from scenario annual files
    74 !****************************************************************************************     
    75      WRITE(cyear,'(I4)') iyr_in
    76      WRITE(lunout,*) 'get_aero 3 iyr_in=', iyr_in,'   ',cyear
    77      ! get_aero_fromfile returns pt_out allocated and initialized with data for nbr_tsteps month
    78      ! pt_out has dimensions (klon, klev_src, nbr_tsteps)
    79      CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, pt_psurf, pt_load, nbr_tsteps)
    80      
     67     ! get_aero_fromfile returns pt_out allocated and initialized with data for 12 month
     68     ! pt_out has dimensions (klon, klev_src, 12)
     69     CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
    8170     
    8271  ELSE IF (type == 'scenario') THEN
     
    8675        cyear='.nat'
    8776        WRITE(lunout,*) 'get_aero 1 iyr_in=', iyr_in,'   ',cyear
    88         ! get_aero_fromfile returns pt_out allocated and initialized with data for nbr_tsteps month
    89         ! pt_out has dimensions (klon, klev_src, nbr_tsteps)
    90         CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, pt_psurf, pt_load, nbr_tsteps)
     77        ! get_aero_fromfile returns pt_out allocated and initialized with data for 12 month
     78        ! pt_out has dimensions (klon, klev_src, 12)
     79        CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
    9180       
    9281     ELSE IF (iyr_in .GE. 2100) THEN
    9382        cyear='2100'
    9483        WRITE(lunout,*) 'get_aero 2 iyr_in=', iyr_in,'   ',cyear
    95         ! get_aero_fromfile returns pt_out allocated and initialized with data for nbr_tsteps month
    96         ! pt_out has dimensions (klon, klev_src, nbr_tsteps)
    97         CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, pt_psurf, pt_load, nbr_tsteps)
     84        ! get_aero_fromfile returns pt_out allocated and initialized with data for 12 month
     85        ! pt_out has dimensions (klon, klev_src, 12)
     86        CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
    9887       
    9988     ELSE
     
    113102        WRITE(cyear,'(I4)') iyr1
    114103        WRITE(lunout,*) 'get_aero 3 iyr_in=', iyr_in,'   ',cyear
    115         ! get_aero_fromfile returns pt_out allocated and initialized with data for nbr_tsteps month
    116         ! pt_out has dimensions (klon, klev_src, nbr_tsteps)
    117         CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, pt_psurf, pt_load, nbr_tsteps)
     104        ! get_aero_fromfile returns pt_out allocated and initialized with data for 12 month
     105        ! pt_out has dimensions (klon, klev_src, 12)
     106        CALL get_aero_fromfile(name_aero, cyear, klev_src, pt_ap, pt_b, p0, pt_out, psurf, load)
    118107       
    119108        ! If to read two decades:
     
    125114           
    126115           NULLIFY(pt_2)
    127            ! get_aero_fromfile returns pt_2 allocated and initialized with data for nbr_tsteps month
    128            ! pt_2 has dimensions (klon, klev_src, nbr_tsteps)
    129            CALL get_aero_fromfile(name_aero, cyear, klev_src2, pt_ap, pt_b, p0, pt_2, psurf2, load2, nbr_tsteps)
     116           ! get_aero_fromfile returns pt_2 allocated and initialized with data for 12 month
     117           ! pt_2 has dimensions (klon, klev_src, 12)
     118           CALL get_aero_fromfile(name_aero, cyear, klev_src2, pt_ap, pt_b, p0, pt_2, psurf2, load2)
    130119           ! Test for same number of vertical levels
    131120           IF (klev_src /= klev_src2) THEN
     
    135124           
    136125           ! Linare interpolate to the actual year:
    137            DO it=1,nbr_tsteps
     126           DO it=1,12
    138127              DO k=1,klev_src
    139128                 DO i = 1, klon
     
    145134
    146135              DO i = 1, klon
    147                  pt_psurf(i,it) = &
    148                       pt_psurf(i,it) - FLOAT(iyr_in-iyr1)/FLOAT(iyr2-iyr1) * &
    149                       (pt_psurf(i,it) - psurf2(i,it))
    150 
    151                  pt_load(i,it) = &
    152                       pt_load(i,it) - FLOAT(iyr_in-iyr1)/FLOAT(iyr2-iyr1) * &
    153                       (pt_load(i,it) - load2(i,it))
     136                 psurf(i,it) = &
     137                      psurf(i,it) - FLOAT(iyr_in-iyr1)/FLOAT(iyr2-iyr1) * &
     138                      (psurf(i,it) - psurf2(i,it))
     139
     140                 load(i,it) = &
     141                      load(i,it) - FLOAT(iyr_in-iyr1)/FLOAT(iyr2-iyr1) * &
     142                      (load(i,it) - load2(i,it))
    154143              END DO
    155144           END DO
     
    157146           ! Deallocate pt_2 no more needed
    158147           DEALLOCATE(pt_2)
    159            DEALLOCATE(psurf2)
    160            DEALLOCATE(load2)
    161148           
    162149        END IF ! lonlyone
     
    172159
    173160
    174   SUBROUTINE get_aero_fromfile(varname, cyr, klev_src, pt_ap, pt_b, p0, pt_year, pt_psurf_out, pt_load_out, nbr_tsteps)
    175 !****************************************************************************************
    176 ! Read nbr_tsteps month aerosol from file and distribute to local process on physical grid.
     161  SUBROUTINE get_aero_fromfile(varname, cyr, klev_src, pt_ap, pt_b, p0, pt_year, psurf_out, load_out)
     162!****************************************************************************************
     163! Read 12 month aerosol from file and distribute to local process on physical grid.
    177164! Vertical levels, klev_src, may differ from model levels if new file format.
    178165!
     
    210197    REAL, POINTER, DIMENSION(:)           :: pt_b         ! Pointer for describing the vertical levels     
    211198    REAL                                  :: p0           ! Reference pressure value
    212     REAL, POINTER, DIMENSION(:,:,:)       :: pt_year      ! Pointer-variabale from file, nbr_tsteps month, grid : klon,klev_src
    213     REAL, POINTER, DIMENSION(:,:)         :: pt_psurf_out    ! Surface pression for nbr_tsteps months
    214     REAL, POINTER, DIMENSION(:,:)         :: pt_load_out     ! Aerosol mass load in each column
    215     INTEGER                               :: nbr_tsteps ! number of month in file read
     199    REAL, POINTER, DIMENSION(:,:,:)       :: pt_year      ! Pointer-variabale from file, 12 month, grid : klon,klev_src
     200    REAL, DIMENSION(klon,12), INTENT(OUT) :: psurf_out    ! Surface pression for 12 months
     201    REAL, DIMENSION(klon,12), INTENT(OUT) :: load_out     ! Aerosol mass load in each column
    216202
    217203! Local variables
     
    223209    REAL                  :: npole, spole
    224210    REAL, ALLOCATABLE, DIMENSION(:,:,:)   :: varmth
    225     REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: varyear       ! Global variable read from file, nbr_tsteps month
    226     REAL, ALLOCATABLE, DIMENSION(:,:,:)   :: varyear_glo1D !(klon_glo, klev_src, nbr_tsteps)
     211    REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: varyear       ! Global variable read from file, 12 month
     212    REAL, ALLOCATABLE, DIMENSION(:,:,:)   :: varyear_glo1D !(klon_glo, klev_src, 12)
    227213    REAL, ALLOCATABLE, DIMENSION(:)       :: varktmp
    228214
    229     REAL, ALLOCATABLE, DIMENSION(:,:,:)   :: psurf_glo2D
    230     REAL, ALLOCATABLE, DIMENSION(:,:)     :: psurf_glo1D
    231     REAL, ALLOCATABLE, DIMENSION(:,:,:)   :: load_glo2D
    232     REAL, ALLOCATABLE, DIMENSION(:,:)     :: load_glo1D
     215    REAL, DIMENSION(iim,jjm+1,12)         :: psurf_glo2D   ! Surface pression for 12 months on dynamics global grid
     216    REAL, DIMENSION(klon_glo,12)          :: psurf_glo1D   ! -"- on physical global grid
     217    REAL, DIMENSION(iim,jjm+1,12)         :: load_glo2D    ! Load for 12 months on dynamics global grid
     218    REAL, DIMENSION(klon_glo,12)          :: load_glo1D    ! -"- on physical global grid
    233219    REAL, DIMENSION(iim,jjm+1)            :: vartmp
    234220    REAL, DIMENSION(iim)                  :: lon_src              ! longitudes in file
     
    287273          CALL abort_gcm('get_aero_fromfile', 'latitudes do not correspond between file and model',1)
    288274       END IF
    289 
    290 ! 1.5) Check number of month in file opened
    291 !
    292 !**************************************************************************************************
    293        ierr = nf90_inq_dimid(ncid, 'TIME',dimid)
    294 !       ierr = nf90_inq_dimlen(ncid, dimid, nbr_tsteps)
    295        CALL check_err( nf90_inquire_dimension(ncid, dimid, len = nbr_tsteps) )
    296        IF (nbr_tsteps /= 12 .AND. nbr_tsteps /= 14) THEN
    297          CALL abort_gcm('get_aero_fromfile', 'not the right number of months in aerosol file read',1)
    298        ENDIF
    299        write(lunout,*)'get_aero_fromfile: ', nbr_tsteps,' months to read from aerosols file'
    300        call bcast(nbr_tsteps)
    301 
    302 ! 1.6) Allocation of some variables once the number of months in the file has been determined
    303 !
    304 !**************************************************************************************************
    305        ALLOCATE(psurf_glo2D(iim, jjm+1, nbr_tsteps), load_glo2D(iim, jjm+1, nbr_tsteps), stat=ierr)
    306        IF (ierr /= 0) CALL abort_gcm('get_aero_fromfile', 'pb in allocation 0.5',1)
    307        ALLOCATE(psurf_glo1D(klon_glo, nbr_tsteps), load_glo1D(klon_glo, nbr_tsteps), stat=ierr)
    308        IF (ierr /= 0) CALL abort_gcm('get_aero_fromfile', 'pb in allocation 0.5',1)
    309 
    310275
    311276! 2) Check if old or new file is avalabale.
     
    336301       
    337302     ! Allocate variables depending on the number of vertical levels
    338        ALLOCATE(varmth(iim, jjm+1, klev_src), varyear(iim, jjm+1, klev_src, nbr_tsteps), stat=ierr)
     303       ALLOCATE(varmth(iim, jjm+1, klev_src), varyear(iim, jjm+1, klev_src, 12), stat=ierr)
    339304       IF (ierr /= 0) CALL abort_gcm('get_aero_fromfile', 'pb in allocation 1',1)
    340305
     
    358323          CALL check_err( nf90_get_var(ncid, varid, varyear(:,:,:,:)) )
    359324         
    360 ! ++) Read surface pression, nbr_tsteps month in one variable
     325! ++) Read surface pression, 12 month in one variable
    361326!****************************************************************************************
    362327          ! Get variable id
     
    398363! ++) Read the aerosol concentration month by month and concatenate to total variable varyear
    399364!****************************************************************************************
    400           DO imth=1, nbr_tsteps
     365          DO imth=1, 12
    401366             IF (imth.EQ.1) THEN
    402367                cvar=TRIM(varname)//'JAN'
     
    459424         
    460425          ! Inverse vertical levels for varyear
    461           DO imth=1, nbr_tsteps
     426          DO imth=1, 12
    462427             varmth(:,:,:) = varyear(:,:,:,imth) ! use varmth temporarly
    463428             DO k=1, klev_src
     
    490455
    491456!     - Invert latitudes if necessary
    492        DO imth=1, nbr_tsteps
     457       DO imth=1, 12
    493458          IF (invert_lat) THEN
    494459
     
    535500       END DO ! imth
    536501       
    537        ALLOCATE(varyear_glo1D(klon_glo, klev_src, nbr_tsteps), stat=ierr)
     502       ALLOCATE(varyear_glo1D(klon_glo, klev_src, 12), stat=ierr)
    538503       IF (ierr /= 0) CALL abort_gcm('get_aero_fromfile', 'pb in allocation 3',1)
    539504       
     
    567532    ! Allocate space for output pointer variable at local process
    568533    IF (ASSOCIATED(pt_year)) DEALLOCATE(pt_year)
    569     write(lunout,*)'get_aero_fromfile: klon, ...',klon, klev_src, nbr_tsteps
    570     ALLOCATE(pt_year(klon, klev_src, nbr_tsteps), stat=ierr)
    571 !    IF (ierr /= 0) CALL abort_gcm('get_aero_fromfile', 'pb in allocation 5.1',1)
    572     IF (ASSOCIATED(pt_psurf_out)) DEALLOCATE(pt_psurf_out)
    573     ALLOCATE(pt_psurf_out(klon, nbr_tsteps), stat=ierr)
    574 !    IF (ierr /= 0) CALL abort_gcm('get_aero_fromfile', 'pb in allocation 5.2',1)
    575     IF (ASSOCIATED(pt_load_out)) DEALLOCATE(pt_load_out)
    576     ALLOCATE(pt_load_out(klon, nbr_tsteps), stat=ierr)
    577 !    IF (ierr /= 0) CALL abort_gcm('get_aero_fromfile', 'pb in allocation 5.3',1)
     534    ALLOCATE(pt_year(klon, klev_src, 12), stat=ierr)
     535    IF (ierr /= 0) CALL abort_gcm('get_aero_fromfile', 'pb in allocation 5',1)
    578536
    579537    ! Scatter global field to local domain at local process
    580538    CALL scatter(varyear_glo1D, pt_year)
    581     CALL scatter(psurf_glo1D, pt_psurf_out)
    582     CALL scatter(load_glo1D,  pt_load_out)
     539    CALL scatter(psurf_glo1D, psurf_out)
     540    CALL scatter(load_glo1D,  load_out)
    583541
    584542! 7) Test for negative values
Note: See TracChangeset for help on using the changeset viewer.