/[lmdze]/trunk/libf/dyn3d/startdyn.f90
ViewVC logotype

Contents of /trunk/libf/dyn3d/startdyn.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (show annotations)
Fri Jul 25 19:59:34 2008 UTC (15 years, 10 months ago) by guez
File size: 6443 byte(s)
-- Minor change of behaviour:

"etat0" does not compute "rugsrel" nor "radpas". Deleted arguments
"radpas" and "rugsrel" of "phyredem". Deleted argument "rugsrel" of
"phyetat0". "startphy.nc" does not contain the variable "RUGSREL". In
"physiq", "rugoro" is set to 0 if not "ok_orodr". The whole program
"etat0_lim" does not use "clesphys2".

-- Minor modification of input/output:

Created subroutine "read_clesphys2". Variables of "clesphys2" are read
in "read_clesphys2" instead of "conf_gcm". "printflag" does not print
variables of "clesphys2".

-- Should not change any result at run time:

References to module "numer_rec" instead of individual modules of
"Numer_rec_Lionel".

Deleted argument "clesphy0" of "calfis", "physiq", "conf_gcm",
"leapfrog", "phyetat0". Deleted variable "clesphy0" in
"gcm". "phyetat0" does not modify variables of "clesphys2".

The program unit "gcm" does not modify "itau_phy".

Added some "intent" attributes.

"regr11_lint" does not call "polint".

