source: LMDZ5/tags/proto-testing-20131015/libf/phylmd/press_coefoz_m.F90 @ 1893

Last change on this file since 1893 was 1664, checked in by Laurent Fairhead, 12 years ago

Version testing basée sur la r1575


Testing release based on r1575

File size: 2.1 KB
Line 
1! $Id$
2module press_coefoz_m
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
14contains
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
28    use mod_phys_lmdz_mpi_data, only: is_mpi_root
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
69    call bcast_mpi(press_in_edg)
70    !$omp end single
71
72  end subroutine press_coefoz
73
74end module press_coefoz_m
Note: See TracBrowser for help on using the repository browser.