1

我正在用 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)
4

0 回答 0