home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / misc / math / parall.sit / Parallaxis 2.0 / fractal.p < prev    next >
Encoding:
Text File  |  1990-12-12  |  2.0 KB  |  79 lines

  1. SYSTEM fractal;
  2. CONST  maxlevel = 7;
  3. (* specification of binary tree-structure *)
  4. CONFIGURATION tree [1..2**maxlevel -1];
  5. CONNECTION    son_l : tree[i] -> tree[2*i].father;
  6.               son_r : tree[i] -> tree[2*i+1].father;
  7.               father: tree[i] -> {even(i)} tree[i div 2].son_l,
  8.                                  {odd(i)}  tree[i div 2].son_r;
  9. SCALAR  i,j         : integer;
  10.         delta       : real;
  11.         field       : ARRAY [1..2**maxlevel-1] OF real;
  12. VECTOR  x, low, high: real;
  13.  
  14. PROCEDURE Gauss(): VECTOR real;
  15. (* random number with Gaussian distribution *)
  16. CONST N = 4;
  17.       A = MAX(integer);
  18.       GA= (3.0*float(N))**0.5;
  19.       GF= 2.0*GA / (float(N)*float(A));
  20. SCALAR i  : integer; 
  21. VECTOR sum: real;
  22. BEGIN
  23.   sum:=0.0;
  24.   FOR i:=1 to N DO sum:= sum + float(VIRandom()) END;
  25.   RETURN (GF*sum - GA)
  26. END Gauss;
  27.  
  28. PROCEDURE inorder(SCALAR node: integer);
  29. CONST maxnode = 2 ** maxlevel -1;
  30. BEGIN
  31.   IF node <= maxnode THEN
  32.     inorder(2*node);
  33.       WriteFixPt(field[node], 10,3);
  34.       WriteLn;
  35.     inorder(2*node+1);
  36.   END
  37. END inorder;
  38.  
  39. PROCEDURE MidPointRec(SCALAR delta: real; SCALAR level: integer);
  40. SCALAR  min, max, max2 : integer;
  41. BEGIN
  42.   (* select tree-level: 2**(level-1) <= id_no <= 2**level - 1 *)
  43.   min := 2**(level-1);
  44.   max := 2 * min - 1;
  45.   max2:= 2 * max + 1;
  46.  
  47.   PARALLEL
  48.     IF min <= id_no <= max THEN
  49.       x := 0.5 * (low + high) + delta*Gauss();
  50.     END;
  51.  
  52.     (* select the current and the next tree-level for data propagation *)
  53.     IF min <= id_no <= max2 THEN
  54.       (* new values for low and high at right and left son, respectively *) 
  55.       propagate.son_l(low);
  56.       propagate.son_r(high);
  57.       propagate.son_l(x);
  58.       propagate.son_r(x);
  59.       IF even(id_no) THEN high:=x ELSE low:=x END;
  60.     END
  61.   ENDPARALLEL
  62. END MidPointRec;
  63.  
  64.  
  65. BEGIN (* main *)
  66.   PARALLEL (* [1] *)   (* only the root is active *)
  67.     low  := 0.0;       (* starting value *)
  68.     high := 1.0;
  69.     x := 0.0;
  70.   ENDPARALLEL;
  71.   FOR i:=1 TO maxlevel DO
  72.     delta := 0.5 ** (float(i+1)/2.0);
  73.     MidPointRec(delta,i);
  74.   END; (* for *)
  75.   store(x,field);
  76.   inorder(1);
  77. END fractal.
  78.  
  79.