⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a34.for

📁 ADINA84有限元编程学习的好例子
💻 FOR
📖 第 1 页 / 共 4 页
字号:
      DIMENSION A(ISTOH),B(ISTOH),XM(*),TT(*),W(*),WW(*),R(NN,*),D(*)
      INTEGER MAXA(*),NCOLBV(*),ICOPL(*),NLOC(*)
C
      REWIND NSHIFT
      NJ=1
      BETOL=0.0001D0
      RQTOL=0.0000001D0
      GSTOL=0.001D0
      IF (IFPR.NE.0) WRITE (IOUT,2000)
C
C
   10 IF (NCEV.EQ.0) GO TO 60
      REWIND NT
      READ (NT)
      DO 40 I=1,NCEV
      READ (NT) (TT(K),K=1,NN),(WW(K),K=1,NN)
      AL=0.0D0
      DO 20 K=1,NN
   20 AL=AL + R(K,M1)*WW(K)
      DO 30 K=1,NN
   30 R(K,M1)=R(K,M1) - AL*TT(K)
   40 CONTINUE
C
   60 IF (IMASS.EQ.1) GO TO 65
      CALL MLTPLY (TT,B,R(1,M1),MAXA,NN,NCOLBV,ISTOH,NBLOCK,NMASS)
      GO TO 75
   65 DO 70 K=1,NN
   70 TT(K)=XM(K)*R(K,M1)
C
C
   75 IF (M1.EQ.1) GO TO 110
      IF (KKK.EQ.1) REWIND NSHIFT
      MM=M1 - 1
      DO 90 I=1,MM
      AL=0.0D0
      DO 80 K=1,NN
   80 AL=AL + R(K,M1)*R(K,I)
      DO 85 K=1,NN
   85 TT(K)=TT(K) - AL*R(K,I)
      IF (KKK.GT.1) GO TO 90
      READ (NSHIFT) (WW(K),K=1,NN)
      DO 88 K=1,NN
   88 R(K,M1)=R(K,M1) - AL*WW(K)
   90 CONTINUE
      IF (KKK.EQ.1) GO TO 110
C
      DO 92 K=1,NN
   92 R(K,M1)=TT(K)
      CALL BANDET (A,B,XM,TT,W,MAXA,NCOLBV,ICOPL,NN,ISTOH,NBLOCK,
     1             SHIFT,NSCH,IMASS,FDETA,IDETA,2)
      ALFA=0.0D0
      DO 100 K=1,NN
  100 ALFA=ALFA + TT(K)*R(K,M1)
C
      IF (IMASS.EQ.1) GO TO 105
      CALL MLTPLY (R(1,M1),B,TT,MAXA,NN,NCOLBV,ISTOH,NBLOCK,NMASS)
      GO TO 130
  105 DO 108 K=1,NN
  108 R(K,M1)=XM(K)*TT(K)
      GO TO 130
C
  110 DO 120 K=1,NN
      DUM=TT(K)
      TT(K)=R(K,M1)
  120 R(K,M1)=DUM
      ALFA=0.0D0
C
  130 BETA=0.0D0
      DO 135 K=1,NN
  135 BETA=BETA + TT(K)*R(K,M1)
      D(NJ)=ALFA/BETA
      BETA=SQRT(BETA)
      GAMA=BETA
      DO 140 K=1,NN
      TT(K)=TT(K)/BETA
  140 R(K,M1)=R(K,M1)/BETA
      IF (IFPR.NE.0) WRITE (IOUT,2020) M1,ALFA,BETA,GAMA,D(NJ)
C
      WRITE (NSHIFT) (TT(K),K=1,NN)
      IF (M1.EQ.M2) GO TO 500
      BETA=0.0D0
      DO 210 K=1,NN
  210 WW(K)=0.0D0
      MM=M1 + 1
C
      DO 400 J=MM,M2
      J1=J - 1
C
C     INVERSE ITERATION
C
      DO 220 K=1,NN
  220 R(K,J)=R(K,J1)
      CALL BANDET (A,B,XM,R(1,J),W,MAXA,NCOLBV,ICOPL,NN,ISTOH,NBLOCK,
     1             SHIFT,NSCH,IMASS,FDETA,IDETA,2)
C
C
      ALFA=0.0D0
      DO 230 K=1,NN
  230 ALFA=ALFA + R(K,J)*R(K,J1)
      RQT=ALFA
      DO 240 K=1,NN
  240 R(K,J)=R(K,J) - ALFA*TT(K) - BETA*WW(K)
      DO 250 K=1,NN
  250 WW(K)=TT(K)
