source: LMDZ4/branches/LMDZ4-dev-20091210/libf/bibio/netcdf95.F90 @ 5065

Last change on this file since 5065 was 1263, checked in by lguez, 15 years ago

1) Reactivated ability to read ozone (that was deactivated because of
dependency on version of IOIPSL). Added ability to read a pressure
coordinate in Pa in "regr_lat_time_climoz".

2) Added the ability to read a second ozone climatology, corresponding to
daylight ozone:

-- "read_climoz" is now an integer variable, instead of a logical
variable.

-- Added argument "read_climoz" to "phys_state_var_init",
"phys_output_open" and "regr_lat_time_climoz".

-- Created new variable "ozone_daylight" for "hist*.nc" output files.

-- Added a third dimension to variable "wo" in module
"phys_state_var_mod" and variable "POZON" in "radlwsw": index 1 for
average day-night ozone, index 2 for daylight ozone.

-- Added a fourth dimension to variables "o3_in", "o3_regr_lat" and
"o3_out" in "regr_lat_time_climoz": index 1 for average day-night
ozone, index 2 for daylight ozone.

-- In "physiq", moved call to "conf_phys" before call to
"phys_state_var_init". Thus, "conf_phys" is now inside the block "if
(first)" instead of "IF (debut)". There were definitions of "bl95_b0"
and "bl95_b1" that were useless because the variables were overwritten
by "conf_phys". Removed those definitions.

-- In "radlwsw", we pass the average day-night ozone to "LW_LMDAR4"
and the daylight ozone, if we have it, to "SW_LMDAR4" or
"SW_AEROAR4". If we do not have a specific field for daylight ozone
then "SW_LMDAR4" or "SW_AEROAR4" just get the average day-night ozone.

-- "regr_lat_time_climoz" now manages latitudes where the input ozone
field is missing at all levels (polar night).

-- Encapsulated "radlwsw" in a module.

3) Modifications to make sequential and parallel versions of
"create_etat0_limit" almost identical:

-- In "dyn3dpar/create_etat0_limit.F". No need to call
"phys_state_var_init", removed "use phys_state_var_mod" statement. No
need for "clesphys.h", removed "include" statement.

-- In "dyn3dpar/etat0_netcdf.F". Added argument "tau_ratqs" in call to
"conf_phys" (this bug was already corrected in "dyn3d"). Moved call to
"inifilr" after call to "infotrac_init" (as in "dyn3d").

4) Other peripheral modifications:

-- Added procedures "nf95_get_att" and "nf95_def_var_scalar" in
NetCDF95 interface. Overloaded "nf95_put_var" with three more
procedures: "nf95_put_var_FourByteReal", "nf95_put_var_FourByteInt",
"nf95_put_var_1D_FourByteInt".

-- Overloaded "regr1_step_av" with one more procedure:
"regr14_step_av". Overloaded "regr3_lint" with one more procedure:
"regr34_lint".

-- Corrected call to "Init_Phys_lmdz" in "dyn3d/create_etat0_limit.F":
the last argument should be an array, not a scalar.

-- Encapsulated "conf_phys" in a module.

-- Splitted module "regr_pr" into "regr_pr_av_m" and "regr_pr_int_m".

5) Tests:

This revision was compared to revision 1259, with optimization options
"debug" and "dev", parallelization options "none", "mpi", "omp" and
"mpi_omp", 1 and 2 MPI processes, 1 and 2 OpenMP threads, with the
compiler "FORTRAN90/SX Version 2.0 for SX-8". Both programs
"create_etat0_limit" and "gcm" were tested. In all cases,
parallelization does not change the results. With "read_climoz = 0" in
the ".def" files, the results of revision 1259 and of this revision
are the same.

File size: 1.6 KB
Line 
1! $Id$
2module netcdf95
3
4  ! Author: Lionel GUEZ
5
6  ! Three criticisms may be made about the Fortran 90 NetCDF interface:
7
8  ! -- NetCDF procedures are usually functions with side effects.
9  ! First, they have "intent(out)" arguments.
10  ! Furthermore, there is obviously data transfer inside the procedures.
11  ! Any data transfer inside a function is considered as a side effect.
12
13  ! -- The caller of a NetCDF procedure usually has to handle the error
14  ! status. NetCDF procedures would be much friendlier if they behaved
15  ! like the Fortran input/output statements. That is, the error status
16  ! should be an optional output argument.
17  ! If the caller does not request the error status and there is an
18  ! error then the NetCDF procedure should produce an error message
19  ! and stop the program.
20
21  ! -- Some procedures use array arguments with assumed size.
22  ! It would be better to use the pointer attribute.
23
24  ! This module produces a NetCDF interface that answers those three
25  ! criticisms for some (not all) procedures.
26
27  ! "nf95_get_att" is more secure than "nf90_get_att" because it
28  ! checks that the "values" argument is long enough and removes the
29  ! null terminator, if any.
30
31  ! This module replaces some of the official NetCDF procedures.
32  ! This module also provides the procedures "handle_err" and "nf95_gw_var".
33
34  ! This module provides only a partial replacement for some generic
35  ! procedures such as "nf90_def_var".
36
37  use nf95_def_var_m
38  use nf95_put_var_m
39  use nf95_gw_var_m
40  use nf95_put_att_m
41  use nf95_get_att_m
42  use simple
43  use handle_err_m
44
45end module netcdf95
Note: See TracBrowser for help on using the repository browser.