首页/文章/ 详情

一个考虑腐蚀的相场损伤模型源代码

4月前浏览315

  原始文献:《A phase field formulation for dissolution-driven stress corrosion cracking》

来源于该文章,对腐蚀相关损伤建模的可以详细阅读原文,理解整个程序,作者模拟效果如下:

原始代码如下:

     module kvisual

      implicit none

      real*8 UserVar(4,24,70000)

      integer nelem

      save

      end module


!***********************************************************************

      subroutine uexternaldb(lop,lrestart,time,dtime,kstep,kinc)

      include 'aba_param.inc' 

      !implicit real(a-h o-z)

      dimension time(2)

      if (lop.eq.0) then !start of an alysis

       call mutexinit(1)

      endif

      return

      end 


!***********************************************************************

      subroutine uel(rhs,amatrx,svars,energy,ndofel,nrhs,nsvars,

     1 props,nprops,coords,mcrd,nnode,u,du,v,a,jtype,time,dtime,

     2 kstep,kinc,jelem,params,ndload,jdltyp,adlmag,predef,npredf,

     3 lflags,mlvarx,ddlmag,mdload,pnewdt,jprops,njpro,period)


      use kvisual

      include 'aba_param.inc' 

      !implicit real(a-h o-z)


      dimension rhs(mlvarx,*),amatrx(ndofel,ndofel),props(*),svars(*),

     1 energy(*),coords(mcrd,nnode),u(ndofel),du(mlvarx,*),v(ndofel),

     2 a(ndofel),time(2),params(*),jdltyp(mdload,*),adlmag(mdload,*),

     3 ddlmag(mdload,*),predef(2,npredf,nnode),lflags(*),jprops(*)


      parameter(ndim=2,ntens=4,ninpt=4,nsvint=24,ndof=4)


      dimension wght(ninpt),dN(nnode,1),dNdz(ndim,nnode),stress(ntens),

     1 dNdx(ndim,nnode),b(ntens,nnode*ndim),ddsdde(ntens,ntens),

     2 stran(ntens),xm(nnode,nnode),BB(nnode,nnode),dstran(ntens),

     3 statevLocal(nsvint),eelas(ntens)


!     initialising

      do k1=1,ndofel

       rhs(k1,1)=0.d0

      end do

      amatrx=0.d0

      wght=1.d0


!     find number of elements          

      if (dtime.eq.0.d0) then

       if (jelem.eq.1) then   

        nelem=jelem

       else

        CALL MutexLock(1)

        if (jelem.gt.nelem) nelem=jelem 

        CALL MutexUnlock(1)

       endif 

      endif      


!     reading parameters

      D=props(5)

      xL0=props(6)

      a_phi=props(7)

      wh=props(8)

      AA=props(9)

      xk=props(10)

      ef=props(11)

      t0=props(12)

      cse=1.d0        ! Normalized equilibrium concentration of solid

      cle=0.036d0     ! Normalized equilibrium concentration of liquid

      xkap=1.d-7      ! well-conditioning parameter

      T=300.d0        ! Temperature (K)

      R=8314.d0       ! Gas constant   


      do kintk=1,ninpt

!     evaluate shape functions and derivatives

       call kshapefcn(kintk,ninpt,nnode,ndim,dN,dNdz)

       call kjacobian(jelem,ndim,nnode,coords,dNdz,djac,dNdx,mcrd)

       call kbmatrix(dNdx,ntens,nnode,ndim,b)

       dvol=wght(kintk)*djac                   


!     compmute phase field, concentration and strains from nodal values

       phi=0.d0

       dphi=0.d0

       cL=0.d0

       do inod=1,nnode

        phi=phi+dN(inod,1)*u(ndim*nnode+inod)

        dphi=dphi+dN(inod,1)*du(ndim*nnode+inod,1)

        cL=cL+dN(inod,1)*u((ndim+1)*nnode+inod)

       end do


       dstran=matmul(b,du(1:ndim*nnode,1))


!     defining suitable functions       

       hphi=-2.d0*phi**3+3.d0*phi**2

       dhphi=-6.d0*phi**2+6.d0*phi

       ddhphi=-12.d0*phi+6.d0

       gphi=(1.d0-phi)*(1.d0-phi)*phi**2

       dgphi=2.d0*phi+4.d0*phi**3-6.d0*phi**2

       ddgphi=2.d0+12.d0*phi**2-12.d0*phi


