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

📄 a36.for

📁 ADINA84有限元编程学习的好例子
💻 FOR
📖 第 1 页 / 共 5 页
字号:
      JSA=ISEG(NSA)
      JSB=ISEG(NSB)
      IF (JSA.NE.1 .AND. JSA.NE.0) GO TO 310
      IF (JSB.NE.1 .AND. JSB.NE.0) GO TO 310
C
      IF (ITITLE.EQ.0) CALL PRINT2 (IPS,ISV,3)
      ITITLE=1
C
      TY = T(1,NSA) + T(1,NSB)
      TZ = T(2,NSA) + T(2,NSB)
      RESULT = SQRT(TY*TY + TZ*TZ)
      TY=TY/RESULT
      TZ=TZ/RESULT
      FN =-TZ*CPR(1,K) + TY*CPR(2,K)
      FT = TY*CPR(1,K) + TZ*CPR(2,K)
      AFN = MAX(FN,ZERO)
      AFT = ABS( FT )
      FSIGN = SIGN( ONE,FT )
C
      CHECK = FN
      IF (CHECK.GE.0.0D0) GO TO 330
      CFORCE(1,K)=0.0D0
      CFORCE(2,K)=0.0D0
      INODE(K) = -LONELY
      GO TO 320
C
  330 JTSEG=ITS(K)
      CALL TRGET2 (ISURFP,IFSN,ISEG,NSURF,NSURFP,2)
      SCF = FCOFF(1,IPAIR)
      DCF = FCOFF(2,IPAIR)
      PRCENT = FCOFF(3,IPAIR)
C
      PCF = SCF
      IF (KSNA.EQ.3) PCF=DCF
C
      RESIST = PCF*AFN
      CHECK = RESIST - AFT
      IF (KSNA.EQ.2 .AND. CHECK.GE.0.0D0) GO TO 340
      CHECK = ( 1.0 - PRCENT )*RESIST - AFT
      IF (KSNA.EQ.3 .AND. CHECK.GE.0.0D0) GO TO 340
C
      INODE(K)=3*LONELY
      FR = DCF*AFN
      FT = MIN(FR,AFT)
      FT = FSIGN*FT
      GO TO 350
  340 INODE(K) = 2*LONELY
      IF (LAST.EQ.1) INODE(K) = -2*LONELY
C
  350 FY = (TY*FT - TZ*FN)
      FZ = (TZ*FT + TY*FN)
      CFORCE(1,K) = FY
      CFORCE(2,K) = FZ
  320 IF (KCPRI.EQ.0) CALL PRINT2 (IPS,ISV,4)
      GO TO 300
C
  310 NOSOL = NOSOL + 1
C
  300 CONTINUE
      IF (NOSOL.LT.NTOTAL) GO TO 360
      IF (KCPRI.EQ.0) CALL PRINT2 (IPS,ISV,5)
C
  360 IF (KES.EQ.KLS) GO TO 370
C
      IF (INODE(KFS).EQ.1) GO TO 370
      JSA = ISEG(JFSD)
      JSB = ISEG(JFS)
      IF (JSA.NE.1 .AND. JSA.NE.0) GO TO 370
      IF (JSB.NE.1 .AND. JSB.NE.0) GO TO 370
      INODE(KLS)=INODE(KFS)
C
  370 IF (KPRI.EQ.0) GO TO 700
C
C
C
  600 JOLD=ISEG(JFSD)
      JOLDA=IABS(JOLD)
C
      DO 610 K=KFS,KLS
      JNEW=ISEG(K+IS)
      JNEWA=IABS(JNEW)
      IF (IABS(INODE(K)).LT.LONELY) GO TO 620
      INODE(K)=INODE(K)/LONELY
      GO TO 650
  620 INODE(K)=1
      IF (JOLD.EQ.-2 .OR. JNEW.EQ.-2) GO TO 630
      IF (JOLD.EQ.2 .OR. JNEW.EQ.2) GO TO 630
      IF (JOLDA.EQ.3 .OR. JNEWA.EQ.3) GO TO 640
      IF (JOLD.EQ.-1 .OR. JNEW.EQ.-1) INODE(K)=-1
      GO TO 650
  630 INODE(K)=2
      GO TO 650
  640 INODE(K)=3
  650 JOLD=JNEW
      JOLDA=JNEWA
  610 CONTINUE
  700 CONTINUE
