Advertisement
Guest User

JuliaCode_complete

a guest
Aug 9th, 2019
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 13.31 KB | None | 0 0
  1. function IFR(surf::TwoDSurf,x,z,t::Float64)
  2.     # Given body frame and kinematics, find global positions
  3.     alpha = surf.kindef.alpha(t)
  4.     X0 = -surf.kindef.u(t)*t
  5.     Z0 = surf.kindef.h(t)
  6.     pvt = surf.pvt
  7.  
  8.     X = (x .- pvt).*cos(alpha) + z.*sin(alpha) .+ X0 .+ pvt
  9.     Z = -(x .- pvt).*sin(alpha) + z.*cos(alpha) .+ Z0
  10.  
  11.     return X,Z
  12. end
  13.  
  14. function BFR(surf::TwoDSurf,X,Z,t::Float64)
  15.     # Given inertial frame and kinematics, find body positions
  16.     alpha = surf.kindef.alpha(t)
  17.     X0 = -surf.kindef.u(t)*t
  18.     Z0 = surf.kindef.h(t)
  19.     pvt = surf.pvt
  20.  
  21.     x = (X .- X0 .- pvt).*cos(alpha) - (Z .- Z0).*sin(alpha) .+ pvt
  22.     z = (X .- X0 .- pvt).*sin(alpha) + (Z .- Z0).*cos(alpha)
  23.  
  24.     return x,z
  25. end
  26.  
  27.  
  28. function refresh_vortex(surf::TwoDSurf,vor_loc)
  29.     # Updates vortex locations to vor_loc
  30.     for i=1:length(surf.bv)
  31.         surf.bv[i].x = vor_loc[i,1]
  32.         surf.bv[i].z = vor_loc[i,2]
  33.     end
  34.     return surf
  35. end
  36.  
  37. function place_tev2(surf::TwoDSurf,field::TwoDFlowField,dt)
  38.     vorx = map(q -> q.x,surf.bv)
  39.     vorz = map(q -> q.z,surf.bv)
  40.     if size(field.tev,1) == 0
  41.         xloc = surf.bv[end].x + 0.5*surf.kinem.u*dt
  42.         zloc = surf.bv[end].z
  43.     else
  44.         xloc = surf.bv[end].x + (1. /3.)*(field.tev[end].x - surf.bv[end].x)
  45.         zloc = surf.bv[end].z + (1. /3.)*(field.tev[end].z - surf.bv[end].z)
  46.     end
  47.     push!(field.tev,TwoDVort(xloc,zloc,0.,0.02*surf.c,0.,0.))
  48.     return field
  49. end
  50.  
  51. function vor_BFR(surf::TwoDSurf,t,IFR_field::TwoDFlowField,curfield::TwoDFlowField)
  52.     # finds and updates the BFR positions of the vortexes in IFR_field to
  53.     #   curfield
  54.     ntev = size(IFR_field.tev,1)
  55.     nlev = size(IFR_field.lev,1)
  56.     vorX = [map(q -> q.x,IFR_field.tev); map(q -> q.x,IFR_field.lev)]
  57.     vorZ = [map(q -> q.z,IFR_field.tev); map(q -> q.z,IFR_field.lev)]
  58.  
  59.     # Body frame conversion
  60.     vorx, vorz = BFR(surf,vorX,vorZ,t)
  61.  
  62.     # Update bfr TEV
  63.     for i = 1:ntev
  64.         curfield.tev[i].x = vorx[i]
  65.         curfield.tev[i].z = vorz[i]
  66.     end
  67.     # Update bfr LEV
  68.     for i = 1:nlev
  69.         curfield.lev[i].x = vorx[i+ntev]
  70.         curfield.lev[i].z = vorz[i+ntev]
  71.     end
  72.     return curfield
  73. end
  74.  
  75. function influence_coeff(surf::TwoDSurf,curfield::TwoDFlowField,coll_loc,n,dt)
  76.     # With the surface and flowfield, determine the influence matrix "a"
  77.     a = zeros(surf.ndiv,surf.ndiv)
  78.     a[end,:] .= 1. # for wake portion
  79.     vc = surf.bv[1].vc
  80.  
  81.     if size(curfield.tev,1) == 0 # calculate TEV placement location
  82.         xloc = surf.bv[end].x + 0.5*surf.kinem.u*dt*cos(surf.kinem.alpha)
  83.         zloc = surf.bv[end].z + 0.5*surf.kinem.u*dt*sin(surf.kinem.alpha)
  84.     else
  85.         xloc = surf.bv[end].x + (1. /3.)*(curfield.tev[end].x - surf.bv[end].x)
  86.         zloc = surf.bv[end].z + (1. /3.)*(curfield.tev[end].z - surf.bv[end].z)
  87.     end
  88.  
  89.     for i = 1:surf.ndiv-1, j = 1:surf.ndiv
  90.         # i is test location, j is vortex source
  91.         t_x = coll_loc[i,1]
  92.         t_z = coll_loc[i,2]
  93.  
  94.         if j < surf.ndiv # Bound vortices (a_ij)
  95.             src = surf.bv[j]
  96.             xdist = src.x .- t_x
  97.             zdist = src.z .- t_z
  98.         else # Wake vorticy (a_iw)
  99.             xdist = xloc .- t_x
  100.             zdist = zloc .- t_z
  101.         end
  102.  
  103.         distsq = xdist.*xdist + zdist.*zdist
  104.         u = -zdist./(2*pi*sqrt.(vc*vc*vc*vc .+ distsq.*distsq))
  105.         w = xdist./(2*pi*sqrt.(vc*vc*vc*vc .+ distsq.*distsq))
  106.  
  107.         a[i,j] = u*n[i,1] + w*n[i,2]
  108.     end
  109.     return a
  110. end
  111.  
  112. function LVE(surf::TwoDSurf,curfield::TwoDFlowField,nsteps::Int64 = 500,dtstar::Float64 = 0.015,frameCnt = 20,view = "square")
  113.     ## Initialize variables
  114.     mat = zeros(8 ,0) # loads output matrix
  115.     prevCirc = 0
  116.     vor_loc = zeros(surf.ndiv-1,2) # (x1,z1 ; x2,z2 ...) Inertial frame
  117.     coll_loc = zeros(surf.ndiv-1,2) # (x1,z1 ; x2,z2 ...)
  118.     global RHS = zeros(surf.ndiv)
  119.     IFR_vor = 0 .* vor_loc # Global frame
  120.     IFR_field = TwoDFlowField()
  121.     IFR_surf = TwoDSurf(surf.coord_file,surf.pvt,surf.kindef,surf.lespcrit; ndiv = surf.ndiv, camberType = "linear")
  122.     dp = zeros(surf.ndiv-1,1) # change in panel pressure
  123.     aniStep = round((nsteps-1) / frameCnt) # Frames to capture animation on
  124.     aniStep < 1 ? aniStep = 1 : aniStep
  125.     frames = 0
  126.     prevNow = 0
  127.     tevCirc = []
  128.  
  129.     #   length of each panel
  130.     ds = sqrt.(( surf.x[1:end-1]-surf.x[2:end]).^2 + (surf.cam[1:end-1]-surf.cam[2:end]).^2)
  131.     #   Surf cam_slope does not give the correct panel locations
  132.     cam_slope = asind.((surf.cam[2:end]-surf.cam[1:end-1])./ds) # [deg]
  133.  
  134.     # Normal vectors for each panel
  135.     n = hcat(-sind.(cam_slope),cosd.(cam_slope))
  136.     # Tangential vectors for each panel
  137.     tau = hcat(cosd.(cam_slope),sind.(cam_slope))
  138.  
  139.     ## Vortex Locations
  140.     # Located at 25% of each panel
  141.     #   Vortex loactions (at 25% of panel length)
  142.     vor_loc[:,1] = surf.x[1:end-1] + .25 .* ds .* cosd.(cam_slope)
  143.     vor_loc[:,2] = surf.cam[1:end-1] + .25 .* ds .* sind.(cam_slope)
  144.     #   Collocation points (at 75% panel chordwise)
  145.     coll_loc[:,1] = surf.x[1:end-1] + .75 .* ds .* cosd.(cam_slope)
  146.     coll_loc[:,2] = surf.cam[1:end-1] + .75 .* ds .* sind.(cam_slope)
  147.  
  148.     ## Refresh vortex values
  149.     refresh_vortex(surf,vor_loc)
  150.  
  151.     ## Time Stepping Loop
  152.     t = -dtstar
  153.  
  154.     for i = 0:nsteps
  155.         t += dtstar
  156.  
  157.         # Update Kinematics
  158.         update_kinem(surf, t)
  159.  
  160.         ## Influence Coeffcients
  161.         a = influence_coeff(surf,curfield,coll_loc,n,dtstar)
  162.  
  163.         ## RHS Vector
  164.         RHS[end] = prevCirc # previous total circulation
  165.         # u_w, w_w
  166.         if length(curfield.tev) > 0 # Trailing edge vortexs exist
  167.             surf.uind[1:end-1], surf.wind[1:end-1] = ind_vel([curfield.tev; curfield.lev],coll_loc[:,1],coll_loc[:,2])
  168.             #surf.uind[end-1] = surf.uind[end-2]
  169.             #surf.wind[end-1] = surf.wind[end-2]
  170.         end
  171.         for j = 1:surf.ndiv-1
  172.             alpha = surf.kinem.alpha
  173.             # relVel = [U(t) ; W(t)]
  174.             global relVel = [cos(alpha) -sin(alpha) ; sin(alpha) cos(alpha)] * [surf.kinem.u ; -surf.kinem.hdot] + [-surf.kinem.alphadot*coll_loc[j,2] ; surf.kinem.alphadot * (coll_loc[j,1] - surf.pvt)]
  175.  
  176.             # RHS = -[U_t + u_w , W_t + w_w] dot n
  177.             global RHS[j] = -((relVel[1] + surf.uind[j])*n[j,1] + (relVel[2] + surf.wind[j])*n[j,2])
  178.  
  179.         end
  180.  
  181.         ## Vortex Strenghths a*circ = RHS
  182.         global circ = a\RHS
  183.  
  184.         circChange = sum(circ[1:end-1]) - prevCirc #bound vorticy circ change
  185.         prevCirc = sum(circ[1:end-1])
  186.  
  187.         for j = 1:surf.ndiv-1 # Set bv circs
  188.             surf.bv[j].s = circ[j]
  189.         end
  190.         # Inertial reference frame
  191.         IFR_vor[:,1],IFR_vor[:,2] = IFR(surf,vor_loc[:,1],vor_loc[:,2],t)
  192.         IFR_surf = refresh_vortex(IFR_surf,IFR_vor)
  193.  
  194.         ## TEV setup
  195.         place_tev2(IFR_surf,IFR_field,dtstar)
  196.         if length(IFR_field.tev) > 1
  197.             IFR_field.tev[end].s = circ[end]
  198.         end
  199.  
  200.         # Position mesh
  201.         if i % aniStep == 0.
  202.  
  203.             temp = Int(i / aniStep) + 1
  204.             now = Dates.format(Dates.now(), "HH:MM")
  205.             if prevNow == now
  206.                 println("$temp / $frameCnt")
  207.             else
  208.                 println("$temp / $frameCnt,  $now")
  209.             end
  210.             prevNow = now
  211.             # Velocities at mesh points
  212.             vorts = IFR_field.tev[:]
  213.             global mesh = meshgrid(surf,vorts,.25,t,100,view)
  214.             vorts = [vorts ; IFR_surf.bv]
  215.             for j = 1:size(vorts,1)
  216.                 u,w = ind_vel(vorts[j],mesh.x,mesh.z)
  217.                 global mesh.uMat = mesh.uMat .+ u
  218.                 global mesh.wMat = mesh.wMat .+ w
  219.                 global mesh.velMag = sqrt.(mesh.uMat.^2 + mesh.wMat.^2)
  220.                 global mesh.t = t
  221.                 global mesh.circ = circ
  222.             end
  223.             if frames == 0
  224.                 frames = [mesh;]
  225.             else
  226.                 push!(frames,mesh)
  227.             end
  228.         end
  229.         if i > 0
  230.             ## Pressures (Change in pressure for each panel)
  231.             for j = 1:length(dp)
  232.                 dp[j] = surf.rho * ( ( (relVel[1] + surf.uind[j])*tau[j,1] + (relVel[2] + surf.wind[j])*tau[j,2] ) * circ[j]/ds[j] + circChange )
  233.             end
  234.             ## Loads
  235.             # Cn normal
  236.             ndem = .5 * surf.rho * surf.kinem.u^2 * surf.c # non-dimensionalization constant
  237.             cn = sum( dp[j]*ds[j] for j = 1:length(dp) ) / ndem
  238.             # LESP
  239.             x = 1 - 2*ds[1] / surf.c
  240.             surf.a0[1] = 1.13 * circ[1] / ( surf.kinem.u * surf.c * ( acos(x) + sin(acos(x) )))
  241.             # Cs suction
  242.             cs = 2*pi*surf.a0[1]^2
  243.             # Cl lift
  244.             alpha = surf.kinem.alpha
  245.             cl = cn*cos(alpha) + cs*sin(alpha)
  246.             # Cd drag
  247.             cd = cn*sin(alpha) - cs*cos(alpha)
  248.             # Cm moment
  249.             ndem = ndem * surf.c # change ndem to moment ndem
  250.             cm = -sum( dp[j]*ds[j]*(vor_loc[j,1]-surf.pvt) for j = 1:length(dp) ) / ndem
  251.  
  252.             mat = hcat(mat,[t, surf.kinem.alpha*180/pi, surf.kinem.h, surf.kinem.u, surf.a0[1], cl, cd, cm]) # Pressures and loads
  253.  
  254.         end
  255.         ## Wake Rollup
  256.         IFR_field = wakeroll(IFR_surf,IFR_field,dtstar)
  257.  
  258.         # Convert IFR_field values to curfield (IFR to BFR)
  259.         push!(curfield.tev,TwoDVort(0,0,IFR_field.tev[end].s,0.02*surf.c,0.,0.))
  260.         vor_BFR(surf,t,IFR_field,curfield)
  261.  
  262.         tevCirc = [tevCirc ; prevCirc]
  263.  
  264.     end
  265.     mat = mat
  266.     test = tevCirc
  267.     return frames,IFR_field,mat,test
  268. end
  269.  
  270. #### MAIN File
  271. include("src/UnsteadyFlowSolvers.jl")
  272. using Revise
  273. ## Define Geometry and Kinematics
  274. # Kinematics
  275. case = 2 # kinematics case to run
  276. if case == 1
  277.     amp = 35 #degrees
  278.     k = .005
  279.     tstart = 60 # non-dimensional time
  280. elseif case == 2
  281.     amp = 45
  282.     k = .05
  283.     tstart = 20
  284. elseif case == 3
  285.     amp = 90
  286.     k = .4
  287.     tstart = 10
  288. elseif case == 4
  289.     amp = 25
  290.     k = .11
  291.     a = 11
  292.     tstart = 1
  293. end
  294. #amp = amp * pi / 180
  295. if case != 4
  296. a = (pi^2 * k*180 )/(2*amp*pi *(1-0.1))
  297. end
  298.  
  299. alpha = 10
  300. alphadef = UnsteadyFlowSolvers.ConstDef(alpha *pi/180)#EldUptstartDef(amp,k,a,1)#tstart)
  301. hdef = UnsteadyFlowSolvers.ConstDef(0)
  302. udef = UnsteadyFlowSolvers.ConstDef(1)
  303. full_kinem = UnsteadyFlowSolvers.KinemDef(alphadef, hdef, udef)
  304. # Geometry
  305. pvt = 0.25 ;
  306. geometry = "FlatPlate"#"bin/sd7003.dat"
  307. lespcrit = [10000;]
  308. surf = UnsteadyFlowSolvers.TwoDSurf(geometry,pvt,full_kinem,lespcrit; ndiv = 70, camberType = "linear")
  309. curfield = UnsteadyFlowSolvers.TwoDFlowField()
  310. # Iteration Parameters
  311. dtstar = UnsteadyFlowSolvers.find_tstep(alphadef)
  312.  
  313. #=Solve for time needed to acheive maximum AoA with a proportional loop
  314. global t = tstart
  315. global alpha = alphadef(t) *180/pi
  316. P = 10
  317. while alpha <= amp - .05 || alpha >= amp + .05 # Timestep is outside .05 degrees
  318.     global alpha = alphadef(t) *180/pi
  319.     error = amp - alpha
  320.     global t += P*error
  321.     #println(alpha )#* 180 / pi)
  322.     if t > 10000
  323.         break
  324.     end
  325. end
  326. t_tot = ceil(t)
  327. =#
  328. t_tot = 9
  329. nsteps = Int(round(t_tot/dtstar))
  330. nsteps = 40 #DEBUG
  331.  
  332. println("Running LVE")
  333. frames, ifr_field, mat, test = UnsteadyFlowSolvers.LVE(surf,curfield,nsteps,dtstar,40,"longwake")
  334. #circ,a,RHS = UnsteadyFlowSolvers.LVE(surf,curfield,nsteps,dtstar)
  335.  
  336. #=
  337. println("Running LDVM")
  338. startflag = 0
  339. writeflag = 0
  340. writeInterval = t_tot/18.
  341. surf2 = UnsteadyFlowSolvers.TwoDSurf(geometry,pvt,full_kinem,lespcrit; ndiv = 4)
  342. curfield2 = UnsteadyFlowSolvers.TwoDFlowField()
  343. delvort = UnsteadyFlowSolvers.delNone()
  344.  
  345. mat2, surf2, curfield2 = UnsteadyFlowSolvers.ldvm(surf2, curfield2, nsteps, dtstar,startflag, writeflag, writeInterval, delvort)
  346. #mat2 = UnsteadyFlowSolvers.ldvm(surf2, curfield2, nsteps, dtstar,startflag, writeflag, writeInterval, delvort)
  347. =#
  348. # mat = [t , alpha , h , u , LESP , cl , cd , cm] for each timestep
  349.  
  350. # Velocity plot
  351. using Plots
  352. pyplot()
  353. single = "false" ;
  354. if single == "true"
  355.     mesh = frames[end]
  356.  
  357.     contour(mesh.x[1,:],mesh.z[:,1], mesh.velMag,fill=true,levels = 200,c = :lightrainbow_r)
  358.     scatter!(mesh.vorX, mesh.vorZ,markersize = 1.5, markerstrokestyle = :dot, markerstrokecolor = :white)
  359.     plot!(mesh.camX,mesh.camZ,color = :black, linewidth = 3, aspect_ratio = :equal,legend = :none,axis = false)
  360. elseif single == "false" # Make full list of images in folder
  361.     dir = "case_$case steps_$nsteps"
  362.     mkdir(dir)
  363.     for i = 1:length(frames)
  364.         mesh = frames[i]
  365.  
  366.         contour(mesh.x[1,:],mesh.z[:,1], mesh.velMag,fill=true,levels = 200,c = :lightrainbow_r)
  367.         scatter!(mesh.vorX, mesh.vorZ,markersize = 1.5, markerstrokestyle = :dot, markerstrokecolor = :white)
  368.         plot!(mesh.camX,mesh.camZ,color = :black, linewidth = 3, aspect_ratio = :equal,legend = :none,axis = false)
  369.  
  370.         savefig("$dir/$i")
  371.     end
  372. end
  373. #
  374. #= Plot circ vs alpha
  375. circ = map(q -> q.circ[1],frames)
  376. alpha = map(q -> q.alpha,frames)
  377. plot(alpha,circ)
  378. circ1 = frames[1].circ
  379. x = (1:length(circ1))/length(circ1)
  380. plot(x,circ1)
  381. =#
  382.  
  383. #= Force plots
  384. #UnsteadyFlowSolvers.makeForcePlots2D()
  385.  
  386. plot(mat[:,1],mat[:,6],color = :black) # cl vs AoA
  387. plot!(mat2[:,1],mat2[:,6],color = :red)
  388. =#
  389. alpha = Int(alpha)
  390. #plot(mat2[:,1],mat2[:,2], xlabel = "t*", ylabel = "AoA")
  391. #savefig("RameshData_Motion_$alpha")
  392.  
  393. UnsteadyFlowSolvers.subPlotForces(mat,1,"t*","MyData_$alpha")
  394.  
  395. plot(mat[:,1],test[1:end-1], xlabel = "t*", ylabel = "TEV Strength")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement