@@ -351,7 +351,7 @@ def test_n_cfl():
351
351
assert med .n_cfl >= 2
352
352
353
353
354
- def verify_custom_medium_methods (mat ):
354
+ def verify_custom_medium_methods (mat , reduced_fields = [] ):
355
355
"""Verify that the methods in custom medium is producing expected results."""
356
356
freq = 1.0
357
357
assert isinstance (mat , AbstractCustomMedium )
@@ -362,6 +362,41 @@ def verify_custom_medium_methods(mat):
362
362
for i in range (3 ):
363
363
assert np .allclose (eps_grid [i ].shape , [len (f ) for f in coord_interp .to_list ])
364
364
365
+ # check reducing data
366
+ subsection = td .Box (size = (0.3 , 0.4 , 0.35 ), center = (0.4 , 0.4 , 0.4 ))
367
+
368
+ mat_reduced = mat .sel_inside (subsection .bounds )
369
+
370
+ for field in reduced_fields :
371
+ original = getattr (mat , field )
372
+ reduced = getattr (mat_reduced , field )
373
+
374
+ if original is None :
375
+ assert reduced is None
376
+ continue
377
+
378
+ # data fields in medium classes could be SpatialArrays or 2d tuples of spatial arrays
379
+ # lets convert everything into 2d tuples of spatial arrays for uniform handling
380
+ if isinstance (original , td .SpatialDataArray ):
381
+ original = [
382
+ [
383
+ original ,
384
+ ],
385
+ ]
386
+ reduced = [
387
+ [
388
+ reduced ,
389
+ ],
390
+ ]
391
+
392
+ for or_set , re_set in zip (original , reduced ):
393
+ assert len (or_set ) == len (re_set )
394
+
395
+ for ind in range (len (or_set )):
396
+ diff = (or_set [ind ] - re_set [ind ]).abs
397
+ assert diff .does_cover (subsection .bounds )
398
+ assert np .allclose (diff , 0 )
399
+
365
400
# construct sim
366
401
struct = td .Structure (
367
402
geometry = td .Box (size = (0.5 , 0.5 , 0.5 )),
@@ -375,6 +410,8 @@ def verify_custom_medium_methods(mat):
375
410
structures = (struct ,),
376
411
)
377
412
_ = sim .grid
413
+ sim_reduced = sim .subsection (subsection , remove_outside_custom_mediums = False )
414
+ sim_reduced = sim .subsection (subsection , remove_outside_custom_mediums = True )
378
415
379
416
# bkg
380
417
sim = td .Simulation (
@@ -384,6 +421,8 @@ def verify_custom_medium_methods(mat):
384
421
medium = mat ,
385
422
)
386
423
_ = sim .grid
424
+ sim_reduced = sim .subsection (subsection , remove_outside_custom_mediums = False )
425
+ sim_reduced = sim .subsection (subsection , remove_outside_custom_mediums = True )
387
426
388
427
389
428
def test_anisotropic_custom_medium ():
@@ -438,7 +477,7 @@ def test_custom_isotropic_medium():
438
477
with pytest .raises (pydantic .ValidationError ):
439
478
mat = CustomMedium (permittivity = permittivity , conductivity = sigmatmp )
440
479
mat = CustomMedium (permittivity = permittivity , conductivity = sigmatmp , allow_gain = True )
441
- verify_custom_medium_methods (mat )
480
+ verify_custom_medium_methods (mat , [ "permittivity" , "conductivity" ] )
442
481
443
482
# inconsistent coords
444
483
with pytest .raises (pydantic .ValidationError ):
@@ -448,15 +487,15 @@ def test_custom_isotropic_medium():
448
487
mat = CustomMedium (permittivity = permittivity , conductivity = sigmatmp )
449
488
450
489
mat = CustomMedium (permittivity = permittivity , conductivity = conductivity )
451
- verify_custom_medium_methods (mat )
490
+ verify_custom_medium_methods (mat , [ "permittivity" , "conductivity" ] )
452
491
453
492
mat = CustomMedium (permittivity = permittivity )
454
- verify_custom_medium_methods (mat )
493
+ verify_custom_medium_methods (mat , [ "permittivity" , "conductivity" ] )
455
494
456
495
457
- def verify_custom_dispersive_medium_methods (mat ):
496
+ def verify_custom_dispersive_medium_methods (mat , reduced_fields = [] ):
458
497
"""Verify that the methods in custom dispersive medium is producing expected results."""
459
- verify_custom_medium_methods (mat )
498
+ verify_custom_medium_methods (mat , reduced_fields )
460
499
freq = 1.0
461
500
for i in range (3 ):
462
501
assert mat .eps_dataarray_freq (freq )[i ].shape == (Nx , Ny , Nz )
@@ -515,7 +554,7 @@ def test_custom_pole_residue():
515
554
516
555
eps_inf = td .SpatialDataArray (np .random .random ((Nx , Ny , Nz )) + 1 , coords = dict (x = X , y = Y , z = Z ))
517
556
mat = CustomPoleResidue (eps_inf = eps_inf , poles = ((a , c ),))
518
- verify_custom_dispersive_medium_methods (mat )
557
+ verify_custom_dispersive_medium_methods (mat , [ "eps_inf" , "poles" ] )
519
558
assert mat .n_cfl > 1
520
559
521
560
# to custom non-dispersive medium
@@ -529,12 +568,12 @@ def test_custom_pole_residue():
529
568
mat_medium = mat .to_medium ()
530
569
mat = CustomPoleResidue (eps_inf = eps_inf , poles = ((a , c - 0.1 ),), allow_gain = True )
531
570
mat_medium = mat .to_medium ()
532
- verify_custom_medium_methods (mat_medium )
571
+ verify_custom_medium_methods (mat_medium , [ "permittivity" , "conductivity" ] )
533
572
assert mat_medium .n_cfl > 1
534
573
535
574
# custom medium to pole residue
536
575
mat = CustomPoleResidue .from_medium (mat_medium )
537
- verify_custom_dispersive_medium_methods (mat )
576
+ verify_custom_dispersive_medium_methods (mat , [ "eps_inf" , "poles" ] )
538
577
assert mat .n_cfl > 1
539
578
540
579
@@ -578,14 +617,14 @@ def test_custom_sellmeier():
578
617
mat = CustomSellmeier (coeffs = ((b1 , c2 ), (btmp , c2 )))
579
618
580
619
mat = CustomSellmeier (coeffs = ((b1 , c1 ), (b2 , c2 )))
581
- verify_custom_dispersive_medium_methods (mat )
620
+ verify_custom_dispersive_medium_methods (mat , [ "coeffs" ] )
582
621
assert mat .n_cfl == 1
583
622
584
623
# from dispersion
585
624
n = td .SpatialDataArray (2 + np .random .random ((Nx , Ny , Nz )), coords = dict (x = X , y = Y , z = Z ))
586
625
dn_dwvl = td .SpatialDataArray (- np .random .random ((Nx , Ny , Nz )), coords = dict (x = X , y = Y , z = Z ))
587
626
mat = CustomSellmeier .from_dispersion (n = n , dn_dwvl = dn_dwvl , freq = 2 , interp_method = "linear" )
588
- verify_custom_dispersive_medium_methods (mat )
627
+ verify_custom_dispersive_medium_methods (mat , [ "coeffs" ] )
589
628
assert mat .n_cfl == 1
590
629
591
630
@@ -638,13 +677,13 @@ def test_custom_lorentz():
638
677
mat = CustomLorentz (
639
678
eps_inf = eps_inf , coeffs = ((de1 , f1 , delta1 ), (detmp , f2 , delta2 )), allow_gain = True
640
679
)
641
- verify_custom_dispersive_medium_methods (mat )
680
+ verify_custom_dispersive_medium_methods (mat , [ "eps_inf" , "coeffs" ] )
642
681
assert mat .n_cfl > 1
643
682
644
683
mat = CustomLorentz (
645
684
eps_inf = eps_inf , coeffs = ((de1 , f1 , delta1 ), (de2 , f2 , delta2 )), subpixel = True
646
685
)
647
- verify_custom_dispersive_medium_methods (mat )
686
+ verify_custom_dispersive_medium_methods (mat , [ "eps_inf" , "coeffs" ] )
648
687
assert mat .n_cfl > 1
649
688
assert mat .pole_residue .subpixel
650
689
@@ -681,7 +720,7 @@ def test_custom_drude():
681
720
mat = CustomDrude (eps_inf = eps_inf , coeffs = ((f1 , delta1 ), (ftmp , delta2 )))
682
721
683
722
mat = CustomDrude (eps_inf = eps_inf , coeffs = ((f1 , delta1 ), (f2 , delta2 )))
684
- verify_custom_dispersive_medium_methods (mat )
723
+ verify_custom_dispersive_medium_methods (mat , [ "eps_inf" , "coeffs" ] )
685
724
assert mat .n_cfl > 1
686
725
687
726
@@ -728,11 +767,11 @@ def test_custom_debye():
728
767
)
729
768
mat = CustomDebye (eps_inf = eps_inf , coeffs = ((eps1 , tau1 ), (epstmp , tau2 )))
730
769
mat = CustomDebye (eps_inf = eps_inf , coeffs = ((eps1 , tau1 ), (epstmp , tau2 )), allow_gain = True )
731
- verify_custom_dispersive_medium_methods (mat )
770
+ verify_custom_dispersive_medium_methods (mat , [ "eps_inf" , "coeffs" ] )
732
771
assert mat .n_cfl > 1
733
772
734
773
mat = CustomDebye (eps_inf = eps_inf , coeffs = ((eps1 , tau1 ), (eps2 , tau2 )))
735
- verify_custom_dispersive_medium_methods (mat )
774
+ verify_custom_dispersive_medium_methods (mat , [ "eps_inf" , "coeffs" ] )
736
775
assert mat .n_cfl > 1
737
776
738
777
0 commit comments