svMultiPhysics
Loading...
Searching...
No Matches
nn_elem_gnnxx.h
1// SPDX-FileCopyrightText: Copyright (c) Stanford University, The Regents of the University of California, and others.
2// SPDX-License-Identifier: BSD-3-Clause
3
4/// @brief Define a map type used to compute 2nd direivatives of element shape function data.
5///
6/// Replicates 'SUBROUTINE GETGNNxx(insd, ind2, eType, eNoN, xi, Nxx)'
7//
8static double fp = 4.0;
9static double fn = -4.0;
10static double en = -8.0;
11static double ze = 0.0;
12
13using GetElement2ndDerivMapType = std::map<ElementType, std::function<void(const int, const int, const int,
14 const int, const Array<double>&, Array3<double>&)>>;
15
16GetElement2ndDerivMapType get_element_2nd_derivs = {
17
18 {ElementType::QUD8, [](const int insd, const int ind2, const int eNoN, const int g, const Array<double>& xi,
19 Array3<double>& Nxx) -> void {
20
21 double lx = 1.0 - xi(0);
22 double ly = 1.0 - xi(1);
23 double ux = 1.0 + xi(0);
24 double uy = 1.0 + xi(1);
25 double mx = xi(0);
26 double my = xi(1);
27
28 Nxx(0,0,g) = ly*0.50;
29 Nxx(1,0,g) = lx*0.50;
30 Nxx(2,0,g) = (lx+lx+ly+ly-3.0)/4.0;
31
32 Nxx(0,1,g) = ly*0.50;
33 Nxx(1,1,g) = ux*0.50;
34 Nxx(2,1,g) = -(ux+ux+ly+ly-3.0)/4.0;
35
36 Nxx(0,2,g) = uy*0.50;
37 Nxx(1,2,g) = ux*0.50;
38 Nxx(2,3,g) = (ux+ux+uy+uy-3.0)/4.0;
39
40 Nxx(0,3,g) = uy*0.50;
41 Nxx(1,3,g) = lx*0.50;
42 Nxx(2,3,g) = -(lx+lx+uy+uy-3.0)/4.0;
43
44 Nxx(0,4,g) = -ly;
45 Nxx(1,4,g) = 0.0;
46 Nxx(2,4,g) = mx;
47
48 Nxx(0,5,g) = 0.0;
49 Nxx(1,5,g) = -ux;
50 Nxx(2,5,g) = -my;
51
52 Nxx(0,6,g) = -uy;
53 Nxx(1,6,g) = 0.0;
54 Nxx(2,6,g) = -mx;
55
56 Nxx(0,7,g) = 0.0;
57 Nxx(1,7,g) = -lx;
58 Nxx(2,7,g) = my;
59 }
60 },
61
62 {ElementType::QUD9, [](const int insd, const int ind2, const int eNoN, const int g, const Array<double>& xi,
63 Array3<double>& Nxx) -> void {
64
65 double lx = 1.0 - xi(0,g);
66 double ly = 1.0 - xi(1,g);
67 double ux = 1.0 + xi(0,g);
68 double uy = 1.0 + xi(1,g);
69 double mx = xi(0,g);
70 double my = xi(1,g);
71
72 Nxx(0,0,g) = -ly*my*0.5;
73 Nxx(1,0,g) = -lx*mx*0.5;
74 Nxx(2,0,g) = (lx-mx)*(ly-my)/4.0;
75
76 Nxx(0,1,g) = -ly*my*0.5;
77 Nxx(1,1,g) = ux*mx*0.5;
78 Nxx(2,1,g) = -(ux+mx)*(ly-my)/4.0;
79
80 Nxx(0,2,g) = uy*my*0.5;
81 Nxx(1,2,g) = ux*mx*0.5;
82 Nxx(2,2,g) = (ux+mx)*(uy+my)/4.0;
83
84 Nxx(0,3,g) = uy*my*0.5;
85 Nxx(1,3,g) = -lx*mx*0.5;
86 Nxx(2,3,g) = -(lx-mx)*(uy+my)/4.0;
87
88 Nxx(0,4,g) = ly*my;
89 Nxx(1,4,g) = lx*ux;
90 Nxx(2,4,g) = mx*(ly-my);
91
92 Nxx(0,5,g) = ly*uy;
93 Nxx(1,5,g) = -ux*mx;
94 Nxx(2,5,g) = -(ux+mx)*my;
95
96 Nxx(0,6,g) = -uy*my;
97 Nxx(1,6,g) = lx*ux;
98 Nxx(2,6,g) = -mx*(uy+my);
99
100 Nxx(0,7,g) = ly*uy;
101 Nxx(1,7,g) = lx*mx;
102 Nxx(2,7,g) = (lx-mx)*my;
103
104 Nxx(0,8,g) = -ly*uy*2.0;
105 Nxx(1,8,g) = -lx*ux*2.0;
106 Nxx(2,8,g) = mx*my*4.0;
107 }
108 },
109
110 {ElementType::TET10, [](const int insd, const int ind2, const int eNoN, const int g, const Array<double>& xi,
111 Array3<double>& Nxx) -> void {
112 Nxx.set_row(0, g, {fp, ze, ze, ze, ze, ze});
113 Nxx.set_row(1, g, {ze, fp, ze, ze, ze, ze});
114 Nxx.set_row(2, g, {ze, ze, fp, ze, ze, ze});
115 Nxx.set_row(3, g, {fp, fp, fp, fp, fp, fp});
116 Nxx.set_row(4, g, {ze, ze, ze, fp, ze, ze});
117 Nxx.set_row(5, g, {ze, ze, ze, ze, fp, ze});
118 Nxx.set_row(6, g, {ze, ze, ze, ze, ze, fp});
119 Nxx.set_row(7, g, {en, ze, ze, fn, ze, fn});
120 Nxx.set_row(8, g, {ze, en, ze, fn, fn, ze});
121 Nxx.set_row(9, g, {ze, ze, en, ze, fn, fn});
122 }
123 },
124
125 {ElementType::TRI6, [](const int insd, const int ind2, const int eNoN, const int g, const Array<double>& xi,
126 Array3<double>& Nxx) -> void {
127
128 Nxx.set_row(0, g, {fp, ze, ze});
129 Nxx.set_row(1, g, {ze, fp, ze});
130 Nxx.set_row(2, g, {fp, fp, fp});
131 Nxx.set_row(3, g, {ze, ze, fp});
132 Nxx.set_row(4, g, {ze, en, fn});
133 Nxx.set_row(5, g, {en, ze, fn});
134 }
135 },
136
137};
138
139
The Array3 template class implements a simple interface to 3D arrays.
Definition Array3.h:25