You are on page 1of 15

12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

Jeron Young
MMAE 517 Computational Fluid Dynamics PS #1

In [14]: import numpy as np


import scipy as sp
import scipy.linalg
import math
import matplotlib.pyplot as plt

In [34]: T_b = 200


T_l = 60
T_inf = 20
l = .1
p = .09
k = 80
h = 15

Ac = (p**2)/(4*np.pi)
m = np.sqrt((h*p)/(k*Ac))

u_b = T_b - T_inf
u_l = T_l - T_inf

In [35]: print(Ac)
print(m)

0.0006445775195221761

5.116633539732442

Part A
In [38]: # Part A: Approximate Solution with 5 mesh points

N = 6
dx =l/(N-1)

x = np.linspace(0, 0.1, N)

#from slide 72

a = np.zeros(N)
b = np.zeros(N)
c = np.zeros(N)
d = np.zeros(N)
g = np.zeros(N)
f = np.zeros(N)

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 1/15


12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

In [39]: print(f)

[0. 0. 0. 0. 0. 0.]

In [40]: for i in range(0, N):



a[i] = 1 - dx/2*(f[i])
b[i] = -2 + dx**2*(-m**2)
c[i] = 1 + dx/2*f[i]
g[i] = -m**2

In [41]: print(a)
print(b)
print(c)
print(d)
print(g)
print(f)

[1. 1. 1. 1. 1. 1.]

[-2.01047198 -2.01047198 -2.01047198 -2.01047198 -2.01047198 -2.01047198]

[1. 1. 1. 1. 1. 1.]

[0. 0. 0. 0. 0. 0.]

[-26.17993878 -26.17993878 -26.17993878 -26.17993878 -26.17993878

-26.17993878]

[0. 0. 0. 0. 0. 0.]

In [42]: # Dirchlet BC -> slide 97


# p=1; q=0; r=temp

left = np.array([1, 0, 200])
right = np.array([1, 0, 60])

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 2/15


12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

In [43]: def thomas(N, dx, a, b, c, d, left, right):

F = np.zeros(N)
delta = np.zeros(N)
theta = np.zeros(N)

# Adjust coefficients for boundary conditions

b[0] = left[1]*b[0] + 2.0*dx*left[0]*a[0]


c[0] = left[1]*(c[0] + a[0])
d[0] = left[1]*d[0] + 2.0*dx*left[2]*a[0]

a[N-1] = right[1]*(a[N-1] + c[N-1])


b[N-1] = right[1]*b[N-1] - 2.0*dx*right[0]*c[N-1]
d[N-1] = right[1]*d[N-1] - 2.0*dx*right[2]*c[N-1]

# Forward elimination

F[0] = c[0]/b[0]
delta[0] = d[0]/b[0]

for k in range(1, N):


x1 = 1.0/(b[k] - a[k]*F[k-1])
F[k] = c[k]*x1
delta[k] = x1*(d[k] - a[k]*delta[k-1])

# Back substitution

theta[N-1] = delta[N-1]

for k in range(N-2,-1,-1):
theta[k] = delta[k] - F[k]*theta[k+1]

return theta

In [44]: theta0 = thomas(N, dx, a, b, c, d, left, right)

In [31]: print(a)
print(b)
print(c)
print(d)
print(left)
print(right)

[1. 1. 1. 1. 1. 1.]

[-2.01047198 -2.01047198 -2.01047198 -2.01047198 -2.01047198 -2.01047198]

[1. 1. 1. 1. 1. 1.]

[0. 0. 0. 0. 0. 0.]

[ 1 0 200]

[ 1 0 60]

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 3/15


12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

In [32]: print(theta0)

[200. 169.05559592 139.88153791 112.17231594 85.63775971

60. ]

In [64]: plt.plot(x, theta0, label = 'approximate N = 5')


plt.legend()
plt.grid()
plt.show()

Part B
In [65]: # Part B: Exact Solution

T_b = 200
T_l = 60
T_inf = 20
l = .1
p = .09
k = 80
h = 15
Ac = (p**2)/(4*np.pi)

m = np.sqrt((h*p)/(k*Ac))

u_b = T_b
u_l = T_l

In [66]: print(m)
print(Ac)

