Exemplo n.º 1
0
 DevMatrix (FlatMatrix<T> a2)
 {
   h = a2.Height();
   w = a2.Width();
   cudaMalloc((T**)&dev_data, h*w*sizeof(T));
   cudaMemcpy (dev_data, &a2(0,0), sizeof(T)*h*w, cudaMemcpyHostToDevice);
 }
Exemplo n.º 2
0
  void CalcSchurComplement (const FlatMatrix<double> a, 
			    FlatMatrix<double> s,
			    const BitArray & used,
			    LocalHeap & lh)
  {
    if (s.Height() == 0) return;
    if (s.Height() == a.Height())
      {
        s = a;
        return;
      }

    HeapReset hr(lh);

    int n = a.Height();
    Array<int> used_dofs(n, lh);
    Array<int> unused_dofs(n, lh);
    used_dofs.SetSize(0);
    unused_dofs.SetSize(0);
    for (int i = 0; i < n; i++)
      if (used[i])
        used_dofs.Append(i);
      else
        unused_dofs.Append(i);

    s = a.Rows(used_dofs).Cols(used_dofs);
    FlatMatrix<> b1 = a.Rows(unused_dofs).Cols(used_dofs) | lh;
    FlatMatrix<> b2 = a.Rows(used_dofs).Cols(unused_dofs) | lh;
    FlatMatrix<> c = a.Rows(unused_dofs).Cols(unused_dofs) | lh;
    FlatMatrix<> hb1 (b1.Height(), b1.Width(), lh);

    if (n > 10)
      {
        LapackInverse (c);
        hb1 = c * b1 | Lapack;
        s -= b2 * hb1 | Lapack;
      }
    else
      {
        CalcInverse (c);
        hb1 = c * b1;
        s -= b2 * hb1;
      }
  }
Exemplo n.º 3
0
  extern NGS_DLL_HEADER void CalcInverse (FlatMatrix<double> inv, INVERSE_LIB il)
  {
#ifdef LAPACK
    if (il == INVERSE_LIB::INV_LAPACK)
      LapackInverse(inv);
    else if (il == INVERSE_LIB::INV_CHOOSE && inv.Height() >= 20)
      LapackInverse(inv);        
    else
#endif
      T_CalcInverse (inv);
  }
Exemplo n.º 4
0
  void DGFiniteElement<D>:: 
  CalcTraceMatrix (int facet, FlatMatrix<> trace) const
  {
    ELEMENT_TYPE ftype = ElementTopology::GetFacetType (this->ElementType(), facet);
    Facet2ElementTrafo f2el(this->ElementType(), FlatArray<int> (8, const_cast<int*> (vnums)) );
    const IntegrationRule & ir = SelectIntegrationRule (ftype, 2*order);

    ScalarFiniteElement<0> * facetfe0 = NULL;
    ScalarFiniteElement<1> * facetfe1 = NULL;
    ScalarFiniteElement<2> * facetfe2 = NULL;
    switch (ftype)
      {
      case ET_POINT : facetfe0 = new FE_Point; break;
      case ET_SEGM : facetfe1 = new L2HighOrderFE<ET_SEGM> (order); break;
      case ET_TRIG : facetfe2 = new L2HighOrderFE<ET_TRIG> (order); break;
      case ET_QUAD : facetfe2 = new L2HighOrderFE<ET_QUAD> (order); break;
      default:
	;
      }

    int ndof_facet = trace.Height();
    Vector<> shape(ndof);
    Vector<> fshape(ndof_facet);
    Vector<> norms(ndof_facet);

    trace = 0.0;
    norms = 0.0;
    for (int i = 0; i < ir.Size(); i++)
      {
	if (D == 1) 
          facetfe0 -> CalcShape (ir[i], fshape);
	else if (D == 2) 
          facetfe1 -> CalcShape (ir[i], fshape);
	else            
          facetfe2 -> CalcShape (ir[i], fshape);

	this -> CalcShape (f2el (facet, ir[i]), shape);

	trace += ir[i].Weight() * fshape * Trans (shape);
	for (int j = 0; j < norms.Size(); j++)
	  norms(j) += ir[i].Weight() * sqr (fshape(j));
      }

    for (int j = 0; j < fshape.Size(); j++)
      trace.Row(j) /= norms(j);

    delete facetfe0;
    delete facetfe1;
    delete facetfe2;
  }
Exemplo n.º 5
0
  void T_CalcInverse (FlatMatrix<T2> inv)
  {
    // static Timer t("CalcInverse");
    // RegionTimer reg(t);

    // Gauss - Jordan - algorithm
    // Algorithm of Stoer, Einf. i. d. Num. Math, S 145
    // int n = m.Height();

    int n = inv.Height();

    ngstd::ArrayMem<int,100> p(n);   // pivot-permutation
    for (int j = 0; j < n; j++) p[j] = j;
    
    for (int j = 0; j < n; j++)
      {
	// pivot search
	double maxval = abs(inv(j,j));
	int r = j;

	for (int i = j+1; i < n; i++)
	  if (abs (inv(j, i)) > maxval)
	    {
	      r = i;
	      maxval = abs (inv(j, i));
	    }
      
        double rest = 0.0;
        for (int i = j+1; i < n; i++)
          rest += abs(inv(r, i));
	if (maxval < 1e-20*rest)
	  {
	    throw Exception ("Inverse matrix: Matrix singular");
	  }

	// exchange rows
	if (r > j)
	  {
	    for (int k = 0; k < n; k++)
	      swap (inv(k, j), inv(k, r));
	    swap (p[j], p[r]);
	  }
      

	// transformation
	
	T2 hr;
	CalcInverse (inv(j,j), hr);
	for (int i = 0; i < n; i++)
	  {
	    T2 h = hr * inv(j, i);
	    inv(j, i) = h;
	  }
	inv(j,j) = hr;

	for (int k = 0; k < n; k++)
	  if (k != j)
	    {
	      T2 help = inv(n*k+j);
	      T2 h = help * hr;   

	      for (int i = 0; i < n; i++)
		{
		  T2 h = help * inv(n*j+i); 
		  inv(n*k+i) -= h;
		}

	      inv(k,j) = -h;
	    }
      }

    // row exchange
  
    VectorMem<100,T2> hv(n);
    for (int i = 0; i < n; i++)
      {
	for (int k = 0; k < n; k++) hv(p[k]) = inv(k, i);
	for (int k = 0; k < n; k++) inv(k, i) = hv(k);
      }
  }
