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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 23 - (hide 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 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     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 guez 23 subroutine start_inter_3d(varname, lon_in2, lat_in2, pls_in, var3d)
140 guez 3
141     ! This procedure gets a 3D variable from a file and does the
142     ! interpolations needed.
143    
144     USE ioipsl, only: flinget
145 guez 13 use numer_rec, only: assert_eq, spline, splint
146 guez 3 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 guez 23 REAL, intent(out):: var3d(:, :, :)
154 guez 3
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 guez 23 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 guez 3
174     print *, "iml = ", iml, ", jml = ", jml
175 guez 23 print *, "varname = ", varname
176 guez 3 print *, "iml_dyn = ", iml_dyn, ", jml_dyn = ", jml_dyn, &
177     ", llm_dyn = ", llm_dyn, ", ttm_dyn = ", ttm_dyn
178 guez 20 print *, 'Going into flinget to extract the 3D field.'
179 guez 3 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 guez 23 var3d(ii, ij, il) &
200 guez 3 = SPLINT(ax, ay, yder, pls_in(ii, ij, il))
201     END do
202     ENDDO
203     ENDDO
204 guez 23 var3d(iml, :, :) = var3d(1, :, :)
205 guez 3
206 guez 23 END subroutine start_inter_3d
207 guez 3
208     END MODULE startdyn

  ViewVC Help
Powered by ViewVC 1.1.21