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 に答える