From e16e3a9276b0ea36ab430036dc968d7ee5cf2d90 Mon Sep 17 00:00:00 2001 From: Aaron Zedwick Date: Thu, 10 Oct 2024 13:35:11 -0500 Subject: [PATCH 1/2] Initial Commit --- uxarray/constants.py | 1 - uxarray/grid/arcs.py | 8 ++++-- uxarray/grid/area.py | 6 ++-- uxarray/grid/connectivity.py | 6 ++-- uxarray/grid/coordinates.py | 22 +++++++-------- uxarray/grid/geometry.py | 9 ++++-- uxarray/grid/neighbors.py | 6 ++-- uxarray/grid/utils.py | 4 +-- uxarray/utils/computing.py | 13 +++++---- uxarray/utils/numba_settings.py | 49 --------------------------------- 10 files changed, 41 insertions(+), 83 deletions(-) delete mode 100644 uxarray/utils/numba_settings.py diff --git a/uxarray/constants.py b/uxarray/constants.py index e821de4d6..9d4515b74 100644 --- a/uxarray/constants.py +++ b/uxarray/constants.py @@ -17,7 +17,6 @@ MACHINE_EPSILON = np.float64(np.finfo(float).eps) ENABLE_JIT_CACHE = True -ENABLE_JIT = True ENABLE_FMA = False diff --git a/uxarray/grid/arcs.py b/uxarray/grid/arcs.py index c2ef5f009..77127ae91 100644 --- a/uxarray/grid/arcs.py +++ b/uxarray/grid/arcs.py @@ -15,6 +15,8 @@ from numba import njit +from uxarray.constants import ENABLE_JIT_CACHE + def _to_list(obj): if not isinstance(obj, list): @@ -27,7 +29,7 @@ def _to_list(obj): return obj -@njit +@njit(cache=ENABLE_JIT_CACHE) def _point_within_gca_body( angle, gca_cart, pt, GCRv0_lonlat, GCRv1_lonlat, pt_lonlat, is_directed ): @@ -244,7 +246,7 @@ def point_within_gca(pt, gca_cart, is_directed=False): return out -@njit +@njit(cache=ENABLE_JIT_CACHE) def in_between(p, q, r) -> bool: """Determines whether the number q is between p and r. @@ -266,7 +268,7 @@ def in_between(p, q, r) -> bool: return p <= q <= r or r <= q <= p -@njit +@njit(cache=ENABLE_JIT_CACHE) def _decide_pole_latitude(lat1, lat2): """Determine the pole latitude based on the latitudes of two points on a Great Circle Arc (GCA). diff --git a/uxarray/grid/area.py b/uxarray/grid/area.py index 13720e786..f842ea941 100644 --- a/uxarray/grid/area.py +++ b/uxarray/grid/area.py @@ -2,10 +2,8 @@ from uxarray.grid.coordinates import _lonlat_rad_to_xyz -from numba import njit, config -from uxarray.constants import ENABLE_JIT_CACHE, ENABLE_JIT - -config.DISABLE_JIT = not ENABLE_JIT +from numba import njit +from uxarray.constants import ENABLE_JIT_CACHE @njit(cache=ENABLE_JIT_CACHE) diff --git a/uxarray/grid/connectivity.py b/uxarray/grid/connectivity.py index d94d9eba6..99ddcfcac 100644 --- a/uxarray/grid/connectivity.py +++ b/uxarray/grid/connectivity.py @@ -7,6 +7,8 @@ from numba import njit +from uxarray.constants import ENABLE_JIT_CACHE + def close_face_nodes(face_node_connectivity, n_face, n_max_face_nodes): """Closes (``face_node_connectivity``) by inserting the first node index @@ -142,7 +144,7 @@ def _populate_n_nodes_per_face(grid): ) -@njit() +@njit(cache=ENABLE_JIT_CACHE) def _build_n_nodes_per_face(face_nodes, n_face, n_max_face_nodes): """Constructs ``n_nodes_per_face``, which contains the number of non-fill- value nodes for each face in ``face_node_connectivity``""" @@ -251,7 +253,7 @@ def _populate_edge_face_connectivity(grid): ) -@njit +@njit(cache=ENABLE_JIT_CACHE) def _build_edge_face_connectivity(face_edges, n_nodes_per_face, n_edge): """Helper for (``edge_face_connectivity``) construction.""" edge_faces = np.ones(shape=(n_edge, 2), dtype=face_edges.dtype) * INT_FILL_VALUE diff --git a/uxarray/grid/coordinates.py b/uxarray/grid/coordinates.py index 415fa2fe1..dbe4f0297 100644 --- a/uxarray/grid/coordinates.py +++ b/uxarray/grid/coordinates.py @@ -6,13 +6,13 @@ from uxarray.conventions import ugrid from numba import njit -from uxarray.constants import ERROR_TOLERANCE +from uxarray.constants import ERROR_TOLERANCE, ENABLE_JIT_CACHE from typing import Union from uxarray.grid.utils import _angle_of_2_vectors -@njit(cache=True) +@njit(cache=ENABLE_JIT_CACHE) def _lonlat_rad_to_xyz( lon: Union[np.ndarray, float], lat: Union[np.ndarray, float], @@ -26,7 +26,7 @@ def _lonlat_rad_to_xyz( return x, y, z -@njit +@njit(cache=ENABLE_JIT_CACHE) def _xyz_to_lonlat_rad_no_norm( x: Union[np.ndarray, float], y: Union[np.ndarray, float], @@ -67,7 +67,7 @@ def _xyz_to_lonlat_rad_no_norm( return lon, lat -@njit +@njit(cache=ENABLE_JIT_CACHE) def _xyz_to_lonlat_rad_scalar( x: Union[np.ndarray, float], y: Union[np.ndarray, float], @@ -217,7 +217,7 @@ def _normalize_xyz( return x_norm, y_norm, z_norm -@njit +@njit(cache=ENABLE_JIT_CACHE) def _normalize_xyz_scalar(x: float, y: float, z: float): denom = np.linalg.norm(np.asarray(np.array([x, y, z]), dtype=np.float64), ord=2) x_norm = x / denom @@ -430,7 +430,7 @@ def _smallest_enclosing_circle(points): return _welzl_recursive(points, np.empty((0, 2)), None) -@njit +@njit(cache=ENABLE_JIT_CACHE) def _circle_from_two_points(p1, p2): """Calculate the smallest circle that encloses two points on a unit sphere. @@ -459,7 +459,7 @@ def _circle_from_two_points(p1, p2): return center, radius -@njit +@njit(cache=ENABLE_JIT_CACHE) def _circle_from_three_points(p1, p2, p3): """Calculate the smallest circle that encloses three points on a unit sphere. This is a placeholder implementation. @@ -499,7 +499,7 @@ def _circle_from_three_points(p1, p2, p3): return center, radius -@njit +@njit(cache=ENABLE_JIT_CACHE) def _is_inside_circle(circle, point): """Check if a point is inside a given circle on a unit sphere. @@ -763,7 +763,7 @@ def _xyz_to_lonlat_rad( return lon, lat -@njit +@njit(cache=ENABLE_JIT_CACHE) def _xyz_to_lonlat_rad_no_norm( x: Union[np.ndarray, float], y: Union[np.ndarray, float], @@ -820,7 +820,7 @@ def _normalize_xyz( return x_norm, y_norm, z_norm -@njit(cache=True) +@njit(cache=ENABLE_JIT_CACHE) def _lonlat_rad_to_xyz( lon: Union[np.ndarray, float], lat: Union[np.ndarray, float], @@ -870,7 +870,7 @@ def _xyz_to_lonlat_deg( return lon, lat -@njit +@njit(cache=ENABLE_JIT_CACHE) def _normalize_xyz_scalar(x: float, y: float, z: float): denom = np.linalg.norm(np.asarray(np.array([x, y, z]), dtype=np.float64), ord=2) x_norm = x / denom diff --git a/uxarray/grid/geometry.py b/uxarray/grid/geometry.py index bb2f68f43..0685d59ac 100644 --- a/uxarray/grid/geometry.py +++ b/uxarray/grid/geometry.py @@ -12,7 +12,12 @@ from spatialpandas.geometry import MultiPolygonArray, PolygonArray import xarray as xr -from uxarray.constants import ERROR_TOLERANCE, INT_DTYPE, INT_FILL_VALUE +from uxarray.constants import ( + ERROR_TOLERANCE, + INT_DTYPE, + INT_FILL_VALUE, + ENABLE_JIT_CACHE, +) from uxarray.grid.arcs import extreme_gca_latitude, point_within_gca from uxarray.grid.intersections import gca_gca_intersection from uxarray.grid.utils import ( @@ -80,7 +85,7 @@ def error_radius(p1, p2): return unique_points -@njit +@njit(cache=ENABLE_JIT_CACHE) def _pad_closed_face_nodes( face_node_connectivity, n_face, n_max_face_nodes, n_nodes_per_face ): diff --git a/uxarray/grid/neighbors.py b/uxarray/grid/neighbors.py index 4d48a0c88..52be85b4d 100644 --- a/uxarray/grid/neighbors.py +++ b/uxarray/grid/neighbors.py @@ -10,7 +10,7 @@ from typing import Optional, Union -from uxarray.constants import INT_DTYPE, INT_FILL_VALUE +from uxarray.constants import INT_DTYPE, INT_FILL_VALUE, ENABLE_JIT_CACHE class KDTree: @@ -855,7 +855,7 @@ def _populate_edge_node_distances(grid): ) -@njit +@njit(cache=ENABLE_JIT_CACHE) def _construct_edge_node_distances(node_lon, node_lat, edge_nodes): """Helper for computing the arc-distance between nodes compose each edge.""" @@ -890,7 +890,7 @@ def _populate_edge_face_distances(grid): ) -@njit +@njit(cache=ENABLE_JIT_CACHE) def _construct_edge_face_distances(node_lon, node_lat, edge_faces): """Helper for computing the arc-distance between faces that saddle a given edge.""" diff --git a/uxarray/grid/utils.py b/uxarray/grid/utils.py index 63cb60213..517dc07de 100644 --- a/uxarray/grid/utils.py +++ b/uxarray/grid/utils.py @@ -1,12 +1,12 @@ import numpy as np -from uxarray.constants import INT_FILL_VALUE, MACHINE_EPSILON +from uxarray.constants import INT_FILL_VALUE, MACHINE_EPSILON, ENABLE_JIT_CACHE import warnings import uxarray.utils.computing as ac_utils from numba import njit -@njit +@njit(cache=ENABLE_JIT_CACHE) def _angle_of_2_vectors(u, v): """Calculate the angle between two 3D vectors u and v in radians. Can be used to calcualte the span of a GCR. diff --git a/uxarray/utils/computing.py b/uxarray/utils/computing.py index 948431c9b..14c6f66d3 100644 --- a/uxarray/utils/computing.py +++ b/uxarray/utils/computing.py @@ -2,9 +2,10 @@ import sys from numba import njit +from uxarray.constants import ENABLE_JIT_CACHE -@njit +@njit(cache=ENABLE_JIT_CACHE) def all(a): """Numba decorated implementation of ``np.all()`` @@ -16,7 +17,7 @@ def all(a): return np.all(a) -@njit +@njit(cache=ENABLE_JIT_CACHE) def isclose(a, b, rtol=1e-05, atol=1e-08): """Numba decorated implementation of ``np.isclose()`` @@ -28,7 +29,7 @@ def isclose(a, b, rtol=1e-05, atol=1e-08): return np.isclose(a, b, rtol=rtol, atol=atol) -@njit +@njit(cache=ENABLE_JIT_CACHE) def allclose(a, b, rtol=1e-05, atol=1e-08): """Numba decorated implementation of ``np.allclose()`` @@ -39,7 +40,7 @@ def allclose(a, b, rtol=1e-05, atol=1e-08): return np.allclose(a, b, rtol=rtol, atol=atol) -@njit +@njit(cache=ENABLE_JIT_CACHE) def cross(a, b): """Numba decorated implementation of ``np.cross()`` @@ -50,7 +51,7 @@ def cross(a, b): return np.cross(a, b) -@njit +@njit(cache=ENABLE_JIT_CACHE) def dot(a, b): """Numba decorated implementation of ``np.dot()`` @@ -61,7 +62,7 @@ def dot(a, b): return np.dot(a, b) -@njit +@njit(cache=ENABLE_JIT_CACHE) def norm(x): """Numba decorated implementation of ``np.linalg.norm()`` diff --git a/uxarray/utils/numba_settings.py b/uxarray/utils/numba_settings.py deleted file mode 100644 index ea7e28ffc..000000000 --- a/uxarray/utils/numba_settings.py +++ /dev/null @@ -1,49 +0,0 @@ -import uxarray.constants - - -def enable_jit_cache(): - """Allows Numba's JIT cache to be turned on. - - This cache variable lets @njit cache the machine code generated - between runs, allowing for faster run times due to the fact that the - code doesn't need to regenerate the machine code every run time. Our - use case here was to study performance, in regular usage one might - never turn off caching as it will only help if frequently modifying - the code or because users have very limited disk space. The default - is on (True) - """ - uxarray.constants.ENABLE_JIT_CACHE = True - - -def disable_jit_cache(): - """Allows Numba's JIT cache to be turned on off. - - This cache variable lets @njit cache the machine code generated - between runs, allowing for faster run times due to the fact that the - code doesn't need to regenerate the machine code every run time. Our - use case here was to study performance, in regular usage one might - never turn off caching as it will only help if frequently modifying - the code or because users have very limited disk space. The default - is on (True) - """ - uxarray.constants.ENABLE_JIT_CACHE = False - - -def enable_jit(): - """Allows Numba's JIT application to be turned on. - - This lets users choose whether they want machine code to be - generated to speed up the performance of the code on large files. - The default is on (True) - """ - uxarray.constants.ENABLE_JIT = True - - -def disable_jit(): - """Allows Numba's JIT application to be turned off. - - This lets users choose whether they want machine code to be - generated to speed up the performance of the code on large files. - The default is on (True) - """ - uxarray.constants.ENABLE_JIT = False From 9ac7f3c7d0de10f461e3a3e09b17b592911f34ef Mon Sep 17 00:00:00 2001 From: Aaron Zedwick Date: Fri, 11 Oct 2024 22:08:06 -0500 Subject: [PATCH 2/2] removed ENABLE_JIT_CACHE --- test/grid_geoflow.exo | Bin 0 -> 580356 bytes uxarray/constants.py | 2 -- uxarray/grid/arcs.py | 8 +++----- uxarray/grid/area.py | 13 ++++++------- uxarray/grid/connectivity.py | 6 ++---- uxarray/grid/coordinates.py | 22 +++++++++++----------- uxarray/grid/dual.py | 5 ++--- uxarray/grid/geometry.py | 3 +-- uxarray/grid/neighbors.py | 6 +++--- uxarray/grid/utils.py | 4 ++-- uxarray/utils/computing.py | 13 ++++++------- 11 files changed, 36 insertions(+), 46 deletions(-) create mode 100644 test/grid_geoflow.exo diff --git a/test/grid_geoflow.exo b/test/grid_geoflow.exo new file mode 100644 index 0000000000000000000000000000000000000000..8abc6556402d0a4d576c45bf88d7555b3a3eacf3 GIT binary patch literal 580356 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 @h)!+4Z=7 zIM1%zx6>uBZ@$*!2D!X{FUhXQ4a0eMJ#G}vv+Hr=aGqU{O~ZM1J#G@tv+HrwaGqU{ zn}zf2dfYsmXV>Ev;XJz@w+!dm^|)0y&#uRv7v~o?VaIh4bus+&-LV z*W(W1Ji8uu4CmSPxKlXKuE(9jd3HVS63(;hao2F3U5~qk^Xz&o!g+Q*?jFvw>v4~8 zo?VZ7hV$%t+$)@C*X=v$m8VlZ?w!l~_mb>-+$Wr8*JHDAo?VaohV$%t+%KGG*W>=- zJi8v7hx6=uJRqEB*W-cVJi8tb3g_ANcyKt+uE#^dd3HS>8qTxp@vv~7U5|%{^Xz&& zBAjQ}+&a>BV^9#0A9*>(GF`sL|VkEiDH{=Fo-9#0GB+4XpOIM1%fGs1ax zJ)RlPv+J>CIM1%fR^dFm9?uHr+4a~uoM+eL+2K699?uEq+4XpCIM1%f^TK&{J)R%V zv+MDKaGqU{7l!lfdb}u{XV>G!;XJz@FA3+__1GqyXV>GU;XJz@+lKS(db}*0XV>H9 z;XJz@uL$Sa^>}4C&#uR-!g+Q*whQOk^>}qS&#v3|(l1Y^db}o=_wOay^>}SK&#uSz z;XJz@JB0J>db}>2XV>HP;XJz@JBIV@db}Z=XV>G6;XJz@Zwlwx^>}kQ&#uQ#;XJz@ zJBRb^db}l^XV>Gc;XJz@Zwu$y_1GnxXV>HH;XJz@?+EAF_1HC>XV>GM;XJz@yM^=Y zdb}%~XV>H1;XJz@?+NGG_1Ha}XV>Gs;XJz@dxZ1sdb}^3XMZo=Vwj>+z9ro?VZR zhV$%t>>JLr>+!L0o?VZRhx6=ud?K7@*W;7nJi8vB3g_AN_;fhWuE%G>d3HTM8_u)q z@wsrGU60R)^Xz);7tXWm@r7`nU61|4d3HU%7|yfnaX>iFuE&?cd3HU%9L}@r_Jj1x z)2SW@=JNi%B)cA83Fq1M_-Z)MuE*EHd3HU%9?rAt@r`hvU5{^u^Xz&o!+CZ+4hrYl z^*A`3XV>Ff;XJz@-wx;5_4rOW&#uRJ!+CZ+z8B83>+$_?o?VY0g!Alr{4ktn*W*Xw zJi8u04(HkR_(?d=uE$Tqd3HSx3Fq1M_*pp5uE)>Ad3HU15ze#gacDTtuE$~FJi8u; zhx6>Z{V@IVbgIV@xx9Zb$*#vQ!+CZ+jtuA7_4rjd&#uR>!+CZ+jtb}5^*B15XV>GH zaGqU{W5aoNJ&p_K+4cBMIM1%f@!>qX9w&tJ?0TFS&a>Ge;XJz@ ze+%c?_4s=@&#uQm!g+Q*{u$1*>+!E}o?VZBhx6=uoEy%w>+zp(o?VX%ELQmj^Xz(D zFq~)C<3iy)yB-$~=h^kRNI1`~$9myByB-$}=h^kRSUAtF$NJ$syB-%0=h^kRL^#i` z$0fsgc0Dc?&a>-r>2RK1kIRJf?7ICp{ql6G$7OSQ|6Y<^j}5|kc0Dc^&a>-r`EZ_H zk1K@p?0Q@=oM+eLO5r@a9#;FK;XJz@HxB37_1H9=XV>i~>6fQdJ#LcA`}dOUdfYUeXV>Fq z;XJz@HxK98^|(bi&#uQU!+CZ+ZWYe6>v8LFo?VaIg!Alr+%}wN*W-5KJi8vZ59itS zxI;M4uE!n2d3HVS6wb5jap!QJU5~qj^Xz)uHJoSH<8I+RyB>>ho?VZ-hx6=u+#{T4 z*W;eyJi8wE3g_ANxOX_uuE%}Cd3HTE3+LJOxNkVmuE+htd3N1?ntpjY)#LuTe7|^h zJvI;L+4XopIM1%f1H*ZCJsuR!v+METaGqU{hlKO&dOS3oXV>Fl;XJz@4-e{=$ z&#uQK!+CZ+9u>~B>+$Gto?VZ}g!AlrY!S}0>+#rdo?VZ}h4busJU*Of*W(G{Ji8uG z4CmSPcv3jeuE&$Zd3HUX63(;h@zijhU5}@Q^Xz&&J)CFP;~C*RyB^OB=h<~TBwg}! zs>hbO{0s5ydTbTWv+MD!aGqU{t;2bCJ)RxTv+MDkaGqU{=Z5p_dORHT;XJz@ zF9_$^^>|@8&#uRd!g+Q*UL4M|>+zCso?VY^!g+Q*UK-A`>#=P(&#uSI!g+Q*ULMY~ z>+y=4eg>+!m9 zo?W+}rAwYp^>}?Q-#?yRj~&B#c0Jw@&a>k3GV9c0Jw~&a>>bXt>+#`mo?VZ9!g+Q*J`&Ee>+#WWo?VZ9 z!+CZ+J{Hci>+$h$o?VYmg!Alrd@`J8*W**+Ji8vB4(HkR_)Iv@uE%G?d3HTM7tXWm z@%eC`U61|3d3HU%5YDsfv41$vuE!U{d3HSx2 zuE$ryd3HU%7S6Nl@%32Af8>1Z-(>idMv|vc0CRX=h^i*IGktK z<6Gf8yB^;T=h^l6PB_o5$9Kbdc0Ilq&a>u{c3w?oqtbo?VX-rW;oBT$64V#yB=qU^Xz(@6V9{iu_l~n*W-8LJi8vh z59itS_(M3)uE!t4d3HVi6wb5j@#k=!U5~$n^X$4EmVS9U)#EY?R)qX9fd%Y(TsE9% z*JFclo?Va2h4busTt1v<*W(J|Ji8uO4CmSPxKcRJuE&+bd3HUn63(;han*31U5^dJ zd3HTE3g_ANxLP>RuE*8Gd3HTE4(HkRxJEe7uE#aQd3HUn70$EkaqV!PU5`z|d3HUn z6V9{iaoup9U61R9^Xz(DKb&XR;|Ae8yB;?T=h^kRQ8>@8$Bn~zcHJiL1$Yam=e_d3 zzee!yCE525|1F$n-zWU{aGt$c_#fds`@Z3ShV$(Eh5r@Kv+p1NcR0`9JbZ3A&wfDo zKjA$4f#D0(ulygL{h;s#!+G|D!xswY*$)X{IGkrcG<=b8p8c@!df`0#;o*yh^Xx~2 zFBZ-wi*TM@w-r+i;#;kK2Xw?0VcjoM+eL4&gkz9(N4q+4Z-rk8qw{k9&sm?0VcQoM+eL-r+pE9`_07 z+4a~goM+eLzTrH(9`_69+4Z=8IM1%f=HWcM9uElT+4Xo}IM1%fgTi@s-F}&Vc{Jsuj)v+MD&aGqU{hllg*dORYWXV>GA;XJz@j|%76^>}nR&#uQ~ z!g+Q*wg~6h^>}PJ&#uSg!g+Q*9v{xL>+yteo?VY8hV$%tJSm)K*W=0IJi8uG3Fq1M zcxpJ$uE*2Dd3HUX9?rAt@r-buU5{sm^Xz(T8P2oou~j(FuE(>&d3HUv4(HkRcy>6? zuG^96m#0%bo|DV__mb>-JU5(Y*W-ENJi8vx59itSctJSNuEz_*d3HTs6wb5j@#1iv zU5}T9^Xz(T6V9{i@zQXfU5{9bU60+ud3HVC70$Ek@$PV*U61#K^Xz);9?rAt z@!oKrU5`D&d3HVC7tXWm@&0h0U5^ih^Xz(jFq~)CW6yA&U5~xOd3HTM6wb5jv3EGn zuE&SNd3HVa3Fq1M_((Xd^DH$?vmN7<>^$9Z@K+=c0Ilw&a>G&a>-rOgPW3$Fbo&yB^1d^X$4Eoi2I)T{As?lgs<}lI(gMAI`Ju zaY8uHuE&YtJi8vh4d>bQI4PWG*W=`Ho?VYq!g+Q*P7UYT^*Ak@XV>HOaGqU{Gs1ax zJ~Nl4k8{F#c0JaF^Xz*3E}UoAcC=h^l6V>r*Q$DhJ^ zc0K+a&a>-rm2jS2kE@3B?7AJB zE_piDW5Zm2a6G#n8-?@idR#4>XV>HE;XJz@8;A4kdR!x%XV>GJ;XJz@*9zy^^|*F8 z&#uQN;XJz@*9qs@^|)?0&#uSy!g+Q*t{={`>v4l{o?VX{hV$%t+$fx9*WEA=h^kROE}N2 z$6dpDc0KME&a>;W2Q^Xz)uFPvxB% z&a>+4XpQIM1%f6T*3RJ)RiOv+MDsaGqU{Cx`RwdORhZXV>GY;XJz@ zPYdVS^>}(X&#uQa!g+Q*o*B-w>#=1x&#uQ-;XJz@&kE<+_1HR`XV>G|;XJz@&k5(* z^>}VL&#uSw!g+Q*o*&M$>+ynco?W-&(=Sh_db}`~_wOay^>|S@&#uRd!+CZ+UJ}l; z>#|r0&#uSI!+CZ+UJ=f->+#BPo?VYuh4busY!}Y6>+$Mv zo?VaEg!Alryf&O?*JJx|o?VX}!g+Q*UKh@@>+$++!~Lo?VYO zh4busyg8g_*JGz}o?VZf!+CZ+-V)BU>+#lbo?W*S(l1Y^db}-{_wOay_1GnxXV>HH z;XJz@?+EAF_1HC>XV>GM;XJz@yM^=Ydb}%~XV>H1;XJz@?+NGG_1Ha}XV>Gs;XJz@ zdxZ1sdb}^3XV>HX;XJz@9|-5!_4r^o&#uRw;XJz@dxi7tdVDCHXV+uzaGqU{4~O&q zANKCTY5ThFyZuFXcXxMpcXxMpcPMGlUAAHesh}8yN=c)nDBa!7mYemu_a0|I&tLFk zM$b9ddws9-;v)N$Dg(H zaNRyxzdW7l@#nq2IS<$4FWPyy9)H=+!}a*9b{?+B%i4Lk9xrd_;d;EHorml3%61;E z$E(_TxE`-==iz$%bvqB&<8Rt|xE`-*=iz$1ww;IT@we?fT#vtN=iz$1uAPVL@%QaK zT#tWf=iz$%V>=Jm=iz$1p`C~8@y2!@uE(3&dAJ_`+|I-G_?LDbuE)Q& z^Kd=h+|I*w`&3=>bgIW&dVfnEuE$&LeZ}>7TbzgM@%DBeuE)Q%^Kd=h(ayv5cxO8g z*W+F7JY0`=xASm4-qX&*^>}YP57*;;?L1tM_qX$KJ^sC&hwJel?L1tM547`eJwDjZ z!}a)3I}g|6!|gm=kB_wTa6LZS&cpTi&vqWJ$H&@vxE}x2&cpTi?{*%p$H&`wxE`Nq z=iz#MvYm(P@u_y+|MGf#y01K)>h|g0-J-*V;!}a)TI}g|6YwbK-kFU4$a6P`!&cpTiW;+kp z<6G@KT#s+J^Kd=B)6T>7_-;E7*W-KbJY0|OxASm4e$dXt_4r{s57*;I?L1tMAGh;x zJ$};8!}a)SI}g|6XYD*(k0ZwZB0L_h+h^*Mr&B$S)cf1=a6OLP&cpRMN;?nNv5iT91SJ9v5oo;d)%Sormjjk#-)g$3@$D zxE>d4=iz!>yq$;Zafx;wuE!-M?2Q(JY0`^wDWL1?%B@6^|)6%57*<~?L1tM`?T|LJ?`7i z!}YjdI}g|6{_Q+mj|a5#a6KN_&cpS1P&*ITRJY0{*xASm4p3u(2^>|`C57*;K?L1tMC%5x(J$|K~hwJgH?L1tMUu);#di;7j z57*-XQ zFHfg>Jh%5gFA3MFcR zuE%e-^Kd)Uy_ z9&c#p;d;EWorml3rgk2#$3M68a6SH|orml3ukAcsk2kmTa6R7A&cpS1Yda6u<8AFc zT#vW6^Kd=>t(}MK_T~EJ=~Rz*^xo$s;d;EYorml3u67=-$Gh8kxE}9m=iz$1x1ERU z@xFE*uE+b^dAJ_`-p<4I_>XoTuEz)3dAJ@QZ0F&6e5jp=>+#`s9e4+O~FA3Mv5EJ9v61h z9v5`f9Dzg@9%pFh;d-30ormjjrgk2#$C=xCxNcvoU!G3&I7{z+UJ|ayS=)KI9%pOk z;d-3Cormjjj&>fd$2r@1xE|+f=iz#syPb#Yah`S_uE%-XdAJ_uYvv4g0 z9dR(}jhwE{Xb{?+BMca9}9v5rp;d)%WormjjiFO{Y$0gf&xE_~k z=iz!>x}AsXahY}=uE%BDdAJ^zYvv4s49zAifJv7?B92@Bj$7R}ixE_~n=iz!>uAPVLart&0uE!PHdAJ@| zZ0F&6T&bOh>v83F9$UUn{oB`X=ivvmZ_v)e4{YDCorfRP zzEL|5Ke&D4b{>96`zGx?{LuDI+j;n5?VGjp@Wb0TZ|C7hv~SVQ!;fs=vYm$?)xK3b z4?ntn>vkS~O#3$NJp9=9ZQFTxS&#VAe|b99<95CGc}ch)w{Pd+dfcI%hwE|2b{?+B zo!WW09(Qi%;dv7+99F0=iz!hqMe89@yK=_uG^#9dAM%BT)#Y>>hb8_`@AGvkH@t0a6KN|&cpTi zrFI^!$1k_@a6KN^&cpS1d^-=<;|c9NT#qNV^Kd<$)Xu~8cyc=r*W*{(dAJ_G+RnrE z__cN(uE(#p^Kd<$($2&6cxpQj*W+pJJY0{bxASm4p3%<3^>}7G57*;a?L1tMXSefk zJ)YCf!}WM>I}g|6dF?!0kLS1Za6Mko&cpS1VLK1k?Q!+X)2SXW>b=iP!u5D@I}g|6 zCG9+1kKbtL;d=aLI}g|6x7vBQ9>3kr!}a)`b{?+B@3!-BJ$|p9hwJhC?L1tMKWOLS zdc3rqhwJf&?L1tMKWgXUdi-%a57*;Q+IhGhf7;H&_4u=P9+zTE zJY0{zYUkm4ysVvv>+$k-9+!ekJY0{zYv+$#PJY0`|Xy@U2{9`*0*W;hs zdAJ_0Z|C89yrG?k>+!~R9|A=57*K5V!}a*Lb{?+BJKA};9`9`D;d;EQorml3?sguo$9vj&xNc9VU!G3& zcyI50UJ|ay``UT99`A4G;d=agI}g|6KiYY?9v^7u;d*?qorml3p>`gw$A{Z_xE>#A z=iz#Mw4I0R@t^HHT#t{n^Kd=>tDT4I@!#z{T#t{p^Kd;r(ayv5_+&c|*W**|JY0`Y zxASm4KGV*__4sT%57*;!?L1tM&$sh%J-*P+!}a)LI}g|6OYJ;dk1x0La6P`#&ck(k zV*T=Ts>fG*@AHyyJ-*h?!}a)jI}g|68|^$?k8if~a6P`&&cpTib~_K(<2&svx_4si+57*--?L1tMpSJUGJ$}~C!}T~~ z+%NtD79Ic&)>v8mU9v7z69v7t49 zxE^P3=iz#sqn(HA_T>8I=~Rz%_TJ|u;d-2_ormjj?sguo$9dX$xE|+i=iz#subqeM zasGB5uEz!1dAJ@IZ0F&6T&SIg>v7?B92@Bj$7R}ixE_~n=iz!>uAPVLart&0uE!PHdAJ@|Z0F&6T&bOh z>v83F9$UT6J+9x*!}Yj9I}g|6hV49Dj~lh~a6N9^&cpS%NjneM z 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

ormjji*_Ea$1U4=xNaAzOP)^kxK-~D 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 literal 0 HcmV?d00001 diff --git a/uxarray/constants.py b/uxarray/constants.py index 9d4515b74..e7a1cdb69 100644 --- a/uxarray/constants.py +++ b/uxarray/constants.py @@ -16,8 +16,6 @@ # error tolerance, mainly in the intersection calculations. MACHINE_EPSILON = np.float64(np.finfo(float).eps) -ENABLE_JIT_CACHE = True - ENABLE_FMA = False GRID_DIMS = ["n_node", "n_edge", "n_face"] diff --git a/uxarray/grid/arcs.py b/uxarray/grid/arcs.py index 77127ae91..6be158005 100644 --- a/uxarray/grid/arcs.py +++ b/uxarray/grid/arcs.py @@ -15,8 +15,6 @@ from numba import njit -from uxarray.constants import ENABLE_JIT_CACHE - def _to_list(obj): if not isinstance(obj, list): @@ -29,7 +27,7 @@ def _to_list(obj): return obj -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _point_within_gca_body( angle, gca_cart, pt, GCRv0_lonlat, GCRv1_lonlat, pt_lonlat, is_directed ): @@ -246,7 +244,7 @@ def point_within_gca(pt, gca_cart, is_directed=False): return out -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def in_between(p, q, r) -> bool: """Determines whether the number q is between p and r. @@ -268,7 +266,7 @@ def in_between(p, q, r) -> bool: return p <= q <= r or r <= q <= p -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _decide_pole_latitude(lat1, lat2): """Determine the pole latitude based on the latitudes of two points on a Great Circle Arc (GCA). diff --git a/uxarray/grid/area.py b/uxarray/grid/area.py index f842ea941..b785f87f8 100644 --- a/uxarray/grid/area.py +++ b/uxarray/grid/area.py @@ -3,10 +3,9 @@ from uxarray.grid.coordinates import _lonlat_rad_to_xyz from numba import njit -from uxarray.constants import ENABLE_JIT_CACHE -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def calculate_face_area( x, y, z, quadrature_rule="gaussian", order=4, coords_type="spherical" ): @@ -96,7 +95,7 @@ def calculate_face_area( return area, jacobian -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def get_all_face_area_from_coords( x, y, @@ -171,7 +170,7 @@ def get_all_face_area_from_coords( return area, jacobian -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def calculate_spherical_triangle_jacobian(node1, node2, node3, dA, dB): """Calculate Jacobian of a spherical triangle. This is a helper function for calculating face area. @@ -261,7 +260,7 @@ def calculate_spherical_triangle_jacobian(node1, node2, node3, dA, dB): return dJacobian -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def calculate_spherical_triangle_jacobian_barycentric(node1, node2, node3, dA, dB): """Calculate Jacobian of a spherical triangle. This is a helper function for calculating face area. @@ -340,7 +339,7 @@ def calculate_spherical_triangle_jacobian_barycentric(node1, node2, node3, dA, d return 0.5 * dJacobian -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def get_gauss_quadratureDG(nCount): """Gauss Quadrature Points for integration. @@ -585,7 +584,7 @@ def get_gauss_quadratureDG(nCount): return dG, dW -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def get_tri_quadratureDG(nOrder): """Triangular Quadrature Points for integration. diff --git a/uxarray/grid/connectivity.py b/uxarray/grid/connectivity.py index 99ddcfcac..1fe9efbaf 100644 --- a/uxarray/grid/connectivity.py +++ b/uxarray/grid/connectivity.py @@ -7,8 +7,6 @@ from numba import njit -from uxarray.constants import ENABLE_JIT_CACHE - def close_face_nodes(face_node_connectivity, n_face, n_max_face_nodes): """Closes (``face_node_connectivity``) by inserting the first node index @@ -144,7 +142,7 @@ def _populate_n_nodes_per_face(grid): ) -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _build_n_nodes_per_face(face_nodes, n_face, n_max_face_nodes): """Constructs ``n_nodes_per_face``, which contains the number of non-fill- value nodes for each face in ``face_node_connectivity``""" @@ -253,7 +251,7 @@ def _populate_edge_face_connectivity(grid): ) -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _build_edge_face_connectivity(face_edges, n_nodes_per_face, n_edge): """Helper for (``edge_face_connectivity``) construction.""" edge_faces = np.ones(shape=(n_edge, 2), dtype=face_edges.dtype) * INT_FILL_VALUE diff --git a/uxarray/grid/coordinates.py b/uxarray/grid/coordinates.py index dbe4f0297..399a03468 100644 --- a/uxarray/grid/coordinates.py +++ b/uxarray/grid/coordinates.py @@ -6,13 +6,13 @@ from uxarray.conventions import ugrid from numba import njit -from uxarray.constants import ERROR_TOLERANCE, ENABLE_JIT_CACHE +from uxarray.constants import ERROR_TOLERANCE from typing import Union from uxarray.grid.utils import _angle_of_2_vectors -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _lonlat_rad_to_xyz( lon: Union[np.ndarray, float], lat: Union[np.ndarray, float], @@ -26,7 +26,7 @@ def _lonlat_rad_to_xyz( return x, y, z -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _xyz_to_lonlat_rad_no_norm( x: Union[np.ndarray, float], y: Union[np.ndarray, float], @@ -67,7 +67,7 @@ def _xyz_to_lonlat_rad_no_norm( return lon, lat -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _xyz_to_lonlat_rad_scalar( x: Union[np.ndarray, float], y: Union[np.ndarray, float], @@ -217,7 +217,7 @@ def _normalize_xyz( return x_norm, y_norm, z_norm -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _normalize_xyz_scalar(x: float, y: float, z: float): denom = np.linalg.norm(np.asarray(np.array([x, y, z]), dtype=np.float64), ord=2) x_norm = x / denom @@ -430,7 +430,7 @@ def _smallest_enclosing_circle(points): return _welzl_recursive(points, np.empty((0, 2)), None) -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _circle_from_two_points(p1, p2): """Calculate the smallest circle that encloses two points on a unit sphere. @@ -459,7 +459,7 @@ def _circle_from_two_points(p1, p2): return center, radius -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _circle_from_three_points(p1, p2, p3): """Calculate the smallest circle that encloses three points on a unit sphere. This is a placeholder implementation. @@ -499,7 +499,7 @@ def _circle_from_three_points(p1, p2, p3): return center, radius -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _is_inside_circle(circle, point): """Check if a point is inside a given circle on a unit sphere. @@ -763,7 +763,7 @@ def _xyz_to_lonlat_rad( return lon, lat -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _xyz_to_lonlat_rad_no_norm( x: Union[np.ndarray, float], y: Union[np.ndarray, float], @@ -820,7 +820,7 @@ def _normalize_xyz( return x_norm, y_norm, z_norm -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _lonlat_rad_to_xyz( lon: Union[np.ndarray, float], lat: Union[np.ndarray, float], @@ -870,7 +870,7 @@ def _xyz_to_lonlat_deg( return lon, lat -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _normalize_xyz_scalar(x: float, y: float, z: float): denom = np.linalg.norm(np.asarray(np.array([x, y, z]), dtype=np.float64), ord=2) x_norm = x / denom diff --git a/uxarray/grid/dual.py b/uxarray/grid/dual.py index 5dc5cb4f5..83506e4e4 100644 --- a/uxarray/grid/dual.py +++ b/uxarray/grid/dual.py @@ -2,7 +2,6 @@ from uxarray.constants import INT_FILL_VALUE, INT_DTYPE from numba import njit -from uxarray.constants import ENABLE_JIT_CACHE def construct_dual(grid): @@ -53,7 +52,7 @@ def construct_dual(grid): return new_node_face_connectivity -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def construct_faces( n_node, n_edges, @@ -146,7 +145,7 @@ def construct_faces( return construct_node_face_connectivity -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _order_nodes( temp_face, node_0, diff --git a/uxarray/grid/geometry.py b/uxarray/grid/geometry.py index 4cfcd29fb..c0949b9f3 100644 --- a/uxarray/grid/geometry.py +++ b/uxarray/grid/geometry.py @@ -16,7 +16,6 @@ ERROR_TOLERANCE, INT_DTYPE, INT_FILL_VALUE, - ENABLE_JIT_CACHE, ) from uxarray.grid.arcs import extreme_gca_latitude, point_within_gca from uxarray.grid.intersections import gca_gca_intersection @@ -85,7 +84,7 @@ def error_radius(p1, p2): return unique_points -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _pad_closed_face_nodes( face_node_connectivity, n_face, n_max_face_nodes, n_nodes_per_face ): diff --git a/uxarray/grid/neighbors.py b/uxarray/grid/neighbors.py index 52be85b4d..2dcb70602 100644 --- a/uxarray/grid/neighbors.py +++ b/uxarray/grid/neighbors.py @@ -10,7 +10,7 @@ from typing import Optional, Union -from uxarray.constants import INT_DTYPE, INT_FILL_VALUE, ENABLE_JIT_CACHE +from uxarray.constants import INT_DTYPE, INT_FILL_VALUE class KDTree: @@ -855,7 +855,7 @@ def _populate_edge_node_distances(grid): ) -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _construct_edge_node_distances(node_lon, node_lat, edge_nodes): """Helper for computing the arc-distance between nodes compose each edge.""" @@ -890,7 +890,7 @@ def _populate_edge_face_distances(grid): ) -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _construct_edge_face_distances(node_lon, node_lat, edge_faces): """Helper for computing the arc-distance between faces that saddle a given edge.""" diff --git a/uxarray/grid/utils.py b/uxarray/grid/utils.py index 517dc07de..1d826cf9e 100644 --- a/uxarray/grid/utils.py +++ b/uxarray/grid/utils.py @@ -1,12 +1,12 @@ import numpy as np -from uxarray.constants import INT_FILL_VALUE, MACHINE_EPSILON, ENABLE_JIT_CACHE +from uxarray.constants import INT_FILL_VALUE, MACHINE_EPSILON import warnings import uxarray.utils.computing as ac_utils from numba import njit -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def _angle_of_2_vectors(u, v): """Calculate the angle between two 3D vectors u and v in radians. Can be used to calcualte the span of a GCR. diff --git a/uxarray/utils/computing.py b/uxarray/utils/computing.py index 14c6f66d3..2dfa02dc2 100644 --- a/uxarray/utils/computing.py +++ b/uxarray/utils/computing.py @@ -2,10 +2,9 @@ import sys from numba import njit -from uxarray.constants import ENABLE_JIT_CACHE -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def all(a): """Numba decorated implementation of ``np.all()`` @@ -17,7 +16,7 @@ def all(a): return np.all(a) -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def isclose(a, b, rtol=1e-05, atol=1e-08): """Numba decorated implementation of ``np.isclose()`` @@ -29,7 +28,7 @@ def isclose(a, b, rtol=1e-05, atol=1e-08): return np.isclose(a, b, rtol=rtol, atol=atol) -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def allclose(a, b, rtol=1e-05, atol=1e-08): """Numba decorated implementation of ``np.allclose()`` @@ -40,7 +39,7 @@ def allclose(a, b, rtol=1e-05, atol=1e-08): return np.allclose(a, b, rtol=rtol, atol=atol) -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def cross(a, b): """Numba decorated implementation of ``np.cross()`` @@ -51,7 +50,7 @@ def cross(a, b): return np.cross(a, b) -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def dot(a, b): """Numba decorated implementation of ``np.dot()`` @@ -62,7 +61,7 @@ def dot(a, b): return np.dot(a, b) -@njit(cache=ENABLE_JIT_CACHE) +@njit(cache=True) def norm(x): """Numba decorated implementation of ``np.linalg.norm()``