やっぱり…

今日も論文書かなきゃいけないのにサブルーチンの機能だけ増えた。
増えたのは熱源サブルーチンのインクリメントにおける時間増分の自動認識(実際はこんな大層なものではない)と、ひずみ応力変換サブルーチンのすっかり忘れていたせん断ひずみへの対応。

      SUBROUTINE DFLUX(FLUX,SOL,KSTEP,KINC,TIME,NOEL,NPT,COORDS,
     1JLTYP,TEMP,PRESS,SNAME)
C
      INCLUDE	'ABA_PARAM.INC'
C
      DIMENSION FLUX(2), TIME(2), COORDS(3)
      CHARACTER*80 SNAME
      REAL*8,SAVE:: TLAST

C	Initilize finished

C	Q0	:熱量[JL-3T-1]
C	FF	:比。実際の溶け込みに合わせて調整
C	FR	:比。実際の溶け込みに合わせて調整
C	A0	:溶接線方向の前方への熱源の長さ[L]
C	AR	:溶接線方向の熱源の長さの比
C	BL	:溶接線直角方向の熱源の長さ[L]
C	CL	:深さ方向の熱源の長さ[L]
C	VW	:溶接速度[LT-1]
C	X	:溶接線直角方向の座標
C	Y	:溶接線方向の座標
C	Z	:高さ方向の座標
C	PI	:円周率
C	T0	:溶接開始の時間
C	szM:溶接部のメッシュの大きさ
C	detT:インクリメントでの時間増分の大きさ

      Q0=1500.
      FF=1.
      FR=4.
      A0=0.15
      AR=2.
      BL=0.3
      CL=0.7
      VW=0.75
      PI=4.0E0*ATAN(1.0D0)
      T0=0.
      szM=.2
      detT=TIME(2)-TLAST
      TLAST=TIME(2)

C	ABAQUSの全体座標からこのルーチンのための座標系への変換を行う

C	XA0,YA0,ZA0:全体座標での溶接開始点の座標
C	XAV,YAV,ZAV:溶接方向のベクトル
C	XBV,YAV,ZAV:溶接線より直上へのベクトル
      	XA0=0
      	YA0=0.424264
      	ZA0=1.32426
      	XAV=1.
      	YAV=0
      	ZAV=0
      	XBV=0
      	YBV=.424264
      	ZBV=.424264
C	座標計算
C	与えられたベクトルの大きさを1にそろえる
      LTEMP=SQRT(XAV*XAV+YAV*YAV+ZAV*ZAV)
      XAV=XAV/LTEMP
      YAV=YAV/LTEMP
      ZAV=ZAV/LTEMP
      LTEMP=SQRT(XBV*XBV+YBV*YBV+ZBV*ZBV)
      XBV=XBV/LTEMP
      YBV=YBV/LTEMP
      ZBV=ZBV/LTEMP
C	与えられたベクトルより残りの座標軸となるベクトルを計算
      XCV=YAV*ZBV-ZAV*YBV
      YCV=ZAV*XBV-XAV*ZBV
      ZCV=XAV*YBV-YAV*XBV
C	座標軸を平行移動
      XTMP=COORDS(1)-XA0
      YTMP=COORDS(2)-YA0
      ZTMP=COORDS(3)-ZA0
C	与えられたベクトルが基底になるように座標軸を回転
      X=XCV*XTMP+XAV*YTMP+XBV*ZTMP
      Y=YCV*XTMP+YAV*YTMP+YBV*ZTMP
      Z=ZCV*XTMP+ZAV*YTMP+ZBV*ZTMP
C	座標計算はここまで

C	熱源の前方か否か
      TT1=TIME(2)-T0
      TT=Y-(VW*TT1)
      IF	(TT.LT.0)	THEN
      	ATMP=A0
      	FTMP=FF
      ELSE
      	ATMP=A0*AR
      	FTMP=FR
      END	IF

C	最終出力
      szM1=szM*.5
      gauss_const=6.E0*SQRT(3.)*FTMP*Q0/(ATMP*BL*CL*PI*SQRT(PI))
      gauss_x=EXP(-3.E0*X*X/(BL*BL))
      gauss_x1=EXP(-3.E0*(X-szM1)**2/(BL*BL))
      gauss_x2=EXP(-3.E0*(X+szM1)**2/(BL*BL))
      gauss_y00=EXP(-3.E0*((Y-(VW*(TT1-0.5*detT)))**2)/(ATMP*ATMP))
      gauss_y01=EXP(-3.E0*((Y-(VW*(TT1-detT)))**2)/(ATMP*ATMP))
      gauss_y02=EXP(-3.E0*((Y-(VW*TT1))**2)/(ATMP*ATMP))
      gauss_y0=(gauss_y01+4*gauss_y00+gauss_y02)/6
      gauss_y10=EXP(-3.E0*((Y-szM1-(VW*(TT1-0.5*detT)))**2)/(ATMP*ATMP))
      gauss_y11=EXP(-3.E0*((Y-szM1-(VW*(TT1-detT)))**2)/(ATMP*ATMP))
      gauss_y12=EXP(-3.E0*((Y-szM1-(VW*TT1))**2)/(ATMP*ATMP))
      gauss_y1=(gauss_y11+4*gauss_y10+gauss_y12)/6
      gauss_y20=EXP(-3.E0*((Y+szM1-(VW*(TT1-0.5*detT)))**2)/(ATMP*ATMP))
      gauss_y21=EXP(-3.E0*((Y+szM1-(VW*(TT1-detT)))**2)/(ATMP*ATMP))
      gauss_y22=EXP(-3.E0*((Y+szM1-(VW*TT1))**2)/(ATMP*ATMP))
      gauss_y2=(gauss_y21+4*gauss_y20+gauss_y22)/6
      gauss_z=EXP(-3.E0*Z*Z/(CL*CL))
      gauss_z1=EXP(-3.E0*(Z-szM1)**2/(CL*CL))
      gauss_z2=EXP(-3.E0*(Z+szM1)**2/(CL*CL))
      gauss_x_all=(gauss_x1+4.*gauss_x+gauss_x2)/6.
      gauss_y_all=(gauss_y1+4.*gauss_y0+gauss_y2)/6.
      gauss_z_all=(gauss_z1+4.*gauss_z+gauss_z2)/6.
      gauss_all=gauss_const*gauss_x_all*gauss_z_all*gauss_y_all
      FLUX(1)=gauss_all
      FLUX(2)=0.D0

      RETURN
      end
***  READ FROM .fil ***
C
      SUBROUTINE HKSMAIN
C
      INCLUDE 'aba_param.inc'
      CHARACTER FNAME*80,FNAMEO*80
C 最大レコード数
      PARAMETER(NMAX=1000000)
C 最大エレメント数
      PARAMETER(MAXE=1000000)
C キーのためのオフセット
      PARAMETER(KOFFSET=2)
C ヤング率[M L-1 T-2]
   PARAMETER(YOUNGR=210.0D+7)
C ポアソン比
      PARAMETER(POISON=0.3D+0)
      DIMENSION ARRAY(513),JRRAY(NPRECD,513),LRUNIT(2,1)
      DIMENSION PEX(MAXE),PEY(MAXE),PEZ(MAXE),PEA(MAXE),PES(MAXE)
      DIMENSION PEXY(MAXE),PEXZ(MAXE),PEYZ(MAXE)
      DIMENSION NELN(MAXE)
      EQUIVALENCE(ARRAY(1),JRRAY(1,1))
C
C 入力ファイル名と出力ファイル名
C 入力ファイル名では拡張子は省略
C 
      WRITE(6,*)'Enter the name of the input file (w/o extension):'
      READ(5,'(A)') FNAME
      WRITE(6,*)'Enter the name of the output file:'
      READ(5,'(A)') FNAME0      
