diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..d0e7142f Binary files /dev/null and b/.DS_Store differ diff --git a/README.md b/README.md index fe548354..a2d7303b 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,29 @@ The code used in this exercise is based on [Chapter 7 of the book "Learning Scie ## Project description +This code solves the diffusion equation in 2D over a square domain which is at a certain temperature and a circular disc at the center which is at a higher temperature. This code solves the diffusion equation using the Finite Difference Method. The thermal diffusivity and initial conditions of the system can be changed by the user. The code produces four plots at various timepoints of the simulation. The diffusion process can be clearly observed in these plots. + ## Installing the package ### Using pip3 to install from PyPI +pip install -i https://test.pypi.org/simple/ sashanje-diffusion2d --extra-index-url https://pypi.org/simple ### Required dependencies +matplotlib +numpy ## Running this package +```python +from sashanje_diffusion2d import diffusion2d + +diffusion2d.solve( + dx = 0.1, # intervals in x- direction, mm + dy = 0.1, # intervals in y- direction, mm + D = 4 # Thermal diffusivity of steel, mm^2/s + ) +``` + ## Citing +Forked from https://github.com/Simulation-Software-Engineering/diffusion2D +[pypi_exercise.md](https://github.com/Simulation-Software-Engineering/Lecture-Material/blob/main/03_building_and_packaging/pypi_exercise.md) diff --git a/__pycache__/diffusion2d.cpython-312.pyc b/__pycache__/diffusion2d.cpython-312.pyc new file mode 100644 index 00000000..e3650eff Binary files /dev/null and b/__pycache__/diffusion2d.cpython-312.pyc differ diff --git a/__pycache__/output.cpython-312.pyc b/__pycache__/output.cpython-312.pyc new file mode 100644 index 00000000..40ad9c07 Binary files /dev/null and b/__pycache__/output.cpython-312.pyc differ diff --git a/diffusion2d.py b/diffusion2d.py deleted file mode 100644 index c0c6083a..00000000 --- a/diffusion2d.py +++ /dev/null @@ -1,81 +0,0 @@ -""" -Solving the two-dimensional diffusion equation - -Example acquired from https://scipython.com/book/chapter-7-matplotlib/examples/the-two-dimensional-diffusion-equation/ -""" - -import numpy as np -import matplotlib.pyplot as plt - -# plate size, mm -w = h = 10. -# intervals in x-, y- directions, mm -dx = dy = 0.1 -# Thermal diffusivity of steel, mm^2/s -D = 4. - -# Initial cold temperature of square domain -T_cold = 300 - -# Initial hot temperature of circular disc at the center -T_hot = 700 - -# Number of discrete mesh points in X and Y directions -nx, ny = int(w / dx), int(h / dy) - -# Computing a stable time step -dx2, dy2 = dx * dx, dy * dy -dt = dx2 * dy2 / (2 * D * (dx2 + dy2)) - -print("dt = {}".format(dt)) - -u0 = T_cold * np.ones((nx, ny)) -u = u0.copy() - -# Initial conditions - circle of radius r centred at (cx,cy) (mm) -r = min(h, w) / 4.0 -cx = w / 2.0 -cy = h / 2.0 -r2 = r ** 2 -for i in range(nx): - for j in range(ny): - p2 = (i * dx - cx) ** 2 + (j * dy - cy) ** 2 - if p2 < r2: - u0[i, j] = T_hot - - -def do_timestep(u_nm1, u, D, dt, dx2, dy2): - # Propagate with forward-difference in time, central-difference in space - u[1:-1, 1:-1] = u_nm1[1:-1, 1:-1] + D * dt * ( - (u_nm1[2:, 1:-1] - 2 * u_nm1[1:-1, 1:-1] + u_nm1[:-2, 1:-1]) / dx2 - + (u_nm1[1:-1, 2:] - 2 * u_nm1[1:-1, 1:-1] + u_nm1[1:-1, :-2]) / dy2) - - u_nm1 = u.copy() - return u_nm1, u - - -# Number of timesteps -nsteps = 101 -# Output 4 figures at these timesteps -n_output = [0, 10, 50, 100] -fig_counter = 0 -fig = plt.figure() - -# Time loop -for n in range(nsteps): - u0, u = do_timestep(u0, u, D, dt, dx2, dy2) - - # Create figure - if n in n_output: - fig_counter += 1 - ax = fig.add_subplot(220 + fig_counter) - im = ax.imshow(u.copy(), cmap=plt.get_cmap('hot'), vmin=T_cold, vmax=T_hot) # image for color bar axes - ax.set_axis_off() - ax.set_title('{:.1f} ms'.format(n * dt * 1000)) - -# Plot output figures -fig.subplots_adjust(right=0.85) -cbar_ax = fig.add_axes([0.9, 0.15, 0.03, 0.7]) -cbar_ax.set_xlabel('$T$ / K', labelpad=20) -fig.colorbar(im, cax=cbar_ax) -plt.show() diff --git a/dist/.DS_Store b/dist/.DS_Store new file mode 100644 index 00000000..5008ddfc Binary files /dev/null and b/dist/.DS_Store differ diff --git a/dist/sashanje_diffusion2d-0.0.3-py3-none-any.whl b/dist/sashanje_diffusion2d-0.0.3-py3-none-any.whl new file mode 100644 index 00000000..6209f516 Binary files /dev/null and b/dist/sashanje_diffusion2d-0.0.3-py3-none-any.whl differ diff --git a/dist/sashanje_diffusion2d-0.0.3.tar.gz b/dist/sashanje_diffusion2d-0.0.3.tar.gz new file mode 100644 index 00000000..04283677 Binary files /dev/null and b/dist/sashanje_diffusion2d-0.0.3.tar.gz differ diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..e1f7fded --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,22 @@ +[build-system] +requires = ["setuptools"] + +[project] +name = "sashanje_diffusion2d" +authors = [ + {name = "Sashan Samarajeewa"}, +] +version = "0.0.3" +description = "Solves the diffusion equation in 2D over a square domain" +readme = "README.md" +keywords = ["diffusion", "simulation"] +classifiers = [ + "Programming Language :: Python :: 3" +] +dependencies = [ + "numpy", + "matplotlib" +] + +[project.urls] +"Homepage" = "https://github.com/Simulation-Software-Engineering/diffusion2D" \ No newline at end of file diff --git a/sashanje_diffusion2d.egg-info/PKG-INFO b/sashanje_diffusion2d.egg-info/PKG-INFO new file mode 100644 index 00000000..49e83ba1 --- /dev/null +++ b/sashanje_diffusion2d.egg-info/PKG-INFO @@ -0,0 +1,49 @@ +Metadata-Version: 2.1 +Name: sashanje_diffusion2d +Version: 0.0.3 +Summary: Solves the diffusion equation in 2D over a square domain +Author: Sashan Samarajeewa +Project-URL: Homepage, https://github.com/Simulation-Software-Engineering/diffusion2D +Keywords: diffusion,simulation +Classifier: Programming Language :: Python :: 3 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: numpy +Requires-Dist: matplotlib + +# diffusion2D + +## Instructions for students + +Please follow the instructions in [pypi_exercise.md](https://github.com/Simulation-Software-Engineering/Lecture-Material/blob/main/03_building_and_packaging/pypi_exercise.md). + +The code used in this exercise is based on [Chapter 7 of the book "Learning Scientific Programming with Python"](https://scipython.com/book/chapter-7-matplotlib/examples/the-two-dimensional-diffusion-equation/). + +## Project description + +This code solves the diffusion equation in 2D over a square domain which is at a certain temperature and a circular disc at the center which is at a higher temperature. This code solves the diffusion equation using the Finite Difference Method. The thermal diffusivity and initial conditions of the system can be changed by the user. The code produces four plots at various timepoints of the simulation. The diffusion process can be clearly observed in these plots. + +## Installing the package + +### Using pip3 to install from PyPI +pip install -i https://test.pypi.org/simple/ sashanje-diffusion2d --extra-index-url https://pypi.org/simple + +### Required dependencies +matplotlib +numpy + +## Running this package + +```python +from sashanje_diffusion2d import diffusion2d + +diffusion2d.solve( + dx = 0.1, # intervals in x- direction, mm + dy = 0.1, # intervals in y- direction, mm + D = 4 # Thermal diffusivity of steel, mm^2/s + ) +``` + +## Citing +Forked from https://github.com/Simulation-Software-Engineering/diffusion2D +[pypi_exercise.md](https://github.com/Simulation-Software-Engineering/Lecture-Material/blob/main/03_building_and_packaging/pypi_exercise.md) diff --git a/sashanje_diffusion2d.egg-info/SOURCES.txt b/sashanje_diffusion2d.egg-info/SOURCES.txt new file mode 100644 index 00000000..62403004 --- /dev/null +++ b/sashanje_diffusion2d.egg-info/SOURCES.txt @@ -0,0 +1,11 @@ +LICENSE +README.md +pyproject.toml +sashanje_diffusion2d/__init__.py +sashanje_diffusion2d/diffusion2d.py +sashanje_diffusion2d/output.py +sashanje_diffusion2d.egg-info/PKG-INFO +sashanje_diffusion2d.egg-info/SOURCES.txt +sashanje_diffusion2d.egg-info/dependency_links.txt +sashanje_diffusion2d.egg-info/requires.txt +sashanje_diffusion2d.egg-info/top_level.txt \ No newline at end of file diff --git a/sashanje_diffusion2d.egg-info/dependency_links.txt b/sashanje_diffusion2d.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/sashanje_diffusion2d.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/sashanje_diffusion2d.egg-info/requires.txt b/sashanje_diffusion2d.egg-info/requires.txt new file mode 100644 index 00000000..aa094d9f --- /dev/null +++ b/sashanje_diffusion2d.egg-info/requires.txt @@ -0,0 +1,2 @@ +numpy +matplotlib diff --git a/sashanje_diffusion2d.egg-info/top_level.txt b/sashanje_diffusion2d.egg-info/top_level.txt new file mode 100644 index 00000000..7bf6f57f --- /dev/null +++ b/sashanje_diffusion2d.egg-info/top_level.txt @@ -0,0 +1 @@ +sashanje_diffusion2d diff --git a/sashanje_diffusion2d/.DS_Store b/sashanje_diffusion2d/.DS_Store new file mode 100644 index 00000000..38734ca2 Binary files /dev/null and b/sashanje_diffusion2d/.DS_Store differ diff --git a/sashanje_diffusion2d/__init__.py b/sashanje_diffusion2d/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sashanje_diffusion2d/__pycache__/output.cpython-312.pyc b/sashanje_diffusion2d/__pycache__/output.cpython-312.pyc new file mode 100644 index 00000000..e271cf6f Binary files /dev/null and b/sashanje_diffusion2d/__pycache__/output.cpython-312.pyc differ diff --git a/sashanje_diffusion2d/diffusion2d.py b/sashanje_diffusion2d/diffusion2d.py new file mode 100644 index 00000000..231c030f --- /dev/null +++ b/sashanje_diffusion2d/diffusion2d.py @@ -0,0 +1,75 @@ +""" +Solving the two-dimensional diffusion equation + +Example acquired from https://scipython.com/book/chapter-7-matplotlib/examples/the-two-dimensional-diffusion-equation/ +""" + +import numpy as np +import matplotlib.pyplot as plt +from sashanje_diffusion2d.output import create_plot, output_plots + +def solve(dx=0.1, dy=0.1, D=4): + # plate size, mm + w = h = 10. + + # Initial cold temperature of square domain + T_cold = 300 + + # Initial hot temperature of circular disc at the center + T_hot = 700 + + # Number of discrete mesh points in X and Y directions + nx, ny = int(w / dx), int(h / dy) + + # Computing a stable time step + dx2, dy2 = dx * dx, dy * dy + dt = dx2 * dy2 / (2 * D * (dx2 + dy2)) + + print("dt = {}".format(dt)) + + u0 = T_cold * np.ones((nx, ny)) + u = u0.copy() + + # Initial conditions - circle of radius r centred at (cx,cy) (mm) + r = min(h, w) / 4.0 + cx = w / 2.0 + cy = h / 2.0 + r2 = r ** 2 + for i in range(nx): + for j in range(ny): + p2 = (i * dx - cx) ** 2 + (j * dy - cy) ** 2 + if p2 < r2: + u0[i, j] = T_hot + + # Number of timesteps + nsteps = 101 + # Output 4 figures at these timesteps + n_output = [0, 10, 50, 100] + fig_counter = 0 + fig = plt.figure() + + # Time loop + for n in range(nsteps): + u0, u = do_timestep(u0, u, D, dt, dx2, dy2) + + # Create figure + if n in n_output: + fig_counter += 1 + ax = fig.add_subplot(220 + fig_counter) + im = create_plot(n, plt, u, ax, T_cold, T_hot, dt) + + # Plot output figures + output_plots(fig, plt, im) + + +def do_timestep(u_nm1, u, D, dt, dx2, dy2): + # Propagate with forward-difference in time, central-difference in space + u[1:-1, 1:-1] = u_nm1[1:-1, 1:-1] + D * dt * ( + (u_nm1[2:, 1:-1] - 2 * u_nm1[1:-1, 1:-1] + u_nm1[:-2, 1:-1]) / dx2 + + (u_nm1[1:-1, 2:] - 2 * u_nm1[1:-1, 1:-1] + u_nm1[1:-1, :-2]) / dy2) + + u_nm1 = u.copy() + return u_nm1, u + + + diff --git a/sashanje_diffusion2d/output.py b/sashanje_diffusion2d/output.py new file mode 100644 index 00000000..6ec530cc --- /dev/null +++ b/sashanje_diffusion2d/output.py @@ -0,0 +1,12 @@ +def create_plot(n, plt, u, ax, T_cold, T_hot, dt): + im = ax.imshow(u.copy(), cmap=plt.get_cmap('hot'), vmin=T_cold, vmax=T_hot) # image for color bar axes + ax.set_axis_off() + ax.set_title('{:.1f} ms'.format(n * dt * 1000)) + return im + +def output_plots(fig, plt, im): + fig.subplots_adjust(right=0.85) + cbar_ax = fig.add_axes([0.9, 0.15, 0.03, 0.7]) + cbar_ax.set_xlabel('$T$ / K', labelpad=20) + fig.colorbar(im, cax=cbar_ax) + plt.show() \ No newline at end of file