Это мой первый пост здесь, и у меня не так уж много опыта, поэтому извините за мое невежество.
Я строю симуляцию Монте-Карло на 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
Оптимизация моделирования Монте-Карло на C++ с помощью длинных динамических массивов ⇐ C++
Программы на C++. Форум разработчиков
1772271926
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
Подробнее здесь: [url]https://stackoverflow.com/questions/67905839/optimize-c-monte-carlo-simulation-with-long-dynamic-arrays[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия