Пример #1
0
 def spsolve(self, vec):
     """For a matrix A, solves the equation "Ax = vec" for x.
     """
     if len(vec) == 1:
         return vec / self.diag
     (_, _, _, x, _) = lapack.dgtsv(self.down, self.diag, self.up, vec)
     return x
Пример #2
0
def solve_tridiag(a, b, c, d):
    """
    Solves a tridiagonal matrix system with diagonals a, b, c and RHS vector d.
    """
    assert a.shape == b.shape and a.shape == c.shape and a.shape == d.shape
    a[..., 0] = c[..., -1] = 0  # remove couplings between slices
    return lapack.dgtsv(a.flatten()[1:], b.flatten(),
                        c.flatten()[:-1], d.flatten())[3].reshape(a.shape)
def cyclic(a, b, c, alpha, beta, r, n, bb, u, x, z):
    start = time.time()
    gamma = -b[0]
    bb[:] = b[:]
    end = time.time()
    print("1")
    print(end-start)
    
    start = time.time()
    bb[0] = b[0]-gamma
    bb[-1]  = b[-1]-alpha*beta/gamma
    end = time.time()
    print("2")
    print(end-start)
    
    start = time.time()
    x = sll.dgtsv(a,bb,c,r)[3]
    end = time.time()
    print("3")
    print(end-start)

    
    start = time.time()
    u[0] = gamma
    u[-1] = alpha
    end = time.time()
    print("4")
    print(end-start)
    
    start = time.time()
    z = sll.dgtsv(a,bb,c,u)[3]

    end = time.time()
    print("5")
    print(end-start)

 
    start = time.time()
    fact = (x[0]+beta*x[-1]/gamma)/(1.0+z[0]+beta*z[-1]/gamma)
    x = x - fact*z
    end = time.time()
    print("6")
    print(end-start)

    return x
 def compactFilter_Fast(self, f):
     if self.typeBC == "PERIODIC":
         return cyclic2(self.aF, self.bF, self.bbF, self.cF,
                        self.cyclicCornerF, self.cyclicCornerF,
                        spspar.csr_matrix.dot(self.RHF, f), self.N,
                        self.work1, self.work2, self.work3)
     elif self.typeBC == "DIRICHLET":
         return sll.dgtsv(self.aF, self.bF, self.cF,
                          spspar.csr_matrix.dot(self.RHF, f))[3]
 def compact2ndDeriv_Fast(self, f):
     if self.typeBC == "PERIODIC":
         return cyclic2(self.a2, self.b2, self.bb2, self.c2,
                        self.cyclicCorner2, self.cyclicCorner2,
                        spspar.csr_matrix.dot(self.RH2D, f), self.N,
                        self.work1, self.work2, self.work3)
     elif self.typeBC == "DIRICHLET":
         return sll.dgtsv(self.a2, self.b2, self.c2,
                          spspar.csr_matrix.dot(self.RH2D, f))[3]
def cyclic2(a, b, bb, c, alpha, beta, r, n, u, x, z):

    gamma = -b[0]
    bb[0] = b[0] - gamma
    bb[-1] = b[-1] - alpha * beta / gamma

    x = sll.dgtsv(a, bb, c, r)[3]

    u[:] = 0.0
    u[0] = gamma
    u[-1] = alpha

    z = sll.dgtsv(a, bb, c, u)[3]

    fact = (x[0] + beta * x[-1] / gamma) / (1.0 + z[0] + beta * z[-1] / gamma)
    x = x - fact * z

    return x
Пример #7
0
def solve_tridiag(pyom, a, b, c, d):
    """
    Solves a tridiagonal matrix system with diagonals a, b, c and RHS vector d.
    Uses LAPACK when running with NumPy, and otherwise the Thomas algorithm iterating over the
    last axis of the input arrays.
    """
    assert a.shape == b.shape and a.shape == c.shape and a.shape == d.shape
    try:
        return np.linalg.solve_tridiagonal(a,b,c,d)
    except AttributeError:
        return lapack.dgtsv(a.flatten()[1:],b.flatten(),c.flatten()[:-1],d.flatten())[3].reshape(a.shape)
Пример #8
0
def solve_tridiag(vs, a, b, c, d):
    """
    Solves a tridiagonal matrix system with diagonals a, b, c and RHS vector d.
    Uses LAPACK when running with NumPy, and otherwise the Thomas algorithm iterating over the
    last axis of the input arrays.
    """
    assert a.shape == b.shape and a.shape == c.shape and a.shape == d.shape

    if rs.backend == 'bohrium' and rst.vector_engine in ('opencl', 'openmp'):
        return np.linalg.solve_tridiagonal(a, b, c, d)

    # fall back to scipy
    from scipy.linalg import lapack
    a[..., 0] = c[..., -1] = 0  # remove couplings between slices
    return lapack.dgtsv(a.flatten()[1:], b.flatten(),
                        c.flatten()[:-1], d.flatten())[3].reshape(a.shape)
Пример #9
0
def solve_tridiag(vs, a, b, c, d):
    """
    Solves a tridiagonal matrix system with diagonals a, b, c and RHS vector d.
    Uses LAPACK when running with NumPy, and otherwise the Thomas algorithm iterating over the
    last axis of the input arrays.
    """
    assert a.shape == b.shape and a.shape == c.shape and a.shape == d.shape

    if vs.backend_name == "numpy":
        a[..., 0] = c[..., -1] = 0  # remove couplings between slices
        return lapack.dgtsv(a.flatten()[1:], b.flatten(),
                            c.flatten()[:-1], d.flatten())[3].reshape(a.shape)

    if vs.vector_engine == "opencl":
        return tdma_opencl.tdma(a, b, c, d)

    return np.linalg.solve_tridiagonal(a, b, c, d)
Пример #10
0
                
    
    
    

N = 100
a = np.ones(N-1,dtype=np.double)
b = -2*np.ones(N,dtype=np.double)
c = np.ones(N-1,dtype=np.double)

d = np.ones(N,dtype=np.double)

start = time.time()
for i in range(10000):
    x = sll.dgtsv(a,b,c,d)
end = time.time()
print(end-start)


lmat = spspar.lil_matrix((N,N))
lmat.setdiag(np.ones(N-1),-1)
lmat.setdiag(-2*np.ones(N),0)
lmat.setdiag(np.ones(N-1),1)
lmat = lmat.tocsr()

start = time.time()
for i in range(10000):
    xsparse = spsparlin.spsolve(lmat,d)
end = time.time()
print(end-start)