我正在用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()
计算元素矩阵是一个独立的计算,可以按任何顺序执行。
答案 0 :(得分:2)
你应该能够使用Parallel.ForEach轻松地为线程上的每个循环进行parellize。
您只需要确保矩阵中的赋值是线程安全的,并且单个计算不依赖于按顺序完成。
答案 1 :(得分:0)
Parallel.ForEach(elements, e =>
{
var eResult = e.CalcKe();
AggregateResults(eResult);
}
void AggregateResults(Matix r)
{
lock(denseMatrix)
denseMatix[a,b] = r[k,l];
}