我正在用fenics为立方体写一个热方程。材料将在由函数(比如function_k)处理的时间内更改,以更新属性。代码没问题,现在我想要并行它。一切都很好,但问题是function_k会产生一些问题。 我发现到现在为止,网格将根据网格顶点坐标进行分区。但是,当我想改变功能值时,我需要使用节点值来解决问题。 网格,函数空间和分区参数:
mesh = BoxMesh(Point(x0, y0, z0), Point(x1, y1, z1), nx, ny, nz)
parameters["mesh_partitioner"] = "SCOTCH"#"ParMETIS"s
V = FunctionSpace(mesh, 'CG', 1)
材料属性" K"初始化为:
tol = 1e-6
muz = 0.1
k = Expression('x[2]>zf+tol ? k_a : k_p' ,degree=0, zf=muz, k_a=20 ,
k_p=1, tol=tol)
function_k是(在每个时间步骤中求解eq后将调用):
def function_k(mesh,f,k,lw,u,V):
k_p = 20
v2d = vertex_to_dof_map(V)
coordinates = mesh.coordinates()
k = interpolate(k,V)
nodal_values_k = k.vector()
for i, x in enumerate(coordinates):
if( (x[2] <= f.muz) and (x[2] > f.muz-lw)):
nodal_values_k[v2d[i]] = k_p
k.vector()[:] = nodal_values_k
return(k)
它让我排成一行:&#34; nodal_values_k [v2d [i]] = k_p&#34;以下错误: IndexError:预期指数在[0..106]
来自v2d ...表示&#34; vertex_to_dof_map&#34;没有被分割为欲望....有没有办法纠正它?
我们可以根据自由度(dof)对网格进行分区吗?
我们可以拥有&#34; vertex_to_dof_map(V)&#34;基于分区网格?
另外如果我可以编写带顶点值的function_k,如果没有使用自由度到顶点映射那么顶点value_k到k有什么方法吗?
def Kfunction(mesh,f,k,lw,u,V):
k_p = 20
coordinates = mesh.coordinates()
k = interpolate(k,V)
vertex_values_k = k.compute_vertex_values(mesh)
for i, x in enumerate(coordinates):
if( (x[2] <= f.muz) and (x[2] > f.muz-lw)):
vertex_values_k[i] = k_p
#??? how should I assign the vertex value_k to k witouth using dof
# to vertex map
return(k)