Index: sasmodels/details.py
===================================================================
--- sasmodels/details.py	(revision 2bccb5a0cd26b67c6ada927f21cd19ad1caa3064)
+++ sasmodels/details.py	(revision 767dca8865ef2019e6d5e05195ff7217af840388)
@@ -234,5 +234,5 @@
     # skipping scale and background when building values and weights
     values, dispersity, weights = zip(*mesh[2:npars+2]) if npars else ((), (), ())
-    weights = correct_theta_weights(kernel.info.parameters, dispersity, weights)
+    #weights = correct_theta_weights(kernel.info.parameters, dispersity, weights)
     length = np.array([len(w) for w in weights])
     offset = np.cumsum(np.hstack((0, length)))
Index: sasmodels/kernel_iq.c
===================================================================
--- sasmodels/kernel_iq.c	(revision 2c108a3bc61e597afe17a5b42dae4a743be87b0e)
+++ sasmodels/kernel_iq.c	(revision 767dca8865ef2019e6d5e05195ff7217af840388)
@@ -32,4 +32,14 @@
 //  INVALID(table) : test if the current point is feesible to calculate.  This
 //      will be defined in the kernel definition file.
+
+// Set SCALED_PHI to 1 if dphi represents distance rather than longitude.
+// That is, in order to make an equally spaced mesh on a curved surface,
+// you will need to scale longitude displacement by cos(latitude) to account
+// for the reduction in distance per degree latitude as you move away from
+// the equator.  Points on the mesh with scaled dphi values more than 180
+// degrees are not included in the dispersity calculation. This should make
+// the integral over the entire surface work by sampling fewer points near
+// the poles.
+# define USE_SCALED_DPHI 1
 
 #ifndef _PAR_BLOCK_ // protected block so we can include this code twice.
@@ -450,4 +460,5 @@
   // unoriented 1D
   double qk;
+  #define SCALE_DPHI_AND_SET_WEIGHT() const double weight=weight0
   #define FETCH_Q() do { qk = q[q_index]; } while (0)
   #define BUILD_ROTATION() do {} while(0)
@@ -458,4 +469,5 @@
   // unoriented 2D
   double qx, qy;
+  #define SCALE_DPHI_AND_SET_WEIGHT() const double weight=weight0
   #define FETCH_Q() do { qx = q[2*q_index]; qy = q[2*q_index+1]; } while (0)
   #define BUILD_ROTATION() do {} while(0)
@@ -475,6 +487,22 @@
   const double theta = values[details->theta_par+2];
   const double phi = values[details->theta_par+3];
-  #define BUILD_ROTATION() qac_rotation(&rotation, \
-    theta, phi, local_values.table.theta, local_values.table.phi)
+  double dtheta, dphi, weight;
+  #if USE_SCALED_DPHI
+    #define SCALE_DPHI_AND_SET_WEIGHT() do { \
+      dtheta = local_values.table.theta; \
+      dphi = local_values.table.phi; \
+      weight = weight0; \
+      if (dtheta != 90.0) dphi /= fabs(cos(dtheta*M_PI_180)); \
+      else if (dphi != 0.0) weight = 0.; \
+      if (fabs(dphi) >= 180.) weight = 0.; \
+    } while (0)
+  #else
+    #define SCALE_DPHI_AND_SET_WEIGHT() do { \
+      dtheta = local_values.table.theta; \
+      dphi = local_values.table.phi; \
+      weight = fabs(cos(dtheta*M_PI_180)) * weight0; \
+    } while (0)
+  #endif
+  #define BUILD_ROTATION() qac_rotation(&rotation, theta, phi, dtheta, dphi);
   #define APPLY_ROTATION() qac_apply(rotation, qx, qy, &qa, &qc)
   #define CALL_KERNEL() CALL_IQ_AC(qa, qc, local_values.table)
@@ -493,7 +521,24 @@
   const double phi = values[details->theta_par+3];
   const double psi = values[details->theta_par+4];
-  #define BUILD_ROTATION() qabc_rotation(&rotation, \
-    theta, phi, psi, local_values.table.theta, \
-    local_values.table.phi, local_values.table.psi)
+  double dtheta, dphi, dpsi, weight;
+  #if USE_SCALED_DPHI
+    #define SCALE_DPHI_AND_SET_WEIGHT() do { \
+      dtheta = local_values.table.theta; \
+      dphi = local_values.table.phi; \
+      dpsi = local_values.table.psi; \
+      weight = weight0; \
+      if (dtheta != 90.0) dphi /= fabs(cos(dtheta*M_PI_180)); \
+      else if (dphi != 0.0) weight = 0.; \
+      if (fabs(dphi) >= 180.) weight = 0.; \
+    } while (0)
+  #else
+    #define SCALE_DPHI_AND_SET_WEIGHT() do { \
+      dtheta = local_values.table.theta; \
+      dphi = local_values.table.phi; \
+      dpsi = local_values.table.psi; \
+      weight = fabs(cos(dtheta*M_PI_180)) * weight0; \
+    } while (0)
+  #endif
+  #define BUILD_ROTATION() qabc_rotation(&rotation, theta, phi, psi, dtheta, dphi, dpsi)
   #define APPLY_ROTATION() qabc_apply(rotation, qx, qy, &qa, &qb, &qc)
   #define CALL_KERNEL() CALL_IQ_ABC(qa, qb, qc, local_values.table)
@@ -551,4 +596,5 @@
 
 //if (q_index==0) {printf("step:%d of %d, pars:",step,pd_stop); for (int i=0; i < NUM_PARS; i++) printf("p%d=%g ",i, local_values.vector[i]); printf("\n");}
+  SCALE_DPHI_AND_SET_WEIGHT();
 
   // ====== loop body =======
@@ -559,6 +605,6 @@
     // Accumulate I(q)
     // Note: weight==0 must always be excluded
-    if (weight0 > cutoff) {
-      pd_norm += weight0 * CALL_VOLUME(local_values.table);
+    if (weight > cutoff) {
+      pd_norm += weight * CALL_VOLUME(local_values.table);
       BUILD_ROTATION();
 
@@ -608,10 +654,10 @@
           const double scattering = CALL_KERNEL();
         #endif // !MAGNETIC
-//printf("q_index:%d %g %g %g %g\n", q_index, scattering, weight, weight0);
+//printf("q_index:%d %g %g %g %g\n", q_index, scattering, weight0);
 
         #ifdef USE_OPENCL
-          this_result += weight0 * scattering;
+          this_result += weight * scattering;
         #else // !USE_OPENCL
-          result[q_index] += weight0 * scattering;
+          result[q_index] += weight * scattering;
         #endif // !USE_OPENCL
       }
@@ -651,4 +697,5 @@
 #undef PD_OPEN
 #undef PD_CLOSE
+#undef SCALE_DPHI_AND_SET_WEIGHT
 #undef FETCH_Q
 #undef BUILD_ROTATION
