xref: /libCEED/python/tests/buildmats.py (revision 2efebffe38fa9227caaeab504b43e3a698cb86d7)
10ef72598Sjeremyltimport numpy as np
20ef72598Sjeremylt
30ef72598Sjeremylt
480a9ef05SNatalie Beamsdef buildmats(qref, qweight, mat_dtype="float64"):
50ef72598Sjeremylt    P, Q, dim = 6, 4, 2
680a9ef05SNatalie Beams    interp = np.empty(P * Q, dtype=mat_dtype)
780a9ef05SNatalie Beams    grad = np.empty(dim * P * Q, dtype=mat_dtype)
80ef72598Sjeremylt
90ef72598Sjeremylt    qref[0] = 0.2
100ef72598Sjeremylt    qref[1] = 0.6
110ef72598Sjeremylt    qref[2] = 1. / 3.
120ef72598Sjeremylt    qref[3] = 0.2
130ef72598Sjeremylt    qref[4] = 0.2
140ef72598Sjeremylt    qref[5] = 0.2
150ef72598Sjeremylt    qref[6] = 1. / 3.
160ef72598Sjeremylt    qref[7] = 0.6
170ef72598Sjeremylt    qweight[0] = 25. / 96.
180ef72598Sjeremylt    qweight[1] = 25. / 96.
190ef72598Sjeremylt    qweight[2] = -27. / 96.
200ef72598Sjeremylt    qweight[3] = 25. / 96.
210ef72598Sjeremylt
220ef72598Sjeremylt    # Loop over quadrature points
230ef72598Sjeremylt    for i in range(Q):
240ef72598Sjeremylt        x1 = qref[0 * Q + i]
250ef72598Sjeremylt        x2 = qref[1 * Q + i]
260ef72598Sjeremylt        # Interp
270ef72598Sjeremylt        interp[i * P + 0] = 2. * (x1 + x2 - 1.) * (x1 + x2 - 1. / 2.)
280ef72598Sjeremylt        interp[i * P + 1] = -4. * x1 * (x1 + x2 - 1.)
290ef72598Sjeremylt        interp[i * P + 2] = 2. * x1 * (x1 - 1. / 2.)
300ef72598Sjeremylt        interp[i * P + 3] = -4. * x2 * (x1 + x2 - 1.)
310ef72598Sjeremylt        interp[i * P + 4] = 4. * x1 * x2
320ef72598Sjeremylt        interp[i * P + 5] = 2. * x2 * (x2 - 1. / 2.)
330ef72598Sjeremylt        # Grad
340ef72598Sjeremylt        grad[(i + 0) * P + 0] = 2. * \
350ef72598Sjeremylt            (1. * (x1 + x2 - 1. / 2.) + (x1 + x2 - 1.) * 1.)
360ef72598Sjeremylt        grad[(i + Q) * P + 0] = 2. * \
370ef72598Sjeremylt            (1. * (x1 + x2 - 1. / 2.) + (x1 + x2 - 1.) * 1.)
380ef72598Sjeremylt        grad[(i + 0) * P + 1] = -4. * (1. * (x1 + x2 - 1.) + x1 * 1.)
390ef72598Sjeremylt        grad[(i + Q) * P + 1] = -4. * (x1 * 1.)
400ef72598Sjeremylt        grad[(i + 0) * P + 2] = 2. * (1. * (x1 - 1. / 2.) + x1 * 1.)
410ef72598Sjeremylt        grad[(i + Q) * P + 2] = 2. * 0.
420ef72598Sjeremylt        grad[(i + 0) * P + 3] = -4. * (x2 * 1.)
430ef72598Sjeremylt        grad[(i + Q) * P + 3] = -4. * (1. * (x1 + x2 - 1.) + x2 * 1.)
440ef72598Sjeremylt        grad[(i + 0) * P + 4] = 4. * (1. * x2)
450ef72598Sjeremylt        grad[(i + Q) * P + 4] = 4. * (x1 * 1.)
460ef72598Sjeremylt        grad[(i + 0) * P + 5] = 2. * 0.
470ef72598Sjeremylt        grad[(i + Q) * P + 5] = 2. * (1. * (x2 - 1. / 2.) + x2 * 1.)
480ef72598Sjeremylt
490ef72598Sjeremylt    return interp, grad
50*97c1c57aSSebastian Grimberg
51*97c1c57aSSebastian Grimberg
52*97c1c57aSSebastian Grimbergdef buildmatshdiv(qref, qweight, mat_dtype="float64"):
53*97c1c57aSSebastian Grimberg    P, Q, dim = 4, 4, 2
54*97c1c57aSSebastian Grimberg    interp = np.empty(dim * P * Q, dtype=mat_dtype)
55*97c1c57aSSebastian Grimberg    div = np.empty(P * Q, dtype=mat_dtype)
56*97c1c57aSSebastian Grimberg
57*97c1c57aSSebastian Grimberg    qref[0] = -1. / np.sqrt(3.)
58*97c1c57aSSebastian Grimberg    qref[1] = qref[0]
59*97c1c57aSSebastian Grimberg    qref[2] = qref[0]
60*97c1c57aSSebastian Grimberg    qref[3] = -qref[0]
61*97c1c57aSSebastian Grimberg    qref[4] = -qref[0]
62*97c1c57aSSebastian Grimberg    qref[5] = -qref[0]
63*97c1c57aSSebastian Grimberg    qref[6] = qref[0]
64*97c1c57aSSebastian Grimberg    qref[7] = qref[0]
65*97c1c57aSSebastian Grimberg    qweight[0] = 1.
66*97c1c57aSSebastian Grimberg    qweight[1] = 1.
67*97c1c57aSSebastian Grimberg    qweight[2] = 1.
68*97c1c57aSSebastian Grimberg    qweight[3] = 1.
69*97c1c57aSSebastian Grimberg
70*97c1c57aSSebastian Grimberg    # Loop over quadrature points
71*97c1c57aSSebastian Grimberg    for i in range(Q):
72*97c1c57aSSebastian Grimberg        x1 = qref[0 * Q + i]
73*97c1c57aSSebastian Grimberg        x2 = qref[1 * Q + i]
74*97c1c57aSSebastian Grimberg        # Interp
75*97c1c57aSSebastian Grimberg        interp[(i + 0) * P + 0] = 0.
76*97c1c57aSSebastian Grimberg        interp[(i + Q) * P + 0] = 1. - x2
77*97c1c57aSSebastian Grimberg        interp[(i + 0) * P + 1] = x1 - 1.
78*97c1c57aSSebastian Grimberg        interp[(i + Q) * P + 1] = 0.
79*97c1c57aSSebastian Grimberg        interp[(i + 0) * P + 2] = -x1
80*97c1c57aSSebastian Grimberg        interp[(i + Q) * P + 2] = 0.
81*97c1c57aSSebastian Grimberg        interp[(i + 0) * P + 3] = 0.
82*97c1c57aSSebastian Grimberg        interp[(i + Q) * P + 3] = x2
83*97c1c57aSSebastian Grimberg        # Div
84*97c1c57aSSebastian Grimberg        div[i * P + 0] = -1.
85*97c1c57aSSebastian Grimberg        div[i * P + 1] = 1.
86*97c1c57aSSebastian Grimberg        div[i * P + 2] = -1.
87*97c1c57aSSebastian Grimberg        div[i * P + 3] = 1.
88*97c1c57aSSebastian Grimberg
89*97c1c57aSSebastian Grimberg    return interp, div
90*97c1c57aSSebastian Grimberg
91*97c1c57aSSebastian Grimberg
92*97c1c57aSSebastian Grimbergdef buildmatshcurl(qref, qweight, mat_dtype="float64"):
93*97c1c57aSSebastian Grimberg    P, Q, dim = 3, 4, 2
94*97c1c57aSSebastian Grimberg    interp = np.empty(dim * P * Q, dtype=mat_dtype)
95*97c1c57aSSebastian Grimberg    curl = np.empty(P * Q, dtype=mat_dtype)
96*97c1c57aSSebastian Grimberg
97*97c1c57aSSebastian Grimberg    qref[0] = 0.2
98*97c1c57aSSebastian Grimberg    qref[1] = 0.6
99*97c1c57aSSebastian Grimberg    qref[2] = 1. / 3.
100*97c1c57aSSebastian Grimberg    qref[3] = 0.2
101*97c1c57aSSebastian Grimberg    qref[4] = 0.2
102*97c1c57aSSebastian Grimberg    qref[5] = 0.2
103*97c1c57aSSebastian Grimberg    qref[6] = 1. / 3.
104*97c1c57aSSebastian Grimberg    qref[7] = 0.6
105*97c1c57aSSebastian Grimberg    qweight[0] = 25. / 96.
106*97c1c57aSSebastian Grimberg    qweight[1] = 25. / 96.
107*97c1c57aSSebastian Grimberg    qweight[2] = -27. / 96.
108*97c1c57aSSebastian Grimberg    qweight[3] = 25. / 96.
109*97c1c57aSSebastian Grimberg
110*97c1c57aSSebastian Grimberg    # Loop over quadrature points
111*97c1c57aSSebastian Grimberg    for i in range(Q):
112*97c1c57aSSebastian Grimberg        x1 = qref[0 * Q + i]
113*97c1c57aSSebastian Grimberg        x2 = qref[1 * Q + i]
114*97c1c57aSSebastian Grimberg        # Interp
115*97c1c57aSSebastian Grimberg        interp[(i + 0) * P + 0] = -x2
116*97c1c57aSSebastian Grimberg        interp[(i + Q) * P + 0] = x1
117*97c1c57aSSebastian Grimberg        interp[(i + 0) * P + 1] = x2
118*97c1c57aSSebastian Grimberg        interp[(i + Q) * P + 1] = 1. - x1
119*97c1c57aSSebastian Grimberg        interp[(i + 0) * P + 2] = 1. - x2
120*97c1c57aSSebastian Grimberg        interp[(i + Q) * P + 2] = x1
121*97c1c57aSSebastian Grimberg        # Curl
122*97c1c57aSSebastian Grimberg        curl[i * P + 0] = 2.
123*97c1c57aSSebastian Grimberg        curl[i * P + 1] = -2.
124*97c1c57aSSebastian Grimberg        curl[i * P + 2] = -2.
125*97c1c57aSSebastian Grimberg
126*97c1c57aSSebastian Grimberg    return interp, curl
127