@@ -264,7 +264,9 @@ def pump_linear(mode_0, graph, D0_0, D0_1):
264264
265265def mode_on_nodes (mode , graph ):
266266 """Compute the mode solution on the nodes of the graph."""
267- laplacian = construct_laplacian (to_complex (mode ), graph )
267+ laplacian = graph .graph ["params" ].get ("laplacian_constructor" , construct_laplacian )(
268+ to_complex (mode ), graph
269+ )[0 ]
268270 min_eigenvalue , node_solution = sc .sparse .linalg .eigs (
269271 laplacian , k = 1 , sigma = 0 , v0 = np .ones (len (graph )), which = "LM"
270272 )
@@ -901,20 +903,36 @@ def lasing_threshold_linear(mode, graph, D0):
901903
902904def get_node_transfer (k , graph , input_flow ):
903905 """Compute node transfer from a given input flow."""
904- BT , _ = construct_incidence_matrix (graph )
906+ laplacian , BT , _ , _ = graph .graph ["params" ].get ("laplacian_constructor" , construct_laplacian )(
907+ k , graph
908+ )
905909 bt = np .clip (np .ceil (np .real (BT .toarray ())), - 1 , 0 )
906- K = bt .dot (np .repeat (graph .graph ["ks" ], 2 ))
907- return sc .sparse .linalg .spsolve (construct_laplacian (k , graph ), K * input_flow )
910+ ks = np .empty (2 * len (graph .graph ["ks" ]))
911+ ks [::2 ] = graph .graph ["ks" ]
912+ ks [1 ::2 ] = graph .graph ["ks" ]
913+ K = bt .dot (ks )
914+ return sc .sparse .linalg .spsolve (laplacian , K * input_flow )
908915
909916
910917def get_edge_transfer (k , graph , input_flow ):
911918 """Compute edge transfer from a given input flow."""
912919 set_wavenumber (graph , k )
913- BT , B = construct_incidence_matrix (graph )
914- _r = sc .sparse .linalg .spsolve (
915- construct_laplacian (k , graph ), BT .dot (np .repeat (graph .graph ["ks" ], 2 ) * input_flow )
916- )
917- Winv = construct_weight_matrix (graph , with_k = False )
920+ laplacian , BT , B , Winv = graph .graph ["params" ].get (
921+ "laplacian_constructor" , construct_laplacian
922+ )(k , graph )
923+ s = list (np .shape (graph .graph ["ks" ]))
924+ s [0 ] *= 2
925+ ks = np .empty (s , dtype = np .complex )
926+ ks [::2 ] = graph .graph ["ks" ]
927+ ks [1 ::2 ] = graph .graph ["ks" ]
928+ if len (s ) > 1 :
929+ _in = np .einsum ("ikl,ij" , ks , np .diag (input_flow ))
930+ _in = BT .dot (sc .linalg .block_diag (* _in ))
931+ # WIP HERE
932+ else :
933+ _in = BT .dot (ks * input_flow )
934+
935+ _r = sc .sparse .linalg .spsolve (laplacian , _in )
918936 return Winv .dot (B ).dot (_r )
919937
920938
0 commit comments