On Tuesday 01 June 2010 07:53:07 pm Dr. Christoph Pospiech wrote: > > On Tuesday 01 June 2010 02:06:08 pm Yoav Zibin wrote: > > > self.home==here > > > This means u need to use ! After the type. > > > > > > > > > Following the recent posts, I tried the following. > > > > global def ArrayD_add(s1:Array[double]!, > > s2:Array[double]!) > > {s1.region() == s2.region()}: Array[double] { > > s1.lift(s1, s2, Double.+); > > return(s1); > > } > > > > This seems to compile OK. > > > > BTW, while leaving the typedef in the code (and using it elsewhere) I had > > to remove it from the function definition, as it seem to blow up my > > workspace (compile ran out of memory). > > > > Originally, I want to do the following. > > // Finally, we set up a distribution > // with one point per place > val Dv_tmp:Dist = Dist.makeUnique(D.places()); > > val v_dst : DistArray[Array[Double]] = > DistArray.make[Array[double]](Dv_tmp); finish ateach(pt in Dv_tmp ) { > v_dst(pt) = new Array[double](n, > (q:Point) => {(0.0) as double}); > } > > // Of course the values for v_dst(pt)(q) change later > // but they stay at the same Place. > // Basically one Array[double] at each place. > > val v : Array[double] = v_dst.reduce(??, unit); > > The ArrayD_add function was supposed to go into the location marked with > ??. But now I am stating that both arguments have home == here, which is > definitely not the case for v_dst(pt), pt in Dv_tmp. > > I guess I need to add some communication by hand, say along the lines of > something like Array[double].raw().copyFrom() ? Suggestions welcome ! >
Hi, I have now implemented the functions as follows. [...] static type ArrayD = Array[Double]{rank==1}; [...] // Finally, we set up a distribution // with one point per place val Dv_tmp:Dist = Dist.makeUnique(D.places()); v_dst = DistArray.make[ArrayD](Dv_tmp); finish ateach(pt in Dv_tmp ) { v_dst(pt) = new Array[Double](n, (q:Point) => {(0.0) as Double}); } [...] /** * Lift the copyFrom function from Rails to special Arrays */ public def ArrayD_cp(s1:Array[Double]) {s1.rail()}: Array[Double]! { if (s1.home() == here) { return(s1 as Array[Double]!); } else { val n:Int = s1.raw().length(); val p:Place = s1.home(); val R:Rail[Double] = at(p) s1.raw(); val s2:Array[Double] = new Array[Double](n); s2.raw().copyFrom(0,R,0,n); return(s2 as Array[Double]!); } } /** * Function for Adding two arrays of the special ArrayD form */ public def ArrayD_add(s1:Array[Double], s2:Array[Double]) {s1.region() == s2.region(), s1.rail(), s2.rail()}: Array[Double] { val s1_loc:Array[Double]! = ArrayD_cp(s1); val s2_loc:Array[Double]! = ArrayD_cp(s2); s1_loc.lift(s1_loc, s2_loc, Double.+); return(s1_loc); } [...] /** * Initialize v to zero and use it as * neutral element in the reduce */ for ( r in v.region() ) { v(r) = 0.0; } v = v_dst.reduce(ArrayD_add, v); All except for the last line compile OK, but the compiler complains the following about the last line. Could not find field or local variable "ArrayD_add". v_dst.reduce expects a function as first variable, correct ? Why is it looking for a field ? And why doesn't it find public def ArrayD_add(s1:Array[Double],s2:Array[Double]) {s1.region() == s2.region(), s1.rail(), s2.rail()} => Array[Double] ? -- Mit freundlichen Grüßen / Kind regards Dr. Christoph Pospiech High Performance & Parallel Computing Phone: +49-351 86269826 Mobile: +49-171-765 5871 E-Mail: christoph.pospi...@de.ibm.com ------------------------------------- IBM Deutschland GmbH Vorsitzender des Aufsichtsrats: Erich Clementi Geschäftsführung: Martin Jetter (Vorsitzender), Reinhard Reschke, Christoph Grandpierre, Klaus Lintelmann, Michael Diemer, Martina Koederitz Sitz der Gesellschaft: Ehningen / Registergericht: Amtsgericht Stuttgart, HRB 14562 WEEE-Reg.-Nr. DE 99369940 ------------------------------------------------------------------------------ _______________________________________________ X10-users mailing list X10-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/x10-users