Пример #1
0
void MUMPSLU::allocate_coordinate_format_storage(sparse_matrix const& A)
{
    rows.clear();
    cols.clear();
    coefficients.clear();

    rows.reserve(A.nonZeros());
    cols.reserve(A.nonZeros());
    coefficients.reserve(A.nonZeros());

    for (auto k = 0; k < A.outerSize(); ++k)
    {
        for (sparse_matrix::InnerIterator it(A, k); it; ++it)
        {
            coefficients.emplace_back(it.value());
            rows.emplace_back(it.row() + 1);
            cols.emplace_back(it.col() + 1);
        }
    }
}
Пример #2
0
void MUMPSLLT::allocate_coordinate_format_storage(sparse_matrix const& A)
{
    coefficients.clear();
    coefficients.reserve(A.nonZeros());

    if (build_sparsity_pattern)
    {
        rows.reserve(A.nonZeros());
        cols.reserve(A.nonZeros());

        // Decompress the upper part of the sparse matrix
        for (auto k = 0; k < A.outerSize(); ++k)
        {
            for (sparse_matrix::InnerIterator it(A, k); it; ++it)
            {
                if (it.col() >= it.row())
                {
                    coefficients.emplace_back(it.value());
                    rows.emplace_back(it.row() + 1);
                    cols.emplace_back(it.col() + 1);
                }
            }
        }
        rows.shrink_to_fit();
        cols.shrink_to_fit();
    }
    else
    {
        // Only update the non-zero numerical values
        for (auto k = 0; k < A.outerSize(); ++k)
        {
            for (sparse_matrix::InnerIterator it(A, k); it; ++it)
            {
                if (it.col() >= it.row())
                {
                    coefficients.emplace_back(it.value());
                }
            }
        }
    }
}
Пример #3
0
void MUMPS::internal_solve(sparse_matrix const& A, vector& x, vector const& b)
{
    auto start = std::chrono::high_resolution_clock::now();

    x = b;

    info.n = A.rows();
    info.nz = coefficients.size();

    info.a = coefficients.data();
    info.irn = rows.data();
    info.jcn = cols.data();

    if (build_sparsity_pattern)
    {
        // Analysis phase
        info.job = Job::Analysis;
        MUMPSAdapter::mumps_c(info);

        if (info.info[0] < 0)
        {
            throw computational_error("Error in analysis phase of MUMPS solver\n");
        }
        build_sparsity_pattern = false;
    }

    // Factorization phase
    info.job = Job::Factorisation;
    MUMPSAdapter::mumps_c(info);

    if (info.info[0] < 0)
    {
        throw computational_error("Error in factorisation phase of MUMPS solver\n");
    }

    info.rhs = x.data();
    info.nrhs = 1;
    info.lrhs = info.n;

    info.job = Job::BackSubstitution;
    MUMPSAdapter::mumps_c(info);

    if (info.info[0] < 0)
    {
        throw computational_error("Error in back substitution phase of MUMPS solver\n");
    }

    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed_seconds = end - start;

    std::cout << std::string(6, ' ') << "MUMPS solver took " << elapsed_seconds.count() << "s\n";
}
Пример #4
0
 sparse_bcsr(sparse_matrix<T,dataType> &sp) : sparse_bcsr(sp.get_triplets()) {}
