LINUX.ORG.RU

Компьютерная модель газа, организация емких вычислений

 , ,


0

3

Здравствуйте.

Надо стало написать компьютерную модель явления теплопереноса в условиях среднего вакуума. Реализовал в лоб - обсчёт траектории для каждой молекулы. С этим, в общем, особых проблем нет. Написал на c++

Проблема в количестве молекул. При давлении 1Па при температуре 333К (30С) в объеме 7x5x1мм их около 8 трлн. На каждую молекулу нужно 4 поля типа double(положение x,y, скорость, направление(угол) - модель двухмерная). Если считать, что double занимает 8 байт, то для одной молекулы нужно 32 байта, а для всех молекул - 232ТБ. Естественно, что моих 4 гигов оперативки не хватит, а мой intel celeron 2@1.1GHz будет это все обсчитывать, по примерным оценкам, около сотни веков для моделирования всей системы на 1с вперёд с шагом в 1мкс по времени(шаг 1мкс взят неспроста, увеличить нельзя).

Вот и вопрос - существуют ли сервисы, где можно запустить такие вычисления, или я с дуба рухнул, и такое даже БАК не может себе позволить?

Ну а если кто знает, подскажите, как можно с меньшими затратами реализовать такую модель, ибо концентрацию уменьшить нельзя - уже не то будет…

Перемещено Pinkbyte из development

Ответ на: комментарий от thunar

А в случае с абсолютно гладкой поверхностью там же абсолютно упругое столкновение.

Вроде это стандартное условие. Как иначе задать температуру стенки?

AntonI ★★★★
()
Ответ на: комментарий от AntonI

А что по поводу распределения скорости по осям?

Architector
() автор топика
Ответ на: комментарий от Architector

Я же писал как надо…

const float rand_alpha = 1./(1.+RAND_MAX); 
const float rand_alpha2PI = 2*M_PI/(1.+RAND_MAX);

inline float gauss(){
    return sqrt(-2.*log(rand_alpha*(random()+1.)))*cos(rand_alpha2PI*random());
}

это случайный источник с нормальным распределением «на коленке», но их можно найти готовые.

template<int D> struct Vec {
    float p[D];
    float& operator[](int i){ return p[i]; }
    void rand_init(){  for(int i=0; i<D; i++) p[i] = gauss(); }
    void operator *= (float b){ for(int i=0; i<D; i++) p[i] *= b; }
   ...
};

...
    float dZ = ...; // расстояние между стенками
    Vec<3> v; v.rand_init(); v *= ...; // задаем температуру через множитель
    v[2] = fabs(v[2]);
AntonI ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.