def createproblem(k, direction=array([[1,1]])/sqrt(2)): g = pcb.PlaneWaves(direction, k) bnddata={11:pcbd.zero_dirichlet(), 10:pcbd.generic_boundary_data([-1j*k,1],[-1j*k,1],g=g)} with(puf.pushd("../../examples/2D")): mesh = pmm.gmshMesh('squarescatt.msh',dim=2) return psp.Problem(mesh, k, bnddata)
def readvel(): with(puf.pushd('data')): f = ra.Input("marmvel.rsf") info = dict([(name, f.float(name)) for name in ['d1', 'd2']]+[(name, f.int(name)) for name in ['n1', 'n2']]) a = np.empty(f.shape(), order='F', dtype='float32').transpose() f.read(a) return a.transpose(), info
np.set_printoptions(threshold='nan') import pypwdg.parallel.main from numpy import array,sqrt k = 10 direction=array([[1.0,1.0]])/sqrt(2) g = pcb.PlaneWaves(direction, k) bnddata={11:pcbd.zero_dirichlet(), 10:pcbd.generic_boundary_data([-1j*k,1],[-1j*k,1],g=g)} bounds=array([[-2,2],[-2,2]],dtype='d') npoints=array([200,200]) with puf.pushd('../../examples/2D'): mesh = pmm.gmshMesh('squarescatt.msh',dim=2) problem = psp.Problem(mesh, k, bnddata) compinfo = psc.ComputationInfo(problem, pcb.planeWaveBases(2,k,11), 5) computation = psc.Computation(compinfo, pcp.HelmholtzSystem) #solbrutal = computation.solution(psi.BrutalSolver(np.complex, psi.DomainDecompOperator(mesh)).solve) soldd = computation.solution(psd.SchwarzOperator(mesh), psi.GMRESSolver(np.complex)) solindirect = computation.solution(psi.BlockPrecondOperator(mesh), psi.GMRESSolver(np.complex)) soldirect = computation.solution(psc.DirectOperator(), psc.DirectSolver()) #print np.max(np.abs(soldirect.x - solbrutal.x)) print np.max(np.abs(soldirect.x - solindirect.x)) print np.max(np.abs(soldirect.x - soldd.x))