Exemplo n.º 1
0
void TensorInverse(const Tensor<DataMesh>& t, Tensor<DataMesh>& inv) {
  ASSERT(t.Rank() == 2, "Not a matrix");
  ASSERT(t.Dim() == 3, "Not 3D");
  ASSERT(t.Structure() == inv.Structure(),
	 "Tensors have different structures");
  DataMesh det = t(0,0);
  TensorDeterminant(t, det);

  for(int i=0;i<det.Size();i++) {
    ASSERT(det[i] != 0, "Singular matrix");
  }

  for(TensorIter it(t);it;++it) {
    IPoint ind = t.Structure().Indices(it.Index());
    inv[it] = (t((ind[1]+1)%3,(ind[0]+1)%3) * t((ind[1]+2)%3,(ind[0]+2)%3)
	       - t((ind[1]+1)%3,(ind[0]+2)%3) * t((ind[1]+2)%3,(ind[0]+1)%3))
      / det;
  }
}
Exemplo n.º 2
0
Tensor<DataMesh> findInverse(const Tensor<DataMesh>& T){
  /**

     Compute the inverse of the given Tensor using a minor expansion.
   */
  const Mesh m(T(0).Extents());
  DataMesh det = computeDet(T);
  for(int k=0;k<det.Size();k++){
    REQUIRE(det[k]>1e-15 || det[k]<1e-15,"determinant is too close to zero!\n");
  }
  //The inverse of a symmetric matrix is symmetric:
  Tensor<DataMesh> inverse(3,"aa",m,0.0);
  inverse(0,0) = (T(1,1)*T(2,2)-T(1,2)*T(2,1))/det;
  inverse(0,1) = -(T(1,0)*T(2,2)-T(1,2)*T(2,0))/det;
  inverse(0,2) = (T(1,0)*T(2,1)-T(1,1)*T(2,0))/det;
  inverse(1,1) = (T(0,0)*T(2,2)-T(0,2)*T(2,0))/det;
  inverse(1,2) = -(T(0,0)*T(2,1)-T(0,1)*T(2,0))/det;
  inverse(2,2) = (T(0,0)*T(1,1)-T(0,1)*T(1,0))/det;
 
  return inverse;
}