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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 23 - (show annotations)
Mon Dec 14 15:25:16 2009 UTC (14 years, 5 months ago) by guez
File size: 6492 byte(s)
Split "orografi.f": one file for each procedure. Put the created files
in new directory "Orography".

Removed argument "vcov" of procedure "sortvarc". Removed arguments
"itau" and "time" of procedure "caldyn0". Removed arguments "itau",
"time" and "vcov" of procedure "sortvarc0".

Removed argument "time" of procedure "dynredem1". Removed NetCDF
variable "temps" in files "start.nc" and "restart.nc", because its
value is always 0.

Removed argument "nq" of procedures "iniadvtrac" and "leapfrog". The
number of "tracers read in "traceur.def" must now be equal to "nqmx",
or "nqmx" must equal 4 if there is no file "traceur.def". Replaced
variable "nq" by constant "nqmx" in "leapfrog".

NetCDF variable for ozone field in "coefoz.nc" must now be called
"tro3" instead of "r".

Fixed bug in "zenang".

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 subroutine start_inter_3d(varname, lon_in2, lat_in2, pls_in, var3d)
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 REAL, intent(out):: var3d(:, :, :)
154
155 ! LOCAL:
156 INTEGER iml, jml, lml
157 INTEGER ii, ij, il
158 REAL lon_rad(iml_dyn), lat_rad(jml_dyn)
159 REAL lev_dyn(llm_dyn)
160 REAL var_tmp2d(size(lon_in2)-1, size(pls_in, 2))
161 real var_tmp3d(size(lon_in2), size(pls_in, 2), llm_dyn)
162 REAL ax(llm_dyn), ay(llm_dyn), yder(llm_dyn)
163 real var_ana3d(iml_dyn, jml_dyn, llm_dyn)
164
165 !--------------------------------
166
167 print *, "Call sequence information: start_inter_3d"
168
169 iml = assert_eq(size(pls_in, 1), size(lon_in2), size(var3d, 1), &
170 "start_inter_3d iml")
171 jml = assert_eq(size(pls_in, 2), size(var3d, 2), "start_inter_3d jml")
172 lml = assert_eq(size(pls_in, 3), size(var3d, 3), "start_inter_3d lml")
173
174 print *, "iml = ", iml, ", jml = ", jml
175 print *, "varname = ", varname
176 print *, "iml_dyn = ", iml_dyn, ", jml_dyn = ", jml_dyn, &
177 ", llm_dyn = ", llm_dyn, ", ttm_dyn = ", ttm_dyn
178 print *, 'Going into flinget to extract the 3D field.'
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 var3d(ii, ij, il) &
200 = SPLINT(ax, ay, yder, pls_in(ii, ij, il))
201 END do
202 ENDDO
203 ENDDO
204 var3d(iml, :, :) = var3d(1, :, :)
205
206 END subroutine start_inter_3d
207
208 END MODULE startdyn

  ViewVC Help
Powered by ViewVC 1.1.21