def __init__(self, A_f, numLevels, theta=0.25, verb=0, graph=False): timer = Timer('AMG setup') self.seqA = [None]*numLevels self.updates = [None]*numLevels self.downdates = [None]*numLevels self.seqA[numLevels-1] = A_f tab1 = Tab() tab2 = Tab() for i in reversed(range(numLevels-1)): Debug.msg1(verb, '-------------------------------------------------------------') Debug.msg1(verb, tab1, 'coarsening level %d to level %d' % (i+1,i)) np.set_printoptions(threshold=np.inf) Debug.msg4(verb, tab2, 'operator is A[%d]\n' % i, self.seqA[i+1].tolil()) C = coarsen(self.seqA[i+1], theta = theta, verb=verb) Debug.msg2(verb, tab2, '#vertices: %d' % len(C)) if graph: matrixGraph(self.seqA[i+1], C, name='graph-%d.gv' % i) Debug.msg1(verb, tab1, 'making update operator: level %d to level %d' % (i+1,i)) I_up = smoothUpdate(self.seqA[i+1], C, verb) Debug.msg1(verb, tab1, 'making downdate operator: level %d to level %d' % (i,i+1)) I_down = makeDowndate(I_up, verb) self.updates[i] = I_up self.downdates[i] = I_down self.seqA[i] = self.downdates[i]*(self.seqA[i+1]*self.updates[i])
def matrixGraph(A, C, name='graph.gv', verb=0): g = Graph(filename=name) ip = A.indptr allVals = A.data allCols = A.indices M = A.shape[0] for i in range(M): Debug.msg1(verb, 'i=%d' % i) if i in C: color = 'lightblue' else: color = 'lightgrey' g.node('%d' % i, '%d' % i, color=color, style='filled') for i in range(M): cols = allCols[ip[i]:ip[i + 1]] for j in cols: if i < j: g.edge('%d' % i, '%d' % j) g.view()
from GoofySquare import GoofySquare1 from AMGCoarsen import coarsen from UniformRectangleMesher import UniformRectangleMesher from MPLMeshViewer import MPLMeshViewer np.set_printoptions(precision=4) mesh = UniformRectangleMesher(0.0, 1.0, 2, 0.0, 1.0, 2) beta = 0.0 load = ConstantFunc(beta*beta) (A,b) = DiscretizeDH(mesh, load, beta) np.set_printoptions(precision=4) verb=0 Debug.msg1(verb, 'A=\n', A.todense()) C = coarsen(A) I_up = smoothUpdate(A,C) I_down = makeDowndate(I_up) Debug.msg1(verb, 'Update matrix:') Debug.msg1(verb, I_up.todense()) Debug.msg1(verb, "Update row sums:") Debug.msg1(verb, I_up*np.ones(I_up.shape[1])) Debug.msg1(verb, 'Downdate matrix:')