Commit d7b3e0e8 authored by Jean-Noël Grad's avatar Jean-Noël Grad
Browse files

Fix typos in comments and docstrings

parent 85cb8eeb
......@@ -1452,7 +1452,7 @@ int main( int argc, char **argv )
WALBERLA_LOG_INFO_ON_ROOT("Refreshing blockforest...")
// check refinement criterions and refine/coarsen if necessary
// check refinement criteria and refine/coarsen if necessary
uint_t stampBefore = blocks->getBlockForest().getModificationStamp();
blocks->refresh();
uint_t stampAfter = blocks->getBlockForest().getModificationStamp();
......@@ -2090,7 +2090,7 @@ int main( int argc, char **argv )
WALBERLA_LOG_INFO_ON_ROOT("Refreshing blockforest...")
// check refinement criterions and refine/coarsen if necessary
// check refinement criteria and refine/coarsen if necessary
uint_t stampBefore = blocks->getBlockForest().getModificationStamp();
blocks->refresh();
uint_t stampAfter = blocks->getBlockForest().getModificationStamp();
......
......@@ -929,7 +929,7 @@ int main( int argc, char **argv )
if( !useStaticRefinement && refinementCheckFrequency == 0 && numberOfLevels != 1 )
{
// determine check frequency automatically based on maximum admissable velocity and block sizes
// determine check frequency automatically based on maximum admissible velocity and block sizes
real_t uMax = real_t(0.1);
real_t refinementCheckFrequencyFinestLevel = ( overlap + real_c(blockSize) - real_t(2) * real_t(FieldGhostLayers) * dx) / uMax;
refinementCheckFrequency = uint_c( refinementCheckFrequencyFinestLevel / real_t(lbmTimeStepsPerTimeLoopIteration));
......@@ -1252,7 +1252,7 @@ int main( int argc, char **argv )
(*velocityCommunicationScheme)();
}
// check refinement criterions and refine/coarsen if necessary
// check refinement criteria and refine/coarsen if necessary
uint_t stampBefore = blocks->getBlockForest().getModificationStamp();
blocks->refresh();
uint_t stampAfter = blocks->getBlockForest().getModificationStamp();
......
......@@ -6,7 +6,7 @@ import os
class Parameter:
def __init__(self, name, type, defValue="", comment=""):
"""Propery of a data strcuture
"""Property of a data structure
Parameters
----------
......
......@@ -878,7 +878,7 @@ int main( int argc, char **argv )
real_t defaultOmegaBulk = lbm_mesapd_coupling::omegaBulkFromOmega(omega, real_t(1));
shared_ptr<OmegaBulkAdapter_T> omegaBulkAdapter = make_shared<OmegaBulkAdapter_T>(blocks, omegaBulkFieldID, accessor, defaultOmegaBulk, omegaBulk, adaptionLayerSize, sphereSelector);
timeloopAfterParticles.add() << Sweep( makeSharedSweep(omegaBulkAdapter), "Omega Bulk Adapter");
// initally adapt
// initially adapt
for (auto blockIt = blocks->begin(); blockIt != blocks->end(); ++blockIt) {
(*omegaBulkAdapter)(blockIt.get());
}
......
......@@ -843,7 +843,7 @@ int main( int argc, char **argv )
auto sphereShape = ss->create<mesa_pd::data::Sphere>( diameter * real_t(0.5) );
ss->shapes[sphereShape]->updateMassAndInertia(densityRatio);
std::mt19937 randomGenerator (static_cast<unsigned int>(2610)); // fixed seed: quasi-random and reproducable
std::mt19937 randomGenerator (static_cast<unsigned int>(2610)); // fixed seed: quasi-random and reproducible
for( uint_t nSed = 0; nSed < numberOfSediments; ++nSed )
{
......@@ -962,7 +962,7 @@ int main( int argc, char **argv )
if(currentPhase == 1)
{
// damp velocites to avoid too large ones
// damp velocities to avoid too large ones
ps->forEachParticle( useOpenMP, mesa_pd::kernel::SelectLocal(), *accessor,
[](const size_t idx, ParticleAccessor_T& ac){
ac.setLinearVelocity(idx, ac.getLinearVelocity(idx) * real_t(0.5));
......
......@@ -573,7 +573,7 @@ int main( int argc, char **argv )
if(maxPenetrationDepth < overlapLimit) break;
// reset velocites to avoid too large ones
// reset velocities to avoid too large ones
ps->forEachParticle( useOpenMP, mesa_pd::kernel::SelectLocal(), *accessor,
[](const size_t idx, ParticleAccessor_T& ac){
......
......@@ -6,7 +6,7 @@ import os
class Parameter:
def __init__(self, name, type, defValue=""):
"""Propery of a data strcuture
"""Property of a data structure
Parameters
----------
......
......@@ -1064,7 +1064,7 @@ void keepInflowOutflowAtTheSameLevel( std::vector< std::pair< const Block *, uin
uint_t maxInflowLevel( uint_t(0) );
uint_t maxOutflowLevel( uint_t(0) );
// In addtion to keeping in- and outflow blocks at the same level, this callback also
// In addition to keeping in- and outflow blocks at the same level, this callback also
// prevents these blocks from coarsening.
for( auto it = minTargetLevels.begin(); it != minTargetLevels.end(); ++it )
......@@ -2569,14 +2569,14 @@ void run( const shared_ptr< Config > & config, const LatticeModel_T & latticeMod
blockforest::DynamicDiffusionBalance< blockforest::NoPhantomData >( maxIterations, flowIterations ) );
}
// add callback functions which are executed after all block data was unpakced after the dynamic load balancing
// add callback functions which are executed after all block data was unpacked after the dynamic load balancing
// for blocks that have *not* migrated: store current flag field state (required for lbm::PostProcessing)
blockforest.addRefreshCallbackFunctionAfterBlockDataIsUnpacked( lbm::MarkerFieldGenerator< LatticeModel_T, field::FlagFieldEvaluationFilter<FlagField_T> >(
pdfFieldId, markerDataId, flagFieldFilter ) );
// (re)set boundaries = (re)initialize flag field for every block with respect to the new block structure (the size of neighbor blocks might have changed)
blockforest.addRefreshCallbackFunctionAfterBlockDataIsUnpacked( blockforest::BlockForest::RefreshCallbackWrappper( boundarySetter ) );
// treat boundary-fluid cell convertions
// treat boundary-fluid cell conversions
blockforest.addRefreshCallbackFunctionAfterBlockDataIsUnpacked( lbm::PostProcessing< LatticeModel_T, field::FlagFieldEvaluationFilter<FlagField_T> >(
pdfFieldId, markerDataId, flagFieldFilter ) );
// (re)set velocity field (velocity field data is not migrated!)
......
......@@ -295,7 +295,7 @@ class DummySweep
void emptyFunction() {}
//*******************************************************************************************************************
/*!\brief Simualtion of a strongly heterogeneous sized particulate flow system using combined resolved and unresolved
/*!\brief Simulation of a strongly heterogeneous sized particulate flow system using combined resolved and unresolved
* methods.
*
* For the coupling of resolved particles the Momentum Exchange Method (MEM) is used, whereas for the
......
......@@ -599,7 +599,7 @@ int main(int argc, char** argv) {
WALBERLA_CHECK(!(useCurlCriterion && useVorticityCriterion),
"Using curl and vorticity criterion together makes no sense.");
// create base dir if it doesnt already exist
// create base dir if it doesn't already exist
filesystem::path bpath(baseFolder);
if (!filesystem::exists(bpath)) {
filesystem::create_directory(bpath);
......
%% Cell type:code id: tags:
``` python
from pystencils.session import *
import sympy as sp
import numpy as np
import matplotlib.pyplot as plt
sp.init_printing()
```
%% Cell type:markdown id: tags:
### Code Generation for the Heat Equation
The <a target="_blank" href="https://en.wikipedia.org/wiki/Heat_equation">heat equation</a> which is a simple partial differential equation describing the flow of heat through a homogenous medium. We can write it as
$$
\frac{\partial u}{\partial t} =
\kappa \left(
\frac{\partial^2 u}{\partial x^2} +
\frac{\partial^2 u}{\partial y^2}
\right)
$$
where $\kappa$ is the medium's diffusion coefficient and $u(x, y, t)$ is the unknown temperature distribution at the coordinate $(x,y)$ at time $t$.
To discretize this equation using pystencils, we first need to define all the fields and other symbols involved.
%% Cell type:code id: tags:
``` python
u, u_tmp = ps.fields("u, u_tmp: [2D]", layout='fzyx')
kappa = sp.Symbol("kappa")
dx = sp.Symbol("dx")
dt = sp.Symbol("dt")
```
%% Cell type:markdown id: tags:
We define the PDE using the pystencils building blocks for transient and spatial derivatives. The definition is implicitly equalled to zero. We use `ps.fd.transient` for a first derivative by time and `ps.fd.diff` to express the second derivatives. `ps.fd.diff` takes a field and a list of spatial dimensions in which the field should be differentiated.
%% Cell type:code id: tags:
``` python
heat_pde = ps.fd.transient(u) - kappa * ( ps.fd.diff( u, 0, 0 ) + ps.fd.diff( u, 1, 1 ) )
heat_pde
```
%%%% Output: execute_result
![](data:image/png;base64,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)
$\displaystyle - \kappa \left({\partial_{0} {\partial_{0} {{u}_{(0,0)}}}} + {\partial_{1} {\partial_{1} {{u}_{(0,0)}}}}\right) + \partial_t u_{C}$
-κ⋅(D(D(u[0,0])) + D(D(u[0,0]))) + Transient(u_C)
%% Cell type:markdown id: tags:
Next, the PDE will be discretized. We use the `Discretization2ndOrder` class to apply finite differences discretization to the spatial components, and explicit euler discretization to the transient components.
%% Cell type:code id: tags:
``` python
discretize = ps.fd.Discretization2ndOrder(dx=dx, dt=dt)
heat_pde_discretized = discretize(heat_pde)
heat_pde_discretized
```
%%%% Output: execute_result
![](data:image/png;base64,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)
$\displaystyle {{u}_{(0,0)}} + dt \kappa \left(\frac{- 2 {{u}_{(0,0)}} + {{u}_{(1,0)}} + {{u}_{(-1,0)}}}{dx^{2}} + \frac{- 2 {{u}_{(0,0)}} + {{u}_{(0,1)}} + {{u}_{(0,-1)}}}{dx^{2}}\right)$
⎛-2⋅u_C + u_E + u_W -2⋅u_C + u_N + u_S⎞
u_C + dt⋅κ⋅⎜────────────────── + ──────────────────⎟
⎜ 2 2 ⎟
⎝ dx dx ⎠
%% Cell type:markdown id: tags:
It occurs to us that the right-hand summand can be simplified.
%% Cell type:code id: tags:
``` python
heat_pde_discretized.simplify()
```
%%%% Output: execute_result
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAiUAAAAvCAYAAAA8abqkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAQJElEQVR4Ae2d6ZHVOBeGL1QH0AwZMBnAEMHXZMAMEQAZDMUv5h8FGQARsGQAEwFLBpABTGfQ3/uoLbft60WWr+/mV1VqW/vRo3OtY1l2X7u4uFjZdRP4559/TpX6tMhxqzg+VPx5d6nlpYjHI/X6h46fltd799gETMAETGCIgOaHV/KP+/Jd70t0WiDwQhCfFP5PxfyS/2o2VwTE5r5Cd3S0QXKFxWcmYAImYAJ1AsynH+tR9ZCNkjqPttAjQTyrJLzQ+S3F3a7ELfZUHMJKko691u9iAbnjJmACJmACgYDmiR86ea/j311IbJR0kbmKZ7L9chX0WYPAe4VfNeIcNAETMAETMIE1AjJIXivysY7c0K65k7WYI4pQp1nNeCPPXpB3Co++my8AVqlQB3snvlUjd3W+iT7myq624fqHjvdy60gtV/QTRR49hqltOJ8JmIAJmMBWCHAjy9zMloiaO+qVEk1g3+TvqMdYZL3PsWpUOgLFxBj2T3Rk2Xp0Xx+Vdir/XR7jYQ73RJVi9W7DsSLz2zYachsmYAImYAKzEmDeuM8c1WzlqI0SOqtOx/0gkzZhFhM7+0nY0HneBJkSRhZ53lLZqKPeosJmH4nHIGFz7hyOvkw29oYEU/86nz8OlT2W9Ll051j40A8z6h9N8+nnk5tqruPJiRlzKE8b/mqWPurHN0VnebTA45YsQ4I6VJaJnTdwwmOKIkw8m3bGOKxC/KZdVx+74ie3r77Hjb6z7rcp2mHsssdvcmf3o4K5dGc/ercZKcyon6P59PPJTTXXPHLMHTy+qa22H/1KiTrMakFzBUFRaU6TIgYJz794v/p2MUny2GKu1Yc0weq5uvpI/Id61suQ+sEPaYqj7knGXmLjDyRrTWkTyzmbCZiACZjA/hL4LtH+aIp3QkQxQbEU/7v81+YkoDDP8/f+g2GSEwOCRyysYPyUxxjhjv65fOkq/SXurvxDeco+kMd9Vp44mfNNEibw2rdJlL6TDZdDfVQ6xgKyITN9wpBi/OjTSx2j+1fhtzFOR/LzkTj04HmMj5lbjnA7b4nfWJRk4LFN55s9hcwHr7cbA9ZRkTl1gCmizaefD6lmNMwoJ8fCufL4hn2P+HIuuV6AfKpIJiz2BzCpl07xXPTZkFIWKhN1onjSmPxmcao7aT+B8jEZYzjED53Rn9iX5koJH3B5iVeez/LsAj5TmBUQJudYbqW4G/LXml55tu4kw2AfleeTPEtiYTLX+T3C8qVBonP6iLGGUqwU5pxne5RhSa3JS1FrjjpmWy2STOjUuY59j8j2Vm+hJdmTdJe8M7u95bQnjMxnWAH3ltGw6Os59kTvEGzJXOP8UbMfTjQ4TEhMzDj2IMSMIaKIC5NXjIhHlcVgYQm/nDh0Hid0VipuKsxE3+v6yigN4+GVfOfKhNKYIFkNwCApZVGYc97AOdcxOJ0jc5SRONJ4o4bVEtxv8tX0ELnrP2P6WMjKWLaOm+IxQFaqEwOGvjP5x0cklEtxcKqyTikzJg+v/3bqjtJ2rrd0RnJEXVnTd6UN6u4YIDl5Z+DEbw39YXx4s23Q7TOjGfh06kMXKMnQyVRpx6hDoxl1seuLXxrXPhZdaX2Mesp0jt9IfY3zMnNJ6Xh8U/3mBheb2qMOhbk7b8atis6Eu3ClB6c4JvyfCEaEjmfyH+U7JzqlpZThC3Dhc++hofU/QGIJKE6sMQeyx8cwMe6L8lUnUy6speGiNFYZJjnVwYoDbTddgK/0NgMLGfraHtNH2m3re5SH8cAQYWUsro7EtNQjF9KmARvKql7S/pXnmOpYzQlGlI7oRFjp6Sm8U71FrkLOIX0f0t1aF1XnpnVnk5wwBKNeJ43tATDaJJ+Ua1lzvFOYHpMOjWZUA5YYkN4timsillq2REbNMinjl6qvrfPHiQQ7p1UdudhwoSkndsWxrEJc23I+k2Rz4iDuf/LBqTx34hglfJa9agjELBwHyxT1YJRgeAR5qxXoHGOqJiN5FYf8tVdWFd9cPWgzxFQs36mNNqNjpXhWJWBRPkoZ0cqYPrb2vdIWY/1OntUlGLG/hPEZs2+IcQhGlo41p7pIS7qLrhVUQGWDzhXyNJPLcNEG+Xelt8iyCd0t+8SJ+rNR3VF9jAX1TuakOvjtYDyjx6lurxmpLxvjIyCDfW1CS2GqPFxH+65/tWqVd291KIdRrXOJgQVyTSRzlS2F0VXu8mxQx1Vvqr7G+aNmnFwvm7p8NYe7hvAjLeLDxacQvpI1nJ7ReIzUeZhMFG4aH9SH1brmRpahLS6sNac6ThWBrxkfCjOJr5Reyki46pQWL9Tlagr14av5dn1eyDOmj4GTypV9j33SMY4T1izK81oeA4IyWMHBKW5XDJDvrtpHvtIrLtz5FHH8MKJjdWmrekvDkiNyTNH3Vt2NHdjScRKnHBkPjNEkPiP7moPz4HVoC4wWyTWn0zllRo5fir7GOea8Ks9JJcBFtrmKwDJ/mNgkEBPWOx1Z9idvrSKFYwM6rTmsoGgR1RIUGFOGfS/IUxoQjcqakwN5Q38kL8YV58jC6gB3HfSLOwr6Uy3LxqPOvQzKv0tXlRM51vpY9KWMJ5Pi6D9lYbBmsCiu5pSfsYZPc4yr+aiva/yq+Uadq23aDTpXLaj4/4jXsfmIaxd6i2hdfUfHmvo+pLvUN7ebyilHvkNiNJXPmL7msDwGHZqb0VK55vQ7p8yY8UvR13id5JpZuuvlWWOFQxd/7kz/kGciw/2uuPPL0xU/4FpFRXzbgYa7OtOWn7i2MrRNuzVXyMQkVqYpjkkY+XmTBMfeFyZRJmT8L4WRqdYHxZEGzL1ykou+p/YR2eEXDJiinzwyiuOIwbI26VNILpTRkbGO5yGh5Q+c0I9tOcYL33Q1OSU3474rvUW2ZN1tdmTm8FyccsTeR0Zz8Wnraw4zrgHlNS6ngg2U2XdGOV08Zq45PHLKtOl4Clf0mUUB8pbupDzTmys6f6MMLI3zJgEKyLI+qwp/6/hWPrpTndQqaglX89aUOSaMLFMzICp1cMrdM7Ij5015ZGXyjbLHvS9MxuyZwfhYKT9vELDnhXReJ8ZY6VqJocguXWofkZGx5I2l8DhGx+oeFsYu8iBvdA91wofK7urYlh7zxSNGTnjUpTJNXYh5Jh9VN7LEi/GZwu8V/qxj7NMu9JZ+dfUZvk1979Nd6tqGm8opR8ZDYjSVz5i+5rA8Bh3KYqTf+m0Bqz6y7eLH9bz52+vKG+OPgetqZkaR1ZjxS+GKfbF2g1waJeoUDTaXxhGmLY6BPyUxOpShqIMJ5FuML47NcIgeWYZ6WxUuVfYiX20TmOIwQvbVECnwBQMqeXzgqoIYZWtOaV3xozioHh6lIBOrEmuKtdZwZoTaqI1Xs5pChjYdbYvbiN4ig9odo++dutvsz1zhqZxy5DokRlP5jOxrDs6D16FcRirH/NF63coB2Shz8Fzpz8yMArKR45fClblj7Qb4emht5J8CAI023XNFhFUIEpSP8w90pghzZ920eHvLUK5wtMdnaQ/ZMYnjj8XxBs9cF4uNM5LucXEbrbcIorK71t2t6U4Pp94xWQqjHj6917IOPr1MK4mbuP7tgw7NyaiCK/n0WLgmdzg1Y4e+9o5fpe5ertStvKyAMYfU3LWLi4taRGpAlfK2y9pymeKj0cEjID5bzwfNwkSsI0Lw/QpePS1XJ/rKKG9wytPaXkz3cfsE4njqeGP7ree12KVHiu/UW1pS+qJ0t42T4rjQPJbnZgMePEKrfqdlMYza+IjFSvGdeqS0NT6K62VKnTjlO7jrX5fMih/F6JLAuL9qY3FcxxEKOtXLSAzX9JU2+sYvyqA8vfqqdLYW1L5zFsuuMEpy/LNnz87kX2SWvT+mnNo5lf84pozz5o3rWG4al/fyo8ZzbBubzC9Zs/UWOcb2VfkPUnencFoCI/MZvr5sk1HONULyLe63mclp1PU9havyfJe/1SbP9dI6GXkiS4d9BCxpY20lO+XnLmvsHgQsa+7Q7PaPwEOJ9HT/xGqXKFdvqW1JupvLaSmMzKf991WN3TKjatOp5wc5r+RyTYVSzTfH71l1skrCixite0SzjRIEV6UYCjzC4flQquP11PA4J6WA8tIBPqLV2oGUOpxnPgLFWD7XMS7JztfYhmqWrDl6S+uL0t1MTothZD7DP8htMBqWYj2H5DroeSWT6zqI4ZiN/p4lN4sYtX8QuyZC2/LJ2DiWa8aWSc0/Z92pMjhf0lLtI43V2SGxmlu35q5/W6zn7MecdZvP8O/2GBjl9OEY9I5+71s/huRR+quhPNkbXdesG0eYgAmYgAmYgAmYwAQCkx7fTGjXRU3ABEzABEzABEygRuCallLy3gmuVeOACZiACZiACZiACUwj4Mc30/i5tAmYgAmYgAmYwIYI+PHNhkC6GhMwARMwARMwgWkEbJRM4+fSJmACJmACJmACGyJwsqF6XI0JmIAJ9BLQNwr4nlH80B7fK8DxLyeSv1t0WcR/TcAEjpWAjZJjHVn3ywT2j8CL4qNPQTKd8x9Cv8rzP7LsTMAETGDlxzdWAhMwgUECMiBuy3+V/68wJgbLtGR4pLL8m4no+AowX4zkH3/ZmYAJmMDKKyVWAhMwgUECMhy+KdMdHfmEAP8BNMfxef8vOQVdxgRMYBkEbJQsY5zdSxOYTKCyyjH2H2qGtlX+dUMIjJQfhcHTSHLQBExgiQT8+GaJo+4+m0AegXsqhhExeWOq6uCRzX35O3miuJQJmMAxErBRcoyj6j6ZwDwE2A+StUpSFUcGCW/esJ+Ex0GTDZxq3T43ARM4bAJ+fHPY42fpTWAWAhXD4Yca+CmPMcLqxnP50ikfr/nyb+Bxd+UfymN0PJDHfVaeD5enq1VR7xMdWXWJYY60Y2cCJrBwAjZKFq4A7r4JNAnIQGBF5L08KxnBWNAxbm5trpSUr/kqz98q80YeQwTDg1d+WREJRonCGCvEkRbfuGFfyRN5OxMwARPw2zfWARMwgSsCMhZY+cAgwXCorl5w/k1x5eMWnbNCgtERHWnsE2G1BPebfDWdb5JQP8fSqR4MEzsTMAETsFFiHTABE6gRwIg4laHQfFOG1ZPyMUxR4ovyVQ0XNq2WhovS/izyhYPCN6phn5uACZhAk4A3ujaJOGwCyybwl7pfe0QjY4LVDR69xEc4gZDi+XZJ1VH2bTXC5yZgAiYwhoCNkjG0nNcEjphAYXxggNSMD4UxNlZKrxkrxEWnNFZSKFuuplAfPubx0QRMwASGCHij6xAhp5vA8ghUH8nQe96UCasiMjLYM8L5L3n2nrDRFWOFfSHnOq+WfaqwN7EKjJ0JmEAaAa+UpHFyLhM4egIyIM7VSQwMHtUEpziMEN6U+XIZs7pXGB6sjOB/KcxqCEZK6RRH2ucywicmYAImkEDg2sUF/8rCzgRMwATCIxoMjPBar4435dkjgrHCBliMjE8yONjMSj7ivsuvFH4pjwHDqgpv12CslI9yFLYzARMwgUEC/weXMZOqdFgFVAAAAABJRU5ErkJggg==)
$\displaystyle \frac{{{u}_{(0,0)}} dx^{2} + dt \kappa \left(- 4 {{u}_{(0,0)}} + {{u}_{(1,0)}} + {{u}_{(0,1)}} + {{u}_{(0,-1)}} + {{u}_{(-1,0)}}\right)}{dx^{2}}$
2
u_C⋅dx + dt⋅κ⋅(-4⋅u_C + u_E + u_N + u_S + u_W)
───────────────────────────────────────────────
2
dx
%% Cell type:markdown id: tags:
While combining the two fractions on the right as desired, it also put everything above a common denominator. If we generated the kernel from this, we'd be redundantly multiplying $u_{(0,0)}$ by $dx^2$. Let's try something else. Instead of applying `simplify` to the entire equation, we could apply it only to the second summand.
The outermost operation of `heat_pde_discretized` is a $+$, so `heat_pde_discretized` is an instance of `sp.Sum`. We take it apart by accessing its arguments, simplify the right hand summand, and put it back together again.
%% Cell type:code id: tags:
``` python
heat_pde_discretized = heat_pde_discretized.args[1] + heat_pde_discretized.args[0].simplify()
heat_pde_discretized
```
%%%% Output: execute_result
![](data:image/png;base64,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)
$\displaystyle {{u}_{(0,0)}} + \frac{dt \kappa \left(- 4 {{u}_{(0,0)}} + {{u}_{(1,0)}} + {{u}_{(0,1)}} + {{u}_{(0,-1)}} + {{u}_{(-1,0)}}\right)}{dx^{2}}$
dt⋅κ⋅(-4⋅u_C + u_E + u_N + u_S + u_W)
u_C + ─────────────────────────────────────
2
dx
%% Cell type:markdown id: tags:
That looks a lot better! There is nothing left to simplify. The right-hand summand still contains a division by $dx^2$, though. Due to their inefficiency, floating-point divisions should be replaced by multiplication with their reciprocals. Before we can eliminate the division, we need to wrap the equation inside an `AssignmentCollection`. On this collection we can apply `add_subexpressions_for_divisions` to replace the division by a factor $\xi_1 = \frac{1}{dx^2}$ which in the kernel will be computed ahead of the loop.
%% Cell type:code id: tags:
``` python
@ps.kernel
def update():
u_tmp.center @= heat_pde_discretized
ac = ps.AssignmentCollection(update)
ac = ps.simp.simplifications.add_subexpressions_for_divisions(ac)
ac
```
%%%% Output: execute_result
AssignmentCollection: u_tmp_C, <- f(u_S, u_N, u_E, u_W, dt, u_C, kappa, dx)
%% Cell type:markdown id: tags:
Our numeric solver's symbolic representation is now complete! Next, we use pystencils to generate and compile a C implementation of our kernel. The code is generated as shown below, compiled into a shared libary and then bound to `kernel_func`. All unbound sympy symbols (`dx`, `dt` and `kappa`) as well as the fields `u` and `u_tmp` are arguments to the generated kernel function.
Our numeric solver's symbolic representation is now complete! Next, we use pystencils to generate and compile a C implementation of our kernel. The code is generated as shown below, compiled into a shared library and then bound to `kernel_func`. All unbound sympy symbols (`dx`, `dt` and `kappa`) as well as the fields `u` and `u_tmp` are arguments to the generated kernel function.
%% Cell type:code id: tags:
``` python
kernel_ast = ps.create_kernel(update, cpu_openmp = 4)
kernel_func = kernel_ast.compile()
ps.show_code(kernel_ast)
```
%%%% Output: display_data
%%%% Output: display_data
%% Cell type:markdown id: tags:
### Prototype Simulation
We can set up and run a simple simulation wich the generated kernel right here. The first step is to set up the fields and simulation parameters.
We can set up and run a simple simulation with the generated kernel right here. The first step is to set up the fields and simulation parameters.
%% Cell type:code id: tags:
``` python
domain_size = 1.0
cells = 25
delta_x = domain_size / cells
delta_t = 0.0001
kappa_v = 1.0
u = np.zeros((cells, cells))
u_tmp = np.zeros_like(u)
```
%% Cell type:markdown id: tags:
We also need the Dirichlet and Neumann Boundaries.
%% Cell type:code id: tags:
``` python
def f(x):
return (1 + np.sin(2 * np.pi * x) * x**2)
def init_domain(domain, domain_tmp):
domain.fill(0)
domain_tmp.fill(0)
domain[:,-1] = f( np.linspace(0, 1, domain.shape[0]) )
domain_tmp[:,-1] = f( np.linspace(0, 1, domain_tmp.shape[0]) )
return domain, domain_tmp
def neumann(domain):
domain[0,:] = domain[1, :]
domain[-1,:] = domain[-2,:]
domain[:,0] = domain[:,1]
return domain
```
%% Cell type:markdown id: tags:
After application of the Dirichlet boundary condition, this is our initial situation. In waLBerla, the domain edges would be ghost layers.
%% Cell type:code id: tags:
``` python
init_domain(u, u_tmp)
ps.plot.scalar_field_surface(u)
```
%%%% Output: execute_result
<mpl_toolkits.mplot3d.art3d.Poly3DCollection at 0x7ffb64712510>
%%%% Output: display_data
![](data:image/png;base64,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)
%% Cell type:markdown id: tags:
Finally, define the loop function.
%% Cell type:code id: tags:
``` python
def loop(steps = 5):
global u, u_tmp
for _ in range(steps):
neumann(u)
kernel_func(u=u, u_tmp=u_tmp, dx=delta_x, dt=delta_t, kappa=kappa_v)
u, u_tmp = u_tmp, u
return u
```
%% Cell type:code id: tags:
``` python
200 * 100 * delta_t
```
%%%% Output: execute_result
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAOCAYAAADaOrdAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABoklEQVQ4EZWUMVLDMBBFHcgBMuYGSUsFpPcM5gbAEeAIKeM2lHShpGNISUcKF0kF+AYxJwjxDcz7GssTZNnAzuysdvdrv6SV1CvLMkiSZBgEwQSVnKFf6IR4psBfBOyswm2xI3RGLFfsEBXBnMB1FEUv6EOapsfEHrFrfAPEbxXmfpB8wt6DXzNvhb/Cqt7uAEcruEVrAaxdFehzHWwZgL0hNcAuLISx5sqfKyaSGN2QGCiwJ0vGmqyddskVSd+xvhGPVVckKpZX7Awb4pK7AC1SPXTFHnPcp7hW4pMTBcn7Vmnw5H5bgHChdtIQJotAx2RvXANTBcLKqgdtYo7Ll1TDF5Dd+ZL/jB01dkJh3Qj1qO0Y9zl8vbB5u8vtDxIK6zqG2AuL7LLg7DH5emNjeU3ChEsKjrD1DhgPpV1E5HQ7fRi7k6UhoZAaPca6jRZx15GQNg9WX5ErpwQyaha96XSqVbyiWpErekz6hwKstr9DNVEFasHf4OivM6++wn4SO2ec9RmIQETqhyv1GwFcoHpg7y4IX6T6EMdYfZCyhgAbfAMYcZVxKCASawAAAABJRU5ErkJggg==)
$\displaystyle 2.0$
2.0
%% Cell type:markdown id: tags:
Not only can we run the kernel, we can even view the results as a video! This is a useful tool for debugging and testing the solver before introducing it into a larger application. We can view the simulation animated both as a colorful 2D plot or as a 3D surface plot.
The total time interval being simulated is two seconds (100 frames à 200 steps à 0.1 milliseconds).
%% Cell type:code id: tags:
``` python
init_domain(u, u_tmp)
anim = ps.plot.scalar_field_animation(lambda : loop(200), frames = 100, rescale = False)
result = ps.jupyter.display_as_html_video(anim)
result
```
%%%% Output: execute_result
<IPython.core.display.HTML object>
%% Cell type:code id: tags:
``` python
init_domain(u, u_tmp)
anim = ps.plot.surface_plot_animation(lambda : loop(200), frames = 100)
result = ps.jupyter.display_as_html_video(anim)
result
```
%%%% Output: execute_result
<IPython.core.display.HTML object>
......
......@@ -130,7 +130,7 @@ CommScheme communication( blocks );
communication.addDataToCommunicate( make_shared<field::communication::UniformMPIDatatypeInfo<GPUField> > (gpuFieldSrcID) );
\endcode
This scheme also supports heterogenous simulations, i.e. using a CPU field on
This scheme also supports heterogeneous simulations, i.e. using a CPU field on
some processes and a GPU field on other processes.
*/
......
......@@ -90,7 +90,7 @@ A lattice model defines the basic ingredients needed for an LBM simulation:
- **collision model**: The first template parameter for a lattice model is a collision model.
The collision or relaxation model defines which method to use in the collide step. Here, we use the single relaxation time
model (SRT) also called BGK model: lbm::collision_model::SRT. For other options, see the file lbm/lattice_model/CollisionModel.h
- There are further template parameters specifing compressibility, force model, etc.
- There are further template parameters specifying compressibility, force model, etc.
These arguments have default parameters which we use here.
For a more detailed description of lattice models, see lbm::LatticeModelBase
......@@ -151,7 +151,7 @@ boundary::BoundaryHandling. Otherwise the `near boundary` and `domain` flags are
The boundary handling is a heavily templated part of waLBerla since it contains performance critical code
and at the same time has to be very flexible, i.e., it should be easy to write new boundary conditions.
By using template concepts (compile-time polymorphism) instead of inheritence (runtime polymorphism) the compiler is able to
By using template concepts (compile-time polymorphism) instead of inheritance (runtime polymorphism) the compiler is able to
resolve all function calls at compile time and can do optimizations like function inlining.
To make setting up a boundary handling easier, a convenience factory class lbm::DefaultBoundaryHandlingFactory exists
that creates a boundary::BoundaryHandling with six often used boundary conditions. Together with the `near boundary` and
......@@ -268,7 +268,7 @@ timeloop.addFuncAfterTimeStep( makeSharedFunctor( field::makeStabilityChecker< P
"LBM stability check" );
\endcode
Additionally, a small functor is scheduled that periodically prints the estimated remaining time of the simultion:
Additionally, a small functor is scheduled that periodically prints the estimated remaining time of the simulation:
\code
timeloop.addFuncAfterTimeStep( timing::RemainingTimeLogger( timeloop.getNrOfTimeSteps(), remainingTimeLoggerFrequency ),
......
......@@ -7,7 +7,7 @@ namespace walberla {
\section tutorial05_overview Overview
The aim of this tutorial is to show how to build and solve the backward-facing step model using lattice Boltzman method in waLBerla.
The aim of this tutorial is to show how to build and solve the backward-facing step model using lattice Boltzmann method in waLBerla.
The "01_BasicLBM" case is used as the foundation of the current work. Therefore, most of the functionalities have already been introduced and discussed in LBM 1 tutorial.
Here the main focus is on the following areas:
......@@ -54,13 +54,13 @@ Finally, viscosity consequently **omega** are calculated with the Reynolds numbe
\section tutorial05_geometry Geometry
Since the step geometry is a plain rectangular area, the simplest approach is to create it by geometry module in walberla.
This module offers capability to read boundaries of a random geometry from images, voxel files, coordinates of verticies, etc.
This module offers capability to read boundaries of a random geometry from images, voxel files, coordinates of vertices, etc.
Using this module, obstacles of basic shapes could be conveniently positioned inside the domain.
It is also easier to have the program to read the geometry specifications from the Boundaries section of the configuration file.
This is implemented by reading and storing the Boundaries block of the configuration file in 'boundariesConfig' object and passing it to a convenience function provided in the geometry class to initialize the boundaries.
\snippet 05_BackwardFacingStep.cpp geomboundary
Here a subblock 'Body' is created inside 'Boundaries' section in the configuration file in order to create a box (rectangle in 2D) using two diagonal verticies.
Here a subblock 'Body' is created inside 'Boundaries' section in the configuration file in order to create a box (rectangle in 2D) using two diagonal vertices.
\snippet 05_BackwardFacingStep.prm geometry
......@@ -77,7 +77,7 @@ This mechanism is implemented by a functor named `ReattachmentLengthFinder` and
After running the program, the locations of reattachment against timestep are written to 'ReattachmentLengthLogging_Re_[Re].txt' in the working directory.
Note that there might be more than one reattachment location before the flow fully develops along the channel, and all are given in the file.
This simply means that it is expected to have multiple occurances of seperation and reattachment at the same time along the bottom boundary of the channel following the step in the early stages.
This simply means that it is expected to have multiple occurences of seperation and reattachment at the same time along the bottom boundary of the channel following the step in the early stages.
However, most of them are smeared later as the flow starts to develop.
The logging frequency can also be adjusted by 'checkFrequency' which is passed to the `ReattachmentLengthFinder` functor.
......
......@@ -57,7 +57,7 @@ void initBC( const shared_ptr< StructuredBlockStorage > & blocks, const BlockDat
auto src = block->getData< ScalarField >( srcID );
auto dst = block->getData< ScalarField >( dstID );
// obtain a CellInterval object that holds information about the number of cells in x,y,z direction of the field inlcuding ghost layers
// obtain a CellInterval object that holds information about the number of cells in x,y,z direction of the field including ghost layers
// Since src and dst have the same size, one object is enough.
CellInterval xyz = src->xyzSizeWithGhostLayer();
......
......@@ -243,7 +243,7 @@ class QMapPrinter:
ret += gdb.lookup_type('void').pointer().sizeof
# but because of data alignment the value can be higher
# so guess it's aliged by sizeof(void*)
# so guess it's aligned by sizeof(void*)
# TODO: find a real solution for this problem
ret += ret % gdb.lookup_type('void').pointer().sizeof
......@@ -494,7 +494,7 @@ class QUrlPrinter:
return self.val['d']['encodedOriginal']
except RuntimeError as error:
print(error)
# if no debug information is avaliable for Qt, try guessing the correct address for encodedOriginal
# if no debug information is available for Qt, try guessing the correct address for encodedOriginal
# problem with this is that if QUrlPrivate members get changed, this fails
offset = gdb.lookup_type('int').sizeof
offset += offset % gdb.lookup_type('void').pointer().sizeof # alignment
......
......@@ -11,7 +11,7 @@
# The checksum is used as an index in a different array. If an item with that index already exists the suppression must be a duplicate and is discarded.
BEGIN { suppression=0; md5sum = "md5sum" }