!     recover and assign state variables

       call kstatevar(kintk,nsvint,svars,statevLocal,1)

       stress=statevLocal(1:ntens)

       stran(1:ntens)=statevLocal((ntens+1):(2*ntens))

       eelas(1:ntens)=statevLocal((2*ntens+1):3*ntens)

       ti=statevLocal(4*ntens+7)

       ei=statevLocal(4*ntens+8)


!     call umat to obtain stresses and constitutive matrix

       call kumat(props,ddsdde,stress,dstran,ntens,statevLocal,eelas,

     1 spd,hphi,phi,xkap,Sh0,eqplas,deqpl)


!     enhance the value of L 

       Sh=(hphi+xkap)*Sh0

       pls=statevLocal(4*ntens+1)

       xkm=dexp(Sh*7.12d3/(R*T))*(1.d0+pls/(props(3)/props(1)))

       if (time(2).lt.3.01d0) then

        ti=0.d0

        ei=0.d0

       else

        ei=ei+statevLocal(4*ntens+5)

        ti=ti+dtime        

       endif


       if (ei.gt.ef) then

        ti=0.d0

        ei=0.d0

       endif


       if (ti.lt.t0) then       

        xL=xL0*xkm

       else    

        xL=xL0*xkm*dexp(-xk*(ti-t0))

       endif


!     store state variables

       statevLocal(1:ntens)=stress(1:ntens)

       statevLocal((ntens+1):(2*ntens))=statevLocal((ntens+1):(2*ntens))

     1 +dstran(1:ntens)

       statevLocal(4*ntens+2)=phi

       statevLocal(4*ntens+3)=xL

       statevLocal(4*ntens+4)=Sh

       statevLocal(4*ntens+6)=cL

       statevLocal(4*ntens+7)=ti

       statevLocal(4*ntens+8)=ei

       call kstatevar(kintk,nsvint,svars,statevLocal,0) 


!     form and assemble stiffness matrix and internal force vector


       amatrx(1:16,1:16)=amatrx(1:16,1:16)+dvol*

     2 ((hphi+xkap)*matmul(matmul(transpose(b),ddsdde),b))


       rhs(1:16,1)=rhs(1:16,1)-

     1 dvol*(matmul(transpose(b),stress)*(hphi+xkap))        


       fc=AA*((cL-hphi*(cse-cle)-cle)**2)+wh*gphi

       dfc=-2.d0*AA*(cL-hphi*(cse-cle)-cle)*(cse-cle)*dhphi+wh*dgphi

       ddfc=wh*ddgphi-2.d0*AA*(cse-cle)*

     1 (ddhphi*(cL-hphi*(cse-cle)-cle)-dhphi*dhphi*(cse-cle))

       BB=matmul(transpose(dNdx),dNdx)

       xm=matmul(dN,transpose(dN))


       amatrx(17:24,17:24)=amatrx(17:24,17:24)+

     1 +dvol*(xm/dtime+xL*xm*ddfc+xL*a_phi*BB) 


       rhs(17:24,1)=rhs(17:24,1)-dvol*

     1 (matmul(xm,du(17:24,1))/dtime+xL*dN(:,1)*dfc

     2 +xL*a_phi*matmul(transpose(dNdx),matmul(dNdx,u(17:24))))


       ww=(cse-cle)*dhphi


       amatrx(25:32,25:32)=amatrx(25:32,25:32)+dvol*(xm/dtime+D*BB)


       rhs(25:32,1)=rhs(25:32,1)-dvol*(

     1 matmul(xm,du(25:32,1))/dtime+D*(matmul(transpose(dNdx),

     2 matmul(dNdx,u(25:32)))

     3 -ww*matmul(transpose(dNdx),matmul(dNdx,u(17:24)))))


! output

       UserVar(kintk,1:ntens,jelem)=stress(1:ntens)*(hphi+xkap)

       UserVar(kintk,(ntens+1):(4*ntens+8),jelem)=

     1 statevLocal((ntens+1):(4*ntens+8))


      end do       ! end loop on material integration points


      RETURN

      END


!***********************************************************************      

      subroutine kshapefcn(kintk,ninpt,nnode,ndim,dN,dNdz)

c

      include 'aba_param.inc'

c

      parameter (gaussCoord=0.577350269d0)    

      dimension dN(nnode,1),dNdz(ndim,*),coord24(2,4)


      data  coord24 /-1.d0, -1.d0,

     2                1.d0, -1.d0,

     3               -1.d0,  1.d0,

     4                1.d0,  1.d0/  



