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}