声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4505|回复: 12

[Fortran] 模态分析小程序(满存储格式)

[复制链接]
发表于 2005-8-5 15:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
要是谁自己写的有限元程序是满存储格式的估计会派上用场

操作系统:
WIN2000

开发环境:
COMPAQ FORTRAN 6.5

文件共四个。
!******************************************
!文件MAIN.F90(主程序,有个小例子,可供调用参考)
!******************************************
  1.         PROGRAM MAIN
  2.         USE MODE_SSPACE_

  3.         PARAMETER (NN=4)

  4.         REAL*8 K(NN,NN), M(NN,NN)
  5.         REAL*8, ALLOCATABLE :: A(:), B(:)
  6.         INTEGER CH(NN), MAXA(NN+1), lumpindex
  7.         DATA K/ 2,-1, 0, 0, &
  8.                -1, 2,-1, 0, &
  9.                     0,-1, 2,-1, &
  10.                     0, 0,-1, 1/, &
  11.                  M/ 0, 0, 0, 0, &
  12.                     0, 2, 0, 0, &
  13.                         0, 0, 0, 0, &
  14.                         0, 0, 0, 1/   
  15.        
  16.         lumpindex=0
  17.         NROOT=2
  18.         CALL MODE_SSPACE (M, K, lumpindex, NROOT)       
  19.        
  20.         END       
复制代码


!******************************************
!文件MODE_SSPACE.F90(驱动程序)
!******************************************
  1.         MODULE MODE_SSPACE_

  2.         CONTAINS

  3.         SUBROUTINE MODE_SSPACE (M, K, lumpindex, NROOT)
  4. !        *****************************************************************
  5. !        PROGRAM
  6. !                Modal analysis using subspace method.
  7. !        --INPUT VARIABLES--
  8. !                M        MASS MATRIX
  9. !                K        STIFFNESS MATRIX
  10. !                lumpindex        LUMP MASS INDEX
  11. !                NROOT        NUMBER OF EIGEN SOLUTION REQUIRED
  12. !                R        EIGEN VALUES
  13. !                EIGV        EIGEN VECTORS
  14. !        --OUTPUT VARIABLES--
  15. !
  16. !        REFERENCE:
  17. !        CHAPTER ELEVEN, SOLUTION METHODS FOR EIGENPROBLEMS,       
  18. !        "FINITE ELEMENT PROCEDURES, Klaus-Jurgen Bathe"
  19. !                                                        XIN ZHAO, 2002.7.25       
  20. !        *****************************************************************
  21.         USE TRANCOM_
  22.         USE SSPACE_
  23.         INTEGER lumpindex, NROOT, NN, NNM, NONZEROMASS, NNC
  24.         INTEGER, ALLOCATABLE :: CH(:), MAXA(:), D(:)
  25.         REAL*8 M(:,:), K(:,:), RTOL
  26.         REAL*8, ALLOCATABLE :: R(:,:), EIGV(:), A(:), B(:), &
  27.         TT(:), W(:), VEC(:,:), AR(:), BR(:), RTOLV(:), BUP(:), &
  28.         BLO(:), BUPC(:)

  29.         NN=UBOUND(K,DIM=1)

  30.         IF (lumpindex.eq.0) THEN
  31.                 DO i=1,NN
  32.                         IF (M(i,i).NE.0) NONZEROMASS=NONZEROMASS+1
  33.                 END DO
  34.                 NC=MIN(2*NROOT, NROOT+8, NONZEROMASS)
  35.         ELSE IF (lumpindex.eq.1) THEN
  36.                 NC=MIN(2*NROOT, NROOT+8)
  37.         END IF                       
  38.        

  39.         NC=MIN(2*NROOT, NROOT+8, NONZEROMASS)

  40.         NNC=NC*(NC+1)/2

  41.         ALLOCATE (CH(NN), MAXA(NN+1), D(NC), R(NN,NC), TT(NN), &
  42.                   W(NN),EIGV(NC), VEC(NC,NC), AR(NNC), BR(NNC), &
  43.                           RTOLV(NC), BUP(NC), BLO(NC),BUPC(NC))

  44.         NWK=0; MAXA=0; CH=0
  45.         CALL COMNUM (K, NN, NWK, MAXA, CH)
  46.         ALLOCATE (A(NWK))
  47.         CALL TRANCOM (K, NN, A, NWK, CH)
  48.         WRITE (*,*) A

  49.         IF (lumpindex.eq.0) THEN
  50.                 NWM=NN
  51.                 ALLOCATE (B(NWM))
  52.                 DO i=1, NWM
  53.                         B(i)=M(i,i)
  54.                 END DO
  55.                 WRITE (*,*) B
  56.         ELSE IF (lumpindex.eq.1) THEN
  57.                 NWM=NWK
  58.                 ALLOCATE (B(NWM))
  59.                 CALL TRANCOM (M, NN, B, NWM, CH)
  60.                 WRITE (*,*) B
  61.         END IF

  62.         NNM=NN+1
  63.         RTOL=1E-6
  64.         NITEM=16
  65.         IOUT=10
  66.         NSTIF=20

  67.         OPEN(UNIT=IOUT, FILE='RESULT.TXT', STATUS='REPLACE')
  68.         OPEN(UNIT=NSTIF, FILE='SCRATCH.TXT', STATUS='REPLACE')
  69.         CALL SSPACE (A,B,MAXA,R,EIGV,TT,W,AR,BR, &
  70.              VEC,D,RTOLV,BUP,BLO,BUPC,NN,NNM,NWK, &
  71.                  NWM,NROOT,RTOL,NC,NNC,NITEM,IFSS, &
  72.                  IFPR,NSTIF,IOUT)

  73.         END SUBROUTINE

  74.         END MODULE
复制代码



