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 |
---|