40
41
42
44
45
46
47#include "implicit_f.inc"
48
49
50
51 INTEGER NSPHACTF, NSPHACTL
52
53
54
55#include "sphcom.inc"
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 INTEGER NSN,NBX,NBY,NBZ,
84 . NLIST(*),(*) ,
85 . VOXEL(NBX+2,NBY+2,NBZ+2),JVOIS(*) ,JSTOR(*), JPERM(*) ,
86 . ,KXSP(NISP,*), IXSP(KVOISPH,*), KREDUCE(*)
87 INTEGER ,INTENT(IN) :: IPARTSP(NUMSPH),,SZ_INTP_DIST
88
90 . x(3,*),bminma(6),
91 . spbuf(nspbuf,*),dvois(*)
92 my_real ,
INTENT(INOUT) :: max_intp_dist_part(sz_intp_dist)
93
94
95
96 INTEGER NB_NCN,NB_NCN1,NB_ECN,I,J,DIR,NB_NC,NB_EC,
97 . N1,N2,N3,N4,NN,NE,K,L,II,JJ,JS,NS,N,
98 . NSNF, NSNL,, IG, IL,NVOIMAX
99
101 . dx,dy,dz,xs,ys,zs,xx,sx,sy,sz,s2,xn,yn,zn,
102 . xmin, xmax,ymin,
ymax,zmin, zmax, tz,
103 . d1x,d1y,d1z,d2,a2,alpha_marge,distmax
104
105 INTEGER LAST_NOD(NSN)
106 INTEGER IX,IY,IZ,NEXT,
107 . IX1,IY1,IZ1,IX2,IY2,IZ2
108 INTEGER, DIMENSION(:),ALLOCATABLE :: IIX,IIY,IIZ
110 . xminb,yminb,zminb,xmaxb,ymaxb,zmaxb,
111 . xmine,ymine,zmine,xmaxe,ymaxe,zmaxe,aaa,bbb,
112 . aaa2,min_dist
113 INTEGER FIRST,NEW,LAST
114 INTEGER IPART_I,IPART_JS
115 SAVE iix,iiy,iiz,distmax
116
117
119 ALLOCATE(iix(nsn))
120 ALLOCATE(iiy(nsn))
121 ALLOCATE(iiz(nsn))
122
123
124
125
126
127 alpha_marge = sqrt(one +spasort)
128
129 xmax = bminma(1)
131 zmax = bminma(3)
132 xmin = bminma(4)
133 ymin = bminma(5)
134 zmin = bminma(6)
135
136
137 xminb = xmin
138 yminb = ymin
139 zminb = zmin
140 xmaxb = xmax
142 zmaxb = zmax
143
144
145
146
147
148
149 distmax = zero
150
151 DO i=1,nsn
152 iix(i)=0
153 iiy(i)=0
154 iiz(i)=0
155
156 j=nlist(i)
157 nn = kxsp(3,j)
158
159 distmax =
max(distmax,spbuf(1,j))
160
161
162 IF(x(1,nn) < xmin) cycle
163 IF(x(1,nn) > xmax) cycle
164 IF(x(2,nn) < ymin) cycle
165 IF(x(2,nn) >
ymax) cycle
166 IF(x(3,nn) < zmin) cycle
167 IF(x(3,nn) > zmax) cycle
168
169 iix(i)=int(nbx*(x(1,nn)-xminb)/(xmaxb-xminb))
170 iiy(i)=int(nby*(x(2,nn)-yminb)/(ymaxb-yminb))
171 iiz(i)=int(nbz*(x(3,nn)-zminb)/(zmaxb-zminb))
172
173 iix(i)=
max(1,2+
min(nbx,iix(i)))
174 iiy(i)=
max(1,2+
min(nby,iiy(i)))
175 iiz(i)=
max(1,2+
min(nbz,iiz(i)))
176
177 first = voxel(iix(i),iiy(i),iiz(i))
178 IF(first == 0)THEN
179
180 voxel(iix(i),iiy(i),iiz(i)) = i
182 last_nod(i) = 0
183 ELSEIF(last_nod(first) == 0)THEN
184
185
187 last_nod(first) = i
189 ELSE
190
191
192 last = last_nod(first)
194 last_nod(first) = i ! last
196 ENDIF
197 ENDDO
198
199
200
201
202
203
204
205 nvoimax = 0
206 DO ne = nsphactf,nsphactl
207
208
209
210 j=nlist(ne)
211 nn = kxsp(3,j)
212
213 min_dist = ep30
214 ipart_i=ipartsp(j)
215
216
217 aaa = (spbuf(1,j)+distmax)* alpha_marge
218
219
220
221 ix1=int(nbx*(x(1,nn)-aaa-xminb)/(xmaxb-xminb))
222 iy1=int(nby*(x(2,nn)-aaa-yminb)/(ymaxb-yminb))
223 iz1=int(nbz*(x(3,nn)-aaa-zminb)/(zmaxb-zminb))
224
228
229 ix2=int(nbx*(x(1,nn)+aaa-xminb)/(xmaxb-xminb))
230 iy2=int(nby*(x(2,nn)+aaa-yminb)/(ymaxb-yminb))
231 iz2=int(nbz*(x(3,nn)+aaa-zminb)/(zmaxb-zminb))
232
236
237
238
239
240
241
242 DO iz = iz1,iz2
243 DO iy = iy1,iy2
244 DO ix = ix1,ix2
245
246
247
248 jj = voxel(ix,iy,iz)
249
250 DO WHILE(jj /= 0)
251
252
253
254 js=nlist(jj)
255 ns=kxsp(3,js)
256 ipart_js=ipartsp(js)
257 IF(jj == ne)GOTO 200
258 xs = x(1,ns)
259 ys = x(2,ns)
260 zs = x(3,ns)
261
262 aaa = spbuf(1,j)+spbuf(1,js)
263
264 bbb = aaa * alpha_marge
265
266 IF(xs<=x(1,nn)-bbb)GOTO 200
267 IF(xs>=x(1,nn)+bbb)GOTO 200
268 IF(ys<=x(2,nn)-bbb)GOTO 200
269 IF(ys>=x(2,nn)+bbb)GOTO 200
270 IF(zs<=x(3,nn)-bbb)GOTO 200
271 IF(zs>=x(3,nn)+bbb)GOTO 200
272
273
274
275 d1x = xs - x(1,nn)
276 d1y = ys - x(2,nn)
277 d1z = zs - x(3,nn)
278 d2 = d1x*d1x+d1y*d1y+d1z*d1z
279 a2 = bbb*bbb
280 IF(js==j.or.d2 > a2)GOTO 200
281
282
283 aaa2 = aaa*aaa
284 nvois=kxsp(5,j)+1
285 jvois(nvois)=js
286 dvois(nvois)=d2/aaa2
287
288
289 IF (ipart_i==ipart_js) min_dist =
min(min_dist,sqrt(d2))
290
291 kxsp(5,j) =nvois
292
293 200 CONTINUE
294
296
297 ENDDO
298
299 ENDDO
300 ENDDO
301 ENDDO
302
303 IF (pre_search==0) THEN
304
305
306
307
308 CALL sppro31(j ,kxsp ,ixsp ,nod2sp,jvois,
309 . jstor,jperm ,dvois,ireduce,kreduce)
310 ELSE
311
312 max_intp_dist_part(ipart_i) =
max(max_intp_dist_part(ipart_i),min_dist)
313 nvoimax =
max(nvoimax,nvois
314 ENDIF
315
316 ENDDO
317
318
319
320
321
322
323
324 100 CONTINUE
325
326
327
328
329 DO i=nsphactf,nsphactl
330 IF(iix(i)/=0)THEN
331 voxel(iix(i),iiy(i),iiz(i))=0
332 ENDIF
333 ENDDO
334
335
336
337
339 DEALLOCATE(iix)
340 DEALLOCATE(iiy)
341 DEALLOCATE(iiz)
342
343
344 RETURN
subroutine ymax(idn, fac, npc, pld, stiffmin, stiffmax, stiffini, stiffavg)
integer, dimension(:), allocatable next_nod
subroutine sppro31(il, kxsp, ixsp, nod2sp, jvois, jstor, jperm, dvois, ireduce, kreduce)