!     determine (g,h)

      g=coord24(1,kintk)*gaussCoord

      h=coord24(2,kintk)*gaussCoord


!     shape functions

      dN(1,1)=-0.25d0*(1.d0-g)*(1.d0-h)*(1.d0+g+h)

      dN(2,1)=0.25d0*(1.d0+g)*(1.d0-h)*(g-h-1.d0)

      dN(3,1)=0.25d0*(1.d0+g)*(1.d0+h)*(g+h-1.d0)

      dN(4,1)=0.25d0*(1.d0-g)*(1.d0+h)*(h-g-1.d0)

      dN(5,1)=0.5d0*(1.d0-g*g)*(1.d0-h)

      dN(6,1)=0.5d0*(1.d0+g)*(1.d0-h*h)

      dN(7,1)=0.5d0*(1.d0-g*g)*(1.d0+h)

      dN(8,1)=0.5d0*(1.d0-g)*(1.d0-h*h)        


!     derivative d(Ni)/d(g)

      dNdz(1,1)=0.25d0*(1.d0-h)*(2.d0*g+h)

      dNdz(1,2)=0.25d0*(1.d0-h)*(2.d0*g-h)

      dNdz(1,3)=0.25d0*(1.d0+h)*(2.d0*g+h)

      dNdz(1,4)=0.25d0*(1.d0+h)*(2.d0*g-h)

      dNdz(1,5)=-g*(1.d0-h)

      dNdz(1,6)=0.5d0*(1.d0-h*h)

      dNdz(1,7)=-g*(1.d0+h)

      dNdz(1,8)=-0.5d0*(1.d0-h*h)      


!     derivative d(Ni)/d(h)

      dNdz(2,1)=0.25d0*(1.d0-g)*(g+2.d0*h)

      dNdz(2,2)=0.25d0*(1.d0+g)*(2.d0*h-g)

      dNdz(2,3)=0.25d0*(1.d0+g)*(2.d0*h+g)

      dNdz(2,4)=0.25d0*(1.d0-g)*(2.d0*h-g)

      dNdz(2,5)=-0.5d0*(1.d0-g*g) 

      dNdz(2,6)=-(1.d0+g)*h 

      dNdz(2,7)=0.5d0*(1.d0-g*g)

      dNdz(2,8)=-(1.d0-g)*h  


      return

      end


!***********************************************************************

      subroutine kjacobian(jelem,ndim,nnode,coords,dNdz,djac,dNdx,mcrd)

!     Notation: djac - Jac determinant; xjaci - inverse of Jac matrix

!     dNdx - shape functions derivatives w.r.t. global coordinates      

      include 'aba_param.inc'


      dimension xjac(ndim,ndim),xjaci(ndim,ndim),coords(mcrd,nnode),

     1 dNdz(ndim,nnode),dNdx(ndim,nnode)      


      xjac=0.d0


      do inod=1,nnode

       do idim=1,ndim

        do jdim=1,ndim

         xjac(jdim,idim)=xjac(jdim,idim)+

     1        dNdz(jdim,inod)*coords(idim,inod)      

        end do

       end do 

      end do


       djac=xjac(1,1)*xjac(2,2)-xjac(1,2)*xjac(2,1)

       if (djac.gt.0.d0) then ! jacobian is positive - o.k.

        xjaci(1,1)=xjac(2,2)/djac

        xjaci(2,2)=xjac(1,1)/djac

        xjaci(1,2)=-xjac(1,2)/djac

        xjaci(2,1)=-xjac(2,1)/djac

       else ! negative or zero jacobian

        write(7,*)'WARNING: element',jelem,'has neg. Jacobian'

       endif


      dNdx=matmul(xjaci,dNdz)


      return

      end


!***********************************************************************

      subroutine kbmatrix(dNdx,ntens,nnode,ndim,b)

!     Notation, strain tensor: e11, e22, e33, e12, e13, e23      

      include 'aba_param.inc'


      dimension dNdx(ndim,nnode),b(ntens,nnode*ndim)


      b=0.d0

      do inod=1,nnode

       b(1,ndim*inod-ndim+1)=dNdx(1,inod)

       b(2,ndim*inod-ndim+2)=dNdx(2,inod)

       b(4,ndim*inod-ndim+1)=dNdx(2,inod)

       b(4,ndim*inod-ndim+2)=dNdx(1,inod)       

      end do


      return

      end


c*****************************************************************

      subroutine kstatevar(npt,nsvint,statev,statev_ip,icopy)

c

c     Transfer data to/from element-level state variable array from/to

c     material-point level state variable array.

c

      include 'aba_param.inc'


      dimension statev(*),statev_ip(*)


      isvinc=(npt-1)*nsvint     ! integration point increment


      if (icopy.eq.1) then ! Prepare arrays for entry into umat

       do i=1,nsvint

        statev_ip(i)=statev(i+isvinc)

       enddo

      else ! Update element state variables upon return from umat

       do i=1,nsvint

        statev(i+isvinc)=statev_ip(i)

       enddo

      end if


      return

      end


c*****************************************************************

      subroutine kumat(props,ddsdde,stress,dstran,ntens,statev,eelas,

     1 spd,hphi,phi,xkap,Sh,eqplas,deqpl)

c

c     Subroutine with the material model

c

      include 'aba_param.inc' !implicit real(a-h o-z)


      dimension props(*),ddsdde(ntens,ntens),stress(ntens),statev(*),

     + dstran(ntens),eelas(ntens),eplas(ntens),flow(ntens),olds(ntens),

     + oldpl(ntens) 


      parameter(toler=1.d-6,newton=20)  


      eelas(1:ntens)=statev((2*ntens+1):3*ntens)

      eplas(1:ntens)=statev((3*ntens+1):4*ntens)

      eqplas=statev(1+4*ntens)

      deqpl=statev(5+4*ntens)

      olds=stress

      oldpl=eplas


!     Initialization

      ddsdde=0.d0

      E=props(1) ! Young's modulus

      xnu=props(2) ! Poisson's ratio

      Sy=props(3) ! Yield stress

      xn=props(4) ! Strain hardening exponent    


!     Build elastic stiffness matrix

      eg=E/(1.d0+xnu)/2.d0

      elam=(E/(1.d0-2.d0*xnu)-2.d0*eg)/3.d0


      do i=1,3

       do j=1,3

        ddsdde(j,i)=elam

       end do

       ddsdde(i,i)=2.d0*eg+elam

      end do

      do i=4,ntens

       ddsdde(i,i)=eg

      end do


!     Calculate predictor stress and elastic strain

      stress=stress+matmul(ddsdde,dstran)

      eelas=eelas+dstran


!     Calculate equivalent von Mises stress

      Smises=(stress(1)-stress(2))**2+(stress(2)-stress(3))**2

     1 +(stress(3)-stress(1))**2

      do i=4,ntens

       Smises=Smises+6.d0*stress(i)**2

      end do

      Smises=sqrt(Smises/2.d0)  


!     Get yield stress from the specified Ehardening curve

      Sf=Sy*(1.d0+E*eqplas/Sy)**xn


!     Determine if active yielding

      if (Smises.gt.(1.d0+toler)*Sf) then


!     Calculate the flow direction

       Sh=(stress(1)+stress(2)+stress(3))/3.d0

       flow(1:3)=(stress(1:3)-Sh)/Smises

       flow(4:ntens)=stress(4:ntens)/Smises


!     Solve for Smises and deqpl using Newton's method

       deqpl=0.d0

       Et=E*xn*(1.d0+E*eqplas/Sy)**(xn-1)

       do kewton=1,newton

        rhs=Smises-(3.d0*eg)*deqpl-Sf

        deqpl=deqpl+rhs/((3.d0*eg)+Et)

!        if(deqpl.lt.0.d0) deqpl=-deqpl

        Sf=Sy*(1.d0+E*(eqplas+deqpl)/Sy)**xn

        Et=E*xn*(1.d0+E*(eqplas+deqpl)/Sy)**(xn-1)

        if(abs(rhs).lt.toler*Sy) exit

       end do


       if (kewton.eq.newton) write(7,*)'WARNING: plasticity loop failed'


! update stresses and strains

       stress(1:3)=flow(1:3)*Sf+Sh

       eplas(1:3)=eplas(1:3)+3.d0/2.d0*flow(1:3)*deqpl

       eelas(1:3)=eelas(1:3)-3.d0/2.d0*flow(1:3)*deqpl

       stress(4:ntens)=flow(4:ntens)*Sf

       eplas(4:ntens)=eplas(4:ntens)+3.d0*flow(4:ntens)*deqpl

       eelas(4:ntens)=eelas(4:ntens)-3.d0*flow(4:ntens)*deqpl

       eqplas=eqplas+deqpl


!    Calculate the plastic strain energy density

       do i=1,ntens

        spd=spd+(stress(i)+olds(i))*(eplas(i)-oldpl(i))/2.d0

       end do


!     Formulate the jacobian (material tangent)   

       effg=eg*Sf/Smises

       efflam=(E/(1.d0-2.d0*xnu)-2.d0*effg)/3.d0

       effhrd=3.d0*eg*Et/(3.d0*eg+Et)-3.d0*effg

       do i=1,3

        do j=1,3

         ddsdde(j,i)=efflam

        enddo

        ddsdde(i,i)=2.d0*effg+efflam

       end do

       do i=4,ntens

        ddsdde(i,i)=effg

       end do


       do i=1,ntens

        do j=1,ntens

         ddsdde(j,i)=ddsdde(j,i)+effhrd*flow(j)*flow(i)

        end do

       end do

      endif  


!    Store strains in state variable array

      Sh=(stress(1)+stress(2)+stress(3))/3.d0

      statev((2*ntens+1):3*ntens)=eelas

      statev((3*ntens+1):4*ntens)=eplas

      statev(4*ntens+1)=eqplas 

      statev(4*ntens+5)=deqpl


      return

      end

c*****************************************************************

      subroutine umat(stress,statev,ddsdde,sse,spd,scd,rpl,ddsddt,

     1 drplde,drpldt,stran,dstran,time,dtime,temp2,dtemp,predef,dpred,

     2 cmname,ndi,nshr,ntens,nstatv,props,nprops,coords,drot,pnewdt,

     3 celent,dfgrd0,dfgrd1,noel,npt,layer,kspt,jstep,kinc)


      use kvisual

      include 'aba_param.inc' !implicit real(a-h o-z)


      character*8 cmname

      dimension stress(ntens),statev(nstatv),ddsdde(ntens,ntens),

     1 ddsddt(ntens),drplde(ntens),stran(ntens),dstran(ntens),

     2 time(2),predef(1),dpred(1),props(nprops),coords(3),drot(3,3),

     3 dfgrd0(3,3),dfgrd1(3,3),jstep(4)


      ddsdde=0.0d0

      noffset=noel-nelem

      statev(1:nstatv)=UserVar(npt,1:nstatv,noffset)


      return

      end

材料属性和状态变量如下:
来源:我的博士日记
ACTUM材料
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-04-29
最近编辑:4月前
此生君子意逍遥
博士 签名征集中
获赞 62粉丝 130文章 153课程 0
点赞
收藏
作者推荐

pinn求解三维固体力学问题(pytorch)

