/[lmdze]/trunk/Sources/dyn3d/Inter_barxy/inter_barx.f
ViewVC logotype

Contents of /trunk/Sources/dyn3d/Inter_barxy/inter_barx.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 225 - (show annotations)
Mon Oct 16 12:35:41 2017 UTC (6 years, 6 months ago) by guez
File size: 4821 byte(s)
LMDZE is now in Fortran 2003 (use of allocatable arguments).

gradsdef was not used.

Change names: [uv]10m to [uv]10m_srf in clmain, y[uv]1 to
[uv]1lay. Remove useless complication: zx_alf[12]. Do not modify
[uv]1lay after initial definition from [uv].

Add [uv]10m_srf to output.

Change names in physiq: [uv]10m to [uv]10m_srf, z[uv]10m to [uv]10m,
corresponding to NetCDF output names.

Remove unused complication couchelimite and useless variable inirnpb
in phytrac.

1 module inter_barx_m
2
3 implicit none
4
5 contains
6
7 function inter_barx(dlonid, fdat, rlonimod)
8
9 ! From dyn3d/inter_barx.F, version 1.1.1.1, 2004/05/19 12:53:06
10
11 ! Authors: Robert Sadourny, P. Le Van
12
13 ! INTERPOLATION BARYCENTRIQUE BASEE SUR LES AIRES
14 ! VERSION UNIDIMENSIONNELLE, EN LONGITUDE .
15
16 use nr_util, only: assert_eq, pi
17
18 REAL, intent(in):: dlonid(:) ! (idatmax)
19 ! abscisses des interfaces des mailles donnees
20
21 real, intent(in):: fdat(:) ! (idatmax) champ de donnees
22
23 real, intent(in):: rlonimod(:) ! (imodmax)
24 ! Abscisses des interfaces des mailles modele. L'indice 1
25 ! correspond a l'interface mailLE 1 / maille 2. Les abscisses sont
26 ! exprim\'ees en degres.
27
28 real inter_barx(size(rlonimod)) ! champ du modele
29
30 ! Local:
31 INTEGER idatmax, imodmax
32 REAL xxid(size(dlonid)+1), xxd(size(dlonid)+1), fdd(size(dlonid)+1)
33 REAL fxd(size(dlonid)+1), xchan(size(dlonid)+1), fdchan(size(dlonid)+1)
34 REAL xxim(size(rlonimod))
35 REAL x0, xim0, dx, dxm
36 REAL chmax
37 integer idat ! indice du champ de donnees, de 1 a idatmax
38 INTEGER imod ! indice du champ du modele, de 1 a imodmax
39 integer i, ichang, id0, id1, nid, idatmax1
40
41 !-----------------------------------------------------
42
43 idatmax = assert_eq(size(dlonid), size(fdat), "inter_barx idatmax")
44 imodmax = size(rlonimod)
45
46 ! REDEFINITION DE L'ORIGINE DES ABSCISSES
47 ! A L'INTERFACE OUEST DE LA PREMIERE MAILLE DU MODELE
48 DO imod = 1, imodmax
49 xxim(imod) = rlonimod(imod)
50 ENDDO
51
52 chmax = maxval(xxim)
53 IF(chmax < 6.50) THEN
54 DO imod = 1, imodmax
55 xxim(imod) = xxim(imod) * 180./pi
56 ENDDO
57 ENDIF
58
59 xim0 = xxim(imodmax) - 360.
60
61 DO imod = 1, imodmax
62 xxim(imod) = xxim(imod) - xim0
63 ENDDO
64
65 idatmax1 = idatmax +1
66
67 DO idat = 1, idatmax
68 xxd(idat) = dlonid(idat)
69 ENDDO
70
71 chmax = maxval(xxd(:idatmax))
72 IF(chmax < 6.50) THEN
73 DO idat = 1, idatmax
74 xxd(idat) = xxd(idat) * 180./pi
75 ENDDO
76 ENDIF
77
78 DO idat = 1, idatmax
79 xxd(idat) = AMOD(xxd(idat) - xim0, 360.)
80 fdd(idat) = fdat (idat)
81 ENDDO
82
83 i = 2
84 DO while (xxd(i) >= xxd(i-1) .and. i < idatmax)
85 i = i + 1
86 ENDDO
87 IF (xxd(i) < xxd(i-1)) THEN
88 ichang = i
89 ! *** reorganisation des longitudes entre 0. et 360. degres ****
90 nid = idatmax - ichang +1
91 DO i = 1, nid
92 xchan (i) = xxd(i+ichang -1)
93 fdchan(i) = fdd(i+ichang -1)
94 ENDDO
95 DO i=1, ichang -1
96 xchan (i+ nid) = xxd(i)
97 fdchan(i+nid) = fdd(i)
98 ENDDO
99 DO i =1, idatmax
100 xxd(i) = xchan(i)
101 fdd(i) = fdchan(i)
102 ENDDO
103 end IF
104
105 ! translation des champs de donnees par rapport
106 ! a la nouvelle origine, avec redondance de la
107 ! maille a cheval sur les bords
108
109 id0 = 0
110 id1 = 0
111
112 DO idat = 1, idatmax
113 IF (xxd(idatmax1- idat) < 360.) exit
114 id1 = id1 + 1
115 ENDDO
116
117 DO idat = 1, idatmax
118 IF (xxd(idat) > 0.) exit
119 id0 = id0 + 1
120 END DO
121
122 IF(id1 /= 0) then
123 DO idat = 1, id1
124 xxid(idat) = xxd(idatmax - id1 + idat) - 360.
125 fxd (idat) = fdd(idatmax - id1 + idat)
126 END DO
127 DO idat = 1, idatmax - id1
128 xxid(idat + id1) = xxd(idat)
129 fxd (idat + id1) = fdd(idat)
130 END DO
131 end IF
132
133 IF(id0 /= 0) then
134 DO idat = 1, idatmax - id0
135 xxid(idat) = xxd(idat + id0)
136 fxd (idat) = fdd(idat + id0)
137 END DO
138
139 DO idat = 1, id0
140 xxid (idatmax - id0 + idat) = xxd(idat) + 360.
141 fxd (idatmax - id0 + idat) = fdd(idat)
142 END DO
143 else
144 DO idat = 1, idatmax
145 xxid(idat) = xxd(idat)
146 fxd (idat) = fdd(idat)
147 ENDDO
148 end IF
149 xxid(idatmax1) = xxid(1) + 360.
150 fxd (idatmax1) = fxd(1)
151
152 ! initialisation du champ du modele
153
154 inter_barx(:) = 0.
155
156 ! iteration
157
158 x0 = xim0
159 dxm = 0.
160 imod = 1
161 idat = 1
162
163 do while (imod <= imodmax)
164 do while (xxim(imod) > xxid(idat))
165 dx = xxid(idat) - x0
166 dxm = dxm + dx
167 inter_barx(imod) = inter_barx(imod) + dx * fxd(idat)
168 x0 = xxid(idat)
169 idat = idat + 1
170 end do
171 IF (xxim(imod) < xxid(idat)) THEN
172 dx = xxim(imod) - x0
173 dxm = dxm + dx
174 inter_barx(imod) = (inter_barx(imod) + dx * fxd(idat)) / dxm
175 x0 = xxim(imod)
176 dxm = 0.
177 imod = imod + 1
178 ELSE
179 dx = xxim(imod) - x0
180 dxm = dxm + dx
181 inter_barx(imod) = (inter_barx(imod) + dx * fxd(idat)) / dxm
182 x0 = xxim(imod)
183 dxm = 0.
184 imod = imod + 1
185 idat = idat + 1
186 END IF
187 end do
188
189 END function inter_barx
190
191 end module inter_barx_m

  ViewVC Help
Powered by ViewVC 1.1.21