Пример #5
0
void constraintCalculator::sparseConstraintJacobian(int sr, sparse_matrix<double>& sjc, std::map<std::string, pointmass*> &masses, std::map<std::string, kinematicConstraint*> &kconsts, std::map<std::string, drivingConstraint*> &dconsts /* = 0 */)
{
	int sRow = 0;
	int iCol = 0;
	int jCol = 0;
	int ib=0; 
	int jb=0;
	int i = 0;
 	vector3<double> dij;
 	vector4<double> ep;
	std::map<std::string, kinematicConstraint*>::iterator kit;// = kconsts.begin();
 	sjc.zeroCount();
 	sRow = sjc.rows() - masses.size() + 1 + sr;
	std::map<std::string, pointmass*>::iterator mit;
	for(mit = masses.begin(); mit != masses.end(); mit++){
		pointmass* mass = mit->second;
		if(!mass->ID()) continue;
		euler_parameter<double> ep2 = 2 * mass->Orientation();
		sjc.extraction(sRow++, i * 7 + 3, ep2.Pointer(), 4);
		i++;
	}
	for(kit = kconsts.begin(); kit != kconsts.end(); kit++){
		kinematicConstraint* kconst = kit->second;
		sRow = kconst->sRow + sr;
		ib = kconst->i; iCol = kconst->iCol;
		jb = kconst->j; jCol = kconst->jCol;
//		switch(kconst->type)
//		{
// 		case kinematicConstraint::REVOLUTE:
// 			if(ib)
// 			{
// 				for(unsigned i(0); i < 3; i++) sjc(sRow+i,iCol+i) = -1;
// 				ep = m->getParameterv(ib);
// 				sjc.extraction(sRow+0, iCol+3, POINTER(B(ep, -kconst->sp_i)), MAT3X4);
// 				sjc.extraction(sRow+3, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->h_j), B(ep, kc->g_i))), VEC4);
// 				sjc.extraction(sRow+4, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->h_j), B(ep, kc->f_i))), VEC4);
// 			}
// 			if(jb)
// 			{
// 				for(unsigned i(0); i < 3; i++) sjc(sRow+i,jCol+i) = 1;
// 				ep = m->getParameterv(jb);
// 				sjc.extraction(sRow+0, jCol+3, POINTER(B(ep, kc->sp_j)), MAT3X4);	
// 				sjc.extraction(sRow+3, jCol+3, POINTER4(transpose(m->toGlobal(ib, kc->g_i), B(ep, kc->h_j))), VEC4);
// 				sjc.extraction(sRow+4, jCol+3, POINTER4(transpose(m->toGlobal(ib, kc->f_i), B(ep, kc->h_j))), VEC4);
// 			}
// 			//std::cout << *sjc << std::endl;
// 			break;
// 		case kinematicConstraint::SPHERICAL:
// 			if(ib)
// 			{
// 				ep = m->getParameterv(ib);
// 				for(unsigned i(0); i < 3; i++) sjc(sRow+i,iCol+i) = -1;
// 				sjc.extraction(sRow+0, iCol+3, POINTER(B(ep, -kc->sp_i)), MAT3X4);		
// 			}
// 			if(jb)
// 			{
// 				ep = m->getParameterv(jb);
// 				for(unsigned i(0); i < 3; i++) sjc(sRow+i,jCol+i) = 1;
// 				sjc.extraction(sRow+0, jCol+3, POINTER(B(ep, kc->sp_j)), MAT3X4);
// 			}
// 			break;
// 		case kinematicConstraint::TRANSLATION:
// 			dij = m->getPositionv(jb) + m->toGlobal(jb, kc->sp_j) - m->getPositionv(ib) - m->toGlobal(ib, kc->sp_i);
// 			if(ib)
// 			{
// 				ep = m->getParameterv(ib);
// 				sjc.extraction(sRow+0, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->h_j), B(ep, kc->f_i))), VEC4);
// 				sjc.extraction(sRow+1, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->h_j), B(ep, kc->g_i))), VEC4);
// 				sjc.extraction(sRow+2, iCol+0, POINTER3((-kc->f_i)), POINTER4(transpose(dij + kc->sp_i, B(ep, kc->f_i))), VEC3_4);
// 				sjc.extraction(sRow+3, iCol+0, POINTER3((-kc->g_i)), POINTER4(transpose(dij + kc->sp_i, B(ep, kc->g_i))), VEC3_4);
// 				sjc.extraction(sRow+4, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->g_j), B(ep, kc->g_i))), VEC4);
// 			}
// 			if(jb)
// 			{
// 				ep = m->getParameterv(jb);
// 				sjc.extraction(sRow+0, jCol+3, POINTER4(transpose(m->toGlobal(ib, kc->f_i), B(ep, kc->h_j))), VEC4);
// 				sjc.extraction(sRow+1, jCol+3, POINTER4(transpose(m->toGlobal(ib, kc->g_i), B(ep, kc->h_j))), VEC4);
// 				sjc.extraction(sRow+2, jCol+0, POINTER3(kc->f_i), POINTER4(transpose(kc->f_i, B(ep, kc->sp_j))), VEC3_4);
// 				sjc.extraction(sRow+3, jCol+0, POINTER3(kc->g_i), POINTER4(transpose(kc->g_i, B(ep, kc->sp_j))), VEC3_4);
// 				sjc.extraction(sRow+4, jCol+3, POINTER4(transpose(m->toGlobal(ib, kc->g_i), B(ep, kc->g_j))), VEC4);
// 			}
// 			//std::cout << *sjc << std::endl;
// 			break;
// 		case kinematicConstraint::CYLINDERICAL:
// 			//vector3d yy = jb->Getpos() + jb->A()*joint->sp_j;
// 			dij = m->getPositionv(jb) + m->toGlobal(jb, kc->sp_j) - m->getPositionv(ib) - m->toGlobal(ib, kc->sp_i);
// 			if(ib)
// 			{
// 				ep = m->getParameterv(ib);
// 				sjc.extraction(sRow+0, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->h_j), B(ep, kc->g_i))), VEC4);
// 				sjc.extraction(sRow+1, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->h_j), B(ep, kc->f_i))), VEC4);
// 				sjc.extraction(sRow+2, iCol+0, POINTER3((-m->toGlobal(ib, kc->g_i))), POINTER4(transpose(dij + m->toGlobal(ib, kc->sp_i), B(ep, kc->g_i))), VEC3_4);
// 				sjc.extraction(sRow+3, iCol+0, POINTER3((-m->toGlobal(ib, kc->f_i))), POINTER4(transpose(dij + m->toGlobal(ib, kc->sp_i), B(ep, kc->f_i))), VEC3_4);
// 
// 			}
// 			if(jb)
// 			{
// 				ep = m->getParameterv(jb);
// 				vector3d gfi = m->toGlobal(ib, kc->f_i);
// 				vector3d ggi = m->toGlobal(ib, kc->g_i);
// 				sjc.extraction(sRow+0, jCol+3, POINTER4(transpose(ggi, B(ep, kc->h_j))), VEC4);
// 				sjc.extraction(sRow+1, jCol+3, POINTER4(transpose(gfi, B(ep, kc->h_j))), VEC4);
// 				sjc.extraction(sRow+2, jCol+0, POINTER3(ggi), POINTER4(transpose(ggi, B(ep, kc->sp_j))), VEC3_4);
// 				sjc.extraction(sRow+3, jCol+0, POINTER3(gfi), POINTER4(transpose(gfi, B(ep, kc->sp_j))), VEC3_4);
// 
// 			}
// 			break;
// 		}
//	}
// 
// 	while(kc != kconsts->end()){
// 		sRow = kc->sRow + sr;
// 		ib = kc->i; iCol = kc->iCol;
// 		jb = kc->j; jCol = kc->jCol;
// 		switch(kc->type)
// 		{
// 		case kinematicConstraint::REVOLUTE:
// 			if(ib)
// 			{
// 				for(unsigned i(0); i < 3; i++) sjc(sRow+i,iCol+i) = -1;
// 				ep = m->getParameterv(ib);
// 				sjc.extraction(sRow+0, iCol+3, POINTER(B(ep, -kc->sp_i)), MAT3X4);
// 				sjc.extraction(sRow+3, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->h_j), B(ep, kc->g_i))), VEC4);
// 				sjc.extraction(sRow+4, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->h_j), B(ep, kc->f_i))), VEC4);
// 			}
// 			if(jb)
// 			{
// 				for(unsigned i(0); i < 3; i++) sjc(sRow+i,jCol+i) = 1;
// 				ep = m->getParameterv(jb);
// 				sjc.extraction(sRow+0, jCol+3, POINTER(B(ep, kc->sp_j)), MAT3X4);	
// 				sjc.extraction(sRow+3, jCol+3, POINTER4(transpose(m->toGlobal(ib, kc->g_i), B(ep, kc->h_j))), VEC4);
// 				sjc.extraction(sRow+4, jCol+3, POINTER4(transpose(m->toGlobal(ib, kc->f_i), B(ep, kc->h_j))), VEC4);
// 			}
// 			//std::cout << *sjc << std::endl;
// 			break;
// 		case kinematicConstraint::SPHERICAL:
// 			if(ib)
// 			{
// 				ep = m->getParameterv(ib);
// 				for(unsigned i(0); i < 3; i++) sjc(sRow+i,iCol+i) = -1;
// 				sjc.extraction(sRow+0, iCol+3, POINTER(B(ep, -kc->sp_i)), MAT3X4);		
// 			}
// 			if(jb)
// 			{
// 				ep = m->getParameterv(jb);
// 				for(unsigned i(0); i < 3; i++) sjc(sRow+i,jCol+i) = 1;
// 				sjc.extraction(sRow+0, jCol+3, POINTER(B(ep, kc->sp_j)), MAT3X4);
// 			}
// 			break;
// 		case kinematicConstraint::TRANSLATION:
// 			dij = m->getPositionv(jb) + m->toGlobal(jb, kc->sp_j) - m->getPositionv(ib) - m->toGlobal(ib, kc->sp_i);
// 			if(ib)
// 			{
// 				ep = m->getParameterv(ib);
// 				sjc.extraction(sRow+0, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->h_j), B(ep, kc->f_i))), VEC4);
// 				sjc.extraction(sRow+1, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->h_j), B(ep, kc->g_i))), VEC4);
// 				sjc.extraction(sRow+2, iCol+0, POINTER3((-kc->f_i)), POINTER4(transpose(dij + kc->sp_i, B(ep, kc->f_i))), VEC3_4);
// 				sjc.extraction(sRow+3, iCol+0, POINTER3((-kc->g_i)), POINTER4(transpose(dij + kc->sp_i, B(ep, kc->g_i))), VEC3_4);
// 				sjc.extraction(sRow+4, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->g_j), B(ep, kc->g_i))), VEC4);
// 			}
// 			if(jb)
// 			{
// 				ep = m->getParameterv(jb);
// 				sjc.extraction(sRow+0, jCol+3, POINTER4(transpose(m->toGlobal(ib, kc->f_i), B(ep, kc->h_j))), VEC4);
// 				sjc.extraction(sRow+1, jCol+3, POINTER4(transpose(m->toGlobal(ib, kc->g_i), B(ep, kc->h_j))), VEC4);
// 				sjc.extraction(sRow+2, jCol+0, POINTER3(kc->f_i), POINTER4(transpose(kc->f_i, B(ep, kc->sp_j))), VEC3_4);
// 				sjc.extraction(sRow+3, jCol+0, POINTER3(kc->g_i), POINTER4(transpose(kc->g_i, B(ep, kc->sp_j))), VEC3_4);
// 				sjc.extraction(sRow+4, jCol+3, POINTER4(transpose(m->toGlobal(ib, kc->g_i), B(ep, kc->g_j))), VEC4);
// 			}
// 			//std::cout << *sjc << std::endl;
// 			break;
// 		case kinematicConstraint::CYLINDERICAL:
// 			//vector3d yy = jb->Getpos() + jb->A()*joint->sp_j;
// 			dij = m->getPositionv(jb) + m->toGlobal(jb, kc->sp_j) - m->getPositionv(ib) - m->toGlobal(ib, kc->sp_i);
// 			if(ib)
// 			{
// 				ep = m->getParameterv(ib);
// 				sjc.extraction(sRow+0, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->h_j), B(ep, kc->g_i))), VEC4);
// 				sjc.extraction(sRow+1, iCol+3, POINTER4(transpose(m->toGlobal(jb, kc->h_j), B(ep, kc->f_i))), VEC4);
// 				sjc.extraction(sRow+2, iCol+0, POINTER3((-m->toGlobal(ib, kc->g_i))), POINTER4(transpose(dij + m->toGlobal(ib, kc->sp_i), B(ep, kc->g_i))), VEC3_4);
// 				sjc.extraction(sRow+3, iCol+0, POINTER3((-m->toGlobal(ib, kc->f_i))), POINTER4(transpose(dij + m->toGlobal(ib, kc->sp_i), B(ep, kc->f_i))), VEC3_4);
// 				
// 			}
// 			if(jb)
// 			{
// 				ep = m->getParameterv(jb);
// 				vector3d gfi = m->toGlobal(ib, kc->f_i);
// 				vector3d ggi = m->toGlobal(ib, kc->g_i);
// 				sjc.extraction(sRow+0, jCol+3, POINTER4(transpose(ggi, B(ep, kc->h_j))), VEC4);
// 				sjc.extraction(sRow+1, jCol+3, POINTER4(transpose(gfi, B(ep, kc->h_j))), VEC4);
// 				sjc.extraction(sRow+2, jCol+0, POINTER3(ggi), POINTER4(transpose(ggi, B(ep, kc->sp_j))), VEC3_4);
// 				sjc.extraction(sRow+3, jCol+0, POINTER3(gfi), POINTER4(transpose(gfi, B(ep, kc->sp_j))), VEC3_4);
// 				
// 			}
// 			break;
// 		}
// 		kc++;
}

	
	//std::cout << sjc;
// 	for(std::vector<drivingType>::iterator driving = drivings.begin(); driving != drivings.end(); driving++)
// 	{
// 		sCol = (driving->targetBody - 1) * 7;
// 		switch(driving->targetCoord)
// 		{
// 		case 'z':
// 			sjc->extraction(sRow, sCol+3, POINTER(vector4d(0.0,0.0,0.0,1.0)), VEC4);
// 			sRow+=1;
// 			break;
// 		}
// 
// 	}
}