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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 43 - (hide annotations)
Fri Apr 8 12:43:31 2011 UTC (13 years, 1 month ago) by guez
File size: 5959 byte(s)
"start_init_phys" is now called directly by "etat0" instead of through
"start_init_dyn". "qsol_2d" is no longer a variable of module
"start_init_phys_m", it is an argument of
"start_init_phys". "start_init_dyn" now receives "tsol_2d" from
"etat0".

Split file "vlspltqs.f" into "vlspltqs.f90", "vlxqs.f90" and
""vlyqs.f90".

In "start_init_orog", replaced calls to "flin*" by calls to NetCDF95.

1 guez 3 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 guez 32 USE flincom, only: flininfo, flinopen_nozoom
26     use flinget_m, only: flinget
27 guez 3 use comgeom, only: aire_2d, apoln, apols
28     use conf_dat2d_m, only: conf_dat2d
29     use inter_barxy_m, only: inter_barxy
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 guez 39 use nr_util, only: assert, pi
36 guez 3
37 guez 43 REAL, intent(in):: tsol_2d(:, :) ! (iim + 1, jjm + 1)
38     REAL, intent(out):: psol(:, :) ! (iim + 1, jjm + 1) surface pressure, in Pa
39 guez 3
40     ! Local:
41    
42     REAL date, dt
43     INTEGER itau(1)
44     REAL, ALLOCATABLE:: lon_rad(:), lat_rad(:)
45    
46     REAL, ALLOCATABLE:: lon_dyn(:, :), lat_dyn(:, :)
47     ! (longitude and latitude from the input file, in rad or degrees)
48    
49 guez 36 REAL, ALLOCATABLE:: var_ana(:, :)
50     real z(iim + 1, jjm + 1)
51 guez 3 real tmp_var(iim, jjm + 1)
52    
53     !--------------------------
54    
55     print *, "Call sequence information: start_init_dyn"
56 guez 36 call assert((/size(tsol_2d, 1), size(psol, 1)/) == iim + 1, &
57 guez 42 "start_init_dyn size 1")
58 guez 36 call assert((/size(tsol_2d, 2), size(psol, 2)/) == jjm + 1, &
59 guez 42 "start_init_dyn size 2")
60 guez 36 CALL flininfo('ECDYN.nc', iml_dyn, jml_dyn, llm_dyn, ttm_dyn, fid_dyn)
61 guez 3 print *, "iml_dyn = ", iml_dyn, ", jml_dyn = ", jml_dyn, &
62     ", llm_dyn = ", llm_dyn, ", ttm_dyn = ", ttm_dyn
63    
64     ALLOCATE(lat_dyn(iml_dyn, jml_dyn))
65     ALLOCATE(lon_dyn(iml_dyn, jml_dyn))
66     ALLOCATE(levdyn_ini(llm_dyn))
67    
68 guez 32 CALL flinopen_nozoom(iml_dyn, jml_dyn, llm_dyn, &
69 guez 3 lon_dyn, lat_dyn, levdyn_ini, ttm_dyn, itau, date, dt, fid_dyn)
70    
71     ALLOCATE(var_ana(iml_dyn, jml_dyn))
72     ALLOCATE(lon_rad(iml_dyn))
73     ALLOCATE(lon_ini(iml_dyn))
74    
75 guez 36 IF (MAXVAL(lon_dyn) > pi) THEN
76 guez 3 ! Assume "lon_dyn" is in degrees
77 guez 36 lon_ini = lon_dyn(:, 1) * pi / 180.
78 guez 3 ELSE
79 guez 36 lon_ini = lon_dyn(:, 1)
80 guez 3 ENDIF
81    
82     ALLOCATE(lat_rad(jml_dyn))
83     ALLOCATE(lat_ini(jml_dyn))
84    
85 guez 36 IF (MAXVAL(lat_dyn) > pi) THEN
86     lat_ini = lat_dyn(1, :) * pi / 180.
87 guez 3 ELSE
88 guez 36 lat_ini = lat_dyn(1, :)
89 guez 3 ENDIF
90    
91     ! 'Z': Surface geopotential
92     CALL flinget(fid_dyn, 'Z', iml_dyn, jml_dyn, 0, ttm_dyn, 1, 1, var_ana)
93     CALL conf_dat2d(lon_ini, lat_ini, lon_rad, lat_rad, var_ana)
94     CALL inter_barxy(lon_rad, lat_rad(:jml_dyn -1), var_ana, rlonu(:iim), &
95     rlatv, tmp_var)
96 guez 36 z = gr_int_dyn(tmp_var)
97 guez 3
98     ! 'SP': Surface pressure
99     CALL flinget(fid_dyn, 'SP', iml_dyn, jml_dyn, 0, ttm_dyn, 1, 1, var_ana)
100     CALL conf_dat2d(lon_ini, lat_ini, lon_rad, lat_rad, var_ana)
101     CALL inter_barxy(lon_rad, lat_rad(:jml_dyn -1), var_ana, rlonu(:iim), &
102     rlatv, tmp_var)
103 guez 36 psol = gr_int_dyn(tmp_var)
104 guez 3
105 guez 36 psol(:iim, :) = psol(:iim, :) &
106     * (1. + (z(:iim, :) - phis(:iim, :)) / 287. / tsol_2d(:iim, :))
107 guez 3 psol(iim + 1, :) = psol(1, :)
108    
109 guez 36 psol(:, 1) = SUM(aire_2d(:iim, 1) * psol(:iim, 1)) / apoln
110     psol(:, jjm + 1) = SUM(aire_2d(:iim, jjm + 1) * psol(:iim, jjm + 1)) &
111     / apols
112 guez 3
113     END SUBROUTINE start_init_dyn
114    
115     !********************************
116    
117 guez 23 subroutine start_inter_3d(varname, lon_in2, lat_in2, pls_in, var3d)
118 guez 3
119 guez 36 ! This procedure gets a 3D variable from a file and interpolates it.
120 guez 3
121 guez 32 use flinget_m, only: flinget
122 guez 36 use nr_util, only: assert_eq
123     use numer_rec, only: spline, splint
124 guez 3 use inter_barxy_m, only: inter_barxy
125     use gr_int_dyn_m, only: gr_int_dyn
126     use conf_dat3d_m, only: conf_dat3d
127    
128     CHARACTER(len=*), intent(in):: varname
129 guez 36 REAL, intent(in):: lon_in2(:) ! (iml)
130     REAL, intent(in):: lat_in2(:)
131     REAL, intent(in):: pls_in(:, :, :) ! (iml, jml, lml)
132     REAL, intent(out):: var3d(:, :, :) ! (iml, jml, lml)
133 guez 3
134     ! LOCAL:
135     INTEGER iml, jml, lml
136     INTEGER ii, ij, il
137     REAL lon_rad(iml_dyn), lat_rad(jml_dyn)
138     REAL lev_dyn(llm_dyn)
139     REAL var_tmp2d(size(lon_in2)-1, size(pls_in, 2))
140     real var_tmp3d(size(lon_in2), size(pls_in, 2), llm_dyn)
141     REAL ax(llm_dyn), ay(llm_dyn), yder(llm_dyn)
142     real var_ana3d(iml_dyn, jml_dyn, llm_dyn)
143    
144     !--------------------------------
145    
146     print *, "Call sequence information: start_inter_3d"
147    
148 guez 23 iml = assert_eq(size(pls_in, 1), size(lon_in2), size(var3d, 1), &
149     "start_inter_3d iml")
150     jml = assert_eq(size(pls_in, 2), size(var3d, 2), "start_inter_3d jml")
151     lml = assert_eq(size(pls_in, 3), size(var3d, 3), "start_inter_3d lml")
152 guez 3
153     print *, "iml = ", iml, ", jml = ", jml
154 guez 23 print *, "varname = ", varname
155 guez 20 print *, 'Going into flinget to extract the 3D field.'
156 guez 3 CALL flinget(fid_dyn, varname, iml_dyn, jml_dyn, llm_dyn, ttm_dyn, 1, 1, &
157     var_ana3d)
158     CALL conf_dat3d(lon_ini, lat_ini, levdyn_ini, lon_rad, lat_rad, lev_dyn, &
159     var_ana3d)
160    
161     DO il = 1, llm_dyn
162     CALL inter_barxy(lon_rad, lat_rad(:jml_dyn-1), var_ana3d(:, :, il), &
163     lon_in2(:iml-1), lat_in2, var_tmp2d)
164     var_tmp3d(:, :, il) = gr_int_dyn(var_tmp2d)
165     ENDDO
166    
167     ! Pour l'interpolation verticale, on interpole du haut de l'atmosphère
168     ! vers le sol :
169 guez 36 ax = lev_dyn(llm_dyn:1:-1)
170 guez 3 DO ij=1, jml
171     DO ii=1, iml-1
172 guez 36 ay = var_tmp3d(ii, ij, llm_dyn:1:-1)
173     yder = SPLINE(ax, ay)
174 guez 3 do il=1, lml
175 guez 24 var3d(ii, ij, il) = SPLINT(ax, ay, yder, pls_in(ii, ij, il))
176 guez 3 END do
177     ENDDO
178     ENDDO
179 guez 23 var3d(iml, :, :) = var3d(1, :, :)
180 guez 3
181 guez 23 END subroutine start_inter_3d
182 guez 3
183     END MODULE startdyn

  ViewVC Help
Powered by ViewVC 1.1.21