Doublet + Uniform Flow // Streamfunction Polar Plot Help

Click For Summary

Discussion Overview

The discussion revolves around plotting a streamfunction in polar coordinates for a doublet combined with a uniform flow, using Python and the matplotlib library. Participants are exploring the transformation of data from Cartesian to polar coordinates and seeking to validate their plots against expected results.

Discussion Character

  • Exploratory
  • Technical explanation
  • Mathematical reasoning

Main Points Raised

  • One participant expresses uncertainty about the correctness of their polar plot and what the expected output should look like.
  • Another participant suggests debugging by comparing the polar plot to a Cartesian plot.
  • A participant confirms that their Cartesian plots worked fine but struggles to find reference plots for polar coordinates.
  • A later reply indicates that the participant believes they have produced a correct polar plot and shares their updated code, although they still question the validity of the output.

Areas of Agreement / Disagreement

There is no consensus on the correctness of the polar plot outputs, as participants express uncertainty and seek validation without reaching a definitive agreement.

Contextual Notes

Participants mention difficulties in finding reference plots for comparison, indicating a potential limitation in available resources for validating polar plots of streamfunctions.

nn2e11
Messages
3
Reaction score
1
Hello,
Python,CFD and PF newbie here.
I am using Spyder (Python 3.5) and I managed to plot my streamfunction in cartesian coordinates.
I tried transforming and plotting in polar coordinates but I am not sure that what i have done is correct.
I am not even sure what the plot should look like :/
When I run the code the result is: [See attached picture]

The code is this:

Python:
import numpy
from matplotlib import pyplot
from matplotlib import cm

N=1000
r_min, r_max = 0,1
theta_min, theta_max = 0,2*numpy.pi
r=numpy.linspace(r_min,r_max,N)
theta=numpy.linspace(theta_min, theta_max,N)
X,Y=numpy.meshgrid(r*numpy.cos(theta),r*numpy.sin(theta))

kappa = 1
r_doublet, theta_doublet=0,0

def velocity_doublet(strength, rd, thetad, X, Y):
 
    u = - strength/(2*numpy.pi)*((X-rd*numpy.cos(thetad))**2-(Y-rd*numpy.sin(thetad))**2)/((X-rd*numpy.cos(thetad))**2+(Y-rd*numpy.sin(thetad))**2)**2
    v = - strength/(2*numpy.pi)*2*(X-rd*numpy.cos(thetad))*(Y-rd*numpy.sin(thetad))/((X-rd*numpy.cos(thetad))**2+(Y-rd*numpy.sin(thetad))**2)**2
   
    return u, v

def stream_function_doublet(strength, rd, thetad, X, Y):

    psi = - strength/(2*numpy.pi)*(Y-rd*numpy.sin(thetad))/((X-rd*numpy.cos(thetad))**2+(Y-rd*numpy.sin(thetad))**2)
   
    return psi

# computes the velocity field on the mesh grid
u_doublet, v_doublet = velocity_doublet(kappa, r_doublet, theta_doublet, X, Y)

# computes the stream-function on the mesh grid
psi_doublet = stream_function_doublet(kappa, r_doublet, theta_doublet, X, Y)

#pyplot.streamplot(X, Y, u_doublet, v_doublet,
               #density=2, linewidth=1, arrowsize=1, arrowstyle='->')
#pyplot.scatter(r_doublet, theta_doublet, color='#CD2305', s=80, marker='.');

#ax = pyplot.subplot(111, polar=True)
#ax.plot(X,Y, u_doublet,v_doublet, color='r', ls='none', marker='.')

u_inf = 1.0  # the speed of the freestream

u_freestream = u_inf * numpy.ones((N, N), dtype=float)
v_freestream = numpy.zeros((N, N), dtype=float)

psi_freestream = u_inf * Y

u = u_freestream + u_doublet
v = v_freestream + v_doublet
psi = psi_freestream + psi_doublet

ax = pyplot.subplot(111, polar=True)
pyplot.scatter(r_doublet*numpy.cos(theta_doublet), r_doublet*numpy.sin(theta_doublet), color='b', s=500, marker='o')
ax.contour(X,Y, psi, levels=[-1,1,N], colors='#CD2305',linestyles='solid')
Thank you in advance :)
 

Attachments

  • PPlot.PNG
    PPlot.PNG
    6.7 KB · Views: 980
Technology news on Phys.org
Welcome to PF!

THe computer is your friend and you can use it to help you debug your problem sometimes.

Have you tried plotting it in XY coordinates to compare it to your polar plot?
 
  • Like
Likes   Reactions: nn2e11
Thank you for your reply.

Yes, everything worked fine in Cartesian coordinates. I cannot seem to find anything online either, as a reference plot at least.

Please see here for the X,Y. The upper plot is the doublet prior to applying the uniform flow. the bottom plot is the superposition of the two.
Cartesian.jpg
 
Last edited by a moderator:
I think i got it right this time. In case someone finds it useful, I have attached the code below.

It produces the following polar plot which I think makes sense(?).
cpp.jpg


Python:
import numpy
from matplotlib import pyplot
from matplotlib import cm

N=50
kappa = 1
r_doublet, theta_doublet=0,0
u_inf = 2.0  # the speed of the freestream
r_min, r_max = 0,1.025*numpy.sqrt(kappa/(2*numpy.pi*u_inf))
theta_min, theta_max = 0,2*numpy.pi
r=numpy.linspace(r_min,r_max,N)
theta=numpy.linspace(theta_min, theta_max,N)
X,Y=numpy.meshgrid(theta,r)def velocity_doublet(strength, rd, thetad, X,Y):
    Q=numpy.sqrt(strength/(2*numpy.pi*u_inf))
    V_r = u_inf*numpy.cos(X-thetad)*(1-(Q/(Y-rd))**2)
    V_theta = -u_inf*numpy.sin(X-thetad)*(1+(Q/(Y-rd))**2)
  
    return V_r, V_theta

def stream_function_doublet(strength, rd, thetad, X,Y):
    Q=numpy.sqrt(strength/(2*numpy.pi*u_inf))
    psi = u_inf*Y*numpy.sin(X-thetad)*(1-(Q/(Y-rd))**2)
  
    return psi

# computes the velocity field on the mesh grid
u_doublet, v_doublet = velocity_doublet(kappa, r_doublet, theta_doublet, X,Y)

# computes the stream-function on the mesh grid
psi_doublet = stream_function_doublet(kappa, r_doublet, theta_doublet, X,Y)
pyplot.figure(figsize=(10, 10))
ax=pyplot.subplot(111, polar=True)
ax.set_rmax(r_max)
ax.set_rmin(r_min)
ax.grid(True) 
minpsi=numpy.nanmin(psi_doublet)
maxpsi=numpy.nanmax(psi_doublet)
avgpsi=(minpsi+maxpsi)*0.5
ax.contourf(X,Y, psi_doublet, levels=numpy.linspace(numpy.nanmin(psi_doublet), numpy.nanmax(psi_doublet),N),cmap=cm.Spectral)
contf = pyplot.contourf(X, Y, psi_doublet, levels=numpy.linspace(minpsi, maxpsi, N), extend='both',cmap=cm.jet)
cbar = pyplot.colorbar(contf)
cbar.set_label('$Ψ$', fontsize=16)
cbar.set_ticks([minpsi,0.75*minpsi,0.5*minpsi,0.25*minpsi,avgpsi,0.25*maxpsi,0.5*maxpsi,0.75*maxpsi, maxpsi])
 
Last edited by a moderator:
  • Like
Likes   Reactions: Pepper Mint