106 lines
2.4 KiB
C++
106 lines
2.4 KiB
C++
#include "../src/lib/lcg_complex.h"
|
|
#include "iostream"
|
|
#include "fstream"
|
|
#include "vector"
|
|
|
|
#include "Eigen/Sparse"
|
|
|
|
#define random(x) (rand()%x)
|
|
|
|
typedef Eigen::SparseMatrix<lcg_complex, Eigen::RowMajor> spmat_cd; // 注意Eigen默认的稀疏矩阵排序为列优先
|
|
typedef Eigen::Triplet<lcg_complex> triplt_cd;
|
|
|
|
int main(int argc, char const *argv[])
|
|
{
|
|
int N = 1000000;
|
|
int nz = 1013000;
|
|
|
|
lcg_complex *v = new lcg_complex[nz];
|
|
lcg_complex *x = new lcg_complex[N];
|
|
lcg_complex *b = new lcg_complex[N];
|
|
|
|
lcg_complex one(1.0, 1.0), none(-1.0, -1.0), zero(0.0, 0.0);
|
|
|
|
clcg_vecrnd(v, 1.0*one, 10.0*one, nz);
|
|
clcg_vecrnd(x, 1.0*one, 2.0*one, N);
|
|
clcg_vecset(b, zero, N);
|
|
|
|
std::vector<triplt_cd> val_triplt;
|
|
val_triplt.reserve(2*(nz-N) + N);
|
|
|
|
for (size_t i = 0; i < N; i++)
|
|
{
|
|
val_triplt.push_back(triplt_cd(i, i, v[i]));
|
|
b[i] += v[i]*x[i];
|
|
}
|
|
|
|
srand((int)time(0));
|
|
|
|
int r, c;
|
|
size_t j = N;
|
|
while (j < nz)
|
|
{
|
|
r = random(N);
|
|
c = random(N);
|
|
if (r != c)
|
|
{
|
|
val_triplt.push_back(triplt_cd(r, c, v[j]));
|
|
val_triplt.push_back(triplt_cd(c, r, v[j]));
|
|
|
|
b[r] += v[j]*x[c];
|
|
b[c] += v[j]*x[r];
|
|
j++;
|
|
}
|
|
}
|
|
|
|
spmat_cd A;
|
|
A.resize(N, N);
|
|
A.setZero();
|
|
|
|
A.setFromTriplets(val_triplt.begin(), val_triplt.end());
|
|
|
|
std::ofstream Aout, Bout;
|
|
Aout.open("case_1M_cA", std::ios::binary);
|
|
Bout.open("case_1M_cB", std::ios::binary);
|
|
|
|
lcg_complex tmp;
|
|
|
|
nz = A.nonZeros();
|
|
|
|
Aout.write((char*)&N, sizeof(int));
|
|
Aout.write((char*)&nz, sizeof(int));
|
|
for (size_t i = 0; i < N; i++)
|
|
{
|
|
for (Eigen::SparseMatrix<lcg_complex, Eigen::RowMajor>::InnerIterator it(A, i); it; ++it) // 列循环
|
|
{
|
|
r = it.row();
|
|
c = it.col();
|
|
tmp = it.value();
|
|
|
|
Aout.write((char*)&r, sizeof(int));
|
|
Aout.write((char*)&c, sizeof(int));
|
|
Aout.write((char*)&tmp, sizeof(lcg_complex));
|
|
}
|
|
}
|
|
|
|
for (size_t i = 0; i < N; i++)
|
|
{
|
|
tmp = b[i];
|
|
Aout.write((char*)&tmp, sizeof(lcg_complex));
|
|
}
|
|
Aout.close();
|
|
|
|
Bout.write((char*)&N, sizeof(int));
|
|
for (size_t i = 0; i < N; i++)
|
|
{
|
|
tmp = x[i];
|
|
Bout.write((char*)&tmp, sizeof(lcg_complex));
|
|
}
|
|
Bout.close();
|
|
|
|
delete[] v;
|
|
delete[] x;
|
|
delete[] b;
|
|
return 0;
|
|
}
|