并行fenics:分区网格和dof-vertex-map

时间:2017-10-25 13:08:39

标签: python parallel-processing fenics

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

0 个答案:

没有答案