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