投稿者 スレッド: 【材料関係】YIELD=MOHR-COULOMBまたはYIELD=DRUCKER-PRAGERの場合にHARDEN=MULTILINEARが使用できない  (参照数 1127 回)

ghashimoto

  • Okulab
  • Newbie
  • *****
  • 投稿: 17
    • プロフィールを見る
FrontISTR Ver.4.4ユーザマニュアルの124ページ
(4) !PLASTIC (2-2-2)
において,

*HARDEN = MULTILINEARの場合
(2行目) FAI
(3行目) PSTRAIN, c
(4行目) PSTRAIN, c
...続く

のような記載がある.

しかし,YIELD=MOHR-COULOMBまたはYIELD=DRUCKER-PRAGERのように設定しても
HARDEN=MULTILINEARを使用できない.

プログラムの中を調べると,YIELD=MOHR-COULOMBまたはYIELD=DRUCKER-PRAGERの場合,

     case (2, 3)  ! Mohr-Coulomb, Drucker-Prager
            call setDigit( 5, 0, mattype )
            allocate( fval(3,depends+1) )
            data_fmt = "RRr "
            fstr_ctrl_get_PLASTICITY                                                         &
            = fstr_ctrl_get_data_array_ex( ctrl, data_fmt, fval(1,:), fval(2,:), fval(3,:) )
            if( fstr_ctrl_get_PLASTICITY ==0 ) then
              matval(M_PLCONST1) = fval(1,1)    ! c
              matval(M_PLCONST2) = fval(3,1)    ! H
              if( ipt==3 ) then     ! Drucker-Prager
                dum = fval(2,1)*PI/180.d0
                fdum = 2.d0*sin(dum)/ ( sqrt(3.d0)*(3.d0+sin(dum)) )
                matval(M_PLCONST3) = fdum
                fdum = 6.d0* cos(dum)/ ( sqrt(3.d0)*(3.d0+sin(dum)) )
                matval(M_PLCONST4) = fdum
              else                  ! Mohr-Coulomb
                matval(M_PLCONST3) = fval(2,1)*PI/180.d0
              endif
            endif

のようになっていて,HARDEN=BILINEARのみが実装されている.

これを
     real(kind=kreal),pointer :: fval1(:,:)
     ・・・
     case (2, 3)  ! Mohr-Coulomb, Drucker-Prager
           select case (hipt)
           case (1)  ! linear hardening
            allocate( fval(3,1) )
            data_fmt = "RRr "
            fstr_ctrl_get_PLASTICITY                                                         &
            = fstr_ctrl_get_data_array_ex( ctrl, data_fmt, fval(1,:), fval(2,:), fval(3,:) )
            if( fstr_ctrl_get_PLASTICITY ==0 ) then
              matval(M_PLCONST1) = fval(1,1)    ! c
              matval(M_PLCONST2) = fval(3,1)    ! H
              if( ipt==3 ) then     ! Drucker-Prager
                dum = fval(2,1)*PI/180.d0
                fdum = 2.d0*sin(dum)/ ( sqrt(3.d0)*(3.d0+sin(dum)) )
                matval(M_PLCONST3) = fdum
                fdum = 6.d0* cos(dum)/ ( sqrt(3.d0)*(3.d0+sin(dum)) )
                matval(M_PLCONST4) = fdum
              else                  ! Mohr-Coulomb
                matval(M_PLCONST3) = fval(2,1)*PI/180.d0
              endif
            endif
           case (2)  ! multilinear approximation
            allocate( fval(3+depends,n) )
            allocate( fval1(2+depends,n) )
            if( depends==0 ) then
              data_fmt = "RRR "
              fstr_ctrl_get_PLASTICITY = &
              fstr_ctrl_get_data_array_ex( ctrl, data_fmt, fval(1,:), fval(2,:), fval(3,:) )
              if( fstr_ctrl_get_PLASTICITY == 0 ) then
               if( ipt==3 ) then     ! Drucker-Prager
                dum = fval(2,1)*PI/180.0d0
                fdum = 2.0d0*dsin(dum)/( dsqrt(3.0d0)*(3.0d0+dsin(dum)) )
                matval(M_PLCONST3) = fdum
                fdum = 6.0d0*dcos(dum)/( dsqrt(3.0d0)*(3.0d0+dsin(dum)) )
                matval(M_PLCONST4) = fdum
               else                  ! Mohr-Coulomb
                matval(M_PLCONST3) = fval(2,1)*PI/180.0d0
               endif
               if( fval(3,1) /= 0.0d0 ) then
                print *, "Multilinear hardening: First plastic strain must be zero"
                stop
               endif
               do i=1,n
                if( fval(3,i) < 0.0d0 ) &
                stop "Multilinear hardening: Error in plastic strain definition"
               enddo
               fval1(1,:) = fval(1,:)
               fval1(2,:) = fval(3,:)
               call init_table( mttable,1, 2+depends, n, fval1 )
               call dict_add_key( dict, MC_YIELD, mttable )
              endif
            else  ! depends==1
              data_fmt = "RRRR "
              fstr_ctrl_get_PLASTICITY = &
              fstr_ctrl_get_data_array_ex( ctrl, data_fmt, fval(1,:), fval(2,:), fval(3,:), fval(4,:) )
              if( fstr_ctrl_get_PLASTICITY == 0 ) then
               if( ipt==3 ) then     ! Drucker-Prager
                dum = fval(2,1)*PI/180.0d0
                fdum = 2.0d0*dsin(dum)/( dsqrt(3.0d0)*(3.0d0+dsin(dum)) )
                matval(M_PLCONST3) = fdum
                fdum = 6.0d0*dcos(dum)/( dsqrt(3.0d0)*(3.0d0+dsin(dum)) )
                matval(M_PLCONST4) = fdum
               else                  ! Mohr-Coulomb
                matval(M_PLCONST3) = fval(2,1)*PI/180.0d0
               endif
               if( fval(3,1) /= 0.0d0 ) then
                print *, "Multilinear hardening: First plastic strain must be zero"
                stop
               endif
               do i=1,n
                if( fval(3,i) < 0.0d0 ) &
                stop "Multilinear hardening: Error in plastic strain definition"
               enddo
               call init_table( mttable, 2, 2+depends, n, fval1 )
               call dict_add_key( dict, MC_YIELD, mttable )
              endif
             endif
           case default
               print *, "Error in hardening definition!"
               stop
           end select
           
のように修正すると,HARDEN=MULTILINEARを使用できるようになる.


FrontISTR Ver.4.4ユーザマニュアルの124ページの記載箇所は

*HARDEN = MULTILINEAR,温度場がない場合
(2行目) c, FAI, PSTRAIN
(3行目) c, FAI, PSTRAIN
...続く

*HARDEN = MULTILINEAR,温度場がある場合
(2行目) c, FAI, PSTRAIN, TEMPERATURE
(3行目) c, FAI, PSTRAIN, TEMPERATURE
...続く

のように修正する必要がある.
ただし,PSTRAINやTEMPERATUREで変化するのはcのみであり,FAIは変化しない.

プログラム内で関数fstr_ctrl_get_data_array_ex()を使用しいるため,

(2行目) FAI
(3行目) c, PSTRAIN, TEMPERATURE
(4行目) c, PSTRAIN, TEMPERATURE
...続く

のような入力方法にすることは困難である.
プログラムの広範囲の修正が必要になると考えられる.
« 最終編集: 9月 18, 2015, 07:16:26 午前 by ghashimoto »