!******************************************
!文件SSPACE.FOR(BATHE同志的源码)
!******************************************
  1.         MODULE SSPACE_

  2.         CONTAINS

  3.       SUBROUTINE SSPACE (A,B,MAXA,R,EIGV,TT,W,AR,BR,VEC,D,RTOLV,BUP,BLO,SSP00001
  4.      1 BUPC,NN,NNM,NWK,NWM,NROOT,RTOL,NC,NNC,NITEM,IFSS,IFPR,NSTIF,IOUT)SSP00002
  5. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSP00003
  6. C .                                                                   . SSP00004
  7. C .   P R O G R A M                                                   . SSP00005
  8. C .        TO SOLVE FOR THE SMALLEST EIGENVALUES-- ASSUMED .GT. 0 --  . SSP00006
  9. C .        AND CORRESPONDING EIGENVECTORS IN THE GENERALIZED          . SSP00007
  10. C .        EIGENPROBLEM USING THE SUBSPACE ITERATION METHOD           . SSP00008
  11. C .                                                                   . SSP00009
  12. C .  - - INPUT VARIABLES - -                                          . SSP00010
  13. C .        A(NWK)    = STIFFNESS MATRIX IN COMPACTED FORM (ASSUMED    . SSP00011
  14. C .                    POSITIVE DEFINITE)                             . SSP00012
  15. C .        B(NWM)    = MASS MATRIX IN COMPACTED FORM                  . SSP00013
  16. C .        MAXA(NNM) = VECTOR CONTAINING ADDRESSES OF DIAGONAL        . SSP00014
  17. C .                    ELEMENTS OF STIFFNESS MATRIX A                 . SSP00015
  18. C .        R(NN,NC)  = STORAGE FOR EIGENVECTORS                       . SSP00016
  19. C .        EIGV(NC)  = STORAGE FOR EIGENVALUES                        . SSP00017
  20. C .        TT(NN)    = WORKING VECTOR                                 . SSP00018
  21. C .        W(NN)     = WORKING VECTOR                                 . SSP00019
  22. C .        AR(NNC)   = WORKING MATRIX STORING PROJECTION OF K         . SSP00020
  23. C .        BR(NNC)   = WORKING MATRIX STORING PROJECTION OF M         . SSP00021
  24. C .        VEC(NC,NC)= WORKING MATRIX                                 . SSP00022
  25. C .        D(NC)     = WORKING VECTOR                                 . SSP00023
  26. C .        RTOLV(NC) = WORKING VECTOR                                 . SSP00024
  27. C .        BUP(NC)   = WORKING VECTOR                                 . SSP00025
  28. C .        BLO(NC)   = WORKING VECTOR                                 . SSP00026
  29. C .        BUPC(NC)  = WORKING VECTOR                                 . SSP00027
  30. C .        NN        = ORDER OF STIFFNESS AND MASS MATRICES           . SSP00028
  31. C .        NNM       = NN + 1                                         . SSP00029
  32. C .        NWK       = NUMBER OF ELEMENTS BELOW SKYLINE OF            . SSP00030
  33. C .                    STIFFNESS MATRIX                               . SSP00031
  34. C .        NWM       = NUMBER OF ELEMENTS BELOW SKYLINE OF            . SSP00032
  35. C .                    MASS MATRIX                                    . SSP00033
  36. C .                      I. E. NWM=NWK FOR CONSISTENT MASS MATRIX     . SSP00034
  37. C .                            NWM=NN  FOR LUMPED MASS MATRIX         . SSP00035
  38. C .        NROOT     = NUMBER OF REQUIRED EIGENVALUES AND EIGENVECTORS. SSP00036
  39. C .        RTOL      = CONVERGENCE TOLERANCE ON EIGENVALUES           . SSP00037
  40. C .                    ( 1.E-06 OR SMALLER )                          . SSP00038
  41. C .        NC        = NUMBER OF ITERATION VECTORS USED               . SSP00039
  42. C .                    (USUALLY SET TO MIN(2*NROOT, NROOT+8), BUT NC  . SSP00040
  43. C .                    CANNOT BE LARGER THAN THE NUMBER OF MASS       . SSP00041
  44. C .                    DEGREES OF FREEDOM)                            . SSP00042
  45. C .        NNC       = NC*(NC+1)/2 DIMENSION OF STORAGE VECTORS AR,BR . SSP00043
  46. C .        NITEM     = MAXIMUM NUMBER OF SUBSPACE ITERATIONS PERMITTED. SSP00044
  47. C .                    (USUALLY SET TO 16)                            . SSP00045
  48. C .                    THE PARAMETERS NC AND/OR NITEM MUST BE         . SSP00046
  49. C .                    INCREASED IF A SOLUTION HAS NOT CONVERGED      . SSP00047
  50. C .        IFSS      = FLAG FOR STURM SEQUENCE CHECK                  . SSP00048
  51. C .                      EQ.0  NO CHECK                               . SSP00049
  52. C .                      EQ.1  CHECK                                  . SSP00050
  53. C .        IFPR      = FLAG FOR PRINTING DURING ITERATION             . SSP00051
  54. C .                      EQ.0  NO PRINTING                            . SSP00052
  55. C .                      EQ.1  PRINT                                  . SSP00053
  56. C .        NSTIF     = SCRATCH FILE                                   . SSP00054
  57. C .        IOUT      = UNIT USED FOR OUTPUT                           . SSP00055
  58. C .                                                                   . SSP00056
  59. C .  - - OUTPUT - -                                                   . SSP00057
  60. C .        EIGV(NROOT) = EIGENVALUES                                  . SSP00058
  61. C .        R(NN,NROOT) = EIGENVECTORS                                 . SSP00059
  62. C .                                                                   . SSP00060
  63. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSP00061
  64.       IMPLICIT DOUBLE PRECISION (A-H,O-Z)                               SSP00062
  65. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSP00063
  66. C .   THIS PROGRAM IS USED IN SINGLE PRECISION ARITHMETIC ON CRAY     . SSP00064
  67. C .   EQUIPMENT AND DOUBLE PRECISION ARITHMETIC ON IBM MACHINES,      . SSP00065
  68. C .   ENGINEERING WORKSTATIONS AND PCS. DEACTIVATE ABOVE LINE FOR     . SSP00066
  69. C .   SINGLE PRECISION ARITHMETIC.                                    . SSP00067
  70. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSP00068
  71.       INTEGER MAXA(NNM), D(NC)                                          SSP00069
  72.       DIMENSION A(NWK),B(NWM),R(NN,NC),TT(NN),W(NN),EIGV(NC),           SSP00070
  73.      1          VEC(NC,NC),AR(NNC),BR(NNC),RTOLV(NC),BUP(NC),           SSP00071
  74.      2          BLO(NC),BUPC(NC)                                        SSP00072
  75. C                                                                       SSP00073
  76. C     SET TOLERANCE FOR JACOBI ITERATION                                SSP00074
  77.       TOLJ=1.0D-12                                                      SSP00075
  78. C                                                                       SSP00076
  79. C     INITIALIZATION                                                    SSP00077
  80. C                                                                       SSP00078
  81.       ICONV=0                                                           SSP00079
  82.       NSCH=0                                                            SSP00080
  83.       NSMAX=12                                                          SSP00081
  84.       N1=NC + 1                                                         SSP00082
  85.       NC1=NC - 1                                                        SSP00083
  86.       REWIND NSTIF                                                      SSP00084
  87.       WRITE (NSTIF,*) A                                                   SSP00085
  88.       DO 2 I=1,NC                                                       SSP00086
  89.     2 D(I)=0.                                                           SSP00087
  90. C                                                                       SSP00088
  91. C     ESTABLISH STARTING ITERATION VECTORS                              SSP00089
  92. C                                                                       SSP00090
  93.       ND=NN/NC                                                          SSP00091
  94.       IF (NWM.GT.NN) GO TO 4                                            SSP00092
  95.       J=0                                                               SSP00093
  96.       DO 6 I=1,NN                                                       SSP00094
  97.       II=MAXA(I)                                                        SSP00095
  98.       R(I,1)=B(I)                                                       SSP00096
  99.       IF (B(I).GT.0) J=J + 1                                            SSP00097
  100.     6 W(I)=B(I)/A(II)                                                   SSP00098
  101.       IF (NC.LE.J) GO TO 16                                             SSP00099
  102.       WRITE (IOUT,1007)                                                 SSP00100
  103.       GO TO 800                                                         SSP00101
  104.     4 DO 10 I=1,NN                                                      SSP00102
  105.       II=MAXA(I)                                                        SSP00103
  106.       R(I,1)=B(II)                                                      SSP00104
  107.    10 W(I)=B(II)/A(II)                                                  SSP00105
  108.    16 DO 20 J=2,NC                                                      SSP00106
  109.       DO 20 I=1,NN                                                      SSP00107
  110.    20 R(I,J)=0.                                                         SSP00108
  111. C                                                                       SSP00109
  112.       L=NN - ND                                                         SSP00110
  113.       DO 30 J=2,NC                                                      SSP00111
  114.       RT=0.                                                             SSP00112
  115.       DO 40 I=1,L                                                       SSP00113
  116.       IF (W(I).LT.RT) GO TO 40                                          SSP00114
  117.       RT=W(I)                                                           SSP00115
  118.       IJ=I                                                              SSP00116
  119.    40 CONTINUE                                                          SSP00117
  120.       DO 50 I=L,NN                                                      SSP00118
  121.       IF (W(I).LE.RT) GO TO 50                                          SSP00119
  122.       RT=W(I)                                                           SSP00120
  123.       IJ=I                                                              SSP00121
  124.    50 CONTINUE                                                          SSP00122
  125.       TT(J)=FLOAT(IJ)                                                   SSP00123
  126.       W(IJ)=0.                                                          SSP00124
  127.       L=L - ND                                                          SSP00125
  128.    30 R(IJ,J)=1.                                                        SSP00126
  129. C                                                                       SSP00127
  130.       WRITE (IOUT,1008)                                                 SSP00128
  131.       WRITE (IOUT,1002) (TT(J),J=2,NC)                                  SSP00129
  132. C                                                                       SSP00130
  133. C     A RANDOM VECTOR IS ADDED TO THE LAST VECTOR                       SSP00131
  134. C                                                                       SSP00132
  135.       PI=3.141592654D0                                                  SSP00133
  136.       XX=0.5D0                                                          SSP00134
  137.       DO 60 K=1,NN                                                      SSP00135
  138.       XX=(PI + XX)**5                                                   SSP00136
  139.       IX=INT(XX)                                                        SSP00137
  140.       XX=XX - FLOAT(IX)                                                 SSP00138
  141.    60 R(K,NC)=R(K,NC) + XX                                              SSP00139
  142. C                                                                       SSP00140
  143. C     FACTORIZE MATRIX A INTO (L)*(D)*(L(T))                            SSP00141
  144. C                                                                       SSP00142
  145.       ISH=0                                                             SSP00143
  146.       CALL DECOMP (A,MAXA,NN,ISH,IOUT)                                  SSP00144
  147. C                                                                       SSP00145
  148. C - - - S T A R T   O F   I T E R A T I O N   L O O P                   SSP00146
  149. C                                                                       SSP00147
  150.       NITE=0                                                            SSP00148
  151.       TOLJ2=1.0D-24                                                     SSP00149
  152.   100 NITE=NITE + 1                                                     SSP00150
  153.       IF (IFPR.EQ.0) GO TO 90                                           SSP00151
  154.       WRITE (IOUT,1010) NITE                                            SSP00152
  155. C                                                                       SSP00153
  156. C     CALCULATE THE PROJECTIONS OF A AND B                              SSP00154
  157. C                                                                       SSP00155
  158.    90 IJ=0                                                              SSP00156
  159.       DO 110 J=1,NC                                                     SSP00157
  160.       DO 120 K=1,NN                                                     SSP00158
  161.   120 TT(K)=R(K,J)                                                      SSP00159
  162.       CALL REDBAK (A,TT,MAXA,NN)                                        SSP00160
  163.       DO 130 I=J,NC                                                     SSP00161
  164.       ART=0.                                                            SSP00162
  165.       DO 140 K=1,NN                                                     SSP00163
  166.   140 ART=ART + R(K,I)*TT(K)                                            SSP00164
  167.       IJ=IJ + 1                                                         SSP00165
  168.   130 AR(IJ)=ART                                                        SSP00166
  169.       DO 150 K=1,NN                                                     SSP00167
  170.   150 R(K,J)=TT(K)                                                      SSP00168
  171.   110 CONTINUE                                                          SSP00169
  172.       IJ=0                                                              SSP00170
  173.       DO 160 J=1,NC                                                     SSP00171
  174.       CALL MULT (TT,B,R(1,J),MAXA,NN,NWM)                               SSP00172
  175.       DO 180 I=J,NC                                                     SSP00173
  176.       BRT=0.                                                            SSP00174
  177.       DO 190 K=1,NN                                                     SSP00175
  178.   190 BRT=BRT + R(K,I)*TT(K)                                            SSP00176
  179.       IJ=IJ + 1                                                         SSP00177
  180.   180 BR(IJ)=BRT                                                        SSP00178
  181.       IF (ICONV.GT.0) GO TO 160                                         SSP00179
  182.       DO 200 K=1,NN                                                     SSP00180
  183.   200 R(K,J)=TT(K)                                                      SSP00181
  184.   160 CONTINUE                                                          SSP00182
  185. C                                                                       SSP00183
  186. C     SOLVE FOR EIGENSYSTEM OF SUBSPACE OPERATORS                       SSP00184
  187. C                                                                       SSP00185
  188.       IF (IFPR.EQ.0) GO TO 320                                          SSP00186
  189.       IND=1                                                             SSP00187
  190.   210 WRITE (IOUT,1020)                                                 SSP00188
  191.       II=1                                                              SSP00189
  192.       DO 300 I=1,NC                                                     SSP00190
  193.       ITEMP=II + NC - I                                                 SSP00191
  194.       WRITE (IOUT,1005) (AR(J),J=II,ITEMP)                              SSP00192
  195.   300 II=II + N1 - I                                                    SSP00193
  196.       WRITE (IOUT,1030)                                                 SSP00194
  197.       II=1                                                              SSP00195
  198.       DO 310 I=1,NC                                                     SSP00196
  199.       ITEMP=II + NC - I                                                 SSP00197
  200.       WRITE (IOUT,1005) (BR(J),J=II,ITEMP)                              SSP00198
  201.   310 II=II + N1 - I                                                    SSP00199
  202.       IF (IND.EQ.2) GO TO 350                                           SSP00200
  203. C                                                                       SSP00201
  204.   320 CALL JACOBI (AR,BR,VEC,EIGV,W,NC,NNC,TOLJ,NSMAX,IFPR,IOUT)        SSP00202
  205. C                                                                       SSP00203
  206.       IF (IFPR.EQ.0) GO TO 350                                          SSP00204
  207.       WRITE (IOUT,1040)                                                 SSP00205
  208.       IND=2                                                             SSP00206
  209.       GO TO 210                                                         SSP00207
  210. C                                                                       SSP00208
  211. C     ARRANGE EIGENVALUES IN ASCENDING ORDER                            SSP00209
  212. C                                                                       SSP00210
  213.   350 IS=0                                                              SSP00211
  214.       II=1                                                              SSP00212
  215.       DO 360 I=1,NC1                                                    SSP00213
  216.       ITEMP=II + N1 - I                                                 SSP00214
  217.       IF (EIGV(I+1).GE.EIGV(I)) GO TO 360                               SSP00215
  218.       IS=IS + 1                                                         SSP00216
  219.       EIGVT=EIGV(I+1)                                                   SSP00217
  220.       EIGV(I+1)=EIGV(I)                                                 SSP00218
  221.       EIGV(I)=EIGVT                                                     SSP00219
  222.       BT=BR(ITEMP)                                                      SSP00220
  223.       BR(ITEMP)=BR(II)                                                  SSP00221
  224.       BR(II)=BT                                                         SSP00222
  225.       DO 370 K=1,NC                                                     SSP00223
  226.       RT=VEC(K,I+1)                                                     SSP00224
  227.       VEC(K,I+1)=VEC(K,I)                                               SSP00225
  228.   370 VEC(K,I)=RT                                                       SSP00226
  229.   360 II=ITEMP                                                          SSP00227
  230.       IF (IS.GT.0) GO TO 350                                            SSP00228
  231.       IF (IFPR.EQ.0) GO TO 375                                          SSP00229
  232.       WRITE (IOUT,1035)                                                 SSP00230
  233.       WRITE (IOUT,1006) (EIGV(I),I=1,NC)                                SSP00231
  234. C                                                                       SSP00232
  235. C     CALCULATE B TIMES APPROXIMATE EIGENVECTORS (ICONV.EQ.0)           SSP00233
  236. C        OR     FINAL EIGENVECTOR APPROXIMATIONS (ICONV.GT.0)           SSP00234
  237. C                                                                       SSP00235
  238.   375 DO 420 I=1,NN                                                     SSP00236
  239.       DO 422 J=1,NC                                                     SSP00237
  240.   422 TT(J)=R(I,J)                                                      SSP00238
  241.       DO 424 K=1,NC                                                     SSP00239
  242.       RT=0.                                                             SSP00240
  243.       DO 430 L=1,NC                                                     SSP00241
  244.   430 RT=RT + TT(L)*VEC(L,K)                                            SSP00242
  245.   424 R(I,K)=RT                                                         SSP00243
  246.   420 CONTINUE                                                          SSP00244
  247. C                                                                       SSP00245
  248. C     CALCULATE ERROR BOUNDS AND CHECK FOR CONVERGENCE OF EIGENVALUES   SSP00246
  249. C                                                                       SSP00247
  250.       DO 380 I=1,NC                                                     SSP00248
  251.       VDOT=0.                                                           SSP00249
  252.       DO 382 J=1,NC                                                     SSP00250
  253.   382 VDOT=VDOT + VEC(I,J)*VEC(I,J)                                     SSP00251
  254.       EIGV2=EIGV(I)*EIGV(I)                                             SSP00252
  255.       DIF=VDOT - EIGV2                                                  SSP00253
  256.       RDIF=MAX(DIF,TOLJ2*EIGV2)/EIGV2                                   SSP00254
  257.       RDIF=SQRT(RDIF)                                                   SSP00255
  258.       RTOLV(I)=RDIF                                                     SSP00256
  259.   380 CONTINUE                                                          SSP00257
  260.       IF (IFPR.EQ.0 .AND. ICONV.EQ.0) GO TO 385                         SSP00258
  261.       WRITE (IOUT,1050)                                                 SSP00259
  262.       WRITE (IOUT,1005) (RTOLV(I),I=1,NC)                               SSP00260
  263.   385 IF (ICONV.GT.0) GO TO 500                                         SSP00261
  264. C                                                                       SSP00262
  265.       DO 390 I=1,NROOT                                                  SSP00263
  266.       IF (RTOLV(I).GT.RTOL) GO TO 400                                   SSP00264
  267.   390 CONTINUE                                                          SSP00265
  268.       WRITE (IOUT,1060) RTOL                                            SSP00266
  269.       ICONV=1                                                           SSP00267
  270.       GO TO 100                                                         SSP00268
  271.   400 IF (NITE.LT.NITEM) GO TO 100                                      SSP00269
  272.       WRITE (IOUT,1070)                                                 SSP00270
  273.       ICONV=2                                                           SSP00271
  274.       IFSS=0                                                            SSP00272
  275.       GO TO 100                                                         SSP00273
  276. C                                                                       SSP00274
  277. C - - - E N D   O F   I T E R A T I O N   L O O P                       SSP00275
  278. C                                                                       SSP00276
  279.   500 WRITE (IOUT,1100)                                                 SSP00277
  280.       WRITE (IOUT,1006) (EIGV(I),I=1,NROOT)                             SSP00278
  281.       WRITE (IOUT,1110)                                                 SSP00279
  282.       DO 530 J=1,NROOT                                                  SSP00280
  283.   530 WRITE (IOUT,1005) (R(K,J),K=1,NN)                                 SSP00281
  284. C                                                                       SSP00282
  285. C     CALCULATE AND PRINT ERROR MEASURES                                SSP00283
  286. C                                                                       SSP00284
  287.       REWIND NSTIF                                                      SSP00285
  288.       READ (NSTIF,*) A                                                    SSP00286
  289. C                                                                       SSP00287
  290.       DO 580 L=1,NROOT                                                  SSP00288
  291.       RT=EIGV(L)                                                        SSP00289
  292.       CALL MULT(TT,A,R(1,L),MAXA,NN,NWK)                                SSP00290
  293.       VNORM=0.                                                          SSP00291
  294.       DO 590 I=1,NN                                                     SSP00292
  295.   590 VNORM=VNORM + TT(I)*TT(I)                                         SSP00293
  296.       CALL MULT(W,B,R(1,L),MAXA,NN,NWM)                                 SSP00294
  297.       WNORM=0.                                                          SSP00295
  298.       DO 600 I=1,NN                                                     SSP00296
  299.       TT(I)=TT(I) - RT*W(I)                                             SSP00297
  300.   600 WNORM=WNORM + TT(I)*TT(I)                                         SSP00298
  301.       VNORM=SQRT(VNORM)                                                 SSP00299
  302.       WNORM=SQRT(WNORM)                                                 SSP00300
  303.       D(L)=WNORM/VNORM                                                  SSP00301
  304.   580 CONTINUE                                                          SSP00302
  305.       WRITE (IOUT,1115)                                                 SSP00303
  306.       WRITE (IOUT,1005) (D(I),I=1,NROOT)                                SSP00304
  307. C                                                                       SSP00305
  308. C     APPLY STURM SEQUENCE CHECK                                        SSP00306
  309. C                                                                       SSP00307
  310.       IF (IFSS.EQ.0) GO TO 900                                          SSP00308
  311.       CALL SCHECK (EIGV,RTOLV,BUP,BLO,BUPC,D,NC,NEI,RTOL,SHIFT,IOUT)    SSP00309
  312. C                                                                       SSP00310
  313.       WRITE (IOUT,1120) SHIFT                                           SSP00311
  314. C                                                                       SSP00312
  315. C     SHIFT MATRIX A                                                    SSP00313
  316. C                                                                       SSP00314
  317.       REWIND NSTIF                                                      SSP00315
  318.       READ (NSTIF) A                                                    SSP00316
  319.       IF (NWM.GT.NN) GO TO 645                                          SSP00317
  320.       DO 640 I=1,NN                                                     SSP00318
  321.       II=MAXA(I)                                                        SSP00319
  322.   640 A(II)=A(II) - B(I)*SHIFT                                          SSP00320
  323.       GO TO 660                                                         SSP00321
  324.   645 DO 650 I=1,NWK                                                    SSP00322
  325.   650 A(I)=A(I) - B(I)*SHIFT                                            SSP00323
  326. C                                                                       SSP00324
  327. C     FACTORIZE SHIFTED MATRIX                                          SSP00325
  328. C                                                                       SSP00326
  329.   660 ISH=1                                                             SSP00327
  330.       CALL DECOMP (A,MAXA,NN,ISH,IOUT)                                  SSP00328
  331. C                                                                       SSP00329
  332. C     COUNT NUMBER OF NEGATIVE DIAGONAL ELEMENTS                        SSP00330
  333. C                                                                       SSP00331
  334.       NSCH=0                                                            SSP00332
  335.       DO 664 I=1,NN                                                     SSP00333
  336.       II=MAXA(I)                                                        SSP00334
  337.       IF (A(II).LT.0.) NSCH=NSCH + 1                                    SSP00335
  338.   664 CONTINUE                                                          SSP00336
  339.       IF (NSCH.EQ.NEI) GO TO 670                                        SSP00337
  340.       NMIS=NSCH - NEI                                                   SSP00338
  341.       WRITE (IOUT,1130) NMIS                                            SSP00339
  342.       GO TO 900                                                         SSP00340
  343.   670 WRITE (IOUT,1140) NSCH                                            SSP00341
  344.       GO TO 900                                                         SSP00342
  345. C                                                                       SSP00343
  346.   800 STOP                                                              SSP00344
  347.   900 RETURN                                                            SSP00345
  348. C                                                                       SSP00346
  349. 1002 FORMAT (' ',10F10.0)                                              SSP00347
  350. 1005 FORMAT (' ',12E11.4)                                              SSP00348
  351. 1006 FORMAT (' ',6E22.14)                                              SSP00349
  352. 1007 FORMAT (///,' STOP, NC IS LARGER THAN THE NUMBER OF MASS ',       SSP00350
  353.      1        'DEGREES OF FREEDOM')                                     SSP00351
  354. 1008 FORMAT (///,' DEGREES OF FREEDOM EXCITED BY UNIT STARTING ',      SSP00352
  355.      1        'ITERATION VECTORS')                                      SSP00353
  356. 1010 FORMAT (//,' I T E R A T I O N   N U M B E R ',I8)                SSP00354
  357. 1020 FORMAT (/,' PROJECTION OF A (MATRIX AR)')                         SSP00355
  358. 1030 FORMAT (/,' PROJECTION OF B (MATRIX BR)')                         SSP00356
  359. 1035 FORMAT (/,' EIGENVALUES OF AR-LAMBDA*BR')                         SSP00357
  360. 1040 FORMAT (//,' AR AND BR AFTER JACOBI DIAGONALIZATION')             SSP00358
  361. 1050 FORMAT (/,' ERROR BOUNDS REACHED ON EIGENVALUES')                 SSP00359
  362. 1060 FORMAT (///,' CONVERGENCE REACHED FOR RTOL ',E10.4)               SSP00360
  363. 1070 FORMAT (' *** NO CONVERGENCE IN MAXIMUM NUMBER OF ITERATIONS',    SSP00361
  364.      1        ' PERMITTED',/,                                           SSP00362
  365.      2        ' WE ACCEPT CURRENT ITERATION VALUES',/,                  SSP00363
  366.      3        ' THE STURM SEQUENCE CHECK IS NOT PERFORMED')             SSP00364
  367. 1100 FORMAT (///,' THE CALCULATED EIGENVALUES ARE')                    SSP00365
  368. 1115 FORMAT (//,' ERROR MEASURES ON THE EIGENVALUES')                  SSP00366
  369. 1110 FORMAT (//,' THE CALCULATED EIGENVECTORS ARE',/)                  SSP00367
  370. 1120 FORMAT (///,' CHECK APPLIED AT SHIFT ',E22.14)                    SSP00368
  371. 1130 FORMAT (//,' THERE ARE ',I8,' EIGENVALUES MISSING')               SSP00369
  372. 1140 FORMAT (//,' WE FOUND THE LOWEST ',I8,' EIGENVALUES')             SSP00370
  373. C                                                                       SSP00371
  374.       END SUBROUTINE                                                    SSP00372
  375.       SUBROUTINE DECOMP (A,MAXA,NN,ISH,IOUT)                            SSP00373
  376. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSP00374
  377. C .                                                                   . SSP00375
  378. C .   P R O G R A M                                                   . SSP00376
  379. C .        TO CALCULATE (L)*(D)*(L)(T) FACTORIZATION OF               . SSP00377
  380. C .        STIFFNESS MATRIX                                           . SSP00378
  381. C .                                                                   . SSP00379
  382. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSP00380
  383. C                                                                       SSP00381
  384.       IMPLICIT DOUBLE PRECISION (A-H,O-Z)                               SSP00382
  385.       DIMENSION A(1),MAXA(1)                                            SSP00383
  386.       IF (NN.EQ.1) GO TO 900                                            SSP00384
  387. C                                                                       SSP00385
  388.       DO 200 N=1,NN                                                     SSP00386
  389.       KN=MAXA(N)                                                        SSP00387
  390.       KL=KN + 1                                                         SSP00388
  391.       KU=MAXA(N+1) - 1                                                  SSP00389
  392.       KH=KU - KL                                                        SSP00390
  393.       IF (KH) 304,240,210                                               SSP00391
  394.   210 K=N - KH                                                          SSP00392
  395.       IC=0                                                              SSP00393
  396.       KLT=KU                                                            SSP00394
  397.       DO 260 J=1,KH                                                     SSP00395
  398.       IC=IC + 1                                                         SSP00396
  399.       KLT=KLT - 1                                                       SSP00397
  400.       KI=MAXA(K)                                                        SSP00398
  401.       ND=MAXA(K+1) - KI - 1                                             SSP00399
  402.       IF (ND) 260,260,270                                               SSP00400
  403.   270 KK=MIN0(IC,ND)                                                    SSP00401
  404.       C=0.                                                              SSP00402
  405.       DO 280 L=1,KK                                                     SSP00403
  406.   280 C=C + A(KI+L)*A(KLT+L)                                            SSP00404
  407.       A(KLT)=A(KLT) - C                                                 SSP00405
  408.   260 K=K + 1                                                           SSP00406
  409.   240 K=N                                                               SSP00407
  410.       B=0.                                                              SSP00408
  411.       DO 300 KK=KL,KU                                                   SSP00409
  412.       K=K - 1                                                           SSP00410
  413.       KI=MAXA(K)                                                        SSP00411
  414.       C=A(KK)/A(KI)                                                     SSP00412
  415.       IF (ABS(C).LT.1.E07) GO TO 290                                    SSP00413
  416.       WRITE (IOUT,2010) N,C                                             SSP00414
  417.       GO TO 800                                                         SSP00415
  418.   290 B=B + C*A(KK)                                                     SSP00416
  419.   300 A(KK)=C                                                           SSP00417
  420.       A(KN)=A(KN) - B                                                   SSP00418
  421.   304 IF (A(KN)) 310,310,200                                            SSP00419
  422.   310 IF (ISH.EQ.0) GO TO 320                                           SSP00420
  423.       IF (A(KN).EQ.0.) A(KN)=-1.E-16                                    SSP00421
  424.       GO TO 200                                                         SSP00422
  425.   320 WRITE (IOUT,2000) N,A(KN)                                         SSP00423
  426.       GO TO 800                                                         SSP00424
  427.   200 CONTINUE                                                          SSP00425
  428.       GO TO 900                                                         SSP00426
  429. C                                                                       SSP00427
  430.   800 STOP                                                              SSP00428
  431.   900 RETURN                                                            SSP00429
  432. C                                                                       SSP00430
  433. 2000 FORMAT (//' STOP - STIFFNESS MATRIX NOT POSITIVE DEFINITE',//,    SSP00431
  434.      1          ' NONPOSITIVE PIVOT FOR EQUATION ',I8,//,               SSP00432
  435.      2          ' PIVOT = ',E20.12)                                     SSP00433
  436. 2010 FORMAT (//' STOP - STURM SEQUENCE CHECK FAILED BECAUSE OF',       SSP00434
  437.      1          ' MULTIPLIER GROWTH FOR COLUMN NUMBER ',I8,//,          SSP00435
  438.      2          ' MULTIPLIER = ',E20.8)                                 SSP00436
  439.       END SUBROUTINE                                                    SSP00437
  440.       SUBROUTINE REDBAK (A,V,MAXA,NN)                                   SSP00438
  441. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSP00439
  442. C .                                                                   . SSP00440
  443. C .   P R O G R A M                                                   . SSP00441
  444. C .        TO REDUCE AND BACK-SUBSTITUTE ITERATION VECTORS            . SSP00442
  445. C .                                                                   . SSP00443
  446. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSP00444
  447. C                                                                       SSP00445
  448.       IMPLICIT DOUBLE PRECISION (A-H,O-Z)                               SSP00446
  449.       DIMENSION A(1),V(1),MAXA(1)                                       SSP00447
  450. C                                                                       SSP00448
  451.       DO 400 N=1,NN                                                     SSP00449
  452.       KL=MAXA(N) + 1                                                    SSP00450
  453.       KU=MAXA(N+1) - 1                                                  SSP00451
  454.       IF (KU-KL) 400,410,410                                            SSP00452
  455.   410 K=N                                                               SSP00453
  456.       C=0.                                                              SSP00454
  457.       DO 420 KK=KL,KU                                                   SSP00455
  458.       K=K - 1                                                           SSP00456
  459.   420 C=C + A(KK)*V(K)                                                  SSP00457
  460.       V(N)=V(N) - C                                                     SSP00458
  461.   400 CONTINUE                                                          SSP00459
  462. C                                                                       SSP00460
  463.       DO 480 N=1,NN                                                     SSP00461
  464.       K=MAXA(N)                                                         SSP00462
  465.   480 V(N)=V(N)/A(K)                                                    SSP00463
  466.       IF (NN.EQ.1) GO TO 900                                            SSP00464
  467.       N=NN                                                              SSP00465
  468.       DO 500 L=2,NN                                                     SSP00466
  469.       KL=MAXA(N) + 1                                                    SSP00467
  470.       KU=MAXA(N+1) - 1                                                  SSP00468
  471.       IF (KU-KL) 500,510,510                                            SSP00469
  472.   510 K=N                                                               SSP00470
  473.       DO 520 KK=KL,KU                                                   SSP00471
  474.       K=K - 1                                                           SSP00472
  475.   520 V(K)=V(K) - A(KK)*V(N)                                            SSP00473
  476.   500 N=N - 1                                                           SSP00474
  477. C                                                                       SSP00475
  478.   900 RETURN                                                            SSP00476
  479.       END SUBROUTINE                                                    SSP00477
  480.       SUBROUTINE MULT (TT,B,RR,MAXA,NN,NWM)                             SSP00478
  481. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSP00479
  482. C .                                                                   . SSP00480
  483. C .   P R O G R A M                                                   . SSP00481
  484. C .        TO EVALUATE PRODUCT OF B TIMES RR AND STORE RESULT IN TT   . SSP00482
  485. C .                                                                   . SSP00483
  486. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSP00484
  487. C                                                                       SSP00485
  488.       IMPLICIT DOUBLE PRECISION (A-H,O-Z)                               SSP00486
  489.       DIMENSION TT(1),B(1),RR(1),MAXA(1)                                SSP00487
  490. C                                                                       SSP00488
  491.       IF (NWM.GT.NN) GO TO 20                                           SSP00489
  492.       DO 10 I=1,NN                                                      SSP00490
  493.    10 TT(I)=B(I)*RR(I)                                                  SSP00491
  494.       GO TO 900                                                         SSP00492
  495. C                                                                       SSP00493
  496.    20 DO 40 I=1,NN                                                      SSP00494
  497.    40 TT(I)=0.                                                          SSP00495
  498.       DO 100 I=1,NN                                                     SSP00496
  499.       KL=MAXA(I)                                                        SSP00497
  500.       KU=MAXA(I+1) - 1                                                  SSP00498
  501.       II=I + 1                                                          SSP00499
  502.       CC=RR(I)                                                          SSP00500
  503.       DO 100 KK=KL,KU                                                   SSP00501
  504.       II=II - 1                                                         SSP00502
  505.   100 TT(II)=TT(II) + B(KK)*CC                                          SSP00503
  506.       IF (NN.EQ.1) GO TO 900                                            SSP00504
  507.       DO 200 I=2,NN                                                     SSP00505
  508.       KL=MAXA(I) + 1                                                    SSP00506
  509.       KU=MAXA(I+1) - 1                                                  SSP00507
  510.       IF (KU-KL) 200,210,210                                            SSP00508
  511.   210 II=I                                                              SSP00509
  512.       AA=0.                                                             SSP00510
  513.       DO 220 KK=KL,KU                                                   SSP00511
  514.       II=II - 1                                                         SSP00512
  515.   220 AA=AA + B(KK)*RR(II)                                              SSP00513
  516.       TT(I)=TT(I) + AA                                                  SSP00514
  517.   200 CONTINUE                                                          SSP00515
  518. C                                                                       SSP00516
  519.   900 RETURN                                                            SSP00517
  520.       END SUBROUTINE                                                    SSP00518
  521.       SUBROUTINE SCHECK (EIGV,RTOLV,BUP,BLO,BUPC,NEIV,NC,NEI,RTOL,      SSP00519
  522.      1                   SHIFT,IOUT)                                    SSP00520
  523. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSP00521
  524. C .                                                                   . SSP00522
  525. C .   P R O G R A M                                                   . SSP00523
  526. C .        TO EVALUATE SHIFT FOR STURM SEQUENCE CHECK                 . SSP00524
  527. C .                                                                   . SSP00525
  528. C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SSP00526
  529. C                                                                       SSP00527
  530.       IMPLICIT DOUBLE PRECISION (A-H,O-Z)                               SSP00528
  531.       DIMENSION EIGV(NC),RTOLV(NC),BUP(NC),BLO(NC),BUPC(NC),NEIV(NC)    SSP00529
  532. C                                                                       SSP00530
  533.       FTOL=0.01                                                         SSP00531
  534. C                                                                       SSP00532
  535.       DO 100 I=1,NC                                                     SSP00533
  536.       BUP(I)=EIGV(I)*(1.+FTOL)                                          SSP00534
  537.   100 BLO(I)=EIGV(I)*(1.-FTOL)                                          SSP00535
  538.       NROOT=0                                                           SSP00536
  539.       DO 120 I=1,NC                                                     SSP00537
  540.   120 IF (RTOLV(I).LT.RTOL) NROOT=NROOT + 1                             SSP00538
  541.       IF (NROOT.GE.1) GO TO 200                                         SSP00539
  542.       WRITE (IOUT,1010)                                                 SSP00540
  543.       GO TO 800                                                         SSP00541
  544. C                                                                       SSP00542
  545. C      FIND UPPER BOUNDS ON EIGENVALUE CLUSTERS                         SSP00543
  546. C                                                                       SSP00544
  547.   200 DO 240 I=1,NROOT                                                  SSP00545
  548.   240 NEIV(I)=1                                                         SSP00546
  549.       IF (NROOT.NE.1) GO TO 260                                         SSP00547
  550.       BUPC(1)=BUP(1)                                                    SSP00548
  551.       LM=1                                                              SSP00549
  552.       L=1                                                               SSP00550
  553.       I=2                                                               SSP00551
  554.       GO TO 295                                                         SSP00552
  555.   260 L=1                                                               SSP00553
  556.       I=2                                                               SSP00554
  557.   270 IF (BUP(I-1).LE.BLO(I)) GO TO 280                                 SSP00555
  558.       NEIV(L)=NEIV(L) + 1                                               SSP00556
  559.       I=I + 1                                                           SSP00557
  560.       IF (I.LE.NROOT) GO TO 270                                         SSP00558
  561.   280 BUPC(L)=BUP(I-1)                                                  SSP00559
  562.       IF (I.GT.NROOT) GO TO 290                                         SSP00560
  563.       L=L + 1                                                           SSP00561
  564.       I=I + 1                                                           SSP00562
  565.       IF (I.LE.NROOT) GO TO 270                                         SSP00563
  566.       BUPC(L)=BUP(I-1)                                                  SSP00564
  567.   290 LM=L                                                              SSP00565
  568.       IF (NROOT.EQ.NC) GO TO 300                                        SSP00566
  569.   295 IF (BUP(I-1).LE.BLO(I)) GO TO 300                                 SSP00567
  570.       IF (RTOLV(I).GT.RTOL) GO TO 300                                   SSP00568
  571.       BUPC(L)=BUP(I)                                                    SSP00569
  572.       NEIV(L)=NEIV(L) + 1                                               SSP00570
  573.       NROOT=NROOT + 1                                                   SSP00571
  574.       IF (NROOT.EQ.NC) GO TO 300                                        SSP00572
  575.       I=I + 1                                                           SSP00573
  576.       GO TO 295                                                         SSP00574
  577. C                                                                       SSP00575
  578. C      FIND SHIFT                                                       SSP00576
  579. C                                                                       SSP00577
  580.   300 WRITE (IOUT,1020)                                                 SSP00578
  581.       WRITE (IOUT,1005) (BUPC(I),I=1,LM)                                SSP00579
  582.       WRITE (IOUT,1030)                                                 SSP00580
  583.       WRITE (IOUT,1006) (NEIV(I),I=1,LM)                                SSP00581
  584.       LL=LM - 1                                                         SSP00582
  585.       IF (LM.EQ.1) GO TO 310                                            SSP00583
  586.   330 DO 320 I=1,LL                                                     SSP00584
  587.   320 NEIV(L)=NEIV(L) + NEIV(I)                                         SSP00585
  588.       L=L - 1                                                           SSP00586
  589.       LL=LL - 1                                                         SSP00587
  590.       IF (L.NE.1) GO TO 330                                             SSP00588
  591.   310 WRITE (IOUT,1040)                                                 SSP00589
  592.       WRITE (IOUT,1006) (NEIV(I),I=1,LM)                                SSP00590
  593.       L=0                                                               SSP00591
  594.       DO 340 I=1,LM                                                     SSP00592
  595.       L=L + 1                                                           SSP00593
  596.       IF (NEIV(I).GE.NROOT) GO TO 350                                   SSP00594
  597.   340 CONTINUE                                                          SSP00595
  598.   350 SHIFT=BUPC(L)                                                     SSP00596
  599.       NEI=NEIV(L)                                                       SSP00597
  600.       GO TO 900                                                         SSP00598
  601. C                                                                       SSP00599
  602.   800 STOP                                                              SSP00600
  603.   900 RETURN                                                            SSP00601
  604. C                                                                       SSP00602
  605. 1005 FORMAT (' ',6E22.14)                                              SSP00603
  606. 1006 FORMAT (' ',6I22)                                                 SSP00604
  607. 1010 FORMAT (' *** ERROR ***  SOLUTION STOP IN *SCHECK*',/,            SSP00605
  608.      1        ' NO EIGENVALUES FOUND',/)                                SSP00606
  609. 1020 FORMAT (///,' UPPER BOUNDS ON EIGENVALUE CLUSTERS')               SSP00607
  610. 1030 FORMAT (//,' NO. OF EIGENVALUES IN EACH CLUSTER')                 SSP00608
  611. 1040 FORMAT (' NO. OF EIGENVALUES LESS THAN UPPER BOUNDS')             SSP00609
  612.       END SUBROUTINE                                                    SSP00610
  613.       SUBROUTINE JACOBI (A,B,X,EIGV,D,N,NWA,RTOL,NSMAX,IFPR,IOUT)       SSP00611
  614. C ..................................................................... SSP00612
  615. C .                                                                   . SSP00613
  616. C .   P R O G R A M                                                   . SSP00614
  617. C .        TO SOLVE THE GENERALIZED EIGENPROBLEM USING THE            . SSP00615
  618. C .        GENERALIZED JACOBI ITERATION                               . SSP00616
  619. C ..................................................................... SSP00617
  620.       IMPLICIT DOUBLE PRECISION (A-H,O-Z)                               SSP00618
  621.       DIMENSION A(NWA),B(NWA),X(N,N),EIGV(N),D(N)                       SSP00619
  622. C                                                                       SSP00620
  623. C     INITIALIZE EIGENVALUE AND EIGENVECTOR MATRICES                    SSP00621
  624. C                                                                       SSP00622
  625.       N1=N + 1                                                          SSP00623
  626.       II=1                                                              SSP00624
  627.       DO 10 I=1,N                                                       SSP00625
  628.       IF (A(II).GT.0. .AND. B(II).GT.0.) GO TO 4                        SSP00626
  629.       WRITE (IOUT,2020) II,A(II),B(II)                                  SSP00627
  630.       GO TO 800                                                         SSP00628
  631.     4 D(I)=A(II)/B(II)                                                  SSP00629
  632.       EIGV(I)=D(I)                                                      SSP00630
  633.    10 II=II + N1 - I                                                    SSP00631
  634.       DO 30 I=1,N                                                       SSP00632
  635.       DO 20 J=1,N                                                       SSP00633
  636.    20 X(I,J)=0.                                                         SSP00634
  637.    30 X(I,I)=1.                                                         SSP00635
  638.       IF (N.EQ.1) GO TO 900                                             SSP00636
  639. C                                                                       SSP00637
  640. C     INITIALIZE SWEEP COUNTER AND BEGIN ITERATION                      SSP00638
  641. C                                                                       SSP00639
  642.       NSWEEP=0                                                          SSP00640
  643.       NR=N - 1                                                          SSP00641
  644.    40 NSWEEP=NSWEEP + 1                                                 SSP00642
  645.       IF (IFPR.EQ.1) WRITE (IOUT,2000) NSWEEP                           SSP00643
  646. C                                                                       SSP00644
  647. C     CHECK IF PRESENT OFF-DIAGONAL ELEMENT IS LARGE ENOUGH TO REQUIRE  SSP00645
  648. C     ZEROING                                                           SSP00646
  649. C                                                                       SSP00647
  650.       EPS=(.01)**(NSWEEP*2)                                             SSP00648
  651.       DO 210 J=1,NR                                                     SSP00649
  652.       JP1=J + 1                                                         SSP00650
  653.       JM1=J - 1                                                         SSP00651
  654.       LJK=JM1*N - JM1*J/2                                               SSP00652
  655.       JJ=LJK + J                                                        SSP00653
  656.       DO 210 K=JP1,N                                                    SSP00654
  657.       KP1=K + 1                                                         SSP00655
  658.       KM1=K - 1                                                         SSP00656
  659.       JK=LJK + K                                                        SSP00657
  660.       KK=KM1*N - KM1*K/2 + K                                            SSP00658
  661.       EPTOLA=(A(JK)/A(JJ))*(A(JK)/A(KK))                                SSP00659
  662.       EPTOLB=(B(JK)/B(JJ))*(B(JK)/B(KK))                                SSP00660
  663.       IF (EPTOLA.LT.EPS .AND. EPTOLB.LT.EPS) GO TO 210                  SSP00661
  664. C                                                                       SSP00662
  665. C     IF ZEROING IS REQUIRED, CALCULATE THE ROTATION MATRIX ELEMENTS CA SSP00663
  666. C     AND CG                                                            SSP00664
  667. C                                                                       SSP00665
  668.       AKK=A(KK)*B(JK) - B(KK)*A(JK)                                     SSP00666
  669.       AJJ=A(JJ)*B(JK) - B(JJ)*A(JK)                                     SSP00667
  670.       AB=A(JJ)*B(KK) - A(KK)*B(JJ)                                      SSP00668
  671.       SCALE=A(KK)*B(KK)                                                 SSP00669
  672.       ABCH=AB/SCALE                                                     SSP00670
  673.       AKKCH=AKK/SCALE                                                   SSP00671
  674.       AJJCH=AJJ/SCALE                                                   SSP00672
  675.       CHECK=(ABCH*ABCH+4.0*AKKCH*AJJCH)/4.0                             SSP00673
  676.       IF (CHECK) 50,60,60                                               SSP00674
  677.    50 WRITE (IOUT,2020) JJ,A(JJ),B(JJ)                                  SSP00675
  678.       GO TO 800                                                         SSP00676
  679.    60 SQCH=SCALE*SQRT(CHECK)                                            SSP00677
  680.       D1=AB/2. + SQCH                                                   SSP00678
  681.       D2=AB/2. - SQCH                                                   SSP00679
  682.       DEN=D1                                                            SSP00680
  683.       IF (ABS(D2).GT.ABS(D1)) DEN=D2                                    SSP00681
  684.       IF (DEN) 80,70,80                                                 SSP00682
  685.    70 CA=0.                                                             SSP00683
  686.       CG=-A(JK)/A(KK)                                                   SSP00684
  687.       GO TO 90                                                          SSP00685
  688.    80 CA=AKK/DEN                                                        SSP00686
  689.       CG=-AJJ/DEN                                                       SSP00687
  690. C                                                                       SSP00688
  691. C     PERFORM THE GENERALIZED ROTATION TO ZERO THE PRESENT OFF-DIAGONAL SSP00689
  692. C     ELEMENT                                                           SSP00690
  693. C                                                                       SSP00691
  694.    90 IF (N-2) 100,190,100                                              SSP00692
  695.   100 IF (JM1-1) 130,110,110                                            SSP00693
  696.   110 DO 120 I=1,JM1                                                    SSP00694
  697.       IM1=I - 1                                                         SSP00695
  698.       IJ=IM1*N - IM1*I/2 + J                                            SSP00696
  699.       IK=IM1*N - IM1*I/2 + K                                            SSP00697
  700.       AJ=A(IJ)                                                          SSP00698
  701.       BJ=B(IJ)                                                          SSP00699
  702.       AK=A(IK)                                                          SSP00700
  703.       BK=B(IK)                                                          SSP00701
  704.       A(IJ)=AJ + CG*AK                                                  SSP00702
  705.       B(IJ)=BJ + CG*BK                                                  SSP00703
  706.       A(IK)=AK + CA*AJ                                                  SSP00704
  707.   120 B(IK)=BK + CA*BJ                                                  SSP00705
  708.   130 IF (KP1-N) 140,140,160                                            SSP00706
  709.   140 LJI=JM1*N - JM1*J/2                                               SSP00707
  710.       LKI=KM1*N - KM1*K/2                                               SSP00708
  711.       DO 150 I=KP1,N                                                    SSP00709
  712.       JI=LJI + I                                                        SSP00710
  713.       KI=LKI + I                                                        SSP00711
  714.       AJ=A(JI)                                                          SSP00712
  715.       BJ=B(JI)                                                          SSP00713
  716.       AK=A(KI)                                                          SSP00714
  717.       BK=B(KI)                                                          SSP00715
  718.       A(JI)=AJ + CG*AK                                                  SSP00716
  719.       B(JI)=BJ + CG*BK                                                  SSP00717
  720.       A(KI)=AK + CA*AJ                                                  SSP00718
  721.   150 B(KI)=BK + CA*BJ                                                  SSP00719
  722.   160 IF (JP1-KM1) 170,170,190                                          SSP00720
  723.   170 LJI=JM1*N - JM1*J/2                                               SSP00721
  724.       DO 180 I=JP1,KM1                                                  SSP00722
  725.       JI=LJI + I                                                        SSP00723
  726.       IM1=I - 1                                                         SSP00724
  727.       IK=IM1*N - IM1*I/2 + K                                            SSP00725
  728.       AJ=A(JI)                                                          SSP00726
  729.       BJ=B(JI)                                                          SSP00727
  730.       AK=A(IK)                                                          SSP00728
  731.       BK=B(IK)                                                          SSP00729
  732.       A(JI)=AJ + CG*AK                                                  SSP00730
  733.       B(JI)=BJ + CG*BK                                                  SSP00731
  734.       A(IK)=AK + CA*AJ                                                  SSP00732
  735.   180 B(IK)=BK + CA*BJ                                                  SSP00733
  736.   190 AK=A(KK)                                                          SSP00734
  737.       BK=B(KK)                                                          SSP00735
  738.       A(KK)=AK + 2.*CA*A(JK) + CA*CA*A(JJ)                              SSP00736
  739.       B(KK)=BK + 2.*CA*B(JK) + CA*CA*B(JJ)                              SSP00737
  740.       A(JJ)=A(JJ) + 2.*CG*A(JK) + CG*CG*AK                              SSP00738
  741.       B(JJ)=B(JJ) + 2.*CG*B(JK) + CG*CG*BK                              SSP00739
  742.       A(JK)=0.                                                          SSP00740
  743.       B(JK)=0.                                                          SSP00741
  744. C                                                                       SSP00742
  745. C     UPDATE THE EIGENVECTOR MATRIX AFTER EACH ROTATION                 SSP00743
  746. C                                                                       SSP00744
  747.       DO 200 I=1,N                                                      SSP00745
  748.       XJ=X(I,J)                                                         SSP00746
  749.       XK=X(I,K)                                                         SSP00747
  750.       X(I,J)=XJ + CG*XK                                                 SSP00748
  751.   200 X(I,K)=XK + CA*XJ                                                 SSP00749
  752.   210 CONTINUE                                                          SSP00750
  753. C                                                                       SSP00751
  754. C     UPDATE THE EIGENVALUES AFTER EACH SWEEP                           SSP00752
  755. C                                                                       SSP00753
  756.       II=1                                                              SSP00754
  757.       DO 220 I=1,N                                                      SSP00755
  758.       IF (A(II).GT.0. .AND. B(II).GT.0.) GO TO 215                      SSP00756
  759.       WRITE (IOUT,2020) II,A(II),B(II)                                  SSP00757
  760.       GO TO 800                                                         SSP00758
  761.   215 EIGV(I)=A(II)/B(II)                                               SSP00759
  762.   220 II=II + N1 - I                                                    SSP00760
  763.       IF (IFPR.EQ.0) GO TO 230                                          SSP00761
  764.       WRITE (IOUT,2030)                                                 SSP00762
  765.       WRITE (IOUT,2010) (EIGV(I),I=1,N)                                 SSP00763
  766. C                                                                       SSP00764
  767. C     CHECK FOR CONVERGENCE                                             SSP00765
  768. C                                                                       SSP00766
  769.   230 DO 240 I=1,N                                                      SSP00767
  770.       TOL=RTOL*D(I)                                                     SSP00768
  771.       DIF=ABS(EIGV(I)-D(I))                                             SSP00769
  772.       IF (DIF.GT.TOL) GO TO 280                                         SSP00770
  773.   240 CONTINUE                                                          SSP00771
  774. C                                                                       SSP00772
  775. C     CHECK ALL OFF-DIAGONAL ELEMENTS TO SEE IF ANOTHER SWEEP IS        SSP00773
  776. C     REQUIRED                                                          SSP00774
  777. C                                                                       SSP00775
  778.       EPS=RTOL**2                                                       SSP00776
  779.       DO 250 J=1,NR                                                     SSP00777
  780.       JM1=J - 1                                                         SSP00778
  781.       JP1=J + 1                                                         SSP00779
  782.       LJK=JM1*N - JM1*J/2                                               SSP00780
  783.       JJ=LJK + J                                                        SSP00781
  784.       DO 250 K=JP1,N                                                    SSP00782
  785.       KM1=K - 1                                                         SSP00783
  786.       JK=LJK + K                                                        SSP00784
  787.       KK=KM1*N - KM1*K/2 + K                                            SSP00785
  788.       EPSA=(A(JK)/A(JJ))*(A(JK)/A(KK))                                  SSP00786
  789.       EPSB=(B(JK)/B(JJ))*(B(JK)/B(KK))                                  SSP00787
  790.       IF (EPSA.LT.EPS .AND. EPSB.LT.EPS) GO TO 250                      SSP00788
  791.       GO TO 280                                                         SSP00789
  792.   250 CONTINUE                                                          SSP00790
  793. C                                                                       SSP00791
  794. C     SCALE EIGENVECTORS                                                SSP00792
  795. C                                                                       SSP00793
  796.   255 II=1                                                              SSP00794
  797.       DO 275 I=1,N                                                      SSP00795
  798.       BB=SQRT(B(II))                                                    SSP00796
  799.       DO 270 K=1,N                                                      SSP00797
  800.   270 X(K,I)=X(K,I)/BB                                                  SSP00798
  801.   275 II=II + N1 - I                                                    SSP00799
  802.       GO TO 900                                                         SSP00800
  803. C                                                                       SSP00801
  804. C     UPDATE  D  MATRIX AND START NEW SWEEP, IF ALLOWED                 SSP00802
  805. C                                                                       SSP00803
  806.   280 DO 290 I=1,N                                                      SSP00804
  807.   290 D(I)=EIGV(I)                                                      SSP00805
  808.       IF (NSWEEP.LT.NSMAX) GO TO 40                                     SSP00806
  809.       GO TO 255                                                         SSP00807
  810. C                                                                       SSP00808
  811.   800 STOP                                                              SSP00809
  812.   900 RETURN                                                            SSP00810
  813. C                                                                       SSP00811
  814. 2000 FORMAT (//,' SWEEP NUMBER IN *JACOBI* = ',I8)                     SSP00812
  815. 2010 FORMAT (' ',6E20.12)                                              SSP00813
  816. 2020 FORMAT (' *** ERROR *** SOLUTION STOP',/,                         SSP00814
  817.      1        ' MATRICES NOT POSITIVE DEFINITE',/,                      SSP00815
  818.      2        ' II = ',I8,' A(II) = ',E20.12,' B(II) = ',E20.12)        SSP00816
  819. 2030 FORMAT (/,' CURRENT EIGENVALUES IN *JACOBI* ARE',/)               SSP00817
  820.       END SUBROUTINE                                                    SSP00818

  821.         END MODULE
复制代码


!******************************************
!文件TRANCOM.F90(满存储转半带宽存储)
!******************************************
  1.         MODULE TRANCOM_
  2. !        *********************************************
  3. !                THIS MODULE CONTAINS SOME SUBROUTINES
  4. !        USED TO TRANSFORM FULL STORAGE INTO COMPRESS
  5. !        STORAGE.
  6. !                                                        XIN ZHAO 2002-7-24
  7. !        *********************************************

  8.         CONTAINS

  9.         SUBROUTINE COMNUM (A, NN, NW, MAXA, CH)
  10. !        *********************************************
  11. !        PROGRAM
  12. !                CALCULATE THE NUMBER OF NONZERO ENTRIES
  13. !        IN UP TRIMATRIX OF SYMMETRIC MATRIX A.
  14. !        --INPUT VARIABLES--
  15. !                A        MATRIX       
  16. !                NN        DIMENSION OF MATRIX A
  17. !                NW        NONZERO ENTRIES' NUMBER
  18. !        --OUTPUT VARIABLES--
  19. !                NW        NONZERO ENTRIES' NUMBER
  20. !                                                        XIN ZHAO 2002-7-24
  21. !        *********************************************
  22.         INTEGER NN, NW, M(NN), CH(NN), MAXA(NN+1), SUM
  23.         REAL*8 A(NN,NN)

  24.         DO i=1, NN
  25.                 DO j=1,i
  26.                         IF (A(j,i).NE.0) THEN
  27.                                 M(i)=j
  28.                                 CH(i)=i-M(i)+1
  29.                                 GOTO 10
  30.                         END IF
  31.                 END DO
  32. 10        END DO

  33.         NW=0
  34.         DO i=1, NN
  35.                 NW=NW+CH(i)
  36.         END DO

  37.         SUM=0; MAXA=0
  38.         MAXA(1)=1
  39.         DO i=2, NN+1
  40.                 SUM=SUM+CH(i-1)
  41.                 MAXA(i)=SUM+1
  42.         END DO       

  43.         END SUBROUTINE

  44.         SUBROUTINE TRANCOM (A, NN, B, NW, CH)
  45. !        *********************************************
  46. !        PROGRAM
  47. !                TRANSFORM FULL STORED MATRIX A INTO
  48. !        COMPRESS STORED VECTOR B.
  49. !        --INPUT VARIABLES--
  50. !        A        MATRIX
  51. !        NN        DIMESION OF MATRIX
  52. !        B        VECTOR CONTAINS COMPRESS STORED A
  53. !        CH        COLUMN HEIGHT OF A
  54. !        --OUTPUT VARIABLES--
  55. !        B        VECTOR CONTAINS COMPRESS STORED A
  56. !
  57. !                                                XIN ZHAO 2002-7-24                                       
  58. !        *********************************************
  59.         INTEGER NN, NW, CH(NN), p
  60.         REAL*8 A(NN,NN), B(NW)
  61.         k=1
  62.         i=0; j=0
  63.         DO i=1, NN
  64.                 p=i-CH(i)+1
  65.                 DO j=i, p, -1
  66.                         B(k)=A(j,i)
  67.                         k=k+1
  68.                 END DO
  69.         END DO
  70.         END SUBROUTINE
  71.        
  72.         END MODULE
复制代码
回复
分享到:

使用道具 举报

发表于 2005-8-28 00:12 | 显示全部楼层

回复:(sean888)模态分析小程序(满存储格式)

?????????????
发表于 2005-8-28 11:11 | 显示全部楼层
将满存储格式转变为半带宽存储实在是多此一举。在程序设计的时候就应该考虑到这些问题的。
发表于 2005-8-28 14:49 | 显示全部楼层
谢谢楼主分享,<BR>楼主有用过不?效果如何?
发表于 2005-8-28 15:49 | 显示全部楼层
Bathe同学的程序还是值得信赖的。
发表于 2014-5-16 16:47 | 显示全部楼层
本人编了一个计算框架的小程序,静力计算时用的满存储,现在想进行模态分析,楼主这个程序真是帮大忙了,但是把生成的结果代入的时候遇到了点麻烦,请问那个驱动模块到底是在算什么的? lumpindex这个参数作用看不懂啊,还有最终输出的结果是什么意思?新人,跪求指点。
发表于 2014-5-16 16:57 | 显示全部楼层
另外,质量矩阵为连续质量能不能用这个程序求模态?
发表于 2014-5-19 19:07 | 显示全部楼层
K.J.Bathe的算法是SIM吧,早就out了
发表于 2014-5-19 19:57 | 显示全部楼层
.
    SIM算法是什么?现在的算法又是什么?学习...

点评

Subspace iteration method  发表于 2014-5-20 09:06
发表于 2014-5-20 09:05 | 显示全部楼层
mxlzhenzhu 发表于 2014-5-19 19:07
K.J.Bathe的算法是SIM吧,早就out了

子空间迭代法的基本思想并没有过时
利用瑞利商迭代加速收敛的新方法还是有很多,譬如intel fortran compiler最近集成的FEAST方法就是把求解域从实数扩展到复数,利用围线积分加快收敛速度的新方法
发表于 2014-9-23 13:22 | 显示全部楼层
啊啊啊啊啊啊啊啊啊啊啊啊啊啊
发表于 2014-9-23 13:23 | 显示全部楼层
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-23 10:13 , Processed in 0.071065 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表