%% 计算待定系数
% 葛德彪,  时间电磁场有限元, 2014, P26-P30
%  vol:  the volume of the tetrahedra element
%  a,b,c,d : the undetermined coefficients of a linear function
% {\left\{\begin{array}{rr}
% a_1^e  & \ ={\left∣\begin{array}{lll}
% x_2  & y_2  & z_2 \\
% x_3  & y_3  & z_3 \\
% x_4  & y_4  & z_4
% \end{array}\right∣}=x_2 {\left∣\begin{array}{ll}
% y_3  & z_3 \\
% y_4  & z_4
% \end{array}\right∣}-x_3 {\left∣\begin{array}{ll}
% y_2  & z_2 \\
% y_4  & z_4
% \end{array}\right∣}+x_4 {\left∣\begin{array}{ll}
% y_2  & z_2 \\
% y_3  & z_3
% \end{array}\right∣}\\
%  & \ =x_2 {\left(y_3 z_4 -z_3 y_4 \right)}-x_3 {\left(y_2 z_4 -z_2 y_4 \right)}+x_4 {\left(y_2 z_3 -z_2 y_3 \right)}\\
% a_2^e  & \ =-{\left∣\begin{array}{lll}
% x_1  & y_1  & z_1 \\
% x_3  & y_3  & z_3 \\
% x_4  & y_4  & z_4
% \end{array}\right∣}=-x_1 {\left(y_3 z_4 -z_3 y_4 \right)}+x_3 {\left(y_1 z_4 -z_1 y_4 \right)}-x_4 {\left(y_1 z_3 -z_1 y_3 \right)}\\
% a_3^e  & \ ={\left∣\begin{array}{lll}
% x_1  & y_1  & z_1 \\
% x_2  & y_2  & z_2 \\
% x_4  & y_4  & z_4
% \end{array}\right∣}=x_1 {\left(y_2 z_4 -z_2 y_4 \right)}-x_2 {\left(y_1 z_4 -z_1 y_4 \right)}+x_4 {\left(y_1 z_2 -z_1 y_2 \right)}\\
% a_4^e  & \ =-{\left∣\begin{array}{lll}
% x_1  & y_1  & z_1 \\
% x_2  & y_2  & z_2 \\
% x_3  & y_3  & z_3
% \end{array}\right∣}=-x_1 {\left(y_2 z_3 -z_2 y_3 \right)}+x_2 {\left(y_1 z_3 -z_1 y_3 \right)}-x_3 {\left(y_1 z_2 -z_1 y_2 \right)}
% \end{array}\right)}
%
% {\left\{\begin{array}{c}
% b_1^e =-{\left∣\begin{array}{ccc}
% 1 & y_2  & z_2 \\
% 1 & y_3  & z_3 \\
% 1 & y_4  & z_4
% \end{array}\right∣}=-{\left∣\begin{array}{cc}
% y_3  & z_3 \\
% y_4  & z_4
% \end{array}\right∣}+{\left∣\begin{array}{cc}
% y_2  & z_2 \\
% y_4  & z_4
% \end{array}\right∣}-{\left∣\begin{array}{cc}
% y_2  & z_2 \\
% y_3  & z_3
% \end{array}\right∣}\\
% =-{\left(y_3 z_4 -z_3 y_4 \right)}+{\left(y_2 z_4 -z_2 y_4 \right)}-{\left(y_2 z_3 -z_2 y_3 \right)}\\
% b_2^e ={\left∣\begin{array}{ccc}
% 1 & y_1  & z_1 \\
% 1 & y_3  & z_3 \\
% 1 & y_4  & z_4
% \end{array}\right∣}={\left(y_3 z_4 -z_3 y_4 \right)}-{\left(y_1 z_4 -z_1 y_4 \right)}+{\left(y_1 z_3 -z_1 y_3 \right)}\\
% b_3^e =-{\left∣\begin{array}{ccc}
% 1 & y_1  & z_1 \\
% 1 & y_2  & z_2 \\
% 1 & y_4  & z_4
% \end{array}\right∣}=-{\left(y_2 z_4 -z_2 y_4 \right)}+{\left(y_1 z_4 -z_1 y_4 \right)}-{\left(y_1 z_2 -z_1 y_2 \right)}\\
% b_4^e ={\left∣\begin{array}{ccc}
% 1 & y_1  & z_1 \\
% 1 & y_2  & z_2 \\
% 1 & y_3  & z_3
% \end{array}\right∣}={\left(y_2 z_3 -z_2 y_3 \right)}-{\left(y_1 z_3 -z_1 y_3 \right)}+{\left(y_1 z_2 -z_1 y_2 \right)}
% \end{array}\right)}
%
% {\left\{\begin{array}{c}
% c_1^e ={\left∣\begin{array}{ccc}
% 1 & x_2  & z_2 \\
% 1 & x_3  & z_3 \\
% 1 & x_4  & z_4
% \end{array}\right∣}={\left∣\begin{array}{cc}
% x_3  & z_3 \\
% x_4  & z_4
% \end{array}\right∣}-{\left∣\begin{array}{cc}
% x_2  & z_2 \\
% x_4  & z_4
% \end{array}\right∣}+{\left∣\begin{array}{cc}
% x_2  & z_2 \\
% x_3  & z_3
% \end{array}\right∣}\\
% ={\left(x_3 z_4 -z_3 x_4 \right)}-{\left(x_2 z_4 -z_2 x_4 \right)}+{\left(x_2 z_3 -z_2 x_3 \right)}\\
% c_2^e =-{\left∣\begin{array}{ccc}
% 1 & x_1  & z_1 \\
% 1 & x_3  & z_3 \\
% 1 & x_4  & z_4
% \end{array}\right∣}=-{\left(x_3 z_4 -z_3 x_4 \right)}+{\left(x_1 z_4 -z_1 x_4 \right)}-{\left(x_1 z_3 -z_1 x_3 \right)}\\
% c_3^e ={\left∣\begin{array}{ccc}
% 1 & x_1  & z_1 \\
% 1 & x_2  & z_2 \\
% 1 & x_4  & z_4
% \end{array}\right∣}={\left(x_2 z_4 -z_2 x_4 \right)}-{\left(x_1 z_4 -z_1 x_4 \right)}+{\left(x_1 z_2 -z_1 x_2 \right)}\\
% c_4^e =-{\left∣\begin{array}{ccc}
% 1 & x_1  & z_1 \\
% 1 & x_2  & z_2 \\
% 1 & x_3  & z_3
% \end{array}\right∣}=-{\left(x_2 z_3 -z_2 x_3 \right)}+{\left(x_1 z_3 -z_1 x_3 \right)}-{\left(x_1 z_2 -z_1 x_2 \right)}
% \end{array}\right)}
%
% {\left\{\begin{array}{c}
% d_1^e =-{\left∣\begin{array}{ccc}
% 1 & x_2  & y_2 \\
% 1 & x_3  & y_3 \\
% 1 & x_4  & y_4
% \end{array}\right∣}=-{\left∣\begin{array}{cc}
% x_3  & y_3 \\
% x_4  & y_4
% \end{array}\right∣}+{\left∣\begin{array}{cc}
% x_2  & y_2 \\
% x_4  & y_4
% \end{array}\right∣}-{\left∣\begin{array}{cc}
% x_2  & y_2 \\
% x_3  & y_3
% \end{array}\right∣}\\
% =-{\left(x_3 y_4 -y_3 x_4 \right)}+{\left(x_2 y_4 -y_2 x_4 \right)}-{\left(x_2 y_3 -y_2 x_3 \right)}\\
% d_2^e ={\left∣\begin{array}{ccc}
% 1 & x_1  & y_1 \\
% 1 & x_3  & y_3 \\
% 1 & x_4  & y_4
% \end{array}\right∣}={\left(x_3 y_4 -y_3 x_4 \right)}-{\left(x_1 y_4 -y_1 x_4 \right)}+{\left(x_1 y_3 -y_1 x_3 \right)}\\
% d_3^e =-{\left∣\begin{array}{ccc}
% 1 & x_1  & y_1 \\
% 1 & x_2  & y_2 \\
% 1 & x_4  & y_4
% \end{array}\right∣}=-{\left(x_2 y_4 -y_2 x_4 \right)}+{\left(x_1 y_4 -y_1 x_4 \right)}-{\left(x_1 y_2 -y_1 x_2 \right)}\\
% d_4^e ={\left∣\begin{array}{ccc}
% 1 & x_1  & y_1 \\
% 1 & x_2  & y_2 \\
% 1 & x_3  & y_3
% \end{array}\right∣}={\left(x_2 y_3 -y_2 x_3 \right)}-{\left(x_1 y_3 -y_1 x_3 \right)}+{\left(x_1 y_2 -y_1 x_2 \right)}
% \end{array}\right)}
%

function  [abcd,vol] = get_abcd_volume(p,t)
% x y z : coordinate of  nodes
  x = [p(t(:,1),1) p(t(:,2),1) p(t(:,3),1) p(t(:,4),1)];
  y = [p(t(:,1),2) p(t(:,2),2) p(t(:,3),2) p(t(:,4),2)];
  z = [p(t(:,1),3) p(t(:,2),3) p(t(:,3),3) p(t(:,4),3)];
   
  abcd(:,1) = x(:,2).*( y(:,3).*z(:,4) - z(:,3).*y(:,4) ) -...
      x(:,3).*( y(:,2).*z(:,4) - z(:,2).*y(:,4))+...
      x(:,4).*( y(:,2).*z(:,3) - z(:,2).*y(:,3)) ;% a1
  
  abcd(:,2) = - x(:,1).*( y(:,3).*z(:,4) - z(:,3).*y(:,4) ) +...
      x(:,3).*( y(:,1).*z(:,4) - z(:,1).*y(:,4))-...
      x(:,4).*( y(:,1).*z(:,3) - z(:,1).*y(:,3)) ;% a2
  
  abcd(:,3) = x(:,1).*( y(:,2).*z(:,4) - z(:,2).*y(:,4) ) -...
      x(:,2).*( y(:,1).*z(:,4) - z(:,1).*y(:,4)) +...
      x(:,4).*( y(:,1).*z(:,2) - z(:,1).*y(:,2)) ;% a3
  
  abcd(:,4) = - x(:,1).*( y(:,2).*z(:,3) - z(:,2).*y(:,3) ) +...
      x(:,2).*( y(:,1).*z(:,3) - z(:,1).*y(:,3)) -...
      x(:,3).*( y(:,1).*z(:,2) - z(:,1).*y(:,2)) ;% a4
  
  abcd(:,5) = -( y(:,3).*z(:,4) - z(:,3).*y(:,4) ) +...
      ( y(:,2).*z(:,4) - z(:,2).*y(:,4))-...
      ( y(:,2).*z(:,3) - z(:,2).*y(:,3) );% b1
  
  abcd(:,6) =  ( y(:,3).*z(:,4) - z(:,3).*y(:,4) ) -...
      ( y(:,1).*z(:,4) - z(:,1).*y(:,4)) +...
      ( y(:,1).*z(:,3) - z(:,1).*y(:,3)) ;% b2
  
  abcd(:,7) = -( y(:,2).*z(:,4) - z(:,2).*y(:,4) ) +...
      ( y(:,1).*z(:,4) - z(:,1).*y(:,4)) -...
      ( y(:,1).*z(:,2) - z(:,1).*y(:,2)) ;% b3
  
  abcd(:,8) = ( y(:,2).*z(:,3) - z(:,2).*y(:,3) ) -...
      ( y(:,1).*z(:,3) - z(:,1).*y(:,3)) +...
      ( y(:,1).*z(:,2) - z(:,1).*y(:,2)) ;% b4
  
  abcd(:,9) = ( x(:,3).*z(:,4) - z(:,3).*x(:,4) ) -...
      ( x(:,2).*z(:,4) - z(:,2).*x(:,4))+...
      ( x(:,2).*z(:,3) - z(:,2).*x(:,3) );% c1
  
  abcd(:,10) =  -( x(:,3).*z(:,4) - z(:,3).*x(:,4) ) +...
      ( x(:,1).*z(:,4) - z(:,1).*x(:,4)) -...
      ( x(:,1).*z(:,3) - z(:,1).*x(:,3)) ;% c2
  
  abcd(:,11) = ( x(:,2).*z(:,4) - z(:,2).*x(:,4) ) -...
      ( x(:,1).*z(:,4) - z(:,1).*x(:,4)) +...
      ( x(:,1).*z(:,2) - z(:,1).*x(:,2)) ;% c3
  
  abcd(:,12) = -( x(:,2).*z(:,3) - z(:,2).*x(:,3) ) +...
      ( x(:,1).*z(:,3) - z(:,1).*x(:,3)) -...
      ( x(:,1).*z(:,2) - z(:,1).*x(:,2)) ;% c4
  
  abcd(:,13) = -( x(:,3).*y(:,4) - y(:,3).*x(:,4) ) +...
      ( x(:,2).*y(:,4) - y(:,2).*x(:,4))-...
      ( x(:,2).*y(:,3) - y(:,2).*x(:,3) );% d1
  
  abcd(:,14) =  ( x(:,3).*y(:,4) - y(:,3).*x(:,4) ) -...
      ( x(:,1).*y(:,4) - y(:,1).*x(:,4)) +...
      ( x(:,1).*y(:,3) - y(:,1).*x(:,3)) ;% d2
  
  abcd(:,15) = -( x(:,2).*y(:,4) - y(:,2).*x(:,4) ) +...
      ( x(:,1).*y(:,4) - y(:,1).*x(:,4)) -...
      ( x(:,1).*y(:,2) - y(:,1).*x(:,2)) ;% d3
  
  abcd(:,16) = ( x(:,2).*y(:,3) - y(:,2).*x(:,3) ) -...
      ( x(:,1).*y(:,3) - y(:,1).*x(:,3)) +...
      ( x(:,1).*y(:,2) - y(:,1).*x(:,2)) ;% d4
  
  vol =  (abcd(:,1)+abcd(:,2)+abcd(:,3)+abcd(:,4))./6;%体积取正数会影响Li的正负
