preCICE v3.2.0
Loading...
Searching...
No Matches
IQNILSAcceleration.cpp
Go to the documentation of this file.
2#include <Eigen/Core>
3#include <algorithm>
4#include <deque>
5#include <memory>
6#include <utility>
7
11#include "com/Communication.hpp"
12#include "com/SharedPointer.hpp"
15#include "logging/LogMacros.hpp"
17#include "utils/Helpers.hpp"
18#include "utils/IntraComm.hpp"
19#include "utils/assertion.hpp"
20
21// #include "utils/NumericalCompare.hpp"
22
24
25namespace precice::acceleration {
26
28 double initialRelaxation,
29 bool forceInitialRelaxation,
30 int maxIterationsUsed,
31 int pastTimeWindowsReused,
32 int filter,
33 double singularityLimit,
34 std::vector<int> dataIDs,
35 impl::PtrPreconditioner preconditioner,
36 bool reducedTimeGrid)
37 : BaseQNAcceleration(initialRelaxation, forceInitialRelaxation, maxIterationsUsed, pastTimeWindowsReused,
38 filter, singularityLimit, std::move(dataIDs), std::move(preconditioner), reducedTimeGrid)
39{
40}
41
43 const DataMap &cplData)
44{
45 // call the base method for common update of V, W matrices
47}
48
49void IQNILSAcceleration::computeQNUpdate(Eigen::VectorXd &xUpdate)
50{
52 PRECICE_DEBUG(" Compute Newton factors");
53
54 // Calculate QR decomposition of matrix V and solve Rc = -Qr
55 Eigen::VectorXd c;
56
57 // for procs with no vertices,
58 // qrV.cols() = getLSSystemCols() and _qrV.rows() = 0
59 auto Q = _qrV.matrixQ();
60 auto R = _qrV.matrixR();
61
64 PRECICE_ASSERT(_qrV.rows() == 0, _qrV.rows());
65 PRECICE_ASSERT(Q.size() == 0, Q.size());
66 }
67
68 Eigen::VectorXd _local_b = Eigen::VectorXd::Zero(_qrV.cols());
69 Eigen::VectorXd _global_b;
70
71 // need to scale the residual to compensate for the scaling in c = R^-1 * Q^T * P^-1 * residual'
72 // it is also possible to apply the inverse scaling weights from the right to the vector c
74 _local_b = Q.transpose() * _primaryResiduals;
76 _local_b *= -1.0; // = -Qr
77
78 PRECICE_ASSERT(c.size() == 0, c.size());
79 // reserve memory for c
80 utils::append(c, Eigen::VectorXd(Eigen::VectorXd::Zero(_local_b.size())));
81
82 // compute rhs Q^T*res in parallel
84 PRECICE_ASSERT(Q.cols() == getLSSystemCols(), Q.cols(), getLSSystemCols());
85 // back substitution
86 c = R.triangularView<Eigen::Upper>().solve<Eigen::OnTheLeft>(_local_b);
87 } else {
91 PRECICE_ASSERT(Q.cols() == getLSSystemCols(), Q.cols(), getLSSystemCols());
92 }
93 PRECICE_ASSERT(_local_b.size() == getLSSystemCols(), _local_b.size(), getLSSystemCols());
94
96 PRECICE_ASSERT(_global_b.size() == 0, _global_b.size());
97 }
98 utils::append(_global_b, Eigen::VectorXd(Eigen::VectorXd::Zero(_local_b.size())));
99
100 // do a reduce operation to sum up all the _local_b vectors
101 utils::IntraComm::reduceSum(_local_b, _global_b);
102
103 // back substitution R*c = b only on the primary rank
105 c = R.triangularView<Eigen::Upper>().solve<Eigen::OnTheLeft>(_global_b);
106 }
107
108 // broadcast coefficients c to all secondary ranks
110 }
111
112 PRECICE_DEBUG(" Apply Newton factors");
113 // compute x updates from W and coefficients c, i.e, xUpdate = c*W
114 xUpdate = _matrixW * c;
115}
116
118 const DataMap &cplData)
119{
121 if (_matrixCols.empty()) {
122 PRECICE_WARN("The IQN matrix has no columns.");
123 } else {
124 if (_matrixCols.front() == 0) { // Did only one iteration
125 _matrixCols.pop_front();
126 }
127 }
128}
129
131 int columnIndex)
132{
133 PRECICE_ASSERT(_matrixV.cols() > 1);
135}
136} // namespace precice::acceleration
#define PRECICE_WARN(...)
Definition LogMacros.hpp:12
#define PRECICE_DEBUG(...)
Definition LogMacros.hpp:61
#define PRECICE_TRACE(...)
Definition LogMacros.hpp:92
#define PRECICE_ASSERT(...)
Definition assertion.hpp:85
std::map< int, cplscheme::PtrCouplingData > DataMap
Map from data ID to data values.
virtual void updateDifferenceMatrices(const DataMap &cplData)
Updates the V, W matrices (as well as the matrices for the secondary data)
int getLSSystemCols() const
: computes number of cols in least squares system, i.e, number of cols in _matrixV,...
Eigen::VectorXd _primaryResiduals
Current iteration residuals of primary IQN data. Temporary.
Eigen::MatrixXd _matrixV
Stores residual deltas.
virtual void removeMatrixColumn(int columnIndex)
Removes one iteration from V,W matrices and adapts _matrixCols.
Eigen::MatrixXd _matrixW
Stores x tilde deltas, where x tilde are values computed by solvers.
BaseQNAcceleration(double initialRelaxation, bool forceInitialRelaxation, int maxIterationsUsed, int timeWindowsReused, int filter, double singularityLimit, std::vector< int > dataIDs, impl::PtrPreconditioner preconditioner, bool reducedTimeGrid)
std::deque< int > _matrixCols
Indices (of columns in W, V matrices) of 1st iterations of time windows.
impl::PtrPreconditioner _preconditioner
Preconditioner for least-squares system if vectorial system is used.
impl::QRFactorization _qrV
Stores the current QR decomposition ov _matrixV, can be updated via deletion/insertion of columns.
IQNILSAcceleration(double initialRelaxation, bool forceInitialRelaxation, int maxIterationsUsed, int pastTimeWindowsReused, int filter, double singularityLimit, std::vector< int > dataIDs, impl::PtrPreconditioner preconditioner, bool reducedTimeGrid)
void specializedIterationsConverged(const DataMap &cplData) override
Marks a iteration sequence as converged.
void removeMatrixColumn(int columnIndex) override
Removes one iteration from V,W matrices and adapts _matrixCols.
void computeQNUpdate(Eigen::VectorXd &xUpdate) override
computes the IQN-ILS update using QR decomposition
void updateDifferenceMatrices(const DataMap &cplData) override
updates the V, W matrices (as well as the matrices for the secondary data)
static bool isPrimary()
True if this process is running the primary rank.
Definition IntraComm.cpp:52
static void broadcast(bool &value)
static bool isParallel()
True if this process is running in parallel.
Definition IntraComm.cpp:62
static com::PtrCommunication & getCommunication()
Intra-participant communication.
Definition IntraComm.hpp:31
static void reduceSum(precice::span< const double > sendData, precice::span< double > rcvData)
std::shared_ptr< Preconditioner > PtrPreconditioner
contains implementations of acceleration schemes.
std::shared_ptr< CouplingData > PtrCouplingData
void append(Eigen::VectorXd &v, double value)
STL namespace.