C
      DO 660 J=1,NSEG
      IF (ISEG(J).EQ.-2) ISEG(J)=3
      IF (IABS(ISEG(J)).EQ.3) JSLIDE(J)=1
  660 CONTINUE
      DO 670 K=1,NTOUCH
      IF (INODE(K).EQ.-2) INODE(K)=3
      IF (IABS(INODE(K)).EQ.3) KSLIDE(K)=1
  670 CONTINUE
C
      DO 675 I=1,NSURF
      IS=I
      CALL TRGET2 (ISURFP,IFSN,ISEG,NSURF,NSURFP,1)
      IF (ISR.EQ.0) GO TO 675
      IF (KES.LT.KLS) KSLIDE(KLS) = KSLIDE(KFS)
  675 CONTINUE
C
C
C
      DO 680 K=1,NTOUCH
      CPR(1,K) = CFORCE(1,K)
      CPR(2,K) = CFORCE(2,K)
      CFORCE(1,K) = 0.0D0
      CFORCE(2,K) = 0.0D0
  680 CONTINUE
C
      IF (IDBA.LT.1) GO TO 685
      CALL EXAMIN (CPR,2,NTOUCH,IMDUMY,1,1,4,13)
      CALL EXAMIN (RMDUMY,1,1,ISEG,1,NSEG,4,-16)
      CALL EXAMIN (RMDUMY,1,1,INODE,1,NTOUCH,4,-17)
  685 IF (IDBA.LT.2) GO TO 690
      CALL EXAMIN (RMDUMY,1,1,JSLIDE,1,NSEG,4,-12)
      CALL EXAMIN (RMDUMY,1,1,KSLIDE,1,NTOUCH,4,-13)
C
C
C
  690 IF (KPRI.GT.0 .OR. ICPRNT.EQ.2) RETURN
C
      DO 710 K=1,NSNOD
      CFORCE(1,K)=0.0D0
  710 CFORCE(2,K)=0.0D0
C
      DO 720 I=1,NSURF
      IS=I
      CALL TRGET2 (ISURFP,IFSN,ISEG,NSURF,NSURFP,1)
      IF (ISR.EQ.0) GO TO 720
      DO 730 K=KFS,KES
      JTSEG=ITS(K)
      IF (JTSEG.EQ.0) GO TO 730
      CALL TRGET2 (ISURFP,IFSN,ISEG,NSURF,NSURFP,2)
      IT=ISURFP(1,IPAIR)
      NA=JTSEG-IT
      NB=NA+1
      BT=BETA(K)
      DO 740 L=1,2
      CPRCON = CPR(L,K)
      CFORCE(L,K) = CFORCE(L,K) + CPRCON
      CFORCE(L,NA) = CFORCE(L,NA) - (1.0-BT)*CPRCON
  740 CFORCE(L,NB) = CFORCE(L,NB) - BT*CPRCON
  730 CONTINUE
  720 CONTINUE
C
      DO 750 I=1,NSURF
      IS=I
      CALL TRGET2 (ISURFP,IFSN,ISEG,NSURF,NSURFP,1)
      IF (KES.EQ.KLS) GO TO 750
      DO 760 L=1,2
      CFORCE(L,KFS) = CFORCE(L,KFS) + CFORCE(L,KLS)
  760 CFORCE(L,KLS) = 0.0D0
  750 CONTINUE
C
      DO 770 I=1,NSURF
      IS=I
      CALL TRGET2 (ISURFP,IFSN,ISEG,NSURF,NSURFP,1)
      CALL PRINT2 (IPS,ISV,6)
      DO 770 K=KFS,KES
      NA=K
      NODEA=NODSF(NA)
      FY=CFORCE(1,NA)
      FZ=CFORCE(2,NA)
      CFORCE(1,NA)=0.0D0
      CFORCE(2,NA)=0.0D0
      CALL PRINT2 (IPS,ISV,7)
  770 CONTINUE
      RETURN
      END
      SUBROUTINE TRGET2 ( ISURFP,IFSN,ISEG,NSURF,NSURFP,IFLAG)
