mirror of
https://github.com/wassname/simpeg.git
synced 2026-06-28 00:45:10 +08:00
b8fe0cfdbf
Build in a matrix?
194 lines
5.8 KiB
Python
194 lines
5.8 KiB
Python
import unittest
|
|
from SimPEG import *
|
|
from scipy.constants import mu_0
|
|
|
|
|
|
class MyPropMap(Maps.PropMap):
|
|
sigma = Maps.Property("Electrical Conductivity", defaultInvProp=True)
|
|
mu = Maps.Property("Mu", defaultVal=mu_0)
|
|
|
|
class MyReciprocalPropMap(Maps.PropMap):
|
|
sigma = Maps.Property("Electrical Conductivity", defaultInvProp=True, propertyLink=('rho', Maps.ReciprocalMap))
|
|
rho = Maps.Property("Electrical Resistivity", propertyLink=('sigma', Maps.ReciprocalMap))
|
|
mu = Maps.Property("Mu", defaultVal=mu_0, propertyLink=('mui', Maps.ReciprocalMap))
|
|
mui = Maps.Property("Mu", defaultVal=1./mu_0, propertyLink=('mu', Maps.ReciprocalMap))
|
|
|
|
|
|
class TestPropMaps(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
pass
|
|
|
|
def test_setup(self):
|
|
expMap = Maps.ExpMap(Mesh.TensorMesh((3,)))
|
|
assert expMap.nP == 3
|
|
|
|
PM1 = MyPropMap(expMap)
|
|
PM2 = MyPropMap([('sigma', expMap)])
|
|
PM3 = MyPropMap({'maps':[('sigma', expMap)], 'slices':{'sigma':slice(0,3)}})
|
|
|
|
for PM in [PM1,PM2,PM3]:
|
|
assert PM.defaultInvProp == 'sigma'
|
|
assert PM.sigmaMap is not None
|
|
assert PM.sigmaMap is expMap
|
|
assert PM.sigmaIndex == slice(0,3)
|
|
assert getattr(PM, 'sigma', None) is None
|
|
assert PM.muMap is None
|
|
assert PM.muIndex is None
|
|
|
|
assert 'sigma' in PM
|
|
assert 'mu' not in PM
|
|
assert 'mui' not in PM
|
|
|
|
m = PM(np.r_[1.,2,3])
|
|
|
|
assert 'sigma' in m
|
|
assert 'mu' not in m
|
|
assert 'mui' not in m
|
|
|
|
assert m.mu == mu_0
|
|
assert m.muModel is None
|
|
assert m.muMap is None
|
|
assert m.muDeriv is None
|
|
|
|
assert np.all(m.sigmaModel == np.r_[1.,2,3])
|
|
assert m.sigmaMap is expMap
|
|
assert np.all(m.sigma == np.exp(np.r_[1.,2,3]))
|
|
assert m.sigmaDeriv is not None
|
|
|
|
assert m.nP == 3
|
|
|
|
def test_slices(self):
|
|
expMap = Maps.ExpMap(Mesh.TensorMesh((3,)))
|
|
PM = MyPropMap({'maps':[('sigma', expMap)], 'slices':{'sigma':[2,1,0]}})
|
|
assert PM.sigmaIndex == [2,1,0]
|
|
m = PM(np.r_[1.,2,3])
|
|
assert np.all(m.sigmaModel == np.r_[3,2,1])
|
|
assert np.all(m.sigma == np.exp(np.r_[3,2,1]))
|
|
|
|
def test_multiMap(self):
|
|
m = Mesh.TensorMesh((3,))
|
|
expMap = Maps.ExpMap(m)
|
|
iMap = Maps.IdentityMap(m)
|
|
PM = MyPropMap([('sigma', expMap), ('mu', iMap)])
|
|
|
|
pm = PM(np.r_[1.,2,3,4,5,6])
|
|
|
|
assert pm.nP == 6
|
|
|
|
assert 'sigma' in PM
|
|
assert 'mu' in PM
|
|
assert 'mui' not in PM
|
|
|
|
assert 'sigma' in pm
|
|
assert 'mu' in pm
|
|
assert 'mui' not in pm
|
|
|
|
assert np.all(pm.sigmaModel == [1.,2,3])
|
|
assert np.all(pm.sigma == np.exp([1.,2,3]))
|
|
assert np.all(pm.muModel == [4.,5,6])
|
|
assert np.all(pm.mu == [4.,5,6])
|
|
|
|
|
|
def test_multiMapCompressed(self):
|
|
m = Mesh.TensorMesh((3,))
|
|
expMap = Maps.ExpMap(m)
|
|
iMap = Maps.IdentityMap(m)
|
|
PM = MyPropMap({'maps':[('sigma', expMap), ('mu', iMap)],'slices':{'mu':[0,1,2]}})
|
|
|
|
pm = PM(np.r_[1,2.,3])
|
|
|
|
assert pm.nP == 3
|
|
|
|
assert 'sigma' in PM
|
|
assert 'mu' in PM
|
|
assert 'mui' not in PM
|
|
|
|
assert 'sigma' in pm
|
|
assert 'mu' in pm
|
|
assert 'mui' not in pm
|
|
|
|
assert np.all(pm.sigmaModel == [1,2,3])
|
|
assert np.all(pm.sigma == np.exp([1,2,3]))
|
|
assert np.all(pm.muModel == [1,2,3])
|
|
assert np.all(pm.mu == [1,2,3])
|
|
|
|
def test_Projections(self):
|
|
m = Mesh.TensorMesh((3,))
|
|
iMap = Maps.IdentityMap(m)
|
|
PM = MyReciprocalPropMap([('sigma', iMap)])
|
|
v = np.r_[1,2.,3]
|
|
pm = PM(v)
|
|
|
|
assert pm.sigmaProj is not None
|
|
assert pm.rhoProj is None
|
|
assert pm.muProj is None
|
|
assert pm.muiProj is None
|
|
|
|
assert np.all(pm.sigmaProj * v == pm.sigmaModel)
|
|
|
|
def test_Links(self):
|
|
m = Mesh.TensorMesh((3,))
|
|
expMap = Maps.ExpMap(m)
|
|
iMap = Maps.IdentityMap(m)
|
|
PM = MyReciprocalPropMap([('sigma', iMap)])
|
|
pm = PM(np.r_[1,2.,3])
|
|
# print pm.sigma
|
|
# print pm.sigmaMap
|
|
assert np.all(pm.sigma == [1,2,3])
|
|
assert np.all(pm.rho == 1./np.r_[1,2,3])
|
|
assert pm.sigmaMap is iMap
|
|
assert pm.rhoMap is None
|
|
assert pm.sigmaDeriv is not None
|
|
assert pm.rhoDeriv is not None
|
|
|
|
assert 'sigma' in PM
|
|
assert 'rho' not in PM
|
|
assert 'mu' not in PM
|
|
assert 'mui' not in PM
|
|
|
|
|
|
assert 'sigma' in pm
|
|
assert 'rho' not in pm
|
|
assert 'mu' not in pm
|
|
assert 'mui' not in pm
|
|
|
|
assert pm.mu == mu_0
|
|
assert pm.mui == 1.0/mu_0
|
|
assert pm.muMap is None
|
|
assert pm.muDeriv is None
|
|
assert pm.muiMap is None
|
|
assert pm.muiDeriv is None
|
|
|
|
PM = MyReciprocalPropMap([('rho', iMap)])
|
|
pm = PM(np.r_[1,2.,3])
|
|
# print pm.sigma
|
|
# print pm.sigmaMap
|
|
assert np.all(pm.sigma == 1./np.r_[1,2,3])
|
|
assert np.all(pm.rho == [1,2,3])
|
|
assert pm.sigmaMap is None
|
|
assert pm.rhoMap is iMap
|
|
assert pm.sigmaDeriv is not None
|
|
assert pm.rhoDeriv is not None
|
|
|
|
assert 'sigma' not in PM
|
|
assert 'rho' in PM
|
|
assert 'mu' not in PM
|
|
assert 'mui' not in PM
|
|
|
|
|
|
assert 'sigma' not in pm
|
|
assert 'rho' in pm
|
|
assert 'mu' not in pm
|
|
assert 'mui' not in pm
|
|
|
|
self.assertRaises(AssertionError, MyReciprocalPropMap, [('rho', iMap), ('sigma', iMap)])
|
|
self.assertRaises(AssertionError, MyReciprocalPropMap, [('sigma', iMap), ('rho', iMap)])
|
|
|
|
MyReciprocalPropMap([('sigma', iMap), ('mu', iMap)]) # This should be fine
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|
|
|
|
|