Очки Гаши кеша для численного интегрирования в c ++ - PullRequest
0 голосов
/ 03 октября 2011

Это вопрос о том, что люди думают, как лучше выложить структуру моего класса для моей проблемы. Я делаю некоторый числовой анализ и требую, чтобы определенные «элементы» были интегрированы. Итак, я создал класс с именем "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 голосов
/ 03 октября 2011

Однажды у меня была похожая проблема, и я использовал карту (как вы и предлагали). Я бы изменил 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...
...