def _steadystate_LU_liouvillian(L, ss_args, has_mkl=0): """Creates modified Liouvillian for LU based SS methods. """ perm = None perm2 = None rev_perm = None n = int(np.sqrt(L.shape[0])) form = 'csr' if has_mkl: L = L.data + sp.csr_matrix( (ss_args['weight']*np.ones(n), (np.zeros(n), [nn * (n + 1) for nn in range(n)])), shape=(n ** 2, n ** 2)) else: form = 'csc' L = L.data.tocsc() + sp.csc_matrix( (ss_args['weight']*np.ones(n), (np.zeros(n), [nn * (n + 1) for nn in range(n)])), shape=(n ** 2, n ** 2)) if settings.debug: old_band = sp_bandwidth(L)[0] old_pro = sp_profile(L)[0] logger.debug('Orig. NNZ: %i' % L.nnz) if ss_args['use_rcm']: logger.debug('Original bandwidth: %i' % old_band) if ss_args['use_wbm']: if settings.debug: logger.debug('Calculating Weighted Bipartite Matching ordering...') _wbm_start = time.time() perm = weighted_bipartite_matching(L) _wbm_end = time.time() L = sp_permute(L, perm, [], form) ss_args['info']['perm'].append('wbm') ss_args['info']['wbm_time'] = _wbm_end-_wbm_start if settings.debug: wbm_band = sp_bandwidth(L)[0] logger.debug('WBM bandwidth: %i' % wbm_band) if ss_args['use_rcm']: if settings.debug: logger.debug('Calculating Reverse Cuthill-Mckee ordering...') _rcm_start = time.time() perm2 = reverse_cuthill_mckee(L) _rcm_end = time.time() rev_perm = np.argsort(perm2) L = sp_permute(L, perm2, perm2, form) ss_args['info']['perm'].append('rcm') ss_args['info']['rcm_time'] = _rcm_end-_rcm_start if settings.debug: rcm_band = sp_bandwidth(L)[0] rcm_pro = sp_profile(L)[0] logger.debug('RCM bandwidth: %i' % rcm_band) logger.debug('Bandwidth reduction factor: %f' % (old_band/rcm_band)) logger.debug('Profile reduction factor: %f' % (old_pro/rcm_pro)) L.sort_indices() return L, perm, perm2, rev_perm, ss_args
def _steadystate_power_liouvillian(L, ss_args, has_mkl=0): """Creates modified Liouvillian for power based SS methods. """ perm = None perm2 = None rev_perm = None n = L.shape[0] if ss_args['solver'] == 'mkl': L = L.data - (1e-15) * sp.eye(n, n, format='csr') kind = 'csr' else: L = L.data.tocsc() - (1e-15) * sp.eye(n, n, format='csc') kind = 'csc' if settings.debug: old_band = sp_bandwidth(L)[0] old_pro = sp_profile(L)[0] logger.debug('Original bandwidth: %i' % old_band) logger.debug('Original profile: %i' % old_pro) if ss_args['use_wbm']: if settings.debug: logger.debug('Calculating Weighted Bipartite Matching ordering...') _wbm_start = time.time() with warnings.catch_warnings(): warnings.filterwarnings( "ignore", "qutip graph functions are deprecated", DeprecationWarning, ) perm = weighted_bipartite_matching(L) _wbm_end = time.time() L = sp_permute(L, perm, [], kind) ss_args['info']['perm'].append('wbm') ss_args['info']['wbm_time'] = _wbm_end - _wbm_start if settings.debug: wbm_band = sp_bandwidth(L)[0] wbm_pro = sp_profile(L)[0] logger.debug('WBM bandwidth: %i' % wbm_band) logger.debug('WBM profile: %i' % wbm_pro) if ss_args['use_rcm']: if settings.debug: logger.debug('Calculating Reverse Cuthill-Mckee ordering...') ss_args['info']['perm'].append('rcm') _rcm_start = time.time() perm2 = sp.csgraph.reverse_cuthill_mckee(L) _rcm_end = time.time() ss_args['info']['rcm_time'] = _rcm_end - _rcm_start rev_perm = np.argsort(perm2) L = sp_permute(L, perm2, perm2, kind) if settings.debug: new_band = sp_bandwidth(L)[0] new_pro = sp_profile(L)[0] logger.debug('RCM bandwidth: %i' % new_band) logger.debug('Bandwidth reduction factor: %f' % (old_band / new_band)) logger.debug('RCM profile: %i' % new_pro) logger.debug('Profile reduction factor: %f' % (old_pro / new_pro)) L.sort_indices() return L, perm, perm2, rev_perm, ss_args
def _steadystate_power_liouvillian(L, ss_args, has_mkl=0): """Creates modified Liouvillian for power based SS methods. """ perm = None perm2 = None rev_perm = None n = L.shape[0] if ss_args['solver'] == 'mkl': L = L.data - (1e-15) * sp.eye(n, n, format='csr') kind = 'csr' else: L = L.data.tocsc() - (1e-15) * sp.eye(n, n, format='csc') kind = 'csc' orig_nnz = L.nnz if settings.debug: old_band = sp_bandwidth(L)[0] old_pro = sp_profile(L)[0] logger.debug('Original bandwidth: %i' % old_band) logger.debug('Original profile: %i' % old_pro) if ss_args['use_wbm']: if settings.debug: logger.debug('Calculating Weighted Bipartite Matching ordering...') _wbm_start = time.time() perm = weighted_bipartite_matching(L) _wbm_end = time.time() L = sp_permute(L, perm, [], kind) ss_args['info']['perm'].append('wbm') ss_args['info']['wbm_time'] = _wbm_end-_wbm_start if settings.debug: wbm_band = sp_bandwidth(L)[0] wbm_pro = sp_profile(L)[0] logger.debug('WBM bandwidth: %i' % wbm_band) logger.debug('WBM profile: %i' % wbm_pro) if ss_args['use_rcm']: if settings.debug: logger.debug('Calculating Reverse Cuthill-Mckee ordering...') ss_args['info']['perm'].append('rcm') _rcm_start = time.time() perm2 = reverse_cuthill_mckee(L) _rcm_end = time.time() ss_args['info']['rcm_time'] = _rcm_end-_rcm_start rev_perm = np.argsort(perm2) L = sp_permute(L, perm2, perm2, kind) if settings.debug: new_band = sp_bandwidth(L)[0] new_pro = sp_profile(L)[0] logger.debug('RCM bandwidth: %i' % new_band) logger.debug('Bandwidth reduction factor: %f' % (old_band/new_band)) logger.debug('RCM profile: %i' % new_pro) logger.debug('Profile reduction factor: %f' % (old_pro/new_pro)) L.sort_indices() return L, perm, perm2, rev_perm, ss_args
def _steadystate_power_liouvillian(L, ss_args): """Creates modified Liouvillian for power based SS methods. """ perm = None perm2 = None rev_perm = None n = L.shape[0] L = L.data.tocsc() - (1e-15) * sp.eye(n, n, format='csc') orig_nnz = L.nnz if settings.debug: old_band = sp_bandwidth(L)[0] old_pro = sp_profile(L)[0] logger.debug('Original bandwidth: %i' % old_band) logger.debug('Original profile: %i' % old_pro) if ss_args['use_wbm']: if settings.debug: logger.debug('Calculating Weighted Bipartite Matching ordering...') _wbm_start = time.time() perm = weighted_bipartite_matching(L) _wbm_end = time.time() L = sp_permute(L, perm, [], 'csc') ss_args['info']['perm'].append('wbm') ss_args['info']['wbm_time'] = _wbm_end - _wbm_start if settings.debug: wbm_band = sp_bandwidth(L)[0] wbm_pro = sp_profile(L)[0] logger.debug('WBM bandwidth: %i' % wbm_band) logger.debug('WBM profile: %i' % wbm_pro) if ss_args['use_rcm']: if settings.debug: logger.debug('Calculating Reverse Cuthill-Mckee ordering...') ss_args['info']['perm'].append('rcm') _rcm_start = time.time() perm2 = reverse_cuthill_mckee(L) _rcm_end = time.time() ss_args['info']['rcm_time'] = _rcm_end - _rcm_start rev_perm = np.argsort(perm2) L = sp_permute(L, perm2, perm2, 'csc') if settings.debug: new_band = sp_bandwidth(L)[0] new_pro = sp_profile(L)[0] logger.debug('RCM bandwidth: %i' % new_band) logger.debug('Bandwidth reduction factor: %f' % (old_band / new_band)) logger.debug('RCM profile: %i' % new_pro) logger.debug('Profile reduction factor: %f' % (old_pro / new_pro)) L.sort_indices() return L, perm, perm2, rev_perm, ss_args
def _steadystate_LU_liouvillian(L, ss_args): """Creates modified Liouvillian for LU based SS methods. """ perm = None perm2 = None rev_perm = None dims = L.dims[0] n = prod(L.dims[0][0]) L = L.data.tocsc() + sp.csc_matrix( (ss_args['weight']*np.ones(n), (np.zeros(n), [nn * (n + 1) for nn in range(n)])), shape=(n ** 2, n ** 2)) if settings.debug: old_band = sp_bandwidth(L)[0] print('NNZ:', L.nnz) if ss_args['use_rcm']: print('Original bandwidth:', old_band) if ss_args['use_wbm']: if settings.debug: print('Calculating Weighted Bipartite Matching ordering...') _wbm_start = time.time() perm = weighted_bipartite_matching(L) _wbm_end = time.time() L = sp_permute(L, perm, [], 'csc') ss_args['info']['perm'].append('wbm') ss_args['info']['wbm_time'] = _wbm_end-_wbm_start if settings.debug: wbm_band = sp_bandwidth(L)[0] print('WBM bandwidth:', wbm_band) if ss_args['use_rcm']: if settings.debug: print('Calculating Reverse Cuthill-Mckee ordering...') _rcm_start = time.time() perm2 = reverse_cuthill_mckee(L) _rcm_end = time.time() rev_perm = np.argsort(perm2) L = sp_permute(L, perm2, perm2, 'csc') ss_args['info']['perm'].append('rcm') ss_args['info']['rcm_time'] = _rcm_end-_rcm_start if settings.debug: rcm_band = sp_bandwidth(L)[0] print('RCM bandwidth:', rcm_band) print('Bandwidth reduction factor:', round( old_band/rcm_band, 1)) L.sort_indices() return L, perm, perm2, rev_perm, ss_args
def _steadystate_LU_liouvillian(L, ss_args): """Creates modified Liouvillian for LU based SS methods. """ perm = None perm2 = None rev_perm = None dims = L.dims[0] n = prod(L.dims[0][0]) L = L.data.tocsc() + sp.csc_matrix( (ss_args['weight'] * np.ones(n), (np.zeros(n), [nn * (n + 1) for nn in range(n)])), shape=(n**2, n**2)) if settings.debug: old_band = sp_bandwidth(L)[0] print('NNZ:', L.nnz) if ss_args['use_rcm']: print('Original bandwidth:', old_band) if ss_args['use_wbm']: if settings.debug: print('Calculating Weighted Bipartite Matching ordering...') _wbm_start = time.time() perm = weighted_bipartite_matching(L) _wbm_end = time.time() L = sp_permute(L, perm, [], 'csc') ss_args['info']['perm'].append('wbm') ss_args['info']['wbm_time'] = _wbm_end - _wbm_start if settings.debug: wbm_band = sp_bandwidth(L)[0] print('WBM bandwidth:', wbm_band) if ss_args['use_rcm']: if settings.debug: print('Calculating Reverse Cuthill-Mckee ordering...') _rcm_start = time.time() perm2 = reverse_cuthill_mckee(L) _rcm_end = time.time() rev_perm = np.argsort(perm2) L = sp_permute(L, perm2, perm2, 'csc') ss_args['info']['perm'].append('rcm') ss_args['info']['rcm_time'] = _rcm_end - _rcm_start if settings.debug: rcm_band = sp_bandwidth(L)[0] print('RCM bandwidth:', rcm_band) print('Bandwidth reduction factor:', round(old_band / rcm_band, 1)) L.sort_indices() return L, perm, perm2, rev_perm, ss_args
def _steadystate_iterative(L, ss_args): """ Iterative steady state solver using the GMRES or LGMRES algorithm and a sparse incomplete LU preconditioner. """ if settings.debug: print('Starting '+ss_args['method']+' solver...') dims = L.dims[0] n = prod(L.dims[0][0]) b = np.zeros(n ** 2) b[0] = ss_args['weight'] L = L.data.tocsc() + sp.csc_matrix( (ss_args['weight']*np.ones(n), (np.zeros(n), [nn * (n + 1) for nn in range(n)])), shape=(n ** 2, n ** 2)) if ss_args['use_wbm']: perm = weighted_bipartite_matching(L) L = sp_permute(L, perm, [], 'csc') b = b[np.ix_(perm,)] if ss_args['use_rcm']: if settings.debug: old_band = sp_bandwidth(L)[0] print('Original bandwidth ', old_band) perm2 = reverse_cuthill_mckee(L) rev_perm = np.argsort(perm2) L = sp_permute(L, perm2, perm2, 'csc') b = b[np.ix_(perm2,)] if settings.debug: rcm_band = sp_bandwidth(L)[0] print('RCM bandwidth ', rcm_band) print('Bandwidth reduction factor:', round(old_band/rcm_band, 1)) L.sort_indices() if ss_args['M'] is None and ss_args['use_precond']: ss_args['M'] = _iterative_precondition(L, n, ss_args) # Select iterative solver type if ss_args['method'] == 'iterative-gmres': v, check = gmres(L, b, tol=ss_args['tol'], M=ss_args['M'], maxiter=ss_args['maxiter']) elif ss_args['method'] == 'iterative-lgmres': v, check = lgmres(L, b, tol=ss_args['tol'], M=ss_args['M'], maxiter=ss_args['maxiter']) else: raise Exception("Invalid iterative solver method.") if check > 0: raise Exception("Steadystate solver did not reach tolerance after " + str(check) + " steps.") elif check < 0: raise Exception( "Steadystate solver failed with fatal error: " + str(check) + ".") if ss_args['use_rcm']: v = v[np.ix_(rev_perm,)] data = vec2mat(v) data = 0.5 * (data + data.conj().T) return Qobj(data, dims=dims, isherm=True)
def _steadystate_direct_sparse(L, ss_args): """ Direct solver that uses scipy sparse matrices """ if settings.debug: print('Starting direct LU solver...') dims = L.dims[0] n = prod(L.dims[0][0]) b = np.zeros(n ** 2, dtype=complex) b[0] = ss_args['weight'] L = L.data.tocsc() + sp.csc_matrix( (ss_args['weight']*np.ones(n), (np.zeros(n), [nn * (n + 1) for nn in range(n)])), shape=(n ** 2, n ** 2)) L.sort_indices() use_solver(assumeSortedIndices=True, useUmfpack=ss_args['use_umfpack']) if not ss_args['use_umfpack']: # Use superLU solver orig_nnz = L.nnz if settings.debug: old_band = sp_bandwidth(L)[0] print('Original NNZ:', orig_nnz) if ss_args['use_rcm']: print('Original bandwidth:', old_band) if ss_args['use_wbm']: perm = weighted_bipartite_matching(L) L = sp_permute(L, perm, [], 'csc') b = b[np.ix_(perm,)] if ss_args['use_rcm']: perm2 = reverse_cuthill_mckee(L) rev_perm = np.argsort(perm2) L = sp_permute(L, perm2, perm2, 'csc') b = b[np.ix_(perm2,)] if settings.debug: rcm_band = sp_bandwidth(L)[0] print('RCM bandwidth:', rcm_band) print('Bandwidth reduction factor:', round( old_band/rcm_band, 1)) lu = splu(L, permc_spec=ss_args['permc_spec'], diag_pivot_thresh=ss_args['diag_pivot_thresh'], options=dict(ILU_MILU=ss_args['ILU_MILU'])) v = lu.solve(b) if settings.debug and _scipy_check: L_nnz = lu.L.nnz U_nnz = lu.U.nnz print('L NNZ:', L_nnz, ';', 'U NNZ:', U_nnz) print('Fill factor:', (L_nnz+U_nnz)/orig_nnz) else: # Use umfpack solver v = spsolve(L, b) if (not ss_args['use_umfpack']) and ss_args['use_rcm']: v = v[np.ix_(rev_perm,)] data = vec2mat(v) data = 0.5 * (data + data.conj().T) return Qobj(data, dims=dims, isherm=True)