File: ferfbd.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 (182 lines) | stat: -rw-r--r-- 5,371 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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
      SUBROUTINE FERFBD(V1,V2,V3,VB)
C
C  FERFBD is a modification of the old FRBK2 subroutine.  It has been
C  modified to read matrix data from memory until that data is exhausted
C  and then to read the remaining data from the file.
C
      DOUBLE PRECISION  DCORE(1)
      DOUBLE PRECISION  V1(1)     ,V2(1)     ,V3(1)     ,VB(1)  ,
     1                  XL(1)     ,XLJJ      ,V3J       ,V2J
      INTEGER           IBLK(20)  ,SMAPOS
      COMMON / ZZZZZZ / ICORE(1)   
      COMMON / OPINV  / MCBLT(7)  ,MCBSMA(7)
      COMMON / SYSTEM / KSYSTM(65)
      COMMON / FEERIM / NIDSMA    ,NIDLT     ,NIDORV    ,NLTLI   
     1,                 NSMALI    ,IBFSMA    ,IBFLT
     2,                 IBFORV    ,SMAPOS(7) ,LTPOS(7)
      EQUIVALENCE       ( KSYSTM(02),NOUT)
      EQUIVALENCE       ( DCORE(1)  ,ICORE(1), XL )  
C
      NROW    = MCBLT(2)
      DO 10 I = 1,NROW
   10 V2(I) = V1(I)
      ILROW = LTPOS( 1 )
      ICROW = NROW
C      PRINT *,' FERFBD,ILROW,NIDLT=',ILROW,NIDLT
C      PRINT *,' LTPOS=',LTPOS
      IF ( ILROW .EQ. NROW .AND. NIDLT .NE. 0 ) GO TO 1000
C
C     BACKWARD SUBSTITUTION
C
C     POSITION FILE TO LAST COLUMN
C
      IF ( NIDLT .EQ. 0 ) GO TO 12
  11  CONTINUE
      CALL DSSPOS ( MCBLT, LTPOS(5), LTPOS(6), LTPOS(7) )
      GO TO 16
  12  IF ( LTPOS( 5 ) .NE. -1 ) GO TO 11
      CALL REWIND ( MCBLT )
      CALL SKPREC ( MCBLT, NROW+1 )
      CALL DSCPOS ( MCBLT, IBLOCK, ICLR, ICBP )
      LTPOS( 5 ) = IBLOCK
      LTPOS( 6 ) = ICLR
      LTPOS( 7 ) = ICBP
  16  CONTINUE
      IBLK( 1 ) = MCBLT( 1 )
      J       = NROW
  15  IBLK(8) = -1
      ICROW   = J
      IF ( J .LE. ILROW ) GO TO 1000
  20  CALL GETSTB(*50,IBLK(1))
      NTMS    = IBLK(6)
      JI      = IBLK(5)
      IK      = IBLK(4)
      IF( IK - NTMS + 1 .NE. J) GO TO 25
      NTMS    = NTMS - 1
      XLJJ    = XL(JI-NTMS)
      IF(NTMS .EQ. 0) GO TO 40
   25 V2J     = V2(J)
      DO 30 II= 1,NTMS
      V2J     = V2J + XL(JI) * V2(IK)
      JI      = JI - 1
      IK      = IK - 1
   30 CONTINUE
      V2(J)   = V2J
   40 CALL ENDGTB(IBLK(1))
      GO TO 20
   50 V2(J)   = V2(J) / XLJJ
      IF(J .EQ. 1) GO TO 2000
      J       = J -1
      GO TO 15
C
C     CONTINUE BACKWARD SUBSTITUTION WITH DATA IN MEMORY
C
1000  CONTINUE
      MEM     = NLTLI
C      PRINT *,' AT 1000,NLTLI=',NLTLI
      NTMS    = ICORE(MEM)
C      PRINT *,' ICORE(NLTLI,-1=',ICORE(NLTLI),ICORE(NLTLI-1)
      MEM     = MEM - 2*NTMS - 3
      J       = ICROW
 1015 ICOL    = ICORE(MEM)
C      PRINT *,' MEM,ICORE(MEM-1,0,+1=',MEM,ICORE(MEM-1),ICORE(MEM),
C     & ICORE(MEM+1)
C      PRINT *,' ICOL,MEM,NTMS,ICROW,J=',ICOL,MEM,NTMS,ICROW,J
      IF ( ICOL .NE. J ) GO TO 1050
      NTMS    = ICORE(MEM+1)
