@@ -837,6 +837,195 @@ def test_return_esmpy_regrid_operator(self):
837837 self .assertIsInstance (opers , esmpy .api .regrid .Regrid )
838838 self .assertIsInstance (operc , esmpy .api .regrid .Regrid )
839839
840+ @unittest .skipUnless (esmpy_imported , "Requires esmpy/ESMF package." )
841+ def test_regrids_max_masked (self ):
842+ """Test max_masked keyword to regrids."""
843+ self .assertFalse (cf .regrid_logging ())
844+
845+ # Source grid
846+ s = cf .example_field (0 )
847+
848+ # Destination grid
849+ d = s [1 :, :]
850+ x = d .dimension_coordinate ("X" )
851+ y = d .dimension_coordinate ("Y" )
852+ x .del_bounds ()
853+ y .del_bounds ()
854+ x [...] = [0.0 , 45.0 , 90.0 , 135.0 , 180.0 , 225.0 , 270.0 , 315.0 ]
855+ y [...] = [- 60.0 , - 22.5 , 22.5 , 60.0 ]
856+
857+ # No missing values
858+ x = s .regrids (d , method = "linear" )
859+ self .assertEqual (x .data .count ().array , 32 )
860+
861+ # Create some masked source cells
862+ for i in range (5 ):
863+ s [i , i :] = cf .masked
864+
865+ self .assertTrue (
866+ np .array_equal (
867+ s .data .mask ,
868+ [
869+ [True , True , True , True , True , True , True , True ],
870+ [False , True , True , True , True , True , True , True ],
871+ [False , False , True , True , True , True , True , True ],
872+ [False , False , False , True , True , True , True , True ],
873+ [False , False , False , False , True , True , True , True ],
874+ ],
875+ )
876+ )
877+
878+ x = s .regrids (d , method = "linear" , use_dst_mask = False , max_masked = 0 )
879+ self .assertTrue (
880+ np .array_equal (
881+ x .data .mask ,
882+ [
883+ [True , True , True , True , True , True , True , True ],
884+ [True , True , True , True , True , True , True , True ],
885+ [True , False , True , True , True , True , True , True ],
886+ [True , False , False , True , True , True , True , True ],
887+ ],
888+ )
889+ )
890+
891+ x = s .regrids (d , method = "linear" , use_dst_mask = False , max_masked = 1 )
892+ self .assertTrue (
893+ np .array_equal (
894+ x .data .mask ,
895+ [
896+ [True , True , True , True , True , True , True , True ],
897+ [True , False , True , True , True , True , True , True ],
898+ [True , False , False , True , True , True , True , True ],
899+ [True , False , False , False , True , True , True , True ],
900+ ],
901+ )
902+ )
903+
904+ x = s .regrids (d , method = "linear" , use_dst_mask = False , max_masked = 2 )
905+ self .assertTrue (
906+ np .array_equal (
907+ x .data .mask ,
908+ [
909+ [True , True , True , True , True , True , True , True ],
910+ [False , False , True , True , True , True , True , True ],
911+ [False , False , False , True , True , True , True , True ],
912+ [False , False , False , False , True , True , True , True ],
913+ ],
914+ )
915+ )
916+
917+ x = s .regrids (d , method = "linear" , use_dst_mask = False , max_masked = 3 )
918+ self .assertTrue (
919+ np .array_equal (
920+ x .data .mask ,
921+ [
922+ [False , False , True , True , True , True , True , True ],
923+ [False , False , False , True , True , True , True , True ],
924+ [False , False , False , False , True , True , True , True ],
925+ [False , False , False , False , False , True , True , True ],
926+ ],
927+ )
928+ )
929+
930+ def test_regridc_max_masked (self ):
931+ """Test max_masked keyword to regridc."""
932+ self .assertFalse (cf .regrid_logging ())
933+
934+ # Source grid
935+ s = cf .example_field (0 )
936+
937+ # Destination grid
938+ d = s [1 :, :]
939+ x = d .dimension_coordinate ("X" )
940+ y = d .dimension_coordinate ("Y" )
941+ x .del_bounds ()
942+ y .del_bounds ()
943+ x [...] = [0.0 , 45.0 , 90.0 , 135.0 , 180.0 , 225.0 , 270.0 , 315.0 ]
944+ y [...] = [- 60.0 , - 22.5 , 22.5 , 60.0 ]
945+
946+ # No missing values
947+ x = s .regrids (d , method = "linear" )
948+ self .assertEqual (x .data .count ().array , 32 )
949+
950+ # Create some masked source cells
951+ for i in range (5 ):
952+ s [i , i :] = cf .masked
953+
954+ self .assertTrue (
955+ np .array_equal (
956+ s .data .mask ,
957+ [
958+ [True , True , True , True , True , True , True , True ],
959+ [False , True , True , True , True , True , True , True ],
960+ [False , False , True , True , True , True , True , True ],
961+ [False , False , False , True , True , True , True , True ],
962+ [False , False , False , False , True , True , True , True ],
963+ ],
964+ )
965+ )
966+
967+ axes = ["Y" , "X" ]
968+
969+ x = s .regridc (
970+ d , axes = axes , method = "linear" , use_dst_mask = False , max_masked = 0
971+ )
972+ self .assertTrue (
973+ np .array_equal (
974+ x .data .mask ,
975+ [
976+ [True , True , True , True , True , True , True , True ],
977+ [True , True , True , True , True , True , True , True ],
978+ [True , False , True , True , True , True , True , True ],
979+ [True , False , False , True , True , True , True , True ],
980+ ],
981+ )
982+ )
983+
984+ x = s .regridc (
985+ d , axes = axes , method = "linear" , use_dst_mask = False , max_masked = 1
986+ )
987+ self .assertTrue (
988+ np .array_equal (
989+ x .data .mask ,
990+ [
991+ [True , True , True , True , True , True , True , True ],
992+ [True , False , True , True , True , True , True , True ],
993+ [True , False , False , True , True , True , True , True ],
994+ [True , False , False , False , True , True , True , True ],
995+ ],
996+ )
997+ )
998+
999+ x = s .regridc (
1000+ d , axes = axes , method = "linear" , use_dst_mask = False , max_masked = 2
1001+ )
1002+ self .assertTrue (
1003+ np .array_equal (
1004+ x .data .mask ,
1005+ [
1006+ [True , True , True , True , True , True , True , True ],
1007+ [True , False , True , True , True , True , True , True ],
1008+ [True , False , False , True , True , True , True , True ],
1009+ [True , False , False , False , True , True , True , True ],
1010+ ],
1011+ )
1012+ )
1013+
1014+ x = s .regridc (
1015+ d , axes = axes , method = "linear" , use_dst_mask = False , max_masked = 3
1016+ )
1017+ self .assertTrue (
1018+ np .array_equal (
1019+ x .data .mask ,
1020+ [
1021+ [True , False , True , True , True , True , True , True ],
1022+ [True , False , False , True , True , True , True , True ],
1023+ [True , False , False , False , True , True , True , True ],
1024+ [True , False , False , False , False , True , True , True ],
1025+ ],
1026+ )
1027+ )
1028+
8401029
8411030if __name__ == "__main__" :
8421031 print ("Run date:" , datetime .datetime .now ())
0 commit comments