57typedef Eigen::Map<const Eigen::VectorXd>
MapVec;
66 for (
int i = 0; i < m - 1; ++i)
70 H[i][m - 1] =
c[i] * buf +
s[i] *
H[i + 1][m - 1];
71 H[i + 1][m - 1] = -
s[i] * buf +
c[i] *
H[i + 1][m - 1];
74 double izn = 1.0 / sqrt(
H[m - 1][m - 1] *
H[m - 1][m - 1] +
H[m][m - 1] *
H[m][m - 1]);
76 c.push_back(
H[m - 1][m - 1] * izn);
77 s.push_back(
H[m][m - 1] * izn);
80 H[m - 1][m - 1] =
c[m - 1] *
H[m - 1][m - 1] +
s[m - 1] *
H[m][m - 1];
84 std::cout <<
"Iteration: " << m <<
", residual = " << (fabs(gs) / nrmRhs) << std::endl;
86 fl = ((fabs(gs) / nrmRhs) < epsGMRES);
91void GmresSolver::SolCircleRundirect(
const std::vector<double>& A,
const std::vector<double>& rhs,
size_t startRow,
size_t startRowReg,
size_t np, std::vector<double>& res)
93 size_t nAllVars = rhs.size();
94 std::vector<double> alpha(
np + 2), beta(
np + 2), gamma(
np + 2);
95 std::vector<double> u(
np), v(
np);
97 double zn = A[(startRow +
np + 1) * nAllVars + (startRow +
np + 1)];
98 alpha[2] = -A[(startRow +
np + 1) * nAllVars + (startRow +
np + 2)] / zn;
99 beta[2] = rhs[startRow +
np + 1] / zn;
100 gamma[2] = -A[(startRow +
np + 1) * nAllVars + (startRow +
np + 0)] / zn;
102 for (
size_t i = 2; i <=
np; ++i)
104 zn = A[(startRow +
np + (i %
np)) * nAllVars + (startRow +
np + (i %
np))] + alpha[i] * A[(startRow +
np + (i %
np)) * nAllVars + (startRow +
np + ((i - 1) %
np))];
105 alpha[i + 1] = -A[(startRow +
np + (i %
np)) * nAllVars + (startRow +
np + ((i + 1) %
np))] / zn;
106 beta[i + 1] = (rhs[startRow +
np + (i %
np)] - beta[i] * A[(startRow +
np + (i %
np)) * nAllVars + (startRow +
np + ((i - 1) %
np))]) / zn;
107 gamma[i + 1] = -(gamma[i] * A[(startRow +
np + (i %
np)) * nAllVars + (startRow +
np + ((i - 1) %
np))]) / zn;
110 u[
np - 1] = beta[
np];
111 v[
np - 1] = alpha[
np] + gamma[
np];
112 for (
size_t i =
np - 2; i >= 1; --i)
114 u[i] = alpha[i + 1] * u[i + 1] + beta[i + 1];
115 v[i] = alpha[i + 1] * v[i + 1] + gamma[i + 1];
118 res[startRow +
np] = (beta[
np + 1] + alpha[
np + 1] * u[1]) / (1.0 - gamma[
np + 1] - alpha[
np + 1] * v[1]);
119 for (
size_t i = 1; i <
np; ++i)
120 res[startRow +
np + i] = u[i] + res[startRow +
np] * v[i];
128void GmresSolver::SolMdirect(
const std::vector<double>& A,
const std::vector<double>& rhs,
size_t startRow,
size_t startRowReg,
size_t np, std::vector<double>& res,
bool lin)
130 std::vector<double> alpha(
np), beta(
np), gamma(
np), delta(
np), phi(
np), xi(
np), psi(
np);
132 double lam1, lam2, mu1, mu2, xi1, xi2;
135 size_t nAllVars = rhs.size();
137 double izn = 1.0 / A[(startRow + 0) * nAllVars + (startRow + 0)];
138 alpha[1] = -A[(startRow + 0) * nAllVars + (startRow + 1)] * izn;
139 beta[1] = -A[(startRow + 0) * nAllVars + (startRow +
np - 1)] * izn;
140 gamma[1] = -A[(startRow + 0) * nAllVars + (startRowReg)] * izn;
141 delta[1] = rhs[startRow] * izn;
145 for (
size_t i = 1; i <
np - 1; ++i)
147 a = A[(startRow + i) * nAllVars + (startRow + i - 1)];
148 zn = a * alpha[i] + A[(startRow + i) * nAllVars + (startRow + i)];
149 alpha[i + 1] = -A[(startRow + i) * nAllVars + (startRow + i + 1)] / zn;
150 beta[i + 1] = -a * beta[i] / zn;
151 gamma[i + 1] = -(A[(startRow + i) * nAllVars + (startRowReg)] + a * gamma[i]) / zn;
152 delta[i + 1] = (rhs[startRow + i] - a * delta[i]) / zn;
155 a = A[(startRow + (
np - 2)) * nAllVars + (startRow + (
np - 3))];
156 zn = alpha[
np - 2] * a + A[(startRow + (
np - 2)) * nAllVars + (startRow + (
np - 2))];
158 phi[
np - 1] = -(A[(startRow +
np - 2) * nAllVars + (startRow +
np - 1)] + a * beta[
np - 2]) / zn;
159 psi[
np - 1] = -(A[(startRow +
np - 2) * nAllVars + (startRowReg)] + gamma[
np - 2] * a) / zn;
160 xi[
np - 1] = (rhs[startRow +
np - 2] - delta[
np - 2] * a) / zn;
162 for (
size_t i =
np - 2; i > 0; --i)
164 phi[i] = alpha[i] * phi[i + 1] + beta[i];
165 psi[i] = alpha[i] * psi[i + 1] + gamma[i];
166 xi[i] = alpha[i] * xi[i + 1] + delta[i];
170 double e = A[(startRow +
np - 1) * nAllVars + (startRow + 0)];
171 a = A[(startRow +
np - 1) * nAllVars + (startRow +
np - 2)];
172 lam1 = e * phi[1] + a * phi[
np - 1] + A[(startRow +
np - 1) * nAllVars + (startRow +
np - 1)];
173 mu1 = e * psi[1] + a * psi[
np - 1] + A[(startRow +
np - 1) * nAllVars + (startRowReg)];
174 xi1 = rhs[startRow +
np - 1] - e * xi[1] - a * xi[
np - 1];
176 lam2 = mu2 = xi2 = 0.0;
177 for (
size_t j = 0; j <
np - 1; ++j)
185 xi2 += rhs[startRowReg];
187 zn = lam1 * mu2 - lam2 * mu1;
188 yn = (xi1 * mu2 - xi2 * mu1) / zn;
189 ynn = -(xi1 * lam2 - xi2 * lam1) / zn;
191 res[startRowReg] = ynn;
193 res[startRow +
np - 1] = yn;
194 for (
size_t i =
np - 2; i + 1 > 0; --i)
195 res[startRow + i] = phi[i + 1] * yn + psi[i + 1] * ynn + xi[i + 1];
207 const std::vector<double>& mtrDir,
208 const std::vector<double>& rhsDir,
209 const std::vector<int>& pos,
210 const std::vector<int>& vsize,
211 std::vector<std::vector<double>>& gam,
212 std::vector<double>& R)
214 const size_t maxIter = nAllVars + 1;
215 std::vector<double> x(nAllVars, 0.0);
216 std::vector<double> y(nAllVars, 0.0);
217 std::vector<double> residual(nAllVars, 0.0);
218 std::vector<double> r(nAllVars, 0.0);
219 std::vector<double>
w(nAllVars, 0.0);
220 std::vector<double> wOld(nAllVars, 0.0);
221 std::vector<double>
g(nAllVars, 0.0);
222 std::vector<double>
c(nAllVars, 0.0);
223 std::vector<double>
s(nAllVars, 0.0);
224 std::vector<double> hisGs(nAllVars + 1, 0.0);
225 std::vector<double> v(nAllVars * (maxIter + 1), 0.0);
227 std::vector<double> vecFromV(nAllVars, 0.0);
229 std::vector<double> h((nAllVars + 1) * maxIter, 0.0);
230 double beta = 0.0, gs, normb = 0.0;
233 for (
size_t i = 0; i < nAllVars; ++i)
234 normb += rhsDir[i] * rhsDir[i];
237 for (
size_t i = 0; i < nAllVars; ++i)
238 residual[i] = rhsDir[i];
240#pragma omp parallel for
241 for (
int aflI = 0; aflI < nafl; ++aflI)
247 for (
size_t i = 0; i < nAllVars; ++i)
256 for (
size_t aflI = 0; aflI < nafl; ++aflI)
258 for (
size_t i = 0; i < vsize[aflI]; ++i)
265 for (
size_t aflI = 0; aflI < nafl; ++aflI)
266 R[aflI] = x[x.size() - nafl + aflI];
268 for (
size_t i = 0; i < nAllVars; ++i)
269 v[i * (maxIter + 1) + 0] = r[i] / beta;
271 for (
size_t j = 0; j < nAllVars; ++j)
273 double timer1 = omp_get_wtime();
275 for (
size_t p = 0; p < nAllVars; ++p)
276 vecFromV[p] = v[p * (maxIter + 1) + j];
280 for (
int i = 0; i < nAllVars; ++i)
283 for (
int jj = 0; jj < nAllVars; ++jj)
285 wOld[i] += mtrDir[i * nAllVars + jj] * vecFromV[jj];
289 double timer2 = omp_get_wtime();
291#pragma omp parallel for
292 for (
int aflI = 0; aflI < nafl; ++aflI)
298 for (
size_t i = 0; i <= j; ++i)
300 h[i * maxIter + j] = 0.0;
301 for (
size_t q = 0; q < nAllVars; ++q)
302 h[i * maxIter + j] +=
w[q] * v[q * (maxIter + 1) + i];
304 for (
size_t q = 0; q < nAllVars; ++q)
305 w[q] -= h[i * maxIter + j] * v[q * (maxIter + 1) + i];
308 h[(j + 1) * maxIter + j] = 0.0;
309 for (
size_t p = 0; p < nAllVars; ++p)
310 h[(j + 1) * maxIter + j] +=
w[p] *
w[p];
311 h[(j + 1) * maxIter + j] = sqrt(h[(j + 1) * maxIter + j]);
313 for (
size_t p = 0; p < nAllVars; ++p)
314 v[p * (maxIter + 1) + (j + 1)] =
w[p] / h[(j + 1) * maxIter + j];
316 for (
size_t i = 0; i < j; ++i)
318 double buf = h[i * maxIter + j];
319 h[i * maxIter + j] =
c[i] * buf +
s[i] * h[(i + 1) * maxIter + j];
320 h[(i + 1) * maxIter + j] = -
s[i] * buf +
c[i] * h[(i + 1) * maxIter + j];
323 double zn = sqrt(h[j * maxIter + j] * h[j * maxIter + j] + h[(j + 1) * maxIter + j] * h[(j + 1) * maxIter + j]);
324 c[j] = fabs(h[j * maxIter + j] / zn);
325 s[j] =
c[j] * h[(j + 1) * maxIter + j] / h[j * maxIter + j];
329 h[j * maxIter + j] =
c[j] * h[j * maxIter + j] +
s[j] * h[(j + 1) * maxIter + j];
330 h[(j + 1) * maxIter + j] = 0.0;
331 hisGs[j] = fabs(gs) / normb;
341 for (
size_t i = 0; i < m; ++i)
346 g[i + 1] = -
s[i] * buf;
349 y[m - 1] =
g[m - 1] / h[(m - 1) * maxIter + (m - 1)];
351 for (
size_t i = m - 2; i + 1 > 0; --i)
354 for (
size_t j = i + 1; j < m; ++j)
355 sum += h[i * maxIter + j] * y[j];
357 y[i] = (
g[i] - sum) / h[i * maxIter + i];
360 for (
size_t p = 0; p < nAllVars; ++p)
362 for (
size_t q = 0; q < m; ++q)
363 x[p] += v[p * (maxIter + 1) + q] * y[q];
366 std::cout <<
"#iterations: " << m << std::endl;
368 for (
size_t aflI = 0; aflI < nafl; ++aflI)
370 for (
size_t i = 0; i < vsize[aflI]; ++i)
371 gam[aflI][i] = x[pos[aflI] + i];
374 for (
size_t aflI = 0; aflI < nafl; ++aflI)
375 R[aflI] = x[x.size() - nafl + aflI];
397 std::vector<double>& alpha = sw.
alpha;
398 std::vector<double>& beta = sw.
beta;
399 std::vector<double>& delta = sw.
delta;
400 std::vector<double>& phi = sw.
phi;
401 std::vector<double>& xi = sw.
xi;
405 double len24 = afl.
len[0] * 24.0;
407 alpha[1] = (afl.
tau[0] &
prec1[p][0]) * len24;
408 beta[1] = (afl.
tau[0] &
prea1[p][0]) * len24;
409 delta[1] = -len24 * rhs[n + 0];
412 for (
int i = 1; i < n - 1; ++i)
415 zn = a * alpha[i] - 1.0 / (24.0 * afl.
len[i]);
416 alpha[i + 1] = -(afl.
tau[i] &
prec1[p][i]) / zn;
417 beta[i + 1] = -a * beta[i] / zn;
418 delta[i + 1] = (rhs[n + i] - a * delta[i]) / zn;
421 a = afl.
tau[n - 2] &
prea1[p][n - 2];
422 zn = alpha[n - 2] * a - 1.0 / (24.0 * afl.
len[n - 2]);
423 phi[n - 1] = -((afl.
tau[n - 2] &
prec1[p][n - 2]) + beta[n - 2] * a) / zn;
424 xi[n - 1] = (rhs[n + n - 2] - delta[n - 2] * a) / zn;
426 for (
int i = n - 2; i > 0; --i)
428 phi[i] = alpha[i] * phi[i + 1] + beta[i];
429 xi[i] = alpha[i] * xi[i + 1] + delta[i];
433 double e = (afl.
tau[n - 1] &
prec1[p][n - 1]);
434 a = (afl.
tau[n - 1] &
prea1[p][n - 1]);
436 yn = (rhs[n + n - 1] - e * xi[1] - a * xi[n - 1]) / (e * phi[1] + a * phi[n - 1] - 1.0 / (24.0 * afl.
len[n - 1]));
439 for (
int i = n - 2; i >= 0; --i)
440 AX[n + i] = phi[i + 1] * yn + xi[i + 1];
452 std::vector<double>& alpha = sw.
alpha;
453 std::vector<double>& beta = sw.
beta;
454 std::vector<double>& gamma = sw.
gamma;
455 std::vector<double>& delta = sw.
delta;
456 std::vector<double>& phi = sw.
phi;
457 std::vector<double>& xi = sw.
xi;
458 std::vector<double>& psi = sw.
psi;
461 double lam1, lam2, mu1, mu2, xi1, xi2;
464 double len2 = afl.
len[0] * 2.0;
466 alpha[1] = (afl.
tau[0] &
prec[p][0]) * len2;
467 beta[1] = (afl.
tau[0] &
prea[p][0]) * len2;
469 delta[1] = -len2 * rhs[0];
473 for (
int i = 1; i < n - 1; ++i)
476 zn = a * alpha[i] - 0.5 / afl.
len[i];
477 alpha[i + 1] = -(afl.
tau[i] &
prec[p][i]) / zn;
478 beta[i + 1] = -a * beta[i] / zn;
479 gamma[i + 1] = -(1.0 + a * gamma[i]) / zn;
480 delta[i + 1] = (rhs[i] - a * delta[i]) / zn;
483 a = afl.
tau[n - 2] &
prea[p][n - 2];
484 zn = alpha[n - 2] * a - 0.5 / afl.
len[n - 2];
485 phi[n - 1] = -((afl.
tau[n - 2] &
prec[p][n - 2]) + beta[n - 2] * a) / zn;
486 psi[n - 1] = -(1.0 + gamma[n - 2] * a) / zn;
487 xi[n - 1] = (rhs[n - 2] - delta[n - 2] * a) / zn;
489 for (
int i = n - 2; i > 0; --i)
491 phi[i] = alpha[i] * phi[i + 1] + beta[i];
492 psi[i] = alpha[i] * psi[i + 1] + gamma[i];
493 xi[i] = alpha[i] * xi[i + 1] + delta[i];
496 double e = (afl.
tau[n - 1] &
prec[p][n - 1]);
497 a = (afl.
tau[n - 1] &
prea[p][n - 1]);
498 lam1 = e * phi[1] + a * phi[n - 1] - 0.5 / afl.
len[n - 1];
499 mu1 = e * psi[1] + a * psi[n - 1] + 1.0;
500 xi1 = rhs[n - 1] - e * xi[1] - a * xi[n - 1];
501 lam2 = mu2 = xi2 = 0.0;
502 for (
int j = 0; j < n - 1; ++j)
515 zn = lam1 * mu2 - lam2 * mu1;
516 yn = (xi1 * mu2 - xi2 * mu1) / zn;
517 ynn = -(xi1 * lam2 - xi2 * lam1) / zn;
525 for (
int i = n - 2; i >= 0; --i)
526 AX[i] = phi[i + 1] * yn + psi[i + 1] * ynn + xi[i + 1];
534 Point2D p1, s1, p2, s2, di, dj;
544 for (
size_t i = 0; i < nPanelsP; ++i)
546 std::array<int, 2> vecV = { ((int)i - 1 >= 0) ? int(i - 1) : int(nPanelsP - 1), (i + 1 < nPanelsP) ?
int(i + 1) : 0 };
549 p1 = aflP.
getR(i + 1) - aflP.
getR(j + 1);
550 s1 = aflP.
getR(i + 1) - aflP.
getR(j);
551 p2 = aflP.
getR(i) - aflP.
getR(j + 1);
553 di = aflP.
getR(i + 1) - aflP.
getR(i);
554 dj = aflP.
getR(j + 1) - aflP.
getR(j);
558 VMlib::Alpha(s2, p1), \
564 VMlib::Lambda(s2, p1), \
574 i00 =
IDPI / di.
length() * (-(alpha[0] * v00[0] + alpha[1] * v00[1] + alpha[2] * v00[2]).kcross() \
575 + (lambda[0] * v00[0] + lambda[1] * v00[1] + lambda[2] * v00[2]));
590 i11 = (
IDPI / di.
length()) * ((alpha[0] + alpha[2]) * v11[0] + (alpha[1] + alpha[2]) * v11[1] + alpha[2] * v11[2]\
591 + ((lambda[0] + lambda[2]) * v11[0] + (lambda[1] + lambda[2]) * v11[1] + lambda[2] * v11[2] \
606 cublasCreate(&cublas_handle);
613 for (
size_t s = 0;
s < nAfl; ++
s)
620 cudaMalloc((
void**)&devw, (
totalVsize + nAfl) *
sizeof(
double));
634 for (
int i = 0; i <
iterSize + 1; ++i)
637 for (
int p = 0; p < (int)nAfl; ++p)
641 diag[p].resize(nPanelsP);
643 diag[p].resize(2 * nPanelsP);
656#pragma omp parallel for
657 for (
int p = 0; p < nAfl; ++p)
662 prea[p].resize(nPanelsP);
663 prec[p].resize(nPanelsP);
666 prea1[p].resize(nPanelsP);
667 prec1[p].resize(nPanelsP);
675 for (
size_t p = 0; p < nAfl; ++p)
679 allSW[p].resize(nPanelsP);
682 allBuf2[p].resize(nPanelsP + 1);
684 allBuf2[p].resize(2 * nPanelsP + 1);
714 cublasDestroy(cublas_handle);
731void GmresSolver::GMRES(
732 std::vector<std::vector<double>>& X,
733 std::vector<double>& R,
734 const std::vector<std::vector<double>>& rhs,
735 const std::vector<double>& rhsReg,
739 VMlib::vmTimer tAll(
"All"), tPre(
"Pre"), tIter(
"Iter"), tPost(
"Post"), tIter1(
"Iter1"), tIterOther(
"IterOther"),
740 tCG(
"tCG"), tGC(
"tGC"), tWrapper(
"tWrapper"), tSplit(
"tSplit"), tPrecond(
"tPrecond"), tRot(
"tRot"),
741 tRotA(
"tRotA"), tRotB(
"tRotB"), tRotC(
"tRotC"), tRotD(
"tRotD");
752 double itheta2 = 1.0 / (theta * theta);
756 treePnlInfl.MemoryAllocateForGMRES((
W.
getCurrentStep() == 0), itheta2);
759#pragma omp parallel
for
760 for (
int p = 0; p < (int)nAfl; ++p)
763 for (
int i = 0; i < nPanelsP; ++i)
766 diag[p][i] = 0.5 / lenI;
769 diag[p][i + nPanelsP] = (1.0 / 24.0) / lenI;
774#pragma omp parallel for reduction(+:nrmRhs)
775 for (
int p = 0; p < (int)nAfl; ++p)
776 nrmRhs +=
norm2(rhs[p]);
777 nrmRhs = sqrt(nrmRhs);
782 for (
size_t i = 0; i < nAfl; ++i)
783 Vflat.insert(
Vflat.end(), rhs[i].begin(), rhs[i].end());
785 for (
size_t i = 0; i < nAfl; ++i)
786 Vflat.push_back(rhsReg[i]);
791#pragma omp parallel for
792 for (
int p = 0; p < nAfl; ++p)
797#pragma omp parallel for
798 for (
int p = 0; p < (int)nAfl; ++p)
800 std::vector<double>& vbuf1 =
allBuf2[p];
803 for (
size_t i = 0; i < nPanelsP; ++i)
807 vbuf1[i + nPanelsP] =
Vflat[
np[p] + nPanelsP + i];
817 SolM(vbuf1, vbuf1, p);
821 for (
size_t j =
np[p]; j <
np[p] + nPanelsP; ++j)
825 Vflat[j + nPanelsP] = vbuf1[j -
np[p] + nPanelsP];
831#pragma omp parallel for reduction(+:beta)
837#pragma omp parallel for
855 const double zero = 0.0, unit = 1.0;
876#pragma omp parallel for
886#pragma omp parallel for
904 treePnlInfl.UpwardTraversal(order);
929#pragma omp parallel for
939 for (
size_t pi = 0; pi < nAfl; ++pi)
942#pragma omp parallel for
943 for (
int i = 0; i < (int)nPanelsPi; ++i)
947 w[cntr + i + nPanelsPi] += -
Vflat[(
totalVsize + nAfl) * j + (cntr + i + nPanelsPi)] *
diag[pi][i + nPanelsPi];
955 for (
size_t i = 0; i < nAfl; ++i)
959 for (
size_t i = 0; i < nAfl; ++i)
962 for (
size_t k = 0; k < nPanelsI; ++k)
974#pragma omp parallel for
975 for (
int p = 0; p < (int)nAfl; ++p)
977 std::vector<double>& vbuf2 =
allBuf2[p];
981 for (
size_t i = 0; i < nPanelsP; ++i)
983 vbuf2[i] =
w[
np[p] + i];
985 vbuf2[i + nPanelsP] =
w[
np[p] + nPanelsP + i];
989 vbuf2[nPanelsP] =
w[
w.size() - (nAfl - p)];
991 vbuf2[2 * nPanelsP] =
w[
w.size() - (nAfl - p)];
995 SolM(vbuf2, vbuf2, p);
999 for (
size_t j =
np[p]; j <
np[p] + nPanelsP; ++j)
1001 w[j] = vbuf2[j -
np[p]];
1003 w[j + nPanelsP] = vbuf2[j -
np[p] + nPanelsP];
1006 w[
w.size() - (nAfl - p)] = vbuf2[vbuf2.size() - 1];
1016 if (j ==
H.size() - 1)
1018 std::cout <<
"Reallocation for GMRES" << std::endl;
1019 H.resize(j * 2 + 2);
1020 for (
int i = 0; i < j * 2 + 2; ++i)
1021 H[i].resize(j * 2 + 1);
1031 double* devViBund_new;
1032 cudaMalloc((
void**)&devViBund_new, (
totalVsize + nAfl) * j * 2 *
sizeof(
double));
1033 cudaMemcpy(devViBund_new, devViBund, (
totalVsize + nAfl) * j *
sizeof(
double), cudaMemcpyDeviceToDevice);
1034 cudaFree(devViBund);
1035 devViBund = devViBund_new;
1095 for (
int i = 0; i <= j; ++i)
1100#pragma omp for reduction(+:scal)
1101 for (
int q = 0; q < (int)
w.size(); ++q)
1106 for (
int q = 0; q < (int)
w.size(); ++q)
1132 for (
int t = 0; t < (
totalVsize + nAfl); ++t)
1139 if (
IterRot(nrmRhs, gs, (
int)m,
false))
1169 for (
int i = 0; i < m; i++)
1172 g[i] =
c[i] * oldValue;
1173 g[i + 1] = -
s[i] * oldValue;
1179 Y[m - 1] =
g[m - 1] /
H[m - 1][m - 1];
1182 for (
int k = (
int)m - 2; k >= 0; --k)
1185 for (
int s = k + 1;
s < m; ++
s)
1186 sum +=
H[k][
s] *
Y[
s];
1187 Y[k] = (
g[k] - sum) /
H[k][k];
1192 for (
size_t p = 0; p < nAfl; p++) {
1197 for (
size_t i = 0; i < nPanelsP; i++)
1200 for (
size_t j = 0; j < m; j++)
1205 for (
size_t i = 0; i < 2 * nPanelsP; i++)
1208 for (
size_t j = 0; j < m; j++)
1221 for (
size_t p = 0; p < nAfl; p++)
1223 for (
size_t j = 0; j < m; j++)
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Eigen::Map< const Eigen::VectorXd > MapVec
Заголовочный файл с функциями для метода GMRES.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса Mechanics.
Заголовочный файл с описанием класса Preprocessor.
Заголовочный файл с описанием класса StreamParser.
Заголовочный файл с описанием класса Velocity.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
std::vector< double > len
Длины панелей профиля
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
std::vector< Point2D > tau
Касательные к панелям профиля
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
Абстрактный класс, определяющий обтекаемый профиль
bool isAfter(size_t i, size_t j) const
Проверка, идет ли вершина i следом за вершиной j.
std::vector< double > bufcurrentSol
void SolCircleRun(std::vector< double > &AX, const std::vector< double > &rhs, int p)
std::vector< std::vector< Point2D > > prec
void SolMdirect(const std::vector< double > &A, const std::vector< double > &rhs, size_t startRow, size_t startRowReg, size_t np, std::vector< double > &res, bool lin)
std::vector< std::vector< double > > allBuf2
std::vector< std::vector< Point2D > > prea1
std::vector< std::vector< Point2D > > prea
std::vector< double > bufnewSol
std::vector< std::vector< double > > H
void PreCalculateCoef(int aflIndex)
void SolCircleRundirect(const std::vector< double > &A, const std::vector< double > &rhs, size_t startRow, size_t startRowReg, size_t np, std::vector< double > &res)
std::vector< double > Vflat
std::vector< sweepVectors > allSW
GmresSolver(const World2D &W_)
bool IterRot(const double nrmRhs, double &gs, int m, bool residualShow)
Контроль невязки после выполнения очередной итерации GMRES.
void GMRES_Direct(int nAllVars, int nafl, const std::vector< double > &mtrDir, const std::vector< double > &rhsDir, const std::vector< int > &pos, const std::vector< int > &vsize, std::vector< std::vector< double > > &gam, std::vector< double > &R)
std::vector< std::vector< double > > diag
std::vector< std::vector< Point2D > > prec1
void SolM(std::vector< double > &AX, const std::vector< double > &rhs, int p)
NumericalSchemes numericalSchemes
Структура с используемыми численными схемами
Класс, опеделяющий текущую решаемую задачу
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
bool isAnyMovableOrDeformable() const
Возврат признака того, что хотя бы один из профилей подвижный или деформируемый
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Gpu & getNonConstCuda() const
Возврат неконстантной ссылки на объект, связанный с видеокартой (GPU)
const Gpu & getCuda() const
Возврат константной ссылки на объект, связанный с видеокартой (GPU)
const Passport & getPassport() const
Возврат константной ссылки на паспорт
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
Шаблонный класс, определяющий вектор фиксированной длины Фактически представляет собой массив,...
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
auto unit(P newlen=1) const -> numvector< typename std::remove_const< decltype(this->data[0] *newlen)>::type, n >
Вычисление орта вектора или вектора заданной длины, коллинеарного данному
P length() const
Вычисление 2-нормы (длины) вектора
double norm(const std::vector< T > &b)
Шаблонная функция вычисления евклидовой нормы вектора или списка
double norm2(const std::vector< T > &b)
Шаблонная функция вычисления евклидовой нормы вектора или списка
double Lambda(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления логарифма отношения норм векторов
double Alpha(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления угла между векторами
Point2D Omega(const Point2D &a, const Point2D &b, const Point2D &c)
Вспомогательная функция вычисления величины .
std::pair< std::string, int > boundaryCondition
Метод аппроксимации граничных условий
Структура, определяющий необходимые массивы для рализации метода прогонки
std::vector< double > phi
std::vector< double > beta
std::vector< double > psi
std::vector< double > delta
std::vector< double > alpha
std::vector< double > gamma