code: def build_diagonals(self):
      
  
      ##########################################################
      # INCORPORATE BOUNDARY CONDITIONS INTO COEFFICIENT ARRAY #
      ##########################################################
  
      # Roll to keep the proper coefficients at the proper places in the
      # arrays: Python will naturally just do vertical shifts instead of 
      # diagonal shifts, so this takes into account the horizontal compoent 
      # to ensure that boundary values are at the right place.
      self.l2 = np.roll(self.l2, -2)
      self.l1 = np.roll(self.l1, -1)
      self.r1 = np.roll(self.r1, 1)
      self.r2 = np.roll(self.r2, 2)
  
      # Then assemble these rows: this is where the periodic boundary condition 
      # can matter.
      if self.coeff_matrix is not None:
        pass
      elif self.BC_E == 'Periodic' and self.BC_W == 'Periodic':
        # In this case, the boundary-condition-related stacking has already 
        # happened inside b.c.-handling function. This is because periodic
        # boundary conditions require extra diagonals to exist on the edges of 
        # the solution array
        pass
      else:
        self.diags = np.vstack((self.l2,self.l1,self.c0,self.r1,self.r2))
        self.offsets = np.array([-2,-1,0,1,2])
  
      # Everybody now (including periodic b.c. cases)
      self.coeff_matrix = spdiags(self.diags, self.offsets, self.nx, self.nx, format='csr')
docs: Builds the diagonals for the coefficient array