Changeset 6121 for LMDZ6/trunk/libf/phylmd/open_climoz_m.f90
- Timestamp:
- Mar 23, 2026, 11:29:53 PM (2 weeks ago)
- File:
-
- 1 edited
-
LMDZ6/trunk/libf/phylmd/open_climoz_m.f90 (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/phylmd/open_climoz_m.f90
r6120 r6121 7 7 CONTAINS 8 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_varid15 USE netcdf, ONLY: nf90_nowrite16 USE mod_phys_lmdz_mpi_data, ONLY: is_mpi_root17 USE mod_phys_lmdz_mpi_transfert, ONLY: bcast_mpi18 USE phys_cal_mod, ONLY: calend, year_len, year_cur19 !-------------------------------------------------------------------------------20 ! Purpose: This procedure should be called once per "gcm" run, by a single21 ! thread of each MPI process.22 ! The root MPI process opens "climoz_LMDZ.nc", reads the pressure23 ! levels and the times and broadcasts them to the other processes.24 ! We assume that, in "climoz_LMDZ.nc", the pressure levels are in hPa25 ! and in strictly ascending order.26 !-------------------------------------------------------------------------------27 INTEGER, INTENT(OUT):: ncid !--- "climoz_LMDZ.nc" identifier28 ! Following arguments are OpenMP shared:29 REAL, allocatable, intent(out):: press_in_cen(:) !--- at cells centers30 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. 1st32 LOGICAL, INTENT(IN) :: daily !--- daily files (calendar dependent days nb)33 LOGICAL, INTENT(IN) :: adjust !--- tropopause adjustement required34 ! 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 identifier39 INTEGER :: nlev, ntim !--- pressure levels and time records numbers40 CHARACTER(LEN=80) :: sub41 CHARACTER(LEN=320) :: msg42 !-------------------------------------------------------------------------------43 sub="open_climoz"44 WRITE(lunout,*)"Entering routine "//TRIM(sub)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 INTEGER, INTENT(OUT):: ncid !--- "climoz_LMDZ.nc" identifier 28 ! Following arguments are OpenMP shared: 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 45 46 IF(is_mpi_root) THEN46 IF(is_mpi_root) THEN 47 47 48 !--- OPEN FILE, READ PRESSURE LEVELS AND TIME VECTOR49 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)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 58 59 !--- BUILD EDGES OF PRESSURE INTERVALS: HALFWAY IN LOGARITHMS60 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.)]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 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' 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) 77 72 ELSE 78 msg='360 records files (old convention)' 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) 79 81 END IF 80 WRITE(lunout,*)TRIM(sub)//': Using a '//TRIM(msg) 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 81 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) 82 96 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 !------------------------------------------------------------------------------- 97 END SUBROUTINE open_climoz 98 ! 99 !------------------------------------------------------------------------------- 100 100 101 101 END MODULE open_climoz_m
Note: See TracChangeset
for help on using the changeset viewer.
