MathGroup Archive 2012

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

Search the Archive

How to speed up this inner loop?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg128266] How to speed up this inner loop?
  • From: Ralph Dratman <ralph.dratman at gmail.com>
  • Date: Mon, 1 Oct 2012 02:23:46 -0400 (EDT)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • Delivered-to: l-mathgroup@wolfram.com
  • Delivered-to: mathgroup-newout@smc.vnet.net
  • Delivered-to: mathgroup-newsend@smc.vnet.net

Can someone suggest how I might optimize the For loop below for speed?
I can think of various optimizations to try, but I would like to see
what an experienced coder would do before trying to reinvent something
well known.

This is tested code, which accomplishes the basics of what I want, but
which needs to run faster.

Using Compile would be fine, but I don't yet understand how to set it
up properly.

As an aside, I found the details of calling ListConvolve difficult to
grasp from the documentation.

Thank you in advance.

Ralph Dratman
---------------------------------

(* Size of arrays *)
xSize = ySize = 40;

(* The mass at a location, not used yet. *)
mfunc[x_, y_] := 1.0;

(* Initial conditions are products of eigenfunctions in x and y. *)

zpos = Table[
   Sin[3 (x/(xSize + 1)) Pi] Sin[2 (y/(ySize + 1)) Pi], {y,
    ySize}, {x, xSize}];

(* Zero initial velocity. *)
zvel = Table[0, {y, ySize}, {x, xSize}];

(* Mass does not vary here but may later vary with position via mfunc.*)
m = Table[1., {y, ySize}, {x, xSize}];

(* Spring constant when viewing this as an array of coupled oscillators. *)
k = .05;

damp = .001;
dt = .1;

(* Discrete second derivative in PDE interpretation; *)
(* spring coupling arrangement in coupled oscillator view. *)

convKernel = {{0., 1., 0.}, {1., -4., 1.}, {0., 1., 0.}};

timeEvolve[cycles_] := Module[{},

For[i = 1, i <= cycles, i++,
zpos = zpos + zvel dt;
zvel = (1.-damp) zvel + (k/m) ListConvolve[convKernel, zpos, {{2, 2},
{2, 2}}, 0.] dt
];

Print@ListPlot3D[zpos, PlotRange -> {-1., 1.}, ImageSize -> {200}]];

Table[timeEvolve[cycles], {cycles, {0, 120, 150, 500, 600}}]



  • Prev by Date: Multi Thread in Mathematica (not multi core)
  • Next by Date: issues with expression manipulation functions
  • Previous by thread: Re: Multi Thread in Mathematica (not multi core)
  • Next by thread: issues with expression manipulation functions