我正在用 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)
它给了我一行:“nodal_values_k[v2d[i]] = k_p”以下错误:IndexError:预期索引在[0..106]
来自v2d ...意味着“vertex_to_dof_map”没有按需要进行分区...有什么办法可以纠正它吗?
我们可以根据自由度(自由度)划分网格吗?
我们可以有基于分区网格的“vertex_to_dof_map(V)”吗?
另外,如果我可以用如下的顶点值编写function_k,是否有任何方法可以在不使用自由度到顶点映射的情况下将顶点值_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)