File: pla2.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 (176 lines) | stat: -rw-r--r-- 5,459 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
      SUBROUTINE PLA2
C*****
C THIS ROUTINE IS THE SECOND FUNCTIONAL MODULE UNIQUE TO THE PIECE-WISE
C LINEAR ANALYSIS (PLA) RIGID FORMAT FOR THE DISPLACEMENT APPROACH.
C
C DMAP CALL...
C
C PLA2   DELTAUGV,DELTAPG,DELTAQG/UGV1,PGV1,QG1/V,N,PLACOUNT/ $
C
C CONCERNING DELTAUGV AND UGV1, THE ROUTINE WORKS AS FOLLOWS...
C DELTAUGV IS THE CURRENT INCREMENTAL DISPLACEMENT VECTOR IN THE PLA
C RIGID FORMAT LOOP AND UGV1 IS AN APPENDED FILE OF DISPLACEMENT VECTORS
C IF PLACOUNT .EQ. 1, THAT IS, THIS IS THE FIRST TIME PLA2 HAS BEEN
C CALLED IN THE PLA LOOP, THEN DELTAUGV IS COPIED ONTO UGV1.  IF
C PLACOUNT .GT. 1, THE PREVIOUS, OR LAST, DISPLACEMENT VECTOR IS READ
C INTO CORE FROM THE UGV1 DATA BLOCK, AND THE UGV1 FILE IS CLOSED WITH-
C OUT REWIND, THEN OPENED WITHOUT REWIND TO WRITE.  THE DELTAUGV VECTOR
C IS READ AN ELEMENT AT A TIME USING SUBROUTINE ZNTPKI AND ADDED TO
C THE VECTOR IN CORE.  THEN THE NEW DISPLACEMENT VECTOR IS WRITTEN ONTO
C THE UGV1 FILE.
C
C THEN THE PLA DMAP LOOP COUNTER PLACOUNT IS INCREMENTED.
C
C DELTAPG IS THE CURRENT INCREMENTAL LOAD VECTOR AND PGV1 IS THE
C CORRESPONDING MATRIX OF RUNNING SUM LOAD VECTORS.  PROCESSING IS
C SIMILAR TO THE ABOVE.  NOTE THAT NEITHER DATA BLOCK, LIKE THE TWO
C DISCUSSED ABOVE, CAN BE PURGED.
C
C DELTAQG IS THE CURRENT INCREMENTAL VECTOR OF SINGLE POINT CONSTRAINT
C FORCES AND QG1 IS THE APPENDED FILE OF VECTORS OF SPCF.  THESE TWO
C DATA BLOCKS ARE PROCESSED IDENTICALLY TO DELTAUGV AND UGV1 EXCECT
C THAT NO FATAL ERROR EXISTS IF ONE OR THE OTHER HAS BEEN PURGED.
C*****
C
      INTEGER
     1                   BUFSZ
     2,                  BUFFR1             ,BUFFR2
     3,                  OFILE              ,PLACNT
     4,                  EOR                ,CLSRW
     5,                  CLSNRW             ,OUTRW
     6,                  EOL                ,TYPEA
     7,                  TYPEB              ,OUTNRW
      INTEGER INBLK(15),OUBLK(15)
C
      DIMENSION
     1                   NAME(2)            ,DUMMY(2)
     2,                  MCB(7)
      COMMON /BLANK/PLACNT
      COMMON   /SYSTEM/  BUFSZ
      COMMON   /ZZZZZZ /  Z(1)
      COMMON   /ZNTPKX/
     1                   A(4)               ,INDEX
     2,                  EOL                ,IDUMMY
      COMMON   /PACKX /
     1                   TYPEA              ,TYPEB
     2,                  IPACK              ,JPACK
     3,                  INCPK
      COMMON   /UNPAKX/
     1                   IUNPKB             ,IUNPK
     2,                  JUNPK              ,INCUPK
C
      DATA               NAME /4HPLA2,4H    /
      DATA               INRW,OUTRW,OUTNRW,CLSRW,CLSNRW,EOR/0,1,3,1,2,1/
C
C INITIALIZE
C
      IZMAX = KORSZ (Z)
      BUFFR1 = IZMAX - BUFSZ
      BUFFR2 = BUFFR1 - BUFSZ
      LEFT = BUFFR2 - 1
      ILOOP = 1
      IFILE = 101
      OFILE = 201
