IgANet
IGAnets - Isogeometric Analysis Networks
Loading...
Searching...
No Matches
solver.hpp
Go to the documentation of this file.
1
15#pragma once
16
17#include <core/core.hpp>
18
19namespace iganet::utils {
20
23 auto solve_cg(const torch::Tensor& A,
24 const torch::Tensor b,
25 int max_iter = 1000,
26 double tol = 1e-10) {
27
28 auto x = torch::zeros_like(b);
29
30 if (b.norm().item<double>() < tol)
31 return std::make_tuple(x, -1, b.norm().item<double>());
32
33 auto r = b.clone();
34 auto p = b.clone();
35
36 for (int iter = 0; iter < max_iter; iter++) {
37
38 auto Ap = A.matmul(p);
39 auto beta = torch::dot(r, r);
40 auto alpha = beta / torch::dot(Ap, p);
41
42 x += alpha * p;
43 r -= alpha * Ap;
44
45 if (r.norm().item<double>() < tol)
46 return std::make_tuple(x, iter, r.norm().item<double>());
47
48 beta = torch::dot(r, r) / beta;
49 p = r + beta * p;
50 }
51
52 return std::make_tuple(x, max_iter, r.norm().item<double>());
53 }
54
57 auto solve_bicgstab(const torch::Tensor& A,
58 const torch::Tensor b,
59 int max_iter = 1000,
60 double tol = 1e-10) {
61
62 auto x = torch::zeros_like(b);
63
64 if (b.norm().item<double>() < tol)
65 return std::make_tuple(x, -1, b.norm().item<double>());
66
67 auto r = b.clone();
68 auto r_hat = b.clone();
69
70 auto alpha = torch::scalar_tensor(1.0, b.options());
71 auto omega = torch::scalar_tensor(1.0, b.options());
72 auto rho = torch::scalar_tensor(1.0, b.options());
73
74 auto p = torch::zeros_like(b);
75 auto v = torch::zeros_like(b);
76
77 for (int iter = 0; iter < max_iter; iter++) {
78
79 auto rho_hat = torch::dot(r_hat, r);
80 auto beta = rho_hat / rho * alpha / omega;
81
82 p = r + beta * (p - omega * v);
83 v = A.matmul(p);
84
85 alpha = rho_hat / torch::dot(r_hat, v);
86 auto s = r - alpha * v;
87
88 if (s.norm().item<double>() < tol) {
89 x += alpha * p;
90 return std::make_tuple(x, iter, s.norm().item<double>());
91 }
92
93 auto t = A.matmul(s);
94 omega = torch::dot(s, t) / torch::dot(t, t);
95 x += alpha * p + omega * s;
96 r = s - omega * t;
97 }
98
99 return std::make_tuple(x, max_iter, r.norm().item<double>());
100 }
101} // namespace iganet::utils
Core components.
Definition blocktensor.hpp:24
auto solve_cg(const torch::Tensor &A, const torch::Tensor b, int max_iter=1000, double tol=1e-10)
Solves the linear system A * x = b using the Conjugate Gradient (CG) method.
Definition solver.hpp:23
auto solve_bicgstab(const torch::Tensor &A, const torch::Tensor b, int max_iter=1000, double tol=1e-10)
Solves the linear system A * x = b using the Bi-Conjugate Gradient Stabilized (BiCGStab) method.
Definition solver.hpp:57