Source code for openmdao.matrices.csc_matrix
"""Define the CSCmatrix class."""
from scipy.sparse import csc_matrix
from openmdao.matrices.coo_matrix import COOMatrix
[docs]
class CSCMatrix(COOMatrix):
"""
Sparse matrix in Compressed Col Storage format.
Parameters
----------
comm : MPI.Comm or <FakeComm>
Communicator of the top-level system that owns the <Jacobian>.
is_internal : bool
If True, this is the int_mtx of an AssembledJacobian.
"""
def _build(self, num_rows, num_cols, system=None):
"""
Allocate the matrix.
Parameters
----------
num_rows : int
number of rows in the matrix.
num_cols : int
number of cols in the matrix.
system : <System>
owning system.
"""
super()._build(num_rows, num_cols, system)
self._coo = self._matrix
def _pre_update(self):
"""
Do anything that needs to be done at the start of AssembledJacobian._update.
"""
self._matrix = self._coo
def _post_update(self):
"""
Do anything that needs to be done at the end of AssembledJacobian._update.
"""
coo = self._coo
# this will add any repeated entries together
# NOTE: The CSC matrix was created in the following way instead of using self._coo.tocsc()
# because on older versions of scipy, self._coo.tocsc() reuses the row/col arrays and the
# result is that self._coo.row and self._coo.col get scrambled after csc conversion.
self._matrix = csc_matrix((coo.data, (coo.row, coo.col)), shape=coo.shape)
def _convert_mask(self, mask):
"""
Convert the mask to the format of this sparse matrix (CSC, etc.) from COO.
Parameters
----------
mask : ndarray
The mask of indices to zero out.
Returns
-------
ndarray
The converted mask array.
"""
coo = self._coo
csc = csc_matrix((mask, (coo.row, coo.col)), shape=coo.shape)
return csc.data
[docs]
def set_complex_step_mode(self, active):
"""
Turn on or off complex stepping mode.
When turned on, the value in each subjac is cast as complex, and when turned
off, they are returned to real values.
Parameters
----------
active : bool
Complex mode flag; set to True prior to commencing complex step.
"""
if active:
if 'complex' not in self._matrix.dtype.__str__():
self._matrix.data = self._matrix.data.astype(complex)
self._matrix.dtype = complex
self._coo.data = self._coo.data.astype(complex)
self._coo.dtype = complex
else:
self._matrix.data = self._matrix.data.real
self._matrix.dtype = float
self._coo.data = self._coo.data.real
self._coo.dtype = float