code: def matrix_asformat(lvl, name, format, blocksize=None):
      
      desired_matrix = name + format
      M = getattr(lvl, name)
  
      if format == 'bsr':
          desired_matrix += str(blocksize[0])+str(blocksize[1])
  
      if hasattr(lvl, desired_matrix):
          # if lvl already contains lvl.name+format
          pass
      elif M.format == format and format != 'bsr':
          # is base_matrix already in the correct format?
          setattr(lvl, desired_matrix, M)
      elif M.format == format and format == 'bsr':
          # convert to bsr with the right blocksize
          # tobsr() will not do anything extra if this is uneeded
          setattr(lvl, desired_matrix, M.tobsr(blocksize=blocksize))
      else:
          # convert
          newM = getattr(M, 'to' + format)()
          setattr(lvl, desired_matrix, newM)
  
      return getattr(lvl, desired_matrix)
docs: Set a matrix to a specific format.
  
      This routine looks for the matrix "name" in the specified format as a
      member of the level instance, lvl.  For example, if name='A', format='bsr'
      and blocksize=(4,4), and if lvl.Absr44 exists with the correct blocksize,
      then lvl.Absr is returned.  If the matrix doesn't already exist, lvl.name
      is converted to the desired format, and made a member of lvl.
  
      Only create such persistent copies of a matrix for routines such as
      presmoothing and postsmoothing, where the matrix conversion is done every
      cycle.
  
      Calling this function can _dramatically_ increase your memory costs.
      Be careful with it's usage.