Python Fenics-as#U张量错误:ufl.log.UFLException:组件和形状长度don';不匹配

Python Fenics-as#U张量错误:ufl.log.UFLException:组件和形状长度don';不匹配,python,tensor,fenics,Python,Tensor,Fenics,我正在尝试使用Fenics在python中构建一个有限元分析模拟,所有这些我都是新手。我有一些张量设置,如下所示: i = indices(3) G = as_tensor(T.dx(i), (i)) G0 = as_tensor(T0.dx(i), (i)) q = as_tensor(dt/(dt + tau_q) * (tau_q/dt*q0[i] - kappa*(1+tau_T/dt)*G[i] + kappa*tau_T/dt*G0[i]),(i)) from __futur

我正在尝试使用Fenics在python中构建一个有限元分析模拟,所有这些我都是新手。我有一些张量设置,如下所示:

i = indices(3)
G = as_tensor(T.dx(i), (i))  
G0 = as_tensor(T0.dx(i), (i))

q = as_tensor(dt/(dt + tau_q) * (tau_q/dt*q0[i] - kappa*(1+tau_T/dt)*G[i] + kappa*tau_T/dt*G0[i]),(i))
from __future__ import print_function
from fenics import *
import numpy as np
import matplotlib.pyplot as plt
from dolfin import *
from mshr import *
from ufl import as_tensor
from ufl import indices
import math

parameters["allow_extrapolation"] = True
parameters["form_compiler"]["cpp_optimize"] = True
set_log_level(20)

# SOLVE THE HEAT TRANSFER PROBLEM FOR A 3D TARGET

#--Dimensions in mm----
x0 = 0 
y0 = 0
z0 = 0
x1 = 8
y1 = 8
z1 = 8
#----------------
t_start = 0.0
t_end = 900
nstep = 450
dt = (t_start - t_end)/ nstep
#-----------------
#Configure for dimensions of system

pi = 3.141592653589793
T_am = 0.0 #ambient vacuum temperature
T_a4 = T_am**4
epsilon = 0.05  # material emissivity
sigma = 5.67E-14 # W/(m2.K4)
es = epsilon*sigma
Laser = Expression('2*A*Pmax/(pi*w*w)*exp(-2*pow((x[0] - 4), 2)/(w*w)-2*pow((x[1]-4), 2)/(w*w)-2*pow((x[2]-z1), 2)/(w2*w2) )',degree=3, A=0.1, Pmax=500,w=1, w2= 0.1,z1=z1) #power (w2 localises the z-coordinates)
#----------THERMAL--PROPERTIES--[W]--------
kappa = 0.174         #conductivity [W/mm K] 
c = 0.132         #Specific Heat Capacity [J/gK]
rho = 0.019            #Density [g/mm^3]
const = kappa /(c * rho)
tau_T = 0.0 #Temperature Gradient Lag
tau_q = 0.0 #Heat Flux Lag
#---------------------------------------

mesh = BoxMesh(Point(x0,y0,z0), Point(x1,y1,z1), 80,80,80)
Space = FunctionSpace((mesh), 'P', 1)
VectorSpace = VectorFunctionSpace(mesh, 'P', 1)
cells = MeshFunction('size_t',mesh,mesh.topology().dim())
facets = MeshFunction('size_t',mesh,mesh.topology().dim()-1)
da = Measure('ds', domain=mesh, subdomain_data = facets)
dv = Measure('dx', domain=mesh, subdomain_data = cells)

initial_T = Expression("Tini", Tini=T_am, degree=3)
T0 = interpolate(initial_T, Space)
T = Function(Space)
V = TestFunction(Space)
dT = TrialFunction(Space)
q0 = Function(VectorSpace)
i = indices(3)
G = as_tensor(T.dx(i), (i))  
G0 = as_tensor(T0.dx(i), (i))

# ERROR: COMPONENT AND SHAPE LENGTH DO NOT MATCH
q = as_tensor(dt/(dt + tau_q) * (tau_q/dt*q0[i] - kappa*(1+tau_T/dt)*G[i] + kappa*tau_T/dt*G0[i]),(i))
F = (rho*c/dt*(T-T0)*V - q[i]*V.dx(i) - rho*Laser*V ) * dv + es*(T**4 - T_a4)*V*da
Gain = derivative(Form, T, dT)

file_T = File('target3D/solution.pvd')
for t in np.arange(t_start,t_end,dtime):
    print( "Time", t)
    solve(F==0, T, [], J = Gain, solver_parameters={"newton_solver":{"linear_solver": "mumps", "relative_tolerance": 1e-3} }, form_compiler_parameters={"cpp_optimize": True, "representation": "quadrature","quadrature_degree": 2} )
    file_T << (T,t)
    q0 = project(q, VectorSpace)
    T0.assign(T)
这反过来又给了我一个错误:

Traceback (most recent call last):
  File "target2.py", line 68, in <module>
    q = as_tensor(dt/(dt + tau_q) * (tau_q/dt*q0[i] - kappa*(1+tau_T/dt)*G[i] + kappa*tau_T/dt*G0[i]),(i))
  File "/usr/local/lib/python3.6/dist-packages/ufl/exproperators.py", line 449, in _getitem
    all_indices, slice_indices, repeated_indices = create_slice_indices(component, shape, self.ufl_free_indices)
  File "/usr/local/lib/python3.6/dist-packages/ufl/index_combination_utils.py", line 181, in create_slice_indices
    error("Component and shape length don't match.")
  File "/usr/local/lib/python3.6/dist-packages/ufl/log.py", line 172, in error
    raise self._exception_type(self._format_raw(*message))
ufl.log.UFLException: Component and shape length don't match.
回溯(最近一次呼叫最后一次):
文件“target2.py”,第68行,在
q=as_张量(dt/(dt+tau_q)*(tau_q/dt*q0[i]-kappa*(1+tau_T/dt)*G[i]+kappa*tau_/dt*G0[i]),(i))
文件“/usr/local/lib/python3.6/dist packages/ufl/exproperators.py”,第449行,在_getitem中
所有索引、切片索引、重复索引=创建切片索引(组件、形状、self.ufl\u自由索引)
文件“/usr/local/lib/python3.6/dist packages/ufl/index\u composition\u utils.py”,第181行,位于创建切片索引中
错误(“组件和形状长度不匹配。”)
文件“/usr/local/lib/python3.6/dist-packages/ufl/log.py”,第172行出错
引发自我异常类型(自我格式原始(*消息))
ufl.log.UFLException:组件和形状长度不匹配。
鉴于可用的as_张量文档非常有限,现在有人知道这个错误指的是什么,以及如何修复它吗

我的完整代码如下所示:

i = indices(3)
G = as_tensor(T.dx(i), (i))  
G0 = as_tensor(T0.dx(i), (i))

q = as_tensor(dt/(dt + tau_q) * (tau_q/dt*q0[i] - kappa*(1+tau_T/dt)*G[i] + kappa*tau_T/dt*G0[i]),(i))
from __future__ import print_function
from fenics import *
import numpy as np
import matplotlib.pyplot as plt
from dolfin import *
from mshr import *
from ufl import as_tensor
from ufl import indices
import math

parameters["allow_extrapolation"] = True
parameters["form_compiler"]["cpp_optimize"] = True
set_log_level(20)

# SOLVE THE HEAT TRANSFER PROBLEM FOR A 3D TARGET

#--Dimensions in mm----
x0 = 0 
y0 = 0
z0 = 0
x1 = 8
y1 = 8
z1 = 8
#----------------
t_start = 0.0
t_end = 900
nstep = 450
dt = (t_start - t_end)/ nstep
#-----------------
#Configure for dimensions of system

pi = 3.141592653589793
T_am = 0.0 #ambient vacuum temperature
T_a4 = T_am**4
epsilon = 0.05  # material emissivity
sigma = 5.67E-14 # W/(m2.K4)
es = epsilon*sigma
Laser = Expression('2*A*Pmax/(pi*w*w)*exp(-2*pow((x[0] - 4), 2)/(w*w)-2*pow((x[1]-4), 2)/(w*w)-2*pow((x[2]-z1), 2)/(w2*w2) )',degree=3, A=0.1, Pmax=500,w=1, w2= 0.1,z1=z1) #power (w2 localises the z-coordinates)
#----------THERMAL--PROPERTIES--[W]--------
kappa = 0.174         #conductivity [W/mm K] 
c = 0.132         #Specific Heat Capacity [J/gK]
rho = 0.019            #Density [g/mm^3]
const = kappa /(c * rho)
tau_T = 0.0 #Temperature Gradient Lag
tau_q = 0.0 #Heat Flux Lag
#---------------------------------------

mesh = BoxMesh(Point(x0,y0,z0), Point(x1,y1,z1), 80,80,80)
Space = FunctionSpace((mesh), 'P', 1)
VectorSpace = VectorFunctionSpace(mesh, 'P', 1)
cells = MeshFunction('size_t',mesh,mesh.topology().dim())
facets = MeshFunction('size_t',mesh,mesh.topology().dim()-1)
da = Measure('ds', domain=mesh, subdomain_data = facets)
dv = Measure('dx', domain=mesh, subdomain_data = cells)

initial_T = Expression("Tini", Tini=T_am, degree=3)
T0 = interpolate(initial_T, Space)
T = Function(Space)
V = TestFunction(Space)
dT = TrialFunction(Space)
q0 = Function(VectorSpace)
i = indices(3)
G = as_tensor(T.dx(i), (i))  
G0 = as_tensor(T0.dx(i), (i))

# ERROR: COMPONENT AND SHAPE LENGTH DO NOT MATCH
q = as_tensor(dt/(dt + tau_q) * (tau_q/dt*q0[i] - kappa*(1+tau_T/dt)*G[i] + kappa*tau_T/dt*G0[i]),(i))
F = (rho*c/dt*(T-T0)*V - q[i]*V.dx(i) - rho*Laser*V ) * dv + es*(T**4 - T_a4)*V*da
Gain = derivative(Form, T, dT)

file_T = File('target3D/solution.pvd')
for t in np.arange(t_start,t_end,dtime):
    print( "Time", t)
    solve(F==0, T, [], J = Gain, solver_parameters={"newton_solver":{"linear_solver": "mumps", "relative_tolerance": 1e-3} }, form_compiler_parameters={"cpp_optimize": True, "representation": "quadrature","quadrature_degree": 2} )
    file_T << (T,t)
    q0 = project(q, VectorSpace)
    T0.assign(T)
from\uuuuu future\uuuuu导入打印功能
从fenics进口*
将numpy作为np导入
将matplotlib.pyplot作为plt导入
从多尔芬进口*
从mshr导入*
从ufl导入为_张量
来自ufl进口指数
输入数学
参数[“允许_外推”]=True
参数[“form_编译器”][“cpp_优化”]=True
设置日志级别(20)
#解决三维目标的传热问题
#--尺寸单位:mm----
x0=0
y0=0
z0=0
x1=8
y1=8
z1=8
#----------------
t_开始=0.0
t_端=900
nstep=450
dt=(t_开始-t_结束)/nstep
#-----------------
#配置系统的维度
pi=3.141592653589793
T_am=0.0#环境真空温度
T_a4=T_am**4
ε=0.05#材料发射率
西格玛=5.67E-14#W/(m2.K4)
es=ε*σ
激光=表达式('2*A*Pmax/(pi*w*w)*exp(-2*pow((x[0]-4),2)/(w*w)-2*pow((x[1]-4),2)/(w*w)-2*pow((x[2]-z1),2)/(w2*w2)),度数=3,A=0.1,Pmax=500,w=1,w2=0.1,z1=z1)#功率(w2使z坐标本地化)
#----------热特性--[W]--------
kappa=0.174#电导率[W/mm K]
c=0.132#比热容[J/gK]
rho=0.019#密度[g/mm^3]
常数=kappa/(c*rho)
tau_T=0.0#温度梯度滞后
tau_q=0.0#热通量滞后
#---------------------------------------
网格=箱型网格(点(x0,y0,z0),点(x1,y1,z1),80,80,80)
空间=函数空间((网格),'P',1)
向量空间=向量函数空间(网格,'P',1)
cells=MeshFunction('size\u t',mesh,mesh.topology().dim())
facets=MeshFunction('size\u t',mesh,mesh.topology().dim()-1)
da=度量('ds',域=网格,子域\数据=面)
dv=度量('dx',域=网格,子域\数据=单元)
初始T=表达式(“Tini”,Tini=T\u am,度=3)
T0=插值(初始值,空间)
T=函数(空间)
V=测试函数(空间)
dT=三元函数(空间)
q0=函数(向量空间)
i=指数(3)
G=as_张量(T.dx(i)、(i))
G0=as_张量(T0.dx(i)、(i))
#错误:组件和形状长度不匹配
q=as_张量(dt/(dt+tau_q)*(tau_q/dt*q0[i]-kappa*(1+tau_T/dt)*G[i]+kappa*tau_/dt*G0[i]),(i))
F=(rho*c/dt*(T-T0)*V-q[i]*V.dx(i)-rho*激光*V)*dv+es*(T**4-T_a4)*V*da
增益=导数(形式,T,dT)
文件\u T=file('target3D/solution.pvd')
对于np.arange中的t(t_开始,t_结束,dtime):
打印(“时间”,t)
求解(F==0,T,[],J=Gain,solver_parameters={“newton_solver”:{“linear_solver”:“mumps”,“relative_tolerance”:1e-3}},form_compiler_parameters={“cpp_optimize”:True,“表示法”:“正交”,“正交度”:2})
文件