% %  
%   vol1 = abs ((x(:,2).*y(:,3).*z(:,4) - x(:,2).*y(:,4).*z(:,3) + x(:,3).*y(:,4).*z(:,2) - x(:,3).*y(:,2).*z(:,4) + x(:,4).*y(:,2).*z(:,3) - x(:,4).*y(:,3).*z(:,2)) - ...
%          (x(:,1).*y(:,3).*z(:,4) - x(:,1).*y(:,4).*z(:,3) + x(:,3).*y(:,4).*z(:,1) - x(:,3).*y(:,1).*z(:,4) + x(:,4).*y(:,1).*z(:,3) - x(:,4).*y(:,3).*z(:,1)) + ...
%          (x(:,1).*y(:,2).*z(:,4) - x(:,1).*y(:,4).*z(:,2) + x(:,2).*y(:,4).*z(:,1) - x(:,2).*y(:,1).*z(:,4) + x(:,4).*y(:,1).*z(:,2) - x(:,4).*y(:,2).*z(:,1)) - ...
%          (x(:,1).*y(:,2).*z(:,3) - x(:,1).*y(:,3).*z(:,2) + x(:,2).*y(:,3).*z(:,1) - x(:,2).*y(:,1).*z(:,3) + x(:,3).*y(:,1).*z(:,2) - x(:,3).*y(:,2).*z(:,1)))/6;

  if length(unique( vol<0))>1
      error 'The volume is negative'
  end
end