11import datetime
22import faulthandler
3- import inspect
43import os
54import unittest
65
@@ -17,17 +16,7 @@ def setUp(self):
1716 os .path .dirname (os .path .abspath (__file__ )), "test_file2.nc"
1817 )
1918
20- self .test_only = []
21-
22- # self.test_only = ['nought']
23- # self.test_only = ['test_Field_collapse']
24- # self.test_only = ['test_Field_collapse_CLIMATOLOGICAL_TIME']
25- # self.test_only = ['test_Field_collapse_GROUPS']
26-
2719 def test_Field_collapse_CLIMATOLOGICAL_TIME (self ):
28- if self .test_only and inspect .stack ()[0 ][3 ] not in self .test_only :
29- return
30-
3120 verbose = False
3221
3322 f = cf .example_field (2 )
@@ -258,9 +247,6 @@ def test_Field_collapse_CLIMATOLOGICAL_TIME(self):
258247 self .assertEqual (list (g .shape ), expected_shape )
259248
260249 def test_Field_collapse (self ):
261- if self .test_only and inspect .stack ()[0 ][3 ] not in self .test_only :
262- return
263-
264250 verbose = False
265251
266252 f = cf .read (self .filename2 )[0 ]
@@ -380,22 +366,7 @@ def test_Field_collapse(self):
380366 f"{ bound .day } !={ group .offset .day } , group={ group } " ,
381367 )
382368
383- # for group in (cf.D(30),
384- # cf.D(30, month=12),
385- # cf.D(30, day=16),
386- # cf.D(30, month=11, day=27)):
387- # g = f.collapse('T: mean', group=group)
388- # bound = g.coord('T').bounds.datetime_array[0, 1]
389- # self.assertEqual(
390- # bound.day, group.offset.day,
391- # "{}!={}, bound={}, group={}".format(
392- # bound.day, group.offset.day, bound, group)
393- # )
394-
395369 def test_Field_collapse_WEIGHTS (self ):
396- if self .test_only and inspect .stack ()[0 ][3 ] not in self .test_only :
397- return
398-
399370 verbose = False
400371
401372 f = cf .example_field (2 )
@@ -415,9 +386,6 @@ def test_Field_collapse_WEIGHTS(self):
415386 i .collapse ("area: maximum" )
416387
417388 def test_Field_collapse_GROUPS (self ):
418- if self .test_only and inspect .stack ()[0 ][3 ] not in self .test_only :
419- return
420-
421389 verbose = False
422390
423391 f = cf .example_field (2 )
@@ -695,15 +663,96 @@ def test_Field_collapse_GROUPS(self):
695663 print (g .constructs )
696664 self .assertEqual (list (g .shape ), expected_shape , g .shape )
697665
698-
699- # g = f[::2].collapse('T: mean', group=cf.M(5, month=12),
700- # group_span=cf.M(5),group_contiguous=1)
701- # g = f.collapse('T: mean', group=cf.M(5, month= 3),
702- # group_contiguous=1)
703- # g = f.collapse('T: mean', group=cf.M(5, month=12),
704- # group_contiguous=2)
705- # g = f.collapse('T: mean', group=cf.M(5, month= 3),
706- # group_contiguous=2)
666+ def test_Field_collapse_sum (self ):
667+ f = cf .example_field (0 )
668+ w = f .weights ("area" , measure = True )
669+ a = f .array
670+ wa = w .array
671+ ws = a * wa
672+
673+ g = f .collapse ("area: sum" )
674+ self .assertTrue ((g .array == a .sum ()).all ())
675+
676+ g = f .collapse ("area: sum" , weights = w )
677+ self .assertTrue ((g .array == ws .sum ()).all ())
678+ self .assertEqual (g .Units , cf .Units ("1" ))
679+
680+ g = f .collapse ("area: sum" , weights = w , scale = 1 )
681+ self .assertTrue ((g .array == (ws / wa .max ()).sum ()).all ())
682+ self .assertEqual (g .Units , cf .Units ("1" ))
683+
684+ g = f .collapse ("area: sum" , weights = w )
685+ self .assertTrue ((g .array == ws .sum ()).all ())
686+ self .assertEqual (g .Units , cf .Units ("1" ))
687+
688+ # Can't set measure=True for 'sum' collapses
689+ with self .assertRaises (ValueError ):
690+ g = f .collapse ("area: sum" , weights = w , measure = True )
691+
692+ def test_Field_collapse_integral (self ):
693+ f = cf .example_field (0 )
694+ w = f .weights ("area" , measure = True )
695+ a = f .array
696+ wa = w .array
697+ ws = a * wa
698+
699+ g = f .collapse ("area: integral" , weights = w , measure = True )
700+ self .assertTrue ((g .array == ws .sum ()).all ())
701+ self .assertEqual (g .Units , cf .Units ("m2" ))
702+
703+ # Must set the 'weights' parameter for 'integral' collapses
704+ with self .assertRaises (ValueError ):
705+ g = f .collapse ("area: integral" )
706+
707+ # Must set measure=True for 'integral' collapses
708+ with self .assertRaises (ValueError ):
709+ g = f .collapse ("area: integral" , weights = w )
710+
711+ # 'scale' must be None when 'measure' is True
712+ with self .assertRaises (ValueError ):
713+ g = f .collapse ("area: integral" , weights = w , measure = True , scale = 1 )
714+
715+ def test_Field_collapse_sum_weights (self ):
716+ f = cf .example_field (0 )
717+ w = f .weights ("area" , measure = True )
718+ wa = w .array
719+
720+ g = f .collapse ("area: sum_of_weights" )
721+ self .assertTrue ((g .array == 40 ).all ())
722+ self .assertEqual (g .Units , cf .Units ())
723+
724+ g = f .collapse ("area: sum_of_weights" , weights = w )
725+ self .assertTrue ((g .array == wa .sum ()).all ())
726+ self .assertEqual (g .Units , cf .Units ("m2" ))
727+
728+ g = f .collapse ("area: sum_of_weights" , weights = w , measure = True )
729+ self .assertTrue ((g .array == wa .sum ()).all ())
730+ self .assertEqual (g .Units , cf .Units ("m2" ))
731+
732+ g = f .collapse ("area: sum_of_weights" , weights = w , scale = 1 )
733+ self .assertTrue ((g .array == (wa / wa .max ()).sum ()).all ())
734+ self .assertEqual (g .Units , cf .Units ("1" ))
735+
736+ def test_Field_collapse_sum_weights2 (self ):
737+ f = cf .example_field (0 )
738+ w = f .weights ("area" , measure = True )
739+ wa = w .array ** 2
740+
741+ g = f .collapse ("area: sum_of_weights2" )
742+ self .assertTrue ((g .array == 40 ).all ())
743+ self .assertEqual (g .Units , cf .Units ())
744+
745+ g = f .collapse ("area: sum_of_weights2" , weights = w )
746+ self .assertTrue ((g .array == wa .sum ()).all ())
747+ self .assertEqual (g .Units , cf .Units ("m4" ))
748+
749+ g = f .collapse ("area: sum_of_weights2" , weights = w , measure = True )
750+ self .assertTrue ((g .array == wa .sum ()).all ())
751+ self .assertEqual (g .Units , cf .Units ("m4" ))
752+
753+ g = f .collapse ("area: sum_of_weights2" , weights = w , scale = 1 )
754+ self .assertTrue ((g .array == (wa / wa .max ()).sum ()).all ())
755+ self .assertEqual (g .Units , cf .Units ("1" ))
707756
708757
709758if __name__ == "__main__" :
0 commit comments