source: tol/tol_pkg/MulVarFunAprox/DesignC2.Spheric.tol @ b050cc43

1941-docker-image-to-testdevel
Last change on this file since b050cc43 was b050cc43, checked in by Víctor de Buen <vdebuen@…>, 17 years ago

New class hierarchy

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@1762 be4846ae-f051-483a-831f-b64e7d08527f

  • Property mode set to 100644
File size: 3.9 KB
Line 
1/* -*- mode: C++ -*- */
2//////////////////////////////////////////////////////////////////////////////
3// FILE   : DesignC2.tol
4// PURPOSE: Defines Class @DesignC2
5//////////////////////////////////////////////////////////////////////////////
6
7
8//////////////////////////////////////////////////////////////////////////////
9Text _.autodoc.member.DesignC2.Spheric =
10"";
11Class @DesignC2.Spheric : @DesignC2
12//////////////////////////////////////////////////////////////////////////////
13{
14//////////////////////////////////////////////////////////////////////////////
15//Configuration parameters
16//////////////////////////////////////////////////////////////////////////////
17  Real _.radius;
18  Real _.radius.margin;
19  Real _.grid.size;
20
21//////////////////////////////////////////////////////////////////////////////
22//Auxiliar members
23//////////////////////////////////////////////////////////////////////////////
24  VMatrix _.Y.h = Rand(0,0,0,0);
25  VMatrix _.Y.neighbourhood = Rand(0,0,0,0);
26
27  //////////////////////////////////////////////////////////////////////////////
28  Real build.stress.points(Real void)
29  //////////////////////////////////////////////////////////////////////////////
30  {
31    Text _MID = "[@DesignC2.Spheric::build.stress.points] ";
32    WriteLn("TRACE "+_MID+"1");
33    Matrix Y.neighbour.triplet = Group("ConcatRows", For(1,_.H,Matrix(Real h)
34    {
35      Set neighbours = Unique(VRow2Set(SubRow(_.Y.neighbourhood,[[h]])));
36      Set neighbours.up = Select(neighbours,Real(Real s) { s>h });
37      Matrix s = SetCol(Sort(neighbours.up,Compare));
38      Rand(Rows(s),1,h,h)|s|Rand(Rows(s),1,1,1)
39    }));
40   
41    WriteLn("TRACE "+_MID+"2");
42    VMatrix Y.neighbour.1.map = Triplet(Y.neighbour.triplet,_.H,_.H);
43    VMatrix Y.neighbour.2.map = Y.neighbour.1.map*Y.neighbour.1.map;
44    VMatrix Y.neighbour.12.map = Max(Y.neighbour.1.map,Y.neighbour.2.map);
45    Matrix Y.neighbour.12.triplet = VMat2Triplet(Y.neighbour.12.map);
46    VMatrix Z.h.a = Mat2VMat(SubCol(Y.neighbour.12.triplet,[[1]]));
47    VMatrix Z.h.b = Mat2VMat(SubCol(Y.neighbour.12.triplet,[[2]]));
48    VMatrix Y.neighbour.a = SubRow(_.Y,VCol2Set(Z.h.a));
49    VMatrix Y.neighbour.b = SubRow(_.Y,VCol2Set(Z.h.b));
50    VMatrix Z.all = (Y.neighbour.a + Y.neighbour.b)*0.5;
51   
52    WriteLn("TRACE "+_MID+"3");
53    VMatrix Z.interior.a =
54    {
55      VMatrix Z.norm2 = RPow(Y.neighbour.a-Z.all,2)*Rand(_.n,1,1,1);
56      VMatrix Z.tao = RPow(Z.norm2,0.5)/_.radius;
57      LE(Z.tao,Rand(VRows(Z.tao),1,1,1))
58    };
59    VMatrix Z.interior.b =
60    {
61      VMatrix Z.norm2 = RPow(Y.neighbour.b-Z.all,2)*Rand(_.n,1,1,1);
62      VMatrix Z.tao = RPow(Z.norm2,0.5)/_.radius;
63      LE(Z.tao,Rand(VRows(Z.tao),1,1,1))
64    };
65    VMatrix Z.interior = Z.interior.a $* Z.interior.b;
66   
67    WriteLn("TRACE "+_MID+"4");
68    VMatrix _.Z := SubRow(Z.all,MatQuery::SelectMatch(Z.interior));
69    VMatrix _.Z.h := SubRow(Z.h.a | Z.h.b,MatQuery::SelectMatch(Z.interior));
70   
71    Real _.Tz := VRows(_.Z);
72    Real _.Mz := Case(
73      prior.Z.order< 0, 0,
74      prior.Z.order==0, _.Tz,
75      prior.Z.order==1, _.Tz*(1+_.n),
76      prior.Z.order==2, _.Tz*(1+_.n*3/2+(1/2)*_.n^2));
77    _.Tz
78  };
79
80  ///////////////////////////////////////////////////////////////////////////
81  Set get.X.weight(Set X.dif)
82  ///////////////////////////////////////////////////////////////////////////
83  {
84    Real m = VRows(X.dif[1]);
85    Set X.tao = For(1,_.X.maxNeighbour,VMatrix(Real i)
86    {
87      VMatrix X.norm2 = RPow(X.dif[i],2)*Rand(_.n,1,1,1);
88      RPow(X.norm2,0.5)/_.radius
89    });
90    Set X.tao2 = For(1,_.X.maxNeighbour,VMatrix(Real i)
91    {
92      RPow(X.tao[i],2)
93    });
94    Set X.match = For(1,_.X.maxNeighbour,VMatrix(Real i)
95    {
96      LE(X.tao[i],Rand(m,1,1,1))
97    });
98    Set X.lambda = For(1,_.X.maxNeighbour,VMatrix(Real i)
99    {
100      RPow(X.match[i] $* (Rand(m,1,1,1)-X.tao2[i]),4)
101    });
102    VMatrix X.lambda.sum = SetSum(X.lambda);
103   
104    Set X.weight = For(1,_.X.maxNeighbour,VMatrix(Real i)
105    {
106      X.lambda[i] $/ X.lambda.sum
107    })
108  }
109
110};
Note: See TracBrowser for help on using the repository browser.