/[lmdze]/trunk/dyn3d/startdyn.f
ViewVC logotype

Annotation of /trunk/dyn3d/startdyn.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13 - (hide annotations)
Fri Jul 25 19:59:34 2008 UTC (15 years, 10 months ago) by guez
Original Path: trunk/libf/dyn3d/startdyn.f90
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 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     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 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    
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