C
C
C***ADD:DPR***
      IMPLICIT DOUBLE PRECISION ( A-H,O-Z )
C***END:DPR***
      COMMON /SRFACE/ IC,KFC,KLC,KEC,JFC,JLC,JFCD,JLCD
      COMMON /PAIR/ IT,KFT,KLT,KET,JFT,JLT,JFTD,JLTD
      COMMON /MATCH/ ISR,IPAIR,JFSEG,JLSEG,JTSEG
C
      DIMENSION ISURFP(2,NSURFP),IFSN(*),ISEG(*)
C
      GO TO ( 50,80,200 ) IFLAG
C
C
C
   50 ISR=0
      DO 60 L=1,NSURFP
      IF (ISURFP(2,L).NE.IC) GO TO 60
      ISR=IC
      GO TO 250
   60 CONTINUE
      GO TO 250
C
C
C
   80 DO 100 I=1,NSURF
      IF (I.EQ.IC) GO TO 100
      ITRGET=I
      JFSEG=IFSN(I)+I
      JLSEG=IFSN(I+1)+I-2
      IF (JFSEG.LE.JTSEG .AND. JTSEG.LE.JLSEG) GO TO 110
  100 CONTINUE
C
C
C
  110 DO 150 L=1,NSURFP
      IPAIR=L
      IF (ISURFP(1,L).EQ.ITRGET .AND. ISURFP(2,L).EQ.IC) GO TO 160
  150 CONTINUE
  160 RETURN
C
  200 KFT=IFSN(IT)
      KLT=IFSN(IT+1)-1
      JFT=KFT+IT
      JLT=KLT+IT-1
      JFTD=JFT-1
      JLTD=JLT+1
      KET=KLT
      IF (ISEG(JFTD).NE.0) KET=KLT-1
  250 KFC=IFSN(IC)
      KLC=IFSN(IC+1)-1
      JFC=KFC+IC
      JLC=KLC+IC-1
      JFCD=JFC-1
      JLCD=JLC+1
      KEC=KLC
      IF (ISEG(JFCD).NE.0) KEC=KLC-1
      RETURN
C
      END
      SUBROUTINE ADJOIN (ISURFP,IFSN,NODSF,
     1                   INODE,ISEG,ITS,IDBUG,
     1                   XYZ,
     1                   XYZS,XLN,T,
     1                   BETA,DELTA,
     1                   NSURF,NSURFP,NTOUCH,NSNOD,NSEG)
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,MA
      COMMON /CNTACT/ NEQI,LEADEQ,NCE2D,NCE3D
      COMMON /SRFACE/ IC,KFC,KLC,KEC,JFC,JLC,JFCD,JLCD
      COMMON /MATCH/ ISR,IPAIR,JFSEG,JLSEG,JTSEG
      COMMON /PAIR/ IT,KFT,KLT,KET,JFT,JLT,JFTD,JLTD
C
      DIMENSION ISURFP(2,NSURFP),IFSN(*),NODSF(*),
     1          INODE(*),ISEG(*),ITS(*),IDBUG(20)
      DIMENSION XYZ(2,NSNOD),
     1          XYZS(2,NSNOD),XLN(*),T(2,NSEG),
     1          BETA(*),DELTA(2,NSNOD)
      DIMENSION XNC(2),XNT(2)
      DIMENSION DIST(2)
      DIMENSION RMDUMY(1,1),IMDUMY(1,1)
      DATA SMALL / 1.0D-05 /
C
      IDBA=IDBUG(9)
      IDBB=IDBUG(10)
C
      IF (IDBA.LE.1) GO TO 10
      CALL EXAMIN (RMDUMY,1,1,INODE,1,NTOUCH,6,-17)
      CALL EXAMIN (RMDUMY,1,1,ISEG,1,NSEG,6,-16)
      CALL EXAMIN (RMDUMY,1,1,ITS,1,NTOUCH,6,-7)
      CALL EXAMIN (BETA,1,NTOUCH,IMDUMY,1,1,6,5)
   10 CONTINUE
