Changeset 5111 for LMDZ6/branches/Amaury_dev/libf/phylmd/open_climoz_m.F90
- Timestamp:
- Jul 24, 2024, 12:17:33 PM (4 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/phylmd/open_climoz_m.F90
r5110 r5111 7 7 CONTAINS 8 8 9 !-------------------------------------------------------------------------------9 !------------------------------------------------------------------------------- 10 10 11 SUBROUTINE open_climoz(ncid, press_in_cen, press_in_edg, time_in, daily, adjust)11 SUBROUTINE open_climoz(ncid, press_in_cen, press_in_edg, time_in, daily, adjust) 12 12 13 !------------------------------------------------------------------------------- 14 USE netcdf95, ONLY: nf95_open, nf95_close, nf95_gw_var, nf95_inq_varid 15 USE netcdf, ONLY: nf90_nowrite 16 USE lmdz_phys_mpi_data, ONLY: is_mpi_root 17 USE lmdz_phys_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) 13 !------------------------------------------------------------------------------- 14 USE netcdf95, ONLY: nf95_open, nf95_close, nf95_gw_var, nf95_inq_varid 15 USE netcdf, ONLY: nf90_nowrite 16 USE lmdz_phys_mpi_data, ONLY: is_mpi_root 17 USE lmdz_phys_mpi_transfert, ONLY: bcast_mpi 18 USE phys_cal_mod, ONLY: calend, year_len, year_cur 19 USE lmdz_abort_physic, ONLY: abort_physic 20 !------------------------------------------------------------------------------- 21 ! Purpose: This procedure should be called once per "gcm" run, by a single 22 ! thread of each MPI process. 23 ! The root MPI process opens "climoz_LMDZ.nc", reads the pressure 24 ! levels and the times and broadcasts them to the other processes. 25 ! We assume that, in "climoz_LMDZ.nc", the pressure levels are in hPa 26 ! and in strictly ascending order. 27 !------------------------------------------------------------------------------- 28 ! Arguments (OpenMP shared): 29 INTEGER, INTENT(OUT) :: ncid !--- "climoz_LMDZ.nc" identifier 30 REAL, allocatable, intent(out) :: press_in_cen(:) !--- at cells centers 31 REAL, allocatable, INTENT(OUT) :: press_in_edg(:) !--- at the interfaces (pressure intervals) 32 REAL, allocatable, intent(out) :: time_in(:) !--- records times, in days since Jan. 1st 33 LOGICAL, INTENT(IN) :: daily !--- daily files (calendar dependent days nb) 34 LOGICAL, INTENT(IN) :: adjust !--- tropopause adjustement required 35 ! pressure levels press_in_cen/edg are in Pa a,d strictly ascending order. 36 ! time_in is only used for monthly files (14 records) 37 !------------------------------------------------------------------------------- 38 ! Local variables: 39 INTEGER :: varid !--- NetCDF variables identifier 40 INTEGER :: nlev, ntim !--- pressure levels and time records numbers 41 CHARACTER(LEN = 80) :: sub 42 CHARACTER(LEN = 320) :: msg 43 !------------------------------------------------------------------------------- 44 sub = "open_climoz" 45 WRITE(lunout, *)"Entering routine " // TRIM(sub) 45 46 46 IF(is_mpi_root) THEN47 IF(is_mpi_root) THEN 47 48 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)49 !--- OPEN FILE, READ PRESSURE LEVELS AND TIME VECTOR 50 CALL nf95_open("climoz_LMDZ.nc", nf90_nowrite, ncid) 51 CALL nf95_inq_varid(ncid, "plev", varid) 52 CALL nf95_gw_var(ncid, varid, press_in_cen) 53 ! Convert from hPa to Pa because "paprs" and "pplay" are in Pa: 54 press_in_cen = press_in_cen * 100. 55 nlev = SIZE(press_in_cen) 56 CALL nf95_inq_varid(ncID, "time", varID) 57 CALL nf95_gw_var(ncid, varid, time_in) 58 ntim = SIZE(time_in) 58 59 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.)]60 !--- BUILD EDGES OF PRESSURE INTERVALS: HALFWAY IN LOGARITHMS 61 ALLOCATE(press_in_edg(nlev + 1)) 62 press_in_edg = [0., SQRT(press_in_cen(1:nlev - 1) * press_in_cen(2:nlev)), HUGE(0.)] 62 63 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) 64 !--- CHECK RECORDS NUMBER AND DISPLAY CORRESPONDING INFORMATION 65 IF(daily.AND.ntim/=year_len) THEN 66 WRITE(msg, '(a,3(i4,a))')TRIM(sub) // ': Expecting a daily ozone file with', & 67 year_len, ' records (year ', year_cur, ') ; found ', ntim, ' instead' 68 CALL abort_physic(sub, msg, 1) 69 ELSE IF(ALL([360, 14]/=ntim)) THEN 70 WRITE(msg, '(a,i4,a)')TRIM(sub) // ': Expecting an ozone file with 14 (mont'& 71 // 'hly case) or 360 (old style files) records ; found ', ntim, ' instead' 72 CALL abort_physic(sub, msg, 1) 73 ELSE 74 IF(daily) THEN 75 WRITE(msg, '(a,2(i4,a))')'daily file (', ntim, ' days in ', year_cur, ')' 76 ELSE IF(ntim==14) THEN 77 msg = '14 records monthly file' 78 ELSE 79 msg = '360 records files (old convention)' 80 END IF 81 WRITE(lunout, *)TRIM(sub) // ': Using a ' // TRIM(msg) 82 END IF 83 84 !--- MESSAGE ABOUT OPTIONAL STRETCHING FOR TROPOPAUSES MATCHING 85 IF(adjust) THEN 86 WRITE(lunout, *)TRIM(sub) // ': Adjusting O3 field to match gcm tropopause.' 87 ELSE 88 WRITE(lunout, *)TRIM(sub) // ': Interpolating O3 field directly on gcm levels.' 89 END IF 90 81 91 END IF 92 CALL bcast_mpi(nlev) 93 IF(.NOT.is_mpi_root) ALLOCATE(press_in_cen(nlev)); CALL bcast_mpi(press_in_cen) 94 IF(.NOT.is_mpi_root) ALLOCATE(press_in_edg(nlev + 1)); CALL bcast_mpi(press_in_edg) 95 CALL bcast_mpi(ntim) 96 IF(.NOT.is_mpi_root) ALLOCATE(time_in(ntim)); CALL bcast_mpi(time_in) 82 97 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 98 END SUBROUTINE open_climoz 89 99 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 !------------------------------------------------------------------------------- 100 101 101 102 END MODULE open_climoz_m
Note: See TracChangeset
for help on using the changeset viewer.