【问题标题】:Cache gauss points for numerical integration in c++c++中数值积分的缓存高斯点
【发布时间】:2011-11-29 13:24:58
【问题描述】:

这是一个关于人们认为针对我的问题布置班级结构的最佳方式的问题。我正在做一些数值分析,需要整合某些“元素”。所以我像这样创建了一个名为“BoundaryElement”的类

class BoundaryElement
{
/* private members */
public:
integrate(Point& pt);
};

关键功能是“整合”,我需要针对各种不同的点进行评估。发生的情况是,根据点,我需要使用不同数量的积分点和权重,它们基本上是数字的向量。为了找到这些,我有一个这样的课程:

class GaussPtsWts
{
int numPts;
double* gaussPts;
double* gaussWts;

public:
GaussPtsWts(const int n);
GaussPtsWts(const GaussPtsWts& rhs);
~GaussPtsWts();
GaussPtsWts& operator=(const GaussPtsWts& rhs);
inline double gwt(const unsigned int i)
{
    return gaussWts[i];
}
inline double gpt(const unsigned int i)
{
    return gaussPts[i];
}
inline int numberGPs()
{
return numGPs;
}
};

使用这个,理论上我可以为每次调用集成函数创建一个 GaussPtsWts 实例。但我知道我可能多次使用相同数量的高斯点,所以我想缓存这些数据。我对如何做到这一点不是很有信心——可能是一个 std::map ,它是 BoundaryElement 类的静态成员?如果人们能对此有所了解,我将不胜感激。谢谢!

【问题讨论】:

  • 为什么不直接创建一个vector<GaussPtsWts>,其中索引对应于构造函数中n 的点数?然后只需在integrate 的每个调用中引用您需要的那个。

标签: c++ caching integration numerical


【解决方案1】:

我曾经遇到过类似的问题并使用了地图(如您所建议的那样)。我要做的是更改GaussPtsWts 以包含地图:

typedef std::map<int, std::vector<std::pair<double, double>>> map_type;

在这里,我已将您的两个点和权重数组放入一个成对的向量中 - 如果我正确地记住了我的求积,这应该适用。随意制作点和重量的小结构,使其更具可读性。

然后我会创建一个GaussPtsWts 的实例,并将对它的引用存储在每个BoundaryElement 中。或者可能是shared_ptr,这取决于您的喜好。您还需要记录您使用的点数。

当你询问体重时,你可能会有这样的情况:

double gwt(const unsigned int numGPs, const unsigned int i)
{
    map_type::const_iterator found = themap.find(numGPs);
    if(found == themap.end())
        calculatePoints(numGPs);
    return themap[numGPs][i].first;
}

或者,您也可以使用带有整数参数的模板:

template <int N>
class GaussPtsWts...

【讨论】:

    猜你喜欢
    • 2016-01-12
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多