def microlocal(): N = 20 k = 20 qxw = puq.squarequadrature(N) g = pcb.BasisReduce(pcb.BasisCombine([pcb.FourierHankel([-1,-0.5], [0], k), pcb.FourierHankel([-0.2,0.5], [0], k)]), [1,1]) theta, proj, projd, projdd = pwproduniform(g.values, qxw, k, 500) mp.plot(theta, proj[0])
def testL2Prod(self): N = 20 k = 10 qxw = puq.squarequadrature(N) D = 1 g = pcb.PlaneWaves(pcb.circleDirections(40)[15], k) t1 = prp.findpw(prp.L2Prod(g.values, qxw, k), D, maxtheta = 1) self.assertAlmostEqual(t1, (2 * math.pi * 15) / 40)
print nfb, npw, l2err print basis print coeffs bases.append(basis) coefflist.append(coeffs) return pcb.BasisReduce(bases[-1], coefflist[-1]) def runpwbasis(k, u, Npw, quadrule): bc = pcad.PWFBCreator(k, origin, npw, nfb, params = None) newnbc = puo.optimalbasis3(lsf.optimise, nbc.pwbasis, nbc.params, None, nbc.newparams) if nbc.npw > 0 else nbc gen, ini = pcad.pwbasisgeneration(k, Npw) basis, (coeffs, err) = pcad.optimalbasis2(u, gen, ini, quadrule) l2err = math.sqrt(np.vdot(err,err)) print l2err, basis, coeffs return pcb.BasisReduce(basis, coeffs) if __name__ == '__main__': k=15 origin1 = (-1,-1) origin2 = (2,2) fh1 = pcb.FourierHankel(origin1, [0], k) fh2 = pcb.FourierHankel(origin2, [0], k) fh = lambda p : fh1.values(p) + fh2.values(p) Npw = 8 Nq = 15 quadrule = puq.squarequadrature(Nq) runpwbasis(k, fh, Npw, quadrule) fs = runadaptivebasis2(k, fh, Npw, [0.5,0.5], quadrule) plotsquare3d([f.values for f in fs])
def pwproduniform(g, qxw, k, n): theta = np.linspace(0, 2*math.pi, n, endpoint=False) return (theta,)+ pap.L2Prod(g, qxw, k).products(theta) def qrp(qxw, dirs, k): qx,qw = qxw P = np.sqrt(qw.reshape(-1,1)) * pcb.PlaneWaves(dirs, k).values(qx) Q,R = sl.qr(P) print R if __name__ == '__main__': N = 20 k = 20 qxw = puq.squarequadrature(N) D = math.sqrt(2) D = 1 # # mesh = tum.regularsquaremesh() # e = 0 # mqs = pmmu.MeshQuadratures(mesh, puq.legendrequadrature(N)) # qx = np.vstack([mqs.quadpoints(f) for f in mesh.etof[e]]) # qw = np.concatenate([mqs.quadweights(f) for f in mesh.etof[e]]) # qxw = (qx,qw) qrp(qxw, pcb.circleDirections(4), k) g = pcb.PlaneWaves(pcb.circleDirections(40)[15], k) g = pcb.FourierHankel([-1,-0.5], [10], k) g = pcb.BasisReduce(pcb.PlaneWaves(pcb.circleDirections(20)[[5,8]], k), [3,1])