1 MODULE startdyn
2
3 ! From startvar.F, version 1.4
4 ! 2006/01/27 15:14:22 Fairhead
5
6 IMPLICIT NONE
7
8 private
9 public start_init_dyn, start_inter_3d
10
11 INTEGER fid_dyn, iml_dyn, jml_dyn, llm_dyn, ttm_dyn
12
13 REAL, ALLOCATABLE:: lon_ini(:), lat_ini(:)
14 ! (longitude and latitude from the input file, converted to rad)
15
16 real, ALLOCATABLE:: levdyn_ini(:)
17
18 CONTAINS
19
20 SUBROUTINE start_init_dyn(tsol_2d, psol)
21
22 ! Host associated variables appearing and modified in this procedure :
23 ! iml_dyn, jml_dyn, llm_dyn, ttm_dyn, fid_dyn, lon_ini, lat_ini, levdyn_ini
24
25 USE ioipsl, only: flininfo, flinopen_nozoom, flinget
26 use comgeom, only: aire_2d, apoln, apols
27 use conf_dat2d_m, only: conf_dat2d
28 use inter_barxy_m, only: inter_barxy
29 use comconst, only: pi
30 use comgeom, only: rlonu, rlatv
31 use dimens_m, only: iim, jjm
32 use gr_int_dyn_m, only: gr_int_dyn
33 use start_init_orog_m, only: phis
34 use start_init_phys_m, only: start_init_phys
35
36 REAL, intent(out):: tsol_2d(:, :)
37 REAL, intent(out):: psol(:, :) ! surface pressure, in Pa
38
39 ! Local:
40
41 REAL date, dt
42 INTEGER itau(1)
43 INTEGER i, j
44
45 CHARACTER(len=120) physfname
46
47 REAL, ALLOCATABLE:: lon_rad(:), lat_rad(:)
48
49 REAL, ALLOCATABLE:: lon_dyn(:, :), lat_dyn(:, :)
50 ! (longitude and latitude from the input file, in rad or degrees)
51
52 REAL, ALLOCATABLE:: var_ana(:, :), z(:, :)
53 real tmp_var(iim, jjm + 1)
54 REAL, ALLOCATABLE:: xppn(:), xpps(:)
55
56 !--------------------------
57
58 print *, "Call sequence information: start_init_dyn"
59 if (any((/size(tsol_2d, 1), size(psol, 1)/) /= iim + 1)) stop &
60 "start_init_phys size 1"
61 if (any((/size(tsol_2d, 2), size(psol, 2)/) /= jjm + 1)) stop &
62 "start_init_phys size 2"
63 physfname = 'ECDYN.nc'
64 print *, 'Opening the surface analysis'
65 CALL flininfo(physfname, iml_dyn, jml_dyn, llm_dyn, ttm_dyn, fid_dyn)
66 print *, 'Values read from "' // trim(physfname) // '":'
67 print *, "iml_dyn = ", iml_dyn, ", jml_dyn = ", jml_dyn, &
68 ", llm_dyn = ", llm_dyn, ", ttm_dyn = ", ttm_dyn
69
70 ALLOCATE(lat_dyn(iml_dyn, jml_dyn))
71 ALLOCATE(lon_dyn(iml_dyn, jml_dyn))
72 ALLOCATE(levdyn_ini(llm_dyn))
73
74 CALL flinopen_nozoom(physfname, iml_dyn, jml_dyn, llm_dyn, &
75 lon_dyn, lat_dyn, levdyn_ini, ttm_dyn, itau, date, dt, fid_dyn)
76
77 ALLOCATE(var_ana(iml_dyn, jml_dyn))
78 ALLOCATE(lon_rad(iml_dyn))
79 ALLOCATE(lon_ini(iml_dyn))
80
81 IF (MAXVAL(lon_dyn(:, :)) > pi) THEN
82 ! Assume "lon_dyn" is in degrees
83 lon_ini(:) = lon_dyn(:, 1) * pi / 180.
84 ELSE
85 lon_ini(:) = lon_dyn(:, 1)
86 ENDIF
87
88 ALLOCATE(lat_rad(jml_dyn))
89 ALLOCATE(lat_ini(jml_dyn))
90
91 IF (MAXVAL(lat_dyn(:, :)) > pi) THEN
92 lat_ini(:) = lat_dyn(1, :) * pi / 180.
93 ELSE
94 lat_ini(:) = lat_dyn(1, :)
95 ENDIF
96
97 ALLOCATE(z(iim + 1, jjm + 1))
98
99 ! 'Z': Surface geopotential
100 CALL flinget(fid_dyn, 'Z', iml_dyn, jml_dyn, 0, ttm_dyn, 1, 1, var_ana)
101 CALL conf_dat2d(lon_ini, lat_ini, lon_rad, lat_rad, var_ana)
102 CALL inter_barxy(lon_rad, lat_rad(:jml_dyn -1), var_ana, rlonu(:iim), &
103 rlatv, tmp_var)
104 z(:, :) = gr_int_dyn(tmp_var)
105
106 ! 'SP': Surface pressure
107 CALL flinget(fid_dyn, 'SP', iml_dyn, jml_dyn, 0, ttm_dyn, 1, 1, var_ana)
108 CALL conf_dat2d(lon_ini, lat_ini, lon_rad, lat_rad, var_ana)
109 CALL inter_barxy(lon_rad, lat_rad(:jml_dyn -1), var_ana, rlonu(:iim), &
110 rlatv, tmp_var)
111 psol(:, :) = gr_int_dyn(tmp_var)
112 CALL start_init_phys(tsol_2d)
113
114 ! PSOL is computed in Pascals
115
116 DO j = 1, jjm + 1
117 DO i = 1, iim
118 psol(i, j) = psol(i, j) &
119 * (1. + (z(i, j) - phis(i, j)) / 287. / tsol_2d(i, j))
120 ENDDO
121 ENDDO
122 psol(iim + 1, :) = psol(1, :)
123
124 ALLOCATE(xppn(iim))
125 ALLOCATE(xpps(iim))
126
127 DO i = 1, iim
128 xppn(i) = aire_2d( i, 1) * psol( i, 1)
129 xpps(i) = aire_2d( i, jjm + 1) * psol( i, jjm + 1)
130 ENDDO
131
132 psol(:, 1) = SUM(xppn)/apoln
133 psol(:, jjm + 1) = SUM(xpps)/apols
134
135 END SUBROUTINE start_init_dyn
136
137 !********************************
138
139 function start_inter_3d(varname, lon_in2, lat_in2, pls_in)
140
141 ! This procedure gets a 3D variable from a file and does the
142 ! interpolations needed.
143
144 USE ioipsl, only: flinget
145 use numer_rec, only: assert_eq, spline, splint
146 use inter_barxy_m, only: inter_barxy
147 use gr_int_dyn_m, only: gr_int_dyn
148 use conf_dat3d_m, only: conf_dat3d
149
150 CHARACTER(len=*), intent(in):: varname
151 REAL, intent(in):: lon_in2(:), lat_in2(:)
152 REAL, intent(in):: pls_in(:, :, :)
153
154 REAL start_inter_3d(size(lon_in2), size(pls_in, 2), size(pls_in, 3))
155
156 ! LOCAL:
157 INTEGER iml, jml, lml
158 INTEGER ii, ij, il
159 REAL lon_rad(iml_dyn), lat_rad(jml_dyn)
160 REAL lev_dyn(llm_dyn)
161 REAL var_tmp2d(size(lon_in2)-1, size(pls_in, 2))
162 real var_tmp3d(size(lon_in2), size(pls_in, 2), llm_dyn)
163 REAL ax(llm_dyn), ay(llm_dyn), yder(llm_dyn)
164 real var_ana3d(iml_dyn, jml_dyn, llm_dyn)
165
166 !--------------------------------
167
168 print *, "Call sequence information: start_inter_3d"
169
170 iml = assert_eq(size(pls_in, 1), size(lon_in2), "start_inter_3d iml")
171 jml = size(pls_in, 2)
172 lml = size(pls_in, 3)
173
174 print *, "iml = ", iml, ", jml = ", jml
175 print *, 'Going into flinget to extract the 3D field.'
176 print *, "fid_dyn = ", fid_dyn, ", varname = ", varname
177 print *, "iml_dyn = ", iml_dyn, ", jml_dyn = ", jml_dyn, &
178 ", llm_dyn = ", llm_dyn, ", ttm_dyn = ", ttm_dyn
179 CALL flinget(fid_dyn, varname, iml_dyn, jml_dyn, llm_dyn, ttm_dyn, 1, 1, &
180 var_ana3d)
181
182 CALL conf_dat3d(lon_ini, lat_ini, levdyn_ini, lon_rad, lat_rad, lev_dyn, &
183 var_ana3d)
184
185 DO il = 1, llm_dyn
186 CALL inter_barxy(lon_rad, lat_rad(:jml_dyn-1), var_ana3d(:, :, il), &
187 lon_in2(:iml-1), lat_in2, var_tmp2d)
188 var_tmp3d(:, :, il) = gr_int_dyn(var_tmp2d)
189 ENDDO
190
191 ! Pour l'interpolation verticale, on interpole du haut de l'atmosphère
192 ! vers le sol :
193 ax(:) = lev_dyn(llm_dyn:1:-1)
194 DO ij=1, jml
195 DO ii=1, iml-1
196 ay(:) = var_tmp3d(ii, ij, llm_dyn:1:-1)
197 yder(:) = SPLINE(ax, ay)
198 do il=1, lml
199 start_inter_3d(ii, ij, il) &
200 = SPLINT(ax, ay, yder, pls_in(ii, ij, il))
201 END do
202 ENDDO
203 ENDDO
204 start_inter_3d(iml, :, :) = start_inter_3d(1, :, :)
205
206 END function start_inter_3d
207
208 END MODULE startdyn

  ViewVC Help
Powered by ViewVC 1.1.21