C
C OPEN INPUT FILE TO READ AND OUTPUT FILE TO WRITE (IF PLACNT .EQ. 1)
C OR TO READ (IF PLACNT .GT. 1)
C
   10 JFILE = IFILE
      INBLK(1) = IFILE
      OUBLK(1) = OFILE
      DO 15 I = 2,7
   15 MCB(I) = 0
      MCB(1) = OFILE
      IF (PLACNT .EQ. 1) MCB(1) = IFILE
      CALL RDTRL (MCB)
      CALL OPEN(*100,IFILE,Z(BUFFR1),INRW)
      CALL FWDREC(*9020,IFILE)
      IOPT = INRW
      IF (PLACNT .EQ. 1) IOPT = OUTRW
      CALL OPEN(*110,OFILE,Z(BUFFR2),IOPT)
      IF (PLACNT .NE. 1) GO TO 30
C
C THIS IS THE FIRST TIME THROUGH THE PLA LOOP.  COPY THE VECTOR ON THE
C INPUT FILE ONTO THE OUTPUT FILE.
C
      CALL FNAME (OFILE,DUMMY)
      CALL WRITE (OFILE,DUMMY,2,EOR)
      CALL CPYSTR(INBLK,OUBLK,0,0)
      CALL CLOSE (OFILE,CLSRW)
      CALL CLOSE(IFILE,CLSRW)
      GO TO 70
C
C THIS IS NOT THE FIRST PASS
C
   30 JFILE = OFILE
      CALL FWDREC(*9020,OFILE)
      NRECS = PLACNT - 2
      IF (NRECS .LE. 0) GO TO 50
      DO 40 I = 1,NRECS
   40 CALL FWDREC(*9020,OFILE)
   50 MCB(1) = OFILE
      CALL RDTRL (MCB)
      MCB(6) = 0
      MCB(7) = 0
      IF (LEFT .LT. MCB(3)) CALL MESAGE (-8,0,NAME)
      IUNPKB = 1
      IUNPK  = 1
      JUNPK  = MCB(3)
      INCUPK = 1
      CALL UNPACK(*9030,OFILE,Z)
      CALL CLOSE (OFILE,CLSNRW)
      CALL OPEN(*9010,OFILE,Z(BUFFR2),OUTNRW)
C
C READ THE INCREMENTAL VECTOR.  INTPK INITIALIZES AND ZNTPKI RETURNS
C ONE ELEMENT AT A TIME
C
      KTYPE = 1
      CALL INTPK(*9040,IFILE,0,KTYPE,0)
C
C READ AND ADD LOOP.
C
   60 CALL ZNTPKI
      Z(INDEX) = Z(INDEX) + A(1)
      IF (EOL .EQ. 0) GO TO 60
C
C ADDITION HAS BEEN COMPLETED
C
      CALL CLOSE (IFILE,CLSRW)
C
C WRITE VECTOR ON OUTPUT FILE IN PACKED FORMAT.
C
      TYPEA = 1
      TYPEB = 1
      IPACK = 1
      JPACK = MCB(3)
      INCPK = 1
      CALL PACK(Z,OFILE,MCB)
      CALL CLOSE (OFILE,CLSRW)
C
C WRITE TRAILER
C
   70 MCB(1) = OFILE
      CALL WRTTRL (MCB)
   90 ILOOP = ILOOP + 1
      IF (ILOOP .GT. 3) GO TO 200
      IFILE = IFILE + 1
      OFILE = OFILE + 1
      GO TO 10
  100 IF (ILOOP .EQ. 1  .OR.  ILOOP .EQ. 2) CALL MESAGE (-30,127,IFILE)
      GO TO 90
  110 IF (ILOOP .EQ. 1  .OR.  ILOOP .EQ. 2) CALL MESAGE (-30,128,OFILE)
      GO TO 90
C
C INCREMENT THE PLA DMAP LOOP COUNTER
C
  200 PLACNT = PLACNT + 1
      RETURN
C
C FATAL ERRORS
C
 9010 CALL MESAGE (-1,JFILE,NAME)
 9020 CALL MESAGE (-2,JFILE,NAME)
 9030 CALL MESAGE (-30,129,ILOOP+200)
 9040 CALL MESAGE (-30,130,ILOOP+100)
      RETURN
      END