C
      DO 20 K=1,NTOUCH
      ITS(K)=0
      BETA(K)=0.0D0
   20 CONTINUE
      DO 30 K=1,NSNOD
      DELTA(1,K)=0.0D0
      DELTA(2,K)=0.0D0
   30 CONTINUE
C
C
C
      ISTOP=0
      DO 400 I=1,NSURF
      IC=I
      CALL TRGET2 (ISURFP,IFSN,ISEG,NSURF,NSURFP,1)
      IF (ISR.EQ.0) GO TO 400
C
      DO 100 KC=KFC,KEC
C
      IRATIO=100
      DMIN=1.0D+20
      JSEG=0
      KSN=INODE(KC)
      KSNA=IABS(KSN)
      IF (KSN.EQ.-1) GO TO 100
C
C
C
      YC=XYZS(1,KC)
      ZC=XYZS(2,KC)
      NSA=KC+IC-1
      NSB=KC+IC
      XNC(1) = -T(2,NSA)-T(2,NSB)
      XNC(2) =  T(1,NSA)+T(1,NSB)
C
      DO 40 L=1,NSURFP
      IF (ISURFP(2,L).NE.IC) GO TO 40
      IT=ISURFP(1,L)
      CALL TRGET2 (ISURFP,IFSN,ISEG,NSURF,NSURFP,3)
C
      DO 110 K=KFT,KET
      YDIST=YC-XYZS(1,K)
      ZDIST=ZC-XYZS(2,K)
      DSQ = YDIST*YDIST + ZDIST*ZDIST
      IF (DSQ.GE.DMIN) GO TO 110
      DMIN=DSQ
      KNEAR=K
      ITNEAR=IT
  110 CONTINUE
   40 CONTINUE
C
      IT=ITNEAR
      CALL TRGET2 (ISURFP,IFSN,ISEG,NSURF,NSURFP,3)
      NSA=KNEAR+IT-1
      NSB=KNEAR+IT
      XNT(1) = -T(2,NSA)-T(2,NSB)
      XNT(2) =  T(1,NSA)+T(1,NSB)
C
C
C
      DIST(1) = YC - XYZS(1,KNEAR)
      DIST(2) = ZC - XYZS(2,KNEAR)
      DUMY = XNT(2)*DIST(1) - XNT(1)*DIST(2)
      XLSUM = XLN(NSA) + XLN(NSB)
      IF (ISEG(NSA).NE.0 .AND. ISEG(NSB).NE.0) GO TO 50
      IRATIO=INT( 100.0*DUMY/XLSUM )
      IF (IABS(IRATIO).GT.2) GO TO 50
C
C
C
      JSSA=IABS(ISEG(NSA))
      JSSB=IABS(ISEG(NSB))
      IF (JSSA.GT.0) JSEG=NSA
      IF (JSSB.GT.0) JSEG=NSB
      IF (JSEG.EQ.JFTD) JSEG=JLT
      IF (JSEG.EQ.JLTD) JSEG=JFT
      OVRLAP = XNT(1)*DIST(1) + XNT(2)*DIST(2)
      IF (KSNA.GT.1) GO TO 65
      IF (OVRLAP.LT.0.0D0) GO TO 100
C
   65 DUMY = XNC(1)*XNT(1) + XNC(2)*XNT(2)
      IF (DUMY.LT.0.0D0) GO TO 95
      ISTOP=ISTOP+1
      IF (ISTOP.EQ.1) write(66,1000)
      write(66,1100) ISTOP,NODSF(KC),NODSF(KNEAR)
   95 IF (ISTOP.GT.0) GO TO 100
C
      IF (KSNA.EQ.1) INODE(KC)=2
      DELTA(1,KC) = OVRLAP*XNT(1)
      DELTA(2,KC) = OVRLAP*XNT(2)
      NA=JSEG-IT
      DIST(1) = (YC-XYZS(1,NA)) - DELTA(1,KC)
      DIST(2) = (ZC-XYZS(2,NA)) - DELTA(2,KC)
      DUMY = DIST(1)*T(1,JSEG) + DIST(2)*T(2,JSEG)
      GO TO 150
