LMDZ
press_coefoz_m.F90
Go to the documentation of this file.
1 ! $Id$
3 
4  implicit none
5 
6  real, pointer, save:: plev(:)
7  ! (pressure level of Mobidic input data, converted to Pa, in strictly
8  ! ascending order)
9 
10  real, allocatable, save:: press_in_edg(:)
11  ! (edges of pressure intervals for Mobidic input data, in Pa, in strictly
12  ! ascending order)
13 
14 contains
15 
16  subroutine press_coefoz
17 
18  ! This procedure is called once per "gcm" run.
19  ! A single thread of the root process reads the pressure levels
20  ! from "coefoz_LMDZ.nc" and broadcasts them to the other processes.
21 
22  ! We assume that, in "coefoz_LMDZ.nc", the pressure levels are in hPa
23  ! and in strictly ascending order.
24 
25  use netcdf95, only: nf95_open, nf95_close, nf95_gw_var, nf95_inq_varid
26  use netcdf, only: nf90_nowrite
27 
29  use mod_phys_lmdz_mpi_transfert, only: bcast_mpi ! broadcast
30 
31  ! Variables local to the procedure:
32  integer ncid, varid ! for NetCDF
33  integer n_plev ! number of pressure levels in the input data
34  integer k
35 
36  !---------------------------------------
37 
38  !$omp single
39  print *, "Call sequence information: press_coefoz"
40 
41  if (is_mpi_root) then
42  call nf95_open("coefoz_LMDZ.nc", nf90_nowrite, ncid)
43 
44  call nf95_inq_varid(ncid, "plev", varid)
45  call nf95_gw_var(ncid, varid, plev)
46  ! Convert from hPa to Pa because "paprs" and "pplay" are in Pa:
47  plev = plev * 100.
48  n_plev = size(plev)
49 
50  call nf95_close(ncid)
51  end if
52 
53  call bcast_mpi(n_plev)
54  if (.not. is_mpi_root) allocate(plev(n_plev))
55  call bcast_mpi(plev)
56 
57  ! Compute edges of pressure intervals:
58  allocate(press_in_edg(n_plev + 1))
59  if (is_mpi_root) then
60  press_in_edg(1) = 0.
61  ! We choose edges halfway in logarithm:
62  DO k = 2,n_plev
63  press_in_edg(k) = sqrt(plev(k - 1) * plev(k))
64  ENDDO
65  press_in_edg(n_plev + 1) = huge(0.)
66  ! (infinity, but any value guaranteed to be greater than the
67  ! surface pressure would do)
68  end if
70  !$omp end single
71 
72  end subroutine press_coefoz
73 
74 end module press_coefoz_m
real, dimension(:), allocatable, save press_in_edg
subroutine press_coefoz
real, dimension(:), pointer, save plev