0

我正在用 C# 构建一个有限元分析库。在我要分析的每个结构中,都需要在元素级别执行多次计算,并将结果汇​​总到结构级别。当有许多元素时,所有这些计算都需要相当长的时间。

例如,计算单元刚度矩阵并将其组装到全局刚度矩阵中。

有没有办法让进程利用线程?

public class FEStructure
{
    public List<Element> elements = new List<Element>;
    public Matrix K;

    Struct()
    {
        // Do some stuff not relevant here
    }

    public void CalcK()
    {
        // Create a Global stiffness matrix (n x n)
        K = new DenseMatrix(SizeK());

        // Process all elements - can it be threaded?
        foreach (Element e in elements)
        {
            // Get the element stiffness matrix  and assemble it into K
            Matrix Ke = e.CalcKe();
            Assemble(Ke);
        }
    }

    public void Assemble(Matrix Ke)
    {
        // Assembles Ke into K using the element topology
        // and lot of fields and methods left out. Code
        // operates on K using syntax similar to:
        K[i, j] = Ke[k, l];
    }
}

编辑:

元素矩阵的e.CalcKe()计算是一个独立的计算,可以按任意顺序进行。

4

2 回答 2

2

您应该能够使用 Parallel.ForEach 轻松地将线程上的 for each 循环并行化。

您只需要确保对矩阵的分配是线程安全的,并且各个计算不依赖于按顺序完成。

于 2012-06-19T20:48:28.920 回答
0
Parallel.ForEach(elements, e =>
{
     var eResult = e.CalcKe(); 
     AggregateResults(eResult);
}

void AggregateResults(Matix r)
{
    lock(denseMatrix)
        denseMatix[a,b] = r[k,l];
}
于 2012-06-21T01:45:05.843 回答