39 virtual void initialize(std::vector<size_t> svs, std::vector<std::string> svNames)
62 void apply(Eigen::MatrixXd &M,
bool transpose)
68 int validCols = std::min(
static_cast<int>(M.cols()), (
int)
_weights.size());
69 for (
int i = 0; i < validCols; i++) {
70 for (
int j = 0; j < M.rows(); j++) {
77 int validRows = std::min(
static_cast<int>(M.rows()), (
int)
_weights.size());
78 for (
int i = 0; i < M.cols(); i++) {
79 for (
int j = 0; j < validRows; j++) {
90 void revert(Eigen::MatrixXd &M,
bool transpose)
97 int validCols = std::min(
static_cast<int>(M.cols()), (
int)
_weights.size());
98 for (
int i = 0; i < validCols; i++) {
99 for (
int j = 0; j < M.rows(); j++) {
106 int validRows = std::min(
static_cast<int>(M.rows()), (
int)
_weights.size());
107 for (
int i = 0; i < M.cols(); i++) {
108 for (
int j = 0; j < validRows; j++) {
122 int validRows = std::min(
static_cast<int>(M.rows()), (
int)
_weights.size());
123 for (
int i = 0; i < M.cols(); i++) {
124 for (
int j = 0; j < validRows; j++) {
137 int validSize = std::min(
static_cast<int>(v.size()), (
int)
_weights.size());
138 for (
int j = 0; j < validSize; j++) {
150 int validRows = std::min(
static_cast<int>(M.rows()), (
int)
_weights.size());
151 for (
int i = 0; i < M.cols(); i++) {
152 for (
int j = 0; j < validRows; j++) {
165 int validSize = std::min(
static_cast<int>(v.size()), (
int)
_weights.size());
166 for (
int j = 0; j < validSize; j++) {
176 void update(
bool timeWindowComplete,
const Eigen::VectorXd &oldValues,
const Eigen::VectorXd &res)
185 if (timeWindowComplete) {
192 _update_(timeWindowComplete, oldValues, res);
253 virtual void _update_(
bool timeWindowComplete,
const Eigen::VectorXd &oldValues,
const Eigen::VectorXd &res) = 0;
#define PRECICE_DEBUG_IF(condition,...)
#define PRECICE_TRACE(...)
#define PRECICE_ASSERT(...)
void apply(Eigen::MatrixXd &M, bool transpose)
Apply preconditioner to matrix.
void revert(Eigen::MatrixXd &M, bool transpose)
Apply inverse preconditioner to matrix.
int _nbNonConstTimeWindows
Counts the number of completed time windows with a non-const weighting.
std::vector< size_t > _subVectorSizes
Sizes of each sub-vector, i.e. each coupling data.
void newQRfulfilled()
to tell the preconditioner that QR-decomposition has been recomputed
void update(bool timeWindowComplete, const Eigen::VectorXd &oldValues, const Eigen::VectorXd &res)
Update the scaling after every FSI iteration and require a new QR decomposition (if necessary)
Preconditioner(int maxNonConstTimeWindows)
virtual void _update_(bool timeWindowComplete, const Eigen::VectorXd &oldValues, const Eigen::VectorXd &res)=0
Update the scaling after every FSI iteration and require a new QR decomposition (if necessary)
virtual void initialize(std::vector< size_t > svs, std::vector< std::string > svNames)
initialize the preconditioner
std::vector< double > & getWeights()
virtual ~Preconditioner()=default
Destructor, empty.
void revert(Eigen::MatrixXd &M)
To transform balanced values back to physical values. Matrix version.
std::vector< double > _invWeights
Inverse weights (for efficiency reasons)
bool requireNewQR()
returns true if a QR decomposition from scratch is necessary
int _maxNonConstTimeWindows
maximum number of non-const time windows, i.e., after this number of time windows,...
std::vector< double > _weights
Weights used to scale the matrix V and the residual.
std::vector< std::string > _subVectorNames
Names of the coupling data corresponding to each sub-vector.
void revert(Eigen::VectorXd &v)
To transform balanced values back to physical values. Vector version.
std::vector< size_t > _subVectorOffsets
Offsets of each sub-vector in concatenated data, i.e. each coupling data.
bool _requireNewQR
True if a QR decomposition from scratch is necessary.
void apply(Eigen::VectorXd &v)
To transform physical values to balanced values. Vector version.
void apply(Eigen::MatrixXd &M)
To transform physical values to balanced values. Matrix version.
bool _frozen
True if _nbNonConstTimeWindows >= _maxNonConstTimeWindows, i.e., preconditioner is not updated any mo...
This class provides a lightweight logger.