diff --git a/pyeit/eit/fem.py b/pyeit/eit/fem.py index 4c28c70..766f12b 100644 --- a/pyeit/eit/fem.py +++ b/pyeit/eit/fem.py @@ -54,7 +54,7 @@ def __init__(self, mesh, el_pos): self.n_tri, self.n_vertices = self.tri.shape self.ne = el_pos.size - def solve_eit(self, ex_mat=None, step=1, perm=None, parser=None): + def solve_eit(self, ex_mat=None, step=1, perm=None, parser="std"): """ EIT simulation, generate perturbation matrix and forward v @@ -98,7 +98,7 @@ def solve_eit(self, ex_mat=None, step=1, perm=None, parser=None): for i in range(n_lines): # FEM solver of one stimulation pattern, a row in ex_mat ex_line = ex_mat[i] - f, jac_i = self.solve(ex_line, perm0) + f, jac_i = self.solve(ex_line, perm0, parser=parser) f_el = f[self.el_pos] # boundary measurements, subtract_row-voltages on electrodes @@ -122,7 +122,7 @@ def solve_eit(self, ex_mat=None, step=1, perm=None, parser=None): p = pde_result(jac=np.vstack(jac), v=np.hstack(v), b_matrix=np.vstack(b_matrix)) return p - def solve(self, ex_line, perm): + def solve(self, ex_line, perm, parser): """ with one pos (A), neg(B) driven pairs, calculate and compute the potential distribution (complex-valued) @@ -156,7 +156,10 @@ def solve(self, ex_line, perm): r_el = r_matrix[self.el_pos] # 4. solving nodes potential using boundary conditions - b = self._natural_boundary(ex_line) + if parser == "mit_16c": + b = self._natural_boundary_mit(ex_line) + else: + b = self._natural_boundary(ex_line) f = np.dot(r_matrix, b).ravel() # 5. build Jacobian matrix column wise (element wise) @@ -185,6 +188,14 @@ def _natural_boundary(self, ex_line): return b + def _natural_boundary_mit(self, ex_line): + """MIT has only one drive coil""" + drv_coil = self.el_pos[ex_line] + b = np.zeros((self.n_pts, 1)) + b[drv_coil] = 1.0 + + return b + def smear(f, fb, pairs): """ @@ -266,28 +277,34 @@ def voltage_meter(ex_line, n_el=16, step=1, parser=None): start from the positive stimulus electrodestart index 'A'. if parser is 'std', or 'no_rotate_meas' then data are trimmed, the start index (i) of boundary voltage measurements is always 0. + mit_16c : mit mode of 16 coils. Returns ------- v: NDArray (N-1)*2 arrays of subtract_row pairs """ - # local node - drv_a = ex_line[0] - drv_b = ex_line[1] - i0 = drv_a if parser in ("fmmu", "rotate_meas") else 0 - - # build differential pairs - v = [] - for a in range(i0, i0 + n_el): - m = a % n_el - n = (m + step) % n_el - # if any of the electrodes is the stimulation electrodes - if not (m == drv_a or m == drv_b or n == drv_a or n == drv_b): - # the order of m, n matters - v.append([n, m]) - - diff_pairs = np.array(v) + if parser == "mit_16c": + diff = [[m, ex_line] for m in range(n_el) if m != ex_line] + diff_pairs = np.array(diff) + else: + # local node + drv_a = ex_line[0] + drv_b = ex_line[1] + i0 = drv_a if parser in ("fmmu", "rotate_meas") else 0 + + # build differential pairs + v = [] + for a in range(i0, i0 + n_el): + m = a % n_el + n = (m + step) % n_el + # if any of the electrodes is the stimulation electrodes + if not (m == drv_a or m == drv_b or n == drv_a or n == drv_b): + # the order of m, n matters + v.append([n, m]) + + diff_pairs = np.array(v) + return diff_pairs