Оптимизация моделирования Монте-Карло на C++ с помощью длинных динамических массивовC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Оптимизация моделирования Монте-Карло на C++ с помощью длинных динамических массивов

Сообщение Anonymous »

Это мой первый пост здесь, и у меня не так уж много опыта, поэтому извините за мое невежество.
Я строю симуляцию Монте-Карло на C++ для своей докторской диссертации, и мне нужна помощь в оптимизации времени вычислений и производительности. У меня есть трехмерный куб, повторяющийся по каждой координате как объем моделирования, и внутри каждого куба магнитные частицы генерируются в кластерах. Затем в центральном кубе создается петля протонов, которые движутся и на каждом шаге вычисляют общее магнитное поле от всех частиц (помимо прочего), которые они чувствуют.
В этот момент я определяю все внутри основной функции и, поскольку мне нужно положение частиц для моих расчетов (я рассчитываю расстояние между частицами во время их размещения, а также во время движения протонов), я сохраняю их в динамических массивах. Я еще не использовал ни один класс или функцию. Это делает мои симуляции очень медленными, потому что в конечном итоге мне приходится использовать миллионы частиц и тысячи протонов. Даже с сотнями нужны дни. Также я часто использую циклы for и while и читаю/записываю файлы .dat.
Мне очень нужна ваша помощь. Я потратил недели, пытаясь оптимизировать свой код, но мой проект отстает от графика. У вас есть какие-либо предложения? Мне нужны массивы для хранения положения частиц. Как вы думаете, классы или функции будут более эффективными? В целом любой совет полезен. Извините, если это было слишком долго, но я в отчаянии...
Хорошо, я отредактировал исходное сообщение и делюсь своим полным сценарием. Надеюсь, это даст вам некоторое представление о моей симуляции. Спасибо.
Дополнительно добавляю два входных файла
parametersDiffusion_spher_shel.txt
parametersIONP_spher_shel.txt
#include
#include
#include
#include
#include
#include //precision to output
//#include
#include
#include
#include
#include
//#include
#include //random generator
#include

using namespace std;

#define PI 3.14159265
#define tN 500000 //# of timepoints (steps) to define the arrays ONLY
#define D_const 3.0E-9 //diffusion constant (m^2/s)
#define Beq 0.16 // Tesla
#define gI 2.6752218744E8 //(sT)^-1

int main(){

//Mersenne Twister random engine
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//uniform_int_distribution intDist(0,1);
uniform_real_distribution realDist(0.,1.);

//for(int i=1; itemp_cubAxN) {

ionpN = (int)temp_ionpN;
aggN = (int)temp_aggN;
cubAxN = (int)temp_cubAxN;

}

inIONP.close();

cout

Подробнее здесь: https://stackoverflow.com/questions/679 ... mic-arrays
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»