C
C
      RQB=ALFA*ALFA + BETA*BETA
      IF (IMASS.EQ.1) GO TO 265
      CALL MLTPLY (TT,B,R(1,J),MAXA,NN,NCOLBV,ISTOH,NBLOCK,NMASS)
      GO TO 275
  265 DO 270 K=1,NN
  270 TT(K)=XM(K)*R(K,J)
  275 BETA=0.0D0
      DO 280 K=1,NN
  280 BETA=BETA + R(K,J)*TT(K)
      RQB=RQB + BETA
      RQ=RQT/RQB
      BETA=SQRT(BETA)
      GAMA=SQRT(RQB)
      DO 285 K=1,NN
  285 R(K,J)=R(K,J)/BETA
      IF (IFPR.NE.0) WRITE (IOUT,2020) J,ALFA,BETA,GAMA,RQ
C
C
      DO 290 I=1,NJ
      IF (ABS(D(NJ) - RQ).LE.ABS(RQ)*RQTOL) GO TO 295
  290 CONTINUE
      IF (BETA/GAMA.GT.BETOL) GO TO 300
  295 DO 298 K=1,NN
  298 R(K,J)=0.0D0
      IJ=NLOC(NCEV + J)
      R(IJ,J)=1.0D0
      M1=J
      NJ=NJ + 1
      GO TO 10
C
C
  300 REWIND NSHIFT
      IFLAG=0
      DO 330 I=1,NJ
      READ (NSHIFT) (TT(K),K=1,NN)
      IF (IFLAG.GT.0) GO TO 330
      AL=0.0D0
      DO 310 K=1,NN
  310 AL=AL + R(K,J)*R(K,I)
      IF (ABS(AL).GT.GSTOL) IFLAG=1
      DO 320 K=1,NN
  320 R(K,J)=R(K,J) - AL*TT(K)
  330 CONTINUE
      IF (IFLAG.GT.0) GO TO 295
C
      DO 340 K=1,NN
  340 TT(K)=R(K,J)
      IF (IMASS.EQ.1) GO TO 350
      CALL MLTPLY (R(1,J),B,TT,MAXA,NN,NCOLBV,ISTOH,NBLOCK,NMASS)
      GO TO 370
  350 DO 360 K=1,NN
  360 R(K,J)=XM(K)*TT(K)
C
  370 AL=0.0D0
      DO 380 K=1,NN
  380 AL=AL + TT(K)*R(K,J)
      AL=SQRT(AL)
      DO 390 K=1,NN
      TT(K)=TT(K)/AL
  390 R(K,J)=R(K,J)/AL
C
      NJ=NJ + 1
      D(NJ)=RQ
      WRITE (NSHIFT) (TT(K),K=1,NN)
  400 CONTINUE
C
C
  500 IF (KKK.GT.1 .OR. IINTER.EQ.0) GO TO 600
      REWIND NSHIFT
      DO 530 J=1,M2
      AL=0.0D0
      DO 510 K=1,NN
  510 AL=AL + R(K,NQ)*R(K,J)
      READ (NSHIFT) (TT(K),K=1,NN )
      DO 520 K=1,NN
  520 R(K,NQ)=R(K,NQ) - AL*TT(K)
  530 CONTINUE
C
  600 RETURN
C
 2000 FORMAT (///,49H STARTING VECTORS ARE GENERATED BY LANCZOS METHOD /
     1     /,7H VECTOR,59H     ALFA           BETA           GAMA
     1  RAYL. QUO.     ,/  )
 2020 FORMAT (I7,4E15.5)
 2050 FORMAT (21H GRAM-SCHMIDT FACTORS,(/8E15.5))
C
      END
      SUBROUTINE RAPID (EIGV,D,TT,W,EVC1,EVC2,RTOLV,R,RR,FREQ,WW,XM,
     1                  NLOC,NSIT,NN,NQ)
C
C
C***ADD:DPR***
      IMPLICIT DOUBLE PRECISION ( A-H,O-Z )
