FrequencyResponse functions don't correctly calculate frequency vectors with two elements
Summary
When called on a frequency vector with only two elements FrequencyResponse
, FrequencyResponse2
, and FrequencyResponse3
only calculate at one of the two frequency points.
Steps to reproduce
The following is a minimum working example
import numpy as np
from finesse import Model
from finesse.components import Squeezer, Mirror, Cavity, ReadoutDC
model = Model()
model.add(Squeezer('SQZ', db=10, angle=0))
model.add(Mirror('ITM', T=0.014, L=0, Rc=1935))
model.add(Mirror('ETM', T=0, L=0, Rc=2245))
model.connect(model.ITM.p1, model.ETM.p1, 4e3)
model.connect(model.SQZ.p1, model.ITM.p2)
model.add(Cavity('cavARM', model.ETM.p1.o))
model.add(ReadoutDC('REFL', model.ETM.p1.o, output_detectors=True))
model.modes(maxtem=2)
def run_fresp_actions(F_Hz):
fsig = model.fsig.f.ref
sol = model.run(
act.Series(
act.FrequencyResponse(
F_Hz,
['SQZ.upper', 'SQZ.lower_conj'], ['REFL.DC.o'],
name='fresp1',
),
act.FrequencyResponse2(
F_Hz,
[
('SQZ.p1', +fsig),
('SQZ.p1', -fsig),
],
['REFL.DC.o'],
name='fresp2',
),
act.FrequencyResponse3(
F_Hz,
[
('SQZ.p1.o', +fsig),
('SQZ.p1.o', -fsig),
],
[
('ETM.p1.i', +fsig),
('ETM.p1.i', -fsig),
],
name='fresp3',
),
)
)
return sol
def print_fresp_shapes(sol):
print('FrequencyResponse shape', sol['fresp1'].out.shape)
print('FrequencyResponse2 shape', sol['fresp2'].out.shape)
print('FrequencyResponse3 shape', sol['fresp3'].out.shape)
F_Hz1 = np.array([5000])
F_Hz2 = np.array([100, 5000])
F_Hz3 = np.array([100, 500, 5000])
for F_Hz in [F_Hz1, F_Hz2, F_Hz3]:
sol = run_fresp_actions(F_Hz)
print(str(len(F_Hz)) + ' frequency points')
print_fresp_shapes(sol)
print('')
Bug behavior
The outputs from the FrequencyResponse
functions should be
-
FrequencyResponse
: [frequencies, inputs, outputs] (which is annoyingly not [frequencies, outputs, inputs]) -
FrequencyResponse2
: [frequencies, outputs, inputs, HOMs] -
FrequencyResponse3
: [frequencies, outputs, inputs, HOMs, HOMs]
The output of the above code is
1 frequency points
FrequencyResponse shape (1, 2, 1)
FrequencyResponse2 shape (1, 1, 2, 6)
FrequencyResponse3 shape (1, 2, 2, 6, 6)
2 frequency points
FrequencyResponse shape (2, 1)
FrequencyResponse2 shape (1, 2, 6)
FrequencyResponse3 shape (2, 2, 6, 6)
3 frequency points
FrequencyResponse shape (3, 2, 1)
FrequencyResponse2 shape (3, 1, 2, 6)
FrequencyResponse3 shape (3, 2, 2, 6, 6)
The output should be the same for 1 and 3 frequency points but should be
2 frequency points
FrequencyResponse shape (2, 2, 1)
FrequencyResponse2 shape (2, 1, 2, 6)
FrequencyResponse3 shape (2, 2, 2, 6, 6)
I am using python version 3.8.13 and finesse version 3.0a16.dev40+g742a1f47.