PLaSK library

Loading...
Searching...
No Matches
bisection.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_BISECTION_H
15#define PLASK__OPTICAL_EFFECTIVE_BISECTION_H
16
17#include <plask/plask.hpp>
18
19 namespace plask { namespace optical { namespace effective {
20
21 struct Contour {
22
23 const Solver* solver;
24
25 const std::function<dcomplex(dcomplex)>& fun;
26
27 double re0,
28 im0,
29 re1,
30 im1;
31
32 DataVector<dcomplex> bottom,
33 right,
34 top,
35 left;
36
37 Contour(const Solver* solver, const std::function<dcomplex(dcomplex)>& fun): solver(solver), fun(fun) {};
38
39 Contour(const Contour& src): solver(src.solver), fun(src.fun), re0(src.re0), im0(src.im0), re1(src.re1), im1(src.im1),
40 bottom(src.bottom), right(src.right), top(src.top), left(src.left) {}
41
42 Contour(Contour&& src): solver(src.solver), fun(src.fun), re0(src.re0), im0(src.im0), re1(src.re1), im1(src.im1),
43 bottom(std::move(src.bottom)), right(std::move(src.right)), top(std::move(src.top)), left(std::move(src.left)) {}
44
52 Contour(const Solver* solver, const std::function<dcomplex(dcomplex)>& fun, dcomplex corner0, dcomplex corner1, size_t ren, size_t imn);
53
58 int winding() const {
59 return crossings(bottom, re0,im0, re1,im0)
60 + crossings(right, re1,im0, re1,im1)
61 - crossings(top, re1,im1, re0,im1)
62 - crossings(left, re0,im1, re0,im0);
63 }
64
72 std::pair<Contour,Contour> divide(double reps, double ieps) const;
73
74 private:
75
77 int crossings(const DataVector<dcomplex>& line, double r0, double i0, double r1, double i1) const;
78
79};
80
90std::vector<std::pair<dcomplex,dcomplex>> findZeros(const Solver* solver, const std::function<dcomplex(dcomplex)>& fun,
91 dcomplex corner0, dcomplex corner1, size_t resteps, size_t imsteps, dcomplex eps);
92
93}}} // namespace plask::optical::effective
94
95#endif // PLASK__OPTICAL_EFFECTIVE_BISECTION_H