Repository: PMEAL/OpenPNM

Issue:
Throat lens volume is higher that throat volume when pore sizes are >=0.8*max_pore_size.  
**Describe the bug**
Throat lens volume is higher that throat volume when pore sizes are >=0.8*max_pore_size.  Throat lens_volume should always be less than throat volume (as they are corrections on volume calculations). Lens values more than throat volume happens when pore sizes are defined >=0.8* max_pore_size. Even if we have space in the spacing to define a non-zero length throat between the pores, the throat volume calculation using lens volume will not give realistic results (as the amount of curvature of spherical overlap of pore in the throat will be more significant in throats with much smaller length). 

**To Reproduce**
```
import openpnm as op
import numpy as np
from openpnm import models as mods
import pandas as pd
shape=[20,20,20]
fracs=np.arange(0.3,1.1,0.1)

vols={'pores':[],'throats':[], 'lens':[], 'lens/throats':[]}
for frac in fracs:
    net = op.network.Cubic(shape=shape)
    geo = op.geometry.GenericGeometry(network=net, pores=net.Ps, throats=net.Ts)
    geo.add_model(propname='pore.max_size',
                 model=mods.geometry.pore_size.largest_sphere,
                 iters=10)
    # pore geoms to calculate volume
    geo['pore.diameter']=frac*geo['pore.max_size']
    geo.add_model(propname='pore.volume',
                   model=mods.geometry.pore_volume.sphere,
                   pore_diameter='pore.diameter')
    # throat geoms to calculate volume
    geo.add_model(propname='throat.max_size',
                   model=mods.misc.from_neighbor_pores,
                   mode='min',
                   prop='pore.diameter')
    
    geo.add_model(propname='throat.diameter',
                   model=mods.misc.scaled,
                   factor=0.5,
                   prop='throat.max_size')
    
    geo.add_model(propname='throat.endpoints',
                    model=op.models.geometry.throat_endpoints.spherical_pores)
    
    geo.add_model(propname='throat.conduit_lengths',
                    model=op.models.geometry.throat_length.conduit_lengths)
    
    #geo['throat.length']=geo['throat.conduit_lengths.throat']
    geo.add_model(propname='throat.length',
               model=mods.geometry.throat_length.piecewise,
               throat_endpoints='throat.endpoints')
    geo.add_model(propname='throat.volume',
                   model=mods.geometry.throat_volume.cylinder)
    lens_vol=op.models.geometry.throat_volume.lens(net)

    vols['pores'].append(sum(net['pore.volume']))
    vols['throats'].append(sum(net['throat.volume']))
    vols['lens'].append(sum(lens_vol))
    vols['lens/throats'].append(sum(lens_vol)/sum(net['throat.volume']))
    
data=pd.DataFrame(vols)
print(data)
```

![image](https://user-images.githubusercontent.com/43128873/108528601-95980080-72a1-11eb-9bfc-93c970f20684.png)

**Expected behavior**
For fracs>0.8 : lens_vol/throat_vol must be smaller than 1.

**Additional context**
In stick and ball geometry we use a range of [0.1,0.7] to select multipliers by max_pore_size and it prevents this issue. The issue is when someone defines extra large pores with diameter close to max_pore_size.
can we conclude that:
 lens_vol correction should not be used for throats that connect extra_large pores? 
or no extra large pores should be defined?

Comments:

Patch:
diff --git a/openpnm/models/geometry/throat_volume.py b/openpnm/models/geometry/throat_volume.py
index 3cdfff587..13d4322f4 100644
--- a/openpnm/models/geometry/throat_volume.py
+++ b/openpnm/models/geometry/throat_volume.py
@@ -163,8 +163,8 @@ def lens(target, throat_diameter='throat.diameter',
     """
     network = target.network
     conns = network['throat.conns']
-    Rp = target[pore_diameter]
-    Rt = target[throat_diameter]
+    Rp = target[pore_diameter]/2
+    Rt = target[throat_diameter]/2
     a = _np.atleast_2d(Rt).T
     q = _np.arcsin(a/Rp[conns])
     b = Rp[conns]*_np.cos(q)
@@ -210,8 +210,8 @@ def pendular_ring(target, throat_diameter='throat.diameter',
     """
     network = target.network
     conns = network['throat.conns']
-    Rp = target[pore_diameter]
-    Rt = target[throat_diameter]
+    Rp = target[pore_diameter]/2
+    Rt = target[throat_diameter]/2
     a = _np.atleast_2d(Rt).T
     q = _np.arcsin(a/Rp[conns])
     b = Rp[conns]*_np.cos(q)


Test patch:
diff --git a/tests/unit/models/geometry/ThroatVolumeTest.py b/tests/unit/models/geometry/ThroatVolumeTest.py
index 0b612fac4..f459dd600 100644
--- a/tests/unit/models/geometry/ThroatVolumeTest.py
+++ b/tests/unit/models/geometry/ThroatVolumeTest.py
@@ -26,13 +26,13 @@ class ThroatVolumeTest:
         net.add_model(propname='throat.lens_volume',
                       model=mod)
         Vlens = net['throat.lens_volume']
-        assert np.isclose(Vlens, 2*0.006733852203712552)
+        assert np.isclose(Vlens, 2*0.00084173)
         mod = op.models.geometry.throat_volume.pendular_ring
         net.add_model(propname='throat.ring_volume',
                       model=mod)
-        Vcyl = 2*(0.01315292522620208)
+        Vcyl = 2*(0.00164412)
         Vring = net['throat.ring_volume']
-        assert np.isclose(Vcyl - Vring, 2*0.006733852203712552)
+        assert np.isclose(Vcyl - Vring, 2*0.00084173)
 
     def test_cylinder(self):
         self.geo.add_model(propname='throat.volume',