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; }
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); }