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