It looks pretty cool! I'm quite excited to see my package being used for something other than my cos(x) + sin(y) formulas! I added another light source, so that you not just see black on the bottom of the graph. Here is also a version, of how I intended to make animations: https://gist.github.com/SimonDanisch/8c24a87631564cfdc70e
I also opened up an unofficial feature, which allows you to provide GLSL code for the calculation of an attribute. Like this, you can calculate the color on the GPU, so that you don't have to do this on the CPU and lower the bandwidth between GPU and CPU. What you upload is right now GLSL code, which is pretty much like C. Notice, that I already defined GLSL alike type alias for vectors and matrices, but they're lower case in GLSL. At some point it would be nice to just parse Julia functions instead of giving a string with GLSL code. But its better than nothing for now, I suppose. Notice, that the xyz values that you supply are stored in the vector xyz ;) Best, Simon 2014-09-03 9:41 GMT+02:00 Sheehan Olver <[email protected]>: > OK I simplified my code, so now it just requires the following commands > for wave on square + dirichlet (PDEs on disks/cylinders will come soon..): > > using GLPlot, GLAbstraction, ModernGL, ApproxFun > > > h = 0.005 > # > u0 = > TensorFun((x,y)->exp(-50x.^2-40(y-.1).^2)+.5exp(-30(x+.5).^2-40(y+.2).^2)) > d = domain(u0) > B= dirichlet(d) # dirichlet boundary conditions, try neumann(d). mixed > is also possible > SBE = schurfact([B,I-h^2*lap(d)],100) # backward euler for > first 2 time steps > SBDF = schurfact([B,I-4.0/9.0*h^2*lap(d)],100) # BDF formula for > subsequent itme steps > u = Array(TensorFun,10000) > u[1] = u0;u[2] = u0 > n=3;u[n] = SBE\[zeros(4),2u[n-1]-u[n-2]] > n=4;u[n] = SBE\[zeros(4),2u[n-1]-u[n-2]] > > N=90; xx =-1.:2/N:1.;yy = xx #grid for plotting > > obj,window=ApproxFun.plot(xx,yy,u[n])#first plot creates window > > m = 5000 # number of time steps > > for k=n+1:n+m > u[k] = SBDF\[zeros(4),1/9.0*(24u[k-1]-22u[k-2]+8u[k-3]-u[k-4])] > > ApproxFun.plot(xx,yy,u[k],obj,window)#updates window > if GLFW.WindowShouldClose(window.glfwWindow) > m=k-n > GLFW.Terminate() > break > end > end > n+=m > > > > > On 3 Sep 2014, at 11:28 am, Sheehan Olver <[email protected]> wrote: > > > Works great, see attached. (I had to go to (1+h)π as otherwise there was > a wedge missing from the plot) > > > using GLPlot, GLAbstraction, ModernGL > > > window = createdisplay(w=1000,h=1000,eyeposition=Vec3(1.,1.,1.), > lookat=Vec3(0.,0.,0.)); > color = Vec4(1,0,0,1) > n=100 > h=1./n > r=h:h:1. > t=(-1:h:1+h)*π > x=float32(r*cos(t)') > y=float32(r*sin(t)') > > f(x,y) = exp(-10x.^2-20y.^2) # arbitrary function of f > z = Vec1[Vec1(f(x[k,j],y[k,j])) for k=1:size(x,1),j=1:size(x,2)] > obj = glplot(z, xrange=x, yrange=y, color=color) > render(obj) > yield() > GLFW.SwapBuffers(window.glfwWindow) > renderloop(window) > > <PastedGraphic-3.png> > > On 3 Sep 2014, at 10:41 am, Simon Danisch <[email protected]> wrote: > > I see... I'll look into this tomorrow. > For now, I updated the code, so that you can use non uniform grids. I'm > not sure how well it works, you need to try it out for yourself: > > color = Vec4(1,0,0,1) > h=.01 > r=h:h:1. > t=-π:h*π:π-h > x=float32(r*cos(t)') > y=float32(r*sin(t)') > > f(x,y) = exp(-10x.^2-20y.^2) # arbitrary function of f > z = Vec1[Vec1(f(x[k,j],y[k,j])) for k=1:size(x,1),j=1:size(x,2)] > obj = glplot(z, xrange=x, yrange=y, color=color) > # could also be glplot(z, xrange=-1:2, yrange=0:3, color=color) > > > 2014-09-03 2:23 GMT+02:00 Sheehan Olver <[email protected]>: > >> >> Yep, here's the same code working on my office machine (iMac), which is >> successfully using the whole window. Maybe it's a video card issue? Let >> me know if there's anything I can do to debug this. >> >> <PastedGraphic-2.png> >> >> On 3 Sep 2014, at 9:35 am, Simon Danisch <[email protected]> wrote: >> >> Good to hear =) >> The plot does look really weird... Should it look like the other plots? >> >> >> >> 2014-09-03 0:51 GMT+02:00 Sheehan Olver <[email protected]>: >> >>> I tried Interact.jl, and it's really fun! Here is code that does a >>> contour plot of Helmholtz with a slider for different wave numbers, where >>> ny is the discretization in y. (nx = ∞, which means adaptive). >>> >>> >>> Pkg.add(“Interact”) >>> Pkg.add(“Gadfly”) >>> Pkg.add(“ApproxFun”) >>> Pkg.checkout(“ApproxFun”) >>> using ApproxFun,Interact >>> >>> >>> d=Interval()⊗Interval() >>> B=dirichlet(d) >>> Δ=lap(d) >>> >>> @manipulate for k=-100.0:.01:2000.0,ny=10:200 >>> contour(pdesolve([B,Δ+k*I],[1.,1.,1.,1.],ny)) >>> end >>> >>> >>> On 1 Sep 2014, at 8:21 pm, Shashi Gowda <[email protected]> wrote: >>> >>> @Sheehan >>> >>> There is now Interact.jl (Pkg.add("Interact")) which lets you travel >>> your for-loops with sliders and such widgets, to put it one way. Here's an >>> example notebook showing how you can do interactive plotting with Gadfly or >>> PyPlot: >>> http://nbviewer.ipython.org/github/JuliaLang/Interact.jl/blob/master/doc/notebooks/Interactive%20Plotting.ipynb >>> >>> >>> >>> On Mon, Sep 1, 2014 at 12:28 PM, Sheehan Olver <[email protected]> >>> wrote: >>> >>>> >>>> Got GLPlot working, it's awesome! The following does a movie of a >>>> solution to wave equation on a square using latest version of ApproxFun >>>> (the color is weird since I haven't figured that part out yet): >>>> >>>> >>>> >>>> window = createdisplay(w=1000,h=1000,eyeposition=Vec3(1,1,1), >>>> lookat=Vec3(0)) >>>> >>>> function zcolor(i, j, t) >>>> x = float32(i - 0.5) >>>> z = float32(j - 0.5) >>>> radius = sqrt((x * x) + (z * z)) >>>> >>>> r = sin(10.0f0 * radius + t) >>>> g = cos(10.0f0 * radius + t) >>>> b = radius >>>> return Vec4(r,g,b, 1) >>>> end >>>> yy=xx=-1.:.05:1. >>>> N=length(xx) >>>> color = [zcolor(i/N, j/N, 15) for i=1:N, j=1:N]; >>>> >>>> >>>> h=0.01; >>>> u0=TensorFun((x,y)->exp(-10x.^2-20(y-.1).^2)) >>>> d=Interval()⊗Interval() >>>> L=I-h^2*lap(d); >>>> B=dirichlet(d); >>>> S=schurfact([B,L],80); >>>> >>>> u=Array(TensorFun,10000) >>>> u[1]=u0 >>>> u[2]=u0 >>>> n=2; >>>> >>>> >>>> GLPlot.glClearColor(1,1,1,0) >>>> m=400 >>>> for k=n+1:n+m >>>> u[k]=(S\[zeros(4),2u[k-1]-u[k-2]]) >>>> vals=[u[k][x,y] for x in xx,y in yy]; >>>> texdata=map(Vec1,vals) >>>> obj = glplot(texdata, primitive=SURFACE(), color=color); >>>> GLPlot.glClear(GLPlot.GL_COLOR_BUFFER_BIT | >>>> GLPlot.GL_DEPTH_BUFFER_BIT) >>>> render(obj) >>>> yield() >>>> GLFW.SwapBuffers(window.glfwWindow) >>>> end >>>> n+=m >>>> >>>> On 21 Aug 2014, at 9:51 am, Simon Danisch <[email protected]> wrote: >>>> >>>> Good to hear. >>>> The test looks funny, as I overlay everything GLPlot is able to do ;) >>>> I should remove example.jl, as it uses legacy code. >>>> I'm not sure about the surface example, though... Did you change >>>> anything? >>>> This might be due to a change of the output from imread (Images.jl) and >>>> shouldn't be a problem if you use your own arrays. >>>> I'll have a look at this tomorrow... >>>> >>>> >>>> 2014-08-20 23:58 GMT+02:00 Sheehan Olver <[email protected]>: >>>> >>>>> OK I rebuilt julia and cleared my .julia folder, which seems to have >>>>> cleared that issue. Pkg.test(“GLPlot”) seems to work, though the output >>>>> looks funny. I also get the following: >>>>> >>>>> julia> include("surface.jl") >>>>> INFO: loaded GLFW 3.0.4 Cocoa NSGL chdir menubar dynamic from >>>>> /Users/solver/.julia/v0.4/GLFW/deps/usr64/lib/libglfw >>>>> ERROR: Color Format RGBA not supported >>>>> in error at error.jl:21 >>>>> in Texture at >>>>> /Users/solver/.julia/v0.4/GLAbstraction/src/GLTexture.jl:156 >>>>> in include at ./boot.jl:245 >>>>> in include_from_node1 at ./loading.jl:128 >>>>> while loading /Users/solver/.julia/v0.4/GLPlot/example/surface.jl, in >>>>> expression starting on line 24 >>>>> >>>>> julia> include("example.jl") >>>>> INFO: loaded GLFW 3.0.4 Cocoa NSGL chdir menubar dynamic from >>>>> /Users/solver/.julia/v0.4/GLFW/deps/usr64/lib/libglfw >>>>> ERROR: Cam not defined >>>>> in include at ./boot.jl:245 >>>>> in include_from_node1 at ./loading.jl:128 >>>>> while loading /Users/solver/.julia/v0.4/GLPlot/example/example.jl, in >>>>> expression starting on line 25 >>>>> >>>>> >>>>> On 20 Aug 2014, at 9:37 pm, Tim Holy <[email protected]> wrote: >>>>> >>>>> > You might need a Pkg.update(), or Pkg.build("Images") if the update >>>>> doesn't >>>>> > solve it. >>>>> > >>>>> > --Tim >>>>> > >>>>> > On Wednesday, August 20, 2014 09:23:16 PM Sheehan Olver wrote: >>>>> >> OK Now I get >>>>> >> >>>>> >> could not open file >>>>> >> /Users/solver/.julia/v0.3/Images/src/ioformats/../../deps/deps.jl >>>>> while >>>>> >> loading >>>>> /Users/solver/.julia/v0.3/Images/src/ioformats/libmagickwand.jl, in >>>>> >> expression starting on line 24 while loading >>>>> >> /Users/solver/.julia/v0.3/Images/src/Images.jl, in expression >>>>> starting on >>>>> >> line 38 while loading >>>>> >> /Users/solver/.julia/v0.3/GLAbstraction/src/GLTexture.jl, in >>>>> expression >>>>> >> starting on line 1 while loading >>>>> >> /Users/solver/.julia/v0.3/GLAbstraction/src/GLTypes.jl, in >>>>> expression >>>>> >> starting on line 40 while loading >>>>> >> /Users/solver/.julia/v0.3/GLAbstraction/src/GLAbstraction.jl, in >>>>> expression >>>>> >> starting on line 8 >>>>> >> On 20 Aug 2014, at 9:06 pm, Simon Danisch <[email protected]> >>>>> wrote: >>>>> >>> Yes I do =) >>>>> >>> You need to install Images.jl properly with its dependency. >>>>> >>> https://github.com/timholy/Images.jl >>>>> >>> I should at some point load this conditional, as you don't really >>>>> need >>>>> >>> Images.jl as long as you don't read images from your HD. >>>>> >>> >>>>> >>> >>>>> >>> 2014-08-20 13:01 GMT+02:00 Sheehan Olver <[email protected]>: >>>>> >>> OK I cloned all the necessary projects but get the following error >>>>> on OS >>>>> >>> X, and thoughts? >>>>> >>> >>>>> >>> julia> include("surface.jl") >>>>> >>> ERROR: error compiling Texture: error compiling __Texture#30__: >>>>> error >>>>> >>> compiling imread: error compiling imread: error compiling >>>>> MagickWand: >>>>> >>> could not load module : dlopen(.dylib, 1): image not found> >>>>> >>> in GLFont at /Users/solver/.julia/v0.3/GLText/src/types.jl:97 >>>>> >>> in inittext at /Users/solver/.julia/v0.3/GLText/src/GLText.jl:13 >>>>> >>> in init_glutils at >>>>> >>> /Users/solver/.julia/v0.3/GLAbstraction/src/GLInit.jl:13 >>>>> >>> in createwindow at >>>>> >>> /Users/solver/.julia/v0.3/GLWindow/src/reactglfw.jl:299 >>>>> >>> in createdisplay at >>>>> /Users/solver/.julia/v0.3/GLPlot/src/GLPlot.jl:43 >>>>> >>> in include at ./boot.jl:245 >>>>> >>> in include_from_node1 at ./loading.jl:128 >>>>> >>> >>>>> >>> while loading /Users/solver/.julia/v0.3/GLPlot/example/surface.jl, >>>>> in >>>>> >>> expression starting on line 3> >>>>> >>> On 20 Aug 2014, at 8:37 pm, Simon Danisch <[email protected]> >>>>> wrote: >>>>> >>>> In theory it does support 2D plotting, but I didn't invest much >>>>> work into >>>>> >>>> it, as 3D is my main focus. In other words: >>>>> >>>> There's nothing working out of the box, but if you are willing to >>>>> invest >>>>> >>>> some work, there are already a lot of tools to make 2D plotting >>>>> possible >>>>> >>>> and I would be willing to support you with any efforts. >>>>> >>>> >>>>> >>>> >>>>> >>>> Am Dienstag, 19. August 2014 07:46:22 UTC+2 schrieb Sheehan Olver: >>>>> >>>> Hi, >>>>> >>>> >>>>> >>>> Is there a way to force plotting in PyPlot.jl, to simulate >>>>> animation? >>>>> >>>> Right now if I do a for loop over a sequence of plots, it only >>>>> outputs >>>>> >>>> the last plot. >>>>> >>>> >>>>> >>>> This is in IJulia running on OS X with matplotlib version 1.3.1 >>>>> >>>> installed, and pygui(true) >>>>> >>>> >>>>> >>>> Sheehan >>>>> > >>>>> >>>>> >>>> >>>> >>> >>> >> >> > > >
