Skip to content

Commit 3bdb7ac

Browse files
committed
update
1 parent 3c71cd4 commit 3bdb7ac

8 files changed

Lines changed: 368 additions & 303 deletions

File tree

SuPyMode/Solver.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@ class SuPySolver(object):
1313
"""
1414
_Sorting = None
1515

16-
def __init__(self, Coupler, Tolerance, MaxIter, Error=2, debug='INFO'):
16+
def __init__(self, Coupler, Tolerance, MaxIter, Error=2, Debug=True):
1717

1818
Coupler.CreateMesh()
1919
self.Geometry = Coupler
2020
self.Tolerance = Tolerance
2121
self.MaxIter = MaxIter
2222
self.Error = Error
23-
self.CppSolvers = []
23+
self.SolverNumber = 0
24+
self.Debug = Debug
2425

2526

2627

@@ -36,7 +37,7 @@ def InitBinding(self, Symmetries: dict, Wavelength: float, nMode: int, sMode: in
3637
dx = self.Axes.dx,
3738
dy = self.Axes.dy,
3839
Wavelength = Wavelength,
39-
Debug = False
40+
Debug = self.Debug
4041
)
4142

4243
CppSolver.TopSymmetry = Symmetries['Top']
@@ -47,7 +48,6 @@ def InitBinding(self, Symmetries: dict, Wavelength: float, nMode: int, sMode: in
4748

4849
CppSolver.ComputeLaplacian(self.Error)
4950

50-
self.CppSolvers.append(CppSolver)
5151

5252
return CppSolver
5353

@@ -76,8 +76,13 @@ def AddModes(self,
7676

7777
CppSolver.ComputeCouplingAdiabatic()
7878

79+
7980
for BindingNumber in range(CppSolver.sMode):
80-
self.Set.AppendSuperMode(CppSolver=CppSolver, BindingNumber=BindingNumber)
81+
self.Set.AppendSuperMode(CppSolver=CppSolver, BindingNumber=BindingNumber, SolverNumber=self.SolverNumber)
82+
83+
self.SolverNumber += 1
84+
85+
8186

8287

8388
def GetSet(self):

SuPyMode/SuperMode.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -296,8 +296,8 @@ def Axes(self):
296296
return self.ParentSolver.Geometry.Axes
297297

298298

299-
def AppendSuperMode(self, CppSolver, BindingNumber):
300-
superMode = SuperMode(ParentSet=self, ModeNumber=self.NextMode, CppSolver=CppSolver, BindingNumber=BindingNumber )
299+
def AppendSuperMode(self, CppSolver, BindingNumber, SolverNumber):
300+
superMode = SuperMode(ParentSet=self, ModeNumber=self.NextMode, CppSolver=CppSolver, BindingNumber=BindingNumber, SolverNumber=SolverNumber )
301301

302302
self.SuperModes.append( superMode )
303303

@@ -337,9 +337,12 @@ class SuperMode(ReprBase):
337337
"PlotBetas",
338338
"PlotPropagation"]
339339

340-
def __init__(self, ParentSet, ModeNumber, CppSolver, BindingNumber):
340+
def __init__(self, ParentSet, ModeNumber, CppSolver, BindingNumber, SolverNumber):
341341
self.Binded = CppSolver.GetMode(BindingNumber)
342342
self.ModeNumber = ModeNumber
343+
self.SolverNumber = SolverNumber
344+
self.ID = [SolverNumber, BindingNumber]
345+
self.Name = f"Mode {self.ID[0]}:{self.ID[1]}"
343346

344347
self.CppSolver = CppSolver
345348
self.ParentSet = ParentSet
@@ -423,7 +426,7 @@ def PlotIndex(self):
423426
x = self.ITRList,
424427
y = self.Index,
425428
Fill = False,
426-
Legend = self.ModeNumber,
429+
Legend = self.Name,
427430
xLabel = r'ITR',
428431
yLabel = r'Effective refractive index n$_{eff}$')
429432

@@ -439,7 +442,7 @@ def PlotBetas(self):
439442
x = self.ITRList,
440443
y = self.Betas,
441444
Fill = False,
442-
Legend = self.ModeNumber,
445+
Legend = self.Name,
443446
xLabel = r'ITR',
444447
yLabel = r'Propagation constante $\beta$')
445448

@@ -457,7 +460,8 @@ def PlotFields(self, Slice: list):
457460
y = self.FullyAxis,
458461
Scalar = self.FullFields[slice].T,
459462
xLabel = r'X-Direction [$\mu m$]',
460-
yLabel = r'Y-direction [$\mu m$]')
463+
yLabel = r'Y-direction [$\mu m$]',
464+
Title = self.Name)
461465

462466
Scene.SetAxes(Row=0, Col=n, Equal=True, Legend=False)
463467
Scene.Show()

SuPyMode/Tools/BaseClass.py

Lines changed: 44 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -49,56 +49,65 @@ def PlotIndex(self, Scene, Col, Row):
4949
x = self.ITRList,
5050
y = supermode.Index,
5151
Fill = False,
52-
Legend = supermode.ModeNumber,
52+
Legend = supermode.Name,
5353
xLabel = r'ITR',
5454
yLabel = r'Effective refractive index n$_{eff}$')
5555

5656
Scene.SetAxes(Col, Row, Equal=False, Legend=True, yLimits=[self.Geometry.MinIndex/1.005, self.Geometry.MaxIndex], LegendTitle='Mode')
5757

5858

59-
def PlotBeta(self, Scene, Col, Row):
59+
def PlotBetas(self, Scene, Col, Row):
6060
for supermode in self.SuperModes:
6161
Scene.AddLine(Row = Row,
6262
Col = Col,
6363
x = self.ITRList,
6464
y = supermode.Betas,
6565
Fill = False,
66-
Legend = supermode.ModeNumber,
66+
Legend = supermode.Name,
6767
xLabel = r'ITR',
6868
yLabel = r'Propagation constante $\beta$')
6969

7070
Scene.SetAxes(Col, Row, Equal=False, Legend=True, LegendTitle='Mode')
7171

7272

73-
def PlotCoupling(self, Scene, Col, Row, Combination):
74-
for supermode in self.SuperModes:
75-
print(supermode.Adiabatic.shape)
76-
Coupling = supermode.Coupling.T
77-
Scene.AddLine(Row = Row,
78-
Col = Col,
79-
x = self.ITRList,
80-
y = Mode0.Adiabatic[:, Mode1.ModeNumber],
81-
Fill = False,
82-
Legend = f'{Mode0.ModeNumber} - {Mode1.ModeNumber}',
83-
xLabel = r'ITR',
84-
yLabel = r'Mode coupling')
73+
def PlotCoupling(self, Scene, Col, Row):
74+
Done = []
75+
for Mode0 in self.SuperModes:
76+
for Mode1 in self.SuperModes:
77+
ID = (Mode0.ID, Mode1.ID)
78+
if ID in Done or ID[::-1] in Done or ID[0]==ID[1] or ID[0][0] != ID[1][0]: continue
8579

86-
Scene.SetAxes(Col, Row, Equal=False, Legend=True, LegendTitle='Mode')
80+
Scene.AddLine(Row = Row,
81+
Col = Col,
82+
x = self.ITRList,
83+
y = Mode0.Coupling[:, ID[1][1]],
84+
Fill = False,
85+
Legend = f'{Mode0.Name} - {Mode1.Name}',
86+
xLabel = r'ITR',
87+
yLabel = r'Coupling factor')
8788

89+
Scene.SetAxes(Col, Row, Equal=False, Legend=True, yScale='log', yLimits=[1e-8, 1e-1], LegendTitle='Mode')
90+
Done.append(ID)
8891

89-
def PlotAdiabatic(self, Scene, Col, Row, Combination):
9092

91-
for (Mode0, Mode1) in Combination:
92-
Scene.AddLine(Row = Row,
93-
Col = Col,
94-
x = self.ITRList,
95-
y = Mode0.Adiabatic[:, Mode1.ModeNumber],
96-
Fill = False,
97-
Legend = f'{Mode0.ModeNumber} - {Mode1.ModeNumber}',
98-
xLabel = r'ITR',
99-
yLabel = r'Adiabatic criterion')
93+
def PlotAdiabatic(self, Scene, Col, Row):
94+
Done = []
95+
for Mode0 in self.SuperModes:
96+
for Mode1 in self.SuperModes:
97+
ID = (Mode0.ID, Mode1.ID)
98+
if ID in Done or ID[::-1] in Done or ID[0]==ID[1] or ID[0][0] != ID[1][0]: continue
99+
100+
Scene.AddLine(Row = Row,
101+
Col = Col,
102+
x = self.ITRList,
103+
y = Mode0.Adiabatic[:, ID[1][1]],
104+
Fill = False,
105+
Legend = f'{Mode0.Name} - {Mode1.Name}',
106+
xLabel = r'ITR',
107+
yLabel = r'Adiabatic criterion')
100108

101-
Scene.SetAxes(Col, Row, Equal=False, Legend=True, yScale='log', yLimits=[1e-8, 1e-1], LegendTitle='Mode')
109+
Scene.SetAxes(Col, Row, Equal=False, Legend=True, yScale='log', yLimits=[1e-8, 1e-1], LegendTitle='Mode')
110+
Done.append(ID)
102111

103112

104113
def _PlotFields(self, Slices=0):
@@ -117,55 +126,43 @@ def _PlotFields(self, Slices=0):
117126
ColorMap = FieldMap,
118127
xLabel = r'X-distance [$\mu$m]',
119128
yLabel = r'Y-distance [$\mu$m]' if supermode.ModeNumber==0 else "",
120-
Title = f'Mode: {supermode.ModeNumber} [ITR: {self.ITRList[slice]:.2f}]'
129+
Title = f'{supermode.Name} [ITR: {self.ITRList[slice]:.2f}]'
121130
)
122131

123132
Scene.SetAxes(supermode.ModeNumber, s, Equal=True)
124133

125134
return Scene
126135

127136

128-
129-
130137
def PlotFields(self, Slices=0):
131138
Scene = self._PlotFields(Slices=Slices)
132139

133140
Scene.Show()
134141

135142

136-
def GetCombination(self, Combination):
137-
if Combination is None:
138-
return tuple( combinations( self.SuperModes, 2 ) )
139-
else:
140-
Output = []
141-
for (c0, c1) in Combination:
142-
Output.append( ( self.SuperModes[c0], self.SuperModes[c1] ) )
143-
144-
def _Plot(self, Input, iter=0, Combination=None):
143+
def _Plot(self, Input, iter=0):
145144
Input = ToList(Input)
146145

147-
Combination = self.GetCombination(Combination)
148-
149146
Scene = Scene2D(nCols=1, nRows=len(Input), ColorBar=False)
150147

151148
i = 0
152149
if 'Index' in Input:
153150
self.PlotIndex(Scene, 0, i); i += 1
154151

155-
if 'Beta' in Input:
156-
self.PlotBeta(Scene, 0, i); i += 1
152+
if 'Betas' in Input:
153+
self.PlotBetas(Scene, 0, i); i += 1
157154

158155
if 'Coupling' in Input:
159-
self.PlotCoupling(Scene, 0, i, Combination); i += 1
156+
self.PlotCoupling(Scene, 0, i); i += 1
160157

161158
if 'Adiabatic' in Input:
162-
self.PlotAdiabatic(Scene, 0, i, Combination); i += 1
159+
self.PlotAdiabatic(Scene, 0, i); i += 1
163160

164161
return Scene
165162

166163

167-
def Plot(self, Input, iter=0, Combination=None):
168-
Scene = self._Plot(Input, iter=iter, Combination=Combination)
164+
def Plot(self, Input, iter=0):
165+
Scene = self._Plot(Input, iter=iter)
169166

170167
Scene.Show()
171168

SuPyMode/includes/Laplacian.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ BaseLaplacian::Points3Laplacian(){
5454

5555
Laplacian3Boundary();
5656

57-
if (Debug==true)
58-
cout<<Laplacian<<endl;
5957
}
6058

6159

SuPyMode/includes/class.cpp

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -139,25 +139,41 @@ EigenSolving::LoopOverITR(ndarray ITRList, size_t order = 1){
139139

140140
ScalarType alpha = -pow( k * ComputeMaxIndex(), 2 );
141141

142-
size_t barWidth = 70;
143-
std::cout << "[";
142+
143+
144+
145+
146+
147+
148+
149+
144150
for (size_t slice=0; slice<ITRLength; ++slice)
145151
{
146-
double progress = (double) slice/ITRLength;
147152

148-
size_t pos = (size_t) (barWidth * progress);
153+
if (Debug)
154+
{
155+
size_t barWidth = 70;
156+
std::cout << "[";
157+
158+
double progress = (double) slice/ITRLength;
159+
160+
size_t pos = (size_t) (barWidth * progress);
161+
162+
for (size_t i = 0; i < barWidth; ++i) {
163+
if (i < pos) std::cout << "=";
164+
else if (i == pos) std::cout << ">";
165+
else std::cout << " ";
166+
}
167+
std::cout << "] " << "ITR: " <<slice << "\n";
168+
std::cout.flush();
149169

150-
for (size_t i = 0; i < barWidth; ++i) {
151-
if (i < pos) std::cout << "=";
152-
else if (i == pos) std::cout << ">";
153-
else std::cout << " ";
154170
}
155-
std::cout << "] " << "ITR: " <<slice << "\n";
156-
std::cout.flush();
157171

158172

159173

160-
kDual = kInit * ITRPtr[slice] ;
174+
175+
176+
kDual = kInit * ITRPtr[slice];
161177

162178
tie(EigenVectors, EigenValues) = ComputeEigen(alpha);
163179

SuPyMode/includes/class.hpp

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ struct SuperMode
9696
ScalarType Beta0 = this->Betas[Slice], Beta1 = Other.Betas[Slice];
9797

9898
if (this->ModeNumber == Other.ModeNumber) { A = 0.0; }
99-
else {A = abs( ComputeCoupling(Other, Slice, MeshGradient, kInit) / (Beta0-Beta1) );}
99+
else { A = abs( (Beta0-Beta1) / ComputeCoupling(Other, Slice, MeshGradient, kInit) ); }
100100

101101
this->Adiabatic(Other.ModeNumber, Slice) = A;
102102
Other.Adiabatic(this->ModeNumber, Slice) = A;
@@ -107,16 +107,8 @@ struct SuperMode
107107

108108
void PopulateCouplingAdiabatic(SuperMode& Other, size_t Slice, VectorType &MeshGradient, ScalarType &kInit)
109109
{
110-
ScalarType Beta0 = this->Betas[Slice], Beta1 = Other.Betas[Slice];
111-
112-
ScalarType C = ComputeCoupling(Other, Slice, MeshGradient, kInit);
113-
114-
this->Adiabatic(Other.ModeNumber, Slice) = abs(C / (Beta0-Beta1));
115-
Other.Adiabatic(this->ModeNumber, Slice) = abs(C / (Beta0-Beta1));
116-
117-
this->Coupling(Other.ModeNumber, Slice) = abs(C);
118-
Other.Coupling(this->ModeNumber, Slice) = abs(C);
119-
110+
ComputeCoupling(Other, Slice, MeshGradient, kInit);
111+
ComputeAdiabatic(Other, Slice, MeshGradient, kInit);
120112
}
121113

122114

@@ -144,7 +136,7 @@ class BaseLaplacian{
144136
size_t Nx, Ny, size;
145137
ScalarType dx, dy, D0xy, D1y, D2y, D1x, D2x;
146138
MSparse Laplacian;
147-
bool Debug=false;
139+
bool Debug;
148140

149141
BaseLaplacian(ndarray& Mesh, ScalarType dx, ScalarType dy){
150142
this->Nx = Mesh.request().shape[0];
@@ -204,6 +196,7 @@ class EigenSolving : public BaseLaplacian
204196
bool Debug)
205197
: BaseLaplacian(Mesh, dx, dy)
206198
{
199+
this->Debug = Debug;
207200
this->nMode = nMode;
208201
this->sMode = sMode;
209202
this->MaxIter = MaxIter;

0 commit comments

Comments
 (0)