def _dict_to_di(name, dd): di = DofInfo(name) for key in keys: val = dd[key] di.append_raw(key, val) return di
def make_global_lcbc_operator(lcbc_ops, adi, new_only=False): """ Assemble all LCBC operators into a single matrix. Returns ------- mtx_lc : csr_matrix The global LCBC operator in the form of a CSR matrix. lcdi : DofInfo The global active LCBC-constrained DOF information. new_only : bool If True, the operator columns will contain only new DOFs. """ n_dof = adi.ptr[-1] eq_lcbc = nm.zeros((n_dof,), dtype=nm.int32) n_dof_new = 0 n_free = {} n_new = {} for var_name, lcbc_op in lcbc_ops.iteritems(): if lcbc_op is None: continue indx = adi.indx[var_name] eq_lcbc[indx] = lcbc_op.eq_lcbc n_free[var_name] = len(nm.where(lcbc_op.eq_lcbc == 0)[0]) n_new[var_name] = nm.sum(lcbc_op.n_transformed_dof) n_dof_new += n_new[var_name] if n_dof_new == 0: return None, None ii = nm.nonzero(eq_lcbc)[0] n_constrained = ii.shape[0] n_dof_free = n_dof - n_constrained n_dof_reduced = n_dof_free + n_dof_new output('dofs: total %d, free %d, constrained %d, new %d'\ % (n_dof, n_dof_free, n_constrained, n_dof_new)) output(' -> reduced %d' % (n_dof_reduced)) lcdi = DofInfo('lcbc_active_state_dof_info') fdi = DofInfo('free_dof_info') ndi = DofInfo('new_dof_info') for var_name in adi.var_names: nf = n_free.get(var_name, adi.n_dof[var_name]) nn = n_new.get(var_name, 0) fdi.append_raw(var_name, nf) ndi.append_raw(var_name, nn) lcdi.append_raw(var_name, nn + nf) assert_(lcdi.ptr[-1] == n_dof_reduced) rows = [] cols = [] data = [] for var_name, lcbc_op in lcbc_ops.iteritems(): if lcbc_op is None: continue if new_only: offset = ndi.indx[var_name].start else: offset = lcdi.indx[var_name].start + fdi.n_dof[var_name] for ii, op in enumerate(lcbc_op): indx = nm.where(eq_lcbc == lcbc_op.markers[ii])[0] icols = nm.arange(offset + lcbc_op.ics[ii], offset + lcbc_op.ics[ii+1]) if isinstance(op.mtx, sp.spmatrix): lr, lc, lv = sp.find(op.mtx) rows.append(indx[lr]) cols.append(icols[lc]) data.append(lv) else: irs, ics = nm.meshgrid(indx, icols) rows.append(irs.ravel()) cols.append(ics.ravel()) data.append(op.mtx.T.ravel()) rows = nm.concatenate(rows) cols = nm.concatenate(cols) data = nm.concatenate(data) if new_only: mtx_lc = sp.coo_matrix((data, (rows, cols)), shape=(n_dof, n_dof_new)) else: mtx_lc = sp.coo_matrix((data, (rows, cols)), shape=(n_dof, n_dof_reduced)) ir = nm.where(eq_lcbc == 0)[0] ic = nm.empty((n_dof_free,), dtype=nm.int32) for var_name in adi.var_names: ii = nm.arange(fdi.n_dof[var_name], dtype=nm.int32) ic[fdi.indx[var_name]] = lcdi.indx[var_name].start + ii mtx_lc2 = sp.coo_matrix((nm.ones((ir.shape[0],)), (ir, ic)), shape=(n_dof, n_dof_reduced), dtype=nm.float64) mtx_lc = mtx_lc + mtx_lc2 mtx_lc = mtx_lc.tocsr() return mtx_lc, lcdi
def _dict_to_di(name, dd): di = DofInfo(name) for key, val in six.iteritems(dd): di.append_raw(key, val) return di
def make_global_lcbc_operator(lcbc_ops, adi, new_only=False): """ Assemble all LCBC operators into a single matrix. Returns ------- mtx_lc : csr_matrix The global LCBC operator in the form of a CSR matrix. lcdi : DofInfo The global active LCBC-constrained DOF information. new_only : bool If True, the operator columns will contain only new DOFs. """ n_dof = adi.ptr[-1] eq_lcbc = nm.zeros((n_dof, ), dtype=nm.int32) n_dof_new = 0 n_free = {} n_new = {} for var_name, lcbc_op in lcbc_ops.iteritems(): if lcbc_op is None: continue indx = adi.indx[var_name] eq_lcbc[indx] = lcbc_op.eq_lcbc n_free[var_name] = len(nm.where(lcbc_op.eq_lcbc == 0)[0]) n_new[var_name] = nm.sum(lcbc_op.n_transformed_dof) n_dof_new += n_new[var_name] if n_dof_new == 0: return None, None ii = nm.nonzero(eq_lcbc)[0] n_constrained = ii.shape[0] n_dof_free = n_dof - n_constrained n_dof_reduced = n_dof_free + n_dof_new output('dofs: total %d, free %d, constrained %d, new %d'\ % (n_dof, n_dof_free, n_constrained, n_dof_new)) output(' -> reduced %d' % (n_dof_reduced)) lcdi = DofInfo('lcbc_active_state_dof_info') fdi = DofInfo('free_dof_info') ndi = DofInfo('new_dof_info') for var_name in adi.var_names: nf = n_free.get(var_name, adi.n_dof[var_name]) nn = n_new.get(var_name, 0) fdi.append_raw(var_name, nf) ndi.append_raw(var_name, nn) lcdi.append_raw(var_name, nn + nf) assert_(lcdi.ptr[-1] == n_dof_reduced) rows = [] cols = [] data = [] for var_name, lcbc_op in lcbc_ops.iteritems(): if lcbc_op is None: continue if new_only: offset = ndi.indx[var_name].start else: offset = lcdi.indx[var_name].start + fdi.n_dof[var_name] for ii, op in enumerate(lcbc_op): indx = nm.where(eq_lcbc == lcbc_op.markers[ii])[0] icols = nm.arange(offset + lcbc_op.ics[ii], offset + lcbc_op.ics[ii + 1]) if isinstance(op.mtx, sp.spmatrix): lr, lc, lv = sp.find(op.mtx) rows.append(indx[lr]) cols.append(icols[lc]) data.append(lv) else: irs, ics = nm.meshgrid(indx, icols) rows.append(irs.ravel()) cols.append(ics.ravel()) data.append(op.mtx.T.ravel()) rows = nm.concatenate(rows) cols = nm.concatenate(cols) data = nm.concatenate(data) if new_only: mtx_lc = sp.coo_matrix((data, (rows, cols)), shape=(n_dof, n_dof_new)) else: mtx_lc = sp.coo_matrix((data, (rows, cols)), shape=(n_dof, n_dof_reduced)) ir = nm.where(eq_lcbc == 0)[0] ic = nm.empty((n_dof_free, ), dtype=nm.int32) for var_name in adi.var_names: ii = nm.arange(fdi.n_dof[var_name], dtype=nm.int32) ic[fdi.indx[var_name]] = lcdi.indx[var_name].start + ii mtx_lc2 = sp.coo_matrix((nm.ones((ir.shape[0], )), (ir, ic)), shape=(n_dof, n_dof_reduced), dtype=nm.float64) mtx_lc = mtx_lc + mtx_lc2 mtx_lc = mtx_lc.tocsr() return mtx_lc, lcdi
def _dict_to_di(name, dd): di = DofInfo(name) for key, val in dd.iteritems(): di.append_raw(key, val) return di