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