C
C
C
   50 JSEG=NSA
      IF (DUMY.GT.0.0D0) JSEG=NSB
   80 IF (ISEG(JSEG).EQ.0) GO TO 155
      IF (JSEG.EQ.JFTD) JSEG=JLT
      IF (JSEG.EQ.JLTD) JSEG=JFT
      NA=JSEG-IT
      NB=NA+1
      OVRLAP =-(YC-XYZS(1,NA))*T(2,JSEG)
     1        +(ZC-XYZS(2,NA))*T(1,JSEG)
C
      IF (INODE(KC).GT.1) GO TO 120
      IF (OVRLAP.LE.-1.0D-12) GO TO 100
C
  120 DUMY = XNC(1)*XNT(1) + XNC(2)*XNT(2)
      IF (DUMY.LT.0.0D0) GO TO 130
      ISTOP=ISTOP+1
      IF (ISTOP.EQ.1) write(66,1000)
      write(66,1100) ISTOP,NODSF(KC),NODSF(KNEAR)
  130 IF (ISTOP.GT.0) GO TO 100
C
C
C
      IF (KSNA.EQ.1) INODE(KC)=2
      DELTA(1,KC)=-OVRLAP*T(2,JSEG)
      DELTA(2,KC)= OVRLAP*T(1,JSEG)
      DIST(1) = (YC-XYZS(1,NA)) - DELTA(1,KC)
      DIST(2) = (ZC-XYZS(2,NA)) - DELTA(2,KC)
      DUMY = DIST(1)*T(1,JSEG) + DIST(2)*T(2,JSEG)
C
C
C
      BDUMY1=-SMALL*XLN(JSEG)
      BDUMY2=(1.0+SMALL)*XLN(JSEG)
      IF (DUMY.LT.BDUMY1) GO TO 140
      IF (DUMY.LT.BDUMY2) GO TO 150
      DUMY=DUMY-XLN(JSEG)
      ISIDE=1
      GO TO 160
  140 ISIDE=-1
  160 LSEG=JSEG+ISIDE
      EXTRA = DUMY*( -T(1,JSEG)*T(2,LSEG) + T(2,JSEG)*T(1,LSEG) )
      DELTA(1,KC) = DELTA(1,KC) - EXTRA*T(2,LSEG)
      DELTA(2,KC) = DELTA(2,KC) + EXTRA*T(1,LSEG)
      JSEG=LSEG
      IF (ISEG(JSEG).EQ.0) GO TO 155
      IF (JSEG.EQ.JFTD) JSEG=JLT
      IF (JSEG.EQ.JLTD) JSEG=JFT
      NA=JSEG-IT
C
      DIST(1) = (YC-XYZS(1,NA)) - DELTA(1,KC)
      DIST(2) = (ZC-XYZS(2,NA)) - DELTA(2,KC)
      DUMY = DIST(1)*T(1,JSEG) + DIST(2)*T(2,JSEG)
C
C
C
  150 BT=DUMY/XLN(JSEG)
      BETA(KC)=BT
      ITS(KC)=JSEG
      GO TO 100
C
  155 INODE(KC)=1
C
  100 CONTINUE
C
C
      IF (ISTOP.EQ.0) GO TO 170
      GO TO 400
C
C
C
  170 IF (KEC.LT.KLC) INODE(KLC)=INODE(KFC)
      INODE(KFC)=IABS(INODE(KFC))
      DO 200 J=JFC,JLC
      NA=J-IC
      NB=NA+1
      KSNA=IABS(INODE(NA))
      KSNB=IABS(INODE(NB))
      INODE(NB)=KSNB
      IF (KSNA.EQ.1 .OR. KSNB.EQ.1) GO TO 210
      IF (ISEG(J).EQ.-1) GO TO 210
      IF (IABS(ISEG(J)).GT.1) GO TO 200
      ISEG(J)=2
      IF (KSNA.EQ.3 .OR. KSNB.EQ.3) ISEG(J)=3
      GO TO 200
  210 ISEG(J)=1
  200 CONTINUE

⌨️ 快捷键说明

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