C
      DO 10 I=1,MAXE
         PEX(I) = 0.D+00
         PEY(I) = 0.D+00
         PEZ(I) = 0.D+00
         PEXY(I) = 0.D+00
         PEXZ(I) = 0.D+00
         PEYZ(I) = 0.D+00
         PES(I) = 0.D+00
         PEA(I) = 0.D+00
         NELN(I) = 0
   10 CONTINUE
      NTHRES=0
C
*** READ FROM .fil ***
C 初期化
C 読み込む結果ファイルの数
      NRU = 1
C デバイス番号
      LRUNIT(1,1) = 8
C 結果ファイルがバイナリの場合2,アスキーの場合1
   44 CONTINUE
      WRITE(6,*)'Enter the format of input file (1-ASCII, 2-binary):'
      READ(5,*)LRUNIT(2,1)
      IF (LRUNIT(2,1).NE. 1 .AND. LRUNIT(2,1) .NE. 2) THEN
            WRITE(6,*) 'ERROR! This number must be 1 or 2'
            GOTO 44
      END IF
C 書き出し形式、読み込みの場合は何の意味も持たない
      LOUTF = 0
      CALL INITPF(FNAME,NRU,LRUNIT,LOUTF)
C デバイス番号
      JUNIT = 8
      CALL DBRNU(JUNIT)
C
      DO 100 J=1,NMAX
C レコードの順次読み出し
         CALL DBFILE(0,ARRAY,JRCD)
C EOFの検出
         IF (JRCD .NE. 0) GOTO 110
         KEY = JRRAY(1,KOFFSET)
C エレメント番号
         IF (KEY .EQ. 1) THEN
            NELNO = JRRAY(1,KOFFSET+1)
            NELN(NELNO) = NELNO
         END IF
C
C 塑性ひずみPE
         IF (KEY .EQ. 22) THEN
            PEX(NELNO) = ARRAY(KOFFSET+1)
            PEY(NELNO) = ARRAY(KOFFSET+2)
            PEZ(NELNO) = ARRAY(KOFFSET+3)
            PEXY(NELNO) = ARRAY(KOFFSET+4)
            PEXZ(NELNO) = ARRAY(KOFFSET+5)
            PEYZ(NELNO) = ARRAY(KOFFSET+6)
            PES(NELNO) = ARRAY(KOFFSET+7)
            PEA(NELNO) = ARRAY(KOFFSET+9)
         END IF
C
  100 CONTINUE
  110 CONTINUE
      KEND = J-1
      WRITE(6,*) 'KEND=',KEND
      WRITE(6,*) ' '
C
*** WRITE TO FILE ***
C
      OPEN(51,FILE=FNAMEO)
C
C
      WRITE(51,*)'**Initial conditions,TYPE=STRESS'
      DO K=1,MAXE
         IF (NELN(K) .NE. 0) THEN
            PEAL=PEX(K)+PEY(K)+PEZ(K)
            GR=YOUNGR/(2*(1+POISON))
            SX=YOUNGR/(1+POISON)*(PEX(K)-
     1       (POISON/(1.0-2.0*POISON))*(PEAL)))
            SY=YOUNGR/(1+POISON)*(PEY(K)-
     1       (POISON/(1.0-2.0*POISON))*(PEAL)))
            SZ=YOUNGR/(1+POISON)*(PEZ(K)-
     1       (POISON/(1.0-2.0*POISON))*(PEAL)))
            SXY=GR*PEXY(K)
            SXZ=GR*PEXA(K)
            SYZ=GR*PEYZ(K)
            WRITE(51,*)NELN(K),',',SX,',',SY,',',SZ,',',SXY,',',SXZ,',',
     1      SZY
         END IF
      END DO
C
      WRITE(6,*) ' '
      WRITE(51,*) ' '

      STOP
      END