GCC Code Coverage Report


Directory: ./
File: phys/open_climoz_m.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 36 0.0%
Branches: 0 48 0.0%

Line Branch Exec Source
1 ! $Id$
2 MODULE open_climoz_m
3
4 USE print_control_mod, ONLY: lunout
5 IMPLICIT NONE
6
7 CONTAINS
8
9 !-------------------------------------------------------------------------------
10 !
11 SUBROUTINE 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, POINTER :: press_in_cen(:) !--- at cells centers
30 REAL, POINTER :: press_in_edg(:) !--- at the interfaces (pressure intervals)
31 REAL, POINTER :: 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
97 END SUBROUTINE open_climoz
98 !
99 !-------------------------------------------------------------------------------
100
101 END MODULE open_climoz_m
102