Re: Re: ParrallelDo and set::noval
- To: mathgroup at smc.vnet.net
- Subject: [mg102706] Re: [mg102697] Re: ParrallelDo and set::noval
- From: Mark McClure <mcmcclur at unca.edu>
- Date: Thu, 20 Aug 2009 04:55:51 -0400 (EDT)
- References: <h63cgg$1b6$1@smc.vnet.net> <h6duf8$h1c$1@smc.vnet.net>
On Wed, Aug 19, 2009 at 7:02 AM, guerom00 <guerom00 at gmail.com> wrote:
> grid = Range[4, 50, 0.5];
> testArray = Array[Null, {Length[grid]}];
> DistributeDefinitions[grid,testArray];
> ParallelDo[ iroot = 0;
> rr = grid[[i]];
> Which[4 <= rr <= 50, iroot = 1 ];
> testArray[[i]] = {i, iroot};
> , {i, 1, Length[grid]}]
>
> returns "Set::noval: Symbol testArray in part assignment does not have
> an immediate value." Somehow the DistributeDefinitions[] is not
> sufficient to indicate to each kernel that I have initialized the list
> testArray.
You're distributing the definition of testArray across
several kernels and then trying to write to the global
value of testArray. That seems potentially problematic
to me. Here's a much simpler example that shows this
kind of thing might be an issue:
(* This works fine. *)
grid = Range[10];
DistributeDefinitions[grid];
ParallelTable[grid[[i]]^2, {i, 1, Length[grid]}]
(* As does this. *)
grid = Range[10];
Table[grid[[i]] = grid[[i]]^2, {i, 1, Length[grid]}]
(* But the following yields an error. *)
grid = Range[10];
DistributeDefinitions[grid];
ParallelTable[grid[[i]] = grid[[i]]^2,
{i, 1, Length[grid]}]
Thus, we can read from the distributed definitions, but
we can't write to them. Writing to a list term by term
is inefficient in Mathematica anyway. You should
probably try to reimplement with Table/ParallelTable
instead.
Good luck,
Mark McClure