Computes elevation from alluvial basin (ALL.out).
49 x_elev, y_elev, z_elev, &
50 node1_elem, node2_elem, node3_elem
51 cs_nnz_loc, cs_loc, nm, tm
52 nn_s, xx_s, yy_s, zz_s, zz_elevation
53 tagmat, max_as, tol)
54
55 implicit none
56
57 integer*4 :: n_elev,nn_elem,cs_nnz_loc,nm,ne,nn_s
58 integer*4 :: im,ie,i,j,k,nn,ip,isn,ic
59 integer*4 :: h
60 integer*4 :: tagmat
61
62 integer*4, dimension(nn_s) :: loc_n_num
63 integer*4, dimension(nn_elem) :: node1_elem,node2_elem,node3_elem
64 integer*4, dimension(0:cs_nnz_loc) :: cs_loc
65 integer*4, dimension(nm) :: tm
66 integer*4, dimension(nm) :: sd
67
68 real*8 :: dx,dy,dz,tol
69 real*8 :: x1,y1,z1
70 real*8 :: x2,y2,z2
71 real*8 :: x3,y3,z3
72 real*8 :: ux,uy,uz,vx,vy,vz
73 real*8 :: a,b,c
74 real*8 :: max_as
75 real*8 :: zz_interp
76 real*8 :: v0x,v0y,v1x,v1y,v2x,v2y
77 real*8 :: dot00,dot01,dot02,dot11,dot12
78 real*8 :: invdenom,u,v
79 real*8 :: d2min
80 real*8 :: z_elev_min
81
82 real*8, dimension(:), allocatable :: ct,ww
83 real*8, dimension(n_elev) :: x_elev,y_elev,z_elev
84 real*8, dimension(nn_s) :: xx_s,yy_s,zz_s
85 real*8, dimension(nn_s) :: zz_elevation
86
87 real*8, dimension(:,:), allocatable :: dd
88
89
90 d2min = (5 * max_as)**2
91
92 z_elev_min = z_elev(1)
93 do i = 1,n_elev
94 if (z_elev(i).lt.z_elev_min) then
95 z_elev_min = z_elev(i)
96 endif
97 enddo
98
99 ne = cs_loc(0) - 1
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 do ie = 1,ne
115 im = cs_loc(cs_loc(ie -1) +0);
116 nn = sd(im) +1
117
118 if (im .eq. tagmat) then
119
120
121 allocate(ct(nn),ww(nn),dd(nn,nn))
123
124 do k = 1,nn
125 do j = 1,nn
126 do i = 1,nn
127
128 ip = nn*nn*(k -1) +nn*(j -1) +i
129 isn = cs_loc(cs_loc(ie -1) + ip)
130 ic = isn
131
132
133
134 if (zz_elevation(ic) .eq. -1.0e+30) then
135
136 do h = 1,nn_elem
137 if (zz_s(ic).lt.z_elev_min) exit
138
139 x1 = x_elev(node1_elem(h
140 y1 = y_elev(node1_elem(h
141 z1 = z_elev(node1_elem(h
142
143 if (((x1 - xx_s(ic))**2 + (y1 - yy_sthen
144
145 x2 = x_elev(node2_elem(h
146 y2 = y_elev(node2_elem(h
147 z2 = z_elev(node2_elem(h
148
149 x3 = x_elev(node3_elem(h
150 y3 = y_elev(node3_elem(h
151 z3 = z_elev(node3_elem(h
152
153 if (zz_s(ic).ge.min(z1,z2,z3)) then
154
155
156
157
158
159
160
161
162
163 v0x=(x3 - x1)
164 v0y=(y3 - y1)
165
166
167 v1x=(x2 - x1)
168 v1y=(y2 - y1)
169
170
171 v2x=(xx_s(ic) - x1)
172 v2y=(yy_s(ic) - y1)
173
174
175
176
177
178
179 dot00 = v0x * v0x + v0y
180
181
182 dot01 = v0x * v1x + v0y
183
184
185 dot02 = v0x * v2x + v0y
186
187
188 dot11 = v1x * v1x + v1y
189
190
191 dot12 = v1x * v2x + v1y
192
193
194 invdenom = 1 / (dot00 * dot11
195 u = (dot11 * dot02 - dot01
196 v = (dot00 * dot12 - dot01
197
198
199
200 if ( (u.ge.0.0d0).and.(v.ge.then
201
202
203
204 ux=(x1-x2)/sqrt(
205 uy=(y1-y2)/sqrt(
206 uz=(z1-z2)/sqrt(
207 vx=(x3-x2)/sqrt(
208 vy=(y3-y2)/sqrt(
209 vz=(z3-z2)/sqrt(
210
211 a = uy * vz - uz
212 b = uz * vx - ux
213 c = ux * vy - uy
214
215 zz_interp = -a/c
216 zz_elevation(ic)
217 if (abs(zz_elevationthen
218 zz_elevation
219 endif
220
221 endif
222
223 if ( (u.ge.0.0d0).and.(v.ge.exit
224
225 endif
226
227 endif
228
229 enddo
230
231 endif
232
233
234
235 enddo
236 enddo
237 enddo
238
239 deallocate(ct,ww,dd)
240
241 endif
242 enddo
243
244
245 return
246
subroutine make_lgl_nw(nb_pnt, xq, wq, dd)
Makes Gauss-Legendre-Lobatto nodes, weigths and spectral derivatives.