Simplified modified broyden_mixing method. Ref: D.D. Johnson PRB 38, 12807 (1988) Here the weight w0 of the error of the inverse Jacobian is set to 0 and the weight wn of the error of each previous iteration is set to same.
More...
|
| Broyden_Mixing (const int &mixing_ndim) |
|
| Broyden_Mixing (const int &mixing_ndim, const double &mixing_beta) |
|
virtual | ~Broyden_Mixing () override |
|
virtual void | reset () override |
| reset mixing
|
|
virtual void | push_data (Mixing_Data &mdata, const double *data_in, const double *data_out, std::function< void(double *)> screen, std::function< void(double *, const double *, const double *)> mix, const bool &need_calcoef) override |
|
virtual void | push_data (Mixing_Data &mdata, const std::complex< double > *data_in, const std::complex< double > *data_out, std::function< void(std::complex< double > *)> screen, std::function< void(std::complex< double > *, const std::complex< double > *, const std::complex< double > *)> mix, const bool &need_calcoef) override |
|
virtual void | cal_coef (const Mixing_Data &mdata, std::function< double(double *, double *)> inner_product) override |
| calculate coeficients for mixing
|
|
virtual void | cal_coef (const Mixing_Data &mdata, std::function< double(std::complex< double > *, std::complex< double > *)> inner_product) override |
|
virtual void | push_data (Mixing_Data &mdata, const double *data_in, const double *data_out, std::function< void(double *)> screen, std::function< void(double *, const double *, const double *)> mix, const bool &need_calcoef)=0 |
|
virtual void | push_data (Mixing_Data &mdata, const std::complex< double > *data_in, const std::complex< double > *data_out, std::function< void(std::complex< double > *)> screen, std::function< void(std::complex< double > *, const std::complex< double > *, const std::complex< double > *)> mix, const bool &need_calcoef)=0 |
|
virtual void | push_data (Mixing_Data &mdata, const double *data_in, const double *data_out, std::function< void(double *)> screen, const bool &need_calcoef) |
|
virtual void | push_data (Mixing_Data &mdata, const std::complex< double > *data_in, const std::complex< double > *data_out, std::function< void(std::complex< double > *)> screen, const bool &need_calcoef) |
|
| Mixing () |
|
virtual | ~Mixing () |
|
virtual void | init_mixing_data (Mixing_Data &mdata, const int &length, const size_t &type_size) const |
| init mixing data
|
|
void | mix_data (const Mixing_Data &mdata, double *data_mix) |
| calculate the mixing data
|
|
void | mix_data (const Mixing_Data &mdata, std::complex< double > *data_mix) |
|
Simplified modified broyden_mixing method. Ref: D.D. Johnson PRB 38, 12807 (1988) Here the weight w0 of the error of the inverse Jacobian is set to 0 and the weight wn of the error of each previous iteration is set to same.
- Note
- Formula: F = n_out - n_in dF{i} = F_{i-1} - F{i} //different from Ref dn_in{i} = n_in_{i-1} - n_in{i} //different from Ref alpha{ij} = <dF{i}, dF{j}> beta{ij} = inv(alpha){ij} c{mk} = <dF{k}, F{m}> gamma{mn} = \sum_k c{mk} * beta{kn} n{m+1} = n_in{m} + mixing_beta*F{m} - \sum_n gamma{mn} * (dn_in{n} + mixing_beta*dF{n}) mixing_data{i} = n_in{i} + mixing_beta*F{i} n{m+1} = \sum_i coef{i} * mixing_data{i}