PLaSK library

Loading...
Searching...
No Matches
broyden.hpp
Go to the documentation of this file.
1/*
2 * This file is part of PLaSK (https://plask.app) by Photonics Group at TUL
3 * Copyright (c) 2022 Lodz University of Technology
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, version 3.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 */
14#ifndef PLASK__OPTICAL_EFFECTIVE_BROYDEN_H
15#define PLASK__OPTICAL_EFFECTIVE_BROYDEN_H
16
17#include "rootdigger.hpp"
18
19 namespace plask { namespace optical { namespace effective {
20
21 class RootBroyden: public RootDigger {
22
23 // Parameters for Broyden algorithm
24 static constexpr double EPS = 1e6 * SMALL;
25
26 // Return Jacobian of F(x)
27 void fdjac(dcomplex x, dcomplex F, dcomplex& Jr, dcomplex& Ji) const;
28
29 // Search for the new point x along direction p for which f decreased sufficiently
30 bool lnsearch(dcomplex& x, dcomplex& F, dcomplex g, dcomplex p, double stpmax) const;
31
32 // Search for the root of char_val using globally convergent Broyden method
33 dcomplex Broyden(dcomplex x) const;
34
35 // Write log message
36 template <typename... Args>
37 void writelog(LogLevel level, const std::string& msg, Args&&... args) const {
38 std::string prefix = solver.getId(); prefix += ": "; prefix += log_value.chartName(); prefix += ": ";
39 plask::writelog(level, prefix + msg, std::forward<Args>(args)...);
40 }
41
42 public:
43
44 // Constructor
45 RootBroyden(Solver& solver, const function_type& val_fun, DataLog<dcomplex,dcomplex>& log_value,
46 const Params& pars): RootDigger(solver, val_fun, log_value, pars) {}
47
48 dcomplex find(dcomplex start) const override;
49};
50
51}}} // namespace plask::optical::effective
52#endif // PLASK__OPTICAL_EFFECTIVE_BROYDEN_H