pinn求解三维固体力学问题(pytorch)论文名称《An introduction to programming Physics-Informed Neural Network-based computational solid mechanics》 问题描述 几何模型:完整立方体边长 。利用对称性,仅建模立方体的八分之一(如右图),以降低计算成本。载荷条件:在立方体顶部和底部表面 ( 和 ) 施加沿z方向的分布力 。载荷函数为: 边界条件:位移边界条件 (在对称面上施加): 材料属性:杨氏模量 泊松比 为平面应力问题,Lamé常数 由 和 通过公式计算得到。神经网络架构设计该PINN模型采用多个独立的前馈神经网络来近似位移场。设计要素 具体配置 模型输入三维空间坐标 模型输出三个方向的位移分量 网络架构三个独立 的全连接前馈神经网络 (Fully Connected Neural Network, FNN) 单个FNN结构包含 4 层(输入层、隐藏层、输出层),每层有 20 个神经元 激活函数使用 tanh 函数(在FNN()函数中默认设置) 参数初始化使用 LeCun 初始化方案(在Input_Info()函数中定义) 训练采样点在计算域内生成 9261 个 均匀分布的样本点(间距 ) 物理信息嵌入与损失函数主要物理约束:平衡方程 (在计算域 内): 力边界条件 (在力边界 上): 位移边界条件 (在位移边界 上): 损失函数类型:在此3D案例中,论文仅使用了配点损失函数 (Collocation Loss Function) 进行求解。能量基损失函数 (Energy-based Loss Function) 可以通过修改程序实现,但3D示例中未使用。**损失函数构建 (Collocation)**:损失函数是平衡方程残差和力边界条件残差的均方误差 (MSE) 之和: 其中, 是域内样本点总数, 是力边界上的样本点数。边界条件精确施加:对于固定的位移边界条件(如 ),采用了硬边界的方法来精确满足,而非将其作为损失项。这简化了损失函数,降低了训练复杂度。具体方法为: ,其中 是原始FNN输出, 是固定边界位置。数值实现流程一些关键问题由于在三维问题下,采样点会指数增加,例如采用 ,不可避免有内存超限问题。训练阶段def closure(self): self.optimizer.zero_grad() x, x1u, x1b, x2u, x2b, x3u, x3b = self.x_train ### 第1段:平衡方程残差(内域点) Gex, Gey, Gez = self.pinn.forward_ge(x) l1 = Loss_GE(Gex, Gey, Gez) l1.backward() l1_val = l1.item() del Gex, Gey, Gez ### 第2段:x面边界条件 s11u, s121u, s131u, s121b, s131b = self.pinn.forward_bc_x(x1u, x1b) l_x = Loss_BC_x(s11u, s121u, s131u, s121b, s131b) l_x.backward() l_x_val = l_x.item() del s11u, s121u, s131u, s121b, s131b ### 第3段:y面边界条件 s22u, s122u, s232u, s122b, s232b = self.pinn.forward_bc_y(x2u, x2b) l_y = Loss_BC_y(s22u, s122u, s232u, s122b, s232b) l_y.backward() l_y_val = l_y.item() del s22u, s122u, s232u, s122b, s232b ### 第4段:z面边界条件 s33u, s133u, s233u, s133b, s233b = self.pinn.forward_bc_z(x3u, x3b) l_z = Loss_BC_z(s33u, s133u, s233u, s133b, s233b, self.y_train) l_z.backward() l_z_val = l_z.item() del s33u, s133u, s233u, s133b, s233b ### 汇总 loss 数值 loss_val = l1_val + l_x_val + l_y_val + l_z_val return torch.tensor(loss_val) 将一次大的 forward+backward 拆分为4段独立计算,每段算完立即 backward 释放计算图。由于 zero_grad() 只在开头调用一次,4次 backward() 的梯度自动累积,数学上完全等价。后处理阶段n = xyz.shape[0]batch_size = 2000s1_list, s2_list, s3_list = [], [], []s12_list, s13_list, s23_list = [], [], []for i in range(0, n, batch_size): xyz_b = torch.tensor(xyz[i:i+batch_size], dtype=torch.float32, requires_grad=True).to(device) # 只需一组微分 + 一次 Material 调用 U_x, U_y, U_z, U_xx, U_xy, U_xz, U_yy, U_yz, U_zz = pinn.dif_x(xyz_b) V_x, V_y, V_z, V_xx, V_xy, V_xz, V_yy, V_yz, V_zz = pinn.dif_y(xyz_b) W_x, W_y, W_z, W_xx, W_xy, W_xz, W_yy, W_yz, W_zz = pinn.dif_z(xyz_b) _, _, _, _, _, _, s1_t, s2_t, s3_t, s12_t, s23_t, s13_t, _, _, _ = Material( U_x, U_y, U_z, V_x, V_y, V_z, W_x, W_y, W_z, U_xx, U_xy, U_xz, U_yy, U_yz, U_zz, V_xx, V_xy, V_xz, V_yy, V_yz, V_zz, W_xx, W_xy, W_xz, W_yy, W_yz, W_zz, pinn.E, pinn.mu) # detach() 断开计算图,只保留数值 s1_list.append(s1_t.detach().cpu().numpy()) s2_list.append(s2_t.detach().cpu().numpy())s1 = np.concatenate(s1_list)# ... 拼接其余分量 每个批次中:detach() 将结果从计算图断开,只保留纯数值下一轮循环中变量(xyz_b, U_x, s1_t 等)被重新赋值,旧对象的引用计数归零Python 引用计数机制立即回收旧对象,关联的计算图跟随释放 二维物理问题描述模型: 几何与建模:方板边长 利用几何对称性,仅建模方板的四分之一(如图12(b)),以降低计算成本载荷条件:在板的右侧( )施加沿x方向的分布力 载荷函数为: 边界条件:位移边界条件 (在对称面上施加): 力(牵引力)边界条件:已由 在右侧边界施加材料属性:杨氏模量 泊松比 为平面应力问题,Lamé常数 由以下公式计算: 来源:我的博士日记

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