C***END:DPR***
      COMMON /SOL/ NUMNP,NEQ,NWK,NWM,NWC,NUMEST,MIDEST,MAXEST,NSTE,MAL
      COMMON /EIGIF/ COFQ,RBMSH,IESTYP,NFREQ,NMODE,IFPR,IRBM,
     1               IRSPA,IRSPC,NDIR
      COMMON /SCRAP/ SHIFT,RLQ1,NLQ,NITE,NSTEP,JR,ICONV,NCEV,NP,NQA,IFSS
      COMMON /EL/ IND,ICOUNT,NPAR(20),NUMEG,NEGL,NEGNL,IMASS,IDAMP,ISTAT
     1            ,NDOF,KLIN,IEIG,IMASSN,IDAMPN
      COMMON /DIM/ N0,N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11,N12,N13,N14,N15
      COMMON /FREQIF/ ISTOH,N1A,N1B,N1C,N1S
      COMMON /ADDB/ NEQL,NEQR,MLA,NBLOCK
      COMMON /ITELMT/ NSMAX,NITEM,NITEMM,NOVM
      COMMON /FAST/ SHIFT1,SHIFT2,IOVER,IRPC,NSTV,IINTER,JROLD,NSCH1,
     1              IACCN,NJUNK,ISVTYP
      COMMON /DIMSSP/ M3,M4,M5,M6,M7,M8,M9
      COMMON /TAPES/ IIN,IOUT
      COMMON /TAPEIG/ SCALE,NSTIF,NT,NMASS,NRED,NSHIFT,NOVER
      COMMON /TOLS/ RTOL,ALPHA,CTOL,ANORM,RCTOL
C
      REAL A
      COMMON A(1)
      INTEGER IA(1)
      EQUIVALENCE (A(1),IA(1))
C
      DIMENSION EIGV(*),D(*),TT(*),W(*),EVC1(*),EVC2(*),RTOLV(*),R(NN,*)
     1         ,RR(NN,*),FREQ(*),WW(*),XM(*),NLOC(*),NSIT(*)
      DATA NFAC/0/, NGS/0/
C
      RMUS=SHIFT
      SHIFTO=SHIFT
      RITOL=RTOL
      IF (IINTER.GT.0) RITOL=RCTOL
      NP=NFREQ - NCEV
      IF (NQ.LT.NP) RITOL=RCTOL
      IVSHF=0
C
      NEIG=0
      DO 580 I=1,NQ
      IF (RTOLV(I).GT.RITOL) GO TO 590
      NEIG=I
      IF (NLOC(NCEV + I).GT.0) GO TO 580
      NLOC(I + NCEV)=NITE - NSIT(I)
  580 CONTINUE
C
  590 IF (NEIG.EQ.0) GO TO 600
      IF (EIGV(NEIG).GE.SHIFT2) GO TO 595
      IF (NCEV + NEIG.LT.NFREQ) GO TO 600
  595 NFREQ=NCEV + NEIG
      ICONV=1
      JR=0
      IF (IFPR.NE.0) WRITE (IOUT,2060) RTOL,NITE,NFAC,NGS
      GO TO 910
C
  600 IF (NITE.LT.NITEMM) GO TO 700
      IF (IEIG.NE.2) WRITE (IOUT,2070)
      IF (IEIG.EQ.2) WRITE (IOUT,2080) NEIG
      ICONV=2
      IF (IEIG.NE.2) IFSS=0
      IF (IEIG.EQ.2 .AND. NEIG.EQ.0) IFSS=0
      NFREQ=NCEV + NEIG
      JR=0
      GO TO 910
C
C
  700 NC=NFREQ - NCEV
      IF (NC.GT.NQ .OR. IINTER.GT.0) NC=NQ
      IF (NC.GT.0) GO TO 705
      WRITE (IOUT,3010)
      STOP
  705 IF (IACCN.EQ.0) GO TO 1200
      IF (RITOL.EQ.RCTOL) GO TO 720
      NEIG=0
      DO 710 I=1,NQ
      IF (RTOLV(I).GT.RCTOL) GO TO 720
      NEIG=I
  710 CONTINUE
  720 IF (NEIG.LT.NQ) GO TO 730
      IVSHF=1
      GO TO 910
C
  730 IF (NITE.LE.NSTEP - 2) GO TO 910
      DO 740 I=1,NC
      TEMP=D(I) - EVC2(I)
      EVC2(I)=0.0D0
      IF (ABS(TEMP).GT.D(I)*1.E-10) EVC2(I)=(EIGV(I) - D(I))/TEMP
  740 CONTINUE
      IF (IFPR.GT.1)
     1 WRITE (IOUT,2300) (EVC2(I),I=1,NC)
      IF (NITE.EQ.NSTEP - 1) GO TO 910
      IF (IFPR.GT.1)
     1 WRITE (IOUT,2350) (EVC1(I),I=1,NC)
