Index: sasmodels/kernel.py
===================================================================
--- sasmodels/kernel.py	(revision 3199b177cb91c6bd74017b7f942ddbbbc9bb46c0)
+++ sasmodels/kernel.py	(revision b297ba9e837aada12de87cd46ea7a01bfe549da7)
@@ -25,21 +25,41 @@
 
 class KernelModel(object):
+    """
+    Model definition for the compute engine.
+    """
     info = None  # type: ModelInfo
     dtype = None # type: np.dtype
     def make_kernel(self, q_vectors):
         # type: (List[np.ndarray]) -> "Kernel"
+        """
+        Instantiate a kernel for evaluating the model at *q_vectors*.
+        """
         raise NotImplementedError("need to implement make_kernel")
 
     def release(self):
         # type: () -> None
+        """
+        Free resources associated with the kernel.
+        """
         pass
 
 
 class Kernel(object):
-    #: kernel dimension, either "1d" or "2d"
+    """
+    Instantiated model for the compute engine, applied to a particular *q*.
+
+    Subclasses should define :meth:`_call_kernel` to evaluate the kernel over
+    its inputs.
+    """
+    #: Kernel dimension, either "1d" or "2d".
     dim = None  # type: str
+    #: Model info.
     info = None  # type: ModelInfo
-    results = None # type: List[np.ndarray]
+    #: Numerical precision for the computation.
     dtype = None  # type: np.dtype
+    #: q values at which the kernel is to be evaluated
+    q_input = None  # type: Any
+    #: Place to hold result of :meth:`_call_kernel` for subclass.
+    result = None # type: np.ndarray
 
     def Iq(self, call_details, values, cutoff, magnetic):
@@ -57,6 +77,6 @@
         built into the model, and do not need an additional scale.
         """
-        _, F2, _, shell_volume, _ = self.Fq(call_details, values, cutoff, magnetic,
-                              effective_radius_type=0)
+        _, F2, _, shell_volume, _ = self.Fq(call_details, values, cutoff,
+                                            magnetic, effective_radius_type=0)
         combined_scale = values[0]/shell_volume
         background = values[1]
@@ -64,5 +84,6 @@
     __call__ = Iq
 
-    def Fq(self, call_details, values, cutoff, magnetic, effective_radius_type=0):
+    def Fq(self, call_details, values, cutoff, magnetic,
+           effective_radius_type=0):
         # type: (CallDetails, np.ndarray, np.ndarray, float, bool, int) -> np.ndarray
         r"""
@@ -81,5 +102,5 @@
         .. math::
 
-            I(q) = \text{scale} * P (1 + <F>^2/<F^2> (S - 1)) + \text{background}
+            I(q) = \text{scale} P (1 + <F>^2/<F^2> (S - 1)) + \text{background}
                  = \text{scale}/<V> (<F^2> + <F>^2 (S - 1)) + \text{background}
 
@@ -90,5 +111,5 @@
         .. math::
 
-            P(q) = \frac{\sum w_k F^2(q, x_k) / \sum w_k}{\sum w_k V_k / \sum w_k}
+            P(q)=\frac{\sum w_k F^2(q, x_k) / \sum w_k}{\sum w_k V_k / \sum w_k}
 
         The form factor itself is scaled by volume and contrast to compute the
@@ -131,5 +152,6 @@
         hollow and solid shapes.
         """
-        self._call_kernel(call_details, values, cutoff, magnetic, effective_radius_type)
+        self._call_kernel(call_details, values, cutoff, magnetic,
+                          effective_radius_type)
         #print("returned",self.q_input.q, self.result)
         nout = 2 if self.info.have_Fq and self.dim == '1d' else 1
@@ -146,5 +168,6 @@
         if shell_volume == 0.:
             shell_volume = 1.
-        F1 = self.result[1:nout*self.q_input.nq:nout]/total_weight if nout == 2 else None
+        F1 = (self.result[1:nout*self.q_input.nq:nout]/total_weight
+              if nout == 2 else None)
         F2 = self.result[0:nout*self.q_input.nq:nout]/total_weight
         return F1, F2, effective_radius, shell_volume, form_volume/shell_volume
@@ -152,7 +175,11 @@
     def release(self):
         # type: () -> None
+        """
+        Free resources associated with the kernel instance.
+        """
         pass
 
-    def _call_kernel(self, call_details, values, cutoff, magnetic, effective_radius_type):
+    def _call_kernel(self, call_details, values, cutoff, magnetic,
+                     effective_radius_type):
         # type: (CallDetails, np.ndarray, np.ndarray, float, bool, int) -> np.ndarray
         """
