Advertisement
Guest User

JuliaCode_complete

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