source: LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/press_coefoz_m.F90 @ 3901

Last change on this file since 3901 was 1379, checked in by lguez, 15 years ago

Added optional ozone tracer with chemistry parameterized by Daniel
Cariolle. This tracer is passive: it has no influence on the rest of
the simulation.

Added variable "zmasse" in file "histrac.nc". Corrected long name of
variable "pplay" in "histrac.nc". Changed name of variable "t" to "T"
in "histrac.nc", corrected long name and unit.

In "phytrac", moved definition of "zmasse" toward the beginning of the
procedure, so that "zmasse" can be given as argument to
"traclmdz". Also added arguments "julien", "gmtime" and "xlon" to
"traclmdz". The four additional arguments are required for the ozone
tracer.

In module "traclmdz_mod", factorized declaration "implicit none" that
was in each procedure. There is now an equivalent single declaration
at the module level.

In procedure "traclmdz", removed variable "delp". Use "zmasse * rg"
instead since we now have "zmasse" as an argument.

Tests. Compilations on Brodie only, with optimization options "-debug"
and "-dev", parallelization options "none", "mpi", "omp" and
"mpi_omp", this revision and revision 1373. Run cases with and without
ozone tracer, 1 and 2 MPI processes, 1 and 2 OpenMP
threads. Comparisons of all cases are ok, except for strange
variations in variables "d_tr_cl_RN" and "d_tr_cl_PB" of file
"histrac.nc", variables "RN" and "PB" of "restart.nc", variables
"trs_RN" and "trs_PB" of "restartphy.nc". Relative variations of these
variables between cases are of order 1e-7 or less, after one day of
simulation.

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       forall (k = 2:n_plev) press_in_edg(k) = sqrt(plev(k - 1) * plev(k))
63       press_in_edg(n_plev + 1) = huge(0.)
64       ! (infinity, but any value guaranteed to be greater than the
65       ! surface pressure would do)
66    end if
67    call bcast_mpi(press_in_edg)
68    !$omp end single
69
70  end subroutine press_coefoz
71
72end module press_coefoz_m
Note: See TracBrowser for help on using the repository browser.