Line data Source code
1 : #ifndef MODEL_INTERFACE_CRACK_H
2 : #define MODEL_INTERFACE_CRACK_H
3 :
4 : #include <AMReX.H>
5 : #include <AMReX_AmrCore.H>
6 :
7 : #include <iostream>
8 : #include <fstream>
9 :
10 : namespace Model
11 : {
12 : namespace Interface
13 : {
14 : namespace Crack
15 : {
16 : class Crack
17 : {
18 : public:
19 : enum GType {GSQUARE, GMULTIWELL, GPHI4C3, GCUBICM, GSQUAREP, GSQUAREPM};
20 : enum WType {WSQUARE, WMULTIWELL, WMULTIWELL2, WPHI4C3};
21 :
22 0 : Crack() {};
23 :
24 : AMREX_FORCE_INLINE
25 0 : virtual Set::Scalar w_phi(Set::Scalar c, Set::Scalar /*p=0.*/)
26 : {
27 0 : switch(w_type)
28 : {
29 0 : case WSQUARE: return (1.-c)*(1.-c);
30 0 : case WMULTIWELL: return (1.-c)*(1.-c)*c*c;
31 0 : case WMULTIWELL2: return (1.+c)*(1.+c)*(1.-c)*(1.-c);
32 0 : case WPHI4C3: return 1. - 4.*c*c*c + 3.*c*c*c*c;
33 :
34 0 : default: return (1.-c)*(1.-c);
35 : }
36 : }
37 : AMREX_FORCE_INLINE
38 0 : virtual Set::Scalar g_phi(Set::Scalar c, Set::Scalar p=0.)
39 : {
40 0 : switch(g_type)
41 : {
42 0 : case GSQUARE: return c*c;
43 0 : case GMULTIWELL: return (2.-c)*(2.-c)*c*c;
44 0 : case GPHI4C3: return 4.*c*c*c - 3.*c*c*c*c;
45 0 : case GSQUAREP: return std::pow(c,2.*p);
46 0 : case GSQUAREPM: return std::pow(c,2.*(std::pow(p,m_d_exponent)));
47 0 : case GCUBICM: return m_d_exponent*(c*c*c - c*c) + 3.*c*c - 2.*c*c*c;
48 :
49 0 : default: return c*c;
50 : }
51 : }
52 : AMREX_FORCE_INLINE
53 0 : virtual Set::Scalar Dw_phi(Set::Scalar c, Set::Scalar /*p=0.*/)
54 : {
55 0 : switch(w_type)
56 : {
57 0 : case WSQUARE: return -2.*(1.-c);
58 0 : case WMULTIWELL: return 4.*c*c*c - 6.*c*c + 2.*c;
59 0 : case WMULTIWELL2: return 4.*c*c*c - 4.*c;
60 0 : case WPHI4C3: return 12.*(c-1.)*c*c;
61 :
62 0 : default: return -2.*(1.-c);
63 : }
64 : }
65 : AMREX_FORCE_INLINE
66 0 : virtual Set::Scalar Dg_phi(Set::Scalar c, Set::Scalar p=0.)
67 : {
68 0 : switch(g_type)
69 : {
70 0 : case GSQUARE: return 2.*c;
71 0 : case GMULTIWELL: return 4.*c*c*c - 12.*c*c + 8.*c;
72 0 : case GPHI4C3: return 12.*(1.-c)*c*c;
73 0 : case GSQUAREP: return 2.*p*std::pow(c,2*p -1.);
74 0 : case GSQUAREPM: return 2.*std::pow(p,m_d_exponent)*(std::pow(c, 2*std::pow(p,m_d_exponent)-1));
75 0 : case GCUBICM: return m_d_exponent*(3.*c*c - 2.*c) + 6.*c - 6.*c*c;
76 :
77 0 : default: return 2*c;
78 : }
79 : }
80 :
81 : virtual Set::Scalar Gc(Set::Scalar theta) = 0;
82 : virtual Set::Scalar DGc(Set::Scalar theta) = 0;
83 : virtual Set::Scalar DDGc(Set::Scalar theta) = 0;
84 : virtual Set::Scalar Zeta(Set::Scalar theta) = 0;
85 : virtual Set::Scalar Mobility(Set::Scalar theta) = 0;
86 : virtual Set::Scalar DrivingForceThreshold(Set::Scalar theta) = 0;
87 :
88 : void ExportToFile(std::string filename, amrex::Real dTheta)
89 : {
90 : std::ofstream outFile;
91 : outFile.open(filename);
92 :
93 : for(amrex::Real theta=0; theta<2*pi; theta=theta+dTheta)
94 : {
95 : outFile << theta << " " << Gc(theta) << std::endl;
96 : }
97 : outFile.close();
98 :
99 : }
100 0 : void SetGType(const GType a_type)
101 : {
102 0 : g_type = a_type;
103 0 : }
104 :
105 0 : void SetWType(const WType a_type)
106 : {
107 0 : w_type = a_type;
108 0 : }
109 :
110 0 : void SetDuctileExponent(const Set::Scalar m)
111 : {
112 0 : m_d_exponent = m;
113 0 : }
114 :
115 : protected:
116 : static constexpr amrex::Real pi = 3.14159265359;
117 : GType g_type = GType::GSQUARE;
118 : WType w_type = WType::WSQUARE;
119 : Set::Scalar m_d_exponent = 1.;
120 : };
121 : }
122 : }
123 : }
124 :
125 : #endif
|