@@ -2375,42 +2375,47 @@ def BHJM_cylinder_segment(
2375
2375
- translate cylinder segment field to BHJM
2376
2376
- special cases catching
2377
2377
"""
2378
+ xp = array_namespace (observers , dimension , polarization )
2378
2379
check_field_input (field )
2379
2380
2380
- BHJM = polarization .astype (float )
2381
+ observers = xp .astype (observers , xp .float64 )
2382
+ dimension = xp .astype (dimension , xp .float64 )
2383
+ polarization = xp .astype (polarization , xp .float64 )
2381
2384
2382
- r1 , r2 , h , phi1 , phi2 = dimension .T
2383
- r1 = abs (r1 )
2384
- r2 = abs (r2 )
2385
- h = abs (h )
2385
+ BHJM = xp .astype (polarization , xp .float64 )
2386
+
2387
+ # r1, r2, h, phi1, phi2 = dimension.T
2388
+ r1 = xp .abs (dimension [:, 0 ])
2389
+ r2 = xp .abs (dimension [:, 1 ])
2390
+ h = xp .abs (dimension [:, 2 ])
2386
2391
z1 , z2 = - h / 2 , h / 2
2387
2392
2388
2393
# transform dim deg->rad
2389
- phi1 = phi1 / 180 * np .pi
2390
- phi2 = phi2 / 180 * np .pi
2391
- dim = np . array ([r1 , r2 , phi1 , phi2 , z1 , z2 ]).T
2394
+ phi1 = dimension [:, 3 ] / 180 * xp .pi
2395
+ phi2 = dimension [:, 4 ] / 180 * xp .pi
2396
+ dim = xp . asarray ([r1 , r2 , phi1 , phi2 , z1 , z2 ]).T
2392
2397
2393
2398
# transform obs_pos to Cy CS --------------------------------------------
2394
- x , y , z = observers . T
2395
- r , phi = np .sqrt (x ** 2 + y ** 2 ), np . arctan2 (y , x )
2396
- pos_obs_cy = np . concatenate ((( r ,), ( phi ,), ( z ,) ), axis = 0 ).T
2399
+ x , y , z = ( observers [:, i ] for i in range ( 3 ))
2400
+ r , phi = xp .sqrt (x ** 2 + y ** 2 ), xp . atan2 (y , x )
2401
+ pos_obs_cy = xp . concat (( r [ None , ...], phi [ None , ...], z [ None , ...] ), axis = 0 ).T
2397
2402
2398
2403
# determine when points lie inside and on surface of magnet -------------
2399
2404
2400
2405
# mask_inside = None
2401
2406
# if in_out == "auto":
2402
2407
# phip1 in [-2pi,0], phio2 in [0,2pi]
2403
2408
phio1 = phi
2404
- phio2 = phi - np .sign (phi ) * 2 * np .pi
2409
+ phio2 = phi - xp .sign (phi ) * 2 * xp .pi
2405
2410
2406
2411
# phi=phi1, phi=phi2
2407
2412
mask_phi1 = close (phio1 , phi1 ) | close (phio2 , phi1 )
2408
2413
mask_phi2 = close (phio1 , phi2 ) | close (phio2 , phi2 )
2409
2414
2410
2415
# r, phi ,z lies in-between, avoid numerical fluctuations (e.g. due to rotations) by including 1e-14
2411
2416
mask_r_in = (r1 - 1e-14 < r ) & (r < r2 + 1e-14 )
2412
- mask_phi_in = (np .sign (phio1 - phi1 ) != np .sign (phio1 - phi2 )) | (
2413
- np .sign (phio2 - phi1 ) != np .sign (phio2 - phi2 )
2417
+ mask_phi_in = (xp .sign (phio1 - phi1 ) != xp .sign (phio1 - phi2 )) | (
2418
+ xp .sign (phio2 - phi1 ) != xp .sign (phio2 - phi2 )
2414
2419
)
2415
2420
mask_z_in = (z1 - 1e-14 < z ) & (z < z2 + 1e-14 )
2416
2421
@@ -2425,13 +2430,13 @@ def BHJM_cylinder_segment(
2425
2430
# inside
2426
2431
mask_inside = mask_r_in & mask_phi_in & mask_z_in
2427
2432
# else:
2428
- # mask_inside = np .full(len (observers), in_out == "inside")
2429
- # mask_not_on_surf = np .full(len (observers), True)
2433
+ # mask_inside = xp .full((observers.shape[0] ), in_out == "inside")
2434
+ # mask_not_on_surf = xp .full((observers.shape[0] ), True)
2430
2435
# WARNING @alex
2431
2436
# 1. inside and not_on_surface are not the same! Can't just put to true.
2432
2437
2433
2438
# return 0 when all points are on surface
2434
- if not np .any (mask_not_on_surf ):
2439
+ if not xp .any (mask_not_on_surf ):
2435
2440
return BHJM * 0
2436
2441
2437
2442
if field == "J" :
@@ -2451,19 +2456,21 @@ def BHJM_cylinder_segment(
2451
2456
phi = phi [mask_not_on_surf ]
2452
2457
2453
2458
# transform mag to spherical CS -----------------------------------------
2454
- m = np .sqrt (pol [:, 0 ] ** 2 + pol [:, 1 ] ** 2 + pol [:, 2 ] ** 2 ) / MU0 # J -> M
2455
- phi_m = np . arctan2 (pol [:, 1 ], pol [:, 0 ])
2456
- th_m = np . arctan2 ( np .sqrt (pol [:, 0 ] ** 2 + pol [:, 1 ] ** 2 ), pol [:, 2 ])
2457
- mag_sph = np . concatenate ((( m ,), ( phi_m ,), ( th_m ,) ), axis = 0 ).T
2459
+ m = xp .sqrt (pol [:, 0 ] ** 2 + pol [:, 1 ] ** 2 + pol [:, 2 ] ** 2 ) / MU0 # J -> M
2460
+ phi_m = xp . atan2 (pol [:, 1 ], pol [:, 0 ])
2461
+ th_m = xp . atan2 ( xp .sqrt (pol [:, 0 ] ** 2 + pol [:, 1 ] ** 2 ), pol [:, 2 ])
2462
+ mag_sph = xp . concat (( m [ None , ...], phi_m [ None , ...], th_m [ None , ...] ), axis = 0 ).T
2458
2463
2459
2464
# compute H and transform to cart CS -------------------------------------
2460
2465
H_cy = magnet_cylinder_segment_Hfield (
2461
2466
magnetizations = mag_sph , dimensions = dim , observers = pos_obs_cy
2462
2467
)
2463
- Hr , Hphi , Hz = H_cy .T
2464
- Hx = Hr * np .cos (phi ) - Hphi * np .sin (phi )
2465
- Hy = Hr * np .sin (phi ) + Hphi * np .cos (phi )
2466
- BHJM [mask_not_on_surf ] = np .concatenate (((Hx ,), (Hy ,), (Hz ,)), axis = 0 ).T
2468
+ Hr , Hphi , Hz = H_cy [:, 0 ], H_cy [:, 1 ], H_cy [:, 2 ]
2469
+ Hx = Hr * xp .cos (phi ) - Hphi * xp .sin (phi )
2470
+ Hy = Hr * xp .sin (phi ) + Hphi * xp .cos (phi )
2471
+ BHJM [mask_not_on_surf ] = xp .concat (
2472
+ (Hx [None , ...], Hy [None , ...], Hz [None , ...]), axis = 0
2473
+ ).T
2467
2474
2468
2475
if field == "H" :
2469
2476
return BHJM
@@ -2484,3 +2491,25 @@ def BHJM_cylinder_segment(
2484
2491
# field_values=H_all,
2485
2492
# mask_inside=mask_inside & mask_not_on_surf,
2486
2493
# )
2494
+
2495
+ # return convert_HBMJ(
2496
+ # output_field_type=field,
2497
+ # polarization=polarization,
2498
+ # input_field_type="H",
2499
+ # field_values=H_all,
2500
+ # mask_inside=mask_inside & mask_not_on_surf,
2501
+ # )
2502
+
2503
+ # return convert_HBMJ(
2504
+ # output_field_type=field,
2505
+ # polarization=polarization,
2506
+ # input_field_type="H",
2507
+ # field_values=H_all,
2508
+ # mask_inside=mask_inside & mask_not_on_surf,
2509
+ # )
2510
+ # output_field_type=field,
2511
+ # polarization=polarization,
2512
+ # input_field_type="H",
2513
+ # field_values=H_all,
2514
+ # mask_inside=mask_inside & mask_not_on_surf,
2515
+ # )
0 commit comments