45
46
47
49
50
51
52#include "implicit_f.inc"
53
54
55
56#include "mvsiz_p.inc"
57
58
59
60#include "param_c.inc"
61
62
63
64 INTEGER NRTM,NUMNOD,NRTM0,NADMSR,IEDGE,IRECTM(4,NRTM),NMN,MSR(*),
65 . MVOISIN(4,NRTM), EVOISIN(4,NRTM),ITAB(*),MSEGTYP(*),
66 . NEDGE, LEDGE(NLEDGE,*), LBOUND(*), ADMSR(4,*)
67
69 . x(3,numnod)
70 real*4 nod_normal(3,4,nrtm), vtx_bisector(3,2,*),e2s_nod_normal(3,*)
71 INTEGER , INTENT(INOUT) :: IELEM_M(2,NRTM)
72
73
74
75 INTEGER I, J, FIRST, LAST, IRM, IEDG, I1, I2, I3, I4
76 INTEGER IX1(MVSIZ), IX2(MVSIZ), IX3(MVSIZ), IX4(MVSIZ),
77 . JRM, JEDG, IS1, IS2, ISH, SOL_EDGE
78
79 real*4
80 . x0(mvsiz), y0(mvsiz), z0(mvsiz),
81 . x1(mvsiz), x2(mvsiz), x3(mvsiz), x4(mvsiz),
82 . y1(mvsiz), y2(mvsiz), y3(mvsiz), y4(mvsiz),
83 . z1(mvsiz), z2(mvsiz), z3(mvsiz), z4(mvsiz),
84 . x01(mvsiz), x02(mvsiz), x03(mvsiz), x04(mvsiz),
85 . y01(mvsiz), y02(mvsiz), y03(mvsiz), y04(mvsiz),
86 . z01(mvsiz), z02(mvsiz), z03(mvsiz), z04(mvsiz),
87 . xn1(mvsiz),yn1(mvsiz),zn1(mvsiz),
88 . xn2(mvsiz),yn2(mvsiz),zn2(mvsiz),
89 . xn3(mvsiz),yn3(mvsiz),zn3(mvsiz),
90 . xn4(mvsiz),yn4(mvsiz),zn4(mvsiz),
91 . xs(mvsiz),ys(mvsiz),zs(mvsiz),
92 . aaa, xad, s1, s2, s3, s4,
93 . rzero, run, rem30, rep30, rdix,
94 . nx, ny, nz, vx, vy, vz, x12, y12, z12
95
96 rzero = 0.
97 run = 1.
98 rdix = 10.
99 rep30 = rdix**30
100 rem30 = run/rep30
101
102 nod_normal(1:3,1:4,1:nrtm) = rzero
103 vtx_bisector(1:3,1:2,1:nadmsr) = rzero
104
105 sol_edge = 0
106 IF(iedge/=0) sol_edge =iedge/10
107 IF(sol_edge /=0)THEN
108 DO i=1,nadmsr
109 e2s_nod_normal(1,i) = rzero
110 e2s_nod_normal(2,i) = rzero
111 e2s_nod_normal(3,i) = rzero
112 END DO
113 ENDIF
114
115 first=1
116 last =
min(nrtm0,mvsiz)
117
118 100 CONTINUE
119
120 DO i=1,last-first+1
121 irm=i+first-1
122 IF(ielem_m(2,irm) ==0)THEN
123 ix1(i)=irectm(1,irm)
124 ix2(i)=irectm(2,irm)
125 ix3(i)=irectm(3,irm)
126 ix4(i)=irectm(4,irm)
127 x1(i)=x(1,ix1(i))
128 y1(i)=x(2,ix1(i))
129 z1(i)=x(3,ix1(i))
130 x2(i)=x(1,ix2(i))
131 y2(i)=x(2,ix2(i))
132 z2(i)=x(3,ix2(i))
133 x3(i)=x(1,ix3(i))
134 y3(i)=x(2,ix3(i))
135 z3(i)=x(3,ix3(i))
136 x4(i)=x(1,ix4(i))
137 y4(i)=x(2,ix4(i))
138 z4(i)=x(3,ix4(i))
139 ENDIF
140 END DO
141
142 DO i=1,last-first+1
143 irm=i+first-1
144 IF(ielem_m(2,irm) ==0)THEN
145 IF(ix3(i)/=ix4(i))THEN
146 x0(i) = fourth*(x1(i)+x2(i)+x3(i)+x4(i))
147 y0(i) = fourth*(y1(i)+y2(i)+y3(i)+y4(i))
148 z0(i) = fourth*(z1(i)+z2(i)+z3(i)+z4(i))
149 ELSE
150 x0(i) = x3(i)
151 y0(i) = y3(i)
152 z0(i) = z3(i)
153 ENDIF
154 ENDIF
155 END DO
156
157 DO i=1,last-first+1
158 irm=i+first-1
159 IF(ielem_m(2,irm) ==0)THEN
160
161 x01(i) = x1(i) - x0(i)
162 y01(i) = y1(i) - y0(i)
163 z01(i) = z1(i) - z0(i)
164
165 x02(i) = x2(i) - x0(i)
166 y02(i) = y2(i) - y0(i)
167 z02(i) = z2(i) - z0(i)
168
169 x03(i) = x3(i) - x0(i)
170 y03(i) = y3(i) - y0(i)
171 z03(i) = z3(i) - z0(i)
172
173 x04(i) = x4(i) - x0(i)
174 y04(i) = y4(i) - y0(i)
175 z04(i) = z4(i) - z0(i)
176
177 ENDIF
178 ENDDO
179
180 DO i=1,last-first+1
181 irm=i+first-1
182 IF(ielem_m(2,irm) ==0)THEN
183
184 xn1(i) = y01(i)*z02(i) - z01(i)*y02(i)
185 yn1(i) = z01(i)*x02(i) - x01(i)*z02(i)
186 zn1(i) = x01(i)*y02(i) - y01(i)*x02(i)
187
188 xn2(i) = y02(i)*z03(i) - z02(i)*y03(i)
189 yn2(i) = z02(i)*x03(i) - x02(i)*z03(i)
190 zn2(i) = x02(i)*y03(i) - y02(i)*x03(i)
191
192 xn3(i) = y03(i)*z04(i) - z03(i)*y04(i)
193 yn3(i) = z03(i)*x04(i) - x03(i)*z04(i)
194 zn3(i) = x03(i)*y04(i) - y03(i)*x04(i)
195
196 xn4(i) = y04(i)*z01(i) - z04(i)*y01(i)
197 yn4(i) = z04(i)*x01(i) - x04(i)*z01(i)
198 zn4(i) = x04(i)*y01(i) - y04(i)*x01(i)
199
200 ENDIF
201 ENDDO
202
203 DO i=1,last-first+1
204
205 irm=i+first-1
206 IF(ielem_m(2,irm) ==0)THEN
207 aaa=run/
max(rem30,sqrt(xn1(i)*xn1(i)+yn1(i)*yn1(i)+zn1(i)*zn1(i)))
208 xn1(i) = xn1(i)*aaa
209 yn1(i) = yn1(i)*aaa
210 zn1(i) = zn1(i)*aaa
211
212 aaa=run/
max(rem30,sqrt(xn2(i)*xn2(i)+yn2(i)*yn2(i)+zn2(i)*zn2(i)))
213 xn2(i) = xn2(i)*aaa
214 yn2(i) = yn2(i)*aaa
215 zn2(i) = zn2(i)*aaa
216
217 aaa=run/
max(rem30,sqrt(xn3(i)*xn3(i)+yn3(i)*yn3(i)+zn3(i)*zn3(i)))
218 xn3(i) = xn3(i)*aaa
219 yn3(i) = yn3(i)*aaa
220 zn3(i) = zn3(i)*aaa
221
222 aaa=run/
max(rem30,sqrt(xn4(i)*xn4(i)+yn4(i)*yn4(i)+zn4(i)*zn4(i)))
223 xn4(i) = xn4(i)*aaa
224 yn4(i) = yn4(i)*aaa
225 zn4(i) = zn4(i)*aaa
226
227 ENDIF
228 ENDDO
229
230 DO i=1,last-first+1
231
232 irm=i+first-1
233
234 IF(ielem_m(2,irm) ==0)THEN
235
236 IF(ix4(i)/=ix3(i))THEN
237
238 nod_normal(1,1,irm)=xn1(i)
239 nod_normal(2,1,irm)=yn1(i)
240 nod_normal(3,1,irm)=zn1(i)
241
242 nod_normal(1,2,irm)=xn2(i)
243 nod_normal(2,2,irm)=yn2(i)
244 nod_normal(3,2,irm)=zn2(i)
245
246 nod_normal(1,3,irm)=xn3(i)
247 nod_normal(2,3,irm)=yn3(i)
248 nod_normal(3,3,irm)=zn3(i)
249
250 nod_normal(1,4,irm)=xn4(i)
251 nod_normal(2,4,irm)=yn4(i)
252 nod_normal(3,4,irm)=zn4(i)
253
254 ELSE
255
256 nod_normal(1,1,irm)=xn1(i)
257 nod_normal(2,1,irm)=yn1(i)
258 nod_normal(3,1,irm)=zn1(i)
259
260 nod_normal(1,2,irm)=xn1(i)
261 nod_normal(2,2,irm)=yn1(i)
262 nod_normal(3,2,irm)=zn1(i)
263
264 nod_normal(1,4,irm)=xn1(i)
265 nod_normal(2,4,irm)=yn1(i)
266 nod_normal(3,4,irm)=zn1(i)
267
268 END IF
269
270 ENDIF
271 ENDDO
272
273 DO i=1,last-first+1
274
275 irm=i+first-1
276
277 IF(ielem_m(2,irm) ==0)THEN
278
279 ish=msegtyp(irm)
280 IF(ish > 0) THEN
281 IF(ish > nrtm)ish=ish-nrtm
282
283 IF(ix3(i)/=ix4(i))THEN
284
285 nod_normal(1,1,ish)=-xn1(i)
286 nod_normal(2,1,ish)=-yn1(i)
287 nod_normal(3,1,ish)=-zn1(i)
288
289 nod_normal(1,4,ish)=-xn2(i)
290 nod_normal(2,4,ish)=-yn2(i)
291 nod_normal(3,4,ish)=-zn2(i)
292
293 nod_normal(1,3,ish)=-xn3(i)
294 nod_normal(2,3,ish)=-yn3(i)
295 nod_normal(3,3,ish)=-zn3(i)
296
297 nod_normal(1,2,ish)=-xn4(i)
298 nod_normal(2,2,ish)=-yn4(i)
299 nod_normal(3,2,ish)=-zn4(i)
300
301 ELSE
302
303 nod_normal(1,1,ish)=-xn1(i)
304 nod_normal(2,1,ish)=-yn1(i)
305 nod_normal(3,1,ish)=-zn1(i)
306
307 nod_normal(1,4,ish)=-xn1(i)
308 nod_normal(2,4,ish)=-yn1(i)
309 nod_normal(3,4,ish)=-zn1(i)
310
311 nod_normal(1,2,ish)=-xn1(i)
312 nod_normal(2,2,ish)=-yn1(i)
313 nod_normal(3,2,ish)=-zn1(i)
314
315 ENDIF
316 END IF
317 END IF
318
319 ENDDO
320
321
322 IF(sol_edge/=0)THEN
323
324 DO i=1,last-first+1
325
326 irm=i+first-1
327
328 i1=abs(admsr(1,irm))
329 i2=abs(admsr(2,irm))
330 i3=abs(admsr(3,irm))
331 i4=abs(admsr(4,irm))
332
333 xad=admsr(1,irm)
334 s1=sign(run,xad)
335
336 xad=admsr(2,irm)
337 s2=sign(run,xad)
338
339 xad=admsr(3,irm)
340 s3=sign(run,xad)
341
342 xad=admsr(4,irm)
343 s4=sign(run,xad)
344
345
346 IF(i4/=i3)THEN
347
348 e2s_nod_normal(1,i1)=e2s_nod_normal(1,i1)+s1*(xn4(i)+xn1(i))
349 e2s_nod_normal(2,i1)=e2s_nod_normal(2,i1)+s1*(yn4(i)+yn1(i))
350 e2s_nod_normal(3,i1)=e2s_nod_normal(3,i1)+s1*(zn4(i)+zn1(i))
351
352 e2s_nod_normal(1,i2)=e2s_nod_normal(1,i2)+s2*(xn1(i)+xn2(i))
353 e2s_nod_normal(2,i2)=e2s_nod_normal(2,i2)+s2*(yn1(i)+yn2(i))
354 e2s_nod_normal(3,i2)=e2s_nod_normal(3,i2)+s2*(zn1(i)+zn2(i))
355
356 e2s_nod_normal(1,i3)=e2s_nod_normal(1,i3)+s3*(xn2(i)+xn3(i))
357 e2s_nod_normal(2,i3)=e2s_nod_normal(2,i3)+s3*(yn2(i)+yn3(i))
358 e2s_nod_normal(3,i3)=e2s_nod_normal(3,i3)+s3*(zn2(i)+zn3(i))
359
360 e2s_nod_normal(1,i4)=e2s_nod_normal(1,i4)+s4*(xn3(i)+xn4(i))
361 e2s_nod_normal(2,i4)=e2s_nod_normal(2,i4)+s4*(yn3(i)+yn4(i))
362 e2s_nod_normal(3,i4)=e2s_nod_normal(3,i4)+s4*(zn3(i)+zn4(i))
363
364 ELSE
365
366 e2s_nod_normal(1,i1)=e2s_nod_normal(1,i1)+s1*xn1(i)
367 e2s_nod_normal(2,i1)=e2s_nod_normal(2,i1)+s1*yn1(i)
368 e2s_nod_normal(3,i1)=e2s_nod_normal(3,i1)+s1*zn1(i)
369
370 e2s_nod_normal(1,i2)=e2s_nod_normal(1,i2)+s2*xn1(i)
371 e2s_nod_normal(2,i2)=e2s_nod_normal(2,i2)+s2*yn1(i)
372 e2s_nod_normal(3,i2)=e2s_nod_normal(3,i2)+s2*zn1(i)
373
374 e2s_nod_normal(1,i3)=e2s_nod_normal(1,i3)+s3*xn1(i)
375 e2s_nod_normal(2,i3)=e2s_nod_normal(2,i3)+s3*yn1(i)
376 e2s_nod_normal(3,i3)=e2s_nod_normal(3,i3)+s3*zn1(i)
377
378 END IF
379
380 ENDDO
381
382 ENDIF
383
384
385
386 IF(last < nrtm0)THEN
387 first=last+1
388 last =
min(last+mvsiz,nrtm0)
389 GO TO 100
390 END IF
391
392 DO irm=1,nrtm
393
394 IF(ielem_m(2,irm) ==0)THEN
395 DO iedg=1,4
396 IF(mvoisin(iedg,irm)==0)THEN
397 IF(.NOT.(irectm(3,irm)==irectm(4,irm).AND.iedg==3))THEN
398
399 nx=nod_normal(1,iedg,irm)
400 ny=nod_normal(2,iedg,irm)
401 nz=nod_normal(3,iedg,irm)
402
403 i1=irectm(iedg,irm)
404 i2=irectm(mod(iedg,4)+1,irm)
405
406 x12=x(1,i2)-x(1,i1)
407 y12=x(2,i2)-x(2,i1)
408 z12=x(3,i2)-x(3,i1)
409
410 vx=y12*nz-z12*ny
411 vy=z12*nx-x12*nz
412 vz=x12*ny-y12*nx
413
414 aaa=run/
max(rem30,sqrt(vx*vx+vy*vy+vz*vz))
415 vx=vx*aaa
416 vy=vy*aaa
417 vz=vz*aaa
418
419 nod_normal(1,iedg,irm)=vx
420 nod_normal(2,iedg,irm)=vy
421 nod_normal(3,iedg,irm)=vz
422
423 END IF
424 END IF
425 END DO
426 ENDIF
427 END DO
428
429 DO irm=1,nrtm
430
431 IF(ielem_m(2,irm) ==0)THEN
432 DO iedg=1,4
433 IF(mvoisin(iedg,irm)==0)THEN
434 IF(.NOT.(irectm(3,irm)==irectm(4,irm).AND.iedg==3))THEN
435
436 vx=nod_normal(1,iedg,irm)
437 vy=nod_normal(2,iedg,irm)
438 vz=nod_normal(3,iedg,irm)
439
440 is1=admsr(iedg,irm)
441
442 IF(vtx_bisector(1,1,is1)==rzero.AND.
443 . vtx_bisector(2,1,is1)==rzero.AND.
444 . vtx_bisector(3,1,is1)==rzero)THEN
445 vtx_bisector(1,1,is1)=vx
446 vtx_bisector(2,1,is1)=vy
447 vtx_bisector(3,1,is1)=vz
448 ELSE
449 vtx_bisector(1,2,is1)=vx
450 vtx_bisector(2,2,is1)=vy
451 vtx_bisector(3,2,is1)=vz
452 END IF
453
454 is2=admsr(mod(iedg,4)+1,irm)
455
456 IF(vtx_bisector(1,1,is2)==rzero.AND.
457 . vtx_bisector(2,1,is2)==rzero.AND.
458 . vtx_bisector(3,1,is2)==rzero)THEN
459 vtx_bisector(1,1,is2)=vx
460 vtx_bisector(2,1,is2)=vy
461 vtx_bisector(3,1,is2)=vz
462 ELSE
463 vtx_bisector(1,2,is2)=vx
464 vtx_bisector(2,2,is2)=vy
465 vtx_bisector(3,2,is2)=vz
466 END IF
467
468 END IF
469 END IF
470 END DO
471 ENDIF
472 END DO
473
475
476 DO irm=1,nrtm
477 IF(ielem_m(2,irm) ==0)THEN
478 DO j=1,4
479 IF(.NOT.(irectm(3,irm)==irectm(4,irm).AND.j==3))THEN
480 jrm =mvoisin(j,irm)
481 jedg=evoisin(j,irm)
482 IF(jrm /= 0)THEN
486 ELSE
490 END IF
491 END IF
492 END DO
493 ENDIF
494 END DO
495
496 DO irm=1,nrtm
497 IF(ielem_m(2,irm) ==0)THEN
498 DO j=1,4
499 IF(.NOT.(irectm(3,irm)==irectm(4,irm).AND.j==3))THEN
500 jrm =mvoisin(j,irm)
501 IF( jrm /= 0) THEN
505 aaa=run/
max(rem30,sqrt(nx*nx+ny*ny+nz*nz))
506 nod_normal(1,j,irm)=nx*aaa
507 nod_normal(2,j,irm)=ny*aaa
508 nod_normal(3,j,irm)=nz*aaa
509 END IF
510 END IF
511 END DO
512 ENDIF
513 END DO
514
515
516
517 IF(sol_edge/=0)THEN
518 DO i=1,nadmsr
519 aaa=run/
max(rem30,sqrt(e2s_nod_normal(1,i)*e2s_nod_normal(1,i)+
520 . e2s_nod_normal(2,i)*e2s_nod_normal(2,i)+
521 . e2s_nod_normal(3,i)*e2s_nod_normal(3,i)))
522 e2s_nod_normal(1,i)=e2s_nod_normal(1,i)*aaa
523 e2s_nod_normal(2,i)=e2s_nod_normal(2,i)*aaa
524 e2s_nod_normal(3,i)=e2s_nod_normal(3,i)*aaa
525 END DO
526 ENDIF
527
528
530
531 RETURN
real *4, dimension(:,:,:), allocatable wnod_normal