Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

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);


  • Prev by Date: Re: question about CUDA
  • Next by Date: Re: Using Mathematica v.7 Tooltip in ListDensityPlot
  • Previous by thread: within ROOT(similar with c++), put big data into mathematica then get
  • Next by thread: Re: Do I need MathLink to run finite-difference fast enough for Manipulate?