source: LMDZ6/branches/LMDZ_ECRad/libf/phylmd/open_climoz_m.F90 @ 5450

Last change on this file since 5450 was 4179, checked in by lguez, 3 years ago

Use an external updated NetCDF95 library

Remove NetCDF95 from source files. We want to use an up-to-date
NetCDF95 library to read a NetCDF file containing groups, for aerosol
optical properties. It seems complicated to keep the NetCDF95 library
inside LMDZ because:

  • NetCDF95 now also needs a C compiler. I do not know how to make this work with FCM.


  • NetCDF95 cannot be compiled with the -r8 option: some specific procedures in a generic interface become identical.


  • Secondarily, we would have to change the names of files to adhere to the LMDZ standard. We are not glad to do that every time we update.


For now, we can compile using the options -include and -link of
makelmdz_fcm.

As we use an updated NetCDF95 library, we have to update some of the
calls in LMDZ. Those are the calls to nf95_inquire_variable and
nf95_gw_var which used to take a pointer argument and now take an
allocatable argument.

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
File size: 4.4 KB
Line 
1! $Id$
2MODULE open_climoz_m
3
4  USE print_control_mod, ONLY: lunout
5  IMPLICIT NONE
6
7CONTAINS
8
9!-------------------------------------------------------------------------------
10!
11SUBROUTINE open_climoz(ncid, press_in_cen, press_in_edg, time_in, daily, adjust)
12!
13!-------------------------------------------------------------------------------
14  USE netcdf95, ONLY: nf95_open, nf95_close, nf95_gw_var, nf95_inq_varid
15  USE netcdf,   ONLY: nf90_nowrite
16  USE mod_phys_lmdz_mpi_data,      ONLY: is_mpi_root
17  USE mod_phys_lmdz_mpi_transfert, ONLY: bcast_mpi
18  USE phys_cal_mod,                ONLY: calend, year_len, year_cur
19!-------------------------------------------------------------------------------
20! Purpose: This procedure should be called once per "gcm" run, by a single
21!          thread of each MPI process.
22!          The root MPI process opens "climoz_LMDZ.nc", reads the pressure
23! levels and the times and broadcasts them to the other processes.
24!          We assume that, in "climoz_LMDZ.nc", the pressure levels are in hPa
25! and in strictly ascending order.
26!-------------------------------------------------------------------------------
27! Arguments (OpenMP shared):
28  INTEGER, INTENT(OUT):: ncid      !--- "climoz_LMDZ.nc" identifier
29  REAL, allocatable, intent(out):: press_in_cen(:) !--- at cells centers
30  REAL, allocatable, INTENT(OUT):: press_in_edg(:) !--- at the interfaces (pressure intervals)
31  REAL, allocatable, intent(out):: time_in(:)      !--- records times, in days since Jan. 1st
32  LOGICAL, INTENT(IN) :: daily     !--- daily files (calendar dependent days nb)
33  LOGICAL, INTENT(IN) :: adjust    !--- tropopause adjustement required
34!   pressure levels press_in_cen/edg are in Pa a,d strictly ascending order.
35!   time_in is only used for monthly files (14 records)
36!-------------------------------------------------------------------------------
37! Local variables:
38  INTEGER :: varid                 !--- NetCDF variables identifier
39  INTEGER :: nlev, ntim            !--- pressure levels and time records numbers
40  CHARACTER(LEN=80)  :: sub
41  CHARACTER(LEN=320) :: msg
42!-------------------------------------------------------------------------------
43  sub="open_climoz"
44  WRITE(lunout,*)"Entering routine "//TRIM(sub)
45
46  IF(is_mpi_root) THEN
47
48    !--- OPEN FILE, READ PRESSURE LEVELS AND TIME VECTOR
49    CALL nf95_open("climoz_LMDZ.nc", nf90_nowrite, ncid)
50    CALL nf95_inq_varid(ncid, "plev", varid)
51    CALL nf95_gw_var(ncid, varid, press_in_cen)
52    ! Convert from hPa to Pa because "paprs" and "pplay" are in Pa:
53    press_in_cen = press_in_cen * 100.
54    nlev = SIZE(press_in_cen)
55    CALL NF95_INQ_VARID(ncID, "time", varID)
56    CALL NF95_GW_VAR(ncid, varid, time_in)
57    ntim = SIZE(time_in)
58
59    !--- BUILD EDGES OF PRESSURE INTERVALS: HALFWAY IN LOGARITHMS
60    ALLOCATE(press_in_edg(nlev+1))
61    press_in_edg=[0.,SQRT(press_in_cen(1:nlev-1)*press_in_cen(2:nlev)),HUGE(0.)]
62
63    !--- CHECK RECORDS NUMBER AND DISPLAY CORRESPONDING INFORMATION
64    IF(daily.AND.ntim/=year_len) THEN
65      WRITE(msg,'(a,3(i4,a))')TRIM(sub)//': Expecting a daily ozone file with',&
66     &year_len,' records (year ',year_cur,') ; found ',ntim,' instead'
67      CALL abort_physic(sub, msg, 1)
68    ELSE IF(ALL([360,14]/=ntim)) THEN
69      WRITE(msg,'(a,i4,a)')TRIM(sub)//': Expecting an ozone file with 14 (mont'&
70     &//'hly case) or 360 (old style files) records ; found ',ntim,' instead'
71      CALL abort_physic(sub, msg, 1)
72    ELSE
73      IF(daily) THEN
74         WRITE(msg,'(a,2(i4,a))')'daily file (',ntim,' days in ',year_cur,')'
75       ELSE IF(ntim==14) THEN
76         msg='14 records monthly file'
77       ELSE
78         msg='360 records files (old convention)'
79       END IF
80      WRITE(lunout,*)TRIM(sub)//': Using a '//TRIM(msg)
81    END IF
82
83    !--- MESSAGE ABOUT OPTIONAL STRETCHING FOR TROPOPAUSES MATCHING
84    IF(adjust) THEN
85      WRITE(lunout,*)TRIM(sub)//': Adjusting O3 field to match gcm tropopause.'
86    ELSE
87      WRITE(lunout,*)TRIM(sub)//': Interpolating O3 field directly on gcm levels.'
88    END IF
89
90  END IF
91  CALL bcast_mpi(nlev)
92  IF(.NOT.is_mpi_root) ALLOCATE(press_in_cen(nlev  )); CALL bcast_mpi(press_in_cen)
93  IF(.NOT.is_mpi_root) ALLOCATE(press_in_edg(nlev+1)); CALL bcast_mpi(press_in_edg)
94  CALL bcast_mpi(ntim)
95  IF(.NOT.is_mpi_root) ALLOCATE(time_in(ntim));        CALL bcast_mpi(time_in)
96
97END SUBROUTINE open_climoz
98!
99!-------------------------------------------------------------------------------
100
101END MODULE open_climoz_m
Note: See TracBrowser for help on using the repository browser.