/[lmdze]/trunk/phylmd/Mobidic/regr_pr_int.f
ViewVC logotype

Annotation of /trunk/phylmd/Mobidic/regr_pr_int.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 90 - (hide annotations)
Wed Mar 12 21:16:36 2014 UTC (10 years, 2 months ago) by guez
File size: 3111 byte(s)
Removed procedures ini_histday, ini_histhf, write_histday and
write_histhf.

Divided file regr_pr_coefoz.f into regr_pr_av.f and
regr_pr_int.f. (Following LMDZ.) Divided module regr_pr_coefoz into
modules regr_pr_av_m and regr_pr_int_m. Renamed regr_pr_av_coefoz to
regr_pr_av and regr_pr_int_coefoz to regr_pr_int. The idea is that
those procedures are more general than Mobidic.

Removed argument dudyn of calfis and physiq. dudyn is not used either
in LMDZ. Removed computation in calfis of unused variable zpsrf (not
used either in LMDZ). Removed useless computation of dqfi in calfis
(part 62): the results were overwritten. (Same in LMDZ.)

1 guez 90 module regr_pr_int_m
2    
3     implicit none
4    
5     contains
6    
7     subroutine regr_pr_int(ncid, name, julien, top_value, v3)
8    
9     ! "regr_pr_int" stands for "regrid pressure interpolation".
10    
11     ! This procedure reads a 2D latitude-pressure field from a NetCDF
12     ! file, at a given day, regrids the field in pressure to the LMDZ
13     ! vertical grid and packs it to the LMDZ horizontal "physics"
14     ! grid. We assume that, in the input file, the field has 3
15     ! dimensions: latitude, pressure, julian day. We assume that
16     ! latitudes are in ascending order in the input file. We assume
17     ! that the input data is already on the LMDZ "rlatu" latitude
18     ! grid.
19    
20     ! The target vertical LMDZ grid is the grid of mid-layers.
21     ! The input data does not depend on longitude, but the pressure
22     ! at LMDZ mid-layers does.
23     ! Therefore, the values on the LMDZ grid do depend on longitude.
24     ! Regridding is by linear interpolation.
25    
26     use dimens_m, only: iim, jjm, llm
27     use dimphy, only: klon
28     use grid_change, only: dyn_phy
29     use netcdf95, only: nf95_inq_varid, nf95_get_var
30     use nr_util, only: assert
31     use numer_rec_95, only: regr1_lint
32     use press_coefoz_m, only: plev
33     use pressure_var, only: pls
34    
35     integer, intent(in):: ncid ! NetCDF ID of the file
36     character(len=*), intent(in):: name ! of the NetCDF variable
37     integer, intent(in):: julien ! jour julien, 1 <= julien <= 360
38    
39     real, intent(in):: top_value
40     ! (extra value of field at 0 pressure)
41    
42     real, intent(out):: v3(:, :) ! (klon, llm)
43     ! Regridded field on the partial "physics" grid. "v3(i, k)" is at
44     ! longitude "xlon(i)", latitude "xlat(i)", middle of layer "k".
45    
46     ! Variables local to the procedure:
47    
48     integer varid, ncerr ! for NetCDF
49    
50     real v1(jjm + 1, 0:size(plev))
51     ! Input field at day "julien". "v1(j, k >=1)" is at latitude
52     ! "rlatu(j)" and pressure "plev(k)".
53    
54     real v2(iim + 1, jjm + 1, llm)
55     ! Regridded field on the "dynamics" horizontal grid. "v2(i, j, k)"
56     ! is at longitude "rlonv(i)", latitude "rlatu(j)" and pressure
57     ! "pls(i, j, k)".
58    
59     integer i, j, k
60    
61     !--------------------------------------------
62    
63     call assert(shape(v3) == (/klon, llm/), "regr_pr_int")
64    
65     call nf95_inq_varid(ncid, name, varid)
66    
67     ! Get data at the right day from the input file:
68     call nf95_get_var(ncid, varid, v1(:, 1:), start=(/1, 1, julien/))
69     ! Latitudes are in ascending order in the input file while
70     ! "rlatu" is in descending order so we need to invert order:
71     v1(:, 1:) = v1(jjm+1:1:-1, 1:)
72    
73     ! Complete "v1" with the value at 0 pressure:
74     v1(:, 0) = top_value
75    
76     ! Regrid in pressure at each horizontal position:
77     do j = 1, jjm + 1
78     do i = 1, iim
79     if (dyn_phy(i, j)) then
80     v2(i, j, llm:1:-1) &
81     = regr1_lint(v1(j, :), (/0., plev/), pls(i, j, llm:1:-1))
82     ! (invert order of indices because "pls" is in descending order)
83     end if
84     end do
85     end do
86    
87     forall (k = 1:llm) v3(:, k) = pack(v2(:, :, k), dyn_phy)
88    
89     end subroutine regr_pr_int
90    
91     end module regr_pr_int_m

  ViewVC Help
Powered by ViewVC 1.1.21