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

Reply via email to