msbGrid  1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
initialdistribution.hh
Go to the documentation of this file.
1 /*****************************************************************************
2 * This program is part of the msbGrid software *
3 * *
4 * msbGrid stands for multi-structured block Grid generator *
5 * *
6 * msbGrid is a free software: you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation, either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * msbGrid is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * See the file COPYING for full copying permissions. *
17 *****************************************************************************/
23 #ifndef _INITIAL_DISTRIBUTION_HH_
24 #define _INITIAL_DISTRIBUTION_HH_
25 
26 #include <cstdlib>
27 #include <cmath>
28 #include <algorithm>
29 
30 namespace msbGrid
31 {
33 {
34 public:
36 
37 private:
39  std :: vector< std :: pair< Scalar, Scalar > > blockCenter_;
40  std :: vector< Scalar > blockAngle_;
41 
42 public:
44  {
45  inData_ = inData0;
46  }
47 
48  const InputData &inData() const
49  {
50  return * inData_;
51  }
52 
54  {
55  return * inData_;
56  }
57 
58  void periodicDist()
59  {
60  Scalar xMin = inData_->xMin(), xMax = inData_->xMax();
61  const Scalar yMin = inData_->yMin(xMin), yMax = inData_->yMax(xMax);
62  Scalar dx = Scalar(1.0) / inData_->blockNumberController() [ 0 ], dy = Scalar(1.0) / inData_->blockNumberController() [ 1 ];
63 
64  const Scalar xBegin = xMin + dx / Scalar(2.0), yBegin = yMin + dy / Scalar(2.0);
65  for ( Scalar x = xBegin; x <= xMax; x += dx ) {
66  for ( Scalar y = yBegin; y <= yMax; y += dy ) {
67  const std :: pair< Scalar, Scalar > p0(x, y);
68  blockCenter_.push_back(p0);
69  }
70  }
71  }
72 
73  void randomDist()
74  {
75  std :: vector< std :: pair< Scalar, Scalar > > refBlockCenter;
76  Scalar xMin = inData_->xMin(), xMax = inData_->xMax();
77  const Scalar yMin = inData_->yMin(xMin), yMax = inData_->yMax(xMax);
78  Scalar dx = Scalar(1.0) / inData_->blockNumberController() [ 0 ], dy = Scalar(1.0) / inData_->blockNumberController() [ 1 ];
79 
80  const Scalar xBegin = xMin + dx / Scalar(2.0), yBegin = yMin + dy / Scalar(2.0);
81  for ( Scalar x = xBegin; x <= xMax; x += dx ) {
82  for ( Scalar y = yBegin; y <= yMax; y += dy ) {
83  const std :: pair< Scalar, Scalar > p0(x, y);
84  refBlockCenter.push_back(p0);
85  }
86  }
87 
88  std :: srand( inData_->blockCenterRandSeqId() );
89  const Scalar R = inData_->blockCenterPertCoeff() * inData_->dr();
90 
91  for ( unsigned int ib = 0; ib < refBlockCenter.size(); ++ib ) {
92  const Scalar _alpha = randomAngle();
93  const Scalar alpha = deg2Rad(_alpha);
94  const Scalar dx = R * std :: cos(alpha), dy = R * std :: sin(alpha);
95 
96  const Scalar x_new = ( refBlockCenter [ ib ].first + dx ), y_new = ( refBlockCenter [ ib ].second + dy );
97  const std :: pair< Scalar, Scalar > p0(x_new, y_new);
98  blockCenter_.push_back(p0);
99 #if VERBOSE_LEVEL >= 1
100  std :: cout << "block : " << ( ib + 1 )
101  << " , x_ref = " << refBlockCenter [ ib ].first
102  << " , y_ref = " << refBlockCenter [ ib ].second
103  << " , R = " << R
104  << " , alpha [deg] = " << _alpha
105  << " , dx = R * std::cos(alpha) = " << dx
106  << " , dy = R * std::sin(alpha) = " << dy
107  << " , x_new = " << x_new
108  << " , y_new = " << y_new
109  << "\n";
110 #endif
111  }
112 
113 #if VERBOSE_LEVEL >= 1
114  std :: cout << "\n";
115 #endif
116  }
117 
118  void randomAng()
119  {
120  std :: srand( inData_->blockAngleRandSeqId() );
121 
122  for ( int ib = 0; ib < blockCenter_.size(); ++ib ) {
123  blockAngle_.push_back( msbGrid :: randomAngle() );
124  }
125  }
126 
128  {
129  std :: cerr << "predefinedDist() : is not implemented here!!\n";
130  }
131 
133  {
134  std :: cerr << "predefinedAng() : is not implemented here!!\n";
135  }
136 
137  const std :: vector< std :: pair< Scalar, Scalar > > &blockCenter() const
138  {
139  return blockCenter_;
140  }
141 
142  std :: vector< std :: pair< Scalar, Scalar > > &blockCenter()
143  {
144  return blockCenter_;
145  }
146 
147  const std :: vector< Scalar > &blockAngle() const
148  {
149  return blockAngle_;
150  }
151 
152  std :: vector< Scalar > &blockAngle()
153  {
154  return blockAngle_;
155  }
156 }; /*class InitialDistribution*/
157 } /*namespace msbGrid*/
158 
159 #endif /* #ifndef _INITIAL_DISTRIBUTION_HH_ */