我正在开发一个有限元系统。像往常一样,模拟由一组网格节点组成,每个节点都有一组属性(浮点),例如随时间演变的几个材料属性、坐标或物理量。
您可以采用两种极端方法:
属性方面:为每个属性维护一个数组:
double* x, *y, *z, *e_field, *b_field, *conductivity;
入口方式:维护一个数组,其中每个数组都是 struct
struct { double x, y, z, e_field, b_field, conductivity; } *meshnodedata;
在这些之间,可以混合使用,例如仅对坐标 x、y、z 应用第二种方法,而对其余属性使用第一种方法。您的模拟为每个网格节点维护的属性越多,混合的可能性就越大。
一方面,我有一个经典问题,就程序性能和代码可维护性而言,这些方法(及其组合)中的哪一种最适合科学计算。另一方面,我想知道如何以使不同方法之间的迁移变得容易的方式来实现代码。此外,它甚至可能是在程序不同部分的不同内存布局之间迁移的解决方案。
言归正传:
- 您对这些不同的方法有何经验?
- 这些差异有多大?
- 您是否获得了在这两种布局之间迁移的经验?