summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lbm.org26
-rw-r--r--tangle/magnus.cu13
2 files changed, 25 insertions, 14 deletions
diff --git a/lbm.org b/lbm.org
index dcd20ab..95fb004 100644
--- a/lbm.org
+++ b/lbm.org
@@ -5257,7 +5257,7 @@ After setting up the lattice we define the relaxation time for the BGK collision
bulk and the desired rotation and inflow velocities.
#+BEGIN_SRC cpp :tangle tangle/magnus.cu
-const float tau = 0.54;
+const float tau = 0.52;
const float u_inflow = 0.02;
const float u_rotate = 0.08;
#+END_SRC
@@ -5363,7 +5363,9 @@ renderSliceViewToTexture<<<
dim3(cuboid.nX / 32 + 1, cuboid.nY / 32 + 1),
dim3(32,32)
>>>(cuboid.nX, cuboid.nY,
- slice,
+ [cuboid] __device__ (int iX, int iY) -> std::size_t {
+ return descriptor::gid(cuboid,iX,cuboid.nY-1-iY);
+ },
[u,u_rotate] __device__ (std::size_t gid) -> float {
return length(make_float2(u[2*gid+0], u[2*gid+1])) / u_rotate;
},
@@ -5373,21 +5375,27 @@ renderSliceViewToTexture<<<
window.getRenderSurface());
#+END_SRC
+The render target is provided by our =RenderWindow= class. We also need
+variables for storing the colormap and buffers for storing the computed
+moments.
+
#+BEGIN_SRC cpp :tangle tangle/magnus.cu
RenderWindow window("Magnus");
cudaSurfaceObject_t colormap;
ColorPalette palette(colormap);
-auto slice = [cuboid] __device__ (int iX, int iY) -> std::size_t {
- return descriptor::gid(cuboid,iX,cuboid.nY-1-iY);
- };
DeviceBuffer<T> moments_rho(cuboid.volume);
DeviceBuffer<T> moments_u(2*cuboid.volume);
T* u = moments_u.device();
-std::size_t iStep = 0;
+#+END_SRC
+Finally we run the simulation as long as the window is open
+while periodically calling the visualization code.
+
+#+BEGIN_SRC cpp :tangle tangle/magnus.cu
+std::size_t iStep = 0;
while (window.isOpen()) {
<<magnus-simulation-step>>
- if (iStep % 100 == 0) {
+ if (iStep % 200 == 0) {
cudaDeviceSynchronize();
<<magnus-visualization-step>>
window.draw([&]() {
@@ -5401,6 +5409,10 @@ while (window.isOpen()) {
}
#+END_SRC
+#+BEGIN_EXPORT html
+<video style="width:100%" src="https://literatelb.org/media/magnus.webm" playsinline muted controls loop/>
+#+END_EXPORT
+
** Flow around a Sphere
This example models a channel flow around a spherical obstacle.
diff --git a/tangle/magnus.cu b/tangle/magnus.cu
index aa31ba1..5800cd8 100644
--- a/tangle/magnus.cu
+++ b/tangle/magnus.cu
@@ -18,7 +18,7 @@ cudaSetDevice(0);
const descriptor::Cuboid<DESCRIPTOR> cuboid(1200, 500);
Lattice<DESCRIPTOR,T> lattice(cuboid);
-const float tau = 0.54;
+const float tau = 0.52;
const float u_inflow = 0.02;
const float u_rotate = 0.08;
@@ -74,14 +74,11 @@ cudaDeviceSynchronize();
RenderWindow window("Magnus");
cudaSurfaceObject_t colormap;
ColorPalette palette(colormap);
-auto slice = [cuboid] __device__ (int iX, int iY) -> std::size_t {
- return descriptor::gid(cuboid,iX,cuboid.nY-1-iY);
- };
DeviceBuffer<T> moments_rho(cuboid.volume);
DeviceBuffer<T> moments_u(2*cuboid.volume);
T* u = moments_u.device();
-std::size_t iStep = 0;
+std::size_t iStep = 0;
while (window.isOpen()) {
lattice.apply(Operator(BgkCollideO(), bulk_mask, tau),
Operator(BounceBackFreeSlipO(), wall_mask, WallNormal<0,1>()),
@@ -90,14 +87,16 @@ while (window.isOpen()) {
Operator(BounceBackO(), edge_mask));
lattice.apply<BouzidiO>(bouzidi.getCount(), bouzidi.getConfig());
lattice.stream();
- if (iStep % 100 == 0) {
+ if (iStep % 200 == 0) {
cudaDeviceSynchronize();
lattice.inspect<CollectMomentsF>(bulk_mask, moments_rho.device(), moments_u.device());
renderSliceViewToTexture<<<
dim3(cuboid.nX / 32 + 1, cuboid.nY / 32 + 1),
dim3(32,32)
>>>(cuboid.nX, cuboid.nY,
- slice,
+ [cuboid] __device__ (int iX, int iY) -> std::size_t {
+ return descriptor::gid(cuboid,iX,cuboid.nY-1-iY);
+ },
[u,u_rotate] __device__ (std::size_t gid) -> float {
return length(make_float2(u[2*gid+0], u[2*gid+1])) / u_rotate;
},