From 5a2a82239d98f467f27b76e8dedac966327c8e77 Mon Sep 17 00:00:00 2001 From: mahek Date: Sun, 17 Nov 2024 17:52:22 +0100 Subject: [PATCH] Packaged code for PyPI by mullamm --- README.md | 27 ++++++ ...mullamm_diffusion2d-0.0.2-py3-none-any.whl | Bin 0 -> 10000 bytes dist/mullamm_diffusion2d-0.0.2.tar.gz | Bin 0 -> 9133 bytes mullamm_diffusion2d.egg-info/PKG-INFO | 61 ++++++++++++++ mullamm_diffusion2d.egg-info/SOURCES.txt | 12 +++ .../dependency_links.txt | 1 + mullamm_diffusion2d.egg-info/requires.txt | 2 + mullamm_diffusion2d.egg-info/top_level.txt | 1 + mullamm_diffusion2d/__init__.py | 0 mullamm_diffusion2d/diffusion2d.py | 78 ++++++++++++++++++ mullamm_diffusion2d/output.py | 16 ++++ setup.cfg | 19 +++++ setup.py | 6 ++ 13 files changed, 223 insertions(+) create mode 100644 dist/mullamm_diffusion2d-0.0.2-py3-none-any.whl create mode 100644 dist/mullamm_diffusion2d-0.0.2.tar.gz create mode 100644 mullamm_diffusion2d.egg-info/PKG-INFO create mode 100644 mullamm_diffusion2d.egg-info/SOURCES.txt create mode 100644 mullamm_diffusion2d.egg-info/dependency_links.txt create mode 100644 mullamm_diffusion2d.egg-info/requires.txt create mode 100644 mullamm_diffusion2d.egg-info/top_level.txt create mode 100644 mullamm_diffusion2d/__init__.py create mode 100644 mullamm_diffusion2d/diffusion2d.py create mode 100644 mullamm_diffusion2d/output.py create mode 100644 setup.cfg create mode 100644 setup.py diff --git a/README.md b/README.md index fe548354..fc065668 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,40 @@ Please follow the instructions in [pypi_exercise.md](https://github.com/Simulati 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 project solves the two-dimensional diffusion equation using finite difference methods. The diffusion equation is an important partial differential equation that describes the distribution of a quantity (such as temperature) over space and time. This package includes functions to simulate the diffusion process on a 2D grid and visualize the results. ## Installing the package ### Using pip3 to install from PyPI +To install the package directly from PyPI, you can use pip3: + +```sh +pip install -i https://test.pypi.org/simple/ mullamm_diffusion2d==0.0.1 +``` ### Required dependencies +The following dependencies are required to run this package: + • numpy + • matplotlib + +These dependencies will be installed automatically when you install the package using pip3. + +## Running this package ## Running this package +To run the diffusion simulation, you can use the `solve` function provided in the package. Below is an example script that demonstrates how to use the package: + +```python +from mullamm_diffusion2d import diffusion2d +diffusion2d.solve() +``` + +# Run the simulation with default parameters +solve() + +# Run the simulation with custom parameters +solve(dx=0.05, dy=0.05, D=2.0) + ## Citing +Mahek Mulla (2024). mullamm_diffusion2d: A Python package for solving the 2D diffusion equation. Available at: https://github.com/mahek-mulla/diffusion2D.git diff --git a/dist/mullamm_diffusion2d-0.0.2-py3-none-any.whl b/dist/mullamm_diffusion2d-0.0.2-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..057c6322616ad8ea50bbd6ef8169f780902be864 GIT binary patch literal 10000 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%0DVQnpKK42m8USS!f#^aRsbqY?mAthQ6@n#^ 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 literal 0 HcmV?d00001 diff --git a/mullamm_diffusion2d.egg-info/PKG-INFO b/mullamm_diffusion2d.egg-info/PKG-INFO new file mode 100644 index 00000000..57e96ccf --- /dev/null +++ b/mullamm_diffusion2d.egg-info/PKG-INFO @@ -0,0 +1,61 @@ +Metadata-Version: 2.1 +Name: mullamm_diffusion2d +Version: 0.0.2 +Summary: A 2D diffusion solver example package +Home-page: https://github.com/mahek-mulla/diffusion2D.git +Author: Mahek Mulla +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Requires-Python: >=3.6 +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 project solves the two-dimensional diffusion equation using finite difference methods. The diffusion equation is an important partial differential equation that describes the distribution of a quantity (such as temperature) over space and time. This package includes functions to simulate the diffusion process on a 2D grid and visualize the results. + +## Installing the package + +### Using pip3 to install from PyPI +To install the package directly from PyPI, you can use pip3: + +```sh +pip install -i https://test.pypi.org/simple/ mullamm_diffusion2d==0.0.1 +``` + +### Required dependencies + +The following dependencies are required to run this package: + • numpy + • matplotlib + +These dependencies will be installed automatically when you install the package using pip3. + +## Running this package +## Running this package + +To run the diffusion simulation, you can use the `solve` function provided in the package. Below is an example script that demonstrates how to use the package: + +```python +from mullamm_diffusion2d import diffusion2d +diffusion2d.solve() +``` + +# Run the simulation with default parameters +solve() + +# Run the simulation with custom parameters +solve(dx=0.05, dy=0.05, D=2.0) + +## Citing +Mahek Mulla (2024). mullamm_diffusion2d: A Python package for solving the 2D diffusion equation. Available at: https://github.com/mahek-mulla/diffusion2D.git diff --git a/mullamm_diffusion2d.egg-info/SOURCES.txt b/mullamm_diffusion2d.egg-info/SOURCES.txt new file mode 100644 index 00000000..9c4d2ba1 --- /dev/null +++ b/mullamm_diffusion2d.egg-info/SOURCES.txt @@ -0,0 +1,12 @@ +LICENSE +README.md +setup.cfg +setup.py +mullamm_diffusion2d/__init__.py +mullamm_diffusion2d/diffusion2d.py +mullamm_diffusion2d/output.py +mullamm_diffusion2d.egg-info/PKG-INFO +mullamm_diffusion2d.egg-info/SOURCES.txt +mullamm_diffusion2d.egg-info/dependency_links.txt +mullamm_diffusion2d.egg-info/requires.txt +mullamm_diffusion2d.egg-info/top_level.txt \ No newline at end of file diff --git a/mullamm_diffusion2d.egg-info/dependency_links.txt b/mullamm_diffusion2d.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/mullamm_diffusion2d.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/mullamm_diffusion2d.egg-info/requires.txt b/mullamm_diffusion2d.egg-info/requires.txt new file mode 100644 index 00000000..aa094d9f --- /dev/null +++ b/mullamm_diffusion2d.egg-info/requires.txt @@ -0,0 +1,2 @@ +numpy +matplotlib diff --git a/mullamm_diffusion2d.egg-info/top_level.txt b/mullamm_diffusion2d.egg-info/top_level.txt new file mode 100644 index 00000000..0ee4fb1a --- /dev/null +++ b/mullamm_diffusion2d.egg-info/top_level.txt @@ -0,0 +1 @@ +mullamm_diffusion2d diff --git a/mullamm_diffusion2d/__init__.py b/mullamm_diffusion2d/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mullamm_diffusion2d/diffusion2d.py b/mullamm_diffusion2d/diffusion2d.py new file mode 100644 index 00000000..3ce31653 --- /dev/null +++ b/mullamm_diffusion2d/diffusion2d.py @@ -0,0 +1,78 @@ +""" +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.0) : + + # 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 + + + 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 + im = create_plot(fig,fig_counter,T_cold,T_hot,u,n,dt) + + + # Plot output figures + output_plots(fig, im) + + + + + diff --git a/mullamm_diffusion2d/output.py b/mullamm_diffusion2d/output.py new file mode 100644 index 00000000..543eb2f5 --- /dev/null +++ b/mullamm_diffusion2d/output.py @@ -0,0 +1,16 @@ +import matplotlib.pyplot as plt + +def create_plot(fig, fig_counter, T_cold, T_hot,u,n,dt): + 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 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 diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 00000000..b446eb17 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,19 @@ +[metadata] +name = mullamm_diffusion2d +version = 0.0.2 +author = Mahek Mulla +description = A 2D diffusion solver example package +long_description = file: README.md +long_description_content_type = text/markdown +url = https://github.com/mahek-mulla/diffusion2D.git +classifiers = + Programming Language :: Python :: 3 + License :: OSI Approved :: MIT License + Operating System :: OS Independent + +[options] +packages = find: +python_requires = >=3.6 +install_requires = + numpy + matplotlib \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..3e2d189f --- /dev/null +++ b/setup.py @@ -0,0 +1,6 @@ +# setup.py + +from setuptools import setup + +if __name__ == "__main__": + setup() \ No newline at end of file