diff --git a/README.md b/README.md index fe548354..b4e15e58 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,30 @@ 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/ jafarkmi-diffusion2d==0.0.7`` + ### Required dependencies +matplotlib and numpy + ## Running this package +```python +from jafarkmi_diffusion2d import solve +# intervals in x-, y- directions, mm +dx = dy = 0.1 +# Thermal diffusivity of steel, mm^2/s +D = 4. + +diffusion2d.solve(dx,dy,D) +``` + ## Citing + +[pypi_exercise.md](https://github.com/Simulation-Software-Engineering/Lecture-Material/blob/main/03_building_and_packaging/pypi_exercise.md) 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/jafarkmi_diffusion2d-0.0.7-py3-none-any.whl b/dist/jafarkmi_diffusion2d-0.0.7-py3-none-any.whl new file mode 100644 index 00000000..277dc01f Binary files /dev/null and b/dist/jafarkmi_diffusion2d-0.0.7-py3-none-any.whl differ diff --git a/dist/jafarkmi_diffusion2d-0.0.7.tar.gz b/dist/jafarkmi_diffusion2d-0.0.7.tar.gz new file mode 100644 index 00000000..86e55a36 Binary files /dev/null and b/dist/jafarkmi_diffusion2d-0.0.7.tar.gz differ diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..c47b8253 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,16 @@ +[build-system] +requires = ["setuptools", "wheel"] + +[project] +name = "jafarkmi_diffusion2d" +description = "Solving the diffusion equation in 2D over a square domain" +readme = "README.md" +keywords = ["Diffusion Equation Solver", "Diffusion Equation Solver"] +classifiers = [ + "Programming Language :: Python :: 3" +] +dependencies = [ + "matplotlib", + "numpy" +] +version = "0.0.7" \ No newline at end of file diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 00000000..c086c5f6 Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/jafarkmi_diffusion2d.egg-info/PKG-INFO b/src/jafarkmi_diffusion2d.egg-info/PKG-INFO new file mode 100644 index 00000000..7587ee51 --- /dev/null +++ b/src/jafarkmi_diffusion2d.egg-info/PKG-INFO @@ -0,0 +1,48 @@ +Metadata-Version: 2.1 +Name: jafarkmi_diffusion2d +Version: 0.0.7 +Summary: Solving the diffusion equation in 2D over a square domain +Keywords: Diffusion Equation Solver,Diffusion Equation Solver +Classifier: Programming Language :: Python :: 3 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: matplotlib +Requires-Dist: numpy + +# 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 + +`` pip3 install jafarkmi_diffusion2d`` + +### Required dependencies + +matplotlib and numpy + +## Running this package + +```python +from jafarkmi_diffusion2d import solve +# intervals in x-, y- directions, mm +dx = dy = 0.1 +# Thermal diffusivity of steel, mm^2/s +D = 4. + +solve(dx,dy,D) +``` + +## Citing + +[pypi_exercise.md](https://github.com/Simulation-Software-Engineering/Lecture-Material/blob/main/03_building_and_packaging/pypi_exercise.md) diff --git a/src/jafarkmi_diffusion2d.egg-info/SOURCES.txt b/src/jafarkmi_diffusion2d.egg-info/SOURCES.txt new file mode 100644 index 00000000..1e5cd71e --- /dev/null +++ b/src/jafarkmi_diffusion2d.egg-info/SOURCES.txt @@ -0,0 +1,11 @@ +LICENSE +README.md +pyproject.toml +src/jafarkmi_diffusion2d/__init__.py +src/jafarkmi_diffusion2d/diffusion2d.py +src/jafarkmi_diffusion2d/output.py +src/jafarkmi_diffusion2d.egg-info/PKG-INFO +src/jafarkmi_diffusion2d.egg-info/SOURCES.txt +src/jafarkmi_diffusion2d.egg-info/dependency_links.txt +src/jafarkmi_diffusion2d.egg-info/requires.txt +src/jafarkmi_diffusion2d.egg-info/top_level.txt \ No newline at end of file diff --git a/src/jafarkmi_diffusion2d.egg-info/dependency_links.txt b/src/jafarkmi_diffusion2d.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/jafarkmi_diffusion2d.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/src/jafarkmi_diffusion2d.egg-info/requires.txt b/src/jafarkmi_diffusion2d.egg-info/requires.txt new file mode 100644 index 00000000..db5d81e0 --- /dev/null +++ b/src/jafarkmi_diffusion2d.egg-info/requires.txt @@ -0,0 +1,2 @@ +matplotlib +numpy diff --git a/src/jafarkmi_diffusion2d.egg-info/top_level.txt b/src/jafarkmi_diffusion2d.egg-info/top_level.txt new file mode 100644 index 00000000..08ee113a --- /dev/null +++ b/src/jafarkmi_diffusion2d.egg-info/top_level.txt @@ -0,0 +1 @@ +jafarkmi_diffusion2d diff --git a/src/jafarkmi_diffusion2d/__init__.py b/src/jafarkmi_diffusion2d/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/jafarkmi_diffusion2d/diffusion2d.py b/src/jafarkmi_diffusion2d/diffusion2d.py new file mode 100644 index 00000000..59ea805e --- /dev/null +++ b/src/jafarkmi_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 .output import create_plot, output_plots + +def solve(dx=0.1,dy=0.1,D=4.): + # 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 + fig, im = create_plot(u,n,dt,fig,T_cold,T_hot,fig_counter) + + output_plots(fig, im) \ No newline at end of file diff --git a/src/jafarkmi_diffusion2d/output.py b/src/jafarkmi_diffusion2d/output.py new file mode 100644 index 00000000..f9697394 --- /dev/null +++ b/src/jafarkmi_diffusion2d/output.py @@ -0,0 +1,15 @@ +import matplotlib.pyplot as plt + +def create_plot(u,n,dt,fig,T_cold,T_hot,fig_counter): + 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)) + return fig, im + +def output_plots(fig, 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