C      PRINT *,' FERFBD,A1015,J,NTMS,ICOL=',J,NTMS,ICOL
      NTMSS   = NTMS
      JI      = MEM/2 + 1 + NTMS
      IK      = ICORE( MEM + 2 + 2*NTMS ) + NTMS - 1
C      PRINT *,' FERFBD,IK=',IK
      IF( IK-NTMS+1 .NE. J) GO TO 1025
      NTMS    = NTMS - 1
      XLJJ    = DCORE(JI-NTMS)
C      PRINT *,' FERFBD,XLJJ=',XLJJ
      IF(NTMS .EQ. 0) GO TO 1040
 1025 V2J     = V2(J)
      DO 1030 II= 1,NTMS
      V2J     = V2J + DCORE(JI) * V2(IK)
      JI      = JI - 1
      IK      = IK - 1
 1030 CONTINUE
      V2(J)   = V2J
 1040 IF ( MEM .EQ. NIDLT ) GO TO 1050
      NTMSNX  = ICORE( MEM-1 )
      MEM     = MEM - 2*NTMSNX - 4
      GO TO 1015
 1050 V2(J)   = V2(J) / XLJJ
      IF(J .EQ. 1) GO TO 2000
      J       = J -1
      GO TO 1015
2000  CONTINUE
      CALL FERLTD(MCBSMA(1),V2(1),V3(1),VB(1) )
C
C BEGIN FORWARD SWEEP DIRECTLY ON V3
C
      ICROW = 1
      IF ( NIDLT .EQ. 0 ) GO TO 3005
      MEM=NIDLT
      DO 2120 J = 1, NROW
      ICROW = J
      IF ( J .GT. ILROW ) GO TO 3000
 2080 ICOL  = ICORE(MEM)
      IF( ICOL .NE. J ) GO TO 2120
      JI    = MEM/2 + 2
      NTMS  = ICORE( MEM+1 )
      NTMSS = NTMS
      IK    = ICORE(MEM + 2 + 2*NTMS)
      IF ( IK .NE. J ) GO TO 2085
      NTMS  = NTMS - 1
      V3(J) = V3(J) / DCORE(JI)
      JI    = JI + 1
      IK    = IK + 1
 2085 IF(NTMS .EQ. 0) GO TO 2100
      V3J   = V3(J)
      DO 2090 II = 1,NTMS
      V3(IK)= V3(IK) + DCORE(JI) * V3J
      IK    = IK + 1
      JI    = JI + 1
 2090 CONTINUE
 2100 MEM   = MEM + 2*NTMSS + 4
      GO TO 2080
 2120 CONTINUE
      GO TO 7000
 3000 CONTINUE
C
C     CONTINUE FORWARD SWEEP DIRECTLY ON V3
C
C     POSITION FILE TO CONTINUE READING COLUMN DATA NOT IN MEMORY
C
      CALL DSSPOS ( MCBLT, LTPOS(2), LTPOS(3), LTPOS(4) )
      GO TO 3008
 3005 CALL REWIND ( MCBLT )
      CALL SKPREC ( MCBLT, 1 )
 3008 CONTINUE
      DO 3120 J = ICROW, NROW
      IBLK( 8 ) = -1
 3080 CALL GETSTR( *3120, IBLK )
C      PRINT *,' GETSTR,J,IBLK(12=',J,IBLK(12)
      IK    = IBLK( 4 )
      JI    = IBLK( 5 )
      NTMS  = IBLK( 6 )
      IF ( IK .NE. J) GO TO 3085
      NTMS  = NTMS - 1
C      PRINT *,' IK,JI,XL(JI=',IK,JI,XL(JI)
      V3(J) = V3(J) / XL(JI)
      JI    = JI + 1
      IK    = IK + 1
 3085 IF(NTMS .EQ. 0) GO TO 3100
      V3J   = V3(J)
      DO 3090 II = 1,NTMS
      V3(IK)= V3(IK) + XL(JI) * V3J
      IK    = IK + 1
      JI    = JI + 1
 3090 CONTINUE
 3100 CALL ENDGET(IBLK(1))
      GO TO 3080
 3120 CONTINUE
      GO TO 7000
 7000 CONTINUE
      RETURN
      END