48
49
50
51
52 USE elbufdef_mod
57 use element_mod , only : nixtg
58
59
60
61#include "implicit_f.inc"
62
63
64
65#include "mvsiz_p.inc"
66
67
68
69#include "param_c.inc"
70#include "com01_c.inc"
71#include "scr17_c.inc"
72#include "drape_c.inc"
73
74
75
76 INTEGER JFT,JLT,NFT,NLAY,IPT,ID,NIX,NUMEL,NSIGSH,
77 . ISUBSTACK,IREP,NPT_ALL,IDRAPE
78 INTEGER IX(NIX,*),IGEO(NPROPGI,*),PTSH(*),IORTHLOC(*)
79 INTEGER, INTENT(IN) :: NEL,G_ADD_NODE,ADD_NODE(G_ADD_NODE*NEL)
80 INTEGER, DIMENSION(*) :: INDX
82 . geo(npropg,*),skew(lskew,*),sigsh(nsigsh,*),vx(*),vy(*),vz(*),
83 . phi1(npt_all,*),phi2(npt_all,*),coor1(npt_all,mvsiz),coor2(npt_all,mvsiz),
84 . coor3(npt_all,mvsiz),coor4(npt_all,mvsiz),
85 . angle(*),geo_stack(npropg,*),x(3,*),betaorth(*)
86 my_real,
DIMENSION(MVSIZ),
INTENT(IN) :: e3x,e3y,e3z,x1,x2,y1,y2,z1,z2
87
88 TYPE(ELBUF_STRUCT_), TARGET :: ELBUF_STR
89 TYPE (STACK_PLY):: STACK
90 TYPE (DRAPE_) , DIMENSION(*), TARGET :: DRAPE
91
92
93
94 INTEGER I,II,J,JJ,N,NPT,NPTI,IGTYP,IPID,PID,ISK,IPANG,IPPHI,
95 . IPTHK,IPPOS,IPDIR,ILAW_LY,
96 . DEF_ORTH(MVSIZ),N1,N2,IRP,NOD,IL,IT,NSLICE,IPT_ALL,NPTT,
97 . IE, IP,IPID_PLY,N3,N4
98 my_real v(mvsiz),e11,e12,e13,ne1,vx0,vy0,vz0,
99 . xc(mvsiz),yc(mvsiz),zc(mvsiz)
100 CHARACTER(LEN=NCHARTITLE)::TITR1
101
102 TYPE (DRAPE_PLY_) , POINTER :: DRAPE_PLY
103
104 pid = ix(nix-1,1)
105 igtyp = igeo(11,pid)
106 irp = igeo(14,pid)
107 def_orth(1:mvsiz) = nlay
108 ipdir = 0
109
110 IF (igtyp == 1) THEN
111
112 RETURN
113 ELSE
114 ipang = 200
115 ipphi = 500
116 IF (igtyp == 17 .OR. igtyp == 51 .OR. igtyp == 52 ) THEN
117 ipang = 1
118 ipthk = ipang + nlay
119 ippos = ipthk + nlay
120 ipdir = ippos + nlay
121 ENDIF
122 SELECT CASE (irp)
123 CASE (0)
124 isk = igeo(2,pid)
125 DO i=jft,jlt
126 IF (isk == 0) THEN
127 vx(i) = geo(7,pid)
128 vy(i) = geo(8,pid)
129 vz(i) = geo(9,pid)
130 ELSE
131 vx(i) = skew(1,isk)
132 vy(i) = skew(2,isk)
133 vz(i) = skew(3,isk)
134 ENDIF
135 ENDDO
136 CASE (20)
137 DO i=jft,jlt
138 n1=ix(2,i)
139 n2=ix(3,i)
140 vx(i) = x(1,n2)-x(1,n1)
141 vy(i) = x(2,n2)-x(2,n1)
142 vz(i) = x(3,n2)-x(3,n1)
143 ENDDO
144 CASE (22)
145 isk = igeo(2,pid)
146 DO i=jft,jlt
147 vx(i) = skew(1,isk)
148 vy(i) = skew(2,isk)
149 vz(i) = skew(3,isk)
150 ENDDO
151 CASE (23)
152 vx0 = geo(7,pid)
153 vy0 = geo(8,pid)
154 vz0 = geo(9,pid)
155 DO i=jft,jlt
156 vx(i) = e3y(i)*vz0 - e3z(i)*vy0
157 vy(i) = e3z(i)*vx0 - e3x(i)*vz0
158 vz(i) = e3x(i)*vy0 - e3y(i)*vx0
159 ENDDO
160 CASE (24)
161
162 DO i=jft,jlt
163 n1=ix(2,i)
165 vx(i) = x(1,nod)-x(1,n1)
166 vy(i) = x(2,nod)-x(2,n1)
167 vz(i) = x(3,nod)-x(3,n1)
168 ENDDO
169 CASE (25)
170
171 isk = igeo(2,pid)
172 IF (nix > nixtg) THEN
173 DO i=jft,jlt
174 n1=ix(2,i)
175 n2=ix(3,i)
176 n3=ix(4,i)
177 n4=ix(5,i)
178 xc(i) = fourth*(x(1,n1)+x(1,n2)+x(1,n3)+x(1,n4))
179 yc(i) = fourth*(x(2,n1)+x(2,n2)+x(2,n3)+x(2,n4))
180 zc(i) = fourth*(x(3,n1)+x(3,n2)+x(3,n3)+x(3,n4))
181 ENDDO
182 ELSE
183 DO i=jft,jlt
184 n1=ix(2,i)
185 n2=ix(3,i)
186 n3=ix(4,i)
187 xc(i) = third*(x(1,n1)+x(1,n2)+x(1,n3))
188 yc(i) = third*(x(2,n1)+x(2,n2)+x(2,n3))
189 zc(i) = third*(x(3,n1)+x(3,n2)+x(3,n3))
190 ENDDO
191 END IF
192 DO i=jft,jlt
193 e11 = xc(i)-skew(10,isk)
194 e12 = yc(i)-skew(11,isk)
195 e13 = zc(i)-skew(12,isk)
196 vx(i) = skew(8,isk)*e13 - skew(9,isk)*e12
197 vy(i) = skew(9,isk)*e11 - skew(7,isk)*e13
198 vz(i) = skew(7,isk)*e12 - skew(8,isk)*e11
199 ENDDO
200 END SELECT
201
202 IF (igtyp == 9) THEN
203 DO i=jft,jlt
204 phi1(1,i)= geo(10,pid)
205 ENDDO
206 ELSEIF (igtyp == 10) THEN
207 DO i=jft,jlt
208 DO j=1,nlay
209 phi1(j,i)= geo(ipang+j,pid)
210 ENDDO
211 ENDDO
212 ELSEIF (igtyp == 11) THEN
213 DO i=jft,jlt
214 DO j=1,nlay
215 phi1(j,i)= geo(ipang+j,pid)
216 ENDDO
217 ENDDO
218 ELSEIF (igtyp == 17 .AND. irp /= 24) THEN
219 IF(idrape > 0) THEN
220 DO i=jft,jlt
221 ipang = 1
222 ie = indx(nft + i)
223 IF(ie == 0) THEN
224 DO j=1,nlay
225 ipid_ply = stack%IGEO(2 + j,isubstack)
226 IF(ipid_ply > 0) THEN
227 phi1(j,i) = angle(i) + geo(2,ipid_ply) + stack%GEO(ipang+j,isubstack)
228 IF (irep >= 2) phi2(j,i)= stack%GEO(ipdir+j,isubstack)
229 def_orth(i) = def_orth(i) - 1
230 ENDIF
231 ENDDO
232 ELSE
233 DO j=1,nlay
234 ipid_ply = stack%IGEO(2+j,isubstack)
235 IF(ipid_ply > 0) THEN
236 phi1(j,i) = angle(i) + geo(2,ipid_ply) + stack%GEO(ipang+j,isubstack)
237 IF (irep >= 2) phi2(j,i)= stack%GEO(ipdir+j,isubstack)
238 def_orth(i) = def_orth(i) - 1
239 ip = drape(ie)%INDX_PLY(j)
240 IF(ip > 0) THEN
241 drape_ply => drape(ie)%DRAPE_PLY(ip)
242 phi1(j,i) = phi1(j,i) + drape_ply%RDRAPE(1,2)
243 ENDIF
244 ENDIF
245 ENDDO
246 ENDIF
247 ENDDO
248 ELSE
249 DO i=jft,jlt
250 ipang = 1
251 DO j=1,nlay
252 ipid_ply = stack%IGEO(2+j,isubstack)
253 IF(ipid_ply > 0) THEN
254 phi1(j,i) = angle(i) + geo(2,ipid_ply) + stack%GEO(ipang+j,isubstack)
255 def_orth(i) = def_orth(i) - 1
256 IF (irep >= 2) phi2(j,i)= stack%GEO(ipdir+j,isubstack)
257 ENDIF
258 ENDDO
259 ENDDO
260 ENDIF
261 ELSEIF(igtyp == 51 .AND. irp /= 24 ) THEN
262 IF(idrape > 0) THEN
263 DO i=jft,jlt
264 ipang = 1
265 ipt_all = 0
266 ie = indx(nft + i)
267 IF(ie > 0) THEN
268 DO il=1,nlay
269 nptt = elbuf_str%BUFLY(il)%NPTT
270 ip = drape(ie)%INDX_PLY(il)
271 ipid_ply = stack%IGEO(2 + il,isubstack)
272 IF(ipid_ply > 0) THEN
273 IF(ip > 0) THEN
274 drape_ply => drape(ie)%DRAPE_PLY(ip)
275 nslice = drape_ply%NSLICE
276 def_orth(i) = def_orth(i) - 1
277 IF(irep >= 2) THEN
278 DO it = 1,nptt
279 ipt = ipt_all + it
280 phi1(ipt,i) = angle(i) + geo(2,ipid_ply) + stack%GEO(ipang+il,isubstack)
281 . + drape_ply%RDRAPE(it,2)
282 phi2(ipt,i) = stack%GEO(ipdir + il,isubstack)
283 ENDDO
284 ELSE
285 DO it = 1,nptt
286 ipt = ipt_all + it
287 phi1(ipt,i) = angle(i) + geo(2,ipid_ply) + stack%GEO(ipang+il,isubstack)
288 . + drape_ply%RDRAPE(it,2)
289 ENDDO
290 ENDIF
291 ELSE
292 def_orth(i) = def_orth(i) - 1
293 IF(irep >= 2) THEN
294 DO it = 1,nptt
295 ipt = ipt_all + it
296 phi1(ipt,i) = angle(i) + geo(2,ipid_ply) + stack%GEO(ipang + il,isubstack)
297 phi2(ipt,i) = stack%GEO(ipdir+il,isubstack)
298 ENDDO
299 ELSE
300 DO it = 1,nptt
301 ipt = ipt_all + it
302 phi1(ipt,i) = angle(i) + geo(2,ipid_ply) + stack%GEO(ipang + il,isubstack)
303 ENDDO
304 ENDIF
305 ENDIF
306 ENDIF
307 ipt_all = ipt_all + nptt
308 ENDDO
309 ELSE
310 DO il=1,nlay
311 nptt = elbuf_str%BUFLY(il)%NPTT
312 ipid_ply = stack%IGEO(2 + il,isubstack)
313 IF(ipid_ply > 0) THEN
314 def_orth(i) = def_orth(i) - 1
315 IF(irep >= 2) THEN
316 DO it = 1,nptt
317 ipt = ipt_all + it
318 phi1(ipt,i) = angle(i) + geo(2,ipid_ply) + stack%GEO(ipang + il,isubstack)
319 phi2(ipt,i) = stack%GEO(ipdir+il,isubstack)
320 ENDDO
321 ELSE
322 DO it = 1,nptt
323 ipt = ipt_all + it
324 phi1(ipt,i) = angle(i) + geo(2,ipid_ply) + stack%GEO(ipang + il,isubstack)
325 ENDDO
326 ENDIF
327 ENDIF
328 ipt_all = ipt_all + nptt
329 ENDDO
330 ENDIF
331 ENDDO
332 ELSE
333 DO i=jft,jlt
334 ipang = 1
335 DO il=1,nlay
336 ipid_ply = stack%IGEO(2 + il,isubstack)
337 IF(ipid_ply > 0 ) THEN
338 phi1(il,i) = angle(i) + geo(2,ipid_ply) + stack%GEO(ipang + il,isubstack)
339 def_orth(i) = def_orth(i) - 1
340 ENDIF
341 IF (irep >= 2) phi2(il,i)= stack%GEO(ipdir + il,isubstack)
342 ENDDO
343 ENDDO
344 ENDIF
345 ELSEIF(igtyp == 52 .AND. irp /= 24 ) THEN
346 IF(idrape > 0) THEN
347 DO i=jft,jlt
348 ipang = 1
349 ipt_all = 0
350 ie = indx(nft + i)
351 IF(ie > 0) THEN
352 DO il=1,nlay
353 nptt = elbuf_str%BUFLY(il)%NPTT
354 ip = drape(ie)%INDX_PLY(il)
355 ipid_ply = stack%IGEO(2+il,isubstack)
356 IF( ipid_ply > 0) THEN
357 IF(ip > 0) THEN
358 drape_ply => drape(ie)%DRAPE_PLY(ip)
359 nslice = drape_ply%NSLICE
360 def_orth(i) = def_orth(i) - 1
361 IF(irep >= 2) THEN
362 DO it = 1,nptt
363 ipt = ipt_all + it
364 phi1(ipt,i) = angle(i) + geo_stack(2,ipid_ply)
365 . + stack%GEO(ipang + il,isubstack) + drape_ply%RDRAPE(it,2)
366 phi2(ipt,i)= stack%GEO(ipdir+il,isubstack)
367 ENDDO
368 ELSE
369 DO it = 1,nptt
370 ipt = ipt_all + it
371 phi1(ipt,i) = angle(i) + geo_stack
372 . + stack%GEO(ipang
373 ENDDO
374 ENDIF
375 ELSE
376 def_orth(i) = def_orth(i) - 1
377 IF(irep >= 2) THEN
378 DO it = 1,nptt
379 ipt = ipt_all + it
380 phi1(ipt,i) = angle(i) + geo_stack(2,ipid_ply) + stack%GEO(ipang + il
381 phi2(ipt,i) = stack%GEO(ipdir+il,isubstack)
382 ENDDO
383 ELSE
384 DO it = 1,nptt
385 ipt = ipt_all + it
386 phi1(ipt,i) = angle(i) + geo_stack(2,ipid_ply) + stack%GEO(ipang + il,isubstack)
387 ENDDO
388 ENDIF
389 ENDIF
390 ENDIF
391 ipt_all = ipt_all + nptt
392 ENDDO
393 ELSE
394 DO il=1,nlay
395 nptt = elbuf_str%BUFLY(il)%NPTT
396 ipid_ply = stack%IGEO(2+il,isubstack)
397 IF(ipid_ply > 0) THEN
398 def_orth(i) = def_orth(i) - 1
399 IF(irep >= 2)THEN
400 DO it = 1,nptt
401 ipt = ipt_all + it
402 phi1(ipt,i) = angle(i) + geo_stack(2,ipid_ply) + stack%GEO(ipang + il,isubstack)
403 phi2(ipt,i)= stack%GEO(ipdir+il,isubstack)
404 ENDDO
405 ELSE
406 DO it = 1,nptt
407 ipt = ipt_all + it
408 phi1(ipt,i) = angle(i) + geo_stack(2,ipid_ply) + stack%GEO(ipang + il,isubstack)
409 ENDDO
410 ENDIF
411 ENDIF
412 ipt_all = ipt_all + nptt
413 ENDDO
414 ENDIF
415 ENDDO
416 ELSE
417 DO i=jft,jlt
418 ipang = 1
419 DO il=1,nlay
420 ipid_ply = stack%IGEO(2+il,isubstack)
421 IF(ipid_ply > 0) THEN
422 def_orth(i) = def_orth(i) - 1
423 phi1(il,i) = angle(i) + geo_stack(2,ipid_ply) + stack%GEO(ipang + il,isubstack)
424 IF(irep >= 2) phi2(il,i)= stack%GEO(ipdir+il,isubstack)
425 ENDIF
426 ENDDO
427 ENDDO
428 ENDIF
429 ELSEIF (igtyp == 16) THEN
430 DO i=jft,jlt
431 DO j=1,nlay
432 phi1(j,i)= geo(ipang+j,pid)
433 phi2(j,i)= geo(ipphi+j,pid)
434 ENDDO
435 ENDDO
436 ENDIF
437
438 IF (iortshel == 1) THEN
439 DO i=jft,jlt
440 IF (abs(isigi) /= 3 .AND. abs(isigi)/=4 .AND. abs(isigi)/=5) THEN
441
443 ii = ptsh(i + nft)
444 IF(ii == 0) GOTO 100
445 n = nint(sigsh(1,ii))
447 CONTINUE
448 ELSE
449 DO j = 1,numel
450 ii = j
451 n = nint(sigsh(1,ii))
453 IF (n == 0) GOTO 100
454 ENDDO
455 GOTO 100
456 60 CONTINUE
457 ENDIF
458 ELSE
459 jj=nft+i
460 n =ix(nix,i)
461 ii=ptsh(jj)
462 IF (ii == 0) GOTO 100
463 END IF
464 IF(sigsh(nvshell + nushell + 5,ii) == zero) cycle
465
466 npti = nint(sigsh(nvshell + nushell + 4,ii))
467 IF(igtyp == 9) npti = 1
468 IF (nlay /= npti) THEN
469 ipid = ix(nix-1,i)
470 pid = igeo(1,ipid)
471 CALL fretitl2(titr1,igeo(npropgi-ltitr+1,ipid),ltitr)
472 IF (npti == 0) THEN
474 . msgtype=msgwarning,
475 . anmode=aninfo_blind_1,
476 . i1=n,
477 . i2=pid,
478 . c1=titr1)
479 ELSE
481 . anmode=aninfo,
482 . msgtype=msgerror,
483 . i2=n,
484 . i1=pid,
485 . c1=titr1)
486 ENDIF
487 ENDIF
488
489 ipt = nvshell + nushell
490 vx(i) = sigsh(ipt+1,ii)
491 vy(i) = sigsh(ipt+2,ii)
492 vz(i) = sigsh(ipt+3,ii)
493 ipt = ipt + 5
494 IF ( igtyp == 9) THEN
495 phi1(1,i) = sigsh(ipt+1,ii)
496 phi2(1,i) = sigsh(ipt+2,ii)
497 ipt = ipt + 2
498 ELSE
499 DO j=1,npti
500 phi1(j,i) = sigsh(ipt+1,ii)
501 phi2(j,i) = sigsh(ipt+2,ii)
502 ipt = ipt + 2
503 ENDDO
504 ENDIF
505 100 CONTINUE
506 ENDDO
507 ENDIF
508
509
510 IF (iortshel == 2) THEN
511 DO i=jft,jlt
512 ie = i + nft
513 IF (abs(isigi) /= 3 .AND. abs(isigi) /= 4 .AND. abs(isigi) /= 5) THEN
515 ii = ptsh(ie)
516 IF(ii == 0) GOTO 110
517 n = nint(sigsh(1,ii))
519 CONTINUE
520 ELSE
521 DO j = 1,numel
522 ii = j
523 n = nint(sigsh(1,ii))
525 IF (n == 0) GOTO 110
526 ENDDO
527 GOTO 110
528 70 CONTINUE
529 ENDIF
530 ELSE
531 jj=nft+i
532 n =ix(nix,i)
533 ii=ptsh(jj)
534 IF (ii == 0) GOTO 110
535 END IF
536 IF(sigsh(nvshell + nushell + 5,ii) == zero) cycle
537 npti = nint(sigsh(nvshell + nushell + 4,ii))
538
539 npt = nint(geo(6,ix(nix-1,i)))
540 IF(idrape > 0 .AND. (igtyp == 51 .OR. igtyp==52)) THEN
541 npt = npt_all
542 ELSEIF (igtyp == 16 .OR. igtyp == 17 .OR. igtyp == 51 .OR. igtyp == 52) THEN
543 npt = nlay
544 ENDIF
545 IF (npt /= npti) THEN
546 ipid = ix(nix-1,i)
547 pid = igeo(1,ipid)
548 CALL fretitl2(titr1,igeo(npropgi-ltitr+1,ipid),ltitr)
549 IF (npti == 0) THEN
551 . msgtype=msgwarning,
552 . anmode=aninfo_blind_1,
553 . i1=n,
554 . i2=pid,
555 . c1=titr1)
556 ELSE
558 . anmode=aninfo,
559 . msgtype=msgerror,
560 . i2=n,
561 . i1=pid,
562 . c1=titr1)
563 ENDIF
564 ENDIF
565
566 ipt = nvshell + nushell + 5
567 IF (igtyp == 9) THEN
568 coor1(1,i) = sigsh(ipt+1,ii)
569 coor2(1,i) = sigsh(ipt+2,ii)
570 ipt = ipt + 2
571 iorthloc(i) = 1
572 ELSEIF (igtyp == 10 .OR. igtyp == 11 .OR. igtyp == 16 .OR.
573 . igtyp == 17 .OR. igtyp == 51 .OR. igtyp == 52) THEN
574 DO j=1,npti
575 ilaw_ly = elbuf_str%BUFLY(j)%ILAW
576 IF (igtyp == 16 .OR.(igtyp == 51 .AND. ilaw_ly == 58)
577 . .OR.(igtyp == 52 .AND. ilaw_ly == 58) ) THEN
578 coor1(j,i) = sigsh(ipt+1,ii)
579 coor2(j,i) = sigsh(ipt+2,ii)
580 coor3(j,i) = sigsh(ipt+3,ii)
581 coor4(j,i) = sigsh(ipt+4,ii)
582 ipt = ipt + 4
583 ELSE
584 coor1(j,i) = sigsh(ipt+1,ii)
585 coor2(j,i) = sigsh(ipt+2,ii)
586 ipt = ipt + 2
587 ENDIF
588 ENDDO
589 iorthloc(i) = 1
590 ENDIF
591 110 CONTINUE
592 ENDDO
593 ENDIF
594
595
596 IF(irp /= 26 ) THEN
597 DO i=jft,jlt
598 v(i) =vx(i)*e3x(i)+vy(i)*e3y(i)+vz(i)*e3z(i)
599 vx(i)=vx(i)-v(i)*e3x(i)
600 vy(i)=vy(i)-v(i)*e3y(i)
601 vz(i)=vz(i)-v(i)*e3z(i)
602 v(i) =sqrt(vx(i)*vx(i)+vy(i)*vy(i)+vz(i)*vz(i))
603 ENDDO
604
605 DO i=jft,jlt
606 IF (v(i) < em3 .AND. iorthloc(i) == 0 .AND.
607 . def_orth(i) /= 0)THEN
608 pid = ix(nix-1,i)
610 CALL fretitl2(titr1,igeo(npropgi-ltitr+1,pid),ltitr)
612 . msgtype=msgerror,
613 . anmode=aninfo,
614 . i1=igeo(1,pid),
615 . c1=titr1,
616 . i2=ix(nix,i))
617 ENDIF
618 vx(i)=vx(i)/v(i)
619 vy(i)=vy(i)/v(i)
620 vz(i)=vz(i)/v(i)
621 ENDDO
622 ENDIF
623
624
625
626 DO i=jft,jlt
627
628 e11= x2(i)-x1(i)
629 e12= y2(i)-y1(i)
630 e13= z2(i)-z1(i)
631 ne1 = sqrt(e11*e11+e12*e12+e13*e13)
632
633 betaorth(i) = (vx(i)*e11 + vy(i)*e12 +vz(i)*e13 )/
max(ne1,em20)
634 ENDDO
635
636 ENDIF
637
638 RETURN
subroutine add_node(n, ancestor, parent, j, i)
integer, parameter nchartitle
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)