NLMech  0.1.0
influenceFn.h
1 // Copyright (c) 2019 Prashant K. Jha
3 // Copyright (c) 2019 Patrick Diehl
4 //
5 // Distributed under the Boost Software License, Version 1.0. (See accompanying
6 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 
9 #ifndef MATERIAL_PD_INFLUENCEFN_H
10 #define MATERIAL_PD_INFLUENCEFN_H
11 
12 #include <cstring>
13 #include <vector>
14 #include <cmath>
15 #include "util/utilIO.h"
16 
17 namespace material {
18 
19 namespace pd {
20 
23 
24 public:
26  BaseInfluenceFn() = default;
27 
34  virtual double getInfFn(const double &r) const = 0;
35 
45  virtual double getMoment(const size_t &i) const = 0;
46 
56  virtual std::string printStr(int nt, int lvl) const {
57 
58  auto tabS = util::io::getTabS(nt);
59  std::ostringstream oss;
60  oss << tabS << "------- BaseInfluenceFn --------" << std::endl << std::endl;
61  oss << tabS << "Provides abstraction for different influence function "
62  "types" << std::endl;
63  oss << tabS << std::endl;
64 
65  return oss.str();
66  }
67 
75  virtual void print(int nt, int lvl) const { std::cout << printStr(nt, lvl); }
76 
81  virtual void print() const { print(0, 0); }
82 };
83 
86 
87 public:
93  ConstInfluenceFn(const std::vector<double> &params, const size_t &dim): BaseInfluenceFn(), d_a0(0.) {
94 
95  d_a0 = params.empty() ? double(dim + 1) : params[0];
96  }
97 
104  double getInfFn(const double &r) const override {
105  return d_a0;
106  }
107 
117  double getMoment(const size_t &i) const override {
118  return d_a0 / double(i + 1);
119  }
120 
130  std::string printStr(int nt, int lvl) const override {
131 
132  auto tabS = util::io::getTabS(nt);
133  std::ostringstream oss;
134  oss << tabS << "------- ConstInfluenceFn --------" << std::endl << std::endl;
135  oss << tabS << "Constant function with constant = " << d_a0 << std::endl;
136  oss << tabS << "First moment = " << getMoment(1)
137  << ", second moment = " << getMoment(2)
138  << ", third moment = " << getMoment(3) << std::endl;
139  oss << tabS << std::endl;
140 
141  return oss.str();
142  }
143 
151  void print(int nt, int lvl) const override {
152  std::cout << printStr(nt, lvl);
153  }
154 
159  void print() const override { print(0, 0); }
160 
161 private:
163  double d_a0;
164 };
165 
171 
172 public:
178  LinearInfluenceFn(const std::vector<double> &params, const size_t &dim) : BaseInfluenceFn(), d_a0(0.), d_a1(0.) {
179 
180  if (params.empty()) {
181  // choose a0, a1 = -a0 such that \int_0^1 J(r) r^d dr = 1
182  // and J(r) = a0 (1 - r)
183  if (dim == 1) {
184  d_a0 = 6.;
185  d_a1 = -d_a0;
186  } else if (dim == 2) {
187  d_a0 = 12.;
188  d_a1 = -d_a0;
189  } else if (dim == 3) {
190  d_a0 = 20.;
191  d_a1 = -d_a0;
192  }
193  } else {
194  d_a0 = params[0];
195  if (params.size() < 2)
196  d_a1 = -d_a0;
197  else
198  d_a1 = params[1];
199  }
200  }
201 
208  double getInfFn(const double &r) const override {
209  return d_a0 + d_a1 * r;
210  }
211 
221  double getMoment(const size_t &i) const override {
222  return (d_a0 / double(i + 1)) + (d_a1 / double(i + 2));
223  }
224 
234  std::string printStr(int nt, int lvl) const override {
235 
236  auto tabS = util::io::getTabS(nt);
237  std::ostringstream oss;
238  oss << tabS << "------- LinearInfluenceFn --------" << std::endl << std::endl;
239  oss << tabS << "Linear function a0 + a1*r with constants: a0 = "
240  << d_a0 << ", a1 = " << d_a1 << std::endl;
241  oss << tabS << "First moment = " << getMoment(1)
242  << ", second moment = " << getMoment(2)
243  << ", third moment = " << getMoment(3) << std::endl;
244  oss << tabS << std::endl;
245 
246  return oss.str();
247  }
248 
256  void print(int nt, int lvl) const override {
257  std::cout << printStr(nt, lvl);
258  }
259 
264  void print() const override { print(0, 0); }
265 
266 private:
268  double d_a0;
269 
271  double d_a1;
272 };
273 
279 
280 public:
286  GaussianInfluenceFn(const std::vector<double> &params, const size_t &dim) : BaseInfluenceFn(), d_alpha(0.), d_beta(0.) {
287 
288  if (params.empty()) {
289  // beta = 0.2 (default value)
290  // choose alpha such that \int_0^1 J(r) r^d dr = 1
291  d_beta = 0.2;
292  if (dim == 1)
293  d_alpha = 2. / (d_beta * (1. - std::exp(-1. / d_beta)));
294  else if (dim == 2)
295  d_alpha = (4.0 / d_beta) * 1.0 /
296  (std::sqrt(M_PI * d_beta) * std::erf(1.0 / std::sqrt(d_beta)) -
297  2.0 * std::exp(-1.0 / d_beta));
298  else if (dim == 3)
299  d_alpha = (2.0 / d_beta) * 1.0 /
300  (d_beta - (d_beta + 1.) * std::exp(-1.0 / d_beta));
301  } else {
302  d_alpha = params[0];
303  d_beta = params[1];
304  }
305  }
306 
313  double getInfFn(const double &r) const override {
314  return d_alpha * std::exp(-r * r / d_beta);
315  }
316 
326  double getMoment(const size_t &i) const override {
327 
328  double sq1 = std::sqrt(d_beta);
329  double sq2 = std::sqrt(M_PI);
330  // M_i = \int_0^1 alpha exp(-r^2/beta) r^i dr
331 
332  if (i == 0) {
333  // M0 = 0.5 * \alpha (\beta)^(1/2) * (pi)^(1/2) * erf((1/beta)^(1/2))
334 
335  return 0.5 * d_alpha * sq1 * sq2 * std::erf(1. / sq1);
336  } else if (i == 1) {
337  // M1 = 0.5 * \alpha \beta (1 - exp(-1/beta))
338 
339  return 0.5 * d_alpha * d_beta * (1. - std::exp(-1. / d_beta));
340  } else if (i == 2) {
341  // M2 = 0.5 * \alpha (\beta)^(3/2) * [0.5 * (pi)^(1/2) erf((1/beta)^(1/2)
342  // ) - (1/beta)^(1/2) * exp(-1/beta) ]
343 
344  return 0.5 * d_alpha * d_beta * sq1 *
345  (0.5 * sq2 * std::erf(1. / sq1) -
346  (1. / sq1) * std::exp(-1. / d_beta));
347  } else if (i == 3) {
348  // M3 = 0.5 * \alpha (\beta)^(2) * [1 - ((1/beta) + 1) * exp(-1/beta)]
349 
350  return 0.5 * d_alpha * d_beta * d_beta *
351  (1. - (1. + 1. / d_beta) * std::exp(-1. / d_beta));
352  }
353  }
354 
364  std::string printStr(int nt, int lvl) const override {
365 
366  auto tabS = util::io::getTabS(nt);
367  std::ostringstream oss;
368  oss << tabS << "------- GaussianInfluenceFn --------" << std::endl << std::endl;
369  oss << tabS << "Gaussian function a0 * exp(-r*r / a1) with constants: a0 = "
370  << d_alpha << ", a1 = " << d_beta << std::endl;
371  oss << tabS << "First moment = " << getMoment(1)
372  << ", second moment = " << getMoment(2)
373  << ", third moment = " << getMoment(3) << std::endl;
374  oss << tabS << std::endl;
375 
376  return oss.str();
377  }
378 
386  void print(int nt, int lvl) const override {
387  std::cout << printStr(nt, lvl);
388  }
389 
394  void print() const override { print(0, 0); }
395 
396 private:
398  double d_alpha;
399 
401  double d_beta;
402 };
403 
404 } // namespace pd
405 
406 } // namespace material
407 
408 #endif // MATERIAL_PD_INFLUENCEFN_H
A base class for computing influence function.
Definition: influenceFn.h:22
virtual void print(int nt, int lvl) const
Prints the information about the instance of the object.
Definition: influenceFn.h:75
BaseInfluenceFn()=default
Constructor.
virtual void print() const
Prints the information about the instance of the object.
Definition: influenceFn.h:81
virtual std::string printStr(int nt, int lvl) const
Returns the string containing information about the instance of the object.
Definition: influenceFn.h:56
virtual double getInfFn(const double &r) const =0
Returns the value of influence function.
virtual double getMoment(const size_t &i) const =0
Returns the moment of influence function.
A class to implement constant influence function.
Definition: influenceFn.h:85
std::string printStr(int nt, int lvl) const override
Returns the string containing information about the instance of the object.
Definition: influenceFn.h:130
double getMoment(const size_t &i) const override
Returns the moment of influence function.
Definition: influenceFn.h:117
double getInfFn(const double &r) const override
Returns the value of influence function.
Definition: influenceFn.h:104
void print() const override
Prints the information about the instance of the object.
Definition: influenceFn.h:159
double d_a0
Constant such that J(r) = Constant.
Definition: influenceFn.h:163
ConstInfluenceFn(const std::vector< double > &params, const size_t &dim)
Constructor.
Definition: influenceFn.h:93
void print(int nt, int lvl) const override
Prints the information about the instance of the object.
Definition: influenceFn.h:151
A class to implement Gaussian influence function.
Definition: influenceFn.h:278
double getInfFn(const double &r) const override
Returns the value of influence function.
Definition: influenceFn.h:313
double getMoment(const size_t &i) const override
Returns the moment of influence function.
Definition: influenceFn.h:326
void print(int nt, int lvl) const override
Prints the information about the instance of the object.
Definition: influenceFn.h:386
void print() const override
Prints the information about the instance of the object.
Definition: influenceFn.h:394
double d_beta
Constants.
Definition: influenceFn.h:401
std::string printStr(int nt, int lvl) const override
Returns the string containing information about the instance of the object.
Definition: influenceFn.h:364
double d_alpha
Constants.
Definition: influenceFn.h:398
GaussianInfluenceFn(const std::vector< double > &params, const size_t &dim)
Constructor.
Definition: influenceFn.h:286
A class to implement linear influence function.
Definition: influenceFn.h:170
LinearInfluenceFn(const std::vector< double > &params, const size_t &dim)
Constructor.
Definition: influenceFn.h:178
double d_a0
Constants such that J(r) = d_a0 + d_a1 * r.
Definition: influenceFn.h:268
double getMoment(const size_t &i) const override
Returns the moment of influence function.
Definition: influenceFn.h:221
double getInfFn(const double &r) const override
Returns the value of influence function.
Definition: influenceFn.h:208
void print() const override
Prints the information about the instance of the object.
Definition: influenceFn.h:264
std::string printStr(int nt, int lvl) const override
Returns the string containing information about the instance of the object.
Definition: influenceFn.h:234
double d_a1
Constants such that J(r) = d_a0 + d_a1 * r.
Definition: influenceFn.h:271
void print(int nt, int lvl) const override
Prints the information about the instance of the object.
Definition: influenceFn.h:256
std::string getTabS(int nt)
Generate a string contaning nt tabs.
Definition: utilIO.h:26