File: fbs3.f

package info (click to toggle)
nastran 0.1.95-2
  • links: PTS, VCS
  • area: non-free
  • in suites: bookworm, bullseye, sid
  • size: 122,540 kB
  • sloc: fortran: 284,409; sh: 771; makefile: 324
file content (133 lines) | stat: -rw-r--r-- 3,772 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
      SUBROUTINE FBS3 (BLOCK,Y,YN,NWDS)
C
C     FBS3 EXECUTES THE FORWARD/BACKWARD PASS FOR FBSF IN CSP
C
      INTEGER         BLOCK(8), DBL, BUF(2), SUBNAM, BEGN, END
      REAL            Y(1), YN(1), LJJR, LJJI, L
      CHARACTER       UFM*23, UWM*25, UIM*29, SFM*25
      COMMON /XMSSG / UFM, UWM, UIM, SFM
      COMMON /SYSTEM/ SYSBUF, NOUT
      COMMON /ZZZZZZ/ L(1)
      COMMON /FBSX  / DBL   , N
      EQUIVALENCE     (SUMR,YJKR),  (SUMI,YJKI)
      DATA    SUBNAM, BEGN  , END / 4HFBS3, 4HBEGN, 4HEND /
C
      BUF(1) = SUBNAM
      BUF(2) = BEGN
      CALL CONMSG (BUF,2,0)
      NBRITM = NWDS
      J    = (LOCFX(YN)-LOCFX(Y)+1)/NWDS
      LAST = MAX0(J,1)*NBRITM
      DO 35 J = 1,N
      J1 = J - 1
      DO 5 K = 1,LAST,NBRITM
      YJKR = Y(2*J+K-2)
      YJKI = Y(2*J+K-1)
      IF (YJKR.NE.0.0 .OR. YJKI.NE.0.0) GO TO 7
    5 CONTINUE
      CALL SKPREC (BLOCK(1),1)
      GO TO 35
C
C     MAKE 1ST CALL FOR COLUMN AND SAVE DIAGONAL ELEMENT
C
    7 BLOCK(8) = -1
      CALL GETSTR (*80,BLOCK)
      IF (BLOCK(4) .NE. J) GO TO 80
      JSTR = BLOCK(5)
      LJJR = L(JSTR  )
      LJJI = L(JSTR+1)
      IF (BLOCK(6) .EQ. 1) GO TO 20
      NSTR = JSTR + 2*BLOCK(6) - 2
      JSTR = JSTR + 2
      BLOCK(4) = BLOCK(4) + 1
C
C     PROCESS CURRENT STRING IN TRIANGULAR FACTOR AGAINST EACH
C     LOAD VECTOR IN CORE -- Y(I,K) = Y(I,K) + L(I,J)*Y(J,K)
C
   10 DO 15 K = 1,LAST,NBRITM
      YJKR = Y(2*J+K-2)
      YJKI = Y(2*J+K-1)
      IF (YJKR.EQ.0.0 .AND. YJKI.EQ.0.0) GO TO 15
      IK   = 2*BLOCK(4) + K - 2
      DO 12 IJ = JSTR,NSTR,2
      Y(IK  ) =  Y(IK  ) + L(IJ)*YJKR - L(IJ+1)*YJKI
      Y(IK+1) =  Y(IK+1) + L(IJ)*YJKI + L(IJ+1)*YJKR
   12 IK = IK + 2
   15 CONTINUE
C
C     GET NEXT STRING IN TRIANGULAR FACTOR
C
   20 CALL ENDGET (BLOCK)
      CALL GETSTR (*30,BLOCK)
      JSTR = BLOCK(5)
      NSTR = JSTR + 2*BLOCK(6) - 2
      GO TO 10
C
C     END-OF-COLUMN ON TRIANGULAR FACTOR -- DIVIDE BY DIAGONAL
C
   30 SSQR = 1.0/(LJJR**2 + LJJI**2)
      DO 32 K = 1,LAST,NBRITM
      YJKR       = (Y(2*J+K-2)*LJJR + Y(2*J+K-1)*LJJI)*SSQR
      Y(2*J+K-1) =-(Y(2*J+K-2)*LJJI - Y(2*J+K-1)*LJJR)*SSQR
   32 Y(2*J+K-2) = YJKR
C
   35 CONTINUE
C
C     INITIALIZE FOR BACKWARD PASS BY SKIPPING THE NTH COLUMN
C
      IF (N .EQ. 1) GO TO 65
      CALL BCKREC (BLOCK)
      J = N - 1
C
C     GET A STRING IN CURRENT COLUMN.  IF STRING INCLUDES DIAGONAL,
C     ADJUST STRING TO SKIP IT.
C
   40 J1 = J - 1
      BLOCK(8) = -1
   42 CALL GETSTB (*60,BLOCK)
      IF (BLOCK(4)-BLOCK(6) .EQ. J1) BLOCK(6) = BLOCK(6) - 1
      IF (BLOCK(6) .EQ. 0) GO TO 58
      NTERMS = BLOCK(6)
C
C     PROCESS CURRENT STRING IN TRIANGULAR FACTOR AGAINST EACH
C     LOAD VECTOR IN CORE -- Y(J,K) = Y(J,K) + L(J,I)*Y(I,K)
C
      DO 55 K = 1,LAST,NBRITM
      JI = BLOCK(5) + 2
      IK = BLOCK(4)*2 + K
      JK = J1*2 + K
      SUMR = 0.0
      SUMI = 0.0
      DO 53 II = 1,NTERMS
      JI = JI - 2
      IK = IK - 2
      SUMR = SUMR + L(JI)*Y(IK  ) - L(JI+1)*Y(IK+1)
      SUMI = SUMI + L(JI)*Y(IK+1) + L(JI+1)*Y(IK  )
   53 CONTINUE
      Y(JK  ) = Y(JK  ) + SUMR
      Y(JK+1) = Y(JK+1) + SUMI
   55 CONTINUE
C
C     TERMINATE CURRENT STRING AND GET NEXT STRING
C
   58 CALL ENDGTB (BLOCK)
      GO TO 42
C
C     END-OF-COLUMN -- TEST FOR COMPLETION
C
   60 IF (J .NE. 1) GO TO 70
   65 BUF(2) = END
      CALL CONMSG (BUF,2,0)
      RETURN
C
   70 J = J - 1
      GO TO 40
C
C     FATAL ERROR MESSAGE
C
   80 WRITE  (NOUT,82) SFM,SUBNAM
   82 FORMAT (A25,' 2149, SUBROUTINE ',A4,/5X,'FIRST ELEMENT OF A COLU',
     1      'MN OF LOWER TRIANGULAR MATRIX IS NOT THE DIAGONAL ELEMENT')
      CALL MESAGE (-61,0,0)
      RETURN
      END