在c ++中用于数值积分的高斯高斯点

时间:2011-10-02 20:54:12

标签: c++ caching integration numerical

这是一个关于人们认为为我的问题布置班级结构的最佳方式的问题。我正在做一些数值分析,需要整合某些“元素”。所以我创建了一个名为“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类的静态成员?如果人们能够对此有所了解,我将非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我有一个类似的问题,并使用了一张地图(正如你的建议)。我要做的是更改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...