Exemplo n.º 6
0
  void CalcEigenSystem (const FlatMatrix<double> & mat1,
			FlatVector<double> & lami,
			FlatMatrix<double> & eigenvecs)
  {
    int i, j, k, l;
    
    int n = mat1.Height();    
    Matrix<double> mat(n, n);
    mat = mat1;

    eigenvecs = 0;
    for (i = 0; i < n; i++)
      eigenvecs(i,i) = 1;
    
    for (l = 0; l < 100; l++)
      for (i = 0; i < n; i++)
	for (j = 0; j < i; j++)
	  {
	    // find eigensystem of a(i-j,i-j)

	    double a11 = mat(i,i);
	    double a12 = mat(i,j);
	    double a22 = mat(j,j);

	    if (a12*a12 <= 1e-32 * fabs(a11*a22)) continue;

	    /*
	    double lam1, lam2;
	    // y is EV from  a y = lam y
	    // quadratic eq. for eigenvalues lam:
	    // c0 + c1 lam + c2 lam^2 = 0
	  
	    double c0 = a11*a22-a12*a12;
	    double c1 = -a22 - a11;
	    double c2 = 1;
	  
	    lam1 = -c1/(2*c2) + sqrt( sqr(c1/(2*c2)) - c0/c2);
	    lam2 = -c1/(2*c2) - sqrt( sqr(c1/(2*c2)) - c0/c2);
	    cout << "lam1,2 = " << lam1 << ", " << lam2 << endl;

	    lam1 = (a11+a22) / 2 + sqrt ( sqr(a11-a22)/4 + a12*a12);
	    lam2 = (a11+a22) / 2 - sqrt ( sqr(a11-a22)/4 + a12*a12);
	    //	cout << "lam1,2 = " << lam1 << ", " << lam2 << endl;
	    */

	    double p = (a22-a11)/2;
	    double q = a12;
	
	    // compute eigenvectors:
	    double y11, y12, y21, y22, y;

	    y11 = a12;
	    //	y12 = lam1-a11;

	    y12 = 
	      (p >= 0) ?
	      p + sqrt (p*p + q*q) :
	      -q*q / (p - sqrt (p*p+q*q));

	    y = sqrt (y11*y11+y12*y12);
	    y11 /= y;
	    y12 /= y;

	    y21 = a12;
	    //	y22 = lam2-a11;

	    y22 = 
	      (p <= 0) ?
	      p - sqrt (p*p + q*q) :
	      -q*q / (p + sqrt (p*p+q*q));

	    y = sqrt (y21*y21+y22*y22);
	    y21 /= y;
	    y22 /= y;
	
	    /*
	      (*testout) << "evecs = "
	      << "(" << y11 << ", " << y12 << "), "
	      << "(" << y21 << ", " << y22 << ")" << endl;
	      (*testout) << "Y Y = "
	      << (y11*y11+y12*y12) << ", "
	      << (y11*y21+y12*y22) << ", "
	      << (y21*y21+y22*y22) << endl;
	    */
	
	    // V^T A V = V^T G^{-1}  (G^T A G)  G^{-1} V

	    for (k = 0; k < n; k++)
	      {
		double v1 = mat(k,i);
		double v2 = mat(k,j);
		mat(k,i) = v1 * y11 + v2 * y12;
		mat(k,j) = v1 * y21 + v2 * y22;
	      }

	    for (k = 0; k < n; k++)
	      {
		double v1 = mat(i,k);
		double v2 = mat(j,k);
		mat(i,k) = v1 * y11 + v2 * y12;
		mat(j,k) = v1 * y21 + v2 * y22;
	      }

	    mat(i,j) = 0;
	    mat(j,i) = 0;

	    for (k = 0; k < n; k++)
	      {
		double v1 = eigenvecs(i,k);
		double v2 = eigenvecs(j,k);
		eigenvecs(i,k) = v1 * y11 + v2 * y12;
		eigenvecs(j,k) = v1 * y21 + v2 * y22;
	      }
	  }

    for (i = 0; i < n; i++)
      lami(i) = mat(i,i);
  }
Exemplo n.º 7
0
 /// Factor the matrix A
 FlatCholeskyFactors (const FlatMatrix<T> & a, LocalHeap & lh)
 {
   diag = (T*)lh.Alloc(sizeof(T)*RequiredMem(a.Height()));
   Factor (a);
 }
Exemplo n.º 8
0
 /// Factor the matrix A
 CholeskyFactors (const FlatMatrix<T> & a)
   : FlatCholeskyFactors<T> (a, new T[this->RequiredMem(a.Height())])
 { ; }