我正在开发一个有限元系统。像往常一样,模拟由一组网格节点组成,每个节点都有一组属性(浮点),例如几个在时间内演化的物质属性、坐标或物理量。
您可以采用两种极端的方法:
double* x, *y, *z, *e_field, *b_field, *conductivity;
struct { double x, y, z, e_field, b_field, conductivity; } *meshnodedata;
在这两者之间,可以混合使用,比如只对坐标x、y、z应用第二种方法,对其余的属性使用第一种方法。您的模拟为每个网格节点维护的属性越多,混合的可能性就越大。
一方面,我有一个经典的问题:在程序的性能和代码的可维护性方面,这些方法中哪一种(以及它们的混合)最适合科学计算。另一方面,我想知道如何实现代码,使不同方法之间的迁移变得容易。此外,它甚至可能是在程序不同部分的不同内存布局之间迁移的解决方案。
切中要害:
有什么不同的approaches?
发布于 2010-10-31 22:30:48
你的问题实际上归结为如何设计灵活和快速的有限元软件的问题,这是一个积极的研究领域。我曾经研究过这类软件,我认为你的问题的答案实际上取决于你想要支持什么样的特性。例如,您需要自适应网格细化和粗化吗?你会解决政策制定和评价系统吗?您的代码应该运行在集群上吗?你会有多少未知数?在不知道你的目标的情况下,我还是试着做一些一般性的讨论。
分离网格数据和问题数据。这将使您的代码更易于维护。网格管理器可以用于处理不同类型的问题,每个问题都有自己的一组数据附加到每个元素上。如果您在网格内部或外部存储诸如电导率之类的东西,则
e_field和b_field )存储在一个连续的内存块中。这将极大地提高线性求解器的性能。迭代线性求解器通常受到内存带宽的限制,因为您的未知向量的内部结构可能是分组的或按块的(基本上是您自己描述的两种方法),这两种方法中的哪一种选择未知数取决于许多因素,包括您求解的matrices.
https://stackoverflow.com/questions/4065283
复制相似问题