Do I need MathLink to run finite-difference fast enough for Manipulate?
- To: mathgroup at smc.vnet.net
- Subject: [mg115705] Do I need MathLink to run finite-difference fast enough for Manipulate?
- From: "James" <icorone at hotmail.com>
- Date: Wed, 19 Jan 2011 05:23:20 -0500 (EST)
Hello guys, I would like to create a Manipulate for a finite-difference on a system of PDEs using a 100x100 array that is processed about 10,000 times. Is it possible to code this in native Mathematica, for example using Compile, fast enough to be reasonably used by Manipulate (under 3 or 4 seconds)? The C++ code is below and with the Compiler set to optimize speed, it runs in approximately 1.5 seconds. However, if I attempt to just code it in Mathematica using arrays, it takes much too long to execute. Can someone help me decide if the only reasonable option is to use MathLink or can I even use MathLink in a Manipulate? Thanks Guys. Here's the C++ code. The variables u, v, and lap are all 100x100 arrays. startt=clock(); for(p=1;p<=10000;p++){ lap[0][0]=(u[0][1]-4*u[0][0]+u[0][M-1]+u[1][0]+u[N-1][0]); for(j=1;j<=M-2;j++) { lap[0][j]=(u[0][j+1]-4*u[0][j]+u[0][j-1]+u[1][j]+u[N-1][j]); } lap[0][M-1]=(u[0][0]-4*u[0][M-1]+u[0][M-2]+u[1][M-1]+u[N-1][M-1]); for(i=1;i<=N-2;i++) { lap[i][0]=(u[i][1]-4*u[i][0]+u[i][M-1]+u[i+1][0]+u[i-1][0]); } for(i=1;i<=N-2;i++) { lap[i][M-1]=(u[i][0]-4*u[i][M-1]+u[i][M-2]+u[i+1][M-1]+u[i-1][M-1]); } lap[N-1][0]=(u[N-1][1]-4*u[N-1][0]+u[N-1][M-1]+u[0][0]+u[N-2][0]); lap[N-1][M-1]=(u[N-1][0]-4*u[N-1][M-1]+u[N-1][M-2]+u[0][M-1]+u[N-2][M-1]); for(j=1;j<=M-2;j++) { lap[N-1][j]=(u[N-1][j+1]-4*u[N-1][j]+u[N-1][j-1]+u[0][j]+u[N-2][j]); } for(i=1;i<=N-2;i++) for(j=1;j<=M-2;j++) { lap[i][j]=(u[i][j+1]-4*u[i][j]+u[i][j-1]+u[i+1][j]+u[i-1][j]); } for(i=0;i<M;i++) for(j=0;j<N;j++){ u[i][j] = =u[i][j]+dt*(D_u*lap[i][j]+(a-(b+1)*u[i][j]+v[i][j]*u[i][j]*u[i][j])); } lap[0][0]=(v[0][1]-4*v[0][0]+v[0][M-1]+v[1][0]+v[N-1][0]); for(j=1;j<=M-2;j++) { lap[0][j]=(v[0][j+1]-4*v[0][j]+v[0][j-1]+v[1][j]+v[N-1][j]); } lap[0][M-1]=(v[0][0]-4*v[0][M-1]+v[0][M-2]+v[1][M-1]+v[N-1][M-1]); for(i=1;i<=N-2;i++) { lap[i][0]=(v[i][1]-4*v[i][0]+v[i][M-1]+v[i+1][0]+v[i-1][0]); } for(i=1;i<=N-2;i++) { lap[i][M-1]=(v[i][0]-4*v[i][M-1]+v[i][M-2]+v[i+1][M-1]+v[i-1][M-1]); } lap[N-1][0]=(v[N-1][1]-4*v[N-1][0]+v[N-1][M-1]+v[0][0]+v[N-2][0]); lap[N-1][M-1]=(v[N-1][0]-4*v[N-1][M-1]+v[N-1][M-2]+v[0][M-1]+v[N-2][M-1]); for(j=1;j<=M-2;j++) { lap[N-1][j]=(v[N-1][j+1]-4*v[N-1][j]+v[N-1][j-1]+v[0][j]+v[N-2][j]); } for(i=2;i<=N-2;i++) for(j=2;j<=M-2;j++) { lap[i][j]=(v[i][j+1]-4*v[i][j]+v[i][j-1]+v[i+1][j]+v[i-1][j]); } for(i=0;i<M;i++) for(j=0;j<N;j++){ v[i][j] = =v[i][j]+dt*(D_v*lap[i][j]+(b*u[i][j]-v[i][j]*u[i][j]*u[i][j])); } endt=clock(); fprintf(stderr,"%d\n",endt-startt);