Hi @kianadmvnd . I spent some time with your notebook and I noticed the source of the asymmetry you experience.
After defining the chargeability model you ran the ip_survey.drape_electrodes_on_topography method. Since your topography is a constant zero height and your electrodes are already at that height, there’s no need to run that function. The issue arises from the fact that such method also shifts the horizontal coordinates of the electrodes to place them above the cell centers (if the shift_horizontal argument is set to True, which is the default).
So, your electrodes before you ran the method look like this (showing only the receivers for the first source):
ip_survey.source_list[0].receiver_list
[Dipole(m: [50. 0.]; n: [75. 0.]),
Dipole(m: [75. 0.]; n: [100. 0.]),
Dipole(m: [100. 0.]; n: [125. 0.]),
Dipole(m: [125. 0.]; n: [150. 0.]),
Dipole(m: [150. 0.]; n: [175. 0.]),
Dipole(m: [175. 0.]; n: [200. 0.]),
Dipole(m: [200. 0.]; n: [225. 0.]),
Dipole(m: [225. 0.]; n: [250. 0.]),
Dipole(m: [250. 0.]; n: [275. 0.]),
Dipole(m: [275. 0.]; n: [300. 0.]),
Dipole(m: [300. 0.]; n: [325. 0.]),
Dipole(m: [325. 0.]; n: [350. 0.]),
Dipole(m: [350. 0.]; n: [375. 0.]),
Dipole(m: [375. 0.]; n: [400. 0.]),
Dipole(m: [400. 0.]; n: [425. 0.]),
Dipole(m: [425. 0.]; n: [450. 0.]),
Dipole(m: [450. 0.]; n: [475. 0.]),
Dipole(m: [475. 0.]; n: [500. 0.]),
Dipole(m: [500. 0.]; n: [525. 0.]),
Dipole(m: [525. 0.]; n: [550. 0.]),
Dipole(m: [550. 0.]; n: [575. 0.]),
Dipole(m: [575. 0.]; n: [600. 0.]),
Dipole(m: [600. 0.]; n: [625. 0.]),
Dipole(m: [625. 0.]; n: [650. 0.]),
Dipole(m: [650. 0.]; n: [675. 0.]),
Dipole(m: [675. 0.]; n: [700. 0.]),
Dipole(m: [700. 0.]; n: [725. 0.]),
Dipole(m: [725. 0.]; n: [750. 0.]),
Dipole(m: [750. 0.]; n: [775. 0.]),
Dipole(m: [775. 0.]; n: [800. 0.])]
And after running the method:
[Dipole(m: [46.875 0. ]; n: [71.875 0. ]),
Dipole(m: [71.875 0. ]; n: [96.875 0. ]),
Dipole(m: [96.875 0. ]; n: [121.875 0. ]),
Dipole(m: [121.875 0. ]; n: [146.875 0. ]),
Dipole(m: [146.875 0. ]; n: [171.875 0. ]),
Dipole(m: [171.875 0. ]; n: [196.875 0. ]),
Dipole(m: [196.875 0. ]; n: [221.875 0. ]),
Dipole(m: [221.875 0. ]; n: [246.875 0. ]),
Dipole(m: [246.875 0. ]; n: [271.875 0. ]),
Dipole(m: [271.875 0. ]; n: [296.875 0. ]),
Dipole(m: [296.875 0. ]; n: [321.875 0. ]),
Dipole(m: [321.875 0. ]; n: [346.875 0. ]),
Dipole(m: [346.875 0. ]; n: [371.875 0. ]),
Dipole(m: [371.875 0. ]; n: [396.875 0. ]),
Dipole(m: [396.875 0. ]; n: [421.875 0. ]),
Dipole(m: [421.875 0. ]; n: [446.875 0. ]),
Dipole(m: [446.875 0. ]; n: [471.875 0. ]),
Dipole(m: [471.875 0. ]; n: [496.875 0. ]),
Dipole(m: [496.875 0. ]; n: [521.875 0. ]),
Dipole(m: [521.875 0. ]; n: [546.875 0. ]),
Dipole(m: [546.875 0. ]; n: [571.875 0. ]),
Dipole(m: [571.875 0. ]; n: [596.875 0. ]),
Dipole(m: [596.875 0. ]; n: [621.875 0. ]),
Dipole(m: [621.875 0. ]; n: [646.875 0. ]),
Dipole(m: [646.875 0. ]; n: [671.875 0. ]),
Dipole(m: [671.875 0. ]; n: [696.875 0. ]),
Dipole(m: [696.875 0. ]; n: [721.875 0. ]),
Dipole(m: [721.875 0. ]; n: [746.875 0. ]),
Dipole(m: [746.875 0. ]; n: [771.875 0. ]),
Dipole(m: [771.875 0. ]; n: [796.875 0. ])]
Now the electrodes don’t fall on the nodes of the mesh. And since the simulation is nodal, it needs to interpolate to predict observations on arbitrary points. Such interpolation explains the non-exact symmetry you mentioned.
If you leave the survey unmodified, you’ll notice that the symmetry can be reproduced. I’m attaching two notebooks that show a DC and an IP forward, with checks for the symmetry in the apparent conductivity and chargeabililty. Also note that I’m creating air cells in the mesh.
ip-forward.ipynb (878.7 KB)
dc-forward.ipynb (907.8 KB)