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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 30 - (show annotations)
Thu Apr 1 09:07:28 2010 UTC (14 years, 1 month ago) by guez
File size: 6474 byte(s)
Imported Source files of the external library "IOIPSL_Lionel" into
"libf/IOIPSL".

Split "cray.f90" into "scopy.f90" and "ssum.f90".

Rewrote "leapfrog" in order to have a clearer algorithmic structure.

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 flincom, 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 flincom, 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) = SPLINT(ax, ay, yder, pls_in(ii, ij, il))
200 END do
201 ENDDO
202 ENDDO
203 var3d(iml, :, :) = var3d(1, :, :)
204
205 END subroutine start_inter_3d
206
207 END MODULE startdyn

  ViewVC Help
Powered by ViewVC 1.1.21