C
C
      DO 750 I=1,NC
      TT(I)=EIGV(NQ)*2.**30
      IF (RTOLV(I).GT.1.D-3 .OR. RTOLV(I).LT.RCTOL) GO TO 750
      IF (EVC2(I).GT.0.99D0 .OR. EVC2(I).LT.1.D-5) GO TO 750
      TEMP=EVC2(I) - EVC1(I)
      TEMP=ABS(TEMP/EVC2(I))
      IF (TEMP.GT.CTOL) GO TO 750
      TT(I)=(EIGV(I) - RMUS)/SQRT(EVC2(I)) + RMUS
      IF (TT(I).LT.RMUS) GO TO 750
      IF (RTOLV(I).GT.RCTOL) NLOC(NCEV + I)=-1
  750 CONTINUE
      IF (IFPR.GT.1)
     1 WRITE (IOUT,2400) (TT(I),I=1,NC)
C
      MLQ=0
      TLQ=0.0D0
      DO 760 I=1,NC
      IF (TT(I).GE.EIGV(NQ)*2.**30) GO TO 760
      IF (TT(I).LT.RMUS) GO TO 760
      MLQ=MLQ + 1
      TLQ=TLQ + TT(I)
  760 CONTINUE
C
      IF (MLQ.NE.0)
     1 RLQ1=(NLQ*RLQ1 + TLQ)/(NLQ + MLQ)
      NLQ=MLQ + NLQ
      IF (IFPR.NE.0)
     1 WRITE (IOUT,2500) RLQ1,NLQ
      IF (RLQ1.GT.0.D0) GO TO 762
      IF (NITE.EQ.NITEMM - 1 .AND. NEIG.GT.0) IVSHF=1
      GO TO 910
C
C
  762 J=1
      DO 763 I=1,NC
      IF (EIGV(I).GT.RMUS) GO TO 765
      J=J + 1
  763 CONTINUE
C
  765 IF (J.GT.NC) J=NC
      NR=J
      DO 770 I=J,NC
      IF (RTOLV(I).GT.RCTOL) GO TO 773
      NR=NR + 1
  770 CONTINUE
C
  773 IF (NR.GT.NC) NR=NC
      K=NR
      BAND=EIGV(1) + (RLQ1 - EIGV(1))/3
C
  775 NR=NR - 1
      IF (NR.LE.J) GO TO 778
      SHIFT=0.5*(EIGV(NR) + EIGV(NR - 1))
      IF (SHIFT.LT.1.01*EIGV(NR - 1)) GO TO 775
      IF (SHIFT.GT.0.99*EIGV(NR)) GO TO 775
      IF (SHIFT.GT.BAND) GO TO 775
      J=NR
      GO TO 790
C
C
  778 IF (J.GT.1) GO TO 788
      IF (NCEV.GT.0) GO TO 780
      SHIFT=0.5*EIGV(1)
      IF (SHIFT.LE.RMUS) GO TO 910
      J=1
      GO TO 790
C
C
  780 NR=NCEV + 2
      FREQ(NCEV + 1)=EIGV(1)
      IF (RTOLV(1).GT.RCTOL) NR=NR - 1
  785 NR=NR - 1
      IF (NR.LT.1) GO TO 910
      SHIFT=0.5*FREQ(NR)
      IF (NR.GT.1) SHIFT=SHIFT + 0.5*FREQ(NR - 1)
      IF (SHIFT.LE.RMUS) GO TO 910
      IF (SHIFT.LT.1.01*FREQ(NR - 1)) GO TO 785
      IF (SHIFT.GT.0.99*FREQ(NR)) GO TO 785
      J=NR - NCEV
      GO TO 790
C
C
  788 TEMP=0.5*(EIGV(K) + EIGV(K - 1))
      IF (TEMP.GT.BAND) IVSHF=1
      GO TO 910
C
C
  790 SI=0.0D0
      II=NC
      DO 800 I=K,NC
      IF (EIGV(I).GE.RLQ1) GO TO 800
      IF (RTOLV(I).LE.RITOL .OR. RTOLV(I).GT.0.01D0) GO TO 800
      TOLI=RITOL/RTOLV(I)
      DI=((EIGV(I) - RMUS)/(RLQ1 - RMUS))**2
      ST = LOG10(TOLI) / LOG10(DI)
      DP=((EIGV(I) - SHIFT)/(RLQ1 - SHIFT))**2
      STP = LOG10(TOLI) / LOG10(DP)
      SII=ST - STP
      IF (SII.LE.SI) GO TO 800
      SI=SII
      II=I
  800 CONTINUE
      I=II
      TOLI=RITOL/RTOLV(I)
      DI=((EIGV(I) - RMUS)/(RLQ1 - RMUS))**2
      ST = LOG10(TOLI) / LOG10(DI)
      DP=((EIGV(I) - SHIFT)/(RLQ1 - SHIFT))**2
      STP = LOG10(TOLI) / LOG10(DP)
