From 8df4d9791791b5419ba3a6e44cd3d9189699860c Mon Sep 17 00:00:00 2001 From: Vedant Puranik Date: Thu, 14 Nov 2024 15:31:57 +0100 Subject: [PATCH 1/5] refactored existing code and wrapped inside a solve method --- diffusion2d.py | 123 ++++++++++++++++++++++++------------------------- output.py | 34 ++++++++++++++ 2 files changed, 94 insertions(+), 63 deletions(-) create mode 100644 output.py diff --git a/diffusion2d.py b/diffusion2d.py index c0c6083..63b361b 100644 --- a/diffusion2d.py +++ b/diffusion2d.py @@ -6,42 +6,66 @@ 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 +from output import create_plot, output_plots + +def solve(dx: float = 0.1, dy: float = 0.1, D: int = 4): + """Wrapper for the diffusion equation solver and image rendering functionality + + Keyword arguments: + dx -- intervals in x- directions, mm + dy -- intervals in y- directions, mm + D -- Thermal diffusivity of steel, mm^2/s + """ + # 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 + fig, im = create_plot(fig_counter, fig, u, T_cold, T_hot, n, dt) + + # Plot output figures + output_plots(fig, im) def do_timestep(u_nm1, u, D, dt, dx2, dy2): @@ -52,30 +76,3 @@ def do_timestep(u_nm1, u, D, dt, dx2, 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/output.py b/output.py new file mode 100644 index 0000000..2272c11 --- /dev/null +++ b/output.py @@ -0,0 +1,34 @@ +import matplotlib.pyplot as plt + + +def create_plot(fig_counter, fig, u, T_cold, T_hot, n, dt): + """Create one plot for a particular time stamp + + Keyword arguments: + fig_counter -- counter for the subfigure + fig -- matplotlib figure object + u -- matrix of temperature values + T_cold -- value representing cold temperature + T_hot -- value representing hot temperature + n -- value for timestep + dt -- stable timestamp value + """ + 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): + """Outputs all the plots as one figure + + Keyword arguments: + fig -- matplotlib figure object + im -- image for color bar axes + """ + 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 From e55bdd26628dda9499e0a08bf26529e5c4e483b3 Mon Sep 17 00:00:00 2001 From: Vedant Puranik Date: Thu, 14 Nov 2024 20:01:23 +0100 Subject: [PATCH 2/5] added packaging configurations and final built packages --- README.md | 40 ++++++++++ ...uranivt_diffusion2d-0.0.1-py3-none-any.whl | Bin 0 -> 11014 bytes dist/puranivt_diffusion2d-0.0.1.tar.gz | Bin 0 -> 9950 bytes puranivt_diffusion2d.egg-info/PKG-INFO | 75 ++++++++++++++++++ puranivt_diffusion2d.egg-info/SOURCES.txt | 12 +++ .../dependency_links.txt | 1 + .../entry_points.txt | 2 + puranivt_diffusion2d.egg-info/requires.txt | 2 + puranivt_diffusion2d.egg-info/top_level.txt | 1 + puranivt_diffusion2d/__init__.py | 0 .../diffusion2d.py | 2 +- output.py => puranivt_diffusion2d/output.py | 0 pyproject.toml | 29 +++++++ 13 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 dist/puranivt_diffusion2d-0.0.1-py3-none-any.whl create mode 100644 dist/puranivt_diffusion2d-0.0.1.tar.gz create mode 100644 puranivt_diffusion2d.egg-info/PKG-INFO create mode 100644 puranivt_diffusion2d.egg-info/SOURCES.txt create mode 100644 puranivt_diffusion2d.egg-info/dependency_links.txt create mode 100644 puranivt_diffusion2d.egg-info/entry_points.txt create mode 100644 puranivt_diffusion2d.egg-info/requires.txt create mode 100644 puranivt_diffusion2d.egg-info/top_level.txt create mode 100644 puranivt_diffusion2d/__init__.py rename diffusion2d.py => puranivt_diffusion2d/diffusion2d.py (97%) rename output.py => puranivt_diffusion2d/output.py (100%) create mode 100644 pyproject.toml diff --git a/README.md b/README.md index fe54835..bbb60f3 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,52 @@ 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 +Direct installation is possible from PyPI by using the following command: + +```sh +pip install -i https://test.pypi.org/simple/ puranivt-diffusion2d==0.0.1 +``` + ### Required dependencies +The following dependencies will be automatically installed: + +1. `numpy`: It supports large, multi-dimensional arrays and matrices, along with a large collection of high-level mathematical functions to operate on these arrays. +2. `matplotlib`: A plotting library commonly used in Python. It provides an object-oriented API for embedding plots into applications using general-purpose GUI toolkits. + ## Running this package +The equation solver is implemented in the `solve` function of the package. To make the code run: + +Either simply open a python shell and run the following commands: + +```python +from puranivt_diffusion2d.diffusion2d import solve + +solve(dx = 0.1, dy = 0.1, D = 4) +``` +**OR** + +As the starting point of the package is defined as the `solve` function itself, only calling the solve function with the optional parameters would suffice. + +```python +solve(dx = 0.1, dy = 0.1, D = 4) +``` + ## Citing + +```bibtex +@software{puranivt_diffusion2d, + author = {Vedant Puranik}, + title = {{{puranivt_diffusion2d}: A project that implementes the diffusion equation solver over a series of timesteps based on configurable parameters: (dx, dy, D)}}, + year = {2024}, + version = {0.0.1}, + url = {"https://github.com/VedantKP/diffusion2D"}, +} +``` \ No newline at end of file diff --git a/dist/puranivt_diffusion2d-0.0.1-py3-none-any.whl b/dist/puranivt_diffusion2d-0.0.1-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..2c743b0ba4b24092a5273ccd5e3e17fde417f302 GIT binary patch literal 11014 zcma)?WmFv7wzeC0cXxMpcWbn9ch|-ev~hO}?u0-fXdpoF;OKSX)dNovFU~vHe03rYx;%e~w2LSqy%kP8o_i*?2v~YFs0h?Jn z*xGt~Ik>rUTXUG1Ik-B2&CJ-{{b2wa|NFdtqN_m;Pd?%^3;=+Q1OU+dr|18L^&1fZ zGDQ0B}0DNiQS{vn#r*%X#9hLPr zvu_Ttlt**+McQ+vbRrNG3Rt=jqQDnr!Y&q@_Iuk{3!`fAAYUrK6^O?5b+YR|Pd7&7 zYp%_pJIY%Zn9ap!`2ZAE5FxgRd%ZDeO)KKImN{@s;hx=caFfE{cdiB67K6?6z~toaQEG20iG(bJY)93t_>wGpr24lB{36p~4QnTlY176E!P z3^NO|WCQo_Zb9-Q)KYvw0!MUMq-en!y(qFA-rAx2*hE%c&7z+r3(j>MhQnhC3VeIc zvARs_>ZBZ=$OARjB1Lr14`rOQN!%PoQDXwC@l}uaewE+XYTY>GiLVMJ0AA0P| z*f?+BR;^Irtb8}|9+C8pj*1+{($&x6MZw?`10OCA`x;t))BHr#Fl_2EBAN)tTFzQm5h)N5TP5FIpKGQzK14Wv=#Y2o_Nz!h5k_%cx& zn=EN+nLx-u6Z@)|er#?0)6=48=yzgLyS*mvTiJu0 zg<+R2CC3#b-2^>!)R^k;^JV}EP4sS|9@svI{hQ}lZ`+^Q;K5KtLP1zW9f9boR#)qe zB95>>!-_xj3XM(Ja{dxJZ9rIxgW>;jl)HNIVf0JTiCFKbuuL>+7t-s|q?pS05Ii>r zdi&A@>45IQ_W1i*WeM$Ee#2azQAcU(b1}L`Io~#{M@kJH!ItZhWvKdscmczEJ=(eEXV>2BkVT)D#Ua5Cq$=hAiYtxH`b&bVB0W+gBiYB4*pXfDhaLzyz}AYNWbkP4+{X0 z|0j94d4t`(!GCx|OU-GG6SEWHk|NT@e0R>H(@1(XL|treO2xIDa5=LRIhC$#da(HV zt1s=_uZS+r$u^w=r8xrXj!vYIJ^KtPy4>EbK{9s?-R&DtfXKAW5v+oyLi~+ql@X3S zE<3{GFx8K9S%vDj&HNtHK~mu{@{e^P1@n$KVgq4BaAnV(9^E~jQ4MIZB9ian{C=zq zvRKWP`UP@*ggK2Y8i)=W_VE#0Tko+T;rX8E86HX46GJ1?03_>;hd30-#qlt);xaIB ziWN=i3MQts>@y=u%7Le4-hdn}I^X15;6%&JHWq+u3`%zaWD&i;gPMBwD zr6?z0qsT(WuS@5yBGokpbWt|E`5aQ|Th}wsFO0jL=~dLM#qqSB^8GD}?GplR4A5)$ zTBvDo!@7lk)$@Tm>8-NDA_NSm|Va5h_iWz@1T$$YIb!hsH{pg(LdWOA#T{cfMr|7*VFol&GWz zEJET?!dGsRYf!l*_;V61q_`SPv114T2><{)WdMNnKTIMvPIgXqE_Q1NFEE>ftF0S{ zs*;QxP+P89bk%cJK6CN|^NWn0sctnSTaaLq_G4fX(~5iqbu%qqQlXYw5z{Rptf0Ll z_r8O;_1*rS%5C1PFQ6=MoeVVIPaQhDALN#hTalUDk^&kIA`SdD(}3kYeBoub7Be1B-tgDN*Q?oVc%yJ~QV-w_`q9+~f zQT2f#2Sqnp!IYEkCqqt;9>_&}TPTRrvQ^8U`@;!vu=8{nmbDt1X=6%MH^(5{G5b6Bwt;#g}sgIhrT%^&94B@@hR`@fu^`> zr9=w1)w_AIvQZalLFayScc6t0xtN%~i+AW)raT?CC0-+r9Jgy}XP^^*YivrS%FTqz z=w@4$Pm-@54UB00#U>Fai=Y56ghT*YbN-#WJlu~Rbid9I$maC1&-U*%MNDDD@IJ6a>q=&xVMi2Aw+1NU2u}-Urc! zL{n#yriFe%7w#Ft3fqgTQFnqd^d1h0DVf9E)4oSGMGs^^it`4s=KG~|!19GIl`jr8 zW!;eBIml;=kL#18(>EtEg0CYoY(M|;YCTP0;=b$zV9uSu+{AiNlo zB^XvA(%8~l7#f&TUrr8O#`i;p0p!Q?j5R{x3*s(j*iG%zQJ!qDiUG9Th*SurLwXc+!67~(EI z*-O2+2WZ_OgTDQ)LXR$NJa_ui>D*L`e&X4Gn!LI!)ZEo^-)i?@kjTB0!hMn~4|=(G zamM)C7x(oG!6Z?F-5tjl8h-qM(6_rEkkW|yPmX&?tG+e$iWN_%)Q?D&R@ z@ouhwN-ZajUT!~0SQqaanmcSpLPFoD;&(AW$Y5gAx5tb6I5DX)fQ+yu%b_WRS@555 z#E8jxEHPv~l8TFUI3Gi-;H@@fO;P=o?cTNWxk=G9^%UI-7JRqDoV-s%R6OXa;}XF7 zMlNA#r4CmDc}QBo>aN8Pc7meGASA3F_c_4${20IQ#17b7PRzLzbQDCSoD z-tCm#`VEe=DsYXc_@y?ZIn&^v0Nba=FxIGKYzswE(z6b^yAZ}78<`qk>=xA;xsU3k zVR|q)$z?6%VCnno$Xo1A$M<3PGfoIGl;#VK{nCq zjYodH`p^MtLegBm!~(Qr=p}?u08c->xspnu7=~EiT%!D$rb>nkEBJhzuOBW=_Z>Jj z@vtMZ8rj|wqDkQx3Lo|+29cj{l30c;Qkq*X1>+L7hDr;&>?clj=^hFPkIUEdkHmXn zz)Df)vq~%|ZbCc%^t{0+7g;1NF4J|Xs-8xzTFD3g?6Q=@-3Xeki3mHr@Xsq-u+{0a zCZ;vrA?Me6$9s|MB|um+nHc~()qWJcs1=7`hWrcI7u$af&+iOkl+=hCK&ObA4D-%Y z4F?kmge`wA0~##(R0;2oTk%!|sfIKFGc;^UMNSF;tJS@Kj)4MDsa1G}koTq&1b;eB zY4{eH@g+PDrr1U)gSws3JWztdyN290gf5T)*-17(-nD-Nr4c$E)kx+EN8HR1!)+fMd)tWo}0WrpL>wtCEB#`48+53 zv}5OrjoL;XNG(VDv+1VEkMiq|ayGlmt2yFV3|seS50rdNu>b}H?#`9=d3T4A)0vr* zrbq(S2P04rzHB&FxM!t!bzl5v3LDq=x&APBaKGF^e zpQ>GB?>%r8&*C0$;ysn!lG=%2rUT>B+Och)mqPTE2JVB#S^-V=Gwp0~ z+J`Y9QN3_imH!cz#miE3jRdVdqzI1tLzU7^UMf+{4@){ox9=EpU~!w8i)?9Q&ot z_`H{Su@y+fd9~<&eOUHdgVd%fB45l|U}e2u-|B7y-hf%87bME(d)iOs>$m*1uzOJW9u%G0fImz2dodl&@=f z{(Je26duEGdt(=vgVW<73E+ycXpnA8br2r|>Z;52=jOYKz^bN5ZlsMFnHs-$N=IO1 z?FfQn_NX<87{nFACTUiGa1*j*aR#htGcS6emXpqHVy?VbQ%MqGi^{6!TnK+Btbk^R zL6*ai&S{8cz5`OQ^gOzqGOm{CNm81EJr5Gc5Z>3-+vcIW)iUz$t?zYEarb%DbEZ1Q z0J%V-@HNYix&s;Tyx!Z6!JDP5bdjcXF>IDv=5y8+S@n||y{{sjAEvUCr2MQ?tz17b z*wovMTf2nfSQL82N3^h^cu`l{V~?Mk!Nug#7ve(1@9OfNh`-ZKDq7g|`T23R@M}J> zrY@)D;0CH&tPW*(+U+O4hyJZP<(_Rrw{LgM<^}OF`U@A&a2&e4F8dGQd_VFa^2?p!SoIes`ge@H+>C*f2-gDEA1-!e-fe>>+R;J%$&!1-B} znuEvMePhM6O3189FtpjcR?qP_`PF+ga;nJQXda-_OL6Aa%i#iD#b6CDm$ zcD9s_@ou6^(>Q_?^~(TeV=d;BY3utSq@@yXhaY)yEj%ap@SE!37tnUzhs2&_sTsg_ zLP1x*nM|hJgyOS@lDnw@4aUITOIwZ1ekyKLA#+Zybp9^ri-YPiZiy#-;Nd{MHKl&k z_ShuxAxI6qIyC2fdT+(i+wgb?FT{x07w!2r|Gg+I>++iddCBW@B)WlA7e*2E$+v+6 zbuvp5iIm^Q=_+?_4iq~>Whjv+Q?!`ST5F0uP=>~1(aX$Ge`Sr;In~pbo0cDf@0U;&LUOz2Z}nVSB5F59pyO#gv;6Jb;zxxH0?b(im89H z6bL8UxgTFL=wxu!6pM20Iu3~+jx+vnBmxt4ykT_yLK_pyDTu>THqmPN_D^6uMu8@Yirp zkOHCh#0r9pD`{w_{;~kbv%tGcA{+}2qzg)v-hH5;YpIkouMSW9ISs>EHdYt2ll%f| zF8NLxj4*vz_Lh;~ypG7TsRgULk8@VE65*$A>%@*`$%TiZBOy6gA;Nq4#E%Ona!>0I z$fVMEndCM~VLvd@;T6{_!`Co$NE;1gDqUw++6j1-X7rV%j$KpgD${t43awTRhQH0+ zPQ}Ma8Eo6(ifRRGU&@VFP;_INbhdX9o0$zeZT1+4=fZk?_t%?WOWem15bzohZ9p>O zNNQL6vA`=z+?h}q`q~4&J!#irgw~y%Qo>eZ>wWloHh6(0n83V&bi9LvCAGtfY5JU z3pmfH%x@SmXHy$wYdeTC`?%irXTkW{;wfm~%g&j66w-BAZ+!l#lPv*DMX@N@dz_cI z#^lys{DUj)^O z(l!z~2r(jc(65@0Z9H+{wj`UR?0V{$Oj*LSzxymRVHAxmY8;-T`N1?g?;6LO#ANhA zmX;76D;%LZ=*1Jo!IP6RyoSl{KMsEga!1k#}}PJJpEiqq&q!2 zh-+A+eAiWTNk0*s%{=2osq&8_GPidMCVDW(TvIJud?D0dZ-xD!OL53EneYM>5H%xM zC5-N60uy?k%2_|=vn9Ij# zzU`(F9Y$`*ta>CmerFBE&494M(NFexxQFs49eCtZL46O&i5~tQz8!#}${1s)FVQP6Z2bKx^53S%(9#bxznjQ|goswm6Z@R# zdwV|C)%$}W(6Y`4Nno|_q$UX4nN4eTi871Y>!_))L~tQ@ct`J}c68-uvCv}EJTpv6 z=o>nii!!xM{AYgW>_%xp-{~!>)?*DndOx%e?UVRHWkJ`64lrWBK7EzlZnsz=oE&G- z;A7_is;vOw^`duHdB|q!2O#)_;6{@a%YA}u&D?TkLu~Qs(Q@9}!QE${FqY{A3es&q zCe#D_>QLk3vYmtvHSriN&qUDcaPPhup`4T6b%z1#4<-3WZK+DKkVce$#8zfENu0zMFd{AdVP0*3KDA6vkn;f z#aXDP$I_x7oXsv#@qx)m?d;p=#T(%#*v)ld*3m`XtkB!1m>wMGOkl;;yk$=P4YUNO zbj~juvHZH_7t3bl&4~)7YgVI~A(IuY$LK))iX9@7I@g&DD4v4N?`J!kgNM$l z?&oPDlI8<@C@py#9F;7B_8mY1uWtWg@x-jri-7!Im^feb5r$hQWDX$y)i78{eg7%|zDCUe^ zhI4k;^OLcES9j~xzzX2OyX#)?TaxSSy!G!|G1SD{jiXF~{3MmWjP?NBWbsHhvE&Qq zmU~2Q#r@;;KIh1-twKfb5~3rh&^+<&T<3sbj1ffSJBN!c5`9Ccr)q>PNxh1%+m#gB zg48nut@m!SYg?to4Fh>|w)}w-6$Fw$j+I9V?*oBDSBFmqkK{ytCrj!+vX`*gt%umM zQ0-ue{N$NX$Dc_xE#nM_Y>s>Z2+UvJ{o03lmQUJ{7@PHeB+=k|8O2TaBz2_Dg&Nmp z*crBjgH`~^vzbkMweEbmc$+HKF3lr}t$~*^eTU%|%Cf+`sFx zw0V{gPx(%6vCjDF-XZ|)q@irVyqS2Dm_A7ze|B><*66A`5V!qg5(Kq4mU=szhr|;OR5e@Z{ zc>B+QL?5SJINpQ^A~4_e`2zN;)?A?GvXJc{Fg6(?dua0zi(=I;XB7qqNX2L+K(u|9 zsybk&shP{iFc2JZEF7o>OJ=FCw6LDOO-(!n!*wbDSaZ_NvC*)kkW1Wv~b7I;G$(R>qkJ9JfP7JUyQ}QWt_HMR+ zpN0i_z?AN|GQ1PGR0!_5wo{BdVrakqNhTYW#q~hOam8@W{pPvJ$7+38Qox_=Qva<+ zW74tfeI8La{NDO*{U-IC2{f3;#h{4(=~h4u;&}!?=$GD=D1|45ZCnHg%pE;)eG&Xj z5)7m`h;@*OF3Rmm222bdMwv2!3vie@Ji6J0C8A$SbAOql2g?hU@soQ$KgU(9#6T_R zrvX+Ktu40tbV>bat9zK@>0PDsuPaWb@AF`Td~`mXjnCd}KqPi{gO2zPAZF}qCLy8a z3);8!LSkpBEpo^cdN*uTOFj+o3CNI8Df3BYoHx1Xq|KvPmS<)tfkzCdgkjsmfnO*{ z8E5FR0I29igLp2ThN5h~R4-G|4g39{8Nu|o-)9dg9sR3Kn!Q2jQ29heIiYrY4Rar4 zPdO;SvM2fH9o!GH<~@~u&(5wTS}mm-o<%OKV&yM%#>0ar< z_GuPdr-kDE@!8BA(bc`+wFK{ zE8ERTm8MXOtD1g4%vKGnjcsp7!d9_)(09%JGv;1E_-nJYsr4{6XSum^nkl#%2(<#h z$X|jZDKWic+}Q z7{-M2OpmA3b4g~h2%gMcWr8jGU$!CQaU#LUupqe{2@@Fsyx|>wsobv^#l1F|#iU<7 zVt!p(9zYrc!IE?0UQJK_E0D16ZC~ogV3eU>c*Kq7X9fMaeDgGdxFORbvu`A4$_-1l z7ZjZwUR2#L&@#$>ug2H*+0?)bix^xh89kX6cDvYo29q+8I)c`0NDQNcX>5A9VuBU9jS3$6Sq}<+(3b?SND`I-cXzUQhg{ZHsbze zd|sEZvO^WF{&cX5SFvnD*)gHqucwJ}+SOt1qNGt7%CxMzt2~*Y??s+?I+qFgi!G$H z7w1)*Pc_Ko+8`0oPn*x9H_p1Fw;mg3F02?)QI>DD2_ig?xbn4jkInMnkWugy2{N`J zqut~vsw52k!Hdj8QLVPai8asKKb9SqR*2wC>M@M{l{5D9%-=10R_rS>@~LKcDsob$ zaCJ^lz^B(C@GhU-0gvkI*|((~cq-iTK5$QgSa%A7Oa?dmDr%lEygm`zw)kzHnegQ> zv@T{@J@(-nzZb%=$CBRtRyu7QC6^z2Qswb@;n?IdQnvXtbd=#Obh*sB>1~7Vvm$Wt zM)-4^(AnKY{H5t6?-wqr2%!;Xuu!E6Xu`=_(yFFTQ=7?*K^?>RXS@o9%ftlwp}n7C zt9!ynMwz$;{56UlC@O&yd&0%o4MtzSh7s4C)!yfM01Qinu(`d8}Vu|3shcK}gj z#O+*8%7(?ayT*uW%;XLE$1QWm6R{JM22UGO$BJpBG2yq6Mm%IEsFqf?-|N9xr%#p_ zyd%V~!>iUJQCJd;+n*_@%&~R(hkI7FY)e!da@1!o%;(Z0l$xDO15olR%;#`f5_``J z8$xwS)%mMKK?sfT8y_Mj@Mnk-lS|@Fl0jQSy(D2&U{jx_QBDPfJ8>KLE-Hal_r zH(lM|6XU2}oJ;Ow=tuY5+UG(Yphpc&e9O34S!9YtTk)EaBKTf(vQdu5v_H3^0Pd~~D|&=tvJ&C`u*b+OAJ6E@4TAEp^c$83vVB&Ivh`j@rZjY; z={C47BeKLn(H51@G}=(#0VSRJnV9!%KPIuYlpDCsRi|VWr^79=@(m?6g=Y9o8!|v( zN3~Ve`rpN+Ux`XnQR9X*l~s>4EoQhOi0orKyo06bd(H{^+9`Rtuy(|@_3@~|S(1`* zxmPXn=J^6D?nI?rhEr|l6g*p$NLEn!|SOW z)DsduhQ7cdGv`a_l6d_VYn7w3KT>2<3)+2lju!npLV^4>`eYN0Kc%-BPC&=9TTh_- z`R?PEBzhh{HN11X;6fGRWOb(Lu4tbL0@4k~9g?;=4~a&&bW7i({paR5^9*m2T?+j* z@t^iKPHADNJZpNQ0Sn26tZdNRsw!NyVLFw5N!M>F0^WMO`n|6W3rY%a@Keybx=Rca z4O9}B&npdkP1;FCF?7SxDib~~iF;a%u^k8;J@xAatrW zJ#~yd;9W=xgcYMLaC6nCXaw0U%3+TStx0m5Zj47jR-&(lze{Y7w{jck)|hOUrsq4i zlPlB_Ccc~X&_S=MtvDTb@RuGxQj&`E{q9Zb_xR)fcNwSuvqNm-3ik9jb9Zxa1$(iB z{lIa+iAk1;Nu>l1Ao~a_BU9oo^yP>ao--b@avb&*_o(uBZSL6_B0u$fi6t%E}U>KCG(3!ZtBB z$)mgt{g*NzI+M_DC;&j{cPxwLpO(>*lTp`_O_*#;t(F8tYzGv;k@`e#!80Zdl{BCr zMX=5^Fs~zuza-Rfb8?DIzs?h#i=AwRr;=vUky~tXJ-DTIqnFScprLT-GWDUn3Ti^# zy1&dWxGK|cd_+?+-NapD&uibkTPTXU$gDN4d4#>;38?NmX+5U}XfjY-%70E?I(P8R zwhW`i=>E}R$7b_*>TH6?*s* z&?jwEKF!z20NAYPBBq$9Y`XV&%_Vw5q*zE_8eaK)N$P!jP=<3MYL0EgZfRY6k+sA+ zEk4c8q)&Z~s8vKEw(13iG)Fj1vL4@kW8p*%Qp6qxmU3hzfU3Tz=bJWLOENI$nr-tU zcj73ScHun@iOe#%V=3ki7o!}-@F5S>q{@OLH59V%^u(GR27&hLGcG<1NuR?io8A~3 zt!lDqD1^%fBjA#?a|}=Qp(n8LmS*kR)w*)oE6LvE-I^a|6Lo~NL92o7M^vM~8~rM( zEg^eF41JxDeo5vX(BVBxJ|RI6=jR_1ju!*g2n~>=XBri+3;USOXwfBzk3h|4jq^E9>uKAb+xY;s2iXe_r|j9}4*^`L7GvKgou_LrZ_x z<^Li7&$9Nf=)cKYW l|J7pu!*2?m{ipo@cAAC?-0ukh03iK7aepgujp2`f{|^mM@SOkv literal 0 HcmV?d00001 diff --git a/dist/puranivt_diffusion2d-0.0.1.tar.gz b/dist/puranivt_diffusion2d-0.0.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b38ee8220b14d60d75f6639566d4fa897a6938e5 GIT binary patch literal 9950 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
(K{I1Q zFu8|n(YFRyKeLNK(eWqq#X6ys-dU!J1EaIwdv``KfimzT2i1~2QA6fQ2h2JXCXTT- z%Ccxw>QCy@i}F0&!jg}=#abegXHnx&0=S(~fJU%fKr1GT1X~_MgK~t}T*md^8$72s zJ#$7OrjZ&;3cXJm2DbD7@9iv0nk_NXwSEvaGfi0Zak=$I{}@8Wx`)sWnv+D@#go7; z10h115e9$H%=ZmrKS(El@)Nnz~^DSV6}^Z{y#%av4;WwkuqIz2S=%ws!tDUgda|fGsO_ z5ulVhVTt;^-1!RehPcI3-PXUTv*j*f1wMueRya>CC$2qvY)0g zMR4>TaS@cCualm!3FVKe@#$ar*%Vz}N&T_GKh#SninBwBBMLW@2LHtR z^?F>`FZ=Zz3n(RK8ueYe;JOccH3`}NOex2a0x*}h8z&>w6 z{kIIBKL*=<%^rgYNZ4R9|M8|GH9l)i zHo3UOnNu-;o&fdxL@uQTto`-#vu%aE?@NbazIWlvQ(!CQ^M?Eh?dK;LCllA57;NzF zc-7kiUj7P9`(%}s>ZSU+aaaWpruMXe3lDv6WK6MOKUA29=tQHAa5oRYLn#Xk+|4xu z>w!PO|Lt5j^_9yoV>JezdFgF41q=Fjg5OgOHGMTFfB4p&{;&CS(=)hDzs+y`i#+`* zu;Kd(7;O63w*NoDf!gnmf#9|EKvOVsxJj?Zm**<@dfrsD4NUqAyj5B{Nc{sWI{Z}N zLDM?q(M0}i%lI?266%IdXj;3y4Y20e^ce|z(*K3tp1t3Fi1LCZplHal+F(}p*`2d0 zC%!vWtS(xMA7j8+1ijuItJ-S6P|gA?y8CM6vqHfGj&y8Tm2KuP$jShgg>{l2R+vZ} zANQC@)kOcaOpyK%%0|K5sNXL8Vd4xX%nkpS+jP~iNmsWg)Gh60j5)Rno0*vHqD-V; z;F{uCtxO*zr6Kmt&)a(V#o#4nknm3#V7H)Qt_YOQSo!_@7_$8Jpxyke2kC_ek051_ zD9bmy1^NB6*Xk|s`J*8)53J+ +Project-URL: Homepage, https://github.com/VedantKP/diffusion2D +Keywords: diffusion_equation,diffusion2d,puranivt,SSE +Classifier: Programming Language :: Python :: 3 +Classifier: License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +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 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 + +Direct installation is possible from PyPI by using the following command: + +```sh +pip3 install puranivt-diffusion2d +``` + +### Required dependencies + +The following dependencies will be automatically installed: + +1. `numpy`: It supports large, multi-dimensional arrays and matrices, along with a large collection of high-level mathematical functions to operate on these arrays. +2. `matplotlib`: A plotting library commonly used in Python. It provides an object-oriented API for embedding plots into applications using general-purpose GUI toolkits. + +## Running this package + +The equation solver is implemented in the `solve` function of the package. To make the code run: + +Either simply open a python shell and run the following commands: + +```python +from puranivt_diffusion2d.diffusion2d import solve + +solve(dx = 0.1, dy = 0.1, D = 4) +``` +**OR** + +As the starting point of the package is defined as the `solve` function itself, only calling the solve function with the optional parameters would suffice. + +```python +solve(dx = 0.1, dy = 0.1, D = 4) +``` + +## Citing + +```bibtex +@software{puranivt_diffusion2d, + author = {Vedant Puranik}, + title = {{{puranivt_diffusion2d}: A project that implementes the diffusion equation solver over a series of timesteps based on configurable parameters: (dx, dy, D)}}, + year = {2024}, + version = {0.0.1}, + url = {"https://github.com/VedantKP/diffusion2D"}, +} +``` diff --git a/puranivt_diffusion2d.egg-info/SOURCES.txt b/puranivt_diffusion2d.egg-info/SOURCES.txt new file mode 100644 index 0000000..27a12a2 --- /dev/null +++ b/puranivt_diffusion2d.egg-info/SOURCES.txt @@ -0,0 +1,12 @@ +LICENSE +README.md +pyproject.toml +puranivt_diffusion2d/__init__.py +puranivt_diffusion2d/diffusion2d.py +puranivt_diffusion2d/output.py +puranivt_diffusion2d.egg-info/PKG-INFO +puranivt_diffusion2d.egg-info/SOURCES.txt +puranivt_diffusion2d.egg-info/dependency_links.txt +puranivt_diffusion2d.egg-info/entry_points.txt +puranivt_diffusion2d.egg-info/requires.txt +puranivt_diffusion2d.egg-info/top_level.txt \ No newline at end of file diff --git a/puranivt_diffusion2d.egg-info/dependency_links.txt b/puranivt_diffusion2d.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/puranivt_diffusion2d.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/puranivt_diffusion2d.egg-info/entry_points.txt b/puranivt_diffusion2d.egg-info/entry_points.txt new file mode 100644 index 0000000..374b365 --- /dev/null +++ b/puranivt_diffusion2d.egg-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +solve = puranivt_diffusion2d.diffusion2d:solve diff --git a/puranivt_diffusion2d.egg-info/requires.txt b/puranivt_diffusion2d.egg-info/requires.txt new file mode 100644 index 0000000..aa094d9 --- /dev/null +++ b/puranivt_diffusion2d.egg-info/requires.txt @@ -0,0 +1,2 @@ +numpy +matplotlib diff --git a/puranivt_diffusion2d.egg-info/top_level.txt b/puranivt_diffusion2d.egg-info/top_level.txt new file mode 100644 index 0000000..82ffb55 --- /dev/null +++ b/puranivt_diffusion2d.egg-info/top_level.txt @@ -0,0 +1 @@ +puranivt_diffusion2d diff --git a/puranivt_diffusion2d/__init__.py b/puranivt_diffusion2d/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/diffusion2d.py b/puranivt_diffusion2d/diffusion2d.py similarity index 97% rename from diffusion2d.py rename to puranivt_diffusion2d/diffusion2d.py index 63b361b..beab508 100644 --- a/diffusion2d.py +++ b/puranivt_diffusion2d/diffusion2d.py @@ -6,7 +6,7 @@ import numpy as np import matplotlib.pyplot as plt -from output import create_plot, output_plots +from puranivt_diffusion2d.output import create_plot, output_plots def solve(dx: float = 0.1, dy: float = 0.1, D: int = 4): """Wrapper for the diffusion equation solver and image rendering functionality diff --git a/output.py b/puranivt_diffusion2d/output.py similarity index 100% rename from output.py rename to puranivt_diffusion2d/output.py diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..f5ae15e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,29 @@ +[build-system] +requires = ["setuptools", "wheel"] + +[project] +name = "puranivt_diffusion2d" +authors = [ + {name = "Vedant Puranik", email = "vedant.puranik@gmail.com"}, +] +description = "A project that implementes the diffusion equation solver over a series of timesteps based on configurable parameters: (dx, dy, D)" +readme = "README.md" +keywords = ["diffusion_equation", "diffusion2d", "puranivt", "SSE"] +classifiers = [ + "Programming Language :: Python :: 3", + "License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication", + "Operating System :: OS Independent", +] +dependencies = [ + "numpy", + "matplotlib", +] +version = "0.0.1" +requires-python = ">=3.6" + +[project.entry-points.console_scripts] +solve = "puranivt_diffusion2d.diffusion2d:solve" + +[project.urls] +Homepage = "https://github.com/VedantKP/diffusion2D" +python -m twine upload --repository testpypi dist/* --username __token__ --password your_api_token \ No newline at end of file From c2453015e56b179912f6e247ffea66f1300dfbbe Mon Sep 17 00:00:00 2001 From: Vedant Puranik Date: Thu, 14 Nov 2024 20:10:33 +0100 Subject: [PATCH 3/5] Updated README with correct package running instructions --- README.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index bbb60f3..310e923 100644 --- a/README.md +++ b/README.md @@ -31,20 +31,14 @@ The following dependencies will be automatically installed: The equation solver is implemented in the `solve` function of the package. To make the code run: -Either simply open a python shell and run the following commands: +Simply open a python shell and run the following commands: ```python from puranivt_diffusion2d.diffusion2d import solve solve(dx = 0.1, dy = 0.1, D = 4) ``` -**OR** - -As the starting point of the package is defined as the `solve` function itself, only calling the solve function with the optional parameters would suffice. - -```python -solve(dx = 0.1, dy = 0.1, D = 4) -``` +Play around with the values of these parameters to observe changes in the output. ## Citing From 0a3dced8b4264c9e481ca10c9bc975ca1c702fbd Mon Sep 17 00:00:00 2001 From: Vedant Puranik Date: Thu, 14 Nov 2024 20:11:35 +0100 Subject: [PATCH 4/5] formatted markdown of README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 310e923..8d6af62 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ from puranivt_diffusion2d.diffusion2d import solve solve(dx = 0.1, dy = 0.1, D = 4) ``` + Play around with the values of these parameters to observe changes in the output. ## Citing From 30da56960b04409327b72b9a667a2b0bd62110aa Mon Sep 17 00:00:00 2001 From: Vedant Puranik Date: Thu, 14 Nov 2024 20:15:30 +0100 Subject: [PATCH 5/5] removed upload command from pyproject.toml --- pyproject.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index f5ae15e..449cfaf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,5 +25,4 @@ requires-python = ">=3.6" solve = "puranivt_diffusion2d.diffusion2d:solve" [project.urls] -Homepage = "https://github.com/VedantKP/diffusion2D" -python -m twine upload --repository testpypi dist/* --username __token__ --password your_api_token \ No newline at end of file +Homepage = "https://github.com/VedantKP/diffusion2D" \ No newline at end of file