Exemple #1
0
SymSchurDecomp::SymSchurDecomp(const GeneralMatrix& mata)
	: lambda(mata.numRows()), q(mata.numRows())
{
	// check mata is square
	if (mata.numRows() != mata.numCols())
		throw SYLV_MES_EXCEPTION("Matrix is not square in SymSchurDecomp constructor");

	// prepare for dsyevr
	const char* jobz = "V";
	const char* range = "A";
	const char* uplo = "U";
	lapack_int n = mata.numRows();
	GeneralMatrix tmpa(mata);
	double* a = tmpa.base();
	lapack_int lda = tmpa.getLD();
	double dum;
	double* vl = &dum;
	double* vu = &dum;
	lapack_int idum;
	lapack_int* il = &idum;
	lapack_int* iu = &idum;
	double abstol = 0.0;
	lapack_int m = n;
	double* w = lambda.base();
	double* z = q.base();
	lapack_int ldz = q.getLD();
	lapack_int* isuppz = new lapack_int[2*std::max(1,(int) m)];
	double tmpwork;
	lapack_int lwork = -1;
	lapack_int tmpiwork;
	lapack_int liwork = -1;
	lapack_int info;

	// query for lwork and liwork
	dsyevr(jobz, range, uplo, &n, a, &lda, vl, vu, il, iu, &abstol,
				  &m, w, z, &ldz, isuppz, &tmpwork, &lwork, &tmpiwork, &liwork, &info);
	lwork = (int)tmpwork;
	liwork = tmpiwork;
	// allocate work arrays
	double* work = new double[lwork];
	lapack_int* iwork = new lapack_int[liwork];
	
	// do the calculation
	dsyevr(jobz, range, uplo, &n, a, &lda, vl, vu, il, iu, &abstol,
				  &m, w, z, &ldz, isuppz, work, &lwork, iwork, &liwork, &info);

	if (info < 0)
		throw SYLV_MES_EXCEPTION("Internal error in SymSchurDecomp constructor");
	if (info > 0)
		throw SYLV_MES_EXCEPTION("Internal LAPACK error in DSYEVR");

	delete [] work;
	delete [] iwork;
	delete [] isuppz;
}
Exemple #2
0
void Peli::lataa_kentta(std::string kenttaNimi) {
    #ifdef DEBUG
        std::clog << "Peli::lataa_kentta(" << kenttaNimi << ")" << std::endl;
    #endif

    std::vector <std::string> rivit = apuvalineet::lue_tiedosto("kentat/" + kenttaNimi);

    for (unsigned int i = 0; i < rivit.size(); ++i) {
        std::vector <std::string> asiat = apuvalineet::pilko_rivi(rivit[i], "|");

		if (asiat[0] == "N") {
            if (asiat[1] == "") {
                throw std::runtime_error("Kentän nimi puuttuu " + kenttaNimi + " rivillä " + apuvalineet::tekstiksi(i));
            }
			kentta.nimi = asiat[1];
		} else if (asiat[0] == "H") {
			kentta.korkeus = apuvalineet::luvuksi<double>(asiat[1]);
		} else if (asiat[0] == "P") {
			kentta.paikka.x = apuvalineet::luvuksi<double>(asiat[1]);
			kentta.paikka.y = apuvalineet::luvuksi<double>(asiat[2]);
		} else if (asiat[0] == "K") {
			apuvalineet::piste alku = apuvalineet::uusi_paikka(kentta.paikka, apuvalineet::luvuksi<double>(asiat[2]), apuvalineet::luvuksi<double>(asiat[3]));
            kiitotie tmpa(asiat[1], alku, apuvalineet::luvuksi<double>(asiat[5]), apuvalineet::luvuksi<double>(asiat[4]), apuvalineet::luvuksi<double>(asiat[6]), apuvalineet::luvuksi<double>(asiat[7]), apuvalineet::luvuksi<double>(asiat[8]), asetukset.anna_asetus("lahestymispiste"), asetukset.anna_asetus("hidastuspiste"), apuvalineet::luvuksi<double>(asiat[9]), apuvalineet::luvuksi<double>(asiat[10]));

			kentta.kiitotiet.push_back(tmpa);
		} else if (asiat[0] == "L") {
			apuvalineet::piste paikka;
			paikka = apuvalineet::uusi_paikka(kentta.paikka, apuvalineet::luvuksi<double>(asiat[2]), apuvalineet::luvuksi<double>(asiat[3]));

			navipiste tmp(apuvalineet::tekstiksi(asiat[1]), paikka);

			sisapisteet.push_back(tmp);
        } else if (asiat[0] == "U") {
            apuvalineet::piste paikka = apuvalineet::uusi_paikka(kentta.paikka, apuvalineet::luvuksi<double>(asiat[2]), apuvalineet::luvuksi<double>(asiat[3]));
            navipiste tmp_piste;
            int tyyppi = Peli::MOLEMMAT;

            if (asiat.back() == "S") {
                tyyppi = Peli::SAAPUVA;
            } else if (asiat.back() == "L") {
                tyyppi = Peli::LAHTEVA;
            }

            if (tyyppi == Peli::SAAPUVA || tyyppi == Peli::MOLEMMAT) {
                navipiste tmp(asiat[1], paikka, apuvalineet::luvuksi<double>(asiat[4]), apuvalineet::luvuksi<double>(asiat[5]), apuvalineet::luvuksi<double>(asiat[6]), tyyppi);
                tmp_piste = tmp;
            } else if (tyyppi == Peli::LAHTEVA) {
                #ifdef DEBUG
                    std::clog << "Lahteva" << std::endl;
                #endif
                navipiste tmp(asiat[1], paikka, tyyppi);
                tmp_piste = tmp;
            }

            navipisteet.push_back(tmp_piste);
		} else {
            throw std::runtime_error("Tiedosto " + kenttaNimi + " on väärässä formaatissa");
		}

		asiat.clear();
	}


    std::for_each(navipisteet.begin(), navipisteet.end(), tulosta);
    #ifdef DEBUG
        std::clog << std::endl << "KATKO" << std::endl << std::endl;
    #endif
    std::sort(navipisteet.begin(), navipisteet.end(), jarjesta_pisteet);

    std::for_each(navipisteet.begin(), navipisteet.end(), tulosta);
}
void gmp_fe::set_double_pow_mul(fe* b1, num* e1, fe* b2, num* e2) {
	gmp_fe tmpa(field), tmpb(field);
	tmpa.set_pow(b1, e1);
	tmpb.set_pow(b2, e2);
	set_mul(&tmpa, &tmpb);
}