source: LMDZ4/branches/LMDZ4-dev-20091210/libf/bibio/nf95_get_att_m.F90 @ 4104

Last change on this file since 4104 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.8 KB
Line 
1! $Id$
2module nf95_get_att_m
3
4  implicit none
5
6  interface nf95_get_att
7     module procedure nf95_get_att_text
8  end interface
9
10  private
11  public nf95_get_att
12
13contains
14
15  subroutine nf95_get_att_text(ncid, varid, name, values, ncerr)
16
17    use netcdf, only: nf90_get_att, nf90_inquire_attribute, nf90_noerr
18    use handle_err_m, only: handle_err
19
20    integer,                          intent( in) :: ncid, varid
21    character(len = *),               intent( in) :: name
22    character(len = *),               intent(out) :: values
23    integer, intent(out), optional:: ncerr
24
25    ! Variable local to the procedure:
26    integer ncerr_not_opt
27    integer att_len
28
29    !-------------------
30
31    ! Check that the length of "values" is large enough:
32    ncerr_not_opt = nf90_inquire_attribute(ncid, varid, name, len=att_len)
33    call handle_err("nf95_get_att_text nf90_inquire_attribute " &
34         // trim(name), ncerr_not_opt, ncid, varid)
35    if (len(values) < att_len) then
36       print *, "nf95_get_att_text"
37       print *, "varid = ", varid
38       print *, "attribute name: ", name
39       print *, 'length of "values" is not large enough'
40       print *, "len(values) = ", len(values)
41       print *, "number of characters in attribute: ", att_len
42       stop 1
43    end if
44
45    values = "" ! useless in NetCDF version 3.6.2 or better
46    ncerr_not_opt = nf90_get_att(ncid, varid, name, values)
47    if (present(ncerr)) then
48       ncerr = ncerr_not_opt
49    else
50       call handle_err("nf95_get_att_text", ncerr_not_opt, ncid, varid)
51    end if
52
53    if (att_len >= 1 .and. ncerr_not_opt == nf90_noerr) then
54       ! Remove null terminator, if any:
55       if (iachar(values(att_len:att_len)) == 0) values(att_len:att_len) = " "
56    end if
57
58  end subroutine nf95_get_att_text
59
60end module nf95_get_att_m
Note: See TracBrowser for help on using the repository browser.