C
C
      IF (SI.GT.3.D0) GO TO 820
      NOFAC=0
      NOSI=0
      IF (K.LE.1) GO TO 850
      TEMP=0.5*(EIGV(K) + EIGV(K - 1))
      IF (TEMP.LT.BAND) GO TO 850
      IVSHF=1
      GO TO 910
C
  820 MA=NWK/NN + 1
      NOFAC=(MA*MA + 3*MA)/2
      IF (IMASS.EQ.2) NOFAC=NOFAC + MA
      NP=NQ - JR
      NOSI=(2*MA*NP + 2*NP*NP + 3*NP + 2*NP*JR + 2*NQ*NCEV)*SI
      IF (IMASS.EQ.2) NOSI=NOSI + 2*MA*NP*SI
      NOSI=NOSI + 18*NP*NP*NP*SI/NN
      IF (NOFAC.GE.ALPHA*NOSI) GO TO 850
C
C
      IF (IFPR.NE.0) WRITE (IOUT,2600)
      NSTEP=4 + NITE
      RMUS=SHIFT
      NFAC=NFAC + 1
C
      CALL BANDET (A(N2),A(M3),A(M4),TT,W,A(N1),A(N1A),A(N1B),NN,
     1             ISTOH,NBLOCK,SHIFT,NSCH,IMASS,FDETA,IDETA,1)
C
C
      IF (IFPR.NE.0) WRITE (IOUT,2650) NSCH
      IF (NSCH.EQ.NSCH1 + NCEV + J - 1) GO TO 855
      WRITE (IOUT,2680)
      IFSS=0
      GO TO 595
C
  850 IF (IFPR.NE.0) WRITE (IOUT,2690)
  855 IF (IFPR.EQ.0) GO TO 910
      J=J + NCEV + NSCH1
      I=I + NCEV + NSCH1
      WRITE (IOUT,2700) J,I,SHIFT
      WRITE (IOUT,2800) TOLI,DI,DP,ST,STP,NOFAC,NOSI
C
  910 SHIFT=RMUS
      IF (IACCN.EQ.0) GO TO 1200
C
C
      IF (NCEV.EQ.0) GO TO 985
      REWIND NT
      READ (NT)
      BAND=ABS(EIGV(NQ) - SHIFT)
      JJ=JR + 1
      NORTHO=0
      DO 980 J=1,NCEV
      IF (NJUNK.GT.0) GO TO 930
      RT=ABS(FREQ(J) - SHIFT)
      IF (RT.LE.BAND) GO TO 930
      READ (NT)
      GO TO 980
C
  930 READ (NT) (TT(I),I=1,NN),(WW(I),I=1,NN)
      NORTHO=NORTHO + 1
      DO 970 K=JJ,NQA
      AL=0.0D0
      DO 940 I=1,NN
  940 AL=AL + TT(I)*RR(I,K)
      DO 950 I=1,NN
  950 RR(I,K)=RR(I,K) - AL*WW(I)
  970 CONTINUE
  980 CONTINUE
      IF (IFPR.NE.0) WRITE (IOUT,2850) NORTHO
      NGS=NGS + NORTHO
C
C
  985 IF (IOVER.NE.1) GO TO 1000
      IF (NITE.GT.NSTEP-4 .AND. NITE.LE.NSTEP-1) GO TO 1000
      REWIND NOVER
      IF (NJUNK.EQ.0) GO TO 987
      DO 986 J=1,NJUNK
  986 READ (NOVER)
C
  987 JJ=JROLD + 1
      DO 995 J=JJ,NC
      IF (NLOC(NCEV + J).EQ.-1) GO TO 988
      READ (NOVER)
      GO TO 995
C
  988 NLOC(NCEV + J)=0
      READ (NOVER) (TT(K),K=1,NN)
      RC=(EIGV(J) - SHIFTO)/(RLQ1 - SHIFTO)
      RA=1./(1. - RC)
      DO 990 K=1,NN
  990 R(K,J)=TT(K) + (R(K,J) - TT(K))*RA
      K=J + NJUNK
      IF (IFPR.NE.0) WRITE (IOUT,2820) K
  995 CONTINUE
C
C
 1000 IF (IVSHF.EQ.0) GO TO 1200
      K=NEIG
      IF (JR.GT.0) K=JR
      IF (IINTER.GT.0) GO TO 1015
C
      NP=NFREQ - NCEV
      NC=MIN0(2*NP,NP + 8)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -