r"""Analytical potential distribution over a half-spaceFor a homogeneous full space, the potential distribution over a point source isgiven as::math:`\varphi(r) = I \frac{1}{4 \pi \sigma r}`"""importnumpyasnp
[docs]defpot_ana(r,rho):"""Return the analytical potential in distance r over a homogeneous half-space """current=1.0sigma=1.0/rhoold_err_state=np.seterr(divide='ignore')phi=np.divide(current,(2.0*np.pi*sigma*r))np.seterr(**old_err_state)returnphi
[docs]defcompute_potentials_analytical_hs(grid,configs_raw,rho):"""Compute the potential superpositions of each current dipole in the configurations, using the provided resistivity Parameters ---------- grid: crt_grid object with loaded FE grid. Used for the electrode positions configs_raw: numpy.ndarray Nx4 array containing N four-point spreads rho: float resistivity of half-space Returns ------- potentials: list List containing N arrays, each of size M (nr of grid nodes) """assertisinstance(rho,(float,int))potentials=[]# nodes_sorted = grid.nodes['presort']nodes_raw=grid.nodes['presort']forconfiginconfigs_raw-1:print('CONFIG',config)# determine distance of all nodes to both electrodes# e1_node = grid.get_electrode_node(config[0])# electrode1 = nodes_sorted[e1_node][1:3]electrode1=grid.electrodes[config[0],1:3]# electrode1 = nodes_sorted[config[0]][1:3]r1=np.sqrt((nodes_raw[:,1]-electrode1[0])**2+(nodes_raw[:,2]-electrode1[1])**2)# electrode2 = nodes_sorted[config[1]][1:3]# e2_node = grid.get_electrode_node(config[1])# electrode2 = nodes_sorted[e2_node][1:3]electrode2=grid.electrodes[config[1],1:3]r2=np.sqrt((nodes_raw[:,1]-electrode2[0])**2+(nodes_raw[:,2]-electrode2[1])**2)pot1=pot_ana(r1,rho)pot2=-pot_ana(r2,rho)pot12=pot1+pot2potentials.append(pot12)returnpotentials
[docs]defcompute_voltages(grid,configs_raw,potentials_raw):"""Given a list of potential distribution and corresponding four-point spreads, compute the voltages Parameters ---------- grid: crt_grid object the grid is used to infer electrode positions configs_raw: Nx4 array containing the measurement configs (1-indexed) potentials_raw: list with N entries corresponding to each measurement, containing the node potentials of each injection dipole. """# we operate on 0-indexed arrays, config holds 1-indexed values# configs = configs_raw - 1voltages=[]forconfig,potentialsinzip(configs_raw-1,potentials_raw):print('CONFIG AAA ',config)e3_node=int(grid.electrodes[config[2],0])e4_node=int(grid.electrodes[config[3],0])# e3_node = grid.get_electrode_node(config[2])# e4_node = grid.get_electrode_node(config[3])voltage=potentials[e3_node]-potentials[e4_node]voltages.append(voltage)returnvoltages