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); }
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; } }
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); }
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; }
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); } }
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); }
/// Factor the matrix A FlatCholeskyFactors (const FlatMatrix<T> & a, LocalHeap & lh) { diag = (T*)lh.Alloc(sizeof(T)*RequiredMem(a.Height())); Factor (a); }
/// Factor the matrix A CholeskyFactors (const FlatMatrix<T> & a) : FlatCholeskyFactors<T> (a, new T[this->RequiredMem(a.Height())]) { ; }