Index: sasmodels/model_test.py
===================================================================
--- sasmodels/model_test.py	(revision 5c962dff13d0a0a2f6d779be8df775f540958dbc)
+++ sasmodels/model_test.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -100,7 +100,11 @@
                 test_name = "Model: %s, Kernel: OpenCL"%model_name
                 test_method_name = "test_%s_opencl" % model_name
+                # Using dtype=None so that the models that are only
+                # correct for double precision are not tested using
+                # single precision.  The choice is determined by the
+                # presence of *single=False* in the model file.
                 test = ModelTestCase(test_name, model_definition,
                                      test_method_name,
-                                     platform="ocl", dtype='single')
+                                     platform="ocl", dtype=None)
                 #print("defining", test_name)
                 suite.addTest(test)
@@ -157,5 +161,5 @@
                     ## values an error.  Only do so for the "dll" tests
                     ## to reduce noise from both opencl and dll, and because
-                    ## python kernels us
+                    ## python kernels use platform="dll".
                     #raise Exception("No test cases provided")
                     pass
@@ -198,7 +202,5 @@
                                     'invalid f(%s): %s' % (xi, actual_yi))
                 else:
-                    err = abs(yi - actual_yi)
-                    nrm = abs(yi)
-                    self.assertLess(err * 10**5, nrm,
+                    self.assertTrue(is_near(yi, actual_yi, 5),
                                     'f(%s); expected:%s; actual:%s'
                                     % (xi, yi, actual_yi))
@@ -206,5 +208,11 @@
     return ModelTestCase
 
-
+def is_near(target, actual, digits=5):
+    """
+    Returns true if *actual* is within *digits* significant digits of *target*.
+    """
+    import math
+    shift = 10**math.ceil(math.log10(abs(target)))
+    return abs(target-actual)/shift < 1.5*10**-digits
 
 def main():
@@ -217,4 +225,9 @@
 
     models = sys.argv[1:]
+    if models and models[0] == '-v':
+        verbosity = 2
+        models = models[1:]
+    else:
+        verbosity = 1
     if models and models[0] == 'opencl':
         if not HAVE_OPENCL:
@@ -235,14 +248,18 @@
         print("""\
 usage:
-  python -m sasmodels.model_test [opencl|dll|opencl_and_dll] model1 model2 ...
+  python -m sasmodels.model_test [-v] [opencl|dll] model1 model2 ...
+
+If -v is included on the
+If neither opencl nor dll is specified, then models will be tested with
+both opencl and dll; the compute target is ignored for pure python models.
 
 If model1 is 'all', then all except the remaining models will be tested.
-If no compute target is specified, then models will be tested with both opencl
-and dll; the compute target is ignored for pure python models.""")
+
+""")
 
         return 1
 
     #runner = unittest.TextTestRunner()
-    runner = xmlrunner.XMLTestRunner(output='logs')
+    runner = xmlrunner.XMLTestRunner(output='logs', verbosity=verbosity)
     result = runner.run(make_suite(loaders, models))
     return 1 if result.failures or result.errors else 0
Index: sasmodels/models/HayterMSAsq.py
===================================================================
--- sasmodels/models/HayterMSAsq.py	(revision 7f47777b1828197366e17d650a92f794a3433fcc)
+++ sasmodels/models/HayterMSAsq.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -56,4 +56,5 @@
         parameters used in P(Q).
 """
+single = False  # double precision only for now
 #             [ "name", "units", default, [lower, upper], "type", "description" ],
 parameters = [["effect_radius", "Ang", 20.75, [0, inf], "volume",
Index: sasmodels/models/bcc.py
===================================================================
--- sasmodels/models/bcc.py	(revision dcdf29d606cfaa2f3bb9d578ac394c6f167fa360)
+++ sasmodels/models/bcc.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -116,4 +116,7 @@
     """
 category = "shape:paracrystal"
+
+single = False
+
 # pylint: disable=bad-whitespace, line-too-long
 #             ["name", "units", default, [lower, upper], "type","description" ],
Index: sasmodels/models/core_shell_ellipsoid.py
===================================================================
--- sasmodels/models/core_shell_ellipsoid.py	(revision 81dd61963c319ce8b1c38d14a6f3056a517fccdd)
+++ sasmodels/models/core_shell_ellipsoid.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -96,4 +96,5 @@
 category = "shape:ellipsoid"
 
+single = False  # TODO: maybe using sph_j1c inside gfn would help?
 # pylint: disable=bad-whitespace, line-too-long
 #             ["name", "units", default, [lower, upper], "type", "description"],
Index: sasmodels/models/fcc.py
===================================================================
--- sasmodels/models/fcc.py	(revision eb69cce00f0781ad8f3eec0eb5965a8576d815b5)
+++ sasmodels/models/fcc.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -112,4 +112,6 @@
 category = "shape:paracrystal"
 
+single = False
+
 #             ["name", "units", default, [lower, upper], "type","description"],
 parameters = [["dnn", "Ang", 220, [-inf, inf], "", "Nearest neighbour distance"],
Index: sasmodels/models/flexible_cylinder.py
===================================================================
--- sasmodels/models/flexible_cylinder.py	(revision 168052c5791506d7dfad00173f5636fc5701ad11)
+++ sasmodels/models/flexible_cylinder.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -78,4 +78,5 @@
 
 category = "shape:cylinder"
+single = False
 
 # pylint: disable=bad-whitespace, line-too-long
Index: sasmodels/models/flexible_cylinder_ex.py
===================================================================
--- sasmodels/models/flexible_cylinder_ex.py	(revision 504abeee8bc5d67a14d7598227542961d3d748ed)
+++ sasmodels/models/flexible_cylinder_ex.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -98,4 +98,5 @@
         during model fitting.
         """
+single = False
 
 category = "shape:cylinder"
Index: sasmodels/models/gaussian_peak.py
===================================================================
--- sasmodels/models/gaussian_peak.py	(revision eb69cce00f0781ad8f3eec0eb5965a8576d815b5)
+++ sasmodels/models/gaussian_peak.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -42,4 +42,5 @@
 category = "shape-independent"
 
+single = False
 #             ["name", "units", default, [lower, upper], "type","description"],
 parameters = [["q0", "1/Ang", 0.05, [-inf, inf], "", "Peak position"],
Index: sasmodels/models/hardsphere.py
===================================================================
--- sasmodels/models/hardsphere.py	(revision 7f47777b1828197366e17d650a92f794a3433fcc)
+++ sasmodels/models/hardsphere.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -55,4 +55,5 @@
                "volume fraction of hard spheres"],
              ]
+single = False
 
 # No volume normalization despite having a volume parameter
Index: sasmodels/models/lamellarCaille.py
===================================================================
--- sasmodels/models/lamellarCaille.py	(revision 7f47777b1828197366e17d650a92f794a3433fcc)
+++ sasmodels/models/lamellarCaille.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -87,4 +87,6 @@
 category = "shape:lamellae"
 
+single = False
+
 #             ["name", "units", default, [lower, upper], "type","description"],
 parameters = [["thickness", "Ang",  30.0, [0, inf], "volume", "sheet thickness"],
Index: sasmodels/models/lamellarCailleHG.py
===================================================================
--- sasmodels/models/lamellarCailleHG.py	(revision 7f47777b1828197366e17d650a92f794a3433fcc)
+++ sasmodels/models/lamellarCailleHG.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -91,4 +91,5 @@
 category = "shape:lamellae"
 
+single = False
 parameters = [
     #   [ "name", "units", default, [lower, upper], "type",
Index: sasmodels/models/lamellarPC.py
===================================================================
--- sasmodels/models/lamellarPC.py	(revision 7f47777b1828197366e17d650a92f794a3433fcc)
+++ sasmodels/models/lamellarPC.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -111,4 +111,6 @@
 category = "shape:lamellae"
 
+single = False
+
 #             ["name", "units", default, [lower, upper], "type","description"],
 parameters = [["thickness", "Ang", 33.0, [0, inf], "volume",
Index: sasmodels/models/lib/gfn.c
===================================================================
--- sasmodels/models/lib/gfn.c	(revision 81dd61963c319ce8b1c38d14a6f3056a517fccdd)
+++ sasmodels/models/lib/gfn.c	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -6,5 +6,5 @@
 //       <OBLATE ELLIPSOID>
 // function gfn4 for oblate ellipsoids
-double
+static double
 gfn4(double xx, double crmaj, double crmin, double trmaj, double trmin, double delpc, double delps, double qq)
 {
Index: sasmodels/models/lib/wrc_cyl.c
===================================================================
--- sasmodels/models/lib/wrc_cyl.c	(revision 504abeee8bc5d67a14d7598227542961d3d748ed)
+++ sasmodels/models/lib/wrc_cyl.c	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -379,4 +379,5 @@
 }
 
+double Sk_WR(double q, double L, double b);
 double Sk_WR(double q, double L, double b)
 {
Index: sasmodels/models/rpa.c
===================================================================
--- sasmodels/models/rpa.c	(revision 82c299fa51ab091ee8ead0a235d4177ccfeecb99)
+++ sasmodels/models/rpa.c	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -205,5 +205,5 @@
   const double Kbb = 0.0;
   const double Kcc = 0.0;
-  const double Kdd = 0.0;
+  //const double Kdd = 0.0;
   const double Zaa = Kaa - Kad - Kad;
   const double Zab = Kab - Kad - Kbd;
@@ -278,9 +278,9 @@
   const double Q12 = (-Mab*Mcc + Mac*Mcb)/DenQ;
   const double Q13 = ( Mab*Mbc - Mac*Mbb)/DenQ;
-  const double Q21 = (-Mba*Mcc + Mbc*Mca)/DenQ;
+  //const double Q21 = (-Mba*Mcc + Mbc*Mca)/DenQ;
   const double Q22 = ( Maa*Mcc - Mac*Mca)/DenQ;
   const double Q23 = (-Maa*Mbc + Mac*Mba)/DenQ;
-  const double Q31 = ( Mba*Mcb - Mbb*Mca)/DenQ;
-  const double Q32 = (-Maa*Mcb + Mab*Mca)/DenQ;
+  //const double Q31 = ( Mba*Mcb - Mbb*Mca)/DenQ;
+  //const double Q32 = (-Maa*Mcb + Mab*Mca)/DenQ;
   const double Q33 = ( Maa*Mbb - Mab*Mba)/DenQ;
 
Index: sasmodels/models/star_polymer.py
===================================================================
--- sasmodels/models/star_polymer.py	(revision 168052c5791506d7dfad00173f5636fc5701ad11)
+++ sasmodels/models/star_polymer.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -55,4 +55,5 @@
         """
 category = "shape-independent"
+single = False
 # pylint: disable=bad-whitespace, line-too-long
 #             ["name", "units", default, [lower, upper], "type","description"],
Index: sasmodels/models/stickyhardsphere.py
===================================================================
--- sasmodels/models/stickyhardsphere.py	(revision 7f47777b1828197366e17d650a92f794a3433fcc)
+++ sasmodels/models/stickyhardsphere.py	(revision 13ed84c3c71257d2df9c2ed4b4e98c0bfa4d7d69)
@@ -85,4 +85,5 @@
 category = "structure-factor"
 
+single = False
 #             ["name", "units", default, [lower, upper], "type","description"],
 parameters = [
