PeriDEM 0.3.0
PeriDEM -- Peridynamics-based high-fidelity model for granular media
Loading...
Searching...
No Matches
influenceFn.cpp
Go to the documentation of this file.
1/*
2 * -------------------------------------------
3 * Copyright (c) 2021 - 2026 Prashant K. Jha
4 * -------------------------------------------
5 * PeriDEM https://github.com/prashjha/PeriDEM
6 *
7 * Distributed under the Boost Software License, Version 1.0. (See accompanying
8 * file LICENSE)
9 */
10
11#include "influenceFn.h"
12#include "util/io.h"
13#include <stdexcept>
14#include <cmath>
15
17 const std::vector<double> &params, const size_t &dim)
18 : BaseInfluenceFn(), d_a0(0.) {
19
20 d_a0 = params.empty() ? double(dim + 1) : params[0];
21}
22
23double material::ConstInfluenceFn::getInfFn(const double &r) const {
24 return d_a0;
25}
26
27double material::ConstInfluenceFn::getMoment(const size_t &i) const {
28 return d_a0 / double(i + 1);
29}
30
32 const std::vector<double> &params, const size_t &dim)
33 : BaseInfluenceFn(), d_a0(0.), d_a1(0.) {
34
35 if (params.empty()) {
36 // choose a0, a1 = -a0 such that \int_0^1 J(r) r^d dr = 1
37 // and J(r) = a0 (1 - r)
38 if (dim == 1) {
39 d_a0 = 6.;
40 d_a1 = -d_a0;
41 } else if (dim == 2) {
42 d_a0 = 12.;
43 d_a1 = -d_a0;
44 } else if (dim == 3) {
45 d_a0 = 20.;
46 d_a1 = -d_a0;
47 }
48 } else {
49 d_a0 = params[0];
50 if (params.size() < 2)
51 d_a1 = -d_a0;
52 else
53 d_a1 = params[1];
54 }
55}
56
57double material::LinearInfluenceFn::getInfFn(const double &r) const {
58 return d_a0 + d_a1 * r;
59}
60
61double material::LinearInfluenceFn::getMoment(const size_t &i) const {
62 return (d_a0 / double(i + 1)) + (d_a1 / double(i + 2));
63}
64
66 const std::vector<double> &params, const size_t &dim)
67 : BaseInfluenceFn(), d_alpha(0.), d_beta(0.) {
68
69 if (params.empty()) {
70 // beta = 0.2 (default value)
71 // choose alpha such that \int_0^1 J(r) r^d dr = 1
72 d_beta = 0.2;
73 if (dim == 1)
74 d_alpha = 2. / (d_beta * (1. - std::exp(-1. / d_beta)));
75 else if (dim == 2)
76 d_alpha = (4.0 / d_beta) * 1.0 /
77 (std::sqrt(M_PI * d_beta) * std::erf(1.0 / std::sqrt(d_beta)) -
78 2.0 * std::exp(-1.0 / d_beta));
79 else if (dim == 3)
80 d_alpha = (2.0 / d_beta) * 1.0 /
81 (d_beta - (d_beta + 1.) * std::exp(-1.0 / d_beta));
82 } else {
83 d_alpha = params[0];
84 d_beta = params[1];
85 }
86}
87
88double material::GaussianInfluenceFn::getInfFn(const double &r) const {
89 return d_alpha * std::exp(-r * r / d_beta);
90}
91
92double material::GaussianInfluenceFn::getMoment(const size_t &i) const {
93
94 double sq1 = std::sqrt(d_beta);
95 double sq2 = std::sqrt(M_PI);
96 // M_i = \int_0^1 alpha exp(-r^2/beta) r^i dr
97
98 if (i == 0) {
99 // M0 = 0.5 * \alpha (\beta)^(1/2) * (pi)^(1/2) * erf((1/beta)^(1/2))
100
101 return 0.5 * d_alpha * sq1 * sq2 * std::erf(1. / sq1);
102 } else if (i == 1) {
103 // M1 = 0.5 * \alpha \beta (1 - exp(-1/beta))
104
105 return 0.5 * d_alpha * d_beta * (1. - std::exp(-1. / d_beta));
106 } else if (i == 2) {
107 // M2 = 0.5 * \alpha (\beta)^(3/2) * [0.5 * (pi)^(1/2) erf((1/beta)^(1/2)
108 // ) - (1/beta)^(1/2) * exp(-1/beta) ]
109
110 return 0.5 * d_alpha * d_beta * sq1 *
111 (0.5 * sq2 * std::erf(1. / sq1) -
112 (1. / sq1) * std::exp(-1. / d_beta));
113 } else if (i == 3) {
114 // M3 = 0.5 * \alpha (\beta)^(2) * [1 - ((1/beta) + 1) * exp(-1/beta)]
115
116 return 0.5 * d_alpha * d_beta * d_beta *
117 (1. - (1. + 1. / d_beta) * std::exp(-1. / d_beta));
118 } else {
119 throw std::runtime_error(
121 << "Error: getMoment() accepts argument i from 0 to 3.\n");
122 }
123
124
125}
A base class for computing influence function.
Definition influenceFn.h:22
double getMoment(const size_t &i) const override
Returns the moment of influence function.
ConstInfluenceFn(const std::vector< double > &params, const size_t &dim)
Constructor.
double getInfFn(const double &r) const override
Returns the value of influence function.
double d_a0
Constant such that J(r) = Constant.
double getInfFn(const double &r) const override
Returns the value of influence function.
GaussianInfluenceFn(const std::vector< double > &params, const size_t &dim)
Constructor.
double getMoment(const size_t &i) const override
Returns the moment of influence function.
double d_a0
Constants such that J(r) = d_a0 + d_a1 * r.
double getInfFn(const double &r) const override
Returns the value of influence function.
double d_a1
Constants such that J(r) = d_a0 + d_a1 * r.
LinearInfluenceFn(const std::vector< double > &params, const size_t &dim)
Constructor.
double getMoment(const size_t &i) const override
Returns the moment of influence function.
Collects a message with stream syntax for use in an exception.
Definition io.h:52