我遇到的问题是,Fenics中比我更精通的人可能很快就能解决,我非常感激。我试图定义一个空间相关的弹性张量(C_ijkl)。在组装张量器之后,当我使用fenics plot命令绘制它的特定组件(比如C_1100)然后它可以工作但是如果我尝试在域内的某个点评估它然后我得到一个错误。代码是:
mesh = Mesh("geometry.xml")
cd = MeshFunction('size_t',mesh,"geometry_physical_region.xml")
def readMP2():
with open('Material.txt', 'r') as f:
N=([int(x) for x in f.readline().split()])[0];
rhoL=[];
for i, line in enumerate(f):
if i==N-1:
break
rhoL.append(([float(x) for x in line.split()])[0])
rhoL.append(([float(x) for x in line.split()])[0])
rho=np.asarray(rhoL)
lmL=[];
for i, line in enumerate(f):
lmL.append(([float(x) for x in line.split()])[:2])
if i==N-1:
break
lm=np.asarray(lmL)
return (rho,lm)
r,lm = readMP2()
V0=FunctionSpace(mesh, 'DG', 0)
M0=TensorFunctionSpace(mesh, 'DG', 0, shape=(2,2,2,2))
rho,lam,mu=Function(V0),Function(V0),Function(V0)
C=Function(M0)
i=Index()
j=Index()
k=Index()
l=Index()
delta=Identity(2)
rho.vector()[:] = numpy.choose(numpy.asarray(cd.array(), dtype=numpy.int32), r)
lam.vector()[:] = numpy.choose(numpy.asarray(cd.array(), dtype=numpy.int32), lm[:,0])
mu.vector()[:] = numpy.choose(numpy.asarray(cd.array(), dtype=numpy.int32), lm[:,1])
C=as_tensor((lam*(delta[i,j]*delta[k,l])+mu*(delta[i,k]*delta[j,l]+delta[i,l]*delta[j,k])),[i,j,k,l])
在此之后,以下工作:
plot(C[1,1,0,0])
interactive()
但如果我尝试执行以下操作:
C1=C[0,0,0,0]
print C1(.0001,.0001)
然后我收到以下错误:
ufl.log.UFLException: Expecting dim to match the geometric dimension, got dim=1 and gdim=2.
我觉得我错过了一些相当微不足道的东西。任何关于此的亮点都将非常受欢迎