5.116633539732442

0.0006445775195221761

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 4/15


12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

In [67]: N = 6
dx =l/(N-1)

x = np.linspace(0, 0.1, N)

u = (u_l*np.sinh(m*x) + u_b*np.sinh(m*(l-x)))/(np.sinh(m*l))

In [68]: print(u)

[200. 169.05308642 139.87803806 112.16906781 85.63575471

60. ]

In [69]: plt.plot(x ,u, label = 'exact')


plt.legend()
plt.grid()
plt.show()

In [70]: error = u - theta0


print (error)

[ 0. -0.0025095 -0.00349985 -0.00324812 -0.00200499 0. ]

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 5/15


12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

In [71]: plt.plot(x, u, label = 'exact')


plt.plot(x, theta0, label = 'approximate')

plt.grid()
plt.legend()
plt.show()

Part C
In [74]: # Part C: Approximate Solution with 50 mesh points

N = 51
dx =l/(N-1)

x = np.linspace(0, 0.1, N)

In [75]: #from slide 72


a = np.zeros((N))
b = np.zeros((N))
c = np.zeros((N))
d = np.zeros((N))
g = np.zeros((N))
f = np.zeros((N))


for i in range(0, N):

a[i] = 1 - dx/2*(f[i])
b[i] = -2 + dx**2*(-m**2)
c[i] = 1 + dx/2*f[i]
g[i] = -m**2

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 6/15


12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

In [76]: def thomas(N, dx, a, b, c, d, left, right):

F = np.zeros(N)
delta = np.zeros(N)
theta = np.zeros(N)

# Adjust coefficients for boundary conditions

b[0] = left[1]*b[0] + 2.0*dx*left[0]*a[0]


c[0] = left[1]*(c[0] + a[0])
d[0] = left[1]*d[0] + 2.0*dx*left[2]*a[0]

a[N-1] = right[1]*(a[N-1] + c[N-1])


b[N-1] = right[1]*b[N-1] - 2.0*dx*right[0]*c[N-1]
d[N-1] = right[1]*d[N-1] - 2.0*dx*right[2]*c[N-1]

# Forward elimination

F[0] = c[0]/b[0]
delta[0] = d[0]/b[0]

for k in range(1, N):


x1 = 1.0/(b[k] - a[k]*F[k-1])
F[k] = c[k]*x1
delta[k] = x1*(d[k] - a[k]*delta[k-1])

# Back substitution

theta[N-1] = delta[N-1]

for k in range(N-2,-1,-1):
theta[k] = delta[k] - F[k]*theta[k+1]

return theta

In [77]: theta1= thomas(N, dx, a, b, c, d, left, right)

In [78]: print(theta1)

[200. 196.81649445 193.65359947 190.51098384 187.38831849

184.28527639 181.2015326 178.13676419 175.09065021 172.06287169

169.05311155 166.06105461 163.08638755 160.12879884 157.18797879

154.26361943 151.35541451 148.4630595 145.5862515 142.72468926

139.87807311 137.04610496 134.22848824 131.4249279 128.63513034

125.85880343 123.09565641 120.34539995 117.60774602 114.88240795

112.16910034 109.46753905 106.77744117 104.098525 101.43051

98.77311678 96.12606705 93.48908363 90.86189035 88.24421212

85.63577479 83.03630522 80.4455312 77.86318141 75.28898543

72.7226737 70.16397747 67.61262879 65.06836049 62.53090614

60. ]

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 7/15


12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

In [79]: N1 = 51
dx1 =l/(N-1)
x1 = np.linspace(0, 0.1, N1)

u1 = (u_l*np.sinh(m*x1) + u_b*np.sinh(m*(l-x1)))/(np.sinh(m*l))

In [80]: error = u1 - theta1



print (error)

[ 0.00000000e+00 -3.28292757e-06 -6.38633713e-06 -9.31344414e-06

-1.20674270e-05 -1.46514276e-05 -1.70685526e-05 -1.93218731e-05

-2.14144256e-05 -2.33492133e-05 -2.51292055e-05 -2.67573391e-05

-2.82365190e-05 -2.95696185e-05 -3.07594801e-05 -3.18089157e-05

-3.27207077e-05 -3.34976093e-05 -3.41423451e-05 -3.46576115e-05

-3.50460776e-05 -3.53103854e-05 -3.54531506e-05 -3.54769631e-05

-3.53843874e-05 -3.51779634e-05 -3.48602064e-05 -3.44336085e-05

-3.39006381e-05 -3.32637414e-05 -3.25253422e-05 -3.16878427e-05

-3.07536241e-05 -2.97250469e-05 -2.86044516e-05 -2.73941589e-05

-2.60964706e-05 -2.47136699e-05 -2.32480217e-05 -2.17017734e-05

-2.00771553e-05 -1.83763810e-05 -1.66016479e-05 -1.47551378e-05

-1.28390172e-05 -1.08554378e-05 -8.80653725e-06 -6.69443919e-06

-4.52125401e-06 -2.28907925e-06 0.00000000e+00]

Part D
In [81]: k = 80
Ac = (p**2)/(4*np.pi)

In [82]: # Part D: Forward Finite Difference Approximations


qf_first = (-k*Ac)*(u1[0+1]-u1[0])/(dx1)
qf_second = (-k*Ac)*(-u1[0+2]+4*u1[0+1]-3*u1[0])/(2*dx1)
qf_third = (-k*Ac)*((1/3)*u1[0+3]-(3/2)*u1[0+2]+3*u1[0+1]-(11/6)*u1[0])/(dx

qf_exact = (k*Ac*m)*(u_b*np.cosh(m*l)-u_l)/(np.sinh(m*l))

In [83]: print(qf_first)
print(qf_second)
print(qf_third)

print(qf_exact)

82.08072919160233

82.34643377336978

82.3492804064855

82.34929427395795

Problem 2

Part A
localhost:8889/notebooks/MMAE 517 PS %231.ipynb 8/15
12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

In [84]: # Part A: Robin Boundary Conditions



N = 51
x = np.linspace(0, 0.1, N)

T_b = 200
T_l = 60
T_inf = 20
l = .1
p = .09
k = 80
h = 15

u_b = T_b - T_inf
u_l = T_l - T_inf

m = np.sqrt((h*p)/(k*Ac))

dx =l/(N-1)

In [85]: #from slide 72



a1 = np.zeros((N))
b1 = np.zeros((N))
c1 = np.zeros((N))
d1 = np.zeros((N))
g1 = np.zeros((N))
f1 = np.zeros((N))


for i in range(0, N):

a1[i] = 1 - dx/2*(f1[i])
b1[i] = -2 + dx**2*(-m**2)
c1[i] = 1 + dx/2*f1[i]
g1[i] = -m**2

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 9/15


12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

In [86]: print(a1)
print(b1)
print(c1)

[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.

1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.

1. 1. 1.]

[-2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472

-2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472

-2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472

-2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472

-2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472

-2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472

-2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472

-2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472 -2.00010472

-2.00010472 -2.00010472 -2.00010472]

[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.

1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.

1. 1. 1.]

In [87]: a = a1
b = b1
c = c1
d = d1
g = g1
f = f1

In [88]: print(a)

[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.

1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.

1. 1. 1.]

In [89]: #slide 94 -> Robin boundary conditions


#p = h
#q = k
#r = 0

left = np.array([1, 0, 200])
right = np.array([-h, -m**2 , 0])

In [90]: print(left)
print(right)

[ 1 0 200]

[-15. -26.17993878 0. ]

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 10/15


12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

In [91]: def thomas(N, dx, a, b, c, d, left, right):

F = np.zeros(N)
delta = np.zeros(N)
theta = np.zeros(N)

# Adjust coefficients for boundary conditions

b[0] = left[1]*b[0] + 2.0*dx*left[0]*a[0]


c[0] = left[1]*(c[0] + a[0])
d[0] = left[1]*d[0] + 2.0*dx*left[2]*a[0]

a[N-1] = right[1]*(a[N-1] + c[N-1])


b[N-1] = right[1]*b[N-1] - 2.0*dx*right[0]*c[N-1]
d[N-1] = right[1]*d[N-1] - 2.0*dx*right[2]*c[N-1]

# Forward elimination

F[0] = c[0]/b[0]
delta[0] = d[0]/b[0]

for k in range(1, N):


x1 = 1.0/(b[k] - a[k]*F[k-1])
F[k] = c[k]*x1
delta[k] = x1*(d[k] - a[k]*delta[k-1])

# Back substitution

theta[N-1] = delta[N-1]

for k in range(N-2,-1,-1):
theta[k] = delta[k] - F[k]*theta[k+1]

return theta

In [92]: theta3 = thomas(N, dx, a, b, c, d, left, right)

In [93]: print (theta3)

[200. 198.87664462 197.77411555 196.69229734 195.6310767

194.5903425 193.56998575 192.5698996 191.58997933 190.63012231

189.69022803 188.77019806 187.86993606 186.98934776 186.12834094

185.28682543 184.46471311 183.66191789 182.8783557 182.11394449

181.3686042 180.64225679 179.9348262 179.24623833 178.57642109

177.92530433 177.29281986 176.67890145 176.08348481 175.5065076

174.94790938 174.40763166 173.88561787 173.38181334 172.8961653

172.42862292 171.97913721 171.54766112 171.13414946 170.73855892

170.36084808 170.00097739 169.65890917 169.33460758 169.02803866

168.73917033 168.46797232 168.21441623 167.97847551 167.76012547

167.55934321]

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 11/15


12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

In [94]: plt.plot(x, theta3, label = 'approximate N = 50')


plt.legend()
plt.grid()
plt.show()

Part B

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 12/15


12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

In [95]: # Part B: Exact Solution



T_b = 200
T_l = 60
T_inf = 20
l = .1
p = .09
k = 80
h = 15

Ac = (p**2)/(4*np.pi)
m = np.sqrt((h*p)/(k*Ac))

u_l = T_l - T_inf

N = 51
x = np.linspace(0, 0.1, N)

u_b = T_b
hbar = h/(m*k)

u2 = (u_b*np.cosh(m*(l-x))+hbar*np.sinh(m*(l-x)))/(np.cosh(m*l)+hbar*math.s

plt.plot(x ,u2, label = 'exact')
plt.grid()
plt.show()

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 13/15


12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

In [96]: plt.plot(x ,u2, label = 'exact')


plt.plot(x, theta3, label = 'approximate N = 50')

plt.grid()
plt.legend()
plt.show()

In [97]: print(u2)

[196.62186748 195.68368446 194.76599356 193.86869868 192.99170587

192.13492327 191.29826118 190.48163196 189.68495011 188.9081322

188.15109687 187.41376485 186.69605892 185.99790393 185.31922677

184.65995635 184.02002366 183.39936166 182.79790536 182.21559179

181.65235995 181.10815087 180.58290756 180.07657501 179.5891002

179.12043208 178.67052157 178.23932156 177.82678689 177.43287436

177.05754272 176.70075266 176.36246683 176.04264979 175.74126805

175.45829006 175.19368617 174.94742869 174.71949182 174.50985169

174.31848634 174.14537575 173.99050178 173.85384821 173.73540073

173.63514694 173.55307633 173.48918032 173.44345222 173.41588722

173.40648246]

In [98]: error = u2 - theta3



print (error)

[-3.37813252 -3.19296016 -3.00812199 -2.82359866 -2.63937083 -2.45541922

-2.27172457 -2.08826764 -1.90502921 -1.72199011 -1.53913116 -1.35643321

-1.17387714 -0.99144383 -0.80911417 -0.62686907 -0.44468945 -0.26255623

-0.08045033 0.1016473 0.28375575 0.46589408 0.64808136 0.83033668

1.01267911 1.19512775 1.37770171 1.56042011 1.74330208 1.92636676

2.10963334 2.293121 2.47684896 2.66083645 2.84510275 3.02966714

3.21454896 3.39976757 3.58534236 3.77129277 3.95763826 4.14439836

4.33159261 4.51924063 4.70736206 4.89597661 5.08510402 5.27476409

5.4649767 5.65576176 5.84713925]

In [ ]: ​

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 14/15


12/8/22, 11:57 AM MMAE 517 PS #1 - Jupyter Notebook

localhost:8889/notebooks/MMAE 517 PS %231.ipynb 15/15

You might also like