В исторически план компютърната наука до голяма степен е била ограничена до сферата на изследователите и докторантите. Въпреки това, през годините - може би и непознати за по-голямата софтуерна общност - нас научни изчислителни яйца тихо компилират съвместни библиотеки с отворен код, които се справят с по-голямата част от тежката работа . Резултатът е, че сега е по-лесно от всякога да се прилагат математически модели и макар полето все още да не е готово за масово потребление, летвата за успешното внедряване е драстично намалена. Разработването на нова изчислителна кодова база от нулата е огромно начинание, което обикновено се измерва в години, но тези научни изчислителни проекти с отворен код позволяват да се работи с достъпни примери за сравнително бързо използване на тези изчислителни способности.
Тъй като целта на научните изчисления е да осигури научен поглед върху реални системи, които съществуват в природата, дисциплината представлява авангарда в реализирането на подхода на компютърния софтуер. За да се направи софтуер, който имитира реалния свят с много висока степен както на точност, така и на разделителна способност, трябва да се използва сложна диференциална математика, изискваща знания, които рядко се срещат извън стените на университети, национални лаборатории или корпоративни отдели за научноизследователска и развойна дейност. На всичкото отгоре се появяват значителни числени предизвикателства опитвайки се да опише непрекъснатата, безкрайно малка структура на реалния свят използвайки дискретния език на нули и единици. Необходими са изчерпателни усилия за внимателна числена трансформация, за да се получат алгоритми, които са едновременно изчислимо проследими и които дават значими резултати. С други думи, научните изчисления са тежък труд.
Аз лично много обичам Проект FEniCS , използвайки го за моята дипломна работа, и ще демонстрира пристрастието ми при избора на това за нашия пример за кода за този урок. (Има и други много висококачествени проекти като ДЮН които човек също би могъл да използва.)
FEniCS е самоописан като „съвместен проект за разработване на иновативни концепции и инструменти за автоматизирани научни изчисления, със специален фокус върху автоматизирано решаване на диференциални уравнения чрез методи с крайни елементи“. Това е мощна библиотека за решаване на огромен набор от проблеми и приложения за научни изчисления. Сред неговите сътрудници са изследователската лаборатория Simula, Университетът в Кеймбридж, Чикагският университет, Университетът Бейлор и KTH Royal Institute of Technology, които колективно са го изградили в безценен ресурс през последното десетилетие ( вижте кодовете FEniCS топло ).
По-скоро удивително е колко много усилия ни е защитила библиотеката FEniCS. За да разберете невероятната дълбочина и ширина на темите, които проектът обхваща, можете да го направите разгледайте учебника им с отворен код , където Глава 21 дори сравнява различни схеми на крайни елементи за решаване на несвиваеми потоци.
Зад кулисите проектът интегрира за нас голям набор от научни изчислителни библиотеки с отворен код, които могат да представляват интерес или да бъдат пряко използвани. Те включват, без конкретен ред, проектите, които проектът FEniCS извиква:
Този списък с външни пакети, интегрирани в проекта, ни дава представа за наследените му възможности. Например, наличието на интегрирана поддръжка за MPI позволява мащабиране на отдалечени работници в изчислителна клъстерна среда (т.е. този код ще работи на супер компютър или вашия лаптоп).
Също така е интересно да се отбележи, че има много приложения извън научните изчисления, за които тези проекти могат да бъдат използвани, включително финансово моделиране, обработка на изображения, проблеми с оптимизацията и може би дори видео игри. Би било възможно например да се създаде видео игра, която използва някои от тези алгоритми и техники с отворен код за решаване на двуизмерен флуид, който тече, като този на океански / речни течения, с който играчът би взаимодействал (може би опитайте и плавайте с лодка с различен вятър и водни потоци).
Тук ще се опитам да дам представа за това какво включва разработването на числения модел, като покажа как се разработва и прилага основна схема за изчислителна флуидна динамика в една от тези библиотеки с отворен код - в случая Проект FEniCS . FEnICS предоставя API на Python и C ++. За този пример ще използваме техния API на Python.
Ще обсъдим доста техническо съдържание, но целта просто ще бъде да опитаме какво включва разработването на такъв научен изчислителен код и колко много работа за нас правят днешните инструменти с отворен код. Надяваме се, че в процеса ще помогнем за демистификацията на сложния свят на научните изчисления. (Обърнете внимание, че Приложение е предоставено, че подробно описва всички математически и научни основи за тези, които се интересуват от това ниво на детайлност.)
ОПРОВЕРЖЕНИЕ: За тези читатели с малко или никакъв опит в научния изчислителен софтуер и приложения, части от този пример може да ви накарат да се почувствате така:
коя е най-точната дефиниция за визуализация?
Ако е така, не се отчайвайте. Основният извод тук е степента, до която съществуващите проекти с отворен код могат значително да опростят много от тези задачи.
Имайки това предвид, нека започнем, като разгледаме FEnICS демонстрация за несвиваема Navier-Stokes . Тази демонстрация моделира налягане и скорост на несвиваема течност, протичаща през Г-образен завой, като водопроводна тръба.
Описанието на демонстрационната страница, свързана, дава отлична, кратка настройка на необходимите стъпки за стартиране на кода и ви препоръчвам да погледнете бързо, за да видите какво е включено. За да обобщим, демото ще реши скоростта и натиска през завоя за несвиваеми уравнения на потока . Демото прави кратка симулация на течността, течаща във времето, анимирайки резултатите, докато върви. Това се постига чрез настройване на мрежа, представляваща пространството в тръбата, и използване на Метод на крайните елементи за да се реши числено скоростта и налягането във всяка точка на мрежата. След това се повтаряме във времето, като актуализираме полетата на скоростта и налягането, като използваме уравненията, с които разполагаме.
Демото работи добре както е, но ще го модифицираме леко. Демото използва Хорин се разделя , но ще използваме малко по-различния метод, вдъхновен от Ким и Мойн вместо това, което се надяваме да е по-стабилно. Това просто изисква да променим уравнението, използвано за сближаване на конвективния и вискозния член, но за да го направим, трябва да съхраним полето на скоростта на предишната стъпка от времето и да добавим два допълнителни термина към уравнението за актуализация, което ще използва това предишно информация за по-точно цифрово сближаване.
Така че нека направим тази промяна. Първо добавяме нов Function
възразите на настройката. Това е обект, който представлява абстрактна математическа функция като вектор или скаларно поле. Ще го наречем un1
ще съхранява предишното поле за скорост на нашето функционално пространство
V
.
... # Create functions (three distinct vector fields and a scalar field) un1 = Function(V) # the previous time step's velocity field we are adding u0 = Function(V) # the current velocity field u1 = Function(V) # the next velocity field (what's being solved for) p1 = Function(Q) # the next pressure field (what's being solved for) ...
След това трябва да променим начина, по който „предварителната скорост“ се актуализира по време на всяка стъпка от симулацията. Това поле представлява приблизителната скорост при следващата стъпка от време, когато налягането се игнорира (в този момент налягането все още не е известно). Това е мястото, където заместваме метода на разделяне на Хорин с по-новия метод на дробна стъпка на Ким и Мойн. С други думи, ще променим израза за полето F1
:
Замяна:
# Tentative velocity field (a first prediction of what the next velocity field is) # for the Chorin style split # F1 = change in the velocity field + # convective term + # diffusive term - # body force term F1 = (1/k)*inner(u - u0, v)*dx + inner(grad(u0)*u0, v)*dx + nu*inner(grad(u), grad(v))*dx - inner(f, v)*dx
С:
# Tentative velocity field (a first prediction of what the next velocity field is) # for the Kim and Moin style split # F1 = change in the velocity field + # convective term + # diffusive term - # body force term F1 = (1/k)*inner(u - u0, v)*dx + (3.0/2.0) * inner(grad(u0)*u0, v)*dx - (1.0/2.0) * inner(grad(un1)*un1, v)*dx + (nu/2.0)*inner(grad(u+u0), grad(v))*dx - inner(f, v)*dx
така че демото сега използва нашия актуализиран метод за решаване на полето с междинна скорост, когато използва F1
И накрая, уверете се, че актуализираме предишното поле за скорост, un1
, в края на всяка стъпка на итерация
... # Move to next time step un1.assign(u0) # copy the current velocity field into the previous velocity field u0.assign(u1) # copy the next velocity field into the current velocity field ...
Така че по-долу е пълният код от нашата демонстрация на CFE на FEniCS, с включени наши промени:
'''This demo program solves the incompressible Navier-Stokes equations on an L-shaped domain using Kim and Moin's fractional step method.''' # Begin demo from dolfin import * # Print log messages only from the root process in parallel parameters['std_out_all_processes'] = False; # Load mesh from file mesh = Mesh('lshape.xml.gz') # Define function spaces (P2-P1) V = VectorFunctionSpace(mesh, 'Lagrange', 2) Q = FunctionSpace(mesh, 'Lagrange', 1) # Define trial and test functions u = TrialFunction(V) p = TrialFunction(Q) v = TestFunction(V) q = TestFunction(Q) # Set parameter values dt = 0.01 T = 3 nu = 0.01 # Define time-dependent pressure boundary condition p_in = Expression('sin(3.0*t)', t=0.0) # Define boundary conditions noslip = DirichletBC(V, (0, 0), 'on_boundary && (x[0] 0.5 - DOLFIN_EPS))') inflow = DirichletBC(Q, p_in, 'x[1] > 1.0 - DOLFIN_EPS') outflow = DirichletBC(Q, 0, 'x[0] > 1.0 - DOLFIN_EPS') bcu = [noslip] bcp = [inflow, outflow] # Create functions un1 = Function(V) u0 = Function(V) u1 = Function(V) p1 = Function(Q) # Define coefficients k = Constant(dt) f = Constant((0, 0)) # Tentative velocity field (a first prediction of what the next velocity field is) # for the Kim and Moin style split # F1 = change in the velocity field + # convective term + # diffusive term - # body force term F1 = (1/k)*inner(u - u0, v)*dx + (3.0/2.0) * inner(grad(u0)*u0, v)*dx - (1.0/2.0) * inner(grad(un1)*un1, v)*dx + (nu/2.0)*inner(grad(u+u0), grad(v))*dx - inner(f, v)*dx a1 = lhs(F1) L1 = rhs(F1) # Pressure update a2 = inner(grad(p), grad(q))*dx L2 = -(1/k)*div(u1)*q*dx # Velocity update a3 = inner(u, v)*dx L3 = inner(u1, v)*dx - k*inner(grad(p1), v)*dx # Assemble matrices A1 = assemble(a1) A2 = assemble(a2) A3 = assemble(a3) # Use amg preconditioner if available prec = 'amg' if has_krylov_solver_preconditioner('amg') else 'default' # Create files for storing solution ufile = File('results/velocity.pvd') pfile = File('results/pressure.pvd') # Time-stepping t = dt while t Изпълнението на програмата показва потока около лакътя. Стартирайте научно изчислителния код сами, за да го видите анимиран! Екраните на крайния кадър са представени по-долу.
Относителни налягания в завоя в края на симулацията, мащабирани и оцветени по величина (неразмерни стойности):

Относителни скорости в завоя в края на симулацията като векторни глифи, мащабирани и оцветени по величина (неразмерни стойности).

Така че това, което направихме, е взето от съществуваща демонстрация, която доста лесно изпълнява схема, много подобна на нашата, и я модифицирахме, за да използваме по-добри приближения, като използвахме информация от предишната стъпка от времето.
В този момент може би си мислите, че това е тривиална редакция. Беше и до голяма степен това е важното. Този проект за научни изчисления с отворен код ни позволи бързо да внедрим модифициран числен модел чрез промяна на четири реда код. Подобни промени могат да отнемат месеци в големи изследователски кодове.
Проектът има много други демонстрации, които могат да бъдат използвани като отправна точка. Има дори редица приложения с отворен код изградени по проекта, които прилагат различни модели.
Заключение
Научните изчисления и техните приложения са наистина сложни. Това няма как да се заобиколи. Но както е все по-вярно в толкова много домейни, непрекъснато нарастващият пейзаж на наличните инструменти и проекти с отворен код може значително да опрости това, което иначе би било изключително сложно и досадно програмно задание. И може би времето е дори близо, когато научните изчисления станат достатъчно достъпни, за да се окажат лесно използвани извън изследователската общност.
ПРИЛОЖЕНИЕ: Научни и математически основи
За тези, които се интересуват, ето техническите основи на нашето ръководство за изчислителна флуидна динамика по-горе. Това, което следва, ще послужи като много полезно и кратко резюме на теми, които обикновено се обхващат в рамките на около дузина курсове за завършили. Завършилите студенти и математически типове, които се интересуват от задълбочено разбиране на темата, могат да намерят този материал за доста ангажиращ.
Механика на флуидите
„Моделиране“, като цяло, е процесът на решаване на някаква реална система с последователни приближения. Моделът често включва непрекъснати уравнения, неподходящи за компютърна реализация, и затова трябва да бъде допълнително сближен с числени методи.
За механиката на флуидите, нека започнем това ръководство от основните уравнения, уравненията на Навие-Стокс, и използвайте това, за да разработите схема за CFD.
rest api с помощта на node js
The Уравнения на Навие-Стокс са поредица от частични диференциални уравнения (PDE) които описват течността много добре и по този начин са нашата отправна точка. Те могат да бъдат получени от законите за маса, инерция и енергоспестяване, предадени чрез a Транспортна теорема на Рейнолдс и кандидатстване Теорема на Гаус и призовавайки хипотезата на Stoke. Уравненията изискват непрекъснато предположение, където се приема, че имаме достатъчно течни частици, за да дадем статистически свойства като значение на температурата, плътността и скоростта. В допълнение са необходими линейна връзка между тензора на повърхностния стрес и тензора на деформация, симетрия в тензора на напрежението и предположения за изотропна течност. Важно е да знаем предположенията, които правим и наследяваме по време на това развитие, за да можем да оценим приложимостта в получения код. Уравненията на Навие-Стокс в Нотация на Айнщайн , без повече шум:
Запазване на масата:
Запазване на инерцията:

Запазване на енергията:

където е девиаторният стрес:
Въпреки че са много общи, управляващи повечето потоци течност във физическия свят, те не са от голяма полза директно. Известни са сравнително малко точни решения на уравненията, а $ 1,000,000 награда на хилядолетието е там за всеки, който може да реши проблем със съществуването и гладкостта . Важната част е, че имаме отправна точка за развитието на нашия модел, като правим поредица от предположения за намаляване на сложността (те са едни от най-трудните уравнения в класическата физика).
За да запазим нещата „прости“, ще използваме специфичните ни знания, за да направим нестислимо предположение за флуида и да приемем постоянни температури, така че уравнението за запазване на енергията, което се превръща в уравнение на топлината, не е необходимо (отделено). Сега имаме две уравнения, все още PDE, но значително по-прости, като същевременно решаваме голям брой реални проблеми с течностите.
Уравнение за приемственост
Импулсни уравнения

В този момент вече имаме хубав математически модел за несвиваеми флуидни потоци (газове и течности с ниска скорост като вода например). Решаването на тези уравнения директно на ръка не е лесно, но е хубаво, че можем да получим „точни“ решения за прости задачи. Използването на тези уравнения за решаване на интересуващи проблеми, да речем въздух, протичащ над крило, или вода, протичаща през някаква система, изисква да решим тези уравнения числено.
Изграждане на числова схема
За да се решат по-сложни проблеми с помощта на компютъра, е необходим метод за цифрово решаване на нашите несвиваеми уравнения. Решаването на частични диференциални уравнения, или дори диференциални уравнения, числено не е тривиално. Нашите уравнения в това ръководство обаче имат особено предизвикателство (изненада!). Тоест, трябва да решим уравненията на инерцията, като същевременно запазим дивергенцията на решението безплатна, както се изисква от приемствеността. Една проста интеграция във времето чрез нещо като Метод на Рунге-Кута е затруднено, тъй като уравнението за непрекъснатост няма производна във времето в себе си.
последната стъпка в процеса на капиталово бюджетиране е
Няма правилен или дори най-добър метод за решаване на уравненията, но има много работещи варианти. През десетилетията бяха открити няколко подхода за справяне с проблема, като например преформулиране по отношение на завихрянето и поточната функция, въвеждане на изкуствена компресируемост и разделяне на оператора. Хорин (1969), а след това Ким и Мойн (1984, 1990), формулират много успешен и популярен метод на частично стъпка, който ще ни позволи да интегрираме уравненията, докато решаваме за полето на налягането директно, а не имплицитно. Методът на дробното стъпало е общ метод за сближаване на уравненията чрез разделяне на техните оператори, в този случай разделяне по налягане. Подходът е сравнително прост и същевременно стабилен, мотивирайки избора си тук.
Първо, трябва да дискриминираме числено уравненията във времето, за да можем да преминем от една точка във времето към друга. Следвайки Ким и Мойн (1984), ще използваме изрично втория ред Метод на Адамс-Башфорт за конвективните термини - имплицитен от втори ред Метод на Crank-Nicholson за вискозните членове, проста крайна разлика за производната на времето, като същевременно се пренебрегва градиентът на налягането. Тези избори в никакъв случай не са единствените приближения, които могат да бъдат направени: техният избор е част от изкуството при изграждането на схемата чрез контролиране на численото поведение на схемата.

Междинната скорост вече може да бъде интегрирана, но тя пренебрегва приноса на налягането и сега е дивергентна (некомпресируемостта изисква тя да бъде дивергентна). Останалата част от оператора е необходима, за да ни доведе до следващата стъпка от време.

където
е някакъв скалар, който трябва да намерим, което води до различна свободна скорост. Можем да намерим
чрез разминаване в стъпката на корекция,

където първият член е нула, както се изисква от непрекъснатостта, като се получава a Уравнение на Поасон за скаларно поле, което ще осигури соленоидна (без дивергенти) скорост при следващата стъпка от време.

Както показват Ким и Мойн (1984),
не е точно налягането в резултат на разделянето на оператора, но може да се намери от
.
Към този момент в урока се справяме доста добре, временно дискритизирахме управляващите уравнения, за да можем да ги интегрираме. Сега трябва пространствено да дискриминираме операторите. Съществуват редица методи, с които бихме могли да постигнем това, Метод на крайните елементи , Метод с краен обем , и Метод с крайна разлика , например. В оригиналната работа на Kim and Moin’s (1984) те продължават с метода на крайната разлика. Методът е благоприятен поради относителната си простота и изчислителна ефективност, но страда от сложни геометрии, тъй като изисква структурирана мрежа .
Методът на крайните елементи (МКЕ) е удобен подбор поради своята обща характеристика и има някои много хубави проекти с отворен код, които помагат при използването му. По-специално той обработва реални геометрии в едно, две и три измерения, скали за много големи проблеми на клъстерите на машината и е сравнително лесен за използване за елементи от висок ред. Обикновено методът е по-бавен от трите, но ще ни даде най-много пробег при проблеми, така че ще го използваме тук.
Дори при прилагането на МКЕ има много възможности за избор. Тук ще използваме Galerkin FEM . По този начин ние хвърляме уравненията в претеглена остатъчна форма, като умножаваме всяка по тестова функция
за векторите и
за скаларното поле и интегриране в домейна
. След това извършваме частично интегриране на производни производни от висок ред, използвайки Теорема на Стоук или Теорема за дивергенцията . След това поставяме вариационния проблем, като даваме желаната схема за CFD.



Сега имаме хубава математическа схема в „удобна“ форма за изпълнение, надяваме се с известен усет за това, което е необходимо, за да се стигне дотам (много математика и методи от брилянтни изследователи, които в голяма степен копираме и ощипваме).