@@ -297,37 +297,50 @@ impl<G: GaugeGroup, M: Field + Copy + Default + PartialOrd, R: RealField> LinkVa
297297 // Create block-diagonal matrix with phase in U(1) sector
298298 let mut data = vec ! [ M :: zero( ) ; n * n] ;
299299
300- match n {
301- 1 => {
302- // Pure U(1): exp(iφ)
303- data[ 0 ] = M :: from_polar ( R :: one ( ) , phase) ;
304- }
305- 2 => {
306- // SU(2): encode as exp(iφσ_3/2) = diag(exp(iφ/2), exp(-iφ/2))
307- // This preserves det = 1
308- let two = R :: one ( ) + R :: one ( ) ;
309- let half_phase = phase / two;
310- data[ 0 ] = M :: from_polar ( R :: one ( ) , half_phase) ;
311- data[ 3 ] = M :: from_polar ( R :: one ( ) , -half_phase) ;
312- }
313- 3 => {
314- // SU(2)×U(1): block-diagonal (2×2 SU(2) identity) + (1×1 U(1) phase)
315- // [[1, 0, 0],
316- // [0, 1, 0],
317- // [0, 0, exp(iφ)]]
318- data[ 0 ] = M :: one ( ) ; // SU(2) block: identity
319- data[ 4 ] = M :: one ( ) ; // SU(2) block: identity
320- data[ 8 ] = M :: from_polar ( R :: one ( ) , phase) ; // U(1) sector: exp(iφ)
321- }
322- _ => {
323- // General SU(n): encode phase along diagonal with det = 1
324- // diag(exp(iφ), exp(-iφ/(n-1)), exp(-iφ/(n-1)), ...)
325- let n_minus_1_f = R :: from_usize ( n - 1 ) . unwrap_or ( R :: one ( ) ) ;
326- let compensating_phase = -phase / n_minus_1_f;
300+ if G :: name ( ) == "SU2_U1" && n == 3 {
301+ // SU(2)×U(1) block
302+ data[ 0 ] = M :: one ( ) ;
303+ data[ 4 ] = M :: one ( ) ;
304+ data[ 8 ] = M :: from_polar ( R :: one ( ) , phase) ;
305+ } else {
306+ // other cases that are non SU2_U1
307+ match n {
308+ 1 => {
309+ // Pure U(1): exp(iφ)
310+ data[ 0 ] = M :: from_polar ( R :: one ( ) , phase) ;
311+ }
312+ 2 => {
313+ // SU(2): encode as exp(iφσ_3/2) = diag(exp(iφ/2), exp(-iφ/2))
314+ // This preserves det = 1
315+ let two = R :: one ( ) + R :: one ( ) ;
316+ let half_phase = phase / two;
317+ data[ 0 ] = M :: from_polar ( R :: one ( ) , half_phase) ;
318+ data[ 3 ] = M :: from_polar ( R :: one ( ) , -half_phase) ;
319+ }
320+ 3 => {
321+ // SU(2)×U(1): block-diagonal (2×2 SU(2) identity) + (1×1 U(1) phase)
322+ // [[1, 0, 0],
323+ // [0, 1, 0],
324+ // [0, 0, exp(iφ)]]
325+ data[ 0 ] = M :: one ( ) ; // SU(2) block: identity
326+ data[ 4 ] = M :: one ( ) ; // SU(2) block: identity
327+ data[ 8 ] = M :: from_polar ( R :: one ( ) , phase) ; // U(1) sector: exp(iφ)
328+ }
329+ _ => {
330+ // General SU(n): encode phase along diagonal with det = 1
331+ // diag(exp(iφ), exp(-iφ/(n-1)), exp(-iφ/(n-1)), ...)
332+ let n_minus_1_f = R :: from_usize ( n - 1 ) . ok_or_else ( || {
333+ LinkVariableError :: NumericalError ( format ! (
334+ "Cannot represent dimension {} as underlying real type" ,
335+ n - 1
336+ ) )
337+ } ) ?;
338+ let compensating_phase = -phase / n_minus_1_f;
327339
328- data[ 0 ] = M :: from_polar ( R :: one ( ) , phase) ;
329- for i in 1 ..n {
330- data[ i * n + i] = M :: from_polar ( R :: one ( ) , compensating_phase) ;
340+ data[ 0 ] = M :: from_polar ( R :: one ( ) , phase) ;
341+ for i in 1 ..n {
342+ data[ i * n + i] = M :: from_polar ( R :: one ( ) , compensating_phase) ;
343+ }
331344 }
332345 }
333346 }
@@ -338,7 +351,7 @@ impl<G: GaugeGroup, M: Field + Copy + Default + PartialOrd, R: RealField> LinkVa
338351 _gauge : PhantomData ,
339352 _scalar : PhantomData ,
340353 } )
341- . map_err ( |e| LinkVariableError :: TensorCreation ( format ! ( "{:?}" , e ) ) )
354+ . map_err ( |e| LinkVariableError :: TensorCreation ( e . to_string ( ) ) )
342355 }
343356
344357 /// Create a link variable from a U(1) phase angle (convenience method).
0 commit comments