277
278
279
280 USE rbe3_mod
281 USE rbe3f_pen_mod, only : rbe3f_pen
282
283
284
285#include "implicit_f.inc"
286
287
288
289#include "com04_c.inc"
290#include "param_c.inc"
291
292
293
294 INTEGER IRBE3(NRBE3L,*),LRBE3(*),WEIGHT(*)
295 INTEGER MAX_M,IROTG,JT(3,*),JR(3,*),NMT0,IADMP(*)
296 INTEGER, INTENT(IN) :: NMT
297 INTEGER, INTENT(IN) :: IRODDL,IPARIT
298
300 . x(3,*), a(3,*), ar(3,*), ms(*), in(*), frbe3(*),skew(*),
301 . stifn(*) ,stifr(*), am(3,*), arm(3,*), msm(*), inm(*),
302 . stifnm(*) ,stifrm(*), v(3,*), vr(3,*)
304 TYPE (RBE3_pen), INTENT(INOUT) :: PEN
305 double precision
306 . am_p(6,3,nmt), arm_p(6,3,nmt), msm_p(6,nmt), inm_p(6,nmt),
307 . stifnm_p(6,nmt), stifrm_p(6,nmt)
308
309
310
311 INTEGER I, J, N, NS ,NML, IAD,IROT,IADS,NN,K,IMOD,IADF,
312 . IPEN,N_P,ICOLINE
313
315 . fns(3),mns(3),mss(3),ins(3),stn(3),str(3),fsum,msum,
316 . fmax,smax,mmax,sfd,smd,f2max
318 . DIMENSION(:,:,:),ALLOCATABLE :: fdstnb ,mdstnb
319 my_real,
DIMENSION(:,:),
ALLOCATABLE :: amp ,armp
320 my_real,
DIMENSION(:),
ALLOCATABLE :: msmp ,inmp,stifnmp,stifrmp
321 DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: , R2_6
322 DOUBLE PRECISION, DIMENSION(:,:,:), ALLOCATABLE :: RR_6
323
324
325 iads = nmt0
326 IF (max_m>0) THEN
327 ALLOCATE(fdstnb(3,6,max_m))
328 IF (irotg>0) ALLOCATE(mdstnb(3,6,max_m))
329 END IF
330 ALLOCATE(amp(3,max_m))
331 ALLOCATE(msmp(max_m))
332 ALLOCATE(stifnmp(max_m))
333 IF (irotg>0) THEN
334 ALLOCATE(armp(3,max_m))
335 ALLOCATE(inmp(max_m))
336 ALLOCATE(stifrmp(max_m))
337 END IF
338 IF (iparit>0) THEN
339 IF (max_m>0) THEN
340 ALLOCATE(rr_6(6,3,max_m))
341 ALLOCATE(r1_6(6,max_m))
342 ALLOCATE(r2_6(6,max_m))
343 END IF
344 DO n=1,nrbe3
345 iad = irbe3(1,n)
346 ns = irbe3(3,n)
347 nml = irbe3(5,n)
348 irot =irbe3(6,n)
349 imod =irbe3(8,n)
350 ipen =irbe3(9,n)
351 IF (ns==0.OR.ipen>0) cycle
352 IF (weight(ns)==1) THEN
353 CALL rbe3cl(lrbe3(iad+1),lrbe3(iads+iad+1),ns ,x ,
354 . frbe3(6*iad+1),skew ,nml ,irot ,fdstnb ,
355 . mdstnb ,irbe3(2,n))
356 DO j = 1,3
357 nn = jt(j,n)*weight(ns)
358 fns(j) = a(j,ns)*nn
359 mss(j) = ms(ns)*nn/3
360 stn(j) = stifn(ns)*nn
361 END DO
362 amp = zero
363 msmp = zero
364 stifnmp = zero
365
366 IF (imod <=3) THEN
367 CALL mfac_rbe3(fdstnb,mdstnb,nml ,irotg,sfd ,smd)
368 DO i=1,nml
369 DO j = 1,3
370 fsum = fdstnb(j,1,i)+fdstnb(j,2,i)+fdstnb(j,3,i)
371 msmp(i) = msmp(i) + abs(fsum)*mss(j)*sfd
372 END DO
373 END DO
374 ELSEIF (imod ==4) THEN
375 DO i=1,nml
376 iadf =6*(iad+i-1)
377 DO j = 1,3
378 msmp(i) = msmp(i)+frbe3(iadf+j)*mss(j)
379 END DO
380 END DO
381 END IF
382 DO i=1,nml
383 DO j = 1,3
384 amp(1:3,i) = amp(1:3,i)+fdstnb(1:3,j,i)*fns(j)
385 END DO
386
387 smax = zero
388 DO j = 1,3
389 fmax=abs(fdstnb(j,1,i))+abs(fdstnb(j,2,i))+abs(fdstnb(j,3,i))
390 f2max=fdstnb(j,1,i)*fdstnb(j,1,i)+fdstnb(j,2,i)*fdstnb(j,2,i)+
391 . fdstnb(j,3,i)*fdstnb(j,3,i)
392 smax =
max(smax,
max(fmax,f2max)*stn(j))
393 END DO
394 stifnmp(i) = smax
395 ENDDO
396 IF ((jr(1,n)+jr(2,n)+jr(3,n))>0) THEN
397 DO j = 1,3
398 nn = jr(j,n)*weight(ns)
399 mns(j) = ar(j,ns)*nn
400 ins(j) = in(ns)*nn/3
401 str(j) = stifr(ns)*nn
402 END DO
403 DO i=1,nml
404 DO j = 1,3
405 amp(1:3,i) = amp(1:3,i)+fdstnb(1:3,j+3,i)*mns(j)
406 END DO
407 smax = zero
408 DO j = 1,3
409
410 fsum = fdstnb(j,4,i)+fdstnb(j,5,i)+fdstnb(j,6,i)
411 msmp(i) =msmp(i)+abs(fsum)*ins(j)
412 fmax=abs(fdstnb(j,4,i))+abs(fdstnb(j,5,i))+abs(fdstnb(j,6,i))
413 f2max=fdstnb(j,4,i)*fdstnb(j,4,i)+fdstnb(j,5,i)*fdstnb(j,5,i)+
414 . fdstnb(j,6,i)*fdstnb(j,6,i)
415 smax =
max(smax,
max(fmax,f2max)*str(j))
416 END DO
417 stifnmp(i) = stifnm(i)+smax
418 END DO
419 ENDIF
423 DO i=1,nml
424 k = iadmp(iad+i)
425 DO j = 1,6
426 am_p(j,1:3,k) = am_p(j,1:3,k)+rr_6(j,1:3,i)
427 msm_p(j,k) = msm_p(j,k)+r1_6(j,i)
428 stifnm_p(j,k) = stifnm_p(j,k)+r2_6(j,i)
429 END DO
430 END DO
431 IF (irot>0) THEN
432 armp = zero
433 inmp = zero
434 stifrmp = zero
435 DO i=1,nml
436 DO j = 1,3
437 armp(1:3,i) = armp(1:3,i)+mdstnb(1:3,j,i)*fns(j)
438 END DO
439 smax = zero
440 DO j = 1,3
441 msum = mdstnb(j,1,i)+mdstnb(j,2,i)+mdstnb(j,3,i)
442 IF (imod /=4) inmp(i) = inmp(i)+abs(msum)*mss(j)
443 mmax=abs(mdstnb(j,1,i))+abs(mdstnb(j,2,i))+abs(mdstnb(j,3,i))
444 smax =
max(smax,mmax*stn(j))
445 END DO
446 stifrmp(i) = stifrmp(i)+smax
447 END DO
448 IF ((jr(1,n)+jr(2,n)+jr(3,n))>0) THEN
449 IF (imod <=3) THEN
450 DO i=1,nml
451 DO j = 1,3
452 msum = mdstnb(j,4,i)+mdstnb(j,5,i)+mdstnb(j,6,i)
453 inmp(i) = inmp(i)+abs(msum)*ins(j)*smd
454 END DO
455 ENDDO
456 ELSEIF (imod ==4) THEN
457 DO i=1,nml
458 iadf =6*(iad+i-1)
459 DO j = 1,3
460 inmp(i) = inmp(i)+frbe3(iadf+j+3)*ins(j)
461 END DO
462 END DO
463 END IF
464 DO i=1,nml
465 DO j = 1,3
466 armp(1:3,i) =armp(1:3,i)+mdstnb(1:3,j+3,i)*mns(j)
467 END DO
468 smax = zero
469 DO j = 1,3
470 mmax=abs(mdstnb(j,4,i))+abs(mdstnb(j,5,i))+abs(mdstnb(j,6,i))
471 smax =
max(smax,mmax*str(j))
472 END DO
473 stifrmp(i) = stifrmp(i)+smax
474 END DO
475 END IF
479 DO i=1,nml
480 k = iadmp(iad+i)
481 DO j = 1,6
482 arm_p(j,1:3,k) = arm_p(j,1:3,k)+rr_6(j,1:3,i)
483 inm_p(j,k) = inm_p(j,k)+r1_6(j,i)
484 stifrm_p(j,k) = stifrm_p(j,k)+r2_6(j,i)
485 END DO
486 END DO
487 END IF
488
489 stifn(ns) = em20
490 IF ((jr(1,n)+jr(2,n)+jr(3,n))>0) stifr(ns) = em20
491 END IF
492 END DO
493
494 n_p = 0
495 DO n=1,nrbe3
496 iad = irbe3(1,n)
497 ns = irbe3(3,n)
498 nml = irbe3(5,n)
499 irot =irbe3(6,n)
500 imod =irbe3(8,n)
501 ipen =irbe3(9,n)
502 IF (ns==0.OR.ipen<=0) cycle
503 IF (weight(ns)==1) THEN
504 n_p = n_p +1
505 amp = zero
506 stifnmp = zero
507 IF (irot>0) THEN
508 armp = zero
509 stifrmp = zero
510 END IF
511 CALL rbe3f_pen(
512 . ns ,numnod ,dt1 ,iroddl ,
513 . nml ,lrbe3(iad+1),lrbe3(iads+iad+1),in ,
514 . a ,ar ,amp ,armp ,
515 . stifn ,stifr ,stifnmp ,stifrmp ,
516 . v ,vr ,frbe3(6*iad+1),x ,
517 . lskew ,numskw ,skew ,
518 . pen%RRBE3PEN_F(1,n_p) ,pen%RRBE3PEN_STF(1,n_p) ,
519 . pen%RRBE3PEN_FAC(n_p) ,pen%RRBE3PEN_VI(n_p) ,
520 . pen%RRBE3PEN_M(1,n_p) ,icoline )
523 DO i=1,nml
524 k = iadmp(iad+i)
525 DO j = 1,6
526 am_p(j,1:3,k) = am_p(j,1:3,k)+rr_6(j,1:3,i)
527 stifnm_p(j,k) = stifnm_p(j,k)+r2_6(j,i)
528 END DO
529 END DO
530 IF (icoline>0) THEN
533 DO i=1,nml
534 k = iadmp(iad+i)
535 DO j = 1,6
536 arm_p(j,1:3,k) = arm_p(j,1:3,k)+rr_6(j,1:3,i)
537 stifrm_p(j,k) = stifrm_p(j,k)+r2_6(j,i)
538 END DO
539 END DO
540 END IF
541 END IF
542 END DO
543 DEALLOCATE(rr_6)
544 DEALLOCATE(r1_6)
545 DEALLOCATE(r2_6)
546 ELSE
547 DO n=1,nrbe3
548 iad = irbe3(1,n)
549 ns = irbe3(3,n)
550 nml = irbe3(5,n)
551 irot =irbe3(6,n)
552 imod =irbe3(8,n)
553 ipen =irbe3(9,n)
554 IF (ns==0.OR.ipen>0) cycle
555 IF (weight(ns)==1) THEN
556 CALL rbe3cl(lrbe3(iad+1),lrbe3(iads+iad+1),ns ,x ,
557 . frbe3(6*iad+1),skew ,nml ,irot ,fdstnb ,
558 . mdstnb ,irbe3(2,n))
559 DO j = 1,3
560 nn = jt(j,n)*weight(ns)
561 fns(j) = a(j,ns)*nn
562 mss(j) = ms(ns)*nn/3
563 stn(j) = stifn(ns)*nn
564 ENDDO
565
566 IF (imod <=3) THEN
567 CALL mfac_rbe3(fdstnb,mdstnb,nml ,irotg,sfd ,smd)
568 DO i=1,nml
569 k = iadmp(iad+i)
570 DO j = 1,3
571 fsum = fdstnb(j,1,i)+fdstnb(j,2,i)+fdstnb(j,3,i)
572 msm(k) = msm(k)+abs(fsum)*mss(j)*sfd
573 ENDDO
574 ENDDO
575 ELSEIF (imod ==4) THEN
576 DO i=1,nml
577 k = iadmp(iad+i)
578 iadf =6*(iad+i-1)
579 DO j = 1,3
580 msm(k) = msm(k)+frbe3(iadf+j)*mss(j)
581 ENDDO
582 ENDDO
583 END IF
584 DO i=1,nml
585 k = iadmp(iad+i)
586 DO j = 1,3
587 am(1,k) = am(1,k)+fdstnb(1,j,i)*fns(j)
588 am(2,k) = am(2,k)+fdstnb(2,j,i)*fns(j)
589 am(3,k) = am(3,k)+fdstnb(3,j,i)*fns(j)
590 ENDDO
591
592 smax = zero
593 DO j = 1,3
594 fmax=abs(fdstnb(j,1,i))+abs(fdstnb(j,2,i))+abs(fdstnb(j,3,i))
595 f2max=fdstnb(j,1,i)*fdstnb(j,1,i)+fdstnb(j,2,i)*fdstnb(j,2,i)+
596 . fdstnb(j,3,i)*fdstnb(j,3,i)
597 smax =
max(smax,
max(fmax,f2max)*stn(j))
598 ENDDO
599 stifnm(k) = stifnm(k)+smax
600 ENDDO
601 IF ((jr(1,n)+jr(2,n)+jr(3,n))>0) THEN
602 DO j = 1,3
603 nn = jr(j,n)*weight(ns)
604 mns(j) = ar(j,ns)*nn
605 ins(j) = in(ns)*nn/3
606 str(j) = stifr(ns)*nn
607 ENDDO
608 DO i=1,nml
609 k = iadmp(iad+i)
610 DO j = 1,3
611 am(1,k) = am(1,k)+fdstnb(1,j+3,i)*mns(j)
612 am(2,k) = am(2,k)+fdstnb(2,j+3,i)*mns(j)
613 am(3,k) = am(3,k)+fdstnb(3,j+3,i)*mns(j)
614 ENDDO
615 smax = zero
616 DO j = 1,3
617
618 fsum = fdstnb(j,4,i)+fdstnb(j,5,i)+fdstnb(j,6,i)
619 msm(k) =msm(k)+abs(fsum)*ins(j)
620 fmax=abs(fdstnb(j,4,i))+abs(fdstnb(j,5,i))+abs(fdstnb(j,6,i))
621 f2max=fdstnb(j,4,i)*fdstnb(j,4,i)+fdstnb(j,5,i)*fdstnb(j,5,i)+
622 . fdstnb(j,6,i)*fdstnb(j,6,i)
623 smax =
max(smax,
max(fmax,f2max)*str(j))
624 ENDDO
625 stifnm(k) = stifnm(k)+smax
626 ENDDO
627 ENDIF
628 IF (irot>0) THEN
629 DO i=1,nml
630 k = iadmp(iad+i)
631 DO j = 1,3
632 arm(1,k) = arm(1,k)+mdstnb(1,j,i)*fns(j)
633 arm(2,k) = arm(2,k)+mdstnb(2,j,i)*fns(j)
634 arm(3,k) = arm(3,k)+mdstnb(3,j,i)*fns(j)
635 ENDDO
636 smax = zero
637 DO j = 1,3
638
639 msum = mdstnb(j,1,i)+mdstnb(j,2,i)+mdstnb(j,3,i)
640 IF (imod /=4) inm(k) = inm(k)+abs(msum)*mss(j)
641 mmax=abs(mdstnb(j,1,i))+abs(mdstnb(j,2,i))+abs(mdstnb(j,3,i))
642 smax =
max(smax,mmax*stn(j))
643 ENDDO
644 stifrm(k) = stifrm(k)+smax
645 ENDDO
646 IF ((jr(1,n)+jr(2,n)+jr(3,n))>0) THEN
647 IF (imod <=3) THEN
648 DO i=1,nml
649 k = iadmp(iad+i)
650 DO j = 1,3
651 msum = mdstnb(j,4,i)+mdstnb(j,5,i)+mdstnb(j,6,i)
652 inm(k) = inm(k)+abs(msum)*ins(j)*smd
653 ENDDO
654 ENDDO
655 ELSEIF (imod ==4) THEN
656 DO i=1,nml
657 k = iadmp(iad+i)
658 iadf =6*(iad+i-1)
659 DO j = 1,3
660 inm(k) = inm(k)+frbe3(iadf+j+3)*ins(j)
661 ENDDO
662 ENDDO
663 END IF
664 DO i=1,nml
665 k = iadmp(iad+i)
666 DO j = 1,3
667 arm(1,k) = arm(1,k)+mdstnb(1,j+3,i)*mns(j)
668 arm(2,k) = arm(2,k)+mdstnb(2,j+3,i)*mns(j)
669 arm(3,k) = arm(3,k)+mdstnb(3,j+3,i)*mns(j)
670 ENDDO
671 smax = zero
672 DO j = 1,3
673 mmax=abs(mdstnb(j,4,i))+abs(mdstnb(j,5,i))+abs(mdstnb(j,6,i))
674 smax =
max(smax,mmax*str(j))
675 ENDDO
676 stifrm(k) = stifrm(k)+smax
677 ENDDO
678 ENDIF
679 ENDIF
680
681 stifn(ns) = em20
682 IF ((jr(1,n)+jr(2,n)+jr(3,n))>0) stifr(ns) = em20
683 ENDIF
684
685 ENDDO
686
687 n_p = 0
688 DO n=1,nrbe3
689 iad = irbe3(1,n)
690 ns = irbe3(3,n)
691 nml = irbe3(5,n)
692 irot =irbe3(6,n)
693 imod =irbe3(8,n)
694 ipen =irbe3(9,n)
695 IF (ns==0.OR.ipen<=0) cycle
696 IF (weight(ns)==1) THEN
697 n_p = n_p +1
698 amp = zero
699 stifnmp = zero
700 IF (irot>0) THEN
701 armp = zero
702 stifrmp = zero
703 END IF
704 CALL rbe3f_pen(
705 . ns ,numnod ,dt1 ,iroddl ,
706 . nml ,lrbe3(iad+1),lrbe3(iads+iad+1),in ,
707 . a ,ar ,amp ,armp ,
708 . stifn ,stifr ,stifnmp ,stifrmp ,
709 . v ,vr ,frbe3(6*iad+1),x ,
710 . lskew
711 . pen%RRBE3PEN_F(1,n_p) ,pen%RRBE3PEN_STF(1,n_p) ,
712 . pen%RRBE3PEN_FAC(n_p) ,pen%RRBE3PEN_VI(n_p) ,
713 . pen%RRBE3PEN_M(1,n_p) ,icoline )
714 DO i=1,nml
715 k = iadmp(iad+i)
716 am(1:3,k) = am(1:3,k)+amp(1:3,i)
717 stifnm(k) = stifnm(k)+stifnmp(i)
718 END DO
719 IF (icoline>0) THEN
720 DO i=1,nml
721 k = iadmp(iad+i)
722 arm(1:3,k) = arm(1:3,k)+armp(1:3,i)
723 stifrm(k) = stifrm(k)+stifrmp(i)
724 END DO
725 END IF
726 ENDIF
727 ENDDO
728 END IF
729
730 DEALLOCATE(fdstnb)
731 IF (irotg>0) DEALLOCATE(mdstnb)
732 DEALLOCATE(amp)
733 DEALLOCATE(msmp)
734 DEALLOCATE(stifnmp)
735 IF (irotg>0) THEN
736 DEALLOCATE(armp)
737 DEALLOCATE(inmp)
738 DEALLOCATE(stifrmp)
739 END IF
740
741 RETURN
subroutine foat_to_6_float(jft, jlt, f, f6)
subroutine rbe3cl(inrbe3, ilrbe3, ns, xyz, frbe3, skew, ng, irot, fdstnb, mdstnb, id)
subroutine mfac_rbe3(fdstnb